diff --git a/android/build.gradle b/android/build.gradle index 9af5922fb..8aef1f987 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -65,6 +65,7 @@ android { implementation deps.soloader implementation deps.jsr305 implementation deps.supportAppCompat + implementation deps.supportSqlite testImplementation deps.mockito testImplementation deps.robolectric diff --git a/android/src/main/java/com/facebook/flipper/plugins/databases/impl/DefaultSqliteDatabaseConnectionProvider.java b/android/src/main/java/com/facebook/flipper/plugins/databases/impl/DefaultSqliteDatabaseConnectionProvider.java new file mode 100644 index 000000000..e0b449ff9 --- /dev/null +++ b/android/src/main/java/com/facebook/flipper/plugins/databases/impl/DefaultSqliteDatabaseConnectionProvider.java @@ -0,0 +1,24 @@ +/* + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +package com.facebook.flipper.plugins.databases.impl; + +import android.database.sqlite.SQLiteDatabase; +import android.database.sqlite.SQLiteException; +import androidx.sqlite.db.SupportSQLiteDatabase; +import java.io.File; + +public class DefaultSqliteDatabaseConnectionProvider implements SqliteDatabaseConnectionProvider { + + @Override + public SupportSQLiteDatabase openDatabase(File databaseFile) throws SQLiteException { + int flags = SQLiteDatabase.OPEN_READWRITE; + SQLiteDatabase database = + SQLiteDatabase.openDatabase(databaseFile.getAbsolutePath(), null, flags); + return FrameworkSQLiteDatabaseWrapping.wrap(database); + } +} diff --git a/android/src/main/java/com/facebook/flipper/plugins/databases/impl/DefaultSqliteDatabaseProvider.java b/android/src/main/java/com/facebook/flipper/plugins/databases/impl/DefaultSqliteDatabaseProvider.java new file mode 100644 index 000000000..0c835cfc7 --- /dev/null +++ b/android/src/main/java/com/facebook/flipper/plugins/databases/impl/DefaultSqliteDatabaseProvider.java @@ -0,0 +1,31 @@ +/* + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +package com.facebook.flipper.plugins.databases.impl; + +import android.content.Context; +import java.io.File; +import java.util.ArrayList; +import java.util.List; + +public class DefaultSqliteDatabaseProvider implements SqliteDatabaseProvider { + + private Context context; + + public DefaultSqliteDatabaseProvider(Context context) { + this.context = context; + } + + @Override + public List getDatabaseFiles() { + List databaseFiles = new ArrayList<>(); + for (String databaseName : context.databaseList()) { + databaseFiles.add(context.getDatabasePath(databaseName)); + } + return databaseFiles; + } +} diff --git a/android/src/main/java/com/facebook/flipper/plugins/databases/impl/FrameworkSQLiteDatabaseWrapping.java b/android/src/main/java/com/facebook/flipper/plugins/databases/impl/FrameworkSQLiteDatabaseWrapping.java new file mode 100644 index 000000000..74d6d2830 --- /dev/null +++ b/android/src/main/java/com/facebook/flipper/plugins/databases/impl/FrameworkSQLiteDatabaseWrapping.java @@ -0,0 +1,35 @@ +/* + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +package com.facebook.flipper.plugins.databases.impl; + +import android.database.sqlite.SQLiteDatabase; +import android.database.sqlite.SQLiteException; +import android.os.Build; +import androidx.sqlite.db.SupportSQLiteDatabase; +import java.lang.reflect.Constructor; + +/** Gives access to package-private class FrameworkSQLiteDatabase */ +public class FrameworkSQLiteDatabaseWrapping { + + public static SupportSQLiteDatabase wrap(SQLiteDatabase database) throws SQLiteException { + try { + Class clazz = Class.forName("androidx.sqlite.db.framework.FrameworkSQLiteDatabase"); + Constructor constructor = clazz.getDeclaredConstructor(SQLiteDatabase.class); + constructor.setAccessible(true); + return (SupportSQLiteDatabase) constructor.newInstance(database); + } catch (Exception e) { + String errorMessage = + "Failed to instantiate androidx.sqlite.db.framework.FrameworkSQLiteDatabase"; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { + throw new SQLiteException(errorMessage, e); + } else { + throw new SQLiteException(errorMessage); + } + } + } +} diff --git a/android/src/main/java/com/facebook/flipper/plugins/databases/impl/SqliteDatabaseConnectionProvider.java b/android/src/main/java/com/facebook/flipper/plugins/databases/impl/SqliteDatabaseConnectionProvider.java index cf860aa6c..7f7ec41d8 100644 --- a/android/src/main/java/com/facebook/flipper/plugins/databases/impl/SqliteDatabaseConnectionProvider.java +++ b/android/src/main/java/com/facebook/flipper/plugins/databases/impl/SqliteDatabaseConnectionProvider.java @@ -7,11 +7,11 @@ package com.facebook.flipper.plugins.databases.impl; -import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteException; +import androidx.sqlite.db.SupportSQLiteDatabase; import java.io.File; public interface SqliteDatabaseConnectionProvider { - SQLiteDatabase openDatabase(File databaseFile) throws SQLiteException; + SupportSQLiteDatabase openDatabase(File databaseFile) throws SQLiteException; } diff --git a/android/src/main/java/com/facebook/flipper/plugins/databases/impl/SqliteDatabaseDriver.java b/android/src/main/java/com/facebook/flipper/plugins/databases/impl/SqliteDatabaseDriver.java index dc83737f0..90fa8dc46 100644 --- a/android/src/main/java/com/facebook/flipper/plugins/databases/impl/SqliteDatabaseDriver.java +++ b/android/src/main/java/com/facebook/flipper/plugins/databases/impl/SqliteDatabaseDriver.java @@ -9,16 +9,17 @@ package com.facebook.flipper.plugins.databases.impl; import android.content.Context; import android.database.Cursor; -import android.database.DatabaseUtils; -import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteException; -import android.database.sqlite.SQLiteStatement; import android.text.TextUtils; +import android.util.Log; import androidx.annotation.Nullable; +import androidx.sqlite.db.SupportSQLiteDatabase; +import androidx.sqlite.db.SupportSQLiteStatement; import com.facebook.flipper.plugins.databases.DatabaseDescriptor; import com.facebook.flipper.plugins.databases.DatabaseDriver; import com.facebook.flipper.plugins.databases.impl.SqliteDatabaseDriver.SqliteDatabaseDescriptor; import java.io.File; +import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; @@ -33,37 +34,18 @@ public class SqliteDatabaseDriver extends DatabaseDriver getDatabaseFiles() { - List databaseFiles = new ArrayList<>(); - for (String databaseName : context.databaseList()) { - databaseFiles.add(context.getDatabasePath(databaseName)); - } - return databaseFiles; - } - }); + this(context, new DefaultSqliteDatabaseProvider(context)); } public SqliteDatabaseDriver( final Context context, final SqliteDatabaseProvider sqliteDatabaseProvider) { - this( - context, - sqliteDatabaseProvider, - new SqliteDatabaseConnectionProvider() { - @Override - public SQLiteDatabase openDatabase(File databaseFile) throws SQLiteException { - int flags = SQLiteDatabase.OPEN_READWRITE; - return SQLiteDatabase.openDatabase(databaseFile.getAbsolutePath(), null, flags); - } - }); + this(context, sqliteDatabaseProvider, new DefaultSqliteDatabaseConnectionProvider()); } public SqliteDatabaseDriver( @@ -90,11 +72,11 @@ public class SqliteDatabaseDriver extends DatabaseDriver getTableNames(SqliteDatabaseDescriptor databaseDescriptor) { try { - SQLiteDatabase database = + SupportSQLiteDatabase database = sqliteDatabaseConnectionProvider.openDatabase(databaseDescriptor.file); try { Cursor cursor = - database.rawQuery( + database.query( "SELECT name FROM " + SCHEMA_TABLE + " WHERE type IN (?, ?)", new String[] {"table", "view"}); try { @@ -107,9 +89,10 @@ public class SqliteDatabaseDriver extends DatabaseDriver> rows = cursorToList(cursor); @@ -163,19 +152,19 @@ public class SqliteDatabaseDriver extends DatabaseDriver indexedColumnNames = new ArrayList<>(); String indexName = indexesCursor.getString(indexesCursor.getColumnIndex("name")); - Cursor indexInfoCursor = database.rawQuery("PRAGMA index_info(" + indexName + ")", null); + Cursor indexInfoCursor = database.query("PRAGMA index_info(" + indexName + ")", null); try { while (indexInfoCursor.moveToNext()) { indexedColumnNames.add( @@ -246,20 +235,19 @@ public class SqliteDatabaseDriver extends DatabaseDriver> rows = cursorToList(cursor); @@ -327,7 +317,8 @@ public class SqliteDatabaseDriver extends DatabaseDriver