1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 package org.chromium.chrome.browser.accessibility;
7 import android.content.Context;
8 import android.content.SharedPreferences;
9 import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
10 import android.preference.PreferenceManager;
12 import org.chromium.base.CalledByNative;
13 import org.chromium.base.NativeCall;
14 import org.chromium.base.ThreadUtils;
16 import java.util.HashMap;
20 * Singleton wrapper class for native FontSizePrefs. Provides support for preferences for Font
21 * Scale Factor, Force Enable Zoom, and User Set Force Enable Zoom. User Set Force Enable Zoom
22 * tracks whether the user has manually set the force enable zoom button, while Force Enable Zoom
23 * tracks whether force enable zoom is on or off. Font Scale Factor reflects the global font scale.
25 public class FontSizePrefs implements OnSharedPreferenceChangeListener {
26 public static final String PREF_FORCE_ENABLE_ZOOM = "force_enable_zoom";
27 public static final String PREF_TEXT_SCALE = "text_scale";
28 public static final String PREF_USER_SET_FORCE_ENABLE_ZOOM = "user_set_force_enable_zoom";
30 private static FontSizePrefs sFontSizePrefs;
31 private final long mFontSizePrefsAndroidPtr;
32 private final SharedPreferences mSharedPreferences;
33 private final Map<Observer, FontSizePrefsObserverWrapper> mObserverMap;
36 * Observer interface for observing changes in FontScaleFactor, ForceEnableZoom and
37 * UserSetForceEnableZoom.
39 public interface Observer {
40 void onChangeFontSize(float newFontSize);
41 void onChangeForceEnableZoom(boolean enabled);
42 void onChangeUserSetForceEnableZoom(boolean enabled);
46 * Wrapper for FontSizePrefsObserverAndroid.
48 private static class FontSizePrefsObserverWrapper {
49 private final Observer mFontSizePrefsObserver;
50 private final long mNativeFontSizePrefsObserverWrapperPtr;
52 public FontSizePrefsObserverWrapper(Observer observer) {
53 mNativeFontSizePrefsObserverWrapperPtr = nativeInitObserverAndroid();
54 mFontSizePrefsObserver = observer;
57 public long getNativePtr() {
58 return mNativeFontSizePrefsObserverWrapperPtr;
61 public void destroy() {
62 nativeDestroyObserverAndroid(mNativeFontSizePrefsObserverWrapperPtr);
65 @CalledByNative("FontSizePrefsObserverWrapper")
66 public void onChangeFontSize(float newFontSize) {
67 mFontSizePrefsObserver.onChangeFontSize(newFontSize);
70 @CalledByNative("FontSizePrefsObserverWrapper")
71 public void onChangeForceEnableZoom(boolean enabled) {
72 mFontSizePrefsObserver.onChangeForceEnableZoom(enabled);
75 public void onChangeUserSetForceEnableZoom(boolean enabled) {
76 mFontSizePrefsObserver.onChangeUserSetForceEnableZoom(enabled);
79 @NativeCall("FontSizePrefsObserverWrapper")
80 private native long nativeInitObserverAndroid();
82 @NativeCall("FontSizePrefsObserverWrapper")
83 private native void nativeDestroyObserverAndroid(long nativeFontSizePrefsObserverAndroid);
86 private FontSizePrefs(Context context) {
87 mSharedPreferences = PreferenceManager.getDefaultSharedPreferences(context);
88 mSharedPreferences.registerOnSharedPreferenceChangeListener(this);
89 mFontSizePrefsAndroidPtr = nativeInit();
90 mObserverMap = new HashMap<Observer, FontSizePrefsObserverWrapper>();
94 * Returns the FontSizePrefs corresponding to the inputted Profile. If no FontSizePrefs existed,
95 * this method will create one.
97 public static FontSizePrefs getInstance(Context context) {
98 ThreadUtils.assertOnUiThread();
99 if (sFontSizePrefs == null) {
100 sFontSizePrefs = new FontSizePrefs(context);
102 return sFontSizePrefs;
106 * Adds the observer to listen for Font Scale and Force Enable Zoom preferences.
107 * @return true if the observerMap was changed as a result of the call.
109 public boolean addObserver(Observer obs) {
110 if (mObserverMap.containsKey(obs)) return false;
111 FontSizePrefsObserverWrapper wrappedObserver =
112 new FontSizePrefsObserverWrapper(obs);
113 nativeAddObserver(mFontSizePrefsAndroidPtr, wrappedObserver.getNativePtr());
114 mObserverMap.put(obs, wrappedObserver);
119 * Removes the observer and unregisters it from Font Scale and Force Enable Zoom changes.
120 * @return true if an observer was removed as a result of the call.
122 public boolean removeObserver(Observer obs) {
123 FontSizePrefsObserverWrapper wrappedObserver = mObserverMap.remove(obs);
124 if (wrappedObserver == null) return false;
125 nativeRemoveObserver(mFontSizePrefsAndroidPtr, wrappedObserver.getNativePtr());
126 wrappedObserver.destroy();
131 * Sets UserSetForceEnableZoom. This is the only one of three preferences stored through
134 public void setUserSetForceEnableZoom(boolean enabled) {
135 SharedPreferences.Editor sharedPreferencesEditor = mSharedPreferences.edit();
136 sharedPreferencesEditor.putBoolean(PREF_USER_SET_FORCE_ENABLE_ZOOM, enabled);
137 sharedPreferencesEditor.apply();
141 * Returns true if user has manually set ForceEnableZoom and false otherwise.
143 public boolean getUserSetForceEnableZoom() {
144 return mSharedPreferences.getBoolean(PREF_USER_SET_FORCE_ENABLE_ZOOM,
148 public void setFontScaleFactor(float fontScaleFactor) {
149 nativeSetFontScaleFactor(mFontSizePrefsAndroidPtr, fontScaleFactor);
153 public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
154 if (PREF_USER_SET_FORCE_ENABLE_ZOOM.equals(key)) {
155 for (FontSizePrefsObserverWrapper obsWrapper : mObserverMap.values()) {
156 obsWrapper.onChangeUserSetForceEnableZoom(getUserSetForceEnableZoom());
161 public float getFontScaleFactor() {
162 return nativeGetFontScaleFactor(mFontSizePrefsAndroidPtr);
165 public void setForceEnableZoom(boolean enabled) {
166 nativeSetForceEnableZoom(mFontSizePrefsAndroidPtr, enabled);
169 public boolean getForceEnableZoom() {
170 return nativeGetForceEnableZoom(mFontSizePrefsAndroidPtr);
173 private native void nativeAddObserver(long nativeFontSizePrefsAndroid,
174 long nativeObserverPtr);
176 private native void nativeRemoveObserver(long nativeFontSizePrefsAndroid,
177 long nativeObserverPtr);
179 private native long nativeInit();
181 private native void nativeSetFontScaleFactor(long nativeFontSizePrefsAndroid, float font);
183 private native float nativeGetFontScaleFactor(long nativeFontSizePrefsAndroid);
185 private native boolean nativeGetForceEnableZoom(long nativeFontSizePrefsAndroid);
187 private native void nativeSetForceEnableZoom(long nativeFontSizePrefsAndroid, boolean enabled);