94e3b79b04c81f132007640d155d0816f94eeb5e
[platform/framework/web/crosswalk.git] / src / chrome / android / java / src / org / chromium / chrome / browser / accessibility / FontSizePrefs.java
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.
4
5 package org.chromium.chrome.browser.accessibility;
6
7 import android.content.Context;
8 import android.content.SharedPreferences;
9 import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
10 import android.preference.PreferenceManager;
11
12 import org.chromium.base.CalledByNative;
13 import org.chromium.base.NativeCall;
14 import org.chromium.base.ThreadUtils;
15
16 import java.util.HashMap;
17 import java.util.Map;
18
19 /**
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.
24  */
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";
29
30     private static FontSizePrefs sFontSizePrefs;
31     private final long mFontSizePrefsAndroidPtr;
32     private final SharedPreferences mSharedPreferences;
33     private final Map<Observer, FontSizePrefsObserverWrapper> mObserverMap;
34
35     /**
36      * Observer interface for observing changes in FontScaleFactor, ForceEnableZoom and
37      * UserSetForceEnableZoom.
38      */
39     public interface Observer {
40         void onChangeFontSize(float newFontSize);
41         void onChangeForceEnableZoom(boolean enabled);
42         void onChangeUserSetForceEnableZoom(boolean enabled);
43     }
44
45     /**
46      * Wrapper for FontSizePrefsObserverAndroid.
47      */
48     private static class FontSizePrefsObserverWrapper {
49         private final Observer mFontSizePrefsObserver;
50         private final long mNativeFontSizePrefsObserverWrapperPtr;
51
52         public FontSizePrefsObserverWrapper(Observer observer) {
53             mNativeFontSizePrefsObserverWrapperPtr = nativeInitObserverAndroid();
54             mFontSizePrefsObserver = observer;
55         }
56
57         public long getNativePtr() {
58             return mNativeFontSizePrefsObserverWrapperPtr;
59         }
60
61         public void destroy() {
62             nativeDestroyObserverAndroid(mNativeFontSizePrefsObserverWrapperPtr);
63         }
64
65         @CalledByNative("FontSizePrefsObserverWrapper")
66         public void onChangeFontSize(float newFontSize) {
67             mFontSizePrefsObserver.onChangeFontSize(newFontSize);
68         }
69
70         @CalledByNative("FontSizePrefsObserverWrapper")
71         public void onChangeForceEnableZoom(boolean enabled) {
72             mFontSizePrefsObserver.onChangeForceEnableZoom(enabled);
73         }
74
75         public void onChangeUserSetForceEnableZoom(boolean enabled) {
76             mFontSizePrefsObserver.onChangeUserSetForceEnableZoom(enabled);
77         }
78
79         @NativeCall("FontSizePrefsObserverWrapper")
80         private native long nativeInitObserverAndroid();
81
82         @NativeCall("FontSizePrefsObserverWrapper")
83         private native void nativeDestroyObserverAndroid(long nativeFontSizePrefsObserverAndroid);
84     }
85
86     private FontSizePrefs(Context context) {
87         mSharedPreferences = PreferenceManager.getDefaultSharedPreferences(context);
88         mSharedPreferences.registerOnSharedPreferenceChangeListener(this);
89         mFontSizePrefsAndroidPtr = nativeInit();
90         mObserverMap = new HashMap<Observer, FontSizePrefsObserverWrapper>();
91     }
92
93     /**
94      * Returns the FontSizePrefs corresponding to the inputted Profile. If no FontSizePrefs existed,
95      * this method will create one.
96      */
97     public static FontSizePrefs getInstance(Context context) {
98         ThreadUtils.assertOnUiThread();
99         if (sFontSizePrefs == null) {
100             sFontSizePrefs = new FontSizePrefs(context);
101         }
102         return sFontSizePrefs;
103     }
104
105     /**
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.
108      */
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);
115         return true;
116     }
117
118     /**
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.
121      */
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();
127         return true;
128     }
129
130     /**
131      * Sets UserSetForceEnableZoom. This is the only one of three preferences stored through
132      * SharedPreferences.
133      */
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();
138     }
139
140     /**
141      * Returns true if user has manually set ForceEnableZoom and false otherwise.
142      */
143     public boolean getUserSetForceEnableZoom() {
144         return mSharedPreferences.getBoolean(PREF_USER_SET_FORCE_ENABLE_ZOOM,
145                 false);
146     }
147
148     public void setFontScaleFactor(float fontScaleFactor) {
149         nativeSetFontScaleFactor(mFontSizePrefsAndroidPtr, fontScaleFactor);
150     }
151
152     @Override
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());
157             }
158         }
159     }
160
161     public float getFontScaleFactor() {
162         return nativeGetFontScaleFactor(mFontSizePrefsAndroidPtr);
163     }
164
165     public void setForceEnableZoom(boolean enabled) {
166         nativeSetForceEnableZoom(mFontSizePrefsAndroidPtr, enabled);
167     }
168
169     public boolean getForceEnableZoom() {
170         return nativeGetForceEnableZoom(mFontSizePrefsAndroidPtr);
171     }
172
173     private native void nativeAddObserver(long nativeFontSizePrefsAndroid,
174             long nativeObserverPtr);
175
176     private native void nativeRemoveObserver(long nativeFontSizePrefsAndroid,
177             long nativeObserverPtr);
178
179     private native long nativeInit();
180
181     private native void nativeSetFontScaleFactor(long nativeFontSizePrefsAndroid, float font);
182
183     private native float nativeGetFontScaleFactor(long nativeFontSizePrefsAndroid);
184
185     private native boolean nativeGetForceEnableZoom(long nativeFontSizePrefsAndroid);
186
187     private native void nativeSetForceEnableZoom(long nativeFontSizePrefsAndroid, boolean enabled);
188 }