Skip to Content

Blog

DroidCon UK, 6-7 October 2011

Looking forward to the upcoming DroidCon UK (6-7 October 2011) (http://uk.droidcon.com). It promises to be a must see for Android developers with loads of presentations from Google, HTC, SONY Erricson, and loads of community members. Hope to see you there:

Droidcon London Oct 6-7
myPod

MyPOD reviews

There have been a couple of fair reviews of MyPOD recently and I just wanted to send a shout out to the authors, Thanks guys.

http://www.androidauthority.com/podcatcher-roundup-top-9-best-android-apps-for-playing-podcasts-16817/

http://rascallings.blogspot.com/2011/07/android-app-review-mypod.html

We all know that while being highly functional – there are some edges to smooth out in the MyPOD UI. Credit goes to these bloggers for taking the time to look at the functionality and give it a fair review.

Using VectorPaint For VJing

While re-writing the VectorPaint library I have also been experimenting with using the library in a VJing application. The save drawings are sent via OSC to a processing sketch and render on the screen. This is a snapshot at MixedMedia – a monthly event in Sydney for VJing.


shortcuts script for common debug tasks

I have been using this script for a while, it allows me to make shortcuts for common android debug tasks (e.g. logcat, shell, installing/overwriting/removing apks). There are probably better ways of doing it for the shell script experts out there, but it suits my purposes… and it’s pretty streamlined.

There are aliases for common devices and common apps so i can start stuff with a few characters

So the first parameter denotes the function.

l = logcat
r = replace app (keeping data)
s = shell
i = install
u = uninstall
o = overwrite (uninstall then install)
ks = kill-server
ss = start-server

The second parameter denots the device (which are configured in the first if statement):

a = all connected devices (from 'adb devices')
f = first device (in 'adb devices' list)
e1 = emulator-5554
(the others are my hardware devices)

Then there are app package name shortcuts … (the 3rd if statement)

To start logcat on ny nexus 1, I type:

ad l n1
And to overwrite an apk on all connected usb devices – it type (the 2nd ‘a’ param stands for ‘all connected devices’), really useful when testing before a release …
ad r a /path/to/apkfile.apk
Basically it’s nothing too high tech, it just makes things much quicker and easier when i am debugging. If you have any suggestions then i am keen to hear them…

So without further ado, here is the script:
#!/bin/bash

# toggle this to test command output without execution 0=no exec
EXEC=1;

DEVICES='f'

if [ $2 ] && [ $2 = 'g1' ] ; then
 DEVICES=("HT848KV04600")
elif [ $2 ] && [ $2 = 'hero' ] ; then
 DEVICES=("HT9BSL901147")
elif [ $2 ] && [ $2 = 'arch' ]  ; then
 DEVICES=("A10-4BE40002-9FF80000-015F2F44-0D01601E")
elif [ $2 ]  && [ $2 = 'n1' ]  ; then
 DEVICES=("HT018P805702")
elif [ $2 ] && [ $2 = 'e1' ]  ; then
 DEVICES=("emulator-5554")
elif [ $2 ] && [ $2 = 's' ]  ; then
 DEVICES=("I5500b2e40b3c")
elif  [ ! $2 ] || [ $2 = 'a' ] ; then
 DEVLIST=`adb devices`
 DEVICES=()
 for D in $DEVLIST; do 
  if  [ $D = "device" ] ; then 
   DEVICES=(${DEVICES[@]} $PREV)
  fi
  PREV=$D
 done
# take the first device if not specified otherwise take all
 if [ ! $2 ] ; then
  DEVICES=${DEVICES[0]} 
 else 
  DEVICES=${DEVICES[@]}
 fi
fi
echo "using devices:" $DEVICES

OP=''
if [ $1 ] ; then
 if [ $1 = 'u' ] ; then
  OP="uninstall"
 elif [ $1 = 'i' ] ; then
  OP="install"
 elif [ $1 = 'r' ] ; then
  OP="install -r"
 elif [ $1 = 'l' ] ; then
  OP="logcat"
 elif [ $1 = 's' ] ; then
  OP="shell"
 elif [ $1 = 'ks' ] ; then
  OP="kill-server"
 elif [ $1 = 'ss' ] ; then
  OP="start-server"
 elif [ $1 = 'z' ] ; then
  OP=""
 elif [ $1 = 'o' ] ; then
  OP=""
 fi
fi
PRG=$3;
if [ $3 ] ; then
 if [ $3 = 'mpp' ] ; then
  PRG="package.name.1"
 elif [ $3 = 'st' ] ; then
  PRG="package.name.2"
 elif [ $3 = 'stp' ] ; then
  PRG="package.name.3"
 elif [ $3 = 'mp' ] ; then
  PRG="package.name.4"
 fi
fi

if [ ! $1 ] ; then
 echo "ad <cmd> <dev> <prg> extra"
 echo "CMD = o (overwrite)  extra=apk | l (logcat) | r (reinstall) extra=apk | "
 echo "i (install) extra=apk | s (shell) | u (uninstall) |  ks (kill-server) | ss (start-server)"
 echo "CMD = z (zipalign <dev>)"
 echo "DEV = g1 hero arch n1 s a(all)"
 echo "PRG = mp mpp st stp"
 echo "------devices---------"
 CMD="adb devices"
 echo $CMD
 if [ $EXEC = 1 ] ; then 
  $CMD
 fi 
else 
 if [ $1 = 'z' ] ; then
  NEWFILE=`echo $2 | sed "s/.apk/_z.apk/"`
  rm -fr $NEWFILE
  CMD="zipalign -v 4 $2 $NEWFILE"
  echo $CMD
  if [ $EXEC = 1 ] ; then 
   $CMD
  fi
 else 
  for DEV in $DEVICES ; do
   echo $DEV
   if [ $1 = 'o' ] ; then
    CMD="adb -s $DEV uninstall $PRG"
    echo $CMD
    if [ $EXEC = 1 ] ; then 
     $CMD
    fi
    CMD="adb -s $DEV install $4"
    echo $CMD
    if [ $EXEC = 1 ] ; then 
     $CMD
    fi
   else 
       CMD="adb -s $DEV $OP $PRG $4"
    echo $CMD
    if [ $EXEC = 1 ] ; then 
     $CMD
    fi
   fi
  done;
 fi
fi
time

Silent mode timer UI changes – review & lessons learnt

I have posted about the silent mode timer before – it’s a small app to disable silent mode using a timer. It’s useful for situations like meetings and going to the cinema when you just want to have silent mode on for a short period of time and not mess around with schedules or flipping upside down, etc.

After releasing a UI update recently I discovered how difficult it can be to convince users of the benefits of a new (better) UI. When your users know your product there is generally going to be some resistance when it gets changed. Eventually I have realised that if there is going to be change, then you have to make sure that all the features your existing users like should be the highest priority.

The goals of the UI re-write were to reduce the amount of buttons on screen while still enabling the fastest way to set a timer and just get out (that’s all the app should do).

The features that were lost in this case were:

  • Some convenience buttons on the side of the time setting widget to increment/decrement the time by 15min. In the first version
  • 12 hour time.

These features have now been restored by popular demand …

There were many features people had requested to be added in the first version (automatic prompting, calendar integration, set a timer by end time). Some of these were easy to integrate in the new interface (all except the calendar integration).

But with all the (new and old) features, does it still live up to the basic goal of simplicity? Well the users will be the judge. Some have left but more new ones have also come.

The moral of the story? Well i guess it’s that no matter how well you try to make things better, the main thing you need to create is a sense of attachment to an application, and familiarity is key. Changes probably need to be made in transitional style, or if there is a complete overhaul, the option to revert to the old style while people get comfortable is highly important.

The new app can be found on the market here:
Free: https://market.android.com/details?id=co.uk.sentinelweb.silenttimer

Paid: https://market.android.com/details?id=co.uk.sentinelweb.silenttimerpaid

The old screen

The new screen



It would be great to know what YOU think too ;)

