Sunday, November 29, 2009

How customer service SHOULD work.

I have my own opinions on how customer service should be done. When I previously worked in the service industry I applied my ideals to great success. However, it the rest of the industry seems to have the opposite ideas. So when I do find customer service that treats me with respect as a customer and not a walking checkbook, I'm always pleasantly surprised.

This is how NOT to do it:
Pretty much since the first day I took my iPhone home I had problems with reception. I was far-ish from a tower and the signal didn't penetrate into the finished basement that served as my room. When I moved to my new apartment in Norwood, MA, I had even WORSE reception. I was told by AT&T customer service this was because I was barely at the maximum range of the nearest tower. I was also told there was nothing I could do but continue to pay them for a service I wasn't receiving and hope that eventually they built a tower closer to me. But he couldn't tell me when or where the next group of towers was going to be. When I left AT&T because I wasn't getting any service, cellular or customer, I was charged a very large early-cancellation fee. While I fully admit that I canceled early, I contend that the lack of reception was a valid reason. When I confronted them regarding the fee they claimed there was nothing that could be done, and refused to consider the validity of my reason for dropping them. When I finally got them to agree to think about dropping the charge they told me they'd pass the request to the appeals department which would contact me within a week. It's been maybe 2.5 months and I haven't heard back from them. This tale is so filled fail, it actually makes me sad. Not like Bambi's Mom dying, but still pretty depressing.

On the other hand, I had the same problem with my Sprint phone since I got it. Very poor reception. Pretty much had to leave the apartment to use the phone. However, when I called their customer service I was offered an option to remedy the situation almost immediately. I was offered a device that's effectively a CDMA mini-tower. Since I was using it to upgrade from NO reception, not just poor reception, I would be charged half price for this device and I wouldn't have to pay the monthly fee for using the device. 2 months later when I examined my bill, I had been charged full price for the device and had usage fees for it. I immediately used online chat to confront them about the charges. The Sprint rep took maybe 5 minutes to review my file and then told me "Yup, you're right! Our bad!" And instantly removed the charges. There was no escalation, no hassel, no confrontation. When I got done with them, I was grateful for the assistance and actually happy about my choice of wireless carrier. I was so ecstatic about the fact they didn't try to bend me over and take all my money, I didn't even attempt to have my late payment charges removed. I'm left with the impression that THIS is how customer service is done.

So, congrats Sprint for getting something so simple right, when everyone else is hell bent on getting it wrong in the hope of making a quick buck by wringing your customers for money you don't deserve.

Friday, November 6, 2009

Mojo Rising: AutoFocusing on Dialogs

While I have every confidence the documented controller.setInitialFocusedElement() method will work during scene pushes, the story is somewhat different if you only showDialog(). I'm currently adding the final touches to my first complete Palm Pre application, in preparation for a postmortem blog post on developing with Mojo.
One of those final touches was automatically focusing on the text input widget when the dialog was shown. This simple thing took me over 2 hours to figure out and required reading through the actual framework code provided by Palm.
For whatever reason some methods of the scene controller aren't fired on showDialog() like they are on pushScene(). Might track down more on this later.
For now, to get Mojo to automatically focus on an element when a dialog is shown, do this:

1. When creating your view, add a tabindex="0" to the div which will become the widget. Or use the Mojo.View.makeFocusable() method, which currently does the same thing.
2. In the Assistant object you passed to the showDialog() method as the "assistant" property, add the following line of code to the activate() method:

Alternatively you could just call:
However, the advanceFocus() method of the scene controller object is annotated as private so using it is likely not the best practice. There also might be a better way to get the sceneElement, but at the time of this posting I am far too tired to look it up.

More Mojo Rising coming soon, folks.