Why the Virtual Keyboard on the Microsoft Band doesn’t work with Android and iOS

Microsoft Band's Virtual Keyboard
Microsoft Band’s Virtual Keyboard (image from Microsoft)

Someone recently asked why the Microsoft Band Virtual Keyboard only works with Windows Phone 8.1.  I’ve been using mine with my Lumia Icon and didn’t realize that replying to a SMS message only partially works in Android and not at all for iOS.  While there doesn’t appear to be any documentation explain why the functionality is missing from some platforms, I’ve made a semi-educated guess for the reasons.

With the Band, you have three basic ways of replying to an incoming SMS message .  You can send a predefined text message called a “quick reply”.  You can define up to four quick reply messages.  Two are already set up for you: “I’ll call you back” and “I’m in a meeting”.  You can change those two or add two additional through the Microsoft Health App.   They are handy to use when you are in a meeting and need to send a quick response back without having to be that person who plays with his phone during a meeting.

The quick reply messages work with Android and Windows Phone.  In addition to the quick reply messages, with Windows Phone 8.1 you can use a virtual keyboard  or voice dictation on the Band.  Both of which require Windows Phone 8.1.

Voice dictation uses Cortana on Windows Phone 8.1.  You speak into the Band, the audio data is sent to the Phone and Cortana converts it to text and sends it back to the Band.  You can preview the text and then send the reply to the message.  Right now Cortana is Windows Phone 8.1 (and Windows 10) technology.  Microsoft has announced that they are porting it to Android and iOS, but it’s not available yet.  It’s also not known if the Cortana integration on Android and iOS will extend to working with the Band.

The Virtual Keyboard on the Band uses your phone to process your keypresses and swipes into text.  It uses the Word Flow technology in Windows Phone 8.1 to match the swipes to the appropriate word.  To support this on Android, Microsoft would need to port the Word Flow engine to Android.  It’s doable, but probably low on their backlog.

With iOS, we have a different story.  For an app, in this case the Microsoft Health app, to send an SMS message; it uses the SMS messaging API.  This is exposed through the MFMessageComposeViewController class.  The app composes the message using this class and then uses it to invoke the standard SMS composer view comes up.  The user can view or edit the message and then finally tap the send button to actually send the message.

By design, Apple does not allow apps to send SMS messages without the user confirming the message.  This is to prevent apps from spamming your contacts without your consent or knowledge.  There is a way to send messages without tapping anything on the phone, the Apple Watch supports that now.  At this time, that is handled by the Apple messaging app, I don’t think Apple has an API call for 3rd party devices to use.

It would be nice if Apple made a public API to allow wearable devices to send SMS messages, but I don’t see that happening any time soon.  Apple places a higher priority of preventing spam from being sent than allowing 3rd party device access.  Plus opening up directly sending a SMS would help a product that competes with the Apple Watch, and that’s not in Apple’s best interests.

Exporting SMS/MMS messages from Windows Phone 8

Windows Phone Message Backup as displayed in the Windows Store

An annoyance with Windows Phone 8 is the lack of any built in facility to export your text messages.  It’s easy to have the messages backed up, but you can only access them from your phone.

While reading a message thread in the Windows Phone Community forum, I came across a mention of an app for Windows 8 called “Windows Phone Message Backup”.  It’s from Tafidi, and it just works.  You can get it from this link.

You will need to have previously enabled the text message backup on your phone.  For more details on how to enable the message backup, go to the Back Up My Stuff page and scroll down to Text Messages section.

When you run the app, it asks you for the Microsoft account that you use your phone with.  If you have enabled two factor authentication (and you really should do that), create a new app password and use that.

Once it has authenticated under your account, it will download your message history.  This may take a few minutes.  After the messages are downloaded, they will be grouped by the other party in the message.

To export the messages, you will need to select the other party from the list and then right-click on the message thread.  That will open up a toolbar panel that will allow you to export the messages as text or as an image.

Right now for text, the  only text format is supported is ASCII text, but since that format is listed as a choice, I’m assuming that other formats will be a later release.

