Monday, June 30, 2008

image And there you have it: 30 .NET Windows Mobile Applications in 30 Days!

I really liked yesterday’s application, Community Megaphone Reader. I think it was because it was a Windows Mobile mashup application. And we can look forward to many more of these types of applications to come our way.

 

image

Trippr

You’ve probably already figured out what this application does. That’s right it takes your current GPS position and pulls back pictures that are geotagged for the area you are in. So while you are riding down the road you can flickrscan for photos taken near you, possibly as close as the block you are on.

Really cool idea I think. I’ll probably hook this up to the dashboard of my car and just let it run while I drive around. It should be lots of fun to just see what I see.

The UI is basic sterile white, but I wanted the photos to be the star of the show so I went with the one uber true neutral color.

Control are very simple: Update, Menu, GPS, GPS Start, GPS Stop, About, and Exit. Update is the main feature. Any time it is pressed new photos are downloaded.

Again for this project we looked to the GPS Intermediate Driver Reference, it has served us well these 30 days and I really highly recommend it. If you need to do a Windows Mobile GPS application use this and you are almost done.

Another great API I found is the Flickr.Net API. If you need to connect to Flickr in .NET or .NET Compact Framework this is great. It does all the heavy lifting for you! I was up and running in minutes!

“The Flickr.Net API is a .Net Library for accessing the Flickr API. Written entirely in C# it can be accessed from with any .Net language in .Net Framework 1.1, .Net Framework 2.0, .Net Compact Framework 2.0 and Mono.”

Update Method

   1: if (gpsPosition == null || !gpsPosition.LatitudeValid || !gpsPosition.LongitudeValid)
   2:      return;
   3:  
   4:  double minimumLongitude = gpsPosition.Longitude - 1;
   5:  double minimumLatitude = gpsPosition.Latitude - 1;
   6:  double maximumLongitude = gpsPosition.Longitude + 1;
   7:  double maximumLatitude = gpsPosition.Latitude + 1;
   8:  
   9:  string apikey = "get_your_own_flickr_key";
  10:  Flickr flickr = new Flickr(apikey);
  11:  
  12:  PhotoSearchOptions options = new PhotoSearchOptions();
  13:  options.BoundaryBox = new BoundaryBox(minimumLongitude, minimumLatitude, maximumLongitude, maximumLatitude);
  14:  options.Extras |= PhotoSearchExtras.Geo;
  15:  options.PerPage = 10;
  16:  options.SortOrder = PhotoSearchSortOrder.InterestingnessAsc;
  17:  
  18:  Photos photos = flickr.PhotosSearch(options); 
  19:  StringBuilder stringBuilder = new StringBuilder();
  20:  
  21:  foreach(Photo photo in photos.PhotoCollection)
  22:      stringBuilder.AppendFormat(@"<img src=""{0}"" style=""border: 1px black solid; padding: 0px; margin: 1px"" />", photo.ThumbnailUrl);
  23:  
  24:  webBrowser.DocumentText = stringBuilder.ToString();

Possibilities:

Obviously this needs an auto-update feature and settings for those of use who will use it on the road. If I click on a picture I’d love to see a larger view of it as well. and a details listing telling me more about the photo would be great.

Download executable: trippr.cab

Download Source Code: trippr.zip

Thank You:

I appreciate everyone’s encouragement and feedback. This project would not have been a success without all of you. Keep an out there’s more to come in the future. Wink


Monday, June 30, 2008 10:24:00 PM (Eastern Standard Time, UTC-05:00)  #    Comments [0]  |  Trackback

imageWe only have one more day left in our 30 days of .NET [Windows Mobile Applications]. Where do we go from here?

I’m really happy with the 30 Days of .NET so I do think I will continue that in one format or another for some time. It’s been a blast. And everyone knows my passion for Windows Mobile programming so we keep finding way to work that in there as well.

I haven’t quite decided what I’ll do for next month but I’m sure it’ll only get better as we move forward.

There have been a lot of request for applications that haven’t made it on deck yet, and obviously they aren’t all going to get done tomorrow. But I think I’ll be able to throw in some Bonus Day of .NET or Return of Day of .NET and knock some of them out over time.

My goal is to take all the existing content and clean it up some and make more through and detailed learning materials to really help beginners take off with Windows Mobile.

Hope you’ll join me on the road ahead…


Monday, June 30, 2008 1:10:00 AM (Eastern Standard Time, UTC-05:00)  #    Comments [1]  |  Trackback

Wow, it’s hard to believe the month is almost over already. So far we have 29 applications done in 29 days! Thank you for all your encouragement.

If you missed the week one recap here it is: 30 Days of .NET [Windows Mobile Applications] - Week One.

If you missed the week two recap here it is: 30 Days of .NET [Windows Mobile Applications] - Week Two.

If you missed the week three recap here it is: 30 Days of .NET [Windows Mobile Applications] - Week Three.

What’s your favorite?

image image  image image
GPS Clock MobileInfo Mobile Flashlight SmartDial

Let see we have a time utility, and device information, call blocker, and lots more!

image image image image_thumb15[4]
GeoCash Repeatr CallBlocker What will be next?

Feedback:

Got an idea? Got some feedback? Share it? Thanks!


Monday, June 30, 2008 12:06:00 AM (Eastern Standard Time, UTC-05:00)  #    Comments [1]  |  Trackback

 imageA friend, a coworker, and an all-around great guy, Page Brooks, has created a contest for building controls for Silverlight.

Here’s the highlights:

"Welcome to the Silverlight Control Builder Contest! With this contest, we hope to incite the development of many open and free Silverlight Controls that all developers can use in their applications, and what better way to do this than through a friendly contest! This contest is your chance to demonstrate your control building skills to the Silverlight community and win some pretty cool prizes at the same time!"

Check out the prizes:

1st Place

  • 1-Year MSDN Premium Subscription (Not for Resale)
  • Your choice of one book from the entire O'Reilly catalog

2nd Place

  • Microsoft Visual Studio 2008 Standard Edition
  • Your choice of one book from the entire O'Reilly catalog

3rd Place

  • Essential Silverlight 2 Up-to-Date from O'Reilly
  • Your choice of one book from the entire O'Reilly catalog

Great opportunity to build a little fame and win some great prizes. Find out more after the jump: http://gosilverlight.org/


Sunday, June 29, 2008 11:52:00 PM (Eastern Standard Time, UTC-05:00)  #    Comments [0]  |  Trackback

Only One Day Left…

Not too long ago Page Brooks and myself made the three and a half hour drive from Florence, SC to Greensboro, NC to attend the Ineta Carolina Community Leadership Summit '08. This was a great event and there we meet a lot of the local Ineta user group leaders. We also meet Andrew Duthie, aka DEvHammer. One issue that rose to the top of things we wanted to work on improving at the leadership summit was awareness of events that are occurring in the local regional area. That’s when Andrew told everyone about the project he has been working on: Community Megaphone.

I love have information at my fingertips, so I decided to write a tie-in application:

image

image

Community Megaphone Reader

Basically, this application connects to the Community Megaphone RSS feed and pulls down event data. Then it takes your current GPS position and calculates your distance from each event. Finally, it takes all the events and sorts then so you can find the event that is the closest to you. This is a great application for the traveling .NET geek. Where ever you are you can find great .NET events to attend.

The UI is paying homage to Andrew’s Community Megaphone site. I tried to match the basic colors to keep it familiar. The hyperlinks are active and will take you the event’s page on Community Megaphone. The menu only has a few options: Refresh, About, and Exit.

An application like this is really exciting, because it is tying the world of mobile together with the world wide web.

These types of mashup applications will contitue to take of for years.

LoadRss Method

   1: public static DataSet LoadRss(string requestUriString)
   2: {
   3:     HttpWebRequest feed = HttpWebRequest.Create(requestUriString) as HttpWebRequest;
   4:     StreamReader streamReader = new StreamReader(feed.GetResponse().GetResponseStream());
   5:  
   6:     string rssXml = streamReader.ReadToEnd();
   7:     rssXml = rssXml.Replace(@"<?xml version=""1.0"" encoding=""utf-8""?>", string.Empty);
   8:  
   9:     StringReader stringReader = new StringReader(rssXml);
  10:  
  11:     DataSet dataSet = new DataSet();
  12:     dataSet.ReadXml(stringReader);
  13:  
  14:     return dataSet;
  15: }

 

