I threw together a quick web page to convert rtttl ringtones to gcode so that users can play ringtones on their printers. It’s great for print finished notifications. You need a printer firmware and that supports M300 and a buzzer. I’ve put in pull requests for Marlin and Repetier that add M300 support.

You can use the converter here:

Careful! Filters on Google Play

Recently Foodzy released a major update to their Android app. I had heard about it in the past and figured I would check it out. I went to install it from the Play Store and the only device that was listed as compatible was my HTC incredible. Even more intrigued I installed it and dumped the APK. Upon further inspection the manifest contained an un-needed requirement that explained why is only showed on one of my devices.

<uses-configuration android:reqFiveWayNav="true"/>

I let the developers at Foodzy know that they needed to remove just that line. The app now shows up on all the devices it should.
When running into issues with apps not showing up on the play store store for certain devices, be sure to check the filter list here and remove any un-needed filters.

Is there a new Android Google Maps API around the corner?

Evidence that a new version of the Google Maps API has shown up in a recently released app named Field Trip. This app sits in the background and will alert you when you near interesting landmarks. There are wonderful looking maps throughout the application, that have much of the enhanced functionality that users are used to from the Google Maps app. It would seem that this app is not just for fun, and that Google is using it to test out a new version of the Google Maps API.

Decompiling Field Trip reveals some secrets about the new Maps API.
The application tag in the app manifest references “”:

<application android:label="@string/app_name" android:icon="@drawable/launcher_icon" android:name="" android:description="@string/app_description" android:hardwareAccelerated="true">
        <meta-data android:name="" android:value="redacted" />

While most of the project has been obfuscated by proguard the package remains intact. Ever since Google introduced fragments developers have been requesting a MapFragment class. It would appear that there requests have been answered, the package contains a MapFragment.smali file. There is also a SupportMapFragment.smali for use with the compatibility libraries that google uses.

.class public Lcom/google/maps/MapFragment;
.super Landroid/app/Fragment;

# interfaces
.implements Lcom/google/maps/GoogleMap;

All signs point to the fact that the new maps API is almost ready for developers to use. Hopefully Google releases it sooner rather than later.

Removing advertisements from the new Kindle Fire HD

Removing the ads from the new Kindle Fire HD is a fairly simple process.

First make sure to root your device, the method here should be quick and painless:

Now just open up a terminal and do the following:

adb shell
cd /data/data/                        
rm -r ./adunits
touch adunits

Now the lockscreen should just show the stock photos.

Water Cooler, a web app for Fitbit

The FItbit is a futuristic pedometer that can track a users steps, the number of flights of stairs they climb and even how much they sleep at night. The companion website allows users to log the food they eat throughout the day and how much water they drink. It is often hard to remember to log the water that you have consumed throughout the day. I decided that I would write a quick web app that could help log the water that I drink at the office. I had also been wanting to try out the Go programming language for a while and this seemed like a good project to try it out on.

Water Cooler is meant to be run on a spare smartphone or other touchscreen device. At the office I’ve put an extra iPod touch on a dock and placed it on top of our water filter / dispenser. Now whenever I fill up my glass I simply just have to click my profile icon, choose the amount, and my drink is uploaded to Fitbit. Water Cooler then shows me how much of my daily water goal I have consumed.

For anyone interested in checking out the source, I’ve put it up on github:

Android Fragment layout

I recently ran into a problem when using a FragmentTranscation to replace a LinearLayout with a Fragment. The Fragment that I was putting into the layout was not filling the view port properly. Luckily it was a fairly easy problem to fix.

FragmentTransaction trans = getSupportFragmentManager().beginTransaction();
trans.replace(, mFragment);

The code above was creating a layout that had an intermediary FrameLayout that did not have the proper layout parameters. NoSaveStateFrameLayout was set to “wrap_content” so the children were not filling the viewport.

Luckily the fix was just to change the code in onCreateView of the Fragment:


View layout = inflater.inflate(R.layout.fragment_page_edit, null);


View layout = inflater.inflate(R.layout.fragment_page_edit, container, false);

Modifying Amazon’s Kindle app to hide soft keys on Ice Cream Sandwich

Ice Cream Sandwich introduced soft buttons to Android phones, and Google had forethought  enough to allow applications to dim these buttons so that they don’t distract from content like text and video. Sadly Amazon has yet to update their Kindle application to support this feature. Luckily we can take advantage of APK Multi-tool to de-compile, modify, and re-compile and resign applications. Below is a screen shot of how the app should look before and after the modifications.

First we need to create a temporary application so that we can get the Dalvik code that we want to inject into the Kindle application.

Create a test project in eclipse to get the dalvik code and put this into the onCreate method after setting the content.


We can use baksmali that comes with APK Multi-tool to de-compile this new app and find code similar to this:

invoke-virtual {p0}, Lcom/amazon/kcp/reader/ReaderActivity;->getWindow()Landroid/view/Window;
move-result-object v2
invoke-virtual {v2}, Landroid/view/Window;->getDecorView()Landroid/view/View;
move-result-object v2
const/4 v1, 0x1
invoke-virtual {v2, v1}, Landroid/view/View;->setSystemUiVisibility(I)V

Next we need to de-compile the Kindle app.

We want to change the code located in:


Now the code that was generated earlier can be inserted into the Reader activity after line 2027 which should look like this

invoke-virtual {p0, v0}, Lcom/amazon/kcp/reader/ReaderActivity;->setContentView(I)V

Once that is complete smali include with APK Multi-tool can be use to re-compile the modified app. The output can be pushed to an android device with adb and the soft buttons should now auto hide.

Android Kinect Projector Interface w/ System Access

Watch this video on YouTube.

This is a continuation of my work to create a way to interact with Android when it is being displayed on a large scale using a projector.

The setup I’m using consists of a Kinect hooked up to a Windows PC running Simple Kinect Touch. This software processes the input from the Kinect and sends TUIO commands to a Galaxy Nexus running TuioForAndroid. These events get injected into the OS as touch events allowing control over any application. The projector is connected to the Galaxy Nexus with a MHL adapter.

In order to give  TuioForAndroid system access I had to download the AOSP source tree and compile a rom for my Galaxy Nexus.  TuioForAndroid must be signed with the System key so that it can get a system pid to inject the touch events into the OS.

Android Kinect Projector Interface

I’ve been playing around with a way to control an Android device that is hooked up to a projector which will make it great for showing off apps in meetings. The setup I’m using consists of a Galaxy Nexus runninng a TUIO client, a Kinect, projector and a MHL adapter. With an AOSP build of Android the TUIO client app can be signed with the system keys to allow TUIO events across all of Android and not just limited to the TUIO client app.

Watch this video on YouTube.