Mini Recorder 2.3.0 released

Posted on Mar 6, 2013 in and tagged ,

The new 2.3.0 update brings several major improvements and fixes the known issues.

1. Fixed issues with clipping and repeating sound when recording under the locked screen.
Some phones (especially, the older ones) were affected by this severe bug, which corrupted the audio files when the phone’s screen became locked during the recording. Basically, when the user locks the screen, the Windows Phone operating system goes into the low-power mode. The documentation recommends to pause active foreground processes, stop the timers, etc. Turned out that the IO system became the performance bottleneck once the screen got locked, and the app was unable to properly process the microphone buffer data. Lowering down the auto-save operation frequency allowed to fix this issue.

2. Recording is automatically paused when application is deactivated.
If you press the search or the start button while recording, the app will automatically pause itself. And when you return to the app, the recording timer will display the correct duration.

3. Application tries to save the current recording when closing unexpectedly.
Let’s accept it – each and every app has bugs. Sometimes these bugs are not even noticeable, and sometimes they cause the unexpected errors, which crash the app. With the new 2.3.0 version, if such error occurs, Mini Recorder will try to save the currently active recording before closing.

4. User can pin the recording to the start screen.
At the recording details page tapping the “pin” icon on the application bar will create a secondary live tile, displaying the recording name and duration (and even the attached photo, if selected) on the front side and the small notes excerpt on the back side.

5. [Windows Phone 8 only] User can export the recording to the Media Library.
If you are running Mini Recorder on the Windows Phone 8 device, you will see the new “music+videos hub” option. Choosing it will copy the audio file to the /Music folder on your phone. You can access the exported files either from the built-in Music+Videos app (look for the new Mini Recorder artist) or by connecting the phone to your PC (look for /Music/Mini Recorder folder). Isn’t it cool? You don’t even need to connect your cloud storage accounts anymore.

6. User can turn off the level meter.
The fancy animated tiles may not fit everyone’s preferences. If you would like to turn them off, just head to the settings page.

7. Fixed some Skydrive uploading issues.
If your the title of your recording contained one of the reserved characters, like slash or question mark, the Skydrive refused to upload it. The recent version automatically replaces them with the underscore symbol.

You can download the recent FREE version here – http://windowsphone.com/s?appId=1a3ebb19-c12d-4dd6-8766-69b4b2af7a06

If you want to thank me and donate 2 bucks please consider purchasing the paid version – http://windowsphone.com/s?appId=356d8d24-41c5-4248-b18d-8c7b960501a8

Much more features are planned for the upcoming versions. If you have any suggestions, or would like to report an error – contact me from the app’s feedback page.

Mini Recorder updated to 1.2

Posted on Jun 28, 2012 in and tagged ,

Mini Recorder, a minimalistic digital audio recorder for Windows Phone have been updated to version 1.2.

While there are no new features in this release, it brings several hot fixes reported by users. Especially, the major one that caused compression settings not being applied when uploading files to Dropbox.

Go grab it at the marketplace for free!

Papercut updated to 1.1

Posted on May 25, 2012 in and tagged ,

The first update for Papercut has been certified yesterday and it should appear in the marketplace within 24 hours. For those of you who doesn’t know what Papercut is – it’s a small Windows Phone tool that allows you to get daily Bing photos (those awesome ones that you see on the search page) right on your phone. There is a nice video demo on Youtube.

The biggest issue that many users reported since 1.0 was the app crashing sometimes when downloading photos. This should be fixed now, however, the photos will not be grouped by countries for those users. Basically, this behavior is caused by the way the Bing images endpoint works – it relies on HTTP headers to transfer important image information, especially on ETag that works like an image hash. This ETag header is used as an image grouping key, so if there is no header in the server’s response, then the grouping is not possible.

There are several ways to solve this issue, I am trying to figure out the best one now.

Anyway, let’s get back to the topic. Here is the full changelog for version 1.1:

  • Fixed issues with background task crashing.
  • Fixed issue when application crashed during image loading.
  • Increased image quality with support for 32 bits color mode (right, the gorgeous images should look even more awesome now).
  • Added image loading animations.
  • Trial mode check is delayed to reduce startup time.
  • Fullscreen images are shown and hidden much faster now (it was really painful with 1.0 – going back from image view to the previous page took almost a second on my old Omnia 7, now it’s almost instant).