For image exports, you get a long PNG formatted image of the entire message thread, but without the images.  That’s kind of a big limitation.  You could make screenshots from the app itself, but you would be limited to what fits on the screen.  But that does allow you to capture the images.

So if you need to export SMS messages, this is pretty much the only game in town that works across the carriers.  Different wireless carriers may offer their own tools for accessing the text messages.  I use Verizon Wireless and they have a decent portal that allows you to access messages and also to send and receive them without going through the phone.

My MVP V-Conf session on localization for mobile apps is out

Two weeks ago I participated in the Microsoft Virtual Conference.  I did a session on cross platform localization for native apps using .NET.  It’s a continuation of the localization article that I did for CODE magazine 18 months ago.

The V-Conf was two days with 5 concurrent tracks running.  The US MVPs had IT, Developer, and Consumer tracks.  The Latin American MVPS had a combined track in Spanish.  The Brazilian MVPs had a track in Portuguese.  Each session had a presenter who was responsible for the content, plus a moderator who handled questions from the audience during the session.  Anyone could attend from the comfort of their home or office.  And it was free.

I had the great luck of having a Microsoft MVP and Xamarin Developer Evangelist, James Montemagno, as my moderator.  He did a great job and did it with the presenter’s equivalent of having one hand tied behind his back.  James was at the airport, waiting for a flight.  He used his phone as a hotspot for his laptop in a busy terminal.

I talked about the why and the how of localization.  I concentrated on how to use the Multilingual App Toolkit and Xamarin.Forms to quickly build and test multilingual apps.  I was able to use the new Android emulator that comes with Visual Studio 2015 to show the same app running side by side in different languages.  I thought about using Release Candidate of Visual Studio 2015, but I decided not to tempt the Demo Gods.  But I did want the new Android emulators that come with VS2015.

Tip:
To use the Visual Studio 2015 Android Emulator with Visual Studio 2013 (or any other Android development tool), you can run the following command line:

"%ProgramFiles%\Microsoft Emulator Manager\1.0\emulatormgr.exe" /sku Android

That will launch the Emulator manager and let you install different virtual Android device images and run them.

Visual Studio Emulator for Android
Visual Studio Emulator for Android

Like Genymotion and the Xamarin Android Player,  the Microsoft Android Emulator runs as a virtual x86 image.  This starts up and runs much faster the Android Emulator that comes with the Android SDK.  The Android Emulator emulates the phone down to the native chipset, which is usually ARM based.  It’s a high fidelity simulation, but it’s very slow.  Running x86 device images provide a much better experience for coding and testing.

The cool thing about the Microsoft Android Emulator is that it runs under Hyper-V, which means you can run it with the Windows Phone emulator.  Genymotion and the Xamarin Android Player run inside Virtual Box, which does not play well with Hyper-V.

For the V-Conf session, I wanted as many of the simulators running at the same time on the same screen.  This way the audience could see the same app running in multiple languages.  Unfortunately this precluded showing the iPhone simulator on the same screen that was being shared with the audience.  Since the demo app was written with Xamarin.Forms, the iOS version would have behaved very much like the Android and Windows Phone versions of the app.   The audience didn’t miss much without the iOS experience.

As a presenter, I would log into a Lync/Skype for Business session and when it was my turn, I would present my screen and do my presentation.   To keep the screen size at sane size for bandwidth, we were recommended to use a 1280×720  screen resolution.

I run two identical monitors on my home machine, at 1920×1080.  Knocking one of them down to 1280 was jarring.  The nice thing about using the Microsoft emulators is that they have a “Fit to Screen” button on the floating taskbar that comes with the emulator

The Fit to Screen button
The Fit to Screen button

Clicking the Fit to Screen button would scale the emulator to fit the height of the current screen resolution.  It also kept the emulators more or less equally sized on the screen.  I had enough room to run three emulators side by size.

Two instances of Android and one of Windows Phone.  All three running the same app.