ADB with Acrhos 10i internet tablet on Ubuntu

I recently bought Archos 10i Internet tablet for testing the upcoming drawing software release (more soon on that) and there is an extra trick to getting it working with ADB:

1. Get the Vendor id by typing:
lsusb 
The line we are looking for is:
Bus 002 Device 007: ID 0e79:1411 Archos, Inc.

2. Add the vendor id (0e79) to /etc/udev/rules.d/51-android.rules as per normal
SUBSYSTEM=="usb", SYSFS{idVendor}=="0e79", MODE="0666"

3. And the extra trick is as per this link: archoss-solution-to-adb-connection-bug.html
You also need to add the vendor id to ~/.android/adb_usb.ini (you need to check the file doesn’t exist first).
echo "0x0e79" >>~/.android/adb_usb.ini

4. Then we restart the ADB server and the device should be shown:
adb kill-server
adb start-server
adb devices
The last line shows:
List of devices attached
A10-4BE4XXXX-9FF8XXXX-015FXXXX-0D01XXXX device
myPod

Top 20 nice market comments about MyPOD Podcast manager/player

It’s always nice when people like your work, nice comments go a long way when you are trying to make something that is different, so I though I’d post the Top 20 nice comments about MyPOD, so here goes, thanks to everyone:-

  • After long research, I eventually found a podcast client which can do everything what I wanted (and more). Awesome app, keep going!
  • This app requires an IQ of at least 85 to use. If you like to smash big buttons like a monkey do not install it. Your fault if you can’t use.
  • I’ve tried a few podcast players, and this is by far my favourite. It is worth buying the full version for more than 6 feeds. Good job.
  • Fantastic app. Evolving quickly and getting better every time. Most used app on my phone.
  • Best most robust podcast app by far.
  • The best thing is the independant volume controls. You can make it quieter than the phone would normally let you. Handy listening to podcasts at night
  • Tried all podcats and this is by far the best. A lil confusing at first, but get used to it and youll see its AWESOME!
  • Far and away the best android podplayer i’v ever used. Simple to use but extremely configurable. Unlocked, on samsung captivate.
  • Best app I have bought! Easy to set up and no sync/account issues like listen. Could do with option to save favourite pods to media player
  • Best podcatcher. It takes alittle to get used to the UI but once you do, it blows all others out of the water!!!!
  • Easily the most used app on my phone. Avaulable features and responsive developer make MyPod the best podcast manager available. Well worth unlocking.
  • Truly wonderful app. Great interface, easy to use, minimal learning curve and its very powerful. Well worth the price (I bought it twice)
  • This is by far the best podcast app on the market.it takes about ten minutes to get the hang of how it works.
  • An excellent podcast app. The first to make me begin shifting subscriptions from my ipod to my EVO. First app I excitedly bought an unlock key for.
  • This app does it all! Huge thanks to the dev.
  • Fantastic app. Manages all my podcasts perfectly in one place. Who needs an iPhone whilst this exists? ;-)
  • The UI is intimidating the first time you use it, but it’s easy to learn and the app is feature packed…worth taking a few minutes to get familiar w/
  • One of the best podcast apps around. You can’t do better for free. So good I wanted to pay for it.
  • I’ve tried them all and was very frustrated with the confusing and shamefully poor podcast support till I found this gem!
  • If you love to control how your phone works this is the perfect app; If you have trouble with complexity and want a predetermined path go for Listen.

Android NDK Primer & Drawable Customiser presentation

I presented a primer on getting started with Android NDK at OpenLab OpenDay on the 13th November. The presentation consisted of the following parts:
  • Basic introduction to the Android NDK (Building and development basics)
  • Use of DirectBuffers
  • Accessing java objects from the NDK (Getting and Setting data in Java Objects)
The talk covered most of the basics, and people were surprised to see just how easy using the NDK can be…

I also gave a brief overview of the upcomping Drawable Customiser release and have released a basic version of the API under GPL (Available here). I will be posting some usage examples in the next couple of weeks ..

The NDK presentation is available as : OpenOffice and PowerPoint XML

Filtering onTouch for light pressure

For the drawing program I am writing, there is a sensitivity problem when the pressure is light on the touchpad. When the finger is pressed down (like when you are in the middle of a drag operation) the touch point is stable as the area of the finger pressed to the touchpad is large and so the centroid of the area is quite stable.

However at the end of the drag operation, as the finger pulls away, the area on the touch sensor decreases and the actual touch point seems to vary a lot. This is a problem for me in my drawing program, as you make fine changes to the drawing, you don’t want the changes to be affected by this noise as you pull up from the touchpad.

This solution uses a mean filter to combat the problem – noting new there. But we combine the mean value with the pressure value so as the pressure gets lighter, we us more of the mean value. It works best if the finger pulls off the surface slowly.

The filter class I have used is shown below:
/*
* licensed under CC BY-SA : http://creativecommons.org/licenses/by-sa/3.0/legalcode
*/
class MeanFilter {
 public static final int DEFAULT_LEN = 11;
 float[][] points = new float[2][DEFAULT_LEN];
 int currentPos=0;
 int actualValues = 0;
 int length = DEFAULT_LEN;
 float pressureLimit = 0.2f;
  
 public MeanFilter(int length,float pressureLimit) {
  super();
  this.length = length;
  this.pressureLimit = pressureLimit;
 }
 public void add(float x,float y) {
  points[0][currentPos]=x;
  points[1][currentPos]=y;
  currentPos++;
  currentPos%=length;
  if (actualValues<length) {
   actualValues++;
   actualValues=Math.min(actualValues, length);
  }
 }
 public void clear() {currentPos=0;actualValues=0;}
 public void get(PointF defaultPoint,float pressure){
  if (actualValues==0) {return;}
  if (pressure<pressureLimit) {
   float xmean = getMean(points[0], actualValues);
   float ymean = getMean(points[1], actualValues);
   float pressureRatio = pressure/pressureLimit;
   defaultPoint.x=(pressureRatio)*defaultPoint.x+(1-pressureRatio)*xmean;
   defaultPoint.y=(pressureRatio)*defaultPoint.y+(1-pressureRatio)*ymean;
  }
 }
 public void setLength(int i) {
  length = i;
  clear();
 } 
 private float getMean(float[] arr,int ctr){
  float accum = 0;
  for (int i=0;i<ctr;i++) {
   accum+=arr[i];
  }
  return accum/ctr;
 }
}

To use it we create an instance – this is a mean filter length:7, pressure threshold:0.3
private MeanFilter touchFilter = new MeanFilter(7,0.3f);

Then in onTouch, we can filter the value to be used like so:
/*
* licensed under CC BY-SA : http://creativecommons.org/licenses/by-sa/3.0/legalcode
*/
public boolean onTouch(View v, MotionEvent event) {
 PointF touchPointOnScreen = new PointF(event.getX(),event.getY());
 switch (event.getAction() ) {
  case MotionEvent.ACTION_DOWN: touchFilter.clear();
   break;
  case MotionEvent.ACTION_MOVE: 
   touchFilter.add(event.getX(),event.getY());
   if (event.getPressure()<0.05) {return true;}
   if (event.getPressure()<0.3) {
    touchFilter.get(touchPointOnScreen,event.getPressure());
   } 
   break;
  case MotionEvent.ACTION_UP:
   touchFilter.get(touchPointOnScreen,event.getPressure());
   break;
 }
 // use touchPointOnScreen here...
 return true;
}
So touchPointOnScreen contains the filtered value to use.

We can note that the mean values arent calculated until the pressure drops below the threshold, thus being slightly more efficient than just mean filtering all the time, this also stops touchpoint lag as the mean filtered value will generally lay somewhere behind the current value.

This code is made open under the CC BY-SA licence.
time

Silent Timer Released

I have just yesterday released a (very) small app and widget called “Silent Timer”. This a simple app to disable the silent mode after a certain time. I made it because I regularly forget to turn off silent mode after movies and meetings. There are plans to add some more features in the next few weeks.

There is a free ad supported version and a paid version. The free version has had 300 downloads so far – which isn’t too shabby for absolutely no announcements or marketing (well, except this post).

SilentTimer Icon Old
QR Free QR Paid

The product page is here