It was most unfortunate that due to time considerations with the Windows Marketplace Approval process, I was not able to deliver the working app to WP7 users outside of a side loading option. That said, I thought I would take some time now and talk about the app and my thoughts with respect to quickly developing a Windows Phone 7 app relative to what I know about developing for the other platforms.
It was amazing to me that with DevLink being a fairly Microsoft-centric conference that when I checked the Wednesday before the conference there was no app for WP7. I feel this is a blow against Microsoft, though perhaps a sign that developers are turning their attention to Windows Phone 8. But regardless, with no app in the market I elected to develop one for two reasons: 1) I needed the app for myself and 2) I wanted to see how fast a fairly advanced Windows Phone app could be develop and compare that against what I have experienced developing for iPhone and Android.
I had less than a week to build the app so the design would need to be simple. I decided to utilize the MVVM pattern with Caliburn.Micro supported by Dependency Injection using Ninject. The bsaic idea was a repository based approach which would load all session data at the application launch and then allow the user to see the data in different viewings to get a better idea of what was available.
From a look and feel perspective, I wanted the initial page with two sections on the panorama: 1) my sessions where users could see the sessions they had starred and 2) upcoming sessions which would allow the user to see sessions for the next three blocks. The second feature was from feedback from the app I developed for Codemash 2012 on Android. Since I would be displaying the session information relative to its block I would need some way to display hierarchal data. I initially considered a templated ListBox but then I saw the ExpandView from the WP7 toolkit. This is the same control used in many of the email controls on Windows Phone 7. After some work, I was able to repurpose it for my needs
As I said, I intended to use the repository pattern and would be focusing only on the session data, this due to my limited time constraints. I used RestSharp to make communicating with the DevLink REST service feeds easier and then used the Newtonsoft JSON library to aid in the conversion of the JSON to my POCOs. To use the repository pattern within Windows Phone 7’s inherently async programming model I used an event paradigm where each call into the repository would result in an event being raised when the operation was complete, much like what RIA Services does. This proved to work very well and combined with a strategy to hold data in the repository for 10m my subsequent calls were quick and painless.
The implementation called for two repositories: ISessionRepository and IFavoriteSessionRepository. The latter would be responsible for tracking what session the user had favorited. This data would be merged with the session list to populated the “my sessions” portion of the application.
CM provided automatic wireup of the ViewModels which allowed me to separate these operations from the view very simply. The trickiest part was getting my sessions and upcoming sessions to respect each others changes. Due to the delay in how the Property Change notification works, sometimes this resulted in a clunky UI.
In addition to these two sections and a corresponding Session Detail page, which listed all available information for the session, I created another page using the Pivot data control which would allow the user to view the session data with different groupings: block, track, room, etc.
During my initial testing everything worked well and so I elected to submit my application for approval on Sunday, August 26, 2012. However, upon arriving at the conference and using the app myself I noticed that more often than not the app would crash when going to the Pivot portion. I hypothesized that it was simply trying to do too much. So despite the app being initially approved on August 28, 2012 I elected to forgo its approval and try to work out a solution. I eventually did: I broke the page apart and gave the user a page to select what they wanted to see. It worked well and the app was resubmitted. However it would not be approved before the end of the conference.
The conference organizers, one of whom was a Windows Phone 7 users, still helped promote the XAP I deployed to my Skydrive, but in the end, it seems, I was the only one who ended up using it. But this experience and conversations about the other options gave me some ideas for Codemash.
All in all I was able to develop the app in just under 21 hours and have it be fairly feature rich. The biggest problem was the noticeable delay when notifying the View that a property changed. There doesn’t seem to be a way with CM to know when this is complete. This often resulted in the screen being blank despite the fact that everything was alright.
Outside of seasoned Android and iPhone developers I really think this shows that even for a newbie like myself Windows Phone brings the performance and efficiency developers expect to a mobile platform. I like both iPhone and Android, but Microsoft truly is the developers company and has the best tools. Visual Studio and the various language features of C# made developing this application a breeze. In the end, what did me in was not leaving enough time for the approval process. Developing it gave me some ideas for Codemash, in particular, finding a way where a person could have the latest session information without downloading all session data.
To conclude, I think the experiment was a success because I was able to develop the app in such a short amount of time. Microsoft’s tooling for developers is truly second to none, now if they could just sell some damn phones I might be able to use WP in conversations involving Android and iPhone.