I ran one instance of a 5″ Android phone with Android 5 (aka Lollipop), another 5″ Android with Android 4.4 (Kitkat), and 4.7″ Windows 8.1 phone image.  The Lollipop phone I left in English.  During the presentation, I added a German translation to the app and switched the Kikkat phone to German.   I forgot to reboot the phone after making the change, James reminded me about that step.

With Windows Phone, I left the phone in English, but showed how to use code to force a specific language at run-time.  This is very handy because if you don’t read the language you are testing, it can be awkward to reset the phone (especially Windows Phone) back to your native tongue.

Tip:
To avoid having to change the phone locale and rebooting, you can force a specific locale when the app starts up by setting the CurrentCulture and CurrentUICulture.

// Force the app to use a specific language
// In this case, French
Thread.CurrentThread.CurrentCulture 
    = new CultureInfo("fr-FR");

Thread.CurrentThread.CurrentUICulture 
    = Thread.CurrentThread.CurrentCulture;

Microsoft has posted the video from my session here.  The slide deck from the presentation should be posted up there soon.  In the meantime, I posted it up on Slideshare.net.  Some of the slides use animations to place images over the text and you may want to download the deck instead of viewing it online.

The source code for the sample project is up on GitHub.  It does require Xamarin.Forms.  If you don’t have Xamarin and would like to try the code, they do have a 30 day free trial.

This presentation was geared around Xamarin.Forms, but this is also applicable for “Classic” Xamarin.Android and Xamarin.iOS.  The Multilingual App Toolkit has support for Xamarin.Android and Xamarin.iOS and can create the platform native string resource files for Android and iOS.

In addition to my session, I was the moderator the Microsoft Band session presented by Christine Flora.  She had first slot of the day and had to deal with bandwidth problems that prevented the audience from seeing most of her presentation.   Christine showed how to connect to Project Online and display the current status to your Microsoft Band.  That’s actually a lot cooler than the apps currently available for the band that allow you to add a custom logo to the Band.


She did a great job and Microsoft will be posting an updated version of her presentation shortly.  If you follow Christine on the Twitters, she’ll let you know when the updated Band session will be available.

I had a lot of fun doing the session and I want to thank Microsoft for letting me be one of presenters.  I also want to thank James Montemagno for being my moderator.  If you are going to do a presentation that uses a lot of Xamarin technology, you can’t go wrong with having a Xamarin Developer Evangelist assisting you. Read James’s blog.  Go right now, I’ll wait.  I used his tips on how to bring some of the Material Design goodness to Android version of my demo Xamarin.Forms app.

Yes, you can judge a book it’s cover

A job rejection has gone viral over the last few days.  A college senior has complained that she was turned down for a job because of her attire.  Elizabeth Bentivegna is graduating from Oberlin College later this year with a degree in Computer Science.  She had contacted by a recruiter to apply for a position at OnShift.

By Bentivegna’s account, the interview went well and she expected to receive a job offer from OnShift. Instead the recruiter told her that she was rejected because she didn’t look “put together and professional” enough. Bentivegna had worn a black t-shirt, red skirt, black tights, and a black cardigan.

Bentivegna then vented about not getting the job on her Facebook account. Her opinion is that OnShift had made a mistake and she was being held to a different standard because she is female. She has a friend that works for Buzzfeed, Alanna Bennett, who tweeted a picture of Bentivegna’s Facebook post with the text “So my friend got rejected from a programming job today because she was wearing too much makeup.”

So my friend got rejected from a programming job today because she was wearing too much makeup.
So my friend got rejected from a programming job today because she was wearing too much makeup.

 

First, the recruiter never said anything about the makeup, just a comment about not looking professional enough.  There was probably more to this than just the clothing, but that was the information that the recruiter shared with Bentivegna.  While the developers may wear t-shirts and jeans at work, I doubt that’s what they wore to to their interview.

Let’s take a look at prospective employer.  OnShift offers workforce management software targeted for the health care industry. Their customers are retirement communities, nursing homes, assisted living facilities, home health agencies. They are doing line of business (LOB) apps for a conservative market.  if Bentivegna had done a little research, she would have looked at the OnShift Management Team page.

A third of the management team is female.  Each person on the team has a corporate head shot.  And they all dressed in professional business attire.  That should have been Bentivegna’s styling cue for her interview.

They say that you can’t judge a  book by it’s cover.  Wrong, you do judge a book by it’s cover.  That’s why they have covers in the first place.  For a job interview, you are selling your self. You want to use every tool at your disposal and that includes your attire.

If you are in the video game industry, then it’s appropriate or even expected to show up in jeans and t-shirt.  Just about everywhere else, it’s professional business attire.  It doesn’t matter if you like those rules or not, it’s how the game works.

Without knowing any of the details, but having been on both sides of the interview, I have a pretty good guess of what could of happened.  Bentivegna may have had a good technical interview.  But perhaps she didn’t click with the development or management teams on a personal level.  That is actually much more important that the technical skills.  A company can train a new developer on their tool stack, that’s easy.  Bu they can’t fix a personality that doesn’t mesh with the team.

It’s also possible that that company had interviewed multiple candidates and found someone that was a better fit.  Which is actually the official statement from OnShift.

Interviewing is a learned skill and Bentivegna was new at this.  In all fairness to Elizabeth Bentivegna, the recruiter should have prepared her for the interview and that includes discussing her choice of clothing.  When you make a mistake, you try to learn from that mistake and move on.  She was lucky to get some feedback for not getting the job.  Usually, you just hear that the employer went with another candidate.  Afterwards, the recruiter did suggest that Bentivegna purchase clothes for future interviews.

Michael K. McIntyre’s article on cleveland.com has an interesting quote from Bentivegna:

“I don’t see how my outfit could have been judged unprofessional, but I also think it’s silly that someone who is perfectly qualified and skilled and wants the job still can’t do it based on some arbitrary criteria,” she said. “Everyone has a different definition of what it means to look professional. I don’t think a male person would have had the same problem getting a job as I would.”

Elizabeth Bentivegna completely missed the lesson.  What a 21 year senior viewed as appropriate is not going to be the same as what the person with 30+ years of experience who interviewed her would viewed as appropriate.

You dress up for interviews.  You want the employer to know that you are taking the interview seriously.  It shows that you have attention to detail and that you are showing respect to people conducting the interview process.  Once you are on-board, you can follow the accepted dress code for the office, but until then you dress for success.

Publicly slamming the prospective employer was a dumb move. There is an expression that I heard once from a HR manager, “Sour Grapes equals Bad Apples”.    Her friend Bennett didn’t help her by sharing it with the world.  Bentivegna has demonstrated that she does not yet have the skills to handle rejection.  When she applies elsewhere, this incident is going to be the first thing that an employer is going to see.  That’s unfortunate, on paper she seems like a bright and capable candidate for an entry level web developer position.

Trying to get Apple Testflight to send new build notifications

I used TestFlight 18 months ago when I finished our first iOS app.  It worked great.  It was a stand alone service that allowed you to beta test your apps before submitting them to the Apple App Store.

Then Apple bought the Testflight company and it works not so great.

The latest hitch is that it doesn’t generate update notices to testers when a new build is uploaded to iTunes Connect.  As near as I can tell, you have edit the “What to Test” field in the app record in iTunes Connect and then save those changes.

Once you do that, the email invitations go right out.  This is not documented by Apple.  I did it mentioned on Stack Overflow,  If this is a required field for the workflow, it should be documented as such.  It’s just common sense.

Apple violated some basic rules when they acquired Testflight:

  • If it’s not broken, don’t fix it.
  • Don’t make me think.

Registration is now open for the 2015 Microsoft MVP Virtual Conference.

2015 Microsoft MVP Virtual Conference
2015 Microsoft MVP Virtual Conference

I’ll presenting at the 2015 Microsoft MVP Virtual Conference.  The MVP V-Conf is a new 2-day event presented by MVPs from the Americas’ region.  It’s a virtual conference and it’s free.

The theme of the inaugural conference is “The Power of Community” where we MVPs will share our technical skills with our technical community.  Our sessions will be interactive, you will get to ask questions or offer comments via a moderated live chat.

There will IT Pro, Developer, and Consumer tracks, with sessions available in Spanish (Latin America MVPs) and Portuguese (Brazilian MVPs).  The keynot address will be delivered by Steven Guggenheimer,  Corporate Vice President of the Developer eXperience (DX) group at Microsoft.

Registration is open now and please visit the V-Conf site for more information and registration information.

The first US MVP Open Days was a success

Last week I attended the first US MVP Open Days.  It was held at the Microsoft Technology Center in Malvern, PA.  It was a 2+ day conference for US Microsoft MVPs.  Other countries have been holding their own MVP Days, it was time for us to have one.

People finding their seats, just before the start of the opening session

It was two days of networking and attending presentations.  Some presentations were by MVPs, the other were by Microsoft staff.  A few of the topics were NDA, but many of the topics were about improving the experience of being an MVP and how to best leverage Microsoft resources.

Doug Ware with a session on Office365

I came to this session knowing almost no one, I left with many new friends and colleagues.   I’ve now attended two of the Microsoft MVP Summits, where you are with MVPs from all over the world.   The Summit is great, but you end up spending most of your time with MVPs that are in your same group.

This is was nice and cozy and I was able to interact with other MVPs from different groups.  People who I usually do not get to interact with.  That was very nice, worth the trip down to PA just for that experience.

We got to celebrate Steven Murawski’s (Powershell MVP) in suitable style:

You either get it or you don’t.

In addition to full group sessions, we broke up into smaller focus groups.  I attended one on running user groups and code camps that was led by Bill Wolff.  Bill runs the very successful Philly .NET user group and he shared his tips on how to run a user group and the growing pains his group went through with camp camps

Bill Wolff showing us the secret magic for getting big sponsors

I was in Windows Insiders session that was run by Jeremiah Marble (Windows Marketing) and Tyler Ahn,   We talked about what could help the MVPs could participate in the Windows 10 experience.

The Windows Insiders planning sessions.  Random arm courtesy of Ken Tucker.

We also had time to do some group photos…

MVPs and Staff

We ended the conference with plans to continue the conversations and to make plans for future Open Days.  I want to thank Rowina Branch, Esther Lee, and Fernanda Saraiva, their staff, and the MVPs that helped put this conference together.

As an added bonus, Brian Prince gave a sticker to fix my Macbook…

It’s a ninja cat riding a firebreathing unicorn. This should be the new logo for Microsoft. Click on the image to order one.

A little late to the Band Party

My Band with some decoration for the upcoming US MVP Open Days

My Microsoft Band arrived last week. I had first tried one out last November at a Microsoft Store and it felt like a handcuff. It turned out I was indeed holding it wrong. I put it on with the face on the top of my wrist, but it’s really designed so that the face of the band is on the inside of the wrist. When I wear as an “innie”, I don’t really notice that I’m wearing anything.

At work, I check the number of steps that it was recorded.  It’s a motivational tool for me to get up and walk around the office.  I hate running, but I’m looking forward to riding my bike in warmer weather and having it record my rides.

The other thing that I am looking forward to doing is to write some apps that will work with the Band.  Microsoft has released a preview version of an SDK that will let you write apps on Windows Phone, Android, and even iOS that can read the sensors on the Band and send notifications back to the band.  Xamarin has already released a Xamarin port of that SDK for iOS and Android.

Right now the SDK is limited to apps that running in the foreground, it does not yet support accessing the Band from a background app process.  That will initially limit the types of 3rd party apps that can be written for the Band.  But I’m confident that will be addressed in a later release.

I was able to use a custom background image and send it to the Band with the app Pimp My Band.  I’ll be attending the first US MVP Open Days later this week and it makes for a nice touch to show the MVP logo.

The coolest tool that you are not yet using (Xamarin edition)

Have you played with Xamarin Sketches yet?  Sketches was announced at Evolve back in October and is available in Xamarin Studio on OS X.  It gives you a real time coding environment and lets you interactively try code out without having to go through a code/compile/deploy cycle.

I was asked by a co-worker on how to display a glyph in a button on iOS to indicate that a popup list was available.  I wanted to display an upside down caret, a triangle if you will, as part of the caption to a button.   Basically, I wanted the text to look more or less like this

Happy ▼

And thanks to Unicode, we have that symbol available to us.  Before telling my colleague to just slap a character to the end of the button caption, I wanted to test for myself that it would display correctly on an iPhone.

Normally, I would just create a new singleview iPhone project and slap a label on it.  I would then fire up the simulator and see how it looked.   That way works, but today I decided to take a shortcut and try Xamarin Sketches.

Xamarin Sketches lets you type in code and it compiles and runs it as you type.  It provides an isolated sandbox to try out some code and basically fool around before you put that code into a project.

It’s similar to Xcode Playground, except being Xamarin, it does cross-platform.  You can interactively test code for iOS and Android,   You can’t do everything in Sketch, you can’t create classes or use anonymous types.

For what I needed to try, Sketches would work just fine.  I created a new Sketch and set the platform to iOS and the toolkit to UIKit.  It can do Xamarin.Forms, but in this case I wanted to test for Xamarin.iOS code.

I created a string variable with some text and included the unicode escape sequence “\u25BE”.  That is code for something called “BLACK DOWN-POINTING TRIANGLE”.  I then created a UILabel and set the text to my string variable.  That was enough to generate the proof of concept that I needed:

Xamarin Sketches (click the picture to embiggen it)

This code was extremely simple, but it was all I needed to verify that the unicode sequence would work correctly.  I was able to do that and help out a co-worker without getting out of the cod that I was working on.

You can do more complicated things in Sketches.  During the Evolve Keynote, Miguel de Icaza wrote a simple little iOS game in Sketches:

And then did a simple Xamarin.Forms apps: 

This only works with Xamarin Studio on OS X, it’s not available in Xamrin Studio for Windows or with the Visual Studio Plugin.  That’s not really a roadblock for me, if you are doing any iOS work, you pretty much have to have access to a Mac.  If you are doing iOS work with Xamarin, you are missing out on a handy tool if you are not using Sketches.

Taking care of a pet peeve with the Xamarin Build Host

I write code in Windows with Visual Studio, but parts of it compile and debug on OS X.  I’m doing mobile (Android, iOS, and Windows) development with Xamarin and the iOS part needs to be compiled on OS X.  Xamarin provides an app called the Xamarin Build Host that runs on OS X and allows for their tools in Visual Studio to communicate with the tools on OS X.

The hardest part with getting that to work is having the Xamarin plugin in Visual Studio make the connection to the Xamarin Build Host.  Xamarin uses Apple’s Bonjour services to identify remote devices on the network.  It works great when it works.  When it doesn’t work, you can specify the IP address of the OS X box and the plugin will connect to Build Host in that way.

As someone wiser than me once said, “Xamarin needs to display the local IP address(es) on the Xamarin Build Host window “. Bonjour doesn’t work on the corporate network at work.  Between my Windows PC being on an Ethernet connection and my Macbook Pro on Wi-Fi, there are enough disturbances in the Space-Time Continuum to keep Bonjour from reliably letting Visual Studio from seeing my copy of the Xamarin Build Host.  Connecting via IP address is the way I have to set the connection.  Which works, until the IP address changes.

My IP address can change depending on the favor of the Wi-Fi gods.  I wanted a quick way of checking the current IP address of my Macbook.  One of my co-workers suggested using GeekTool.  GeekTool is a utility that can display all sorts of useful information via scripts.

I found a nice IP address script in the github account of Jacob Salmela.  I made some changes to have the color match my current desktop, but it’s mostly based on Jacob’s code.  I have it set that GeekTool will run the script every 10 minutes.  It will display the IP information on the desktop like this:

The SSID is displayed, along with the Wi-Fi and Ethernet IP addresses.  Very handy and gives me the same kind of information that I can get on Windows with the wonderful BGInfo tool from SysInternals.

A work in progress

%d bloggers like this: