Sunday, April 17, 2016

A blast from my past...

An old colleague of mine (he is in the video) posted this to FB.

Many moons ago, I was the Technical Product Manager for MKS Internet Anywhere...



Thanks Sean!

Monday, April 11, 2016

So, ever since moving from Eclipse to Android Studio, I've been annoyed by the fact that importing an old project copies all the libraries under the project directory. This makes sharing libraries a bit more difficult, since you now need to manage them in two locations.

Apparently Gradle likes dependencies is under its root, for example:
Project
  |--build.gradle
  |--settings.gradle
  |--Dependency
  |    |--build.gradle
Now in most of my cases, I have my libraries as separate projects that I DO NOT want located under the app's root. So today, I finally got off my ass to figure out how to do that. (Yes, I've been very lazy about this)

The fix it turns out is rather simple. To achieve a directory structure like this:
Project
  |--build.gradle
  |--settings.gradle
Dependency
  |--build.gradle

In the project/settings.gradle, add the following:
include ':Dependency'
project(':Dependency').projectDir = new File(settingsDir, '../Dependency/module_build_gradle_location')
If you've just finished an import, you can now manually delete the imported module and rebuild the project.

Thursday, April 7, 2016

ActivityCompat.requestPermissions : Can only use lower 8 bits for requestCode

So, my latest got'cha is that ActivityCompat.requestPermissions forces you to use a value between 0 and 255. The android developers are playing tricks with the result code, thus restricting you to this range. Now, it would be nice if this was documented in the online ActivityCompat documentation, since this is going to be rarely hit in testing.

Documenting the findings for future reference:
The following are code from android.support.v4.app.FragmentActivity
 /**
 * Modifies the standard behavior to allow results to be delivered to fragments.
 * This imposes a restriction that requestCode be <= 0xffff.
 */
@Override
public void startActivityForResult(Intent intent, int requestCode) {
    if (requestCode != -1 && (requestCode&0xffff0000) != 0) {
        throw new IllegalArgumentException("Can only use lower 16 bits for requestCode");
    }
    super.startActivityForResult(intent, requestCode);
}

@Override
public final void validateRequestPermissionsRequestCode(int requestCode) {
    // We use 8 bits of the request code to encode the fragment id when
    // requesting permissions from a fragment. Hence, requestPermissions()
    // should validate the code against that but we cannot override it as
    // we can not then call super and also the ActivityCompat would call
    // back to this override. To handle this we use dependency inversion
    // where we are the validator of request codes when requesting
    // permissions in ActivityCompat.
    if (mRequestedPermissionsFromFragment) {
        mRequestedPermissionsFromFragment = false;
    } else if ((requestCode & 0xffffff00) != 0) {
        throw new IllegalArgumentException("Can only use lower 8 bits for requestCode");
    }
}

RANGE
startActivityForResult() in FragmentActivity requires the requestCode to be of 16 bits, meaning the range is from 0 to 65535.
Also, validateRequestPermissionsRequestCode in FragmentActivity requires requestCode to be of 8 bits, meaning the range is from 0 to 255.

see: http://stackoverflow.com/questions/33331073/android-what-to-choose-for-requestcode-values