2011-05-20

Fixing GeekYouUp's Battery Widget

tl;dnr

GeekYouUp's Battery Widget for Android can be altered to reduce App Widget display update occurrences by as much as 40-65% (depending on device power use rate), without altering application functionality or otherwise hindering its ability to display the current battery charge level. Battery Widget's constantly running service, necessary for real-time monitoring of battery charge level changes, appears to use negligible resources and does not noticeably prematurely drain battery power.
Link To This ArticleQR Code Link To This Articlehttp://goo.gl/mscyj

Following are links to the code of the fixed version of Battery Widget, logs of the svn differences showing what was changed from the original code, and a fully-built Android APK, ready to be installed on any Android device. This APK was built with a different package name, a different application name, and a different digital signature than the Battery Widget application by GeekYouUp. It can be installed in parallel with the original -- it does not replace the original Battery Widget application during installation.

For Those With Interest In The Details...

2011-04-26

A Simple, Complete App Widget - Part 1

Note: This blog post is incomplete, and I discontinued posting part 2, as the Widget API and abilities were changing significantly with new releases of Android, at the time of writing. I left this post online, as it has many views, and some useful content.

While information on developing App Widgets for the Android home screen is plentiful, much of what's available - including the contents of many books on Android software development - is incomplete, often broken, and leads to improperly functioning App Widgets. One all too common outcome is App Widgets that unnecessarily run users' batteries down. Another frequent fail includes funky App Widget behavior if more than one instance exists on a user's home screen. This post is intended to provide a complete blueprint for folks to follow, to develop their own App Widgets that display dynamic content while consuming minimal device resources, provide standard user input controls, and otherwise work correctly as expected.
Link To This ArticleQR Code Link To This Articlehttp://goo.gl/RN1ga

2011-04-10

Android Widget Design Guidelines - Widget Sizes

While the Android Widget Design Guidelines do clearly list the bounding box dimensions for widgets, they don't list recommended dimensions for the outer frame or the inner edge box. The following apparent recommendations were extracted from the standard widget frames Photo$hop files they provided for download.

Portrait Mode
4 x 13 x 32 x 2
Bounding Box:320 x 100240 x 300160 x 200
Outer Frame with Shadow:304 x 75224 x 272144 x 189
Inner Edge Box:287 x 58207 x 256129 x 174

Landscape Mode
4 x 13 x 32 x 2
Bounding Box:424 x 74318 x 222212 x 148
Outer Frame with Shadow:412 x 63305 x 200199 x 136
Inner Edge Box:395 x 46288 x 182184 x 121


Unfortunately, these dimensions don't all nest with even spacings. For example, the portrait-mode inner edge box has a width of 207, which leaves 33 pixels of padding to split between the left and right sides, but 33 is an odd number, and we cannot split a pixel in half, so one is left to decide what to do with an extra pixel. My solution is to simply shrink the inner edge box width to 206 pixels.

Of course, different screens will actually use different numbers of pixels both horizontally and vertically (depending on actual screen sizes and pixel densities). For this reason, and to have smaller graphics file sizes, as the guidelines suggest, use 9-patch graphics, but note that scaled graphics might be fuzzy in appearance, and it may be necessary to create LDPI, MDPI and HDPI versions of widget graphics.

For Paint.NET, I made simple templates for the six standard widget sizes. Download and enjoy. (I'm using the term "template" loosely. These templates simply have three layers each with outlined boxes matching the dimensions described above.)
Link To This ArticleQR Code Link To This Articlehttp://goo.gl/C13Nx

2011-03-24

Corrections for Android Tutorial "Hello, Views > Spinner"

The Android Developer's guide (available at http://developer.android.com/guide/index.html) is an excellent resource for folks looking to develop Android applications. Of course, as is much technical documentation, it's infected with code bugs and errors.

In particular, this post lists errors in the "Hello, Views > Spinner" tutorial, available at http://developer.android.com/resources/tutorials/views/hello-spinner.html, and includes step-by-step corrections for these problems. This information was communicated to the Android development team in Android Issue 12817.
Link To This ArticleQR Code Link To This Articlehttp://goo.gl/P408h

2011-03-22

Android Protector OWNED Easy as 1, 2, 3!

Not content with the original password protection of Android 2.2 on my T-Mobile G2, I went searching through the Android Market for other solutions. Amongst the adware and other junkware I stumbled across Android Protector v3.3.1 by Alexander Kosenkov, which looked promising. So, I decided to give it a try, installed it, and set about seeing if it did what it claimed to do, and whether it was easy to defeat.
Link To This ArticleQR Code Link To This Articlehttp://goo.gl/u0NZK

The basis of the revolutionary and disruptive approach I took to break Protector stems from playing a lot of video games growing up. If there's one thing I learned during all those precious hours of youth spent in front of the TV with a game controller in hand, it was to TRY AGAIN. When Mario died because I didn't jump far enough, I just tried again. When Mike Tyson KO'd me before I got him, I just tried again. When those re-attempts failed, I just tried again.

Applying this life lesson to TRY AGAIN to attempting to defeat Android Protector proved useful. I was able to bypass Android Protector's security measures less than three minutes after installing and using it for the first time.

The steps to do so are simple:
  1. After installing and configuring Protector, restart the Android phone so the application is enabled, then search for the application in the Android Market, and select it in the search results listing. At this point, Protector covers the screen with a security code input box, otherwise preventing access to the Android Market screen beneath it. Just use the back arrow to return to the home screen.
  2. Launch the Android Market application, again. The Market app should try to immediately return you to viewing the Protector application listing, but of course, Protector should again cover the screen with the security code input box. After it does, just press the back arrow to return to the home screen.
  3. Launch the Android Market application, again. Amazingly, the Market app displays the Protector application listing and Protector does not cover the screen with the security code input box. Press the link to Uninstall Protector. Protector is thus defeated without ever needing to input the security code.
Android Protector OWNED!

A short video of these steps in action is available on YouTube.



What have you OWNED today?

HOWTO: Install T-Mobile G2 USB Driver

While Googling for G2 USB driver does currently lead to some pages that list working instructions for installing the driver on M$ Windows machines to connect to a T-Mobile G2 Android phone through USB with adb, many of the search results were not useful, and this post is small contribution to help direct folks to a solution. (Plus, who knows what will happen to the info pages at tmobile.com, with AT&T acquiring T-Mobile.)
Link To This ArticleQR Code Link To This Articlehttp://goo.gl/leNAj

After installing the Android SDK, and selecting to install the latest Google USB Driver package with the SDK and AVD Manager, edit the android_winusb.inf file, located in the directory where the Google USB drivers installed (which currently is android-sdk/extras/google/usb_driver), and paste in the following three lines, at the end of the sections labeled "[Google.NTx86]" and "[Google.NTamd64]".
;T-Mobile G2
%SingleAdbInterface% = USB_Install, USB\VID_0BB4&PID_0C91
%CompositeAdbInterface% = USB_Install, USB\VID_0BB4&PID_0C91&MI_01
Then, connect the G2 to the computer with a USB cable, ensure the phone is in debug mode, and follow the remaining instructions at http://developer.android.com/sdk/win-usb.html

Note that it's sometimes necessary to repeat this process after downloading and updating the Google USB Driver package, as the updates can clear out the previous custom configuration changes.

2011-03-12

HOWTO: Clone VirtualBox VM (from existing Hard Disk) and Change the UUID

Currently, Google searching for information on how to clone VirtualBox Virtual Machines or how to move a VirtualBox VM (to a new host directory, host disk, or host machine) leads to a lot of folks stuck with cloning failures, apparent dead ends, outdated information, and VirtualBox features that don't seem to work correctly. While poking around enough leads to working solutions, this blog post is a small contribution to help direct folks towards success.
Link To This ArticleQR Code Link To This Articlehttp://goo.gl/BOiD6

Note: These steps work for me running VirtualBox 4.0.4 r70112 (and with the latest 4.0.6 r71416), on Windows 7 Home Premium x64 SR1. I am new to using VirtualBox and my experience level is yet introductory. Also, the information provided here is listed elsewhere on the internet, and is probably somewhere in the VirtualBox documentation.

Without further ado, to copy a flat (i.e., without snapshots) virtual machine, with the VM not running (i.e., stopped), follow these three steps:
  1. First, create a copy of the VDI file, using Windows Explorer or a simple copy command: copy abc.vdi def.vdi
  2. Then, change the UUID of the new VDI file with the command VBoxManage.exe internalcommands sethduuid def.vdi
  3. And finally, from within the VirtualBox Manager, create a new Virtual Machine, selecting to use the new VDI as an existing Hard Disk.

To simply move the location of an existing VDI file on the host, or to copy or move the VDI file to another host, it does work to delete the VM within the VirtualBox Manager, without actually deleting the VDI file on the host file system (obviously, deleting the VM on the current host is not necessary if moving to a new host), move the VDI file to the new location, and then create a new VM, selecting to use the moved VDI file as an existing Hard Disk.

Alternatively, to move the VDI file on the host without deleting the existing VM, close the VirtualBox Manager and shut down all VM instances. (Shutting down the VMs not associated to the move might not be necessary.) Then, edit *all* of the file paths in the .vbox file associated with the VM to be moved. By default, the .vbox file is in a subdirectory in the host user's home directory (e.g., C:\Users\User1). The .vbox file name should match the name of the VDI file, and be in a subdirectory with a name that also matches the name of the VDI file. The .vbox file is a simple text XML file, easily edited in Windows Notepad. Finally, start the VirtualBox Manager, select the newly moved VM, which should still be listed on the left side, where all of the VMs are listed, and start it.

Note that changing the UUID of the VDI file is not necessary, when simply moving it.