A simple injection library for Android. Uses the Android resources qualification mechanism to create concrete instances.
Switch branches/tags
Nothing to show
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Failed to load latest commit information.
gradle/wrapper
src/main
.gitignore
README.md
build.gradle
gradlew
gradlew.bat
settings.gradle
shippable.yml

README.md

#FrankenRobot#

Build Status

A simple injection library for Android: uses Android resources qualification mechanism to map interfaces to concrete implementations.
FrankenRobot takes two string-array resources; one of canonical interface names, and the second of canonical concrete implementations.
You can specify a different implementation for every imaginable resource qualifier (be it API level, screen-size, locale, etc.), and FrankenRobot will instantize the most appropriate implementation using Android's resource qualifier mechanism.

##How To Use##

Dependency

I'm using JitPack to publish this library.

Add it in your build.gradle at the end of repositories:

repositories {
    //...
    maven { url "https://jitpack.io" }
}

Step 2. Add the dependency in the form

dependencies {
    compile 'com.github.menny:FrankenRobot:1.1.5'
}

Usage

This is how AnySoftKeyboard uses FrankenRobot: Create two string-array resources in the res/values folder (say, in a designated frankenrobot.xml file):
One for the interfaces definition

<string-array name="frankenrobot_interfaces">
    <item>com.anysoftkeyboard.devicespecific.DeviceSpecific</item>
</string-array>

And another string-array resource for the concrete implementations

<string-array name="frankenrobot_concreate_classes">
    <item>@string/frankenrobot_device_specific_implementation</item>
</string-array>

Specify the concrete implementation class name, first in the res/values folder:

<string name="frankenrobot_device_specific_implementation">com.anysoftkeyboard.devicespecific.DeviceSpecific_V3</string>

Where special implemenations are needed:
In the res/values-v5 folder:

<string name="frankenrobot_device_specific_implementation">com.anysoftkeyboard.devicespecific.DeviceSpecific_V5</string>

In the res/values-v7 folder:

<string name="frankenrobot_device_specific_implementation">com.anysoftkeyboard.devicespecific.DeviceSpecific_V7</string>

Etc.

Initialize FrankenRobot, and embody the interface

FrankenRobot frank = Lab.build(getApplicationContext(),
        R.array.frankenrobot_interfaces,
        R.array.frankenrobot_concreate_classes);
//using a diagram to create the monster
DeviceSpecific deviceSpecific = frank.embody(new FrankenRobot.Diagram<DeviceSpecific>(){});

It is guaranteed that the returned instance is the most suitable, based on the qualifier rules.
AnySoftKeyboard achives impressive backword compatibility using this method, using API-level-bound implementations, with no complex coding, and no reflection.