// Path: drodrolib/src/main/java/org/michenux/drodrolib/MCXApplication.java
// public class MCXApplication extends MultiDexApplication {
//     public static final String LOG_TAG = "MCX";
// 
//     private ObjectGraph objectGraph;
// 
//     public void inject(Activity activity) {
//         getObjectGraph().inject(activity);
//     }
// 
//     public void inject(ContentProvider contentProvider) {
//         getObjectGraph().inject(contentProvider);
//     }
// 
//     public void inject(Fragment fragment) {
//         getObjectGraph().inject(fragment);
//     }
// 
//     public void inject(AbstractThreadedSyncAdapter fragment) {
//         getObjectGraph().inject(fragment);
//     }
// 
//     public void injectSelf() {
//         getObjectGraph().inject(this);
//     }
// 
//     public synchronized ObjectGraph getObjectGraph() {
//         if (objectGraph == null) {
//             List<Object> modules = new ArrayList<>();
//             buildDaggerModules(modules);
//             this.objectGraph = ObjectGraph.create(modules.toArray());
//             onObjectGraphCreated(this.objectGraph);
//         }
//         return objectGraph;
//     }
// 
//     public void buildDaggerModules(List<Object> modules) {
//         modules.add(new MCXModule());
//     }
// 
//     public void onObjectGraphCreated(ObjectGraph objectGraph) {
//     }
// 
//     public static MCXApplication getRealApplication(Context applicationContext) {
//         MCXApplication application = null;
// 
//         if (applicationContext instanceof MCXApplication) {
//             application = (MCXApplication) applicationContext;
//         } else {
//             Application realApplication = null;
//             Field magicField = null;
//             try {
//                 magicField = applicationContext.getClass().getDeclaredField("realApplication");
//                 magicField.setAccessible(true);
//                 realApplication = (Application) magicField.get(applicationContext);
//             } catch (NoSuchFieldException e) {
//                 Log.e(LOG_TAG, e.getMessage(), e);
//             } catch (IllegalAccessException e) {
//                 Log.e(LOG_TAG, e.getMessage(), e);
//             }
// 
//             application = (MCXApplication) realApplication;
//         }
// 
//         return application;
//     }
// }
// 
// Path: drodrolib/src/main/java/org/michenux/drodrolib/db/sqlite/SQLiteDatabaseFactory.java
// @Singleton
// public class SQLiteDatabaseFactory {
//     /**
//      * SQLite Open Helper
//      */
//     private SQLiteDatabaseHelper helper;
// 
//     /**
//      * SQLite Database
//      */
//     private SQLiteDatabase database;
// 
//     @Inject
//     public SQLiteDatabaseFactory() {
//     }
// 
//     /**
//      * @throws NameNotFoundException
//      */
//     public void init(Context context, boolean writable, boolean enableFK) throws NameNotFoundException {
//         this.helper = new SQLiteDatabaseHelper(context, "database", null,
//                 VersionUtils.getVersionCode(context));
//         // open and close database to init database (creation/upgrade)
//         if (writable) {
//             this.database = this.helper.getWritableDatabase();
//             if (enableFK) {
//                 this.database.execSQL("PRAGMA foreign_keys = ON");
//             }
//         } else {
//             this.database = this.helper.getReadableDatabase();
//         }
//     }
// 
//     /**
//      * @return
//      */
//     public SQLiteDatabase getDatabase() {
//         return this.database;
//     }
// 
//     @Override
//     protected void finalize() throws Throwable {
//         super.finalize();
//         if (this.database != null && this.database.isOpen()) {
//             this.database.close();
//         }
//     }
// 
//     /**
//      *
//      */
//     public void closeDatabase() {
//         this.database.close();
//     }
// }


import android.content.ContentProvider;
import android.content.ContentValues;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteQueryBuilder;
import android.net.Uri;
import android.text.TextUtils;
import org.michenux.drodrolib.MCXApplication;
import org.michenux.drodrolib.db.sqlite.SQLiteDatabaseFactory;
import javax.inject.Inject;
        switch (uriType) {
            case LIST:
                id = sqlDB.insert(mTableName, null, values);
                break;
            default:
                throw new IllegalArgumentException("Unknown URI: " + uri);
        }
        getContext().getContentResolver().notifyChange(uri, null);
        return Uri.parse(mBasePath + "/" + id);
    }

    @Override
    public int update(Uri uri, ContentValues values, String selection,
                      String[] selectionArgs) {
        int uriType = mUriMatcher.match(uri);
        SQLiteDatabase sqlDB = this.sqliteDatabaseFactory.getDatabase();
        int rowsUpdated;
        switch (uriType) {
            case LIST:
                rowsUpdated = sqlDB.update(mTableName, values, selection,
                        selectionArgs);
                break;
            case ITEM_ID:
                String id = uri.getLastPathSegment();
                if (TextUtils.isEmpty(selection)) {
                    rowsUpdated = sqlDB.update(mTableName, values,
                            ID_COLUMN + "=" + id, null);
                } else {
                    rowsUpdated = sqlDB.update(mTableName, values,
                            ID_COLUMN + "=" + id + " and " + selection,
// Path: drodrolib/src/main/java/org/michenux/drodrolib/MCXApplication.java
// public class MCXApplication extends MultiDexApplication {
//     public static final String LOG_TAG = "MCX";
// 
//     private ObjectGraph objectGraph;
// 
//     public void inject(Activity activity) {
//         getObjectGraph().inject(activity);
//     }
// 
//     public void inject(ContentProvider contentProvider) {
//         getObjectGraph().inject(contentProvider);
//     }
// 
//     public void inject(Fragment fragment) {
//         getObjectGraph().inject(fragment);
//     }
// 
//     public void inject(AbstractThreadedSyncAdapter fragment) {
//         getObjectGraph().inject(fragment);
//     }
// 
//     public void injectSelf() {
//         getObjectGraph().inject(this);
//     }
// 
//     public synchronized ObjectGraph getObjectGraph() {
//         if (objectGraph == null) {
//             List<Object> modules = new ArrayList<>();
//             buildDaggerModules(modules);
//             this.objectGraph = ObjectGraph.create(modules.toArray());
//             onObjectGraphCreated(this.objectGraph);
//         }
//         return objectGraph;
//     }
// 
//     public void buildDaggerModules(List<Object> modules) {
//         modules.add(new MCXModule());
//     }
// 
//     public void onObjectGraphCreated(ObjectGraph objectGraph) {
//     }
// 
//     public static MCXApplication getRealApplication(Context applicationContext) {
//         MCXApplication application = null;
// 
//         if (applicationContext instanceof MCXApplication) {
//             application = (MCXApplication) applicationContext;
//         } else {
//             Application realApplication = null;
//             Field magicField = null;
//             try {
//                 magicField = applicationContext.getClass().getDeclaredField("realApplication");
//                 magicField.setAccessible(true);
//                 realApplication = (Application) magicField.get(applicationContext);
//             } catch (NoSuchFieldException e) {
//                 Log.e(LOG_TAG, e.getMessage(), e);
//             } catch (IllegalAccessException e) {
//                 Log.e(LOG_TAG, e.getMessage(), e);
//             }
// 
//             application = (MCXApplication) realApplication;
//         }
// 
//         return application;
//     }
// }
// 
// Path: drodrolib/src/main/java/org/michenux/drodrolib/db/sqlite/SQLiteDatabaseFactory.java
// @Singleton
// public class SQLiteDatabaseFactory {
//     /**
//      * SQLite Open Helper
//      */
//     private SQLiteDatabaseHelper helper;
// 
//     /**
//      * SQLite Database
//      */
//     private SQLiteDatabase database;
// 
//     @Inject
//     public SQLiteDatabaseFactory() {
//     }
// 
//     /**
//      * @throws NameNotFoundException
//      */
//     public void init(Context context, boolean writable, boolean enableFK) throws NameNotFoundException {
//         this.helper = new SQLiteDatabaseHelper(context, "database", null,
//                 VersionUtils.getVersionCode(context));
//         // open and close database to init database (creation/upgrade)
//         if (writable) {
//             this.database = this.helper.getWritableDatabase();
//             if (enableFK) {
//                 this.database.execSQL("PRAGMA foreign_keys = ON");
//             }
//         } else {
//             this.database = this.helper.getReadableDatabase();
//         }
//     }
// 
//     /**
//      * @return
//      */
//     public SQLiteDatabase getDatabase() {
//         return this.database;
//     }
// 
//     @Override
//     protected void finalize() throws Throwable {
//         super.finalize();
//         if (this.database != null && this.database.isOpen()) {
//             this.database.close();
//         }
//     }
// 
//     /**
//      *
//      */
//     public void closeDatabase() {
//         this.database.close();
//     }
// }


// Path: drodrolib/src/main/java/org/michenux/drodrolib/db/AbstractContentProvider.java
import android.content.ContentProvider;
import android.content.ContentValues;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteQueryBuilder;
import android.net.Uri;
import android.text.TextUtils;
import org.michenux.drodrolib.MCXApplication;
import org.michenux.drodrolib.db.sqlite.SQLiteDatabaseFactory;
import javax.inject.Inject;

        switch (uriType) {
            case LIST:
                id = sqlDB.insert(mTableName, null, values);
                break;
            default:
                throw new IllegalArgumentException("Unknown URI: " + uri);
        }
        getContext().getContentResolver().notifyChange(uri, null);
        return Uri.parse(mBasePath + "/" + id);
    }

    @Override
    public int update(Uri uri, ContentValues values, String selection,
                      String[] selectionArgs) {
        int uriType = mUriMatcher.match(uri);
        SQLiteDatabase sqlDB = this.sqliteDatabaseFactory.getDatabase();
        int rowsUpdated;
        switch (uriType) {
            case LIST:
                rowsUpdated = sqlDB.update(mTableName, values, selection,
                        selectionArgs);
                break;
            case ITEM_ID:
                String id = uri.getLastPathSegment();
                if (TextUtils.isEmpty(selection)) {
                    rowsUpdated = sqlDB.update(mTableName, values,
                            ID_COLUMN + "=" + id, null);
                } else {
                    rowsUpdated = sqlDB.update(mTableName, values,
                            ID_COLUMN + "=" + id + " and " + selection,
                            selectionArgs);