GetEvents Method

   1: public static List<Item> GetEvents(DataSet dataSet, GpsPosition gpsPosition)
   2: {
   3:     List<Item> items = new List<Item>();
   4:  
   5:     foreach (DataRow dataRow in dataSet.Tables["item"].Rows)
   6:     {
   7:         Item item = new Item();
   8:         item.Title = (string)dataRow["title"];
   9:         item.Description = (string)dataRow["description"];
  10:         item.Link = (string)dataRow["link"];
  11:         item.PublishDate = DateTime.Parse((string)dataRow["pubDate"]);
  12:         item.Latitude = Double.Parse((string)dataRow["lat"]);
  13:         item.Longitude = Double.Parse((string)dataRow["long"]);
  14:  
  15:         if(gpsPosition.LatitudeValid && gpsPosition.LongitudeValid)
  16:             item.Distance = GeoCodeCalc.CalcDistance(gpsPosition.Latitude, gpsPosition.Longitude, item.Latitude, item.Longitude);
  17:  
  18:         items.Add(item);
  19:     }
  20:  
  21:     items.Sort(delegate(Item item1, Item item2)
  22:     {
  23:         return item1.Distance.CompareTo(item2.Distance);
  24:     });
  25:  
  26:     return items;
  27: }

Display Events Method

   1: public static string DisplayEvents(List<Item> events)
   2: {
   3:     StringBuilder stringBuilder = new StringBuilder();
   4:  
   5:     foreach (Item item in events)
   6:     {
   7:         stringBuilder.Append(@"<span style=""color: #FFFFFF;font-weight:bold;"">");
   8:         stringBuilder.AppendFormat(@"<a href=""{0}"" style=""color: #DBB94F;"">{1}</a><br/><br/>", item.Link, item.Title);
   9:         stringBuilder.AppendFormat(@"{0}<br/><br/>", item.Description);
  10:         stringBuilder.AppendFormat(@"<b>Distance: <span style=""color: #DBB94F;"">{0} miles</span></b><br/>", item.Distance.ToString("0.00"));
  11:         // stringBuilder.AppendFormat(@"<b>{0}</b><br/>", item.PublishDate);
  12:         // stringBuilder.AppendFormat(@"{0}<br/>", item.Latitude);
  13:         // stringBuilder.AppendFormat(@"{0}<br/>", item.Longitude);
  14:         stringBuilder.AppendFormat(@"<br/><br/>");
  15:         stringBuilder.Append(@"</span>");
  16:     }
  17:  
  18:     return stringBuilder.ToString();
  19: }

Possibilities:

Andrew recently added iCalendar file support to Community Megaphone. This would be a great feature to add to a Windows Mobile application, and it is totally doable. The HTML could be a little more fancy maybe even use a few 16x16 fonts for a little personality.

Download executable: communityMegaphoneReader.cab

Download Source Code: communityMegaphoneReader.zip

Feedback:

Want more? What else would you like to see? Time’s running out only one more day. Be sure to get your ideas in soon!


Sunday, June 29, 2008 11:31:00 PM (Eastern Standard Time, UTC-05:00)  #    Comments [0]  |  Trackback
Saturday, June 28, 2008

Only 2 Days Left…

Today’s application is CallBlock. It is designed to watch incoming calls, and check and see if they match any on the block phone numbers list. If they do match then the phone is “blocked”.

 

image

CallBlock

The first thing you should notice is the flashy logo at the top of the form. I create this logo with an online 3D logo generator. The one simple touch adds a lot of professional polish to the application. I really like red and white so I didn’t change the background color this time. But I am starting to wish I had. It seems a little “blah” to me now.

Next we have our phone number input text box. The user enters the phone number here, and presses the Block menu item to add it to the block number list below. On the main menu we also have options to Unblock, and Unblock All. And we have our almost universal About and Exit menu items.

There are two main pieces to this application. One part is the State and Notification Broker code to give us an event to catch incoming phone calls.

I actually got myself painted into a corner, I assumed you could just programmatically ignore of phone call but it isn’t that simple. Fortunately, a good friend of mine, Lou Vega, came up with a very slick workaround for this. And that is the second part which is the keybd_event method that allows us to send keypresses to the OS to Ignore the phone call.

CallBlock Core Code

   1: const int KEYEVENTF_KEYDOWN = 0x0;
   2: const int KEYEVENTF_KEYUP = 0x2;
   3:  
   4: [DllImport("coredll.dll", EntryPoint = "keybd_event", SetLastError = true)]
   5: internal static extern void keybd_event(byte bVk, byte bScan, int dwFlags, int dwExtraInfo);
   6:  
   7: SystemState phoneIncomingCall = new SystemState(SystemProperty.PhoneIncomingCall);
   8: private void frmMain_Load(object sender, EventArgs e)
   9: {
  10:     phoneIncomingCall.Changed += new ChangeEventHandler(phoneIncomingCall_Changed);
  11: }
  12:  
  13: void phoneIncomingCall_Changed(object sender, ChangeEventArgs args)
  14: {
  15:     string phoneNumber = RemoveText(SystemState.PhoneIncomingCallerNumber);
  16:  
  17:     if(listBoxBlockedNumbers.Items.Contains(phoneNumber))
  18:     {
  19:         keybd_event(115, 0, KEYEVENTF_KEYDOWN, 0);
  20:         keybd_event(115, 0, KEYEVENTF_KEYUP, 0);
  21:     }
  22: }

 

Possibilities:

It would be easy to add support for blocking SMS text messages as well. We’ve done all the code for this already in previous applications. Also the application could really use a persistent data store to remember number to block in case the user closes the application. It would be nice to allow user formatting of entered phone numbers for increased readability.

Download executable: callBlock.cab

Download Source Code: callBlock.zip

Feedback:

Want more? What else would you like to see? Time’s running out on submitting ideas. Be sure to get yours in soon!


Saturday, June 28, 2008 4:07:00 PM (Eastern Standard Time, UTC-05:00)  #    Comments [2]  |  Trackback

So Page Brooks was talking with me earlier this week and he had a great idea for another Windows Mobile application. He wants an application that will repeat alerts for missed phones and text messages. I have to admit this is something I could use myself. So I figured I take a crack at it today, since it would make for a fun, simple, Friday app.

 

image

Repeatr

I decided to change up the naming format and play of the popular Web 2.0 naming conventions giving us the name: Repeatr. I have to admit, it is kind of catchy.

I searched for “Web 2.0 Logo Creator” and pretty much went with the first one I saw. This gave me a pretty slick logo in less than 5 minutes. I also decided to make the background a “tooltip” yellow, which I think looks really good.

Other than that everything is rather straight forward. We have checkboxes allowing the user to choose what events we will monitor. And we have a menu with a couple options, namely About and Exit. There is a “Clear Alerts” menu item, as well, that allows users to acknowledge they have responded to the alert(s).

The application allows user to select the number of minutes between alerts up to 60 minutes.

Of course we are using the State and Notification Broker to make all this happen. Using it means we hardly have to write any code ourselves!

State and Notification Broker setup code

   1: SystemState phoneMissedCalls = new SystemState(SystemProperty.PhoneMissedCalls);
   2: SystemState messagingSmsUnread = new SystemState(SystemProperty.MessagingSmsUnread);
   3: SystemState messagingTotalEmailUnread = new SystemState(SystemProperty.MessagingTotalEmailUnread);
   4: SystemState messagingVoiceMailTotalUnread = new SystemState(SystemProperty.MessagingVoiceMailTotalUnread);
   5:  
   6: private void frmMain_Load(object sender, EventArgs e)
   7: {
   8:     phoneMissedCalls.Changed += new ChangeEventHandler(phoneMissedCalls_Changed);
   9:     messagingSmsUnread.Changed += new ChangeEventHandler(messagingSmsUnread_Changed);
  10:     messagingTotalEmailUnread.Changed += new ChangeEventHandler(messagingTotalEmailUnread_Changed);
  11:     messagingVoiceMailTotalUnread.Changed += new ChangeEventHandler(messagingVoiceMailTotalUnread_Changed);
  12: }

 

The way we alert a user to having missed a monitored event is by playing a sounds which is easy to do.

   1: [DllImport("aygshell.dll")]
   2: static extern uint SndPlaySync(string pszSoundFile, uint dwFlags);
   3:  
   4: void PlaySound()
   5: {
   6:     string path;
   7:     path = Path.GetDirectoryName(Assembly.GetExecutingAssembly().GetName().CodeBase);
   8:  
   9:     SndPlaySync(Path.Combine(path, "alert.wma"), 0);
  10: }

Other than a little plumbing to make everything work together that is basically the entire app in a nutshell.

Possibilities:

This is a pretty spiffy application. But software can always be better. An option to allow the phone to vibrate would be great. Another option to allow the user to select the alert sound would be nice too.

Download executable: repeatr.cab

Download Source Code: repeatr.zip

Feedback:

Want more? What else would you like to see? Time’s running out on submitting ideas. Be sure to get yours in soon!


Saturday, June 28, 2008 2:30:00 AM (Eastern Standard Time, UTC-05:00)  #    Comments [0]  |  Trackback
Friday, June 27, 2008

4 Days left…

Today on twitter, Glen Gordon was telling me that Brendon Schwartz had an idea for today’s application:

glengordon @cjcraft here's an idea for a mobile app that @brendonschwartz will like - record $ spent during the day and where it was spent (with GPS) about 13 hours ago from Witty in reply to CJCraft

It’s a really good idea. Probably a better idea than we will be able to do it tonight, but we are all about taking the first small steps to accomplishing great things.

 

image

GeoCash

I love the name, it is a play on GeoCaching. Somehow it adds a lot of “buzz” to the application already.

The application is designed to be easy for the user to use and understand. The user only needs to enter the amount they spent along with a note, and then simply press log and it will be added to the GeoCash log.

We are using our own NumericTextBox to be sure the user doesn’t enter in any invalid amounts spent. We have another standard TextBox for the note input. Below this we have the log information. This is done using a WebBrowser control, and setting its DocumentText property.

The main reason to use the WebBrowser control is to be able to do a little better text formatting. This allowed us to easily markup our text in bold and color.

 

HTML formatted output:

   1: sb.AppendFormat(@"<b>Date:</b> {0}", DateTime.Now).Append("<br/>");
   2: sb.AppendFormat(@"<b>Amount:</b> <span style=""color:red"">{0:c}</span>", decimal.Parse(textBoxAmountSpent.Text)).Append("<br/>");
   3: sb.AppendFormat(@"<b>Note:</b> {0}", textBoxNote.Text).Append("<br/>");
   4: sb.AppendFormat(@"<b>Latitude:</b> {0}", position.Latitude).Append("<br/>");
   5: sb.AppendFormat(@"<b>Longitude:</b> {0}", position.Longitude).Append("<br/>");
   6: sb.Append("<br/>");
   7:  
   8: documentText += sb.ToString();
   9: webBrowser.DocumentText = documentText;

 

Possibilities:

I love this app. It has so many cool possibilities. You could easily save this information to a text file or sent it as an email. I think this is perfect data to do a mashup on for example create a heatmap etc for it so you can see the “dangerous” side of town you need to avoid taking your money into from now on. Open-mouthed

Download executable: geoCash.cab

Download Source Code: geoCash.zip

Feedback:

Want more? What else would you like to see? Time’s running out on submitting ideas. Be sure to get yours in soon!


Friday, June 27, 2008 1:59:00 AM (Eastern Standard Time, UTC-05:00)  #    Comments [1]  |  Trackback
Thursday, June 26, 2008

5 Days Left…

So when you are talking Windows Mobile Applications you are usually talking about a cell phone device. We have looked at text messages using SMS, but one thing we haven’t look at so far is programmatically making phone calls. Today we will take a look at creating our own phone dialer application. It’s easier than you think!

 

image

SmartDial

I think the UI is pretty nice, not the best, but good overall. It is bright and clean. I found a web site that allowed me to create buttons in a snap and used it for the numbers. At the top of the screen, I added a label to display the number to dial. The menu only has a few options: Dial, Menu, Clear, About, and Exit.

Since we only allow users to enter numbers using our custom buttons, we don’t have to worry about anyone entering invalid characters.

So how much code did we as Windows Mobile application developers have to write to actually dial a number? See for yourself.

   1: private void Dial()
   2: {
   3:     new Phone().Talk(labelPhoneNumber.Text);
   4: }

Possibilities:

I think this has the potential to be an absolutely great application. One thing I think would be cool is if the application supported skinning. In a way it does, since I decided to leave the image resources as external files to the executable. So a user could edit any of the files themselves. Another great enhancement would be to have mousedown images for each button to give a nice “animated” touch to the application. What about quick soft sounds for when each button is pressed?

Download executable: smartDial.cab

Download Source Code: smartDial.zip

Feedback:

Want more? What else would you like to see? Time’s running out on submitting ideas. Be sure to get yours in soon!


Wednesday, June 25, 2008 11:12:00 PM (Eastern Standard Time, UTC-05:00)  #    Comments [1]  |  Trackback
Tuesday, June 24, 2008

Today I am in Atlanta, GA with Brian Hitney and Glen Gordon. We are presenting Mobility Roadshow: Programming for Windows Mobile. We had a long drive last night, and will have another long drive back to Florence, SC tonight. So I choose not bite off anything too intense today.

Many people today carry mini-flashlights on the end of their key chain. Apparently there is a need for this type of device because many stores sell them near the cash registers in the checkout lines. I wonder why these mini-flashlights are so popular when almost everyone has a mobile phone today. Maybe it is because the phone’s back light is not bright enough.

Hmm, this got me thinking. Most Windows Mobile devices have large powerful screens, maybe there is a way we could reuse our device as both a mobile phone and a mini-flashlight.

image

imageMobile Flashlight

The UI is simple but the task is simple. I considered using a watermark image for the background or add a gradient to the background. With a goal of having as much of the screen as bright as possible I think the simple solid color background was the choice to make.

We only have a few menu options: Burn, Menu, Settings, About, and Exit. I decided to use the term “Burn” like you see on road sign saying “Motorcycles must burn lights”. We only have a few screens: Main, Settings, About. The settings screen you should see to the left, and the main screen should be to the right of this text.

On the about screen we let the user choose the color they would like the screen to “burn” at. By default we have chosen white to maximize brightness.

We used NumericUpDown controls to maximize usability, this allows user to choose the soft input panel or the control directly to set the color amounts.

Save Color Values

   1: int red = (int) numericUpDownRed.Value;
   2: int green = (int) numericUpDownGreen.Value;
   3: int blue = (int) numericUpDownBlue.Value;

 

Get Color Values

   1: numericUpDownRed.Value = (int) Global.Color.R;
   2: numericUpDownGreen.Value = (int) Global.Color.G;
   3: numericUpDownBlue.Value = (int) Global.Color.B;

Possibilities:

The biggest need this application has is a way for the user to save their color preference. Right now if the application is closed the color will go back to the default color of white. Another great feature would be to make the application to go full screen and hide both the title bar and the menu. One last addition would be code to maximize the screen brightness setting in Control Panel.

Download executable: mobileFlashlight.cab

Download Source Code: mobileFlashlight.zip

Feedback:

Want more? What else would you like to see? Time’s running out on submitting ideas. Be sure to get yours in soon!


Tuesday, June 24, 2008 2:46:00 PM (Eastern Standard Time, UTC-05:00)  #    Comments [0]  |  Trackback

Information is power. And with the .NET Compact Framework we can have all the information we want. Windows Mobile has many ways to get details about the device our application is running on. Hands down my favorite is the State and Notification Broker. In a word it ROCKS! You can use it to find out any number of things and you can use it to notify us when information we care about change state.

There are pieces of information that are so important in their own right, they could be used to create an application just to monitor and read that one detail. The first one that comes to mind is battery state.

image

MobileInfo

I thought of a few ways I could make this application flashy, but decided that might get in the way of the facts. Sometimes a simple notepad like application is the most beautiful application. Form and function were meant to be together, but sometimes forms steals the show, and function is what everyone came to see.

So instead we have a WebBrowser control with a simple text listing of the device’s most important details. I decided to use a WebBrowser control in case I ever did want to use more advanced text format.

We stick to our guns about keeping control simple and intuitive. We have a great menu with only a few options: Refresh, About, and Exit.

RefreshData Method

   1: private void RefreshData()
   2: {
   3:     StringBuilder sb = new StringBuilder();
   4:  
   5:     sb.Append("<b>Active Application:</b>").Append("<br/>");
   6:     sb.AppendFormat("'{0}'", SystemState.ActiveApplication).Append("<br/>").Append("<br/>").Append("<br/>");
   7:  
   8:     ...
   9: }

Possibilities:

You can never have too much of a good thing. We have twenty pieces of information here for users to enjoy. How about a hundred? Or how about a quick and easy search bar? And the UI needs to be simple but it could be better.

Download executable: mobileInfo.cab

Download Source Code: mobileInfo.zip

Feedback:

