Forking Robolectric

I wanted to fork out Robolectric's Android sample test project as a starting point to writing my own unit tests which can run on JVM. Here are the steps I took :


Step-1: Click on "Fork" to create a fork on github for Robolectric.git 
Step-2: Clone your fork in your local machine:
git clone https://github.com/<user>/RobolectricSample.git
Step-3:  cd RobolectricSample/
Step-4: To keep track of original repository, add upstream
git remote add upstream https://github.com/pivotal/RobolectricSample.git
Note: You can bring original repository's changes in your working space by this command:
git fetch upstream
Merge changes from upstream (original repo) into your forked repo:
git merge upstream/master
Step-5: Pushing changes to forked repo:
git push origin master


Quick guide to set up Git on Mac-OSX

There is plenty of information available online about setting up Git on Mac. Here are the steps I followed to setup git on my brand new macbook.

Step 1: Install Git from here. At the time of writing, the latest Git's version is 1.8.2.
Step 2: Double click the .dmg file and follow the installer.
Step 3: Open a new terminal. Yes ! its important to open up a new one. git command may not be available in the old one.
Step 4: Configure your git !

Configuring Git

  • Configuring Username
git config --global user.name "Your Name"
  • Configuring Email
git config --global user.email "Your email"


If you're not very comfortable with command line, then you can use UI "GitHub for Mac" to do all tedious job for you. There are more Git Clients available to try!

Dealing with Java Hell using JarJar life boat

Okay, so I wanted to use Hex.encodeHexString method from org.apache.commons.codec.binary.Hex (commons-codec-1.6.jar)library to generate encoded singnature. I was able to do this in plain Java, but not in Android. I googled for a while and found out this ticket about Android not supporting the latest versions of commons-codec-1.6.jar.The solutions was to use magical "jarjar" ! But How ??? Again, I googled and come across this and this, and I came up with solution to solve mystery of using  Hex.encodeHexString method in code running on Android (Dalvik VM). Android uses old version of commons-codec jar which doesn't define org.apache.commons.codec.binary.Hex.encodeHexString method signature. Even if you add new commons-codec-1.6.jar to build path of project, code will try to refer to built-in commons-codec not the new one that you added in build path. But, if you change the package name/namespaces for commons-codec-1.6.jar, then you can easily reference from your code and finally can use Hex.encodeHexString. So, you have to create a custom jar with modified package name structure.

Here is how you can spin a new custom jar, say
commons-codec-1.6-jarjar.jar:

Step-1: Create a build.xml like follows:
<project name="generate-jarjar">
    <property name="jarjarfile" value="commons-codec-1.6-jarjar.jar"/>
    <path id="classpath">
      <pathelement location="jarjar-1.4.jar"/>
      <pathelement location="asm-2.2.3.jar"/>
    </path>
    <taskdef name="jarjar" classname="com.tonicsystems.jarjar.JarJarTask"   classpathref="classpath"/>
    <delete file="${jarjarfile}"/>
    <jarjar destfile="${jarjarfile}">
    <zipfileset src="commons-codec-1.6.jar"/>
    <rule pattern="org.apache.**" result="org.jarjar.apache.@1"/>
    </jarjar>
</project>
Step-2: Run command "ant" from command line. This build script will generate a new jar  commons-codec-1.6-jarjar.jar, which you can add in your build path and use this new jar to import from.

You can download all the files mentioned in above script and build.xml from here.








Scheduling Repeating Local Notifications using Alarm Manager

Learn about Scheduling Repeating Local Notifications using Alarm Manager in this post .