From 49809565715d1654b42430be546c12c50ab187ef Mon Sep 17 00:00:00 2001 From: Sergei Dryganets Date: Tue, 21 Jun 2016 12:54:48 -0700 Subject: [PATCH 1/3] to allow background data processing in particular push notification payload persist scenario we need to have storage package decoupled from activity --- .../main/java/io/liteglue/SQLitePlugin.java | 70 ++++--------------- .../java/io/liteglue/SQLitePluginPackage.java | 10 +-- 2 files changed, 14 insertions(+), 66 deletions(-) diff --git a/src/android-native/src/main/java/io/liteglue/SQLitePlugin.java b/src/android-native/src/main/java/io/liteglue/SQLitePlugin.java index 92961379..c4bdf1a1 100755 --- a/src/android-native/src/main/java/io/liteglue/SQLitePlugin.java +++ b/src/android-native/src/main/java/io/liteglue/SQLitePlugin.java @@ -37,7 +37,7 @@ import java.io.OutputStream; import java.io.IOException; -public class SQLitePlugin extends ReactContextBaseJavaModule implements Application.ActivityLifecycleCallbacks { +public class SQLitePlugin extends ReactContextBaseJavaModule { /** * Multiple database runner map (static). @@ -52,14 +52,12 @@ public class SQLitePlugin extends ReactContextBaseJavaModule implements Applicat static SQLiteConnector connector = new SQLiteConnector(); static String LOG_TAG = SQLitePlugin.class.getSimpleName(); - - protected Activity activity = null; protected ExecutorService threadPool; + private Context context; - public SQLitePlugin(ReactApplicationContext reactContext, Activity activity) { + public SQLitePlugin(ReactApplicationContext reactContext) { super(reactContext); - this.activity = activity; - this.activity.getApplication().registerActivityLifecycleCallbacks(this); + this.context = reactContext.getApplicationContext(); this.threadPool = Executors.newCachedThreadPool(); } @@ -147,54 +145,10 @@ protected ExecutorService getThreadPool(){ return this.threadPool; } - protected Activity getActivity(){ - return this.activity; - } - - @Override - public void onActivityCreated(Activity activity, Bundle savedInstanceState) { - - } - - @Override - public void onActivityStarted(Activity activity) { - - } - - @Override - public void onActivityResumed(Activity activity) { - + protected Context getContext(){ + return this.context; } - @Override - public void onActivityPaused(Activity activity) { - - } - - @Override - public void onActivityStopped(Activity activity) { - - } - - @Override - public void onActivitySaveInstanceState(Activity activity, Bundle outState) { - - } - - /** - * If activity matche linked Activity of this plugin, all open databases are closed. - * - * @param activity - */ - @Override - public void onActivityDestroyed(Activity activity) { - Activity myActivity = this.getActivity(); - if (activity == myActivity){ - myActivity.getApplication().unregisterActivityLifecycleCallbacks(this); - Log.d(LOG_TAG, "linked activity destroyed - closing all open databases"); - this.closeAllOpenDatabases(); - } - } /** * Executes the request and returns PluginResult. * @@ -362,14 +316,14 @@ private SQLiteAndroidDatabase openDatabase(String dbname, String assetFilePath, if (assetFilePath != null && assetFilePath.length() > 0) { if (assetFilePath.compareTo("1") == 0) { assetFilePath = "www/" + dbname; - in = this.getActivity().getAssets().open(assetFilePath); + in = this.getContext().getAssets().open(assetFilePath); Log.v("info", "Located pre-populated DB asset in app bundle www subdirectory: " + assetFilePath); } else if (assetFilePath.charAt(0) == '~') { assetFilePath = assetFilePath.startsWith("~/") ? assetFilePath.substring(2) : assetFilePath.substring(1); - in = this.getActivity().getAssets().open(assetFilePath); + in = this.getContext().getAssets().open(assetFilePath); Log.v("info", "Located pre-populated DB asset in app bundle subdirectory: " + assetFilePath); } else { - File filesDir = this.getActivity().getFilesDir(); + File filesDir = this.getContext().getFilesDir(); assetFilePath = assetFilePath.startsWith("/") ? assetFilePath.substring(1) : assetFilePath; File assetFile = new File(filesDir, assetFilePath); in = new FileInputStream(assetFile); @@ -383,7 +337,7 @@ private SQLiteAndroidDatabase openDatabase(String dbname, String assetFilePath, if (dbfile == null) { openFlags = SQLiteOpenFlags.CREATE | SQLiteOpenFlags.READWRITE; - dbfile = this.getActivity().getDatabasePath(dbname); + dbfile = this.getContext().getDatabasePath(dbname); if (!dbfile.exists() && in != null) { Log.v("info", "Copying pre-populated db asset to destination"); @@ -543,10 +497,10 @@ private void deleteDatabase(String dbname, CallbackContext cbc) { * @return true if successful or false if an exception was encountered */ private boolean deleteDatabaseNow(String dbname) { - File dbfile = this.getActivity().getDatabasePath(dbname); + File dbfile = this.getContext().getDatabasePath(dbname); try { - return this.getActivity().deleteDatabase(dbfile.getAbsolutePath()); + return this.getContext().deleteDatabase(dbfile.getAbsolutePath()); } catch (Exception e) { Log.e(LOG_TAG, "couldn't delete database", e); return false; diff --git a/src/android-native/src/main/java/io/liteglue/SQLitePluginPackage.java b/src/android-native/src/main/java/io/liteglue/SQLitePluginPackage.java index 896ef908..e9469041 100644 --- a/src/android-native/src/main/java/io/liteglue/SQLitePluginPackage.java +++ b/src/android-native/src/main/java/io/liteglue/SQLitePluginPackage.java @@ -6,8 +6,6 @@ package io.liteglue; -import android.app.Activity; - import com.facebook.react.ReactPackage; import com.facebook.react.bridge.JavaScriptModule; import com.facebook.react.bridge.NativeModule; @@ -19,19 +17,15 @@ import java.util.List; public class SQLitePluginPackage implements ReactPackage { - private Activity activity = null; - public SQLitePluginPackage(Activity activity){ - this.activity = activity; + public SQLitePluginPackage(){ } @Override public List createNativeModules( ReactApplicationContext reactContext) { List modules = new ArrayList<>(); - - modules.add(new SQLitePlugin(reactContext, activity)); - + modules.add(new SQLitePlugin(reactContext)); return modules; } From eea03f671bc40ce94cdb508bfea60b967563103b Mon Sep 17 00:00:00 2001 From: Sergei Dryganets Date: Tue, 21 Jun 2016 14:23:05 -0700 Subject: [PATCH 2/3] native plugin is decoupled from activity lifecycle as well --- .../main/java/io/liteglue/SQLitePlugin.java | 2 +- .../main/java/org/pgsqlite/SQLitePlugin.java | 70 ++++--------------- 2 files changed, 13 insertions(+), 59 deletions(-) diff --git a/src/android-native/src/main/java/io/liteglue/SQLitePlugin.java b/src/android-native/src/main/java/io/liteglue/SQLitePlugin.java index c4bdf1a1..6dbbc984 100755 --- a/src/android-native/src/main/java/io/liteglue/SQLitePlugin.java +++ b/src/android-native/src/main/java/io/liteglue/SQLitePlugin.java @@ -7,8 +7,8 @@ package io.liteglue; -import android.app.Activity; import android.app.Application; +import android.content.Context; import android.os.Bundle; import android.util.Log; diff --git a/src/android/src/main/java/org/pgsqlite/SQLitePlugin.java b/src/android/src/main/java/org/pgsqlite/SQLitePlugin.java index 8163bb46..7dcee4aa 100755 --- a/src/android/src/main/java/org/pgsqlite/SQLitePlugin.java +++ b/src/android/src/main/java/org/pgsqlite/SQLitePlugin.java @@ -48,7 +48,7 @@ import java.io.IOException; -public class SQLitePlugin extends ReactContextBaseJavaModule implements Application.ActivityLifecycleCallbacks { +public class SQLitePlugin extends ReactContextBaseJavaModules { private static final String PLUGIN_NAME = "SQLite"; @@ -76,62 +76,16 @@ public class SQLitePlugin extends ReactContextBaseJavaModule implements Applicat /** * Linked activity */ - protected Activity activity = null; + protected Context context = null; /** * Thread pool for database operations */ protected ExecutorService threadPool; - @Override - public void onActivityCreated(Activity activity, Bundle savedInstanceState) { - - } - - @Override - public void onActivityStarted(Activity activity) { - - } - - @Override - public void onActivityResumed(Activity activity) { - - } - - @Override - public void onActivityPaused(Activity activity) { - - } - - @Override - public void onActivityStopped(Activity activity) { - - } - - @Override - public void onActivitySaveInstanceState(Activity activity, Bundle outState) { - - } - - /** - * If activity matche linked Activity of this plugin, all open databases are closed. - * - * @param activity - */ - @Override - public void onActivityDestroyed(Activity activity) { - Activity myActivity = this.getActivity(); - if (activity == myActivity){ - myActivity.getApplication().unregisterActivityLifecycleCallbacks(this); - Log.d(LOG_TAG, "linked activity destroyed - closing all open databases"); - this.closeAllOpenDatabases(); - } - } - - public SQLitePlugin(ReactApplicationContext reactContext, Activity activity) { + public SQLitePlugin(ReactApplicationContext reactContext) { super(reactContext); - this.activity = activity; - this.activity.getApplication().registerActivityLifecycleCallbacks(this); + this.context = reactContext.getApplicationContext(); this.threadPool = Executors.newCachedThreadPool(); } @@ -228,8 +182,8 @@ protected ExecutorService getThreadPool(){ * * @return linked activity */ - protected Activity getActivity(){ - return this.activity; + protected Context getContext(){ + return this.context; } /** @@ -416,14 +370,14 @@ private SQLiteDatabase openDatabase(String dbname, String assetFilePath, int ope if (assetFilePath != null && assetFilePath.length() > 0) { if (assetFilePath.compareTo("1") == 0) { assetFilePath = "www/" + dbname; - in = this.getActivity().getAssets().open(assetFilePath); + in = this.getContext().getAssets().open(assetFilePath); Log.v("info", "Located pre-populated DB asset in app bundle www subdirectory: " + assetFilePath); } else if (assetFilePath.charAt(0) == '~') { assetFilePath = assetFilePath.startsWith("~/") ? assetFilePath.substring(2) : assetFilePath.substring(1); - in = this.getActivity().getAssets().open(assetFilePath); + in = this.getContext().getAssets().open(assetFilePath); Log.v("info", "Located pre-populated DB asset in app bundle subdirectory: " + assetFilePath); } else { - File filesDir = this.getActivity().getFilesDir(); + File filesDir = this.getContext().getFilesDir(); assetFilePath = assetFilePath.startsWith("/") ? assetFilePath.substring(1) : assetFilePath; File assetFile = new File(filesDir, assetFilePath); in = new FileInputStream(assetFile); @@ -437,7 +391,7 @@ private SQLiteDatabase openDatabase(String dbname, String assetFilePath, int ope if (dbfile == null) { openFlags = SQLiteDatabase.OPEN_READWRITE | SQLiteDatabase.CREATE_IF_NECESSARY; - dbfile = this.getActivity().getDatabasePath(dbname); + dbfile = this.getContext().getDatabasePath(dbname); if (!dbfile.exists() && in != null) { Log.v("info", "Copying pre-populated db asset to destination"); @@ -587,7 +541,7 @@ private void deleteDatabase(String dbname, CallbackContext cbc) { */ @SuppressLint("NewApi") private boolean deleteDatabaseNow(String dbname) { - File dbfile = this.getActivity().getDatabasePath(dbname); + File dbfile = this.getContext().getDatabasePath(dbname); if (android.os.Build.VERSION.SDK_INT >= 11) { // Use try & catch just in case android.os.Build.VERSION.SDK_INT >= 16 was lying: try { @@ -604,7 +558,7 @@ private boolean deleteDatabaseNow(String dbname) { private boolean deleteDatabasePreHoneycomb(File dbfile) { try { - return this.getActivity().deleteDatabase(dbfile.getAbsolutePath()); + return this.getContext().deleteDatabase(dbfile.getAbsolutePath()); } catch (Exception e) { Log.e(SQLitePlugin.class.getSimpleName(), "couldn't delete database", e); return false; From 1b4227c40e0307bd2007bc39aa8a8b3290610537 Mon Sep 17 00:00:00 2001 From: Sergei Dryganets Date: Mon, 27 Jun 2016 11:29:40 -0700 Subject: [PATCH 3/3] backward incompability iliminated, Activity method is marked as deprecated --- .../src/main/java/io/liteglue/SQLitePlugin.java | 1 - .../main/java/io/liteglue/SQLitePluginPackage.java | 9 +++++++++ .../src/main/java/org/pgsqlite/SQLitePlugin.java | 8 +++----- .../java/org/pgsqlite/SQLitePluginPackage.java | 14 +++++++++----- 4 files changed, 21 insertions(+), 11 deletions(-) diff --git a/src/android-native/src/main/java/io/liteglue/SQLitePlugin.java b/src/android-native/src/main/java/io/liteglue/SQLitePlugin.java index 6dbbc984..4a4d5545 100755 --- a/src/android-native/src/main/java/io/liteglue/SQLitePlugin.java +++ b/src/android-native/src/main/java/io/liteglue/SQLitePlugin.java @@ -7,7 +7,6 @@ package io.liteglue; -import android.app.Application; import android.content.Context; import android.os.Bundle; import android.util.Log; diff --git a/src/android-native/src/main/java/io/liteglue/SQLitePluginPackage.java b/src/android-native/src/main/java/io/liteglue/SQLitePluginPackage.java index e9469041..609c2b42 100644 --- a/src/android-native/src/main/java/io/liteglue/SQLitePluginPackage.java +++ b/src/android-native/src/main/java/io/liteglue/SQLitePluginPackage.java @@ -5,6 +5,7 @@ */ package io.liteglue; +import android.app.Activity; import com.facebook.react.ReactPackage; import com.facebook.react.bridge.JavaScriptModule; @@ -18,6 +19,14 @@ public class SQLitePluginPackage implements ReactPackage { + /** + * @deprecated Please use version without activity parameter + * activity parameter is ignored + */ + public SQLitePluginPackage(Activity activity) { + this(); + } + public SQLitePluginPackage(){ } diff --git a/src/android/src/main/java/org/pgsqlite/SQLitePlugin.java b/src/android/src/main/java/org/pgsqlite/SQLitePlugin.java index 7dcee4aa..54f4a0f3 100755 --- a/src/android/src/main/java/org/pgsqlite/SQLitePlugin.java +++ b/src/android/src/main/java/org/pgsqlite/SQLitePlugin.java @@ -8,14 +8,13 @@ package org.pgsqlite; import android.annotation.SuppressLint; -import android.app.Activity; -import android.app.Application; import android.database.Cursor; import android.database.CursorWindow; import android.database.sqlite.SQLiteCursor; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteException; import android.database.sqlite.SQLiteStatement; +import android.content.Context; import android.os.Bundle; import android.util.Base64; import android.util.Log; @@ -48,7 +47,7 @@ import java.io.IOException; -public class SQLitePlugin extends ReactContextBaseJavaModules { +public class SQLitePlugin extends ReactContextBaseJavaModule { private static final String PLUGIN_NAME = "SQLite"; @@ -433,8 +432,7 @@ private SQLiteDatabase openDatabase(String dbname, String assetFilePath, int ope * @param dbfile The File of the destination db * @param assetFileInputStream input file stream for pre-populated db asset */ - private void createFromAssets(String dbName, File dbfile, InputStream assetFileInputStream) - { + private void createFromAssets(String dbName, File dbfile, InputStream assetFileInputStream) { OutputStream out = null; try { diff --git a/src/android/src/main/java/org/pgsqlite/SQLitePluginPackage.java b/src/android/src/main/java/org/pgsqlite/SQLitePluginPackage.java index 72768d6a..646448a1 100644 --- a/src/android/src/main/java/org/pgsqlite/SQLitePluginPackage.java +++ b/src/android/src/main/java/org/pgsqlite/SQLitePluginPackage.java @@ -5,8 +5,6 @@ */ package org.pgsqlite; - - import android.app.Activity; import com.facebook.react.ReactPackage; @@ -21,10 +19,16 @@ import java.util.List; public class SQLitePluginPackage implements ReactPackage { - private Activity activity = null; + /** + * @deprecated, use method without activity + * activity parameter is ignored + */ public SQLitePluginPackage(Activity activity){ - this.activity = activity; + this(); + } + + public SQLitePluginPackage() { } @Override @@ -32,7 +36,7 @@ public List createNativeModules( ReactApplicationContext reactContext) { List modules = new ArrayList<>(); - modules.add(new SQLitePlugin(reactContext, activity)); + modules.add(new SQLitePlugin(reactContext)); return modules; }