Want more? What else would you like to see? Time’s running out on submitting ideas. Be sure to get yours in soon!


Tuesday, June 24, 2008 2:11:00 AM (Eastern Standard Time, UTC-05:00)  #    Comments [0]  |  Trackback
Monday, June 23, 2008

I have put together a calendar of applications for the 30 Days of .NET [Windows Mobile Applications]. Here you can get a quick feel for all the applications we’ve created so far, and will write in the coming days.

30 Days of .NET Windows Mobile Applications

  image_thumb[37] image_thumb[38] image_thumb[39] image_thumb[40] image_thumb[41] image_thumb[42] image_thumb[43]
image[141] image[134] image[135] image[136] image[137] image[138] image[139] image[140]
image[150] image[142] image[143] image[144] image[145] image[146] image[147] image[149]
image[151] image[152] image[153] image[154] image[155] image[156] image[157] image[158]
image[166] image[159] image[160] image[161] image[162] image[163] image[164] image[165]
image[167] image[168] image[169]          

 

Day 1 Minutes to Midnight Countdown
   Countdown timer until midnight.
Day 2 Bluetooth Manager
   Utility to programmatically control Bluetooth status.
Day 3 GPS Compass
   GPS tools to read device’s heading from device GPS.
Day 4 Mileage Tracker
   Application that will track vehicles mileage statistics.
Day 5 Mobile Capture
   Screenshot utility that will programmatically take screenshots on device.
Day 6 Pocket PasswordGen
   Program generates secure random passwords.
Day 7 Mobile FX
   Fun application that allows user to play various “situation” sounds.
Day 8 Rotate Me
   Utility to programmatically control the device’s orientation.
Day 9

Mobile Tipper

   Allows users to calculate tips quickly and easily.
Day 10 What is My IP?
   Find out the IP addresses a device has in a snap.
Day 11 Mobile Signature
   Program that will capture signature from people in the field.
Day 12 Mobile Quiz
   Application that is designed to display created quizzes and polls to users.
Day 13 Pocket Death Calculator
   Fun program that will calculate how long until a user has left to live.
Day 14 Mobile SMS Contact
   Utility to allow sending of SMS text messages to groups.
Day 15 Mobile SMS Remote
   SMS framework and application for sending SMS commands to devices.
Day 16 SMS Logger
   Record and log all SMS text messages received by device.
Day 17 Lunch-O-Matic
  Take the chore out of deciding where to eat lunch today.
Day 18 Mobile Weather
   What will the weather be like today?
Day 19 Mobile Speedometer
   GPS utility that will obtain current speed from the device’s GPS.
Day 20 Mobile Altimeter
   GPS utility that will read the current altitude from GPS.
Day 21 Mobile Sketcher
   Simple but powerful drawing application for Windows Mobile.
Day 22 GPS Clock
  GPS application that can update the device’s time from GPS information.
Day 23 MobileInfo
  Program that will read and display device related information
Day 24 Mobile Flashlight
  In the dark? Mobile Flashlight is here to help.
Day 25

SmartDial

  Want to create your phone dialing interface? Start with SmartDial.
Day 26 GeoCash
  This application will log and track where you spend all your money.
Day 27 Repeatr
   Miss a phone call, text message, or email. This application will remind you.
Day 28 CallBlocker
   Tired of that annoying automated marketing call? Let CallBlocker block it.
Day 29 Community Megaphone Reader
   Wondering where the closest developer event is to you? CMR can tell you.
Day 30 Trippr
   Let Tripper find geotagged photos from your location on Flickr.

Monday, June 23, 2008 12:25:00 AM (Eastern Standard Time, UTC-05:00)  #    Comments [0]  |  Trackback
Sunday, June 22, 2008

Yeah, we have made it through week three of my 30 Days of .NET challenge. So far, we have 22 applications for 22 days. Thanks for your support!

If you missed the week one recap here it is: 30 Days of .NET [Windows Mobile Applications] - Week One.

If you missed the week two recap here it is: 30 Days of .NET [Windows Mobile Applications] - Week Two.

What’s your favorite?

image image image image
Mobile SMS Remote SMS Logger Lunch-O-Matic Mobile Weather

We get around, don’t we? SMS, RSS, GPS, Camera API, and more!

image image image image
Mobile Speedometer Mobile Altimeter Mobile Sketcher What will be next?

Feedback:

Got an idea? Got some feedback? Share it? Thanks!


Sunday, June 22, 2008 6:31:00 PM (Eastern Standard Time, UTC-05:00)  #    Comments [1]  |  Trackback

I couldn’t resist creating another GPS related mobile application. One of the neat pieces of data you get from your GPS device is time. This is great. It is like having one of the clocks that can update itself over the air by reading data transmitted from various atomic clocks throughout the world. Many phones today have the ability to update their time by connecting to the OEM’s time servers, but not all. And there are still lots of Windows Mobile classic devices in the world that do not have cellular capabilities.

Vista has the ability to update its time by using a feature called Internet Time. Basically Vista connects to time.windows.com and reads a Network Time Protocol server.

 

image

GPS Clock

Our user interface is simple and direct. We are using a nice graphic to adds some visual zing to the application. At the top of the screen we show the user their current device time and their current GPS time.

This allows the user to tell at a glance if they need to update their device’s time using the Update menu option.

On the menu we have added some simple settings features: GPS Start, GPS Stop, About, and Exit.

This is one of those Web 2.0 ideas where an application does one thing but does it very well. Sometimes these are the best apps. In this case, our application provides a bride for GPS time data to become device time data.

Somtimes that’s all it takes to make a user happy.

UpdateData Method:

   1: void UpdateData(object sender, System.EventArgs args)
   2: {
   3:     if (gps.Opened)
   4:     {
   5:         if (position != null)
   6:         {
   7:             if (position.TimeValid)
   8:             {
   9:                 gpsTime = position.Time;
  10:  
  11:                 labelCurrentGpsDate.Text = gpsTime.ToLongDateString();
  12:                 labelCurrentGpsTime.Text = gpsTime.ToLongTimeString();
  13:             }
  14:         }
  15:     }
  16: }

 

UpdateTime Method:

   1: private struct SYSTEMTIME
   2: {
   3:     public short Year;
   4:     public short Month;
   5:     public short DayOfWeek;
   6:     public short Day;
   7:     public short Hour;
   8:     public short Minute;
   9:     public short Second;
  10:     public short Milliseconds;
  11: }
  12:  
  13: [DllImport("coredll.dll")]
  14: private static extern bool SetSystemTime(ref SYSTEMTIME time);
  15:  
  16: private void UpdateTime()
  17: {
  18:     DateTime idag = gpsTime.ToUniversalTime();
  19:  
  20:     SYSTEMTIME s = new SYSTEMTIME();
  21:     s.Year = (short) idag.Year;
  22:     s.Month = (short) idag.Month;
  23:     s.DayOfWeek = (short) idag.DayOfWeek;
  24:     s.Day = (short) idag.Day;
  25:     s.Hour = (short) idag.Hour;
  26:     s.Minute = (short) idag.Minute;
  27:     s.Second = (short) idag.Second;
  28:     s.Milliseconds = (short) idag.Millisecond;
  29:  
  30:     SetSystemTime(ref s);
  31: }

Possibilities:

How about changing the color of the date and time if they are more than five minutes off? Simple feature to add but really helps the user. And that’s what matters.

Download executable: gpsClock.cab

Download Source Code: gpsClock.zip

Feedback:

Want more? What else would you like to see? Time’s running out on submitting ideas. Be sure to get yours in soon!


Sunday, June 22, 2008 6:16:00 PM (Eastern Standard Time, UTC-05:00)  #    Comments [0]  |  Trackback

The main goal of 30 Days of .NET was to create a series of applications, any of which, a reader could take and use as a springboard to creating their first application. Well that, and to have some fun along the way and get more people excited about mobile development. A secondary goal of mine has been to show off various capabilities of mobile devices like GPS, Bluetooth, and multimedia features. One feature we haven’t covered so far is using a built-in camera.

Today we will mark that item off our list…

image

Mobile Sketcher

The goal is to create a basic drawing application, but add a mobile twist to it. On the menu, I have added a menu item for selecting a picture using the select picture dialog. The nice thing about the select picture dialog is it allows you to use your camera to take a picture and then select it as your picture.

In a way this application is a lot like the mobile signature capture application we did a while back, but there are some important differences: picture selection support, camera support, save file dialog support, and more. The business case for this application is something like the following: an insurance agent arrives on the scene of an automotive accident, she takes a picture using Mobile Sketcher and then adds notes and sketches to the picture for claims processing.

