Sunday, June 6, 2010

Android Market Annoyances

It has been three months since I released Critters to the Android Market. Since that time, I have come across a number of serious market problems that Google needs to address:
  1. Inability to respond to user comments and ratings. This month, Critters received its first one star rating. This came as quite a shock as all ratings up to this point were either four or five stars. The user complained about a problem that didn't really exist. If they would have read the FAQ or sent an e-mail, the problem would have been resolved immediately (this information was supplied as part of the application description). The market does not provide a mechanism for developers to respond to users and their problems. This makes the development community appear disconnected and unresponsive to their users needs. The only way I can try to help is by posting a comment on my own application. This procedure is very kludgey and hardly optimal. Google, simply allow us to respond directly to the user to help them out. This should be simple to implement and protect the user's privacy if they wish.

  2. Inability to track phone models of application users. It would be very helpful to track which phones your application is running on. I think this should go beyond just tracking the phone model when the application is downloaded and installed. There should also be a way to see this same information for uninstalls as well.

  3. Inability to track Android version of application users. This should be handled in the same manner as #2 above.
Starting with Android 2.2, Google has added the ability for users to supply exception information to the developer. The information, while helpful, is still inadequate. You are provided with a stack trace, application version and type of phone, but you do not know on what version of Android the application was running. The ability to contact the user reporting the exception would help with tracking down what caused it (the stack trace may not provide all the information needed).

Hopefully, Google will address these items in the immediate future to provide both users and developers with a better Android Market experience. I am not holding out much hope as I have seen next to no response from Google on the Android Market forums regarding these issues.

Tuesday, May 4, 2010

Critters - FAQ

I have created a Critters FAQ to help users find answers to common usage questions. The FAQ is available here

Sunday, April 25, 2010

Critters - Alpha Update on Android Market

I have released an update to Critters (alpha) on the Android Market. This is a bug fix release and does not include any new features.

Changes for version 0.2.0:
  1. Enhanced the form validation dialog with a more intuitive message. Some users were having problems saving their owner information and the validation dialog was not as clear as it should have been. The validation dialog now suggests that users check fields behind all form tabs for errors.

  2. Fixed state spinner synchronization bug. The state list array was not properly sorted and caused search lookup errors that would cause the incorrect state from the database to be displayed to the user. This bug did not effect the saving of a selected state, only the display when a user returned to the edit form to make changes.

  3. Added experimental localization support. Users in the U.S. and Canada share a list of states and provinces. This list is ordered with provinces first if the phone is set to en_CA or fr_CA and states first if the locale is en_US. All other locales show a country list that will store the two character ISO country code in place of a state. This country code is displayed below the postal code in the e-mailed pet record and other locations in the application where an address is displayed. Locales outside the U.S. and Canada use the ISO yyyy-mm-dd format to display dates.
If you encounter any issues with this release, please report them in the comments section. Enjoy!

Monday, April 19, 2010

Critters - Users outside the U.S. and Canada

I accidentally made Critters visible to all countries on the Android Market. The current alpha release supports U.S. and Canadian English only. To prevent any further confusion for international users, I have temporarily restricted availability to just the U.S. and Canada. Critters is designed to support locale specific formatting for dates, postal codes and phone numbers. I will be adding support for more countries in future versions.

Thank you for your patience and understanding!

Sunday, March 14, 2010

Critters - Alpha on Android Market

It has been a long time in the making and now the first alpha of Critters is available on the Android Market!

Final Features:

  • Multiple Pets
  • E-mail Medical Records
  • Locate Veterinarians
  • Owner Details
  • Pet Details
  • Pet Insurance
  • Veterinarians
  • Vaccinations
  • Medications
  • Medical Conditions
  • Weight History
  • Feeding Schedules

E-mailing of medical records with an attached photo is still quirky. If a record and photo is sent with GMail, everything works as expected. If the native e-mail application is used, the MIME type for the attached photo is not set correctly. This creates a slightly tweaked message. It still works; however, the encoded attachment data is visible at the end of the e-mail body.

To learn more about Critters and see a few screenshots, visit the project's home page here.

Sunday, February 21, 2010

Karmic Upgrade - Failing Module Rebuilds

After upgrading one of my desktops from Ubuntu Jaunty 9.04 to Karmic 9.10, I was left with a system that wouldn't boot. Dynamic Kernel Module Support (DKMS) was not rebuilding the existing NVIDIA and Virtual Box modules that were in place before the upgrade. A scan through the system logs led to the conclusion that the kernel headers were not installed as part of the kernel image upgrade.

The solution seemed obvious--install the missing kernel headers and manually rebuild the modules. I went into recovery mode, installed the kernel headers, rebuilt the NVIDIA and Virtual Box modules and rebooted. The system came back up and all was well. This all changed when the next set of updates were applied to the system. I was right back where I started with a non-bootable system.

A little investigation on the web and I found the problem. The linux-headers-generic package was missing. I opened a terminal and executed the following:

sudo apt-get install linux-headers-generic

Now every time a kernel update comes down, the kernel headers are automatically updated and the kernel modules get rebuilt as expected. One question remains, why was the generic headers package removed during the upgrade?

Sunday, January 24, 2010

Android Date Picker Dialog Weirdness

Recently I needed to add a date picker dialog to a form I was designing. It was pretty straight forward, an EditText with an adjacent button to trigger a DatePickerDialog to quickly select a date.

The following is an example from my project. I create a managed date picker dialog that is set to the date in the EditText. If the EditText is empty or has an invalid date string, the date picker dialog is set to today's date.

Code snippet from my activity:

...

@Override
protected Dialog onCreateDialog(int id) {
	Log.d(TAG, "onCreateDialog() -> id = " + id);

	if (id == ID_DIALOG_DATE_PICKER) {
		return new DatePickerDialog(this, searchDateSetListener, 0, 0, 0);
	}
		
	return super.onCreateDialog(id);
}

@Override
protected void onPrepareDialog(int id, Dialog dialog) {
	Log.d(TAG, "onPrepareDialog() -> id = " + id);
	
	if (id == ID_DIALOG_DATE_PICKER) {
		DatePickerDialog dlg = (DatePickerDialog) dialog;
		
		// Get today's date
		Calendar c = Calendar.getInstance();
		
		int year = c.get(Calendar.YEAR);
		int month = c.get(Calendar.MONTH);
		int day = c.get(Calendar.DAY_OF_MONTH);
		
		// Get the search filter
		String filter = editSearchFrom.getText().toString().trim();
			
		// Update the date picker dialog
		try {
			Date date = dateFormat.parse(filter);
			c.setTime(date);
			dlg.updateDate(
				c.get(Calendar.YEAR),
				c.get(Calendar.MONTH),
				c.get(Calendar.DAY_OF_MONTH));
		} catch (ParseException e) {
			dlg.updateDate(year, month, day);
		}
	}
}

...