Sunday, July 10, 2016

Recovering HTC One A9 from boot loop.

I followed these steps to install CM 13 on an HTC One A9 phone, but the phone ended up in a boot loop. Asking for help in G+ CyanogenMod community and CyanogenMod forum didn't produce any response, and I decided to try re-installing an official system image from HTC.

I downloaded HTC RUU utility (Unlocked/Developer HTC One A9).  Unfortunately, the utility would not detect my phone because it thought there was no USB connection with it.   The phone was unlocked at this point.  I re-locked the phone back and re-run RUU utility, but result was the same - no USB connection.  This was strange because when I booted the phone to recovery mode (TWRP), I could connect to the phone using adb utility without problems.  As it turned out later, there was no need to re-lock the phone, the process would also work for an unlocked phone.

The problem was that Android boot loader interface was not installed on my PC.  When I rebooted the phone to boot loader mode, fastboot utility could not recognize it and would display a message "waiting for any device".  To fix this error, I followed these steps to install boot loader interface on the PC.

After installing boot loader interface and rebooting the phone to boot loader mode, HTC RUU utility was able to recognize the phone.  But it started to complain that the phone's battery was charged below 30%, even though the battery was fully charged.  The key here is instead of staying in boot loader mode, the phone needs to be rebooted to download mode.  Make sure that after rebooting the boot loader interface is still available.  If not, repeat these steps again to bring boot loader interface back.

Finally, having the phone in download mode, I started the recovery process.  Everything was going fine until the utility rebooted the phone from download mode to boot loader mode at the beginning of the process.  At this point HTC RUU failed.  I tried to go through the recovery steps offered by the utility with no luck.

Finally I figured out what was going on.  After HTC RUU rebooted the phone, boot loader interface disappeared from my PC.  I had to open the Windows device manager and carefully watch the state of the boot loader interface driver.  When HTC RUU utility rebooted the phone, I could see that the boot loader interface was gone.  At this point, while HTC RUU was trying to re-connect to the phone, I quickly repeated these steps again. Right in the middle of the recovery process.  As soon as the driver was re-installed, HTC RUU recognized my phone and continued the installation process.  After several trial and error attempts and going through recovery process offered by HTC RUU, the utility correctly installed the official system image from HTC.

A few words about recovery process: the instructions displayed by HTC RUU did not work for HTC One A9.  There is no way to take out the battery, and pressing power button for 10 seconds or more did not power the phone down.  To power the phone down, I had to reconnect it to the PC and run fastboot reboot bootloader command.  After getting to the boot loader menu there was an option to power the phone down.

Now I have the phone back.   I'm going to give CM 13 another try.  Hopefully this time the installation will be successful.  If not, at least I know how to recover the phone to its original state.

I hope this information will be helpful to someone who runs into similar issues.

Saturday, July 9, 2016

GQL Parser 1.1.0

Version 1.1.0 is now available on github and bintray.  It is a breaking change were Series interface was renamed to Sequence because the new name better reflects the purpose of the interface.

Including in Gradle build file

buildscript {
    repositories {
        jcenter()
    }
}

dependencies {
    compile 'mobi.tjorn.parsers:gql:1.1.0'
}

Monday, June 20, 2016

GQL Parser 1.0.1

The first release of GQL Parser was compiled with Java 8 which made it impossible to include in Android projects unless the project was using buildToolsVersion 24.

A version 1.0.1 is now available on github and bintray.  It is compiled with Java 7 and does not require buildToolsVersion 24 when included in Android projects.

Including in Gradle build file

buildscript {
    repositories {
        jcenter()
    }
}

dependencies {
    compile 'mobi.tjorn.parsers:gql:1.0.1'
}

Sunday, June 19, 2016

GQL Parser is available

First release of GQL Parser library is available on github and bintray.


Including in Gradle build file


buildscript {
    repositories {
        jcenter()
    }
}

dependencies {
    compile 'mobi.tjorn.parsers:gql:1.0.0'
}

The above will include classes, sources and API docs.  For more details visit the project's github page.

Monday, April 18, 2016

Right recursion in JavaCC

Being LL(k) parser generator, JavaCC does not support left recursion and productions like

A ->  a | Ax

need to be converted to 

A -> a (x)*

Apparently, right recursion also requires some care.  Suppose we need to implement a right-associative operator = to parse strings like a=b=c=d:

right -> letter = right | letter
letter -> ["a"-"z"]

Simple JavaCC grammar, like below, would not work.

SKIP :
{
  " "
| "\t"
| "\n"
| "\r"
| "\f"
}

TOKEN [IGNORE_CASE] :
{
    <EQ: "=">
  | <LETTER: ["a"-"z"]>
}

public void Right() :
{}
{
    <LETTER> <EQ> Right() | <LETTER>
}

Compiling generated Java code would produce an error:

Error:(29, 12) error: unreachable statement

try {
  switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
  case LETTER:{
    jj_consume_token(LETTER);
    jj_consume_token(EQ);
    Right();
    break;
    }{
    jj_consume_token(LETTER);
    break;
    }
  default:
    jj_la1[0] = jj_gen;
    jj_consume_token(-1);
    throw new ParseException();

}

Adding a LOOKAHEAD at the first choice point fixes the problem:

public void Right() :
{}
{
    LOOKAHEAD(2) <LETTER> <EQ> Right() | <LETTER>

}

Usually JavaCC issues a warning about choice conflict involving two expansions, but not in this case.

Sunday, February 14, 2016

Loaders 1.0.0

First release of Loaders library is now available on github and bintray.

Including in Android Studio/Gradle

buildscript {
    repositories {
        jcenter()
    }
}

dependencies {
    compile 'mobi.tjorn.content:loaders:1.0.0'
}

The above will include classes, sources and API docs.  For more details visit the project's github page.

Saturday, January 2, 2016

Creating a bootable USB stick on OSX

Good instructions on how to create a bootable USB stick on OSX.  Just pay attention to how a raw disk /dev/rdiskN is used in step 8 instead of a regular disk /dev/diskN that is used in all other steps.  After following these instructions I was able to install Ubuntu 15.10 on an old Dell Latitude E6410 without any problem.