So users can select a picture from their device or take a picture and use it for their background. And then they can draw and edit the picture using Mobile Sketcher. At the bottom of the screen we allow user to select different colors for the pen’s ink: red, orange, yellow, green, blue, brown, white, and black. Well okay, white is really a light gray since white on white is hard to see.

SelectPicture Method:

   1: private void SelectPicture()
   2: {
   3:     SelectPictureDialog selectPictureDialog = new SelectPictureDialog();
   4:     DialogResult dialogResult = selectPictureDialog.ShowDialog();
   5:  
   6:     if (dialogResult != DialogResult.OK)
   7:         return;
   8:  
   9:     pictureBox.Image = new Bitmap(selectPictureDialog.FileName);
  10: }

Possibilities:

There is lots of room for improvement with this application. Just think of all the features most drawing programs have and there’s your list for improvements.

Download executable: mobileSketcher.cab

Download Source Code: mobileSketcher.zip

Feedback:

Want more? What else would you like to see? The managed API for using a Window Mobile camera is a great feature that is very powerful and very easy. Use it in your next mobile application or your first.


Sunday, June 22, 2008 1:17:00 AM (Eastern Standard Time, UTC-05:00)  #    Comments [0]  |  Trackback
Saturday, June 21, 2008

Yesterday, I had a really hard time between choosing to do a Mobile Speedometer or a Mobile Altimeter. But another day gives us another opportunity, and today we shall create the Mobile Altimeter.

image

Mobile Altimeter

This will make the third application in the 30 Days of .NET series that has had targeted GPS capabilities. We have created a compass, a speedometer, and now a altimeter. And there are still dozens of applications we could create with the GPS capabilities of Windows Mobile.

This time I decided to a little more with the UI. We have a background that symbolizes “altitude” which is appealing to end users. Plus it gives the program a lot of style and class. On the left side of the screen if you look carefully, you will notice we have an attitude ruler, which has a marker that rises one pixel for every foot higher the device travels up to 180 feet.

This simple feature really takes our application up to the next level. :D (Yeah, I know: I’m terrible.)

At the bottom of the screen we are allowing the user to read all the main stats off the GPS so the application is even more useful. We show altitude in a large bold font in the middle of the screen for impact.

The main event: UpdateData

   1: void UpdateData(object sender, System.EventArgs args)
   2: {
   3:     if (gps.Opened)
   4:     {
   5:         if (position != null)
   6:         {
   7:             if (position.SeaLevelAltitudeValid)
   8:             {
   9:                 labelAltitude.Text = position.SeaLevelAltitude.ToString("0.00ft");
  10:                 if (position.SeaLevelAltitude >= 0 && position.SeaLevelAltitude <= 180)
  11:                     pictureBoxArrow.Top = 173 - (int) position.SeaLevelAltitude;
  12:                 else
  13:                     pictureBoxArrow.Top = 173;
  14:             }
  15:         }
  16:     }
  17: }

Possibilities:

I think a more realistic UI would be a great improvement. And the ability to switch from miles to kilometers would be good too. If the odometer would track miles traveled that would be an awesome enhancement.

Download executable: mobileAltimeter.cab

Download Source Code: mobileAltimeter.zip

Feedback:

Want more? What else would you like to see? There’s been a lot of demand for GPS related applications. Does that help?


Saturday, June 21, 2008 2:07:00 AM (Eastern Standard Time, UTC-05:00)  #    Comments [2]  |  Trackback
Friday, June 20, 2008

After the last GPS related application, GPS Compass, I’ve been wanting to do another GPS focused application. This time I figured we’d get in the driver’s seat with our friend: SPEED.

Gentlemen, start your engines…

image

Mobile Speedometer

The application is built off of  Windows Mobile 6 SDK included a GPS Application in the samples folder, C:\Program Files\Windows Mobile 6 SDK\Samples\PocketPC\CS\GPS.

This uses the GPS Intermediate Driver. If you are writing a location aware application for Windows Mobile this is definitely the way to go. ;)

The main UI is located at the top of the screen. We have a simple speedometer graphic in the background to add some flair to the application. On top of this we overlay the current speed based off of information returned from the GPS device. We can also use Fake GPS to simulate a GPS device.

Below this we have a readout of various GPS statistics that are updated continuously.

One thing to note is Speed may be return in knots which you will likely want to convert to either miles or kilometers.

 

 

 

 

We just need to create a method something like UpdateData below.

   1: void UpdateData(object sender, System.EventArgs args)
   2: {
   3:     if (gps.Opened)
   4:     {
   5:         if (position != null)
   6:         {
   7:             if (position.SpeedValid)
   8:             {
   9:                 labelSpeed.Text = (position.Speed/1.15077945).ToString("0.00");
  10:             }
  11:          }
  12:      }
  13: }

Possibilities:

I think a more realistic UI would be a great improvement. And the ability to switch from miles to kilometers would be good too. If the odometer would track miles traveled that would be an awesome enhancement.

Download executable: mobileSpeedometer.cab

Download Source Code: mobileSpeedometer.zip

Feedback:

Want more? What else would you like to see?


Friday, June 20, 2008 12:53:00 AM (Eastern Standard Time, UTC-05:00)  #    Comments [2]  |  Trackback
Thursday, June 19, 2008

How'd we make it this far without a weather application? I must admit its hard to buy anything these days that doesn’t have a weather feature built in. But does everyone understand the basic of writing such an application? That’s what we will explore today.

 

image

Mobile Weather

UI is a little plain. I really think a weather application needs to have a top notch exciting UI, but we’ll keep it simple this time. We have an input section at the top that takes the user’s ZIP Code, and we have an output section at the bottom.

In the output section we have some basic factoids like current conditions and temperature. We also have a forecast for the next day showing date, description, with high and low temperature. And finally we have a graphic to add a little something to an otherwise drab application.

How did we mine this information. Basically I connected to a public weather RSS feed that takes zip code as an URL parameter, using an HttpWebRespone object. I then parsed out the data I need using regular expressions.

There are other ways of doing this type of thing, but I thought this would allow us to use a lot of neat Window Mobile technologies we haven’t explorer before.

Our friend the HttpWebResponse:

   1: private void RefreshData()
   2: {
   3:     string lcUrl = "http://weather.yahooapis.com/forecastrss?p=" + textBoxZipCode.Text.TrimEnd();
   4:  
   5:     // *** Establish the request 
   6:     HttpWebRequest loHttp = (HttpWebRequest)WebRequest.Create(lcUrl);
   7:  
   8:     // *** Set properties
   9:     loHttp.Timeout = 10000;     // 10 secs
  10:  
  11:     // *** Retrieve request info headers
  12:     HttpWebResponse loWebResponse = (HttpWebResponse)loHttp.GetResponse();
  13:  
  14:     Encoding enc = Encoding.GetEncoding(1252);  // Windows default Code Page
  15:  
  16:     StreamReader loResponseStream = new StreamReader(loWebResponse.GetResponseStream(), enc);
  17:  
  18:     string lcHtml = loResponseStream.ReadToEnd();
  19:  
  20:     RefreshScreen(lcHtml);
  21:  
  22:     loWebResponse.Close();
  23:     loResponseStream.Close();
  24: }

 

Last but not least the Regex object:

   1: string conditionsEx = @"<yweather:condition  text=""(?<desc>[^@]+)""  code=""(?<code>[^@]+)""  temp=""(?<temp>[^@]+)""  date=""(?<junk>[^@]+)"" ";
   2:  
   3: Regex regEx = new Regex(conditionsEx);
   4:  
   5: Match m = regEx.Match(input);
   6:  
   7: if(m.Success)
   8: {
   9:     desc = m.Groups["desc"].Value;
  10:     temp = m.Groups["temp"].Value;
  11: }

Possibilities:

The UI needs more polish, but it is useable. There is even more data in this RSS feed than I’m exposing so that is another way to expand on this project and make something awesome.

Download executable: mobileWeather.cab

Download Source Code: mobileWeather.zip

Feedback:

How could we make this application even better? Share your ideas with the community.


Thursday, June 19, 2008 1:59:00 AM (Eastern Standard Time, UTC-05:00)  #    Comments [0]  |  Trackback
Wednesday, June 18, 2008

Being a geek, I have a lot of geek friends. Being friends, we tend to eat lunch together. The only problem is sometimes we have a hard time deciding where to go to eat lunch. This invariably leads to the “Where do you wanna eat?”, “I dunno, where do you wanna eat go?”, “It doesn’t matter to me, you decide.” Well here is a simple solution to this daily dilemma:

 

