Friday, August 17, 2012

Previously on Desk Clock Plus...

It's been a month and a half since the last post.  Work and life in general has had me running like crazy with little time (or motivation) to work on the clock program let alone update the blog.  Since the last post on July 2, here's what's changed:

  • A number of smallish bug fixes that came up from any number of reporting methods (see: How to get a bug fixed.)
  • A quick hot fix because one of things I tried didn't work... 
  • Two new features:
    • Orientation Lock
    • Static background color
  • Caught a potential NULL value
  • Fixed a display bug for 100+ degree days
That brings us up to today's minor update which is just adding 1 minute to the screen saver time out.  I promised this to a user back in December, but I forgot about it.  Sorry!

I have been working on Desk Clock Plus when I can since the last post, but I haven't gotten anywhere really.  The game plan is to break the application up from one big project into a number of smaller libraries and one execution project.  This will then allow me to swap parts of the application out on a version by version basis. The real push for this is the Alarm code which is still based off the 2.2.  I had to maintain that version of code as it pretty much worked for all the different versions of Android.  Google made a major improvement for 2.3 which I'm not using.  The goal is to build a legacy version of the alarm and then other versions for 3.x versions and for 4.x versions.  Libraries are key to keeping all that code manageable by re-using all the common code among 3 different versions.  The problem is the code is so interlaced that can't quite get the code split up correct to avoid circular references (ie two libraries that reference each other, which leads to the chicken vs the egg problem). 

Earlier this week, I came to the conclusion that the on-the-fly design method really wasn't working (there's a big surprise) and I'm going to have to sit down with some design tools and figure out how I can break up the application that works for now and should work for future enchantments.

Monday, July 2, 2012

Hold on tight...

The updates might be a little fast and frequent for the next week.  I figured that I would spend some time reviewing the stack traces that have been sent in (I was up to about 15 issues).  Some of them were odd little things that only happened once, but still required some extra checks to make sure it didn't happen again.  I did however make a couple minor fixes to the stuff I released last week that caused some users to get an index out of bounds error.

I still have about 10 issues that need to be looked at, but as long as nothing critical comes in overnight, I'll probably hold off as long as I can before pushing the next set of bug fixes out.

Friday, June 29, 2012

Long time coming...

The last post to this blog was made on April 10th and the last update to the app was probably around that time as well.  That's almost three months... and you would think that after that amount of time I would have some crazy new enhancement ready to roll out.  Sadly, I don't.  After the last update, I started into looking at a weather extension and I think I have a plan for that, but then my 9-5 job got real crazy and home life got crazy.  I also got an email from a user who couldn't configure the docks, so I started into a redesign of the save / load mechanism for the custom docks.  The problem was that I lost motivation to work on this during my lunch break, so things started moving very slowly.

That started to change a couple weeks ago... with Verizon's move from the unlimited data plans.  My wife and I replaced our 2 1/2 year old OG Droids were replaced by shiny new Samsung Nexus' (Nexi?).  That kind of got me moving again as developing on the new phone is a dream compared to the OG Droid.  Then as it seems almost always happens I got a couple emails about the dock configuration issue.  What was nice was that one of the user's said that the problem started after his Razr was updated to Ice Cream Sandwich.  Quick emails to the other users and it seems that they were all on version 3.2 or higher.    I was able to confirm the issue on my new phone as well.  Fortunately, I was about 75% done with a rewrite of the dock extension and I was able to finish it up and send out a Beta to the users who has emailed me.

I made some other minor adjustments and that brings me up to where we are now.  Version was just pushed out the market a little while ago with a better way for me to handle saving the dock configuration (that also works for ICS) and a small tweak to how I try to get the music apps, based off this article from Android ER.

I do feel a little motivated to work on Desk Clock Plus more after diving back into get this last bug fixed, so hopefully I'll be able continue to be motivated and get going on the other extensions that I've been thinking about since I started on the Desk Clock Plus project about a year and half ago.

Thank you all for your support and patience between updates.

Tuesday, April 10, 2012

How to get a bug fixed...

I've been meaning to do a post like this for a little while and with the last update, this seems to be a good time.

If something happens inside the app that causes it to crash, you'll probably see a window like this:

The important thing to do is hit that "Report" button.  I think that a lot of users don't even consider that as think it probably goes off to Google and into a list of a million other reports never to be read.  That certainly is the case for the Microsoft windows version of this screen.  However with Android, these reports come to developer and can be seen in the development console:

The 4 that I have outstanding are minor and happen infrequently, I've left them as "New" so I don't forget about them.  Each of the reports contain a stack trace (what functions were called before the application crashed).  For example, the bug that was fixed for Monday here's part of the stack trace:

