WordMix Launch

The beta is over, let the game begin.

Download WordMix LIVE! from the Windows Phone 7 Marketplace

Download App Free Now

The more, the merrier!

 

Posted in WordMix | Leave a comment

WordMix LIVE! Beta Invitation

Our Dress Rehearsal is on!

We are inviting a limited number of people to download WML now (before it is visible in the marketplace) to help us test and make sure our server can handle the load.  If you have some time to play this week, please download WML and try it out.  Thanks!

WordMix is back! And this time we’ve kicked it up a notch! With this latest release, you can now play head-to-head in realtime against our entire community of word-forming-word-lovers. Choose the type of round you would like to play, from 1 to 4 minute rounds, choose your language, and then join the action. Just like our current version of WordMix, WordMix LIVE! supports German, French, Spanish and two forms of English.

Download WordMix LIVE! from the Windows Phone 7 Marketplace

Download App Free Now

The more, the merrier!

Posted in WordMix | 2 Comments

What languages would you like to see added to WordMix?


Posted in WordMix | 1 Comment

Introducing our latest app! WordMix by Cronos Labs

Cronos Labs is proud to announce our third release. WordMix, a fun and challenging word puzzle game for all ages is now available from the Microsoft Marketplace. Download the free app now: WordMix for WP7

UPDATE 1: WordMix review by the kind folks at WP7Lab.com.
UPDATE 2: WordMix review by the kind folks at BestWP7Games.com.

Using the supplied 6 letters, create as many words as you can in the time provided. WordMix is an excellent vocabulary building game. Choose any word to see its definition. We’ve included Hints, Skips, and Shuffles to assist beginning players.

Also featured in this release is an online leaderboard provided by Scoreloop. Share your Scoreloop community reputation with Pirates Assault, Frenzic, 1 to 50 and other great Windows Phone games.

This app makes use of your phone’s:
• data services
• music and video library
• owner identity
• phone security

This application is currently free for a limited time. Follow the jump to download the app now. WordMix for WP7

For more information, please check out our WordMix section where we will be posting answers to common questions and you can make suggestions for future releases. You can also email us at wordmix@cronoslabs.com.

Posted in Games, Windows Phone 7, WordMix | Leave a comment

Windows Phone Apps with Scoreloop

As we have mentioned before, we wish Microsoft would provide the basic back-end services of “XBox Live” to all developers,  even if they want to reserve some additional marketing tiers for the proven brands.  Since they don’t, it’s great that 3rd parties like Scoreloop fill that gap.  I like having a single public profile that I can share across multiple games.  Being able to recover my progress when I change devices is a big plus, too.

Here is our list of games on Windows Phone which use Scoreloop.  Please let us know if we missed any.

  1. WordMix Free
  2. Pirates Assault / Free
  3. 1 to 50 / Free
  4. Frenzic
  5. Jewel Lines / Free
  6. Logic Lines
  7. Free Throws
  8. Bubble Burst Free
  9. Bubble Burst 2
  10. Million Tap Challenge (coming soon)
  11. Faun’s Labyrinth / FREE
  12. nICE (coming soon)
  13. Air Soccer
  14. Belote WorldTour
  15. Air Soccer Tour / FREE
Posted in Windows Phone 7 | 1 Comment

#wp7dev Silverlight Page Base Class — Why and How

Any time I am told “copy & paste [anything]” in more than one place, I start looking for alternatives.  So it was when I was following this guide to adding page transitions to DataHub.

20 lines of XAML for each of 40 XAML files.  Luckily I identified this early on and came up with a clean solution:  Each of my PhoneApplicationPages would inherit from a single class, which I called BasePage.