image

Lunch-O-Matic

Our UI has just enough class to be exciting and interesting, yet simple enough not to cause us too much grief. Seek balance in all things. The concept: restaurant logos flash across the screen, eventually stopping on the chosen food establishment. The application is visual, which is appealing. The application is clear. The user can easily tell which restaurant is chosen by following the ginormous arrow. A light blue background give the app a little warm and the arrow adds character.

We have a folder called LunchLogos. Any png file found is the folder is added to an generic image list at the start of the program. When the user clicks Spin, the logos are randomly displayed on the screen for a random number of times before stopping on a chosen eatery.

If you don’t like a restaurant all you have to do is remove the logo from the folder. If you have a restaurant you like that isn’t in the list all you have to do is add the logo to the same folder, simple, simple.

Again for this application we used the RNGCryptoServiceProvider class to generate a statistically sound random number.

   1: private int GetRandomNumber(int minValue, int maxValue)
   2: {
   3:     // Use a 4-byte array to fill it with random bytes and convert it then
   4:     // to an integer value.
   5:     byte[] randomBytes = new byte[4];
   6:  
   7:     // Generate 4 random bytes.
   8:     RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
   9:     rng.GetBytes(randomBytes);
  10:  
  11:     // Convert 4 bytes into a 32-bit integer value.
  12:     int seed = (randomBytes[0] & 0x7f) << 24 |
  13:                 randomBytes[1] << 16 |
  14:                 randomBytes[2] << 8 |
  15:                 randomBytes[3];
  16:  
  17:     // Now, this is real randomization.
  18:     Random random = new Random(seed);
  19:  
  20:     return random.Next(minValue, maxValue);
  21: }

And we have created a simple randomize list function to mix things up a bit.

   1: public void RandomizeList(List<string> arrayList)
   2: {
   3:  
   4:     if (arrayList == null) { return; }
   5:     int count = arrayList.Count;
   6:     for (int i = 0; i < count; i++)
   7:     {
   8:         string tmp = arrayList[i];
   9:         arrayList.RemoveAt(i);
  10:         arrayList.Insert(GetRandomNumber(0, count), tmp);
  11:     }
  12: }

Last but not least, we use the Mod function to make sure we can loop around the list when picking images.

   1: private void Spin()
   2: {
   3:     int index1 = GetRandomNumber(0, logos.Count);
   4:     int index2 = (index1 + 1) % logos.Count;
   5:     int index3 = (index2 + 1) % logos.Count;
   6:  
   7:     pictureBoxTop.Image = logos[index1];
   8:     pictureBox.Image = logos[index2];
   9:     pictureBoxBottom.Image = logos[index3];
  10: }

Possibilities:

Well, I think it would be cool if there was a background sound to go along with the spin. I also think a UI for adding and deleting logos would be great. It would be nice to be able to assign weights to each restaurant, and to favor new choices over previously selected places.

Download executable: lunchomatic.cab

Download Source Code: lunchomatic.zip

Feedback:

How could we make this application even better? Share your ideas with the community.


Wednesday, June 18, 2008 12:11:00 AM (Eastern Standard Time, UTC-05:00)  #    Comments [0]  |  Trackback
Monday, June 16, 2008

I’ve had a lot of requests for SMS related applications. So today we will create a SMS logger application. This application will allow users to scroll through a listing of all the SMS / text messages they have received while the application has been running.

 

image

SMS Logger

This is a great application for a beginner to create. It has a very simple UI, the main component is the WebBrowser. The way we can have nicely formatted text easily.

The key piece of code here is the MessageRecieved event off of the SmsIntercepter object.

   1: private StringBuilder documentText = new StringBuilder();
   2: void SmsInterceptor_MessageReceived(object sender, MessageInterceptorEventArgs e)
   3: {
   4:     if (enableInterceptor == false)
   5:         return;
   6:  
   7:     // Cast to SmsMessage to access message body
   8:     // Not expecting to receive any non-SMS messages but use "as" to
   9:     // cast to be extra safe
  10:     SmsMessage newMessage = e.Message as SmsMessage;
  11:     if (newMessage != null)
  12:     {
  13:         documentText.AppendFormat(@"<b>Body:</b> {0}<br/>", newMessage.Body);
  14:         documentText.AppendFormat(@"<b>Name:</b> {0}<br/>", newMessage.From.Name);
  15:         documentText.AppendFormat(@"<b>Address:</b> {0}<br/>", newMessage.From.Address);
  16:         documentText.AppendFormat(@"<b>Last Modified:</b> {0}<br/>", newMessage.LastModified);
  17:         documentText.AppendFormat(@"<b>Received:</b> {0}<br/>", newMessage.Received);
  18:         documentText.Append(@"<br/>");
  19:  
  20:         webBrowser.DocumentText = documentText.ToString();
  21:     }
  22: }

We have a few actions the user do: Start, Stop, Clear, About, and Exit.

Possibilities:

This application logs incoming SMS messages, but it doesn’t do several thing that were requested from our reader. It doesn’t log outgoing messages. It doesn’t save to a text file. And it doesn’t clear out data from Outlook Mobile when the users runs SMS Logger.

I also think there is room to improve the UI. I think some small 16x16 pixel graphic files could really add some life to the application. Maybe one icon for incoming messages, and one for outgoing messages.

So who’s up to it? Anyone want to take this application to the next level? Just let me know.

 

Download executable: smsLogger.cab

Download Source Code: smsLogger.zip

Feedback:

So what possibilities do you see for this type of application? for business? for entertainment?


Monday, June 16, 2008 10:30:00 PM (Eastern Standard Time, UTC-05:00)  #    Comments [1]  |  Trackback

Today, is day 15 of my 30 Days of .NET challenge. That marks the 50% point, and we have 15 applications for 15 days. Thanks for your support!

And we have made it through another week. If you missed the week one recap here it is: 30 Days of .NET [Windows Mobile Applications] - Week One.

What’s your favorite?

 

image image image image
Rotate Me Mobile Tipper What is My IP? Mobile Signature

Lots of variety, everything from network utilities, to graphics, to humor, to SMS text messaging. Great ideas, guys!

 

image image image image_thumb14
Mobile Quiz Pocket Death Calculator Mobile SMS Contact What will be next?

 

Feedback:

Got an idea? Got some feedback? Share it? Thanks!


Monday, June 16, 2008 2:48:00 AM (Eastern Standard Time, UTC-05:00)  #    Comments [7]  |  Trackback

Today’s application is about possibilities. It’s a new area we will explore in our future applications. It’s important to learn how to development applications, but it is also important to learn what kind of applications you can develop. Your goal is always to reach just a little further, and grow from the experience.

 

The important thing here isn’t what this application does with these ideas, but what you could do with these ideas.

 

People can use SMS to send and receive information through text messages, but with the power of Windows Mobile it is easy for application to send and receive commands and data. There is a big movement for software to expose its features and functions to other programs. But image a world, that probably isn’t too far, where your mobile device has it’s own API that you and others can use to access its data and functions.

Where could this be useful? Well many companies need the ability to send “Alerts” of some kind to their workers. It is easy to use the Windows Mobile SMS API to have a custom written application that check for specially “tagged” SMS messages.

 

image

Mobile SMS Remote

SMS Remote is an application that could run on two or more Windows Mobile device and allow each of the phones run to support “commands” on the phones. For example, a user could get the date and time of another device running SMS Remote. Or the user could run a command to get the other phone’s current GPS location information. The possibilities are limitless. Both devices are both servers and both clients in other words a very simple peer-to-peer network using SMS technology. How cool is that?

What if sometimes we don’t want others to be able to run commands on our device remotely? First of all we could always exit the application. The application must be running in other to execute remote commands. Be I have also added an “Allow Remote Commands” feature.

How can we send SMS remote commands? Use the SMS command ComboBox and choose a command, and enter the remote device’s phone number. Then just click “Send”.

How can we tell what commands have been remotely run on our device? There is a received commands listing at the bottom the screen. It shows the phone number of the device that send the command, the time the command arrive, and which command was requested.

This is a rough prototype of an idea that has HUGE potential. Some point in the next ten years this concept will take off and become something along the lines of Mobile 2.0.