Even if you don't understand everything (I don't always either), the important pieces are:
  • The app version
  • When it happened
  • How often it happens
  • What happens (a null exception in this case)
  • Where it happens (class name, file and most importantly line number)
The other bit of information that comes along is provided by the user.  When you tap the Report button you're given a chance to include a note of what you were doing (you could also include beer suggestions or your thoughts on Hockey or Soccer teams).  These notes are optional and not nessacary, but the user who sent in this report also sent a good note on what they were doing.
attempted long press set action on second dock of 4th icon to Music App
This defiantly helps me re-create the bug, but wasn't as important in this case.  Looking at the code I realized what had happened on line 512.  I had a check to make sure that I wasn't going to go out of bounds on my list of buttons and if something caused the buttons to go out of bounds, I cleared everything, displayed a toast message and reloaded the list of buttons.  As far as I can tell that's what happened to this user and instead of exiting when the reload was called it continued on (I missed an exit call).  Which then caused the null error.  The fix for this was very simply to add the exit call.

Hopefully this gives a little insight on how things work behind the curtain.

Tuesday, April 3, 2012

It's been rough...

Since March 13, I've had make a number of releases, sadly only one was a new feature, so just to make a quick refresher of what's been fixed:

  • -- Brought a fix for the application not launching when it was not in a dock (the details were in the last post)
  • -- This was the release of the tablet mode feature (details also in the last post).
  • -- A number of code "fixes"
    • I spent some time with the theme down loader.  This is a good example of me not knowing what I was doing when I wrote it (not that I completely know what I'm doing now).  
      • I moved some code out into threads to avoid Application Not Responding reports 
      • I made some changes to how the dialogs were handled
      • I also localized some strings (I am working on getting everything localized)
    • I also got a report of an infinite spinning dialog when loading the album list which lead me to redo how I did the dialogs for the preference window (making things uniform with the theme down loader)
    • I also fixed the dialogs with slide show (another source of crash logs)
  • -- My changes to the preferences caused a problem with the color picker which resulted in quick release.
  • -- Fixed a problem with the themes loading incorrectly.  Which was pretty much there since the release of the tablet mode release.  The problem (for non scrolling dock users) would cause an icon to be loaded into the dock background instead of it's proper place.  The problem was just some really hard to read code and not being able to flush out all the situations where to use the tablet mode dock background vs the regular dock background.  There were some misorginized parentheses as well.
That should bring us to where we are now... What looks to be a pretty stable release that I can start to build on again.  The stabilization of the code shows in the stats that Google provides me.  Since the release of version I've gained about 100 users in 5 days, and previous to that the amount of active installs stayed pretty level and looking back to the releases that had issues, there were points that I lost users.

I am hopefully going to start on something new here soon and that and that will include two other minor fixes.  One of which is upgrading the PayPal SDK.  It's very frustrating to get error logs and they are related to some random issue with the PayPal code that I don't have control over.

Tuesday, March 20, 2012

Hello IT... Yes, the programmer messed up.

I've been meaning to post this for a week now (wow, time flies when work kicks your ass).  The problem looks to have been due to a change in the launch app when undocked feature that was added for the scrolling dock extension.  It basically boiled down to not encasing things correctly in curly braces {}.  I didn't catch it because I didn't test the app outside the dock (yes, I know bad programmer!).  The app launched and it checked the state of the device to see if it was in the dock.  When the answer was no I check to see if if was launched from the dock.  When the answer to that is no, it shouldn't do anything, but the missing curly braces caused it to exit.  When you do VB .NET for a living, those little things will get you when you're not used to it.

Now for a bit of good news, I finished (what I think) is the last new feature for the scrolling dock.  I'm happy to introduce: Tablet Mode.

Screen shot provided by the super awesome Aussie commenter Omniwolf.  I will be happy to purchase him a beer (or any other beverage of his choice) if I ever travel there!

The Tablet Mode will extend the dock the entire width of the screen and provide a smooth continuous (instead of five icons at a time) listing of your applications.  Tablet mode will only display the applications and actions that you have configured (ie you will not see a blank plus icon).  So, if you only have seven buttons configured, you will only see those seven buttons repeated.  Currently, there is no long press menu when you are in Tablet Mode, as I'm not sure it would work well in this case.  If you are using a theme, you may want to go back and re-download the theme to pick up the tablet dock background image (if applicable to the theme).

The last note about all of this, when I released the hot fix for the app closing issue, I had all of the Tablet Mode code in place but hidden from activation.  I started to get a bunch of error logs in due to some of the Tablet Mode changes, but by the time I realized that the code had changed to the point where I couldn't exactly pin point the issue.  I think that I have them fixed or trapped, but I'm not 100% sure, so if you have problems with the app force closing or if tablet mode just doesn't turn on for you, please let me know.  If I get an error log via the market with the latest version I'll be able to track it down and get it fixed.

What's next?  I'm going to go into maintenance mode for a little while.  I have a couple of minor bug reports that I need to look into.  The Theme Downloader sucks and needs to be looked at.  After that, I'm going to work on the advanced weather add-on.

Monday, March 12, 2012

Hello IT...

While I do prefer that user's email me with issues, I do keep an eye on the comments for bugs and feature requests.  About two weeks ago this was posted:
Not working getting error "Update Location…"
I really didn't think too much about it as there wasn't much to think about (due to the lack of information) other than the XML string issue.  Although later that week I got another similar comment:
No longer works "Updating location" then won't open :( ... Droid Bionic
This started to raise some red flags.  I even got an email from a user who had helped with with issues previously asking about known issues.  I checked the error logs and  there was nothing... I couldn't think of what I would have changed that would cause any kind of problem like this.  Then on Saturday I understood exactly what both of these users were talking about.  I plugged my phone it to the wall outlet and turned on Desk Clock Plus manually.  After touching the icon, nothing happened and then I got the toast message "Updating location..." and then Forced Closed.  I tried it again and still nothing... I pulled a magnet off the fridge and found the magnetic dock switch (which worked).  I tried to think of what was wrong and what I could do and I thought rolling back to version 18.  After some WTF moments, I drew on my years of IT support and all of my learning from my advanced technical degrees.  I turned the phone off and on again...

Yes, that did resolve the problem.  What burns me though, is that it did fix it.  I was under the impression that things like this shouldn't happen in the *NIX environment (Android is based on the Linux kernel and keep in mind I'm not a Linux/UNIX guy).  The only thing I can think of is that the SD card was in some odd state or something as I know that other users have had issues with the themes not working.

