package de.robv.android.xposed.installer.util; import android.annotation.SuppressLint; import android.content.SharedPreferences; import android.preference.PreferenceManager; import java.lang.reflect.Field; import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; import java.util.Set; public class PrefixedSharedPreferences implements SharedPreferences { private final SharedPreferences mBase; private final String mPrefix; public PrefixedSharedPreferences(SharedPreferences base, String prefix) { mBase = base; mPrefix = prefix + "_"; } public static void injectToPreferenceManager(PreferenceManager manager, String prefix) { SharedPreferences prefixedPrefs = new PrefixedSharedPreferences(manager.getSharedPreferences(), prefix); try { Field fieldSharedPref = PreferenceManager.class.getDeclaredField("mSharedPreferences"); fieldSharedPref.setAccessible(true); fieldSharedPref.set(manager, prefixedPrefs); } catch (Throwable t) { throw new RuntimeException(t); } } @Override public Map<String, ?> getAll() { Map<String, ?> baseResult = mBase.getAll(); Map<String, Object> prefixedResult = new HashMap<String, Object>(baseResult); for (Entry<String, ?> entry : baseResult.entrySet()) { prefixedResult.put(mPrefix + entry.getKey(), entry.getValue()); } return prefixedResult; } @Override public String getString(String key, String defValue) { return mBase.getString(mPrefix + key, defValue); } @Override public Set<String> getStringSet(String key, Set<String> defValues) { return mBase.getStringSet(mPrefix + key, defValues); } @Override public int getInt(String key, int defValue) { return mBase.getInt(mPrefix + key, defValue); } @Override public long getLong(String key, long defValue) { return mBase.getLong(mPrefix + key, defValue); } @Override public float getFloat(String key, float defValue) { return mBase.getFloat(mPrefix + key, defValue); } @Override public boolean getBoolean(String key, boolean defValue) { return mBase.getBoolean(mPrefix + key, defValue); } @Override public boolean contains(String key) { return mBase.contains(mPrefix + key); } @SuppressLint("CommitPrefEdits") @Override public Editor edit() { return new EditorImpl(mBase.edit()); } @Override public void registerOnSharedPreferenceChangeListener(OnSharedPreferenceChangeListener listener) { throw new UnsupportedOperationException("listeners are not supported in this implementation"); } @Override public void unregisterOnSharedPreferenceChangeListener(OnSharedPreferenceChangeListener listener) { throw new UnsupportedOperationException("listeners are not supported in this implementation"); } private class EditorImpl implements Editor { private final Editor mEditorBase; public EditorImpl(Editor base) { mEditorBase = base; } @Override public Editor putString(String key, String value) { mEditorBase.putString(mPrefix + key, value); return this; } @Override public Editor putStringSet(String key, Set<String> values) { mEditorBase.putStringSet(mPrefix + key, values); return this; } @Override public Editor putInt(String key, int value) { mEditorBase.putInt(mPrefix + key, value); return this; } @Override public Editor putLong(String key, long value) { mEditorBase.putLong(mPrefix + key, value); return this; } @Override public Editor putFloat(String key, float value) { mEditorBase.putFloat(mPrefix + key, value); return this; } @Override public Editor putBoolean(String key, boolean value) { mEditorBase.putBoolean(mPrefix + key, value); return this; } @Override public Editor remove(String key) { mEditorBase.remove(mPrefix + key); return this; } @Override public Editor clear() { mEditorBase.clear(); return this; } @Override public boolean commit() { return mEditorBase.commit(); } @Override public void apply() { mEditorBase.apply(); } } }