The trick to this application is using the very cooly named Windows Mobile 6.0 SDK MessageInterceptor class. We can use it to have any SMS that begins with “30days:” fire an event in our application that we will then handle. This is very, very, very simple for something so powerful. Use it!

   1: MessageInterceptor _smsInterceptor = null;
   2: private void LoadSmsIntercepter()
   3: {
   4:     _smsInterceptor = new MessageInterceptor(InterceptionAction.NotifyAndDelete);
   5:  
   6:     _smsInterceptor.MessageCondition =
   7:         new MessageCondition(MessageProperty.Subject,
   8:         MessagePropertyComparisonType.StartsWith, "30days:", true);
   9:     _smsInterceptor.MessageReceived += SmsInterceptor_MessageReceived;
  10: }

The rest is simple. Was the SMS a “command” or a “result”? If command we need to run and return a result. If result we need to act on or display to device user.

Possibilities:

I implemented the get date and time function, but not the GPS function. This would be a very useful addition to the application that I would love to say a reader did. Or how about a way to add Internet Explorer Mobile favorites? Or how about something more Web 2.0 like what song is currently playing.

Download executable: mobileSMSRemote.cab

Download Source Code: mobileSMSRemote.zip

Feedback:

So what possibilities do you see for this type of application? for business? for entertainment?


Monday, June 16, 2008 1:58:00 AM (Eastern Standard Time, UTC-05:00)  #    Comments [2]  |  Trackback
Sunday, June 15, 2008

Today one of my readers, Paul Diston, made the following request.

Hi,
I have another idea you might be interested in. I would like to be able to type in a single SMS message and then hit the send button which would then send the same message to all my contacts that have a mobile number specified.


Thanks
Paul Diston

The thing that I really liked about Paul’s suggestion is that is cover two very important mobile development topics: one is working with contacts stored in Outlook Mobile, and the other is working with SMS messaging.

image

image Mobile SMS Contact

I changed it a little bit from Paul’s original request. I decided to incorporate a filter into the application. This way you can send SMS messages to your personal contacts, or your business contacts. You could even create a custom category. I didn’t include an option to select contacts that do not have a category assigned to them. This would be a great modification for a reader to implement. Simply add a ‘<none>’ item to the list, and if that item is selected add any contact that doesn’t have a category.

I added a ListView so that users could see the contacts they were about to text message. Another great enhancement, would be the ability to modify this listing. Just a remove option would be a great addition in functionality.

One feature I added as a polishing touch, was the live character count feature. This feature lets users know how much more text they can send. And we have found another opportunity for improvement here. I limit the text to 160 characters, but if someone entered in more text we could send X number of text messages until the complete message was delivered.

Next with have our SMS Message TextBox where we can type the message we will send. Nothing special here, but I didn’t set a MaxLength of 160 characters.

At the bottom I exposed the RequestDeliveryReport property of the SmsMessage class. What ever the user picks here will be assigned to that property.

One feature that I really love about Windows Mobile programming, that especially came in useful for this application was the Cellular Emulator.

GetContacts Code:

   1: private List<Contact> GetContacts(string category)
   2: {
   3:     List<Contact> contacts = new List<Contact>();
   4:  
   5:     ContactCollection contactsCollection = outlookSession.Contacts.Items;
   6:  
   7:     foreach (Contact contact in contactsCollection)
   8:     {
   9:         if (contact.Categories.Contains(category))
  10:         {
  11:             contacts.Add(contact);
  12:         }
  13:     }
  14:  
  15:     return contacts;
  16: }

SendSMS Code:

   1: private void SendSMS()
   2: {
   3:     List<Contact> contacts = GetContacts(comboBoxCategories.SelectedItem.ToString());
   4:  
   5:     SmsMessage smsMessage = new SmsMessage();
   6:     //Set the message body.
   7:     smsMessage.Body = textBoxSMSMessage.Text;
   8:  
   9:     foreach (Contact contact in contacts)
  10:     {
  11:         string name = string.Format("{0} {1}", contact.FirstName, contact.LastName).Trim();
  12:         string address = contact.MobileTelephoneNumber;
  13:  
  14:         if (address.Length == 0) break;
  15:  
  16:         //Add recipients.
  17:         smsMessage.Body = textBoxSMSMessage.Text;
  18:         if (name.Length == 0)
  19:             smsMessage.To.Add(new Recipient(address));
  20:         else
  21:             smsMessage.To.Add(new Recipient(name, address));
  22:         smsMessage.RequestDeliveryReport = checkBoxRequestDeliveryReport.Checked;
  23:     }
  24:  
  25:     if(smsMessage.To.Count == 0) return;
  26:  
  27:     //Send the SMS message.
  28:     smsMessage.Send();
  29: }

Download executable: mobileSMSContact.cab

Download Source Code: mobileSMSContact.zip

Feedback

One thing I decided not to do with this application is spend any time on the UI. I wanted readers to see one application that was plain Jane vanilla. Consider what you could do to this application to make it appealing to end users. Share your ideas, and maybe I’ll do them, or even better try taking the code and making the changes yourself. If you do this for the application or any other I will link to back to you so everyone can “see” and “learn” for your efforts.


Sunday, June 15, 2008 2:10:00 AM (Eastern Standard Time, UTC-05:00)  #    Comments [2]  |  Trackback
Saturday, June 14, 2008

Let’s have some fun today. And do an application that is just for kicks. I had a really hard time coming up with a Friday the 13th themed mobile application. I finally thought of one: The Pocket Death Calculator. Yeah, it’s a bit crazy, but it’s good not to take yourself too seriously. There are lots of these Death Clocks on the Internet, here’s a famous one: The Death Clock.

 

image

image

Pocket Death Clock

This application is about how many lines of code you can write. It shows how a simple idea in a good looking package can really charm a lot of people. Most people enjoy a surprise, or something unexpected, something to break the day from being ordinary and routine. Sure you can write the next great mobile financial planner package, or you could write a quick “fun” app to put a smile on someone you know’s face.

The UI is really simple just a background image file, but it is a good looking background image file. And that is pretty much what is pulling off the application. I thought about putting glowing red eyes on a timer and having their visibility randomly change, but decided to leave it as an exercise for my readers. Try it you’ll be surprised how much it really sets off the application. And makes it stand out.

The death calculation engine is straight forward: we take the user’s age and gender and modify the average human life span appropriately. Then we subtract the users present age from their expected life span. Next we calculate the number of seconds in a year. We use our cryptographically strong random function to pick a random second in that year for the user to “die” on. Now we have our death date. It’s a simple matter to calculate the number of seconds the user has left. We put everything on the screen and update on a timer.

There you have it.

Possibilties:

Simple applications always have the best possibilities. We talked about adding glowing eyes. But you could also add random death quotes. You could also ask the user more questions and better guesstimate their death date. You could also “guesstimate” where and how they would die using data easily found on the Internet.

Always good to know you have less than a million seconds before you are going to die from a shark attack in Quebec. Plenty of time to pick up some shark repellent.

 

 

 

 

Download executable: pocketDeathClock.cab

Download Source Code: pocketDeathClock.zip

Feedback:

I think this is our first humorous application, not counting Mobile FX, what did you think of it? Would you like to see more of these types of applications, that are creative idea based, or more of the technically focused applications? I like to keep a good bit of variety to show all the possibilities, so I hope that is working for everyone.

If not, share your idea for tomorrows application.


Saturday, June 14, 2008 12:14:00 AM (Eastern Standard Time, UTC-05:00)  #    Comments [5]  |  Trackback
Friday, June 13, 2008

Today we are going to look at another classic goal in Mobile development, data collection. You might need it for a line of business application, for example a field service application where workers need to inspection equipment and fill out a questionnaire. Or you might need it in a mobile poll taker application. You could even use it in a trivia game. There are few applications actually that couldn’t take advantage of a question and answer system like the Mobile Quiz.

 

image

imageMobile Quiz

There is so much potential with this application. I hope you can see the concept and see the potential here. There are a world of possibilities here. Hopefully this application will help you get ever so slightly closer to realizing some of them.

The UI is a straight-forward and clean design, which was easy to make but should appeal to users. Everything is meant to be intuitive and self explanatory. Users should simple be able to look at the screen and get it.

The first screen is an quiz introduction form. All we have here is some eye candy, the name of the quiz, and some basic menu options: Start, About, and Exit.

After this the user is presented with the questions screen. This is the main meat of the application.

