Getting even more things done

When I crafted the Mobile Task Manager application this summer I didn’t expect it to have that good response in community. It was even mentioned in many blogs like Nokia Mobile Talk and even reviewed on one of my favorite Symbian sites, all about symbian.com, by Ewan Spence. Ewan pointed out good ideas how application could be improved to be even better GTD application for mobile phones.

Splash screen Task list

Last week I miraculously had few spare hours here and there and I was able to improve this app a little based on feedback written on the application page and based on Ewan’s review. Today I’m able to release the version 1.2 of the Mobile Task Manager with the following new features:

  • You can prioritize todo items (none, low, normal, high)
  • Priority shown as flags (none, green, yellow, red)
  • Priority can be changed from item view (left/right key)
  • …or straight from item list with ’0′ shortcut key
  • You can sort items by name, done-status or priority
  • Import items from text file or CSV file
  • FIX: pressing ’3′ causes the item below the one highlighted to open up for editing
  • FIX: “Delete selected” will not delete the last entry on a folder
  • FIX: pressing ’9′ does not work for quick note editing

Unfortunately I had to rename the JAR file in this release as it previously contained the version number so you can’t update your existing instance. From now on I’m keeping the same name (MobileGtd.jar) so future releases are going to update the existing installation. You can download the binaries (JAR/JAD files) from here.

Mobile Task Manager is still open source so if you like to check out the code you can do so in here.

Coding Touchscreen Scrolling in Java ME

Here’s the trick how you can add touchscreen scrolling to your J2ME applications. The key to touchscreen support is the Canvas class and its’ methods pointerPressed, pointerDragged and pointerReleased. These events are called when user puts finger on the screen (pressed) and drags the finger (dragged) and finally when removes the finger (released). Each method has the x and y coordinates for the pointer action.

The scrolling is implemented with the pointerDragged event. We store the current location of the canvas to variables verticalLoc and horizontalLoc. When finger (pointer) is dragged then location is changed according to the dragged amount. Variables are used on paint method to draw the area so that it is scrolled that correctly. You can also see from the sample code how you can draw background with repeatable pattern image.

  1. public class ScrollingCanvas extends Canvas {
  2.  
  3.  // Current location
  4.  private int verticalLoc, horizontalLoc;
  5.  // Last pointer (finger) location
  6.  private int lastX, lastY;
  7.  // Background image size
  8.  private static final int IMAGE_WIDTH = 183;
  9.  private static final int IMAGE_HEIGHT = 183;
  10.  
  11.  public ScrollingCanvas() {
  12.    verticalLoc = 0;
  13.    horizontalLoc = 0;
  14.    setFullScreenMode(true);
  15.  }
  16.  
  17.  protected void paint(Graphics g) {
  18.  
  19.    // Draw background with pattern image
  20.    int x = horizontalLoc % IMAGE_WIDTH;
  21.    if(x>0) {
  22.      x -= IMAGE_WIDTH;
  23.    }
  24.    int origX = x;
  25.  
  26.    int y = verticalLoc % IMAGE_HEIGHT;
  27.    if(y>0) {
  28.      y -= IMAGE_HEIGHT;
  29.    }
  30.  
  31.    boolean verticalDone = false;
  32.    while(!verticalDone) {
  33.      boolean horizontalDone = false;
  34.      while(!horizontalDone) {
  35.        g.drawImage(
  36.          ImageRepository.getBackground(),
  37.          x, y, Graphics.LEFT|Graphics.TOP);
  38.        x += IMAGE_WIDTH;
  39.        if(x>getWidth()) {
  40.          horizontalDone = true;
  41.        }
  42.      }
  43.      x = origX;
  44.      y += IMAGE_HEIGHT;
  45.      if(y>getHeight()) {
  46.        verticalDone = true;
  47.      }
  48.    }
  49.  }
  50.  
  51.  /**
  52.  * Finger is pressed on screen
  53.  * @param x coordinate
  54.  * @param y coordinate
  55.  */
  56.  protected void pointerPressed(int x, int y) {
  57.    lastX = x;
  58.    lastY = y;
  59.  }
  60.  
  61.  /**
  62.  * Finger is dragged on screen
  63.  * @param x coordinate
  64.  * @param y coordinate
  65.  */
  66.  protected void pointerDragged(int x, int y) {
  67.    // Calculate how much we moved horizontally
  68.    int deltaHorizontal = lastX – x;
  69.    horizontalLoc -= deltaHorizontal;
  70.    lastX = x;
  71.  
  72.    // Calculate how much we moved vertically
  73.    int deltaVertical = lastY – y;
  74.    verticalLoc -= deltaVertical;
  75.    lastY = y;
  76.  
  77.    // Repaint the screen since we have scrolled
  78.    repaint();
  79.  }
  80.  
  81. }

Here is a video of running this demonstration app in Nokia N97 SDK emulator:

Twim with Touchscreen Support

Here is the new version of Twim, the mobile Twitter client, now with experimental touchscreen support. I don’t own a real touchscreen phone (yet) so I had to test touchscreen functionality with emulators like Nokia N97 SDK (v1.0) and Microemulator. There were also few good people in Twitter that tested the beta version with N97 and Nokia 5800.

New 1.14 also includes other new features like Search, Twitvid, and Follow/Unfollow support. There are also minor improvements like now you will only have to answer to less security popups when uploading files since now it is only using READ mode instead of READ/WRITE that popped up tons of popups on my E71.

Go ahead and download the latest binaries from here and start Twittering! Let me know how the touchscreen support feels like on a real device since I can’t test it myself :)

Twim v1.14

Twim v1.14

New search feature in action

Search feature - GIF animation

Getting Things Done – With Mobile App

Splash Screen

Splash screen of the new GTD application.

I like to get things done. For years I’ve followed my own action management methods but recently I’m leaning towards the David Allen‘s GTD method which he describes in his book Gettings Things Done: The Art of Stress-Free Productivity. I have used many tools to store the actions like traditional pen and paper and several desktop apps, like MiniTask and Evernote. I haven’t found any decent (and simple) mobile apps to do the same. I have used the Groceries app for this purpose but it was lacking in some areas of usability. This was the reason I created the Mobile Task Manager application.

I got good feature ideas from Jorge Ledesma who is a blogger at NokiaMobileTalk.com. The current set of features include:

  • Create actions
  • Edit actions (with 3 key)
  • Mark action as done (with fire key)
  • Purge done items
  • Create folders
  • You can add notes to actions (with 9 key)
  • You can rearrange the actions (with left/right keys)
  • Mark action as favorite (with 7 key)
  • Backup actions to CSV file

Check out the software page for additional screenshots and download links.

Perfect Maze

My older son likes to solve mazes that I draw to him. It’s takes a bit effort to create larger mazes at least if you want them to be “perfect” mazes. A perfect maze is defined as a maze which has one and only one path from any point in the maze to any other point. It was pretty easy to write a piece of code that creates mazes automatically using the Depth First Algorithm.

Perfect Maze

Perfect Maze

I wrote a small Java Applet that creates a different level of mazes with each mouse click. I haven’t written an applet for years so now it was time to try out the latest features of the Java Runtime. Sun have introduced many improvements in the latest runtime updates (Java 6 Update 10). Now applet is run in a different thread then the browser itself so you can’t hang the browser when starting an applet.

One of the cool features is that you can even drag the applet outside from your browser and close the browser while having the applet still running. That could able nice solutions to be written in applet format.

I created a new page for my latest Maze Applet so go a head and try it out. It doesn’t have much interactive features. You can just create new mazes by clicking the left mouse button. If you have the latest Java Runtime you can also test the dragging by holding the ALT key and then dragging the applet out from the browser window.