Wednesday, February 29, 2012

Latest Update*

There are two new features and one bug fix with the current update:

The fix ended up being a minor one,  I was getting the state of the ringer when the device was added to the dock, but not restoring it when the device was removed from the docked.  So, if the phone was silent when it entered the dock, I would set the ringer state to 'normal'.  Not a catastrophe, but an annoyance.

The first new feature is for all users.  The last update I put in the first feature request from Martina for a one minute background update.  Her next request was for an alternate text color as some of her images are of snow and the white text for those images were being lost.  I did a little research and came up with a way to get the average pixel color and if it's whiter than the threshold level then it will use the alternate color (black by default).    You can set a custom alternate color and this is only in effect when the backgrounds are rotating.

The second new feature is for the scrolling dock to launch an app when un-docked.  When my Moto Droid gets retired from every day use (which will hopefully be soon), its next job is going to be a WiFi remote control for my Media PC which is running XBMC.  The idea is that the phone will run Desk Clock Plus and keep charged in the dock.  When it's time to kick back and relax with some TV, grab the phone from the dock and have it jump straight into the Official XBMC Remote.  I'm sure there's other uses, but that's what I have in mind for me.

Next up... tablet dock mode...

*  I try to be cleaver with the most post titles, but my brain is on fried from work and I couldn't come up with anything.  Possibilities included:

  • Steven King's Dark Tower as this is version number 19.
  • Along that line make a reference to this guy.  HWTL!
  • Or a reference to leap year.

Thursday, February 16, 2012

마스터 (Eighteen)

It's nice when people help out... much like Johannes did for German,  Jonathan volunteered to review the Korean strings.  Hopefully that will help him and the other 45 people that are using my app in Korean.  

Besides that, a minor fix to the night clock that might have been causing it to force close when dimming.  Also, Martina from Munich requested a one minute update on the background image.  I think that it's a little short, but as it was a very simple change I added it in.

I'm also hoping that this update might fix Don and Scott's docking issue (even though there was no change).  

I'm still looking into the alarm issues and I have at least one more thing to look at for omniwolf (Sorry to leave you hanging mate!)

Tuesday, February 7, 2012

A cause for alarm

