Wed, 31 Dec 2014 07:22:50 +0100
Correct previous dual key logic pending first delivery installment.
1 /* -*- Mode: Java; c-basic-offset: 4; tab-width: 20; indent-tabs-mode: nil; -*-
2 * This Source Code Form is subject to the terms of the Mozilla Public
3 * License, v. 2.0. If a copy of the MPL was not distributed with this
4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
6 package org.mozilla.gecko;
8 import org.mozilla.gecko.util.GeckoEventListener;
10 import org.json.JSONArray;
11 import org.json.JSONException;
12 import org.json.JSONObject;
14 import android.util.Log;
15 import android.util.SparseArray;
17 import java.util.ArrayList;
19 /**
20 * Helper class to get/set gecko prefs.
21 */
22 public final class PrefsHelper {
23 private static final String LOGTAG = "GeckoPrefsHelper";
25 private static boolean sRegistered = false;
26 private static final SparseArray<PrefHandler> sCallbacks = new SparseArray<PrefHandler>();
27 private static int sUniqueRequestId = 1;
29 public static int getPref(String prefName, PrefHandler callback) {
30 return getPrefsInternal(new String[] { prefName }, callback);
31 }
33 public static int getPrefs(String[] prefNames, PrefHandler callback) {
34 return getPrefsInternal(prefNames, callback);
35 }
37 public static int getPrefs(ArrayList<String> prefNames, PrefHandler callback) {
38 return getPrefsInternal(prefNames.toArray(new String[prefNames.size()]), callback);
39 }
41 private static int getPrefsInternal(String[] prefNames, PrefHandler callback) {
42 int requestId;
43 synchronized (PrefsHelper.class) {
44 ensureRegistered();
46 requestId = sUniqueRequestId++;
47 sCallbacks.put(requestId, callback);
48 }
50 GeckoEvent event;
51 if (callback.isObserver()) {
52 event = GeckoEvent.createPreferencesObserveEvent(requestId, prefNames);
53 } else {
54 event = GeckoEvent.createPreferencesGetEvent(requestId, prefNames);
55 }
56 GeckoAppShell.sendEventToGecko(event);
58 return requestId;
59 }
61 private static void ensureRegistered() {
62 if (sRegistered) {
63 return;
64 }
66 GeckoAppShell.getEventDispatcher().registerEventListener("Preferences:Data", new GeckoEventListener() {
67 @Override public void handleMessage(String event, JSONObject message) {
68 try {
69 PrefHandler callback;
70 synchronized (PrefsHelper.class) {
71 try {
72 int requestId = message.getInt("requestId");
73 callback = sCallbacks.get(requestId);
74 if (callback != null && !callback.isObserver()) {
75 sCallbacks.delete(requestId);
76 }
77 } catch (Exception e) {
78 callback = null;
79 }
80 }
81 if (callback == null) {
82 Log.d(LOGTAG, "Preferences:Data message had an unknown requestId; ignoring");
83 return;
84 }
86 JSONArray jsonPrefs = message.getJSONArray("preferences");
87 for (int i = 0; i < jsonPrefs.length(); i++) {
88 JSONObject pref = jsonPrefs.getJSONObject(i);
89 String name = pref.getString("name");
90 String type = pref.getString("type");
91 try {
92 if ("bool".equals(type)) {
93 callback.prefValue(name, pref.getBoolean("value"));
94 } else if ("int".equals(type)) {
95 callback.prefValue(name, pref.getInt("value"));
96 } else if ("string".equals(type)) {
97 callback.prefValue(name, pref.getString("value"));
98 } else {
99 Log.e(LOGTAG, "Unknown pref value type [" + type + "] for pref [" + name + "]");
100 }
101 } catch (Exception e) {
102 Log.e(LOGTAG, "Handler for preference [" + name + "] threw exception", e);
103 }
104 }
105 callback.finish();
106 } catch (Exception e) {
107 Log.e(LOGTAG, "Error handling Preferences:Data message", e);
108 }
109 }
110 });
111 sRegistered = true;
112 }
114 public static void setPref(String pref, Object value) {
115 if (pref == null || pref.length() == 0) {
116 throw new IllegalArgumentException("Pref name must be non-empty");
117 }
119 try {
120 JSONObject jsonPref = new JSONObject();
121 jsonPref.put("name", pref);
122 if (value instanceof Boolean) {
123 jsonPref.put("type", "bool");
124 jsonPref.put("value", ((Boolean)value).booleanValue());
125 } else if (value instanceof Integer) {
126 jsonPref.put("type", "int");
127 jsonPref.put("value", ((Integer)value).intValue());
128 } else {
129 jsonPref.put("type", "string");
130 jsonPref.put("value", String.valueOf(value));
131 }
133 GeckoEvent event = GeckoEvent.createBroadcastEvent("Preferences:Set", jsonPref.toString());
134 GeckoAppShell.sendEventToGecko(event);
135 } catch (JSONException e) {
136 Log.e(LOGTAG, "Error setting pref [" + pref + "]", e);
137 }
138 }
140 public static void removeObserver(int requestId) {
141 if (requestId < 0) {
142 throw new IllegalArgumentException("Invalid request ID");
143 }
145 synchronized (PrefsHelper.class) {
146 PrefHandler callback = sCallbacks.get(requestId);
147 sCallbacks.delete(requestId);
149 if (callback == null) {
150 Log.e(LOGTAG, "Unknown request ID " + requestId);
151 return;
152 }
153 }
155 GeckoEvent event = GeckoEvent.createBroadcastEvent("Preferences:RemoveObserver",
156 Integer.toString(requestId));
157 GeckoAppShell.sendEventToGecko(event);
158 }
160 public interface PrefHandler {
161 void prefValue(String pref, boolean value);
162 void prefValue(String pref, int value);
163 void prefValue(String pref, String value);
164 boolean isObserver();
165 void finish();
166 }
168 public static abstract class PrefHandlerBase implements PrefHandler {
169 @Override
170 public void prefValue(String pref, boolean value) {
171 Log.w(LOGTAG, "Unhandled boolean value for pref [" + pref + "]");
172 }
174 @Override
175 public void prefValue(String pref, int value) {
176 Log.w(LOGTAG, "Unhandled int value for pref [" + pref + "]");
177 }
179 @Override
180 public void prefValue(String pref, String value) {
181 Log.w(LOGTAG, "Unhandled String value for pref [" + pref + "]");
182 }
184 @Override
185 public void finish() {
186 }
188 @Override
189 public boolean isObserver() {
190 return false;
191 }
192 }
193 }