Commit d0f8bfe2 authored by Henrique Nakashima's avatar Henrique Nakashima Committed by Commit Bot

Create SharedPreferencesManager, with generic API to SharedPreferences.

Leaving the public API of SharedPreferencesManager intact for now,
changes are broad and I don't want to mix them with this CL.

Bug: 1017800
Change-Id: I658afd16cf56a5436193d5d307cc38c0964b79a3
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1888388Reviewed-by: default avatarNatalie Chouinard <chouinard@chromium.org>
Reviewed-by: default avatarTheresa  <twellington@chromium.org>
Commit-Queue: Henrique Nakashima <hnakashima@chromium.org>
Cr-Commit-Position: refs/heads/master@{#711125}
parent 0acc156f
...@@ -1299,6 +1299,7 @@ chrome_java_sources = [ ...@@ -1299,6 +1299,7 @@ chrome_java_sources = [
"java/src/org/chromium/chrome/browser/preferences/SearchEnginePreference.java", "java/src/org/chromium/chrome/browser/preferences/SearchEnginePreference.java",
"java/src/org/chromium/chrome/browser/preferences/SearchUtils.java", "java/src/org/chromium/chrome/browser/preferences/SearchUtils.java",
"java/src/org/chromium/chrome/browser/preferences/SeekBarPreference.java", "java/src/org/chromium/chrome/browser/preferences/SeekBarPreference.java",
"java/src/org/chromium/chrome/browser/preferences/SharedPreferencesManager.java",
"java/src/org/chromium/chrome/browser/preferences/SpinnerPreference.java", "java/src/org/chromium/chrome/browser/preferences/SpinnerPreference.java",
"java/src/org/chromium/chrome/browser/preferences/sync/AccountManagementFragment.java", "java/src/org/chromium/chrome/browser/preferences/sync/AccountManagementFragment.java",
"java/src/org/chromium/chrome/browser/preferences/sync/ManageSyncPreferences.java", "java/src/org/chromium/chrome/browser/preferences/sync/ManageSyncPreferences.java",
......
...@@ -14,7 +14,7 @@ import androidx.annotation.NonNull; ...@@ -14,7 +14,7 @@ import androidx.annotation.NonNull;
import org.chromium.base.ApplicationState; import org.chromium.base.ApplicationState;
import org.chromium.base.ApplicationStatus; import org.chromium.base.ApplicationStatus;
import org.chromium.base.ObserverList; import org.chromium.base.ObserverList;
import org.chromium.chrome.browser.preferences.ChromePreferenceManager; import org.chromium.chrome.browser.preferences.SharedPreferencesManager;
import org.chromium.chrome.browser.preferences.themes.ThemePreferences; import org.chromium.chrome.browser.preferences.themes.ThemePreferences;
/** /**
...@@ -25,7 +25,7 @@ class GlobalNightModeStateController implements NightModeStateProvider, ...@@ -25,7 +25,7 @@ class GlobalNightModeStateController implements NightModeStateProvider,
ApplicationStatus.ApplicationStateListener { ApplicationStatus.ApplicationStateListener {
private final ObserverList<Observer> mObservers = new ObserverList<>(); private final ObserverList<Observer> mObservers = new ObserverList<>();
private final SystemNightModeMonitor mSystemNightModeMonitor; private final SystemNightModeMonitor mSystemNightModeMonitor;
private final ChromePreferenceManager mChromePreferenceManager; private final SharedPreferencesManager mSharedPreferencesManager;
private final PowerSavingModeMonitor mPowerSaveModeMonitor; private final PowerSavingModeMonitor mPowerSaveModeMonitor;
private final Runnable mPowerSaveModeObserver = this::updateNightMode; private final Runnable mPowerSaveModeObserver = this::updateNightMode;
...@@ -35,7 +35,7 @@ class GlobalNightModeStateController implements NightModeStateProvider, ...@@ -35,7 +35,7 @@ class GlobalNightModeStateController implements NightModeStateProvider,
* initialized yet. * initialized yet.
*/ */
private Boolean mNightModeOn; private Boolean mNightModeOn;
private ChromePreferenceManager.Observer mPreferenceObserver; private SharedPreferencesManager.Observer mPreferenceObserver;
/** Whether this class has started listening to relevant states for night mode. */ /** Whether this class has started listening to relevant states for night mode. */
private boolean mIsStarted; private boolean mIsStarted;
...@@ -47,14 +47,14 @@ class GlobalNightModeStateController implements NightModeStateProvider, ...@@ -47,14 +47,14 @@ class GlobalNightModeStateController implements NightModeStateProvider,
* night mode state. * night mode state.
* @param powerSaveModeMonitor The {@link PowerSavingModeMonitor} that maintains the system * @param powerSaveModeMonitor The {@link PowerSavingModeMonitor} that maintains the system
* power saving setting. * power saving setting.
* @param chromePreferenceManager The {@link ChromePreferenceManager} that maintains shared * @param sharedPreferencesManager The {@link SharedPreferencesManager} that maintains shared
* preferences. * preferences.
*/ */
GlobalNightModeStateController(@NonNull SystemNightModeMonitor systemNightModeMonitor, GlobalNightModeStateController(@NonNull SystemNightModeMonitor systemNightModeMonitor,
@NonNull PowerSavingModeMonitor powerSaveModeMonitor, @NonNull PowerSavingModeMonitor powerSaveModeMonitor,
@NonNull ChromePreferenceManager chromePreferenceManager) { @NonNull SharedPreferencesManager sharedPreferencesManager) {
mSystemNightModeMonitor = systemNightModeMonitor; mSystemNightModeMonitor = systemNightModeMonitor;
mChromePreferenceManager = chromePreferenceManager; mSharedPreferencesManager = sharedPreferencesManager;
mPowerSaveModeMonitor = powerSaveModeMonitor; mPowerSaveModeMonitor = powerSaveModeMonitor;
mPreferenceObserver = key -> { mPreferenceObserver = key -> {
...@@ -112,7 +112,7 @@ class GlobalNightModeStateController implements NightModeStateProvider, ...@@ -112,7 +112,7 @@ class GlobalNightModeStateController implements NightModeStateProvider,
mSystemNightModeMonitor.addObserver(this); mSystemNightModeMonitor.addObserver(this);
mPowerSaveModeMonitor.addObserver(mPowerSaveModeObserver); mPowerSaveModeMonitor.addObserver(mPowerSaveModeObserver);
mChromePreferenceManager.addObserver(mPreferenceObserver); mSharedPreferencesManager.addObserver(mPreferenceObserver);
updateNightMode(); updateNightMode();
} }
...@@ -123,7 +123,7 @@ class GlobalNightModeStateController implements NightModeStateProvider, ...@@ -123,7 +123,7 @@ class GlobalNightModeStateController implements NightModeStateProvider,
mSystemNightModeMonitor.removeObserver(this); mSystemNightModeMonitor.removeObserver(this);
mPowerSaveModeMonitor.removeObserver(mPowerSaveModeObserver); mPowerSaveModeMonitor.removeObserver(mPowerSaveModeObserver);
mChromePreferenceManager.removeObserver(mPreferenceObserver); mSharedPreferencesManager.removeObserver(mPreferenceObserver);
} }
private void updateNightMode() { private void updateNightMode() {
......
...@@ -13,7 +13,7 @@ import org.chromium.base.VisibleForTesting; ...@@ -13,7 +13,7 @@ import org.chromium.base.VisibleForTesting;
import org.chromium.chrome.browser.ChromeBaseAppCompatActivity; import org.chromium.chrome.browser.ChromeBaseAppCompatActivity;
import org.chromium.chrome.browser.ChromeSwitches; import org.chromium.chrome.browser.ChromeSwitches;
import org.chromium.chrome.browser.flags.FeatureUtilities; import org.chromium.chrome.browser.flags.FeatureUtilities;
import org.chromium.chrome.browser.preferences.ChromePreferenceManager; import org.chromium.chrome.browser.preferences.SharedPreferencesManager;
/** /**
* Holds an instance of {@link NightModeStateProvider} that provides night mode state for the entire * Holds an instance of {@link NightModeStateProvider} that provides night mode state for the entire
...@@ -65,7 +65,7 @@ public class GlobalNightModeStateProviderHolder { ...@@ -65,7 +65,7 @@ public class GlobalNightModeStateProviderHolder {
} else { } else {
sInstance = new GlobalNightModeStateController(SystemNightModeMonitor.getInstance(), sInstance = new GlobalNightModeStateController(SystemNightModeMonitor.getInstance(),
PowerSavingModeMonitor.getInstance(), PowerSavingModeMonitor.getInstance(),
ChromePreferenceManager.getInstance()); SharedPreferencesManager.getInstance());
} }
} }
return sInstance; return sInstance;
......
...@@ -13,6 +13,7 @@ import org.chromium.base.ApplicationStatus; ...@@ -13,6 +13,7 @@ import org.chromium.base.ApplicationStatus;
import org.chromium.base.ApplicationStatus.ApplicationStateListener; import org.chromium.base.ApplicationStatus.ApplicationStateListener;
import org.chromium.chrome.browser.preferences.ChromePreferenceManager; import org.chromium.chrome.browser.preferences.ChromePreferenceManager;
import org.chromium.chrome.browser.preferences.PrefServiceBridge; import org.chromium.chrome.browser.preferences.PrefServiceBridge;
import org.chromium.chrome.browser.preferences.SharedPreferencesManager;
/** /**
* A controller class could enable or disable web content dark mode feature based on the night mode * A controller class could enable or disable web content dark mode feature based on the night mode
...@@ -20,7 +21,7 @@ import org.chromium.chrome.browser.preferences.PrefServiceBridge; ...@@ -20,7 +21,7 @@ import org.chromium.chrome.browser.preferences.PrefServiceBridge;
*/ */
public class WebContentsDarkModeController implements ApplicationStateListener { public class WebContentsDarkModeController implements ApplicationStateListener {
private NightModeStateProvider.Observer mNightModeObserver; private NightModeStateProvider.Observer mNightModeObserver;
private ChromePreferenceManager.Observer mPreferenceObserver; private SharedPreferencesManager.Observer mPreferenceObserver;
private static WebContentsDarkModeController sController; private static WebContentsDarkModeController sController;
...@@ -73,7 +74,7 @@ public class WebContentsDarkModeController implements ApplicationStateListener { ...@@ -73,7 +74,7 @@ public class WebContentsDarkModeController implements ApplicationStateListener {
}; };
enableWebContentsDarkMode(shouldEnableWebContentsDarkMode()); enableWebContentsDarkMode(shouldEnableWebContentsDarkMode());
GlobalNightModeStateProviderHolder.getInstance().addObserver(mNightModeObserver); GlobalNightModeStateProviderHolder.getInstance().addObserver(mNightModeObserver);
ChromePreferenceManager.getInstance().addObserver(mPreferenceObserver); SharedPreferencesManager.getInstance().addObserver(mPreferenceObserver);
} }
/** /**
...@@ -82,7 +83,7 @@ public class WebContentsDarkModeController implements ApplicationStateListener { ...@@ -82,7 +83,7 @@ public class WebContentsDarkModeController implements ApplicationStateListener {
private void stop() { private void stop() {
if (mNightModeObserver == null) return; if (mNightModeObserver == null) return;
GlobalNightModeStateProviderHolder.getInstance().removeObserver(mNightModeObserver); GlobalNightModeStateProviderHolder.getInstance().removeObserver(mNightModeObserver);
ChromePreferenceManager.getInstance().removeObserver(mPreferenceObserver); SharedPreferencesManager.getInstance().removeObserver(mPreferenceObserver);
mNightModeObserver = null; mNightModeObserver = null;
mPreferenceObserver = null; mPreferenceObserver = null;
} }
......
// Copyright 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package org.chromium.chrome.browser.preferences;
import android.content.SharedPreferences;
import androidx.annotation.Nullable;
import org.chromium.base.ContextUtils;
import org.chromium.base.StrictModeContext;
import org.chromium.base.VisibleForTesting;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
/**
* Layer over android {@link SharedPreferences}.
*/
public class SharedPreferencesManager {
private static class LazyHolder {
static final SharedPreferencesManager INSTANCE = new SharedPreferencesManager();
}
/**
* @return The SharedPreferencesManager singleton.
*/
public static SharedPreferencesManager getInstance() {
return LazyHolder.INSTANCE;
}
private final SharedPreferences mSharedPreferences;
private SharedPreferencesManager() {
this(ContextUtils.getAppSharedPreferences());
}
@VisibleForTesting
SharedPreferencesManager(SharedPreferences sharedPreferences) {
mSharedPreferences = sharedPreferences;
}
/**
* Observes preference changes.
*/
public interface Observer {
/**
* Notifies when a preference maintained by {@link ChromePreferenceManager} is changed.
* @param key The key of the preference changed.
*/
void onPreferenceChanged(String key);
}
private final Map<Observer, SharedPreferences.OnSharedPreferenceChangeListener> mObservers =
new HashMap<>();
/**
* @param observer The {@link Observer} to be added for observing preference changes.
*/
public void addObserver(Observer observer) {
SharedPreferences.OnSharedPreferenceChangeListener listener =
(SharedPreferences sharedPreferences, String s) -> observer.onPreferenceChanged(s);
mObservers.put(observer, listener);
mSharedPreferences.registerOnSharedPreferenceChangeListener(listener);
}
/**
* @param observer The {@link Observer} to be removed from observing preference changes.
*/
public void removeObserver(Observer observer) {
SharedPreferences.OnSharedPreferenceChangeListener listener = mObservers.get(observer);
if (listener == null) return;
mSharedPreferences.unregisterOnSharedPreferenceChangeListener(listener);
}
/**
* Reads set of String values from preferences.
*
* Note that you must not modify the set instance returned by this call.
*/
public Set<String> readStringSet(String key) {
return readStringSet(key, Collections.emptySet());
}
/**
* Reads set of String values from preferences.
*
* Note that you must not modify the set instance returned by this call.
*/
public Set<String> readStringSet(String key, Set<String> defaultValue) {
return mSharedPreferences.getStringSet(key, defaultValue);
}
/**
* Adds a value to string set in shared preferences.
*/
public void addToStringSet(String key, String value) {
Set<String> values = new HashSet<>(readStringSet(key));
values.add(value);
writeStringSet(key, values);
}
/**
* Removes value from string set in shared preferences.
*/
public void removeFromStringSet(String key, String value) {
Set<String> values = new HashSet<>(readStringSet(key));
if (values.remove(value)) {
writeStringSet(key, values);
}
}
/**
* Writes string set to shared preferences.
*/
public void writeStringSet(String key, Set<String> values) {
mSharedPreferences.edit().putStringSet(key, values).apply();
}
/**
* Writes the given int value to the named shared preference.
* @param key The name of the preference to modify.
* @param value The new value for the preference.
*/
public void writeInt(String key, int value) {
SharedPreferences.Editor ed = mSharedPreferences.edit();
ed.putInt(key, value);
ed.apply();
}
/**
* Reads the given int value from the named shared preference, defaulting to 0 if not found.
* @param key The name of the preference to return.
* @return The value of the preference.
*/
public int readInt(String key) {
return readInt(key, 0);
}
/**
* Reads the given int value from the named shared preference.
* @param key The name of the preference to return.
* @param defaultValue The default value to return if the preference is not set.
* @return The value of the preference.
*/
public int readInt(String key, int defaultValue) {
try (StrictModeContext ignored = StrictModeContext.allowDiskReads()) {
return mSharedPreferences.getInt(key, defaultValue);
}
}
/**
* Increments the integer value specified by the given key. If no initial value is present then
* an initial value of 0 is assumed and incremented, so a new value of 1 is set.
* @param key The key specifying which integer value to increment.
* @return The newly incremented value.
*/
public int incrementInt(String key) {
int value = mSharedPreferences.getInt(key, 0);
writeInt(key, ++value);
return value;
}
/**
* Writes the given long to the named shared preference.
*
* @param key The name of the preference to modify.
* @param value The new value for the preference.
*/
public void writeLong(String key, long value) {
SharedPreferences.Editor ed = mSharedPreferences.edit();
ed.putLong(key, value);
ed.apply();
}
/**
* Reads the given long value from the named shared preference.
*
* @param key The name of the preference to return.
* @return The value of the preference if stored; defaultValue otherwise.
*/
public long readLong(String key) {
return readLong(key, 0);
}
/**
* Reads the given long value from the named shared preference.
*
* @param key The name of the preference to return.
* @param defaultValue The default value to return if there's no value stored.
* @return The value of the preference if stored; defaultValue otherwise.
*/
public long readLong(String key, long defaultValue) {
try (StrictModeContext ignored = StrictModeContext.allowDiskReads()) {
return mSharedPreferences.getLong(key, defaultValue);
}
}
/**
* Writes the given boolean to the named shared preference.
*
* @param key The name of the preference to modify.
* @param value The new value for the preference.
*/
public void writeBoolean(String key, boolean value) {
SharedPreferences.Editor ed = mSharedPreferences.edit();
ed.putBoolean(key, value);
ed.apply();
}
/**
* Reads the given boolean value from the named shared preference.
*
* @param key The name of the preference to return.
* @param defaultValue The default value to return if there's no value stored.
* @return The value of the preference if stored; defaultValue otherwise.
*/
public boolean readBoolean(String key, boolean defaultValue) {
try (StrictModeContext ignored = StrictModeContext.allowDiskReads()) {
return mSharedPreferences.getBoolean(key, defaultValue);
}
}
/**
* Writes the given string to the named shared preference.
*
* @param key The name of the preference to modify.
* @param value The new value for the preference.
*/
public void writeString(String key, String value) {
SharedPreferences.Editor ed = mSharedPreferences.edit();
ed.putString(key, value);
ed.apply();
}
/**
* Reads the given String value from the named shared preference.
*
* @param key The name of the preference to return.
* @param defaultValue The default value to return if there's no value stored.
* @return The value of the preference if stored; defaultValue otherwise.
*/
public String readString(String key, @Nullable String defaultValue) {
try (StrictModeContext ignored = StrictModeContext.allowDiskReads()) {
return mSharedPreferences.getString(key, defaultValue);
}
}
/**
* Removes the shared preference entry.
*
* @param key The key of the preference to remove.
*/
public void removeKey(String key) {
SharedPreferences.Editor ed = mSharedPreferences.edit();
ed.remove(key);
ed.apply();
}
}
...@@ -32,6 +32,7 @@ import org.chromium.base.test.BaseRobolectricTestRunner; ...@@ -32,6 +32,7 @@ import org.chromium.base.test.BaseRobolectricTestRunner;
import org.chromium.base.test.util.DisableIf; import org.chromium.base.test.util.DisableIf;
import org.chromium.chrome.browser.flags.FeatureUtilities; import org.chromium.chrome.browser.flags.FeatureUtilities;
import org.chromium.chrome.browser.preferences.ChromePreferenceManager; import org.chromium.chrome.browser.preferences.ChromePreferenceManager;
import org.chromium.chrome.browser.preferences.SharedPreferencesManager;
import org.chromium.chrome.browser.preferences.themes.ThemePreferences; import org.chromium.chrome.browser.preferences.themes.ThemePreferences;
/** /**
...@@ -61,9 +62,9 @@ public class GlobalNightModeStateControllerTest { ...@@ -61,9 +62,9 @@ public class GlobalNightModeStateControllerTest {
MockitoAnnotations.initMocks(this); MockitoAnnotations.initMocks(this);
captureObservers(); captureObservers();
mGlobalNightModeStateController = new GlobalNightModeStateController( mGlobalNightModeStateController =
mSystemNightModeMonitor, mPowerSavingMonitor, new GlobalNightModeStateController(mSystemNightModeMonitor, mPowerSavingMonitor,
ChromePreferenceManager.getInstance()); SharedPreferencesManager.getInstance());
mGlobalNightModeStateController.onApplicationStateChange(HAS_RUNNING_ACTIVITIES); mGlobalNightModeStateController.onApplicationStateChange(HAS_RUNNING_ACTIVITIES);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment