Wednesday, November 2, 2011

Optional, third priority updates

Finally, after implementing this and this, I am planning on tackling some of the bigger issues like:

  • possible to sort items in user order, e.g., based on location in store? (like ability to drag and drop the categories)
  • anyway to not have to have a category? (for example a list for car might have wash, gas, service, and pickup parts, so doesn't need categories) I may make this a config option to have a default category always created for you,
  • Support optional information elements per item instead of just a name, including "Done" string and a note/description field - Right now I don't see a need for it. The intent was for Reverse Checklist to be simple, and I don't want to make it more complicated than it needs to be.
  • Maybe support states besides just done/undone, like "skipped" and "problem" - Same as above
  • Show all of the items much like you do on the "ToDo Report", but allow me to edit  or delete any item. This would make much easier to select an item regardless of the category.
  • Have a search feature to be able to find an item.

Second priority updates

When I am done implementing features from this list, I will move on to the following requests:

  • possible option to make font larger for category names at top of list and across bottom - This will require some UI redesign
  • Consider making the mode toggle an onscreen button instead of a Menu item
  • Make TODO mode a bit more informative about the state of the list
  • A possibility to consider is to make EDIT and DO actions separate. - separate menu items available in Edit and TODO modes.

Tuesday, November 1, 2011

First priority updates

I ordered all feature requests by difficulty and "bang for the buck" factor. These are features that won and will be implemented first, in no particular order

  • possibility to sort a to do report for selected list in category order as set by user? (to match location in store or shopping mall).  Currently it is sorted by category name. 
  • add a little more visual feedback to the entry UI, something to make it more obvious that the "checked" items are undone and the "unchecked" items are done. This will most likely end up being a help item, or some other form of a visual indicator. 



  • Make it configurable whether you end up in "edit" or "TODO" mode when you first enter a list
  • When in my Shopping List, for example, I would like to be able to "check all" or "uncheck all."
  • Make categories into checklist items themselves, so you can check/clear a whole category, which is the same as checking/clearing all of its entries - This also solves the problem of making it easy both to check and to clear an entire category at once
  • Make it possible to check/clear an entire list from the main screen

Upcoming changes to Reverse Checklist

I decided to move my *** already and do something about all those awesome requests that came from actual users of my App. Every email from a user gives me a jolt of motivation - because then for just an instance, the whole thing becomes real! It is not a number anymore. There is a real person actually using my app and, sometimes, liking it.

And they cared enough to sit down and write an email with suggestions on how to make Reverse Checklist better. I owe them.

It is sometimes hard to balance professional and personal life. And it is even harder to explain to my wife and daughter why the professional life has to enter the private via the means of some lame android application. But I am a programmer, and I am loving it.

She hates it:



The next three posts explain what and when new features and updates will be implemented.

Reverse Checklist feedback

Over the last couple of weeks I have received a lot of feedback from the users of Reverse Checklist.
I was happy to find out that my app really did provide something that other apps did not, even though it cannot be compared with bigger and more advanced applications.
It was meant to be as simple and lightweight as possible and I intend to keep it this way.

Thank you for your feedback KLC, Fanderay, Jeff, Barry, Martin, Koos, Jerald and Jebi.

Reverse Checklist is a one-man-project. So it sometimes takes a lot of time for new features to be added to the application.
  • My first priority are always crashes, defects and fixes for features that obviously don't work. (E.g. sorting issues)
  • Second priority - simple enhancements for existing features (Like the addition of selection information to exports/imports)
  • Third priority is reserved for simple features - like new configuration options, things that don't require a significant redesign of the application.
  • And finally, bigger jobs are lowest priority, simply because of time constraints.

In the next post I will try and lay out a plan of upcoming features and releases. I will try and adhere to the plan as much as possible, but unfortunately I cannot commit to any specific schedule.

Some of the features that were suggested/requested are not going to get implemented (just a few of them, though). This is because they do not fit into my idea of Reverse Checklist.
Some of the best comments I received goes along the lines of:
"I like your app, I tried many other apps, and your app does things slightly differently, and that's why I like it.". I wanted to keep it this way, and continue doing things my way - with your help.

So, to sum up - I have not forgotten about your suggestions.. I apologize for making you wait for so long for the updates. The upcoming post will give you a better idea what to expect soon.

And as always: Thanks for using Reverse Checklist!

Wednesday, July 20, 2011

Import / Export to csv added to ReverseChecklist

When I started developing Reverse Checklist, I created a list of ideas I wanted to implement. But at the same time, I wanted to release the application as soon as it became somewhat useful and bug-free. And that's what I did. Now that it is already released, I can add new features to it. And the priority is always user-driven.

A few weeks ago someone asked me to add the ability to seed the database with a csv file. That was something I already had planned, I just did not know if anyone would find it useful. Now that I know that there is at least one person who would like that feature, I am adding it.

Thursday, May 5, 2011

Referencing an Android Library project from android application

After releasing my application, I received a few emails from people who downloaded it. It feels good to know that someone finds my application useful. I am not the only one, apparently. What is funny, is that I received a few suggestions on how to improve Reverse CheckList, and the things suggested were actually already on my list of things I wanted the app to do.

1: Add an activity for managing item categories. I should have done that a long time ago, but I wanted to release first, and then add features.

2. Make the category list user-orderable. User defined sort order for categories was actually one of the things that my users requested.

So this is the next thing I am going to be working on.

Of course, commonsguy is helpful as usual. It turns out he actually wrote a list that is user orderable. You can drag and drop items and reorder them however you like.

So tonight I am integrating commonsguy's list into my application.

And here is how to do that: http://developer.android.com/guide/developing/projects/projects-eclipse.html

Monday, May 2, 2011

Reverse CheckList 1.06 released

It took me what seemed like a long time to add a new feature. But now I checked it, and it was exactly 7 days ago when I published 1.05.

The biggest change in 1.06 is the addition of the new feature - a ToDo Report. It is simply a list of all items that are currently checked, across lists and categories. Ever since I started developing this application, I always wanted this feature. And now it is done.

I have to note here, that when I first attempted to write this module, it turned out that my initial design of data access was flawed, and would not allow for this feature to even be implemented. What a failure. But I have changed it since.

In addition to being able to see the entire list of items to be done from all lists and categories, the list can also be emailed. This was Max's idea (http://maxphotoblog.com/). Thanks Max!


And this is what Reverse CheckList looks like right now:

Main screen with menu visible




ToDo Report. User can e-mail the list 

Sunday, May 1, 2011

Doing things right

Doing things right feels nice.

Because my weekend project becomes more and more of a solid product, that people actually use, I need to 'focus on quality'. And start doing things the right way.

This means - no more hacking things together, just because it is fun to see things work. It means more time spent on boring code, like unit tests. It also means more comments, better structure, and overall nicer looking code.

This just happens to be in line with my goal to make the source code available online, when I feel like it is ready to be shown in public places.

To help me achieve my goal of clean, good code, that I will not be ashamed of, I spent some time today configuring my environment:
  1. I configured Eclipse to warn me about missing comments. For now I left the checkboxes to ignore overriding and implementing methods checked, but I plan on unchecking those in the future.
  2. I installed the Code Metrics Plugin http://metrics.sourceforge.net/update
  3. I installed the Code Coverage Plugin from http://update.eclemma.org/. I started adding unit tests for my app a few weeks ago, and I added some more tonight.
  4. I use the monkey extensively, in addition to manual testing
  5. Finally, I use my app every day. And, unfortunately, still find defects this way.

Sunday, April 24, 2011

Test - first development for Android

My app (Reverse CheckList) is now officially big enough to get over it and start having some unit tests. Seriously.

How can I tell?

For the first couple of hundreds of SLOC it was easy - a few features, easy to test, easy to keep the entire thing in my head. Features were not interdependent, and the whole app was just a test field for code samples that I found online. Oh, and it was not released. My wife and I were the only users. So if something did not work, I could simply code a fix and re-deploy it to our phones. Piece of cake.

This all changed when the design started crystallizing, when I refactored some of the code, that was previously scattered across multiple code files to be more coherent and reusable, and finally, when I released the app to the Android Market.

Reusable components... I think everyone agrees with me that this is a great idea to write code once and then reuse it. No code duplication, better design and... more dependencies! Yes! If a method is called from one place, you only need to retest this one place. If it is called from multiple places, then you have a bigger problem on your hands.

 Monkey helps a lot, of course. Just because 1. I'm too lazy to re-test the entire app when I change something 2. IT IS AWESOME and I can spend hours watching it just randomly click on stuff (Sometimes on two emulators simultaneously), but now I feel that even that is not enough.

So unit tests it is. We'll see how it goes.

Thursday, April 21, 2011

Reverse CheckList released

I made some updates yesterday and released Reverse CheckList 1.05. to Android Market.

In this release, I added sorting of the main screen of the app - the list of lists - by various criteria. I also fixed a few defects, and made it look just a little bit better - re-worded some messages and texts on buttons etc.

But there's still a lot to do before I can say that I am totally done with this little project and I can move on to something bigger and more interesting.

Wednesday, April 20, 2011

Observer that would not observe....

This is what I wasted half the night trying to solve and I failed:

http://stackoverflow.com/questions/5726468/contentobserver-getting-notifications-about-Linkdeletes-but-not-inserts-or-updates

Basically, I have a ListActivity that I wanted to sort. To enable sorting, I added a spinner control at the top of the screen, with sort options. When a sort option is selected, it requeries the underlying DataProvider, and the list is sorted according to user's preferences.

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="fill_parent"
android:layout_height="fill_parent">

<LinearLayout android:orientation="horizontal"
android:layout_width="fill_parent" android:layout_height="wrap_content">

<Spinner android:layout_width="fill_parent"
android:layout_height="40sp" android:id="@+id/spinner_sort_activities">
</Spinner>

</LinearLayout>

<FrameLayout android:layout_width="fill_parent"
android:layout_height="fill_parent">
<ListView android:id="@android:id/list" android:layout_width="fill_parent"
android:layout_height="fill_parent" android:drawSelectorOnTop="true" />

<!-- Here is the view to show if the list is empty -->
<TextView android:text="@string/empty_list_default_value"
android:id="@+id/txt_empty_list" android:layout_width="fill_parent"
android:layout_height="fill_parent" android:textSize="16sp"
android:textStyle="bold" android:gravity="center">
</TextView>
</FrameLayout>
</LinearLayout>

However, it does not make much sense for the Spinner to still be there when the list is empty, and the empty view is presented to the user. So I did this:

// Get a cursor to access the note
Cursor mCursor = managedQuery(ActivityColumns.CONTENT_URI, PROJECTION, null, null,
getSortOrderStringFromSpinner());

mCursor.registerContentObserver(new ContentObserver(new Handler())
{
@Override
public void onChange(boolean selfChange)
{
// hide the list sort drop down if no items in the list
if (activityListAdapter.isEmpty())
sortOptionsSpinner.setVisibility(View.GONE);
else
sortOptionsSpinner.setVisibility(View.VISIBLE);
}

@Override
public boolean deliverSelfNotifications()
{
return true;
}
});


For some reason it just does not work. I know there is a problem somewhere in my code. But I just don't know where. The observer is observing - it receives all deletes, but not inserts or updates. Frustrating.

I tried debugging, reading, googling, stack-overflowing, cursing and, finally, throwing some random code at the problem, but it still did not work. I hope to find an answer quickly, because I have some updates I wanted to publish ASAP, but I wanted to get the sorting done first.

Well, I'll spend some more time on it tonight.

Frustrated with Android

For the last few months I've been trying to write my first Android application. For the most part that was an awesome experience - the framework is very well designed, it looks nice, the tools are pretty good (emulator, monkey, etc), but sometimes things are just soooo frustrating.

And because misery needs company, I decided to share my experiences with Android with you.