Questions are pulled from an XML file which could be retrieved from a remote server.

 

   1: <?xml version="1.0" encoding="utf-8" ?>
   2: <quiz name ="Family Guy Quiz">
   3:   <question>
   4:     <text>In what state do the Griffins live?</text>
   5:     <correct>2</correct>
   6:     <answer>Connecticuit</answer>
   7:     <answer>Rhode Island</answer>
   8:     <answer>Massachusetts</answer>
   9:     <answer>Deleware</answer>
  10:     <answer>South Carolina</answer>
  11:   </question>
  12:   <question>
  13:     <text>What television actor is the mayor of the town?</text>
  14:     <correct>1</correct>
  15:     <answer>Adam West</answer>
  16:     <answer>David Hasselhoff</answer>
  17:     <answer>Leonard Nimoy</answer>
  18:     <answer>William Shatner</answer>
  19:     <answer>Harrison Ford</answer>
  20:   </question>
  21:   <question>
  22:     <text>What is Cleveland's last name?</text>
  23:     <correct>1</correct>
  24:     <answer>Brown</answer>
  25:     <answer>Smith</answer>
  26:     <answer>Craft</answer>
  27:     <answer>Cub</answer>
  28:     <answer>Jones</answer>
  29:   </question>
  30:   <question>
  31:     <text>What is the name of Stewie's stuffed bear?</text>
  32:     <correct>3</correct>
  33:     <answer>Barry</answer>
  34:     <answer>Chris</answer>
  35:     <answer>Rubert</answer>
  36:     <answer>Edward</answer>
  37:     <answer>Paddy</answer>
  38:   </question>
  39:   <question>
  40:     <text>What is Quagmire's profession?</text>
  41:     <correct>4</correct>
  42:     <answer>Developer</answer>
  43:     <answer>Police Office</answer>
  44:     <answer>Barber</answer>
  45:     <answer>Pilot</answer>
  46:     <answer>Teacher</answer>
  47:   </question>
  48: </quiz>

 

It’s a snap to open the XML file and read in all of our data.

   1: DataSet dataSet = new DataSet();
   2: // read quiz data file
   3: dataSet.ReadXml(@"\Program Files\MobileQuiz\quiz.xml");

One thing that I decided was important was to avoid showing modal MessageBox dialogs often. Sick Instead I choose to use a label, place it at the top, set it’s background color to Info, and use it accordingly. This works out great and I think is a much better user experience. Data entry on a mobile device is a huge pain, and if you can take a dialog out of the equation that’s a good thing.

Download executable: mobileQuiz.cab

Download Source Code: mobileQuiz.zip

Feedback

There’s a lot here for a little effort, a couple hours, and there is a huge potential for this type of application. This would be a great project for someone to expand on and create something really special from. Consider it if you are looking for your first mobile project.


Friday, June 13, 2008 2:49:00 AM (Eastern Standard Time, UTC-05:00)  #    Comments [0]  |  Trackback
Thursday, June 12, 2008

image

You know sometime someone tells you about something, and you can tell there is a whole lot more to it than they are telling you about. Well, signature capture for Windows Mobile is one of those things. It’s really not bad today and you can do it in one sitting easily now. But there was a time, when if your life depending on it you might be able to get it right. At least we have managed code now. A few of us attempted to do this feat in embedded Visual Basic years ago and I’m surprised it didn’t cost us our sanity. Oh the humanity…

You could do it you just had to copy each color pixel by pixel and save it into a bitmap, and that was a challenge too. And GetPixel() had to be the slowest function call ever. It took at least a second. No way, you were going to give someone a full screen to put there signature.

That was then, this is now…

image

Mobile Signature

Office 2007 might have 2007 features in it. And it works for Office 2007, well to a point. But with Windows Mobile applications less is more. Don’t get me wrong I really do think Mobile Signature would make a great feature in a more complete application. But as far as the feature of taking a signature on a mobile device this is a great approach.

Also note that Mobile Signature could be easily adapted into a drawing application, and so on, especially for kids.

Let’s talk about UI first. Notice how much space is dedicated to taking the user’s signature. This is important; I’ve seen almost the reverse before and that just isn’t very usable. I took a little extra time and care to make sure all control had a black border around them,expect the black color square. It has a gray border.

One thing to note is a wanted the user to be able to tell what color they would be writing in without having to draw on the screen. This is accomplished by having the borders around the active color flash on and off. This is a great visual effect that was easy to implement with a timer. We track the currently active color in a form level variable, and on the timer tick event, which happens every 500 ms, we toggle the visibility of the border around the active color. Works great! Check it out!

The menu is another area that is simple but you can learn from it. Save is very important to us, so it is prominent and has it own hardware button that can cause it to occur. On the menu we have an option for clearing the screen, showing the about form, and exiting the application. But we also have a menu option to change the size of the line we are drawing with. It can be set from any of the following: 1 pixel, 3 pixels, 5 pixels.

The core of the application is the code that actually draws the lines on the screen. Here it is:

   1: private void pictureBox_MouseMove(object sender, MouseEventArgs e)
   2: {
   3:     if (pen.Color != signatureColor)
   4:         pen = new Pen(signatureColor);
   5:  
   6:     if (pen.Width != width)
   7:         pen.Width = width;
   8:  
   9:     x1 = x2;
  10:     y1 = y2;
  11:     x2 = e.X;
  12:     y2 = e.Y;
  13:  
  14:     if (x1 == -1 && y1 == -1)
  15:         return;
  16:  
  17:     pictureBoxSignature.CreateGraphics().DrawLine(pen, x1, y1, x2, y2);
  18: }

 

One area of code that is worth checking out is the code to save the bitmap of the signature. It’s pretty advanced and powerful.

   1: // P/Invoke declaration
   2: [DllImport("coredll.dll")]
   3: public static extern int BitBlt(IntPtr hdcDest, int nXDest, int nYDest, int nWidth, int nHeight, IntPtr hdcSrc, int nXSrc, int nYSrc, uint dwRop);
   4:  
   5: const int SRCCOPY = 0x00CC0020;
   6:  
   7: private void Save(string filename, Graphics gx, Rectangle rect)
   8: {
   9:     Bitmap bmp = new Bitmap(rect.Width, rect.Height);
  10:     // Create compatible graphics
  11:     Graphics gxComp = Graphics.FromImage(bmp);
  12:     // Blit the image data
  13:     BitBlt(gxComp.GetHdc(), 0, 0, rect.Width, rect.Height, gx.GetHdc(), rect.Left, rect.Top, SRCCOPY);
  14:     bmp.Save(filename, System.Drawing.Imaging.ImageFormat.Bmp);
  15:     // Cleanup
  16:     bmp.Dispose();
  17:     gxComp.Dispose();
  18: }

Everything else is pretty straight forward, but check it out and see what you think!

Download executable: mobileSignature.cab

Download Source Code: mobileSignature.zip

Feedback

So, how do you guys feel about line of business applications? Do you want more days that focus on line of business application topics? or less? Let me know! :D Tomorrow will be here before you know it.


Thursday, June 12, 2008 2:48:00 AM (Eastern Standard Time, UTC-05:00)  #    Comments [2]  |  Trackback
Wednesday, June 11, 2008

I mentioned to the group that I would post the Prize Picker application we wrote together on my blog as part of my 30 Days of .NET series. I think this was an awesome idea, and it looked like everyone really enjoyed themselves. Hopefully, a few of them will see this post and share their thoughts as well. It was very nice to have a hands on type presentation that everyone got to participate in together. And since only one person was “driving” we didn’t have to stop and fix a disconnected monitor. Ok, we did one time, but just one time. Open-mouthed 

Big thanks to everyone that came out and participated! Page Brooks, Donny Craft, Benton Little, , Jamey McElveen , Shawn Morris, and Thad Smith. It was a lot of fun!

 

PrizePicker

Prize Picker

There is probably someone out there who doesn’t think this is the best looking application ever. Well, you’re right! It’s not, but we didn’t really focus on that any until we had a fully functional application. At that point it was time to pick prizes for the lucky hopefuls that became winners at the event.

The only big item we didn’t implement, was an item that came up right at the end, we wanted to show the last winner in the area down at the bottom of the screen in big blog letters. And we wanted to rotate through remaining hopefuls and then finally pick a winner moving them to the winners table.

The application is a firm believer of the KISS principle. We did the entire application in about an hour and a half. And that is including some refactorings, and changes we made along the way. I’m pretty happy with the application, and will love it once we have the “Jackpot” style UI element added.

We added validation as we needed it, and decided to keep the applications logic in the UI, as hard as it was for us to do, to in this case to follow our KISS guidelines.

We have used RNGCryptoServiceProvider class already in the Pocket PasswordGen application on day six. This class makes sure that our random numbers are statistically random and not pretend watered down random.

   1: Byte[] randomBytes = new byte[4];