namespace DataHub
{
    public class BasePage : PhoneApplicationPage
    {
        public BasePage()
        {
            NavigationInTransition navInTransition = new NavigationInTransition();
            navInTransition.Backward = new SlideTransition { Mode = SlideTransitionMode.SlideDownFadeIn };
            navInTransition.Forward = new SlideTransition { Mode = SlideTransitionMode.SlideUpFadeIn };
            NavigationOutTransition navOutTransition = new NavigationOutTransition();
            navOutTransition.Backward = new SlideTransition { Mode = SlideTransitionMode.SlideDownFadeOut };
            navOutTransition.Forward = new SlideTransition { Mode = SlideTransitionMode.SlideUpFadeOut };
            TransitionService.SetNavigationInTransition(this, navInTransition);
            TransitionService.SetNavigationOutTransition(this, navOutTransition);

            this.SetValue(TiltEffect.IsTiltEnabledProperty, true);

        }

along with these changes to the start & end XAML tags for each page:

<dh:BasePage
xmlns:dh="clr-namespace:DataHub">

...

</dh:BasePage>

Much cleaner! With this bit of infrastructure worked out, I could move on to the real heart of the app.

Little did I know how useful this BasePage would be further down the line. So much so, I think I’ll have one in all future projects even if it’s initally blank.

A new problem arose when I was impementing better-together-dynamicorientationchanges-and-transitionframe. I noticed that if my device was held landscape and then the page was navigated, both the transition and the orientation change animations were playing. This was a pretty jarring user experience, and obviously in this case I wanted the transition animation only.

I had a twitter conversation with @DavidAns who replied “Avoiding it’d require specific (tricky?) changes”.

Luckily, I already had BasePage in place, so the changes were not so tricky:


 protected static HybridOrientationChangesFrame MyHybridOrientationChangesFrame
        {
            get { return (HybridOrientationChangesFrame)(((App)(App.Current)).RootFrame); }
        }

protected override void OnNavigatedFrom(System.Windows.Navigation.NavigationEventArgs e)
        {
            base.OnNavigatedFrom(e);
            MyHybridOrientationChangesFrame.IsAnimationEnabled = false;
        }

protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
        {
            base.OnNavigatedTo(e);
                UIHelper.SetTimeout(300, () =>
                {
                    MyHybridOrientationChangesFrame.IsAnimationEnabled = true;
                });
            }
        }

Another use for BasePage appeared when Aaron, our UX designer, decided to include a “home” button on every DataHub page. Not wanting to include a circular reference (*ahem* AMAZON *ahem*) and specifically WANTING the page transitions between the starting point and home, I let BasePage do some automatic “back” navigation when a MainViewModel property was set.

void ViewModel_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
        {
            if (!IsCurrentPage) return;
            if (!IsMainPage)
            {
                if (e.PropertyName == "GoHome")
                {
                    if (App.ViewModel.GoHome)
                    {
                        UIHelper.SetTimeout(100, () =>
                        {
                            this.NavigationService.GoBack();
                        });
                    }
                }
            }
        }

protected override void OnNavigatedFrom(System.Windows.Navigation.NavigationEventArgs e)
        {
            base.OnNavigatedFrom(e);
            MyHybridOrientationChangesFrame.IsAnimationEnabled = false;
            IsCurrentPage = false;
            App.ViewModel.PropertyChanged -= new System.ComponentModel.PropertyChangedEventHandler(ViewModel_PropertyChanged);
        }

protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
        {
            base.OnNavigatedTo(e);
            App.ViewModel.PropertyChanged += new System.ComponentModel.PropertyChangedEventHandler(ViewModel_PropertyChanged);
            IsCurrentPage = true;

            if (App.ViewModel.GoHome)
            {
                if (IsMainPage)
                {
                    App.ViewModel.GoHome = false;
                    UIHelper.SetTimeout(300, () =>
                    {
                        MyHybridOrientationChangesFrame.IsAnimationEnabled = true;
                    });
                }
                else
                {
                    UIHelper.SetTimeout(300, () =>
                    {
                        this.NavigationService.GoBack();
                    });
                }
            }
            else
            {
                UIHelper.SetTimeout(300, () =>
                {
                    MyHybridOrientationChangesFrame.IsAnimationEnabled = true;
                });

            }

        }

This did require some careful coding any time a page needed to make use of OnNavigatedTo directly.

protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
        {
            base.OnNavigatedTo(e);
            if (App.ViewModel.GoHome) return;

...

}

A final use for BasePage just came up for DataHub now that we are working on the Silverlight-based “desktop” version. I am sharing (linking) as much of the code between projects as possible, including the code-behind for the XAML files. BasePage is implemented as project-specific, handing all plumbing differences (and inheriting from System.Windows.Controls.Page instead of Microsoft.Phone.Controls.PhoneApplicationPage). More on this in a future blog post (if there is any interest…)

Regards,
Jason

Posted in WP7 Dev Tips | 1 Comment

My WP7 wish list

  1. Seamless access to Microsoft services from all WP7 apps.
    1. Universal API to SkyDrive.  A methodology to prompt the user to allow an app permission to “full” or “sandbox” (isolated folder) SkyDrive access.  Utilize the phone’s stored credentials without reprompting.
    2. Universal Game API.  Something like an “XBox Lite” or “WP7 Game Live”.  Gives indie games access to public leaderboards, achievements, matching, etc. without needing to prompt their users for profile information or use a 3rd party service.
    3. Any other Microsoft service which would distinguish WP7 (and its apps) from competing smartphone OSs.
  2. WP7 Ad control:
    1. Must serve ads anywhere in the world.
    2. Must raise an event when the uses presses the ad, so the app developer can reward them for it.
  3. Pressing the “submit” button on an application update is currently a risky prospect for indie developers (without dedicated testing staff).  If we make a mistake there is egg on our faces for about a week while we scramble get the next version marketplace approved.  See: http://wildermuth.com/2011/01/29/R_I_P_GooNews
    1. Marketplace “beta tracks”.  Be able to submit an application, get it approved as normal, then choose to publish it only to users who volunteer to be in a beta group.  They get the app update as they do now, but if they encounter a problem, they can toggle back to the “normal” track (downgrade to the current “production” release).  Allow developers to promote releases from “beta” to “production” without another approval delay.
    2. Marketplace “rollbacks”.  Developers submit an application and get it approved as normal.  If a problem is found in the new version, allow developer to mark a previous version as “current” which keeps all users on that version while a fix is prepared for the problem.
    3. Continuous submissions.  Be able to submit new versions while the previous version is awaiting testing.  For instance, put versions 1.4 and 1.5 both in line to be tested at the same time, and if testing hasn’t started on 1.4 yet let 1.5 have its place in line.
  4. We wish for a bigger market.  Here are some thoughts on how Microsoft could potentially get there faster.
    1. Find more excuses to give away more phones.
    2. Free Zune Pass for two years with every WP7 purchase (retroactive). Works on the phone, desktop, XBox.
    3. Free XBox Live Gold for two years with every WP7 purchase (retroactive).
    4. Free Netflix (phone access only) for two years with every WP7 purchase (retroactive).
    5. $50 in Marketplace credit with every WP7 purchase (not valid on XBox Live titles).
  5. Extend our Marketplace to the (Tablet) PC. Create a tablet UI layer featuring Metro for Win7. Within this new UI, provide users access to the WP7 marketplace and WP7 apps.  Design of the SDK for Windows Metro 7 so that WP7 apps are 98%+ (could it be 100%?) compatible today.  Provide back-end services so that all WP7 APIs function as-is. Even SMS and calls (VOIP) for feature completion would be nice.  Present apps in 800×480 space within the UI.
Posted in Windows Phone 7 | Leave a comment

Global Error Handling

The default global error handler in the WP7 project template is really not all that helpful:

 private void Application_UnhandledException(object sender, ApplicationUnhandledExceptionEventArgs e)
        {
            if (System.Diagnostics.Debugger.IsAttached)
            {
                // An unhandled exception has occurred; break into the debugger
                System.Diagnostics.Debugger.Break();
            }
        }

Sure, it’s fine during development.  But do you know what happens to your app in production if there is an unhandled exception?  Your app crashes and exits with no explanation to the user, and no feedback to you to prevent it from happening again.  I guess the idea is that you’ll find & handle every possible exception during development.  Chances of that happening on an app of any complexity at all:  0%.  Interesting to note that an app which crashes & exits this way violates the Marketplace submission guidelines.

Here is one alternative:

private void Application_UnhandledException(object sender, ApplicationUnhandledExceptionEventArgs e){
            if (System.Diagnostics.Debugger.IsAttached)
            {
                // An unhandled exception has occurred; break into the debugger
                System.Diagnostics.Debugger.Break();
            }
            else
            {
                OnAnyError(e.ExceptionObject);
            }
            e.Handled = true;  //optional
}

private void RootFrame_NavigationFailed(object sender, NavigationFailedEventArgs e){
            if (System.Diagnostics.Debugger.IsAttached)
            {
                // A navigation has failed; break into the debugger
                System.Diagnostics.Debugger.Break();
            }
            else
            {
                OnAnyError(e.Exception);
            }
            e.Handled = true; //optional
}

private void OnAnyError(Exception e){
            if (MessageBox.Show("May I send the details of this error to the developer?  That way they can fix it so it doesn't happen again.  I'll show you the entire message before it's sent.", "Application error", MessageBoxButton.OKCancel) == MessageBoxResult.OK)
            {
                EmailComposeTask emailComposeTask = new EmailComposeTask();
                emailComposeTask.To = "[app]@[dev].com";
                emailComposeTask.Subject = "An error in [app] " + VersionNumber;
                emailComposeTask.Body = e.ToString();
                emailComposeTask.Show();
            }
}

This does a few things:

  1. Instantly lets your users know you care,  and there is a strong possibility you will fix the problem they encountered.
  2. Prompts your user to communicate with you, without doing so anonymously. This way you can engage in further dialogue about the cause of their error (or possibly your app in general).
  3. Gives you the REAL information you need to fix the problem.  Because if your app doesn’t send you a stack trace, you tend to get an email or tweet with “your app crashed”, and then you are stuck in blind debugging hell.
  4. Improve your code, get feedback from users in real-world situations.

Notice also the message asks permission to initiate contact, which I think is important.

I am not ashamed to say I have received a few of these emails for DataHub.  Every email I received I replied to individually without using a form letter.  The structure was something like this:

[user name],
Thank you so much for sending your error report.  I have been able to reproduce your problem and it will be fixed in our upcoming [#] release.  In the meantime, the workaround is to [insert details].

Regards,
Jason

And then I have gotten multiple replies like this:

Wow! That’s the best support from a dev I have experienced in a while, thanks for replying so quickly.
Happy customer here! :D

Wow – thanks Jason! Didn’t expect a response at all.
=)

Ceci mis à part : super software !!!
Très cordialement

Hi Jason
I can’t recreate it either now. [more details]
Hope that helps

thanks for app

And reviews like:

Great app, amazing support…

Any question you might have will be answered in no time by a very friendly and committed support. I am looking forward to the desktop version of the app. Great app, great dev…

…and the developpers team seems to be really motivated.

Regards,
Jason

Posted in WP7 Dev Tips | Leave a comment

WP7COMP

Our latest app DataHub is now an official entrant in RedGates Window Phone 7 Competition. Check out our entry page here and be sure to click the “LIKE” button so we can grab the judges attention! Wish us luck!

Posted in Uncategorized | Leave a comment

DataHub Intro Video Posted

Interested in our latest application for Windows Phone 7? Watch a quick introduction to DataHub.

Posted in DataHub, Utilities, Windows Phone 7 | Tagged , | Leave a comment