You can download the free version here.
If you want to support me, there is also a paid version here.

Get daily Bing images with Papercut

Posted on May 20, 2012 in and tagged ,

Papercut is a new app that lets you use photos from the Bing homepage as the background of your phone’s lock screen. It’s fast and easy to use, all powered by Metro UI goodness.

It also gives you a great Live Tile that shows the latest photo right on your start screen. Each image has a short headline with its description (it’s always great to learn new things, right?) – just tap the photo when it is loaded.

The best thing is that Papercut is absolutely free to use, withoud ads (but if you want to support the developer and donate 99 cents, there is a paid version in the marketplace). Enjoy!

Download FREE version here and the paid version here.

You can also follow @PapercutWP on Twitter.

Every time I create a new app, I have to spend at least 10-15 minutes just to remove all the clutter that the guys who created them put in. Probably they thought than an average developer won’t be smart enough to figure out that THIS IS APPLICATION TITLE, DUDE!!1 And why do you need a backing field for each and every control on the page? Arrgh.

My favorite is that vital ‘phoneApplicationInitialized‘ variable. Just, look at this code (I’ve changed the order of class members and removed some unrelated calls, but that doesn’t matter):

private bool phoneApplicationInitialized = false;
 
public App()
{
    InitializeComponent();
    InitializePhoneApplication();
}
 
private void InitializePhoneApplication()
{
    if (phoneApplicationInitialized)
        return;
 
    RootFrame = new PhoneApplicationFrame();
    RootFrame.Navigated += CompleteInitializePhoneApplication;
    RootFrame.NavigationFailed += OnNavigationFailed;
 
    // Ensure we don't initialize again
    phoneApplicationInitialized = true;
}

So its value is modified only inside InitializePhoneApplication method that is called only from the class constructor. That first condition check never returns and there is no way to ‘initialize again’.

Anyway, I decided to create my own reusable page and application definition templates to save some time. Obviously, they may not suit your needs, so think about them as a reference or an alternative to the predefined templates.

App template

<Application
    x:Class="$namespace$.App"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:system="clr-namespace:System;assembly=mscorlib"
    xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
    xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone">

    <Application.Resources>
        <system:String x:Key="ApplicationTitle">APPLICATION TITLE</system:String>
        
        <!-- Page margins -->
        <Thickness x:Key="PageHeaderPanelMargin">12,17,0,28</Thickness>
        <Thickness x:Key="PageNameLabelMargin">9,-7,0,0</Thickness>
        <Thickness x:Key="PageContentPanelMargin">12,0</Thickness>
        
        <Style x:Key="DefaultPageStyle" TargetType="phone:PhoneApplicationPage">
            <Setter Property="FontFamily" Value="{StaticResource PhoneFontFamilyNormal}"/>
            <Setter Property="FontSize" Value="{StaticResource PhoneFontSizeNormal}"/>
            <Setter Property="Foreground" Value="{StaticResource PhoneForegroundBrush}"/>
            <Setter Property="SupportedOrientations" Value="Portrait"/>
            <Setter Property="Orientation" Value="PortraitUp"/>
            <Setter Property="shell:SystemTray.IsVisible" Value="True"/>
        </Style>
    </Application.Resources>
    
    <Application.ApplicationLifetimeObjects>
        <shell:PhoneApplicationService />
    </Application.ApplicationLifetimeObjects>
</Application>

Page template

    <phone:PhoneApplicationPage
    x:Class="$namespace$.Page"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    Style="{StaticResource DefaultPageStyle}"
    mc:Ignorable="d"
    d:DesignHeight="800"
    d:DesignWidth="480">

    <Grid Background="Transparent">
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>

        <StackPanel Margin="{StaticResource PageHeaderPanelMargin}">
            <TextBlock
                Text="{StaticResource ApplicationTitle}"
                Style="{StaticResource PhoneTextNormalStyle}"/>
            <TextBlock
                Text="page name"
                Margin="{StaticResource PageNameLabelMargin}"
                Style="{StaticResource PhoneTextTitle1Style}"/>
        </StackPanel>

        <Grid
            Grid.Row="1"
            Margin="{StaticResource PageContentPanelMargin}">
            
        </Grid>
    </Grid>
</phone:PhoneApplicationPage>

You can also download zipped templates ready for importing into Visual Studio.
Just place them into “%my_docs%Visual Studio TemplatesItemTemplatesSilverlight for Windows Phone”.

Application and Page

Pretty straightforward, but just in case.. Here is the snippet:

SharpZipLib for WP7 NuGet package

Posted on Apr 16, 2012 in and tagged ,

I really got used to NuGet in the last year and I have almost completely forgotten what is ‘manually adding library file reference’ (can’t say I regret about that). So I was a bit disappointed when I found out that the well-known SharpZipLib NuGet package can’t be used with WP7 projects. However, there is a nice SL/WP7 port version of this library on codeplex (seems that it is abandoned though – no updates in ~2 years, but it works). It was not available to the fellow NuGetters.. until now. Use

Install-Package SharpZipLib-WP7

There is also a package mirror at BitBucket. Happy zipping!

Task Commands revisited

Posted on Feb 23, 2012 in and tagged , , , ,

Half a year ago I blogged about using TPL with MVVM in a test-friendly way. My solution turned out to be pretty handy, though it was far from being perfect. In this post I will describe what was wrong with the initial implementation and can we slightly improve it.

Looking at that solution right now, I wonder why did I decide to use event async pattern (providing the ExecuteCompleted event) in the first place. The intention was to notify the caller about completion of the asynchronous operation. That is what System.Threading.Task is used for this days, isn’t it? So the obvious solution is to expose the ExecuteAsync() method returning the Task instance on the command class. Here is the source of the updated AsyncRelayCommand:

public class AsyncRelayCommand<T> : ICommand {
    private readonly RelayCommand<T> _internalCommand;
    private readonly Func<T, Task> _executeMethod;
 
    public event EventHandler CanExecuteChanged
    {
        add { _internalCommand.CanExecuteChanged += value; }
        remove { _internalCommand.CanExecuteChanged -= value; }
    }
 
    public AsyncRelayCommand(Func<T, Task> executeMethod, Predicate<T> canExecuteMethod)
    {
        if (executeMethod == null)
        {
            throw new ArgumentNullException("executeMethod");
        }
 
        _executeMethod = executeMethod;
        _internalCommand = new RelayCommand<T>(_ => { }, canExecuteMethod);
    }
 
    public AsyncRelayCommand(Func<T, Task> executeMethod)
        : this(executeMethod, _ => true) { }
 
    void ICommand.Execute(object parameter)
    {
        if (parameter is T)
        {
            ExecuteAsync((T)parameter);
        }
 
        else throw new ArgumentException("Parameter should be of type " + typeof(T));
    }
 
    public Task ExecuteAsync(T parameter)
    {
        return _executeMethod(parameter);
    }
 
    public bool CanExecute(object parameter)
    {
        return _internalCommand.CanExecute((T)parameter);
    }
 
    public void RaiseCanExecuteChanged()
    {
        _internalCommand.RaiseCanExecuteChanged();
    }
}

The code is pretty straightforward, here are the key points:

  • Create an inner command that responds to CanExecute, RaiseCanExecute calls and handles subscriptions to CanExecuteChanged event (optional, since I am using MVVM Light with most of my projects, that’s an acceptable solution for me. However, you may easily implement your own commanding logic).
  • Introduce new ExecuteAsync method that returns Task instance.
  • Implement ICommand.Execute explicitly (I find it more consistent not to have Execute method in the AsyncRelayCommand class).

Side note: as I mentioned in the beginning, I find this command extension rather useful. It was successfully used in 5 own projects (both WP7 and WPF), and I hope you enjoy it too.

As usual, the source code is available at bitbucket (TaskCommands.v2.zip).

Late Reader 1.3 released

Posted on Jan 31, 2012 in and tagged ,

Late Reader 1.3 hits the marketplace.

The main goal for this release it to fix some issues caused by breaking changes introduced in 1.2 that occur only when you update the application (you can read about one of them, related to live tile backward compatibility, here).

There are many new features planned for the upcoming major update. Stay tuned ;)

Just in several hours after LateReader v.1.2 being published, I received an error report saying that “No XAML found at the location XXX”. Wait, but that’s an old URI, used in the previous versions, where did it come from? Turned out that a secondary live tile which quickly adds a new article to the list still uses the deep link URI, created with the previous app version. The morale is: keep the backward compatibility in mind and use UriMapper to deal with such tile navigation issues.

And v.1.3 that fixes this bug and some other minor issues is already submitted for the certification :)