forked from facebook/stetho
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add SharedPreferences data to Resources tab
This implements the "Local Storage" section of the Resources tab and populates one entry per SharedPreferences tag discovered at the time the inspector window is opened. Full support for dynamic updates of individual keys, and updating/inserting/deleting values. Note that discovery of new SharedPreferences tags, just like new SQLite databases, is not currently supported. In the future, this can be added using Android's FileObserver API.
- Loading branch information
Showing
5 changed files
with
348 additions
and
15 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
87 changes: 87 additions & 0 deletions
87
stetho/src/main/java/com/facebook/stetho/inspector/domstorage/DOMStoragePeerManager.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,87 @@ | ||
package com.facebook.stetho.inspector.domstorage; | ||
|
||
import android.content.Context; | ||
import android.content.SharedPreferences; | ||
import com.facebook.stetho.inspector.helper.ChromePeerManager; | ||
import com.facebook.stetho.inspector.helper.PeerRegistrationListener; | ||
import com.facebook.stetho.inspector.helper.PeersRegisteredListener; | ||
import com.facebook.stetho.inspector.protocol.module.DOMStorage; | ||
|
||
import java.util.ArrayList; | ||
import java.util.List; | ||
import java.util.Map; | ||
|
||
public class DOMStoragePeerManager extends ChromePeerManager { | ||
private final Context mContext; | ||
|
||
public DOMStoragePeerManager(Context context) { | ||
mContext = context; | ||
setListener(mPeerListener); | ||
} | ||
|
||
private final PeerRegistrationListener mPeerListener = new PeersRegisteredListener() { | ||
private final List<DevToolsSharedPreferencesListener> mPrefsListeners = | ||
new ArrayList<DevToolsSharedPreferencesListener>(); | ||
|
||
@Override | ||
protected synchronized void onFirstPeerRegistered() { | ||
// TODO: We list the tags in Page.getResourceTree as well and those are the real fixed | ||
// tags that will be observed by the peer. We can fix this by making the page frames | ||
// dynamically update in response to DOMStorage events. This would also allow us to | ||
// add new SharedPreferences tags as we observe them being created by way of | ||
// android.os.FileObserver. | ||
List<String> tags = SharedPreferencesHelper.getSharedPreferenceTags(mContext); | ||
for (String tag : tags) { | ||
SharedPreferences prefs = mContext.getSharedPreferences(tag, Context.MODE_PRIVATE); | ||
DevToolsSharedPreferencesListener listener = | ||
new DevToolsSharedPreferencesListener(prefs, tag); | ||
prefs.registerOnSharedPreferenceChangeListener(listener); | ||
mPrefsListeners.add(listener); | ||
} | ||
} | ||
|
||
@Override | ||
protected synchronized void onLastPeerUnregistered() { | ||
for (DevToolsSharedPreferencesListener prefsListener : mPrefsListeners) { | ||
prefsListener.unregister(); | ||
} | ||
mPrefsListeners.clear(); | ||
} | ||
}; | ||
|
||
private class DevToolsSharedPreferencesListener | ||
implements SharedPreferences.OnSharedPreferenceChangeListener { | ||
private final SharedPreferences mPrefs; | ||
private final DOMStorage.StorageId mStorageId; | ||
|
||
public DevToolsSharedPreferencesListener(SharedPreferences prefs, String tag) { | ||
mPrefs = prefs; | ||
mStorageId = new DOMStorage.StorageId(); | ||
mStorageId.securityOrigin = tag; | ||
mStorageId.isLocalStorage = true; | ||
} | ||
|
||
public void unregister() { | ||
mPrefs.unregisterOnSharedPreferenceChangeListener(this); | ||
} | ||
|
||
@Override | ||
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { | ||
DOMStorage.DomStorageItemRemovedParams removedParams = | ||
new DOMStorage.DomStorageItemRemovedParams(); | ||
removedParams.storageId = mStorageId; | ||
removedParams.key = key; | ||
sendNotificationToPeers("DOMStorage.domStorageItemRemoved", removedParams); | ||
|
||
Map<String, ?> entries = sharedPreferences.getAll(); | ||
if (entries.containsKey(key)) { | ||
DOMStorage.DomStorageItemAddedParams addedParams = | ||
new DOMStorage.DomStorageItemAddedParams(); | ||
addedParams.storageId = mStorageId; | ||
addedParams.key = key; | ||
addedParams.newValue = SharedPreferencesHelper.valueToString(entries.get(key)); | ||
sendNotificationToPeers("DOMStorage.domStorageItemAdded", addedParams); | ||
} | ||
} | ||
} | ||
} |
39 changes: 39 additions & 0 deletions
39
stetho/src/main/java/com/facebook/stetho/inspector/domstorage/SharedPreferencesHelper.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,39 @@ | ||
package com.facebook.stetho.inspector.domstorage; | ||
|
||
import android.content.Context; | ||
|
||
import java.io.File; | ||
import java.util.ArrayList; | ||
import java.util.List; | ||
|
||
public class SharedPreferencesHelper { | ||
private static final String PREFS_SUFFIX = ".xml"; | ||
|
||
private SharedPreferencesHelper() { | ||
} | ||
|
||
public static List<String> getSharedPreferenceTags(Context context) { | ||
ArrayList<String> tags = new ArrayList<String>(); | ||
|
||
String rootPath = context.getApplicationInfo().dataDir + "/shared_prefs"; | ||
File root = new File(rootPath); | ||
if (root.exists()) { | ||
for (File file : root.listFiles()) { | ||
String fileName = file.getName(); | ||
if (fileName.endsWith(PREFS_SUFFIX)) { | ||
tags.add(fileName.substring(0, fileName.length() - PREFS_SUFFIX.length())); | ||
} | ||
} | ||
} | ||
|
||
return tags; | ||
} | ||
|
||
public static String valueToString(Object value) { | ||
if (value != null) { | ||
return value.toString(); | ||
} else { | ||
return null; | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.