From bca224c1acc90d124dc4237a65fa3ebaefb6d878 Mon Sep 17 00:00:00 2001 From: jferlisi Date: Thu, 12 Mar 2015 12:49:03 -0500 Subject: [PATCH] Added a way to provide the database files to the DatabasePeerManager module. --- .../main/java/com/facebook/stetho/Stetho.java | 3 +- .../database/DatabaseFilesProvider.java | 16 ++++++ .../database/DatabasePeerManager.java | 50 +++++++++++++------ .../DefaultDatabaseFilesProvider.java | 27 ++++++++++ .../inspector/protocol/module/Database.java | 15 ++++++ .../database/DatabasePeerManagerTest.java | 30 +++++------ 6 files changed, 112 insertions(+), 29 deletions(-) create mode 100644 stetho/src/main/java/com/facebook/stetho/inspector/database/DatabaseFilesProvider.java create mode 100644 stetho/src/main/java/com/facebook/stetho/inspector/database/DefaultDatabaseFilesProvider.java diff --git a/stetho/src/main/java/com/facebook/stetho/Stetho.java b/stetho/src/main/java/com/facebook/stetho/Stetho.java index 1711df4d..93b91e4d 100644 --- a/stetho/src/main/java/com/facebook/stetho/Stetho.java +++ b/stetho/src/main/java/com/facebook/stetho/Stetho.java @@ -1,5 +1,6 @@ package com.facebook.stetho; +import com.facebook.stetho.inspector.database.DefaultDatabaseFilesProvider; import javax.annotation.Nullable; import java.io.IOException; @@ -115,7 +116,7 @@ public Iterable get() { modules.add(new Runtime()); modules.add(new Worker()); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { - modules.add(new Database(context)); + modules.add(new Database(context, new DefaultDatabaseFilesProvider(context))); } return modules; } diff --git a/stetho/src/main/java/com/facebook/stetho/inspector/database/DatabaseFilesProvider.java b/stetho/src/main/java/com/facebook/stetho/inspector/database/DatabaseFilesProvider.java new file mode 100644 index 00000000..ccf55b74 --- /dev/null +++ b/stetho/src/main/java/com/facebook/stetho/inspector/database/DatabaseFilesProvider.java @@ -0,0 +1,16 @@ +package com.facebook.stetho.inspector.database; + +import java.io.File; +import java.util.List; + +/** + * Provides a {@link List} of database files. + */ +public interface DatabaseFilesProvider { + + /** + * Returns a {@link List} of database files. + */ + List getDatabaseFiles(); + +} diff --git a/stetho/src/main/java/com/facebook/stetho/inspector/database/DatabasePeerManager.java b/stetho/src/main/java/com/facebook/stetho/inspector/database/DatabasePeerManager.java index 9763374e..3075c64b 100644 --- a/stetho/src/main/java/com/facebook/stetho/inspector/database/DatabasePeerManager.java +++ b/stetho/src/main/java/com/facebook/stetho/inspector/database/DatabasePeerManager.java @@ -2,14 +2,14 @@ package com.facebook.stetho.inspector.database; +import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; import javax.annotation.concurrent.ThreadSafe; import java.io.File; import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashSet; import java.util.List; -import java.util.Set; import android.content.Context; import android.database.Cursor; @@ -30,18 +30,39 @@ public class DatabasePeerManager extends ChromePeerManager { }; private final Context mContext; + private final DatabaseFilesProvider mDatabaseFilesProvider; + /** + * Constructs the object with a {@link DatabaseFilesProvider} that supplies the database files + * from {@link Context#databaseList()}. + * + * @param context the context + * @deprecated use the other {@linkplain DatabasePeerManager#DatabasePeerManager(Context, + * DatabaseFilesProvider) constructor} and pass in the {@linkplain DefaultDatabaseFilesProvider + * default provider}. + */ + @Deprecated public DatabasePeerManager(Context context) { + this(context, new DefaultDatabaseFilesProvider(context)); + } + + /** + * @param context the context + * @param databaseFilesProvider a database file name provider + */ + public DatabasePeerManager(Context context, DatabaseFilesProvider databaseFilesProvider) { mContext = context; + mDatabaseFilesProvider = databaseFilesProvider; setListener(mPeerRegistrationListener); } private void bootstrapNewPeer(JsonRpcPeer peer) { - Iterable tidiedList = tidyDatabaseList(mContext.databaseList()); - for (String databaseName : tidiedList) { + List potentialDatabaseFiles = mDatabaseFilesProvider.getDatabaseFiles(); + Iterable tidiedList = tidyDatabaseList(potentialDatabaseFiles); + for (File database : tidiedList) { Database.DatabaseObject databaseParams = new Database.DatabaseObject(); - databaseParams.id = databaseName; - databaseParams.name = databaseName; + databaseParams.id = database.getPath(); + databaseParams.name = database.getName(); databaseParams.domain = mContext.getPackageName(); databaseParams.version = "N/A"; Database.AddDatabaseEvent eventParams = new Database.AddDatabaseEvent(); @@ -56,17 +77,18 @@ private void bootstrapNewPeer(JsonRpcPeer peer) { * that this only removes the database if it is true that it shadows another database lacking * the uninteresting suffix. * - * @param databaseFilenames Raw list of database filenames. + * @param databaseFiles Raw list of database files. * @return Tidied list with shadow databases removed. */ // @VisibleForTesting - static List tidyDatabaseList(String[] databaseFilenames) { - Set originalAsSet = new HashSet(Arrays.asList(databaseFilenames)); - List tidiedList = new ArrayList(); - for (String databaseFilename : databaseFilenames) { + static List tidyDatabaseList(List databaseFiles) { + Set originalAsSet = new HashSet(databaseFiles); + List tidiedList = new ArrayList(); + for (File databaseFile : databaseFiles) { + String databaseFilename = databaseFile.getPath(); String sansSuffix = removeSuffix(databaseFilename, UNINTERESTING_FILENAME_SUFFIXES); - if (sansSuffix.equals(databaseFilename) || !originalAsSet.contains(sansSuffix)) { - tidiedList.add(databaseFilename); + if (sansSuffix.equals(databaseFilename) || !originalAsSet.contains(new File(sansSuffix))) { + tidiedList.add(databaseFile); } } return tidiedList; diff --git a/stetho/src/main/java/com/facebook/stetho/inspector/database/DefaultDatabaseFilesProvider.java b/stetho/src/main/java/com/facebook/stetho/inspector/database/DefaultDatabaseFilesProvider.java new file mode 100644 index 00000000..f556b138 --- /dev/null +++ b/stetho/src/main/java/com/facebook/stetho/inspector/database/DefaultDatabaseFilesProvider.java @@ -0,0 +1,27 @@ +package com.facebook.stetho.inspector.database; + +import android.content.Context; +import java.io.File; +import java.util.ArrayList; +import java.util.List; + +/** + * Provides the results of {@link Context#databaseList()}. + */ +public final class DefaultDatabaseFilesProvider implements DatabaseFilesProvider { + + private final Context mContext; + + public DefaultDatabaseFilesProvider(Context context) { + mContext = context; + } + + @Override + public List getDatabaseFiles() { + List databaseFiles = new ArrayList(); + for (String filename : mContext.databaseList()) { + databaseFiles.add(new File(filename)); + } + return databaseFiles; + } +} diff --git a/stetho/src/main/java/com/facebook/stetho/inspector/protocol/module/Database.java b/stetho/src/main/java/com/facebook/stetho/inspector/protocol/module/Database.java index 916d42a7..00e26ae4 100644 --- a/stetho/src/main/java/com/facebook/stetho/inspector/protocol/module/Database.java +++ b/stetho/src/main/java/com/facebook/stetho/inspector/protocol/module/Database.java @@ -2,6 +2,7 @@ package com.facebook.stetho.inspector.protocol.module; +import com.facebook.stetho.inspector.database.DatabaseFilesProvider; import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -38,11 +39,25 @@ public class Database implements ChromeDevtoolsDomain { private final DatabasePeerManager mDatabasePeerManager; private final ObjectMapper mObjectMapper; + /** + * Constructs the object with the default {@link DatabasePeerManager}. + * @param context the context + */ + @Deprecated public Database(Context context) { mDatabasePeerManager = new DatabasePeerManager(context); mObjectMapper = new ObjectMapper(); } + /** + * @param context the context + * @param databaseFilesProvider a database files provider + */ + public Database(Context context, DatabaseFilesProvider databaseFilesProvider) { + mDatabasePeerManager = new DatabasePeerManager(context, databaseFilesProvider); + mObjectMapper = new ObjectMapper(); + } + @ChromeDevtoolsMethod public void enable(JsonRpcPeer peer, JSONObject params) { mDatabasePeerManager.addPeer(peer); diff --git a/stetho/src/test/java/com/facebook/stetho/inspector/database/DatabasePeerManagerTest.java b/stetho/src/test/java/com/facebook/stetho/inspector/database/DatabasePeerManagerTest.java index 00cc5ff2..96ad0248 100644 --- a/stetho/src/test/java/com/facebook/stetho/inspector/database/DatabasePeerManagerTest.java +++ b/stetho/src/test/java/com/facebook/stetho/inspector/database/DatabasePeerManagerTest.java @@ -2,6 +2,8 @@ package com.facebook.stetho.inspector.database; +import java.io.File; +import java.util.Arrays; import java.util.List; import org.junit.Test; @@ -11,19 +13,19 @@ public class DatabasePeerManagerTest { @Test public void testTidyDatabaseList() { - String[] databases = { - "foo.db", "foo.db-journal", - "bar.db", "bar.db-journal", "bar.db-uid", - "baz.db", "baz.db-somethingelse", - "dangling.db-journal", - }; - String[] expected = { - "foo.db", - "bar.db", - "baz.db", "baz.db-somethingelse", - "dangling.db-journal", - }; - List tidied = DatabasePeerManager.tidyDatabaseList(databases); - assertArrayEquals(expected, tidied.toArray()); + File[] databases = { + new File("foo.db"), new File("foo.db-journal"), + new File("bar.db"), new File("bar.db-journal"), new File( "bar.db-uid"), + new File("baz.db"), new File("baz.db-somethingelse"), + new File("dangling.db-journal"), + }; + File[] expected = { + new File( "foo.db"), + new File("bar.db"), + new File("baz.db"), new File("baz.db-somethingelse"), + new File("dangling.db-journal") + }; + List tidied = DatabasePeerManager.tidyDatabaseList(Arrays.asList(databases)); + assertArrayEquals(expected, tidied.toArray()); } }