First, a little note about the update from Friday.  There was a small fix on the preference screen where I was trying update the GUI from a background thread (that's a no-no).  The other fix was that I sat down last week and wrote my own translation app using a combination of .NET, LINQ and Microsoft Translation.  Much like Desk Clock Plus, it was me writing up something to fill my need, so hopefully this will keep all the strings in sync with all the different languages.

Next, Scott left the following comment:
Worked great before the last update Doesn't open automatically when docked anymore. Have to manually open it now. Also, the alarm turns off after every update.
Thankfully he (or someone else named Scott) followed up with an email.  I think his docking issue is something at his end as nothing with that has changed with that ever.  (Update) I got another email from someone else who said that there was an update for the same device (Galaxy S) and after that he was having docking issues.

The reason point of this post is the side bit of information that Scott tossed in about the the alarm turns off after every update.  This was actually a really big thing to me... I had had another user in the comments state:
Dont rely on alsrm The clock is nice BUT DONT RELY ON THE ALARM. It only goes off about a quarter of the time.
That comment was made right around the time that version came out and there was a signification amount of code churn and updates being pushed.  If something is happening with the set alarms after every update then this comment makes a lot of sense.  I don't use the alarm feature of my application very often as I use it at my desk at work (hence the name Desk Clock Plus).  So, I've never set a recurring alarm and therefore never had a recurring alarm set when the application is updated.  As I said when Version 1.0 was released, the Alarm code was taken straight from the Google Source and honestly, I never took the time to review it / understand it.  I think my other two scrolling dock enhancements will have to wait until after this gets taken care of...

Friday, January 27, 2012

I'm waiting to hear back...

The last update fixes two issues, the first I realized there was a problem yesterday and I mentioned it on the g+ page.  There were a handful of Application Not Responding reports coming in and after a quick look yesterday, I realized that I committed a programming foul.  Typically, anything that's going to take a long time or anytime you're going out of the device to get something (picture, info, etc) you want to put it in a thread.  This way the thread can do it's thing and the main part application can continue doing it's thing.  I had done this in the past in a number of places (getting the image and weather just to name two).  However, I didn't think about doing this for all the new Yahoo! PlaceFinder web service calls that I mentioned in my Round up.  Depending on the device, the connection or traffic Yahoo! is receiving the reply from the web service might take too long and the OS displays that lovely "Something took too long" do you want to Force Close, Wait or Report dialog.  Most of the time, hitting wait will be good enough.  This is one of those things as a programmer that burns me as I know better, but since I don't deal with it often (or not at all for my 9-5 job) I just didn't think about it.

The other thing in this update should hopefully resolve the any future problems that Stu experienced.  Those problems frustrated him enough to leave this review.  Long story short, I found Stu's email from the purchase order and dropped him a line.  It seems (and I'm waiting for confirmation from Stu) that after the purchase of the dock extension is made 1) there's a lag between the purchase and the acknowledgement of the purchase 2) After the acknowledgement is received I'm not forcing a reload of the dock or any of the other stuff that needs to happen.  The simple fix for him should have been a Reboot or a Force Close of the app.

I believe that in the time between the purchase and the review, the app wasn't restarted and therefore the extension was never fully 'activated'.  The code change was relatively simple and hopefully other people who purchase the extension (and future extensions) will not have the same problems that Stu experienced.  My apologies to Stu and any other users who experienced the same kinds of issues.

Tuesday, January 24, 2012

Update Round-up

I've been neglecting the blog lately although I've been rolling out updates in a steady stream.  After the last post, I started digging into the static location feature.  Most of the people who sent email asked "can I just enter a zip code".  Well, that would work for the 70% of people that are in the US, but having received emails from all over the world (Chile, Australia, UK, Austria and Poland just to name a few), I didn't want a solution that would only work in the states (I try not to be a narrow minded American).   Recently, I discovered Yahoo! PlaceFinder.  In the same web service fashion as the weather, you generate a HTTP request with the information and it returns an XML file of location information. Some other additional nice things that go with it, is that if you provide it a common city name (Newcastle for example has 8 locations in the states, at least 3 in the UK and one in Australia).  It will return you a list of XML nodes that I used for a dialog.  You can also add in a locale which will only return the relevant locations for that locale.

I was more than halfway though adding the static location feature in when I noticed that I started getting a steady stream of force close reports.  It seems that I wasn't checking for a NULL value when getting the location which caused the app to crash.  Fixing the error was pretty simple, but I had already made a number of changes that would need to be rolled back to release just the bug fix.  I decided to just plow though the finishing static location as I thought that would be faster.  All said,  I ended up getting about 45 reports in week from the last update until I got the error fixed.

Not sure when version was released, but it fixed the NULL force close issue and added in the static location which can be used Never, Always or when your location can't be found (back up).

Version was pretty much a maintenance release.  Just a number of little bugs (again from Force Close Reports) and other odds and ends that just needed to be cleaned up.

Version (the latest) big change was fixing a bug with the location loop up.  Emailing back and forth with Christopher D, I ended up discovering that my my location look up hierarchy wasn't working as expected.  The idea was to try to use this list (if enabled) to get the location :

  1. Static Location
  2. Location Based on IP Address
  3. Get current location 
  4. Get a cached location
  5. Get back-up location
  6. Location can't be found (give up)
The his phone had a problem was with getting the current location so it continued on to the cached location.  That was where I started to find all kinds of problems.  I ended up making a lot of changed to how the cached location works and what to do with it when it finds it.  All in all it was pretty much a product of the rushing to get the static location out to the market.

The other thing I wanted to note was that I did set up a Google+ page for the Desk Clock Plus.  I don't use Google+ on a personal level (or any other social media for that matter), so I'm really not sure how it's all going to work yet.  I figure, quick updates, support and I guess it is another way to get in touch with me.  It's an experiment so we'll see what happens with it.  

Thursday, January 12, 2012


I just quite didn't have time to post about yesterday's update and there's a bit of an overlap with the changes for today.  Yesterday's changes were some bugs reported by users.

The first one had to do with setting the Music button.  Apparently the ROM he's using has two different versions of Google Music installed.  It didn't matter which one he picked from the list, it always launched the older one.  I just had to adjust how I was finding and saving the intent.  While I'm thinking about the music button, over the life of Desk Clock Plus, there have a been a number of people who have emailed and said that music play {insert app here} doesn't show up in the list.  This has more to do with the other app than mine.  I'm trying to figure out what apps are registered to handle .MP3 files.

final String MP3_FILE = "/sdcard/media_api/music/SHORTMP3.mp3";
        Intent viewIntent = new Intent(Intent.ACTION_VIEW);
        Uri uri = Uri.fromParts("file", MP3_FILE, null);
        viewIntent.setDataAndType(uri, "audio/mp3");     
        Intent pickIntent = new Intent(Intent.ACTION_PICK_ACTIVITY);
        pickIntent.putExtra(Intent.EXTRA_INTENT, viewIntent);    
        startActivityForResult(pickIntent, MUSICPICKER);  

If the app isn't registered with the system to "view" a mp3, it doesn't show up in the list.  If anyone has a better way of doing this please let me know.

The other one which once again was reported by a pair of users with HP Touchpads saying that the display was way off.  Basically, the font sizes needed to be shrunk down the size of the font and weather icon to make everything fit.  Part of the major redesign when version 1.0 was released, all of the sizes, heights and widths were moved into one XML file.  This allowed me to very easily change everything to fit on to the Thouchpad.  Unfortunately, I didn't shrink the weather enough and the High/Low temp degree mark was pushed off the edge.  That was fixed in today's update...

So, the big thing for today's update is major improvement to finding your location.  Previously, I was relying on the last known location.  If I loop though everything and nothing knows where you're at then I'm forcing the device to update it's location.  I'm not 100% I'm happy with how all this works and it will probably be reexamined in the future.  Also, as it turns out the feature to use the IP address for the location wasn't working anymore (the web service I was using went away).  Fortunately, Yahoo had a replacement that I was able to use instead.

Finally, I also updated the "Immediate" time out to be more immediate.  As pointed out by Omniwolf in the comments, it was a little confusing / misleading.

Unless something comes up, I'm going to start on the static location tomorrow... Given the the changes I've made yesterday, I don't think that it's going to take me very long.

Monday, January 9, 2012

'Hide and Seek' or 'I'm not touching you'

I just pushed out version to the market this afternoon.  The big new feature is for Scrolling Dock users, you can now swipe up or down on the dock area to show or hide the dock giving you a little more clear space to enjoy your background.  There are also settings for the dock to "auto-hide" after a time period which also includes immediately (well, 15 second delay).

Also as per a suggestion from a user, there is now an option to dim the dark clock immediately as well.  Once again it's really a 15 second initial delay...  I figured you needed a short delay just to show the transition from non-dimmed to dimmed.  The other thing that is new for the dark clock is that the proximity sensor is now being monitored.  Typically the proximity sensors is located by the speaker at the top of the phone.  If the clock is dimmed and you wave your hand close by the sensor, the screen will un-dim for 15 seconds.  I figured that would be good for someone who wakes up in the middle of the night and wants to check the time.  This way the screen is only lit up for a short time instead of the five minutes (or more) for when the screen is touched.

I also linked the proximity sensor the the hidden dock as well.  If the dock is hidden and you trip the proximity sensor it will open the dock for 15 seconds.  This feature is a little more of a novelty, but the code was all there for the dark clock to do it and this program is a learning tool for me, so why not put it in?

The next thing up is the much requested "static" location for the weather... now that I know how to handle this for international locations.