Building a Notification Hub for Windows Phone on top of Windows Azure Mobile Services

For most applications, notifications are not exactly critical. Granted, a scientific calculator will not benefit from having an in-app notification hub. On the other hand, there are cases when you want to let the user know about what’s new and what changes before an update or including information in the changelog. That’s where a custom notification hub control can come in really handy.

What goes into a notification?

Before jumping to actual coding, let’s think about what actually should go in a notification. We obviously want to display the information in the form of the simplest message possible. A title and a description should do it. But a notification also usually implies that there is some action tied to it, be it opening another application or a third-party location. So maybe including a URI would be another valid addition. All in all, we end up with this layout:


Fantastic. You can see that there are two extra properties that I haven’t mentioned – Id and TimeStamp. Since Azure Mobile Services are used, one of the core ways to determine the identity of an entity is by its unique integer identifier in the data table – Id takes care of holding the proper value. The TimeStamp property might not carry a unique value, but will tell the user when the notification was created. Ultimately, in the application itself it is possible to set filters to only show notifications from a given date range, but that’s a different topic.

In C# code, the class above will look like this:

using Microsoft.WindowsAzure.MobileServices;
using System;

namespace Hilltop.CoreTools.Models
  public class Notification
    public int? Id { get; set; }
    public DateTime TimeStamp { get; set; }
    public string Title { get; set; }
    public string Content { get; set; }
    public string Url { get; set; }

Notice the reference to Microsoft.WindowsAzure.MobileServices – make sure you install the Azure Mobile Services Windows Phone SDK in order to be able to use it. I personally prefer using NuGet for this, so feel free to use this command to get the package:

PM> Install-Package WindowsAzure.MobileServices

The Core Control

Now that there is a defined notification model, I can start working on the core control itself. I’ll start by defining the skeleton via a INotificationCenter interface:

 using System.Threading.Tasks;

namespace Hilltop.CoreTools.Interfaces
  interface INotificationCenter
    void Initialize();
    void GetCurrent();
    void Clear();

    Task CreateNotification(string title, string content, string url);

GetCurrent will handle the acquisition of the current notification stack, Clear will erase all existing notifications and CreateNotifications will help the developer create notifications directly from the app.

SECURITY NOTE: It is important to remember, however, that notification creation should probably be secured – the way the notification hub control works, it provides a unified “connector” to the service and it is up to the developer to have the proper separation of roles and capabilities available to different app user categories.

Without going into the boring details of dependency property registration, here is what the ultimate class for the NotificationCenter control will look like:


Notice that I have MobileService declared in the Fields section. This is nothing else but the core managed Azure Mobile Services client. By default, it is null:

 public static MobileServiceClient MobileService = null;

We have an entire set of properties that determine the appearance of the notification entity in the global notification list. It is possible to set the icon associated with a given notification (usually taken from the context of the application itself but can be remote as well) as well as the colors for the content displayed.

Most important, however, is to have these two properties: ZumoKey and ZumoUrl. These will be used by the managed client to connect to the specific Azure Mobile Service instance and retrieve the data.

When the control is loaded in the visual tree, a call to Initialize (this is not the same as InitializeComponent) is made, that will try to connect to the service and retrieve any pending notifications:

 public void Initialize()
    if (!string.IsNullOrWhiteSpace(ZumoKey))
        if (!string.IsNullOrWhiteSpace(ZumoUrl))
            MobileService = new MobileServiceClient(ZumoUrl, ZumoKey);

            throw new InvalidOperationException("Missing ZUMO URL.");
        throw new InvalidOperationException("Missing ZUMO key.");

When it comes to GetCurrent, it will simply populate the Notifications collection with the data returned by AMS:

 public async void GetCurrent()
    if (MobileService != null)
            var data = await MobileService.GetTable().ToListAsync();
            Notifications = new ObservableCollection(data);
            // Failed to obtain the list of current notifications.

Post-initialization, we want to let the user know that the control is ready, so I’ve added the Ready event handler. Here is how it will be invoked once the control has finished the first iteration of the loading routine:

 void NotificationCenter_Loaded(object sender, RoutedEventArgs e)

    if (Ready != null)
        Ready(this, new EventArgs());
        this.Loaded -= NotificationCenter_Loaded;

Great. However chances are that at this point you don’t have any notifications available. CreateNotification would be exactly what you need:

/// Allows notification insertion directly from the client app.
///Notification title.
///Notification content.
/// TRUE if insertion is successful. FALSE if not.
public async Task CreateNotification(string title, string content, string url)
    Notification notification = new Notification();
    notification.Content = content;
    notification.Title = title;
    notification.TimeStamp = DateTime.Now;
    notification.Url = url;

    if (MobileService != null)
             await MobileService.GetTable().InsertAsync(notification);
             return true;
             return false;

     return false;

Thanks to the amazing work done by the Windows Azure Mobile Services team, all you really need to do is create a new instance of the Notification model and push it to the aforementioned MobileService client.

As I also mentioned earlier, we’d want the notification to be interactive and actually point to some sort of a resource, that is represented with the help of the Url property. To do this, we handle the notification item selection in the list:

 private void NotificationSelected(object sender, SelectionChangedEventArgs e)
    if (e.AddedItems.Count > 0)
        Notification notification = (Notification)e.AddedItems[0];

        WebBrowserTask task = new WebBrowserTask();
        task.Uri = new Uri(notification.Url);

The WebBrowserTask will use the built in browser (Internet Explorer) to open the associated page. Simple as that.

What do I need to set up in the AMS dashboard?

Not a whole lot. First of all, make sure that you create a new table that has the same identifier as the DataTable attribute in the Notification class. In the example above, I am using notifications as the name, and it is used like that in production with Beem and EnTrance:


During development, you might also want to enable Dynamic Schema:


SECURITY NOTE: It is important to disable dynamic schema before your app goes in production.

How do I use the control?

Use the standard XAML syntax in one of your pages:

 <ht:NotificationCenter NotificationIcon="/Images/notification.png" ZumoUrl="YOUR_URL" Ready="NotificationCenter_Ready" ZumoKey="YOUR_KEY" AbsentNotificationsColor="White"></ht:NotificationCenter>

And there you go:


You can download the source code for the control here (ZIP file).


My Summer as a Program Manager Intern at Microsoft

I’ve once again spent my summer in the Pacific Northwest, working as an intern for one of the top companies in the world – Microsoft. I embarked on a journey in a completely different role for me – despite the fact that I coded pretty much all my life (or, as much life as a 22-year old adult can have) and was a Software Design Engineer vendor all last year (feel free to read the post I wrote back then), I decided that I should become a Program Manager (or a PM). Not because I didn’t like coding or, but because I felt that over the years I developed not only a passion for writing software, but also for communication, planning and management. A PM role combines those perfectly, so once the time came for me to apply to for my next internship, I didn’t hesitate to check the PM role as the priority on the Microsoft Internship application form.

Interviews went well and I got the PM position in the Microsoft Office Division the same day, right after the interviews. I expected quite of a contrast compared to Developer Platform Evangelism, where I made my baby steps in the huge world that is known as the Redmond Campus. I had exactly zero connections in the Office division at the time, so I didn’t have anyone who could tell me from their experience – what is the culture like, what is the approach to tackling a variety of problems? Regardless, I was really excited and was ready to start working as soon as I landed in SeaTac.

I got to be a part of an amazing team that did remarkable work. All three months went by like a flash, but since I was dropped right into the epicenter of all the action, here are some of the highlights  (or, things that stuck with me) that might  be helpful to future interns from the perspective of a starting PM:

  1. Relationships matter. When it comes to getting things done, you need to know the right people that have the authority and ability to contribute to your work. Talk to your teammates – not just those in the same role, but everyone on the team. When I was just ramping up, I sent out 1:1 invites to pretty much everyone on the team to get to know them better, to see what they were working on and what are the most interesting parts of their job. I have not gotten a single rejection, and so through all my 3 months, I had the occasional 30 minute meeting with one of the developers, testers or program managers in their office, where I could ask almost any career-related question. That way, I found out more about my team than any PowerPoint slide deck could ever explain. That’s also a good way for people to remember who you are – not just some intern working in the office around the corner. More than that, one of the PM leads on my team is a motorcycle pro, and after a few conversations with him, I discovered that bikes is something I would like to know more about. So don’t be shy – get to know people you’re working with.
  2. Reach out. Microsoft is a very diverse company, with people coming from different backgrounds and different experiences. Don’t hesitate to reach out to them, even if they are way above you on the management chain. I remember that one of the opportunities I never got the chance to take was meeting Alex Kipman, the man who started ‘Project Natal’ (better known as Kinect nowadays). After talking to one of my coworkers at Microsoft about my thought of meeting the Director of Incubation at Xbox, I was advised to do the simplest thing one could possibly think of – just email him. That’s it. No formal introductions, just an email explaining why I want to meet him and what I want to get out of the meeting. A couple of days later, I was sitting in the lobby of one building talking to Alex – and once again, I learned a lot more than I would ever read in any interview or article. A lesson I learned from Charlie Kindel is that a good way to look at a problem is through the “What’s the worst that can happen and what do I have to lose?” lens. So let’s say you want to reach out to one of the top people. What’s the worst that can happen? Probably getting a rejection email. What do you have to lose? Nothing. That is, if you are smart about what you ask for and are not trying to waste people’s time. So go for it – meet people and learn, learn, learn. A lot of Microsoft employees are excited about talking to interns about their experiences.
  3. Effective communication is extremely important. Be clear, concise and to the point. Again, I’m back to the idea of not wasting people’s time. It’s shockingly easy to derail a conversation or an email thread if a person starts throwing too many issues in at once, so be aware of that and contact only the people that are either responsible for what you’re talking about, or can point you in the right direction. Stemming out of the ‘good communication’ stack is also the ability to present your ideas in an efficient manner. As a PM, I had the responsibility of writing several specifications, an area plan and on top of that – present all of those to the team. I loved doing it, but that is not enough – you need to not only know what to present, but also how. Learn from what your teammates are doing, pick up a couple of books and go through them on a weekend. It will pay-off in the long run.
  4. Don’t work in a silo. Or, as my manager called it, window shop before making any decisions. It is important to realize that what you’re working on is not impacting just you. Chances are, other features or parts of the project flow are in one or more ways affected by what you create. Pinpoint those possibilities early and talk to the people who are responsible for the respective areas. For example, if I am writing a specification for a car steering wheel, I would like to talk to the designer to make sure that it fits with the overall vision of the vehicle interior. I would also need to talk to the engineer that designs the steering wheel connectors that hook into the electronics (e.g. changing the radio volume or honk) to make sure that my design will allow for everything that’s needed. I could, of course, throw together a document that shows the fact that my steering wheel is the best possible idea since sliced bread, and leave it at that, but chances are this will not make a lot of people happy and all the design issues will be raised at some point. Plan accordingly and communicate with the individuals covering the adjacent or larger features.
  5. Attend intern events. There are plenty of those – some organized by University Recruiting, but even more are ran by interns themselves. Hiking? Why not. Have a few people chip in on gas and you will be going to explore Mount St. Helens, Goat Lake or the Olympic Peninsula. Do not, I repeat – DO NOT, waste time on weekends by playing Xbox (or PC, whatever your preference might be) inside all day. Get to know people, explore the neighborhood, get people together and try a new Korean restaurant, go see a movie or a live concert (for me there’s Paradiso. the Capitol Hill Block Party in Seattle and Paramount, that had some of the best shows). There’s always something to do and you should take advantage of that opportunity. And yes, the deadmau5 and Macklemore concert was amazing on every level. Thank you, Microsoft!
  7. Read. One of the fantastic things I love about Microsoft is its library. I managed to read a dozen of books this past summer, that completely changed my views (The Power of Habit was, hands down, the most interesting one), and you should do the same.
  8. Focus on the success of your product and take pride in what you do. When I asked Kurt DelBene, the president of the Microsoft Office Division, as to what would define an exceptional Program Manager, this was his response. And indeed, every morning I was coming excited to work because I knew that my work will contribute to the success of the larger product. I was following my passion – it is an outstanding feeling when you realize just how much impact you really have.
  9. Unexpected things happen. Usually at the least expected time too. Be ready to change your plan and have a fallback scenario. “What can go wrong?” is a good question to ask yourself when you’re designing a feature, and once you have a list of possible issues, list the causes and think about a way to tackle those, so that at the end your work will continue, even when one of the foundation pillars failed.
  10. Be open to feedback. Ask for feedback. You can sit in your office all day, writing specs and presenting them, then going back to the office and carrying on with the work you’ll be doing. But that’s not really what your internship is about. You want to become better at what you do, learn from people who’ve been in the field for quite a while and adopt the best practices, avoiding the mistakes that maybe have already been tackled before. One of the habits that I have developed is constantly asking for feedback from my manager, my mentor and fellow PMs. How should I improve my presentation? What could have I done better? What potential issues do you see with my approach that I might be missing? Trust me, you want to know answers to those questions. Also, never be offended by direct feedback – your goal is to be exceptional at what you do, and the only way to do it is by ensuring that you are getting the least sugarcoated feedback. Expect it, and develop an action plan for yourself on how to act based on what you’ve learned.


At the end of the day, the internship is what you make of it. There is no book or blueprint that will guide you through it for 100% of the way. Will you make mistakes? Probably. But what you learn from those mistakes is what will make you a valuable employee at the end. Be active, be eager to learn and realize that your impact matters.

This August, I have accepted a return offer and will be coming back to Microsoft in 2014 as a full-time Program Manager, which I am really excited about – these are great times and I am happy to apply my knowledge and skills towards changing the world. If there is one last thing that I’d say – apply for a Microsoft internship. It is truly a life-changing experience.

FileExplorer for Windows Phone – Test Feedback Needed

I’ve added several changes to the FileExplorer control, that will be included in the Coding4Fun Toolkit.

Before actually becoming an active part of the control set, I want to make sure that it works as it should and where it should, and for that I am distributing it now as a part of an experimental package.

2013-07-24 23.52.42

Since the last update, there is a big change that was introduced – the ability to switch the selection type. Now it is possible to:

  • Select a single file
  • Select multiple files
  • Select a single folder
  • Select multiple folders


This option is given through the SelectionMode property.


When the control is dismissed, the OnDismiss event handler is called, the application will get two items in return – a StorageTarget reference, that will identify the location of the selected entity(ies), as well as an object than can either be a single StorageFile, StorageFolder, ExternalStorageFile or ExternalStorageFolder, or it could be a List<T> where T is one of the aforementioned storage objects. Explicit conversion will be required, depending on the scenario.

Download the sample project here or directly from the CodePlex source control (latest checkin) and send me your feedback!

New Week – New FileExplorer Release

To continue the tradition of a weekly FileExplorer build, here is the next update, bringing you the following capabilities and fixes:

Show the path

You can actually see the current folder tree path in the control when navigating through. You can also select and copy the path (but not modify it at this point).

Use file format restrictions

As you already know, when accessing the Windows Phone external storage (if any is present, of course), you are only limited to seeing the files that have been explicitly associated with your application.

However, in a lot of cases you might want to restrict the visible file range even further. For those scenarios, the FileExplorer control now carries two new properties:

  • ExtensionRestrictions – an enum value that can be one of the following: None, InheritManifest, Custom. When None is selected, you will see all files when working with the isolated storage, and only files that have registered file extensions in external storage. InheritManifest, on the other hand, might be handy if you want to select a file from the isolated storage and limit the picker to files that are “pre-approved” in the manifest – obviously, this setting is unnecessary when handling external storage, since the policy is enforced by the OS by default. Last but not least, Custom allows you to define a set of your own filters. And more about that below.

  • Extensions – a generic collection that contains a set of extensions that you want to restrict the picker to. It is only used when the ExtensionRestriction property is set to Custom. You need to preserve all extensions in the .[EXT] format. So if, let’s say, I want to let the user pick only XPS files, I need to add a .xps entry to the collection. This property will not allow you to select files from external storage with extensions that have not been registered in the manifest.

As usual, you can download the latest (79607) checkin and go to Experimental > FileExplorerExperimental to see what this control is about.

I would love to hear your feedback and comments.

Testing the Future

…control that will be integrated in the Coding4Fun ToolkitFileExplorer!

You can download the Coding4Fun Toolkit source code here. Once downloaded, go to Experimental > FileExplorer. The sample project carries an alpha implementation of the control, and I would love to get your feedback on it – let me know what you want to see become a part of it.

NOTE: This custom control currently works only on Windows Phone 8.


The control will play the role of the standard Windows 8 FilePicker, but on Windows Phone. Its goal is to allow developers to provide an easy-to-use interface to interact with the isolated storage, as well as with the external storage in the context of native phone applications.

What can the control do at this point?

  • 1. Pick a file from the isolated storage (no file format restrictions)
  • 2. Pick a file from the external storage, if such is available (restricted to files that have an extension registered with the app)
  • 3. Navigate through the folder tree in both the isolated storage and external storage (where available)


In its current implementation, I am using the control as a way to open files for read. No built-in functionality is introduced to facilitate writing at this point.

What do I have planned for the control?

  • 1. File extension filter for files in the isolated storage (this can be both manifest-based and individual)
  • 2. Multi-file select (return a batch of files from one or different locations)
  • 3. Folder select
  • 4. Windows Phone 7.x support for isolated storage


Important disclaimer

The control is in its alpha stage. DO NOT use it in production.