Bug 753312 - Extract a PrefsHelper class that manages getting/setting of gecko prefs, and updated existing code to use it. r=cpeterson

This commit is contained in:
Kartikaya Gupta
2012-09-17 14:22:28 -04:00
parent 0ea0fedb41
commit ab6b4da662
12 changed files with 293 additions and 299 deletions

View File

@@ -8,14 +8,12 @@ package org.mozilla.gecko;
import org.mozilla.gecko.util.GeckoEventListener;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.res.Configuration;
import android.os.Bundle;
import android.preference.CheckBoxPreference;
import android.preference.EditTextPreference;
@@ -53,12 +51,11 @@ public class GeckoPreferences
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preferences);
registerEventListener("Preferences:Data");
registerEventListener("Sanitize:Finished");
}
}
@Override
public void onWindowFocusChanged(boolean hasFocus) {
@Override
public void onWindowFocusChanged(boolean hasFocus) {
if (!hasFocus)
return;
@@ -71,16 +68,12 @@ public class GeckoPreferences
@Override
protected void onDestroy() {
super.onDestroy();
unregisterEventListener("Preferences:Data");
unregisterEventListener("Sanitize:Finished");
}
public void handleMessage(String event, JSONObject message) {
try {
if (event.equals("Preferences:Data")) {
JSONArray jsonPrefs = message.getJSONArray("preferences");
refresh(jsonPrefs);
} else if (event.equals("Sanitize:Finished")) {
if (event.equals("Sanitize:Finished")) {
boolean success = message.getBoolean("success");
final int stringRes = success ? R.string.private_data_success : R.string.private_data_fail;
final Context context = this;
@@ -95,14 +88,6 @@ public class GeckoPreferences
}
}
// Initialize preferences by sending the "Preferences:Get" command to Gecko
private void initValues() {
JSONArray jsonPrefs = new JSONArray(mPreferencesList);
GeckoEvent event = GeckoEvent.createBroadcastEvent("Preferences:Get", jsonPrefs.toString());
GeckoAppShell.sendEventToGecko(event);
}
private void initGroups(PreferenceGroup preferences) {
final int count = preferences.getPreferenceCount();
for (int i = 0; i < count; i++) {
@@ -158,7 +143,9 @@ public class GeckoPreferences
setCharEncodingState(((String) newValue).equals("true"));
}
setPreference(prefName, newValue);
if (!TextUtils.isEmpty(prefName)) {
PrefsHelper.setPref(prefName, newValue);
}
if (preference instanceof ListPreference) {
// We need to find the entry for the new value
int newIndex = ((ListPreference)preference).findIndexOfValue((String) newValue);
@@ -266,18 +253,7 @@ public class GeckoPreferences
.setView((View)linearLayout)
.setPositiveButton(R.string.button_ok, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
try {
JSONObject jsonPref = new JSONObject();
jsonPref.put("name", "privacy.masterpassword.enabled");
jsonPref.put("type", "string");
jsonPref.put("value", input.getText().toString());
GeckoEvent event = GeckoEvent.createBroadcastEvent("Preferences:Set", jsonPref.toString());
GeckoAppShell.sendEventToGecko(event);
} catch(Exception ex) {
Log.e(LOGTAG, "Error setting masterpassword", ex);
}
return;
PrefsHelper.setPref("privacy.masterpassword.enabled", input.getText().toString());
}
})
.setNegativeButton(R.string.button_cancel, new DialogInterface.OnClickListener() {
@@ -299,42 +275,35 @@ public class GeckoPreferences
return dialog;
}
private void refresh(JSONArray jsonPrefs) {
// enable all preferences once we have them from gecko
GeckoAppShell.getMainHandler().post(new Runnable() {
public void run() {
mPreferenceScreen.setEnabled(true);
// Initialize preferences by requesting the preference values from Gecko
private void initValues() {
JSONArray jsonPrefs = new JSONArray(mPreferencesList);
PrefsHelper.getPrefs(jsonPrefs, new PrefsHelper.PrefHandlerBase() {
private Preference getField(String prefName) {
return (mPreferenceScreen == null ? null : mPreferenceScreen.findPreference(prefName));
}
});
try {
if (mPreferenceScreen == null)
return;
final int length = jsonPrefs.length();
for (int i = 0; i < length; i++) {
JSONObject jPref = jsonPrefs.getJSONObject(i);
final String prefName = jPref.getString("name");
final String prefType = jPref.getString("type");
final Preference pref = mPreferenceScreen.findPreference(prefName);
if (pref instanceof CheckBoxPreference && "bool".equals(prefType)) {
final boolean value = jPref.getBoolean("value");
@Override public void prefValue(String prefName, final boolean value) {
final Preference pref = getField(prefName);
if (pref instanceof CheckBoxPreference) {
GeckoAppShell.getMainHandler().post(new Runnable() {
public void run() {
if (((CheckBoxPreference)pref).isChecked() != value)
((CheckBoxPreference)pref).setChecked(value);
}
});
} else if (pref instanceof EditTextPreference && "string".equals(prefType)) {
final String value = jPref.getString("value");
}
}
@Override public void prefValue(String prefName, final String value) {
final Preference pref = getField(prefName);
if (pref instanceof EditTextPreference) {
GeckoAppShell.getMainHandler().post(new Runnable() {
public void run() {
((EditTextPreference)pref).setText(value);
}
});
} else if (pref instanceof ListPreference && "string".equals(prefType)) {
final String value = jPref.getString("value");
} else if (pref instanceof ListPreference) {
GeckoAppShell.getMainHandler().post(new Runnable() {
public void run() {
((ListPreference)pref).setValue(value);
@@ -345,8 +314,7 @@ public class GeckoPreferences
});
} else if (pref instanceof FontSizePreference) {
final FontSizePreference fontSizePref = (FontSizePreference) pref;
final String twipValue = jPref.getString("value");
fontSizePref.setSavedFontSize(twipValue);
fontSizePref.setSavedFontSize(value);
final String fontSizeName = fontSizePref.getSavedFontSizeName();
GeckoAppShell.getMainHandler().post(new Runnable() {
public void run() {
@@ -354,39 +322,17 @@ public class GeckoPreferences
}
});
}
}
} catch (JSONException e) {
Log.e(LOGTAG, "Problem parsing preferences response: ", e);
}
}
// send the Preferences:Set message to Gecko
public static void setPreference(String pref, Object value) {
if (pref == null || pref.length() == 0)
return;
try {
JSONObject jsonPref = new JSONObject();
jsonPref.put("name", pref);
if (value instanceof Boolean) {
jsonPref.put("type", "bool");
jsonPref.put("value", ((Boolean)value).booleanValue());
}
else if (value instanceof Integer) {
jsonPref.put("type", "int");
jsonPref.put("value", ((Integer)value).intValue());
}
else {
jsonPref.put("type", "string");
jsonPref.put("value", String.valueOf(value));
}
GeckoEvent event = GeckoEvent.createBroadcastEvent("Preferences:Set", jsonPref.toString());
GeckoAppShell.sendEventToGecko(event);
} catch (JSONException e) {
Log.e(LOGTAG, "JSON exception: ", e);
}
@Override public void finish() {
// enable all preferences once we have them from gecko
GeckoAppShell.getMainHandler().post(new Runnable() {
public void run() {
mPreferenceScreen.setEnabled(true);
}
});
}
});
}
private void registerEventListener(String event) {

View File

@@ -11,15 +11,9 @@ import android.view.OrientationEventListener;
import android.view.Surface;
import java.util.Arrays;
import java.util.ArrayList;
import java.util.List;
import org.json.JSONArray;
import org.json.JSONObject;
import org.mozilla.gecko.util.GeckoEventListener;
public class GeckoScreenOrientationListener implements GeckoEventListener {
public class GeckoScreenOrientationListener {
private static final String LOGTAG = "GeckoScreenOrientationListener";
static class OrientationEventListenerImpl extends OrientationEventListener {
@@ -61,12 +55,12 @@ public class GeckoScreenOrientationListener implements GeckoEventListener {
private GeckoScreenOrientationListener() {
mListener = new OrientationEventListenerImpl(GeckoApp.mAppContext);
ArrayList<String> prefs = new ArrayList<String>();
prefs.add(DEFAULT_ORIENTATION_PREF);
JSONArray jsonPrefs = new JSONArray(prefs);
GeckoAppShell.registerEventListener("Preferences:Data", this);
GeckoEvent event = GeckoEvent.createBroadcastEvent("Preferences:Get", jsonPrefs.toString());
GeckoAppShell.sendEventToGecko(event);
PrefsHelper.getPref(DEFAULT_ORIENTATION_PREF, new PrefsHelper.PrefHandlerBase() {
@Override public void prefValue(String pref, String value) {
mDefaultOrientation = orientationFromStringArray(value);
unlockScreenOrientation();
}
});
mDefaultOrientation = DEFAULT_ORIENTATION;
}
@@ -121,30 +115,6 @@ public class GeckoScreenOrientationListener implements GeckoEventListener {
mListener.disable();
}
public void handleMessage(String event, JSONObject message) {
try {
if ("Preferences:Data".equals(event)) {
JSONArray jsonPrefs = message.getJSONArray("preferences");
final int length = jsonPrefs.length();
for (int i = 0; i < length; i++) {
JSONObject jPref = jsonPrefs.getJSONObject(i);
final String prefName = jPref.getString("name");
if (DEFAULT_ORIENTATION_PREF.equals(prefName)) {
final String value = jPref.getString("value");
mDefaultOrientation = orientationFromStringArray(value);
unlockScreenOrientation();
// this is the only pref we care about. unregister after we receive it
GeckoAppShell.unregisterEventListener("Preferences:Data", this);
}
}
}
} catch (Exception e) {
Log.e(LOGTAG, "Exception handling message \"" + event + "\":", e);
}
}
private short orientationFromStringArray(String val) {
List<String> orientations = Arrays.asList(val.split(","));
// if nothing is listed, return unspecified

View File

@@ -96,6 +96,7 @@ FENNEC_JAVA_FILES = \
NSSBridge.java \
CustomEditText.java \
OnInterceptTouchListener.java \
PrefsHelper.java \
PrivateDataPreference.java \
PropertyAnimator.java \
ProfileMigrator.java \

View File

@@ -0,0 +1,168 @@
/* -*- Mode: Java; c-basic-offset: 4; tab-width: 20; indent-tabs-mode: nil; -*-
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
package org.mozilla.gecko;
import org.mozilla.gecko.util.GeckoEventListener;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import android.util.Log;
import java.util.HashMap;
import java.util.Map;
/**
* Helper class to get/set gecko prefs.
*/
public final class PrefsHelper {
private static final String LOGTAG = "GeckoPrefsHelper";
private static boolean sRegistered = false;
private static final Map<Integer, PrefHandler> sCallbacks = new HashMap<Integer, PrefHandler>();
private static int sUniqueRequestId = 1;
public static void getPref(String prefName, PrefHandler callback) {
JSONArray prefs = new JSONArray();
prefs.put(prefName);
getPrefs(prefs, callback);
}
public static void getPrefs(String[] prefNames, PrefHandler callback) {
JSONArray prefs = new JSONArray();
for (String p : prefNames) {
prefs.put(p);
}
getPrefs(prefs, callback);
}
public static void getPrefs(JSONArray prefNames, PrefHandler callback) {
int requestId;
synchronized (PrefsHelper.class) {
ensureRegistered();
requestId = sUniqueRequestId++;
sCallbacks.put(requestId, callback);
}
GeckoEvent event;
try {
JSONObject message = new JSONObject();
message.put("requestId", requestId);
message.put("preferences", prefNames);
event = GeckoEvent.createBroadcastEvent("Preferences:Get", message.toString());
GeckoAppShell.sendEventToGecko(event);
} catch (Exception e) {
Log.e(LOGTAG, "Error while composing Preferences:Get message", e);
// if we failed to send the message, drop our reference to the callback because
// otherwise it will leak since we will never get the response
synchronized (PrefsHelper.class) {
sCallbacks.remove(requestId);
}
}
}
private static void ensureRegistered() {
if (sRegistered) {
return;
}
GeckoAppShell.getEventDispatcher().registerEventListener("Preferences:Data", new GeckoEventListener() {
@Override public void handleMessage(String event, JSONObject message) {
try {
PrefHandler callback;
synchronized (PrefsHelper.class) {
try {
callback = sCallbacks.remove(message.getInt("requestId"));
} catch (Exception e) {
callback = null;
}
}
if (callback == null) {
Log.d(LOGTAG, "Preferences:Data message had an unknown requestId; ignoring");
return;
}
JSONArray jsonPrefs = message.getJSONArray("preferences");
for (int i = 0; i < jsonPrefs.length(); i++) {
JSONObject pref = jsonPrefs.getJSONObject(i);
String name = pref.getString("name");
String type = pref.getString("type");
try {
if ("bool".equals(type)) {
callback.prefValue(name, pref.getBoolean("value"));
} else if ("int".equals(type)) {
callback.prefValue(name, pref.getInt("value"));
} else if ("string".equals(type)) {
callback.prefValue(name, pref.getString("value"));
} else {
Log.e(LOGTAG, "Unknown pref value type [" + type + "] for pref [" + name + "]");
}
} catch (Exception e) {
Log.e(LOGTAG, "Handler for preference [" + name + "] threw exception", e);
}
}
callback.finish();
} catch (Exception e) {
Log.e(LOGTAG, "Error handling Preferences:Data message", e);
}
}
});
sRegistered = true;
}
public static void setPref(String pref, Object value) {
if (pref == null || pref.length() == 0) {
throw new IllegalArgumentException("Pref name must be non-empty");
}
try {
JSONObject jsonPref = new JSONObject();
jsonPref.put("name", pref);
if (value instanceof Boolean) {
jsonPref.put("type", "bool");
jsonPref.put("value", ((Boolean)value).booleanValue());
} else if (value instanceof Integer) {
jsonPref.put("type", "int");
jsonPref.put("value", ((Integer)value).intValue());
} else {
jsonPref.put("type", "string");
jsonPref.put("value", String.valueOf(value));
}
GeckoEvent event = GeckoEvent.createBroadcastEvent("Preferences:Set", jsonPref.toString());
GeckoAppShell.sendEventToGecko(event);
} catch (JSONException e) {
Log.e(LOGTAG, "Error setting pref [" + pref + "]", e);
}
}
public interface PrefHandler {
void prefValue(String pref, boolean value);
void prefValue(String pref, int value);
void prefValue(String pref, String value);
void finish();
}
public static abstract class PrefHandlerBase implements PrefHandler {
public void prefValue(String pref, boolean value) {
Log.w(LOGTAG, "Unhandled boolean value for pref [" + pref + "]");
}
public void prefValue(String pref, int value) {
Log.w(LOGTAG, "Unhandled int value for pref [" + pref + "]");
}
public void prefValue(String pref, String value) {
Log.w(LOGTAG, "Unhandled String value for pref [" + pref + "]");
}
public void finish() {
}
}
}

View File

@@ -13,11 +13,6 @@ import org.mozilla.gecko.sqlite.SQLiteBridge;
import org.mozilla.gecko.sqlite.SQLiteBridgeException;
import org.mozilla.gecko.sync.setup.SyncAccounts;
import org.mozilla.gecko.sync.setup.SyncAccounts.SyncAccountParameters;
import org.mozilla.gecko.util.GeckoEventListener;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import android.accounts.Account;
import android.content.ContentProviderOperation;
@@ -532,39 +527,26 @@ public class ProfileMigrator {
}
}
private class SyncTask implements Runnable, GeckoEventListener {
private List<String> mSyncSettingsList;
private class SyncTask implements Runnable {
private Map<String, String> mSyncSettingsMap;
// Initialize preferences by sending the "Preferences:Get" command to Gecko
protected void requestValues() {
mSyncSettingsList = Arrays.asList(SYNC_SETTINGS_LIST);
mSyncSettingsMap = new HashMap<String, String>();
JSONArray jsonPrefs = new JSONArray(mSyncSettingsList);
Log.d(LOGTAG, "Sending: " + jsonPrefs.toString());
GeckoEvent event =
GeckoEvent.createBroadcastEvent("Preferences:Get",
jsonPrefs.toString());
GeckoAppShell.sendEventToGecko(event);
}
PrefsHelper.getPrefs(SYNC_SETTINGS_LIST, new PrefsHelper.PrefHandlerBase() {
@Override public void prefValue(String pref, boolean value) {
mSyncSettingsMap.put(pref, value ? "1" : "0");
}
// Receive settings reply from Gecko, do the rest of the setup
public void handleMessage(String event, JSONObject message) {
Log.d(LOGTAG, "Received event: " + event);
try {
if (event.equals("Preferences:Data")) {
// Receive most settings from Gecko's service.
// This includes personal info, so don't log.
// Log.d(LOGTAG, "Message: " + message.toString());
JSONArray jsonPrefs = message.getJSONArray("preferences");
// Check that the batch of preferences we got notified of are in
// the ones we requested and not those requested by other java code.
if (!parsePrefs(jsonPrefs))
return;
unregisterEventListener("Preferences:Data", this);
@Override public void prefValue(String pref, String value) {
if (!TextUtils.isEmpty(value)) {
mSyncSettingsMap.put(pref, value);
} else {
Log.w(LOGTAG, "Could not recover setting for = " + pref);
mSyncSettingsMap.put(pref, null);
}
}
@Override public void finish() {
// Now call the password provider to fill in the rest.
for (String location: SYNC_REALM_LIST) {
Log.d(LOGTAG, "Checking: " + location);
@@ -581,9 +563,7 @@ public class ProfileMigrator {
// Call Sync and transfer settings.
configureSync();
}
} catch (Exception e) {
Log.e(LOGTAG, "Exception handling message \"" + event + "\":", e);
}
});
}
protected String getPassword(String realm) {
@@ -619,41 +599,6 @@ public class ProfileMigrator {
return result;
}
// Returns true if we sucessfully got the preferences we requested.
protected boolean parsePrefs(JSONArray jsonPrefs) {
try {
final int length = jsonPrefs.length();
for (int i = 0; i < length; i++) {
JSONObject jPref = jsonPrefs.getJSONObject(i);
final String prefName = jPref.getString("name");
// Check to make sure we're working with preferences we requested.
if (!mSyncSettingsList.contains(prefName))
return false;
final String prefType = jPref.getString("type");
if ("bool".equals(prefType)) {
final boolean value = jPref.getBoolean("value");
mSyncSettingsMap.put(prefName, value ? "1" : "0");
} else {
final String value = jPref.getString("value");
if (!TextUtils.isEmpty(value)) {
mSyncSettingsMap.put(prefName, value);
} else {
Log.w(LOGTAG, "Could not recover setting for = " + prefName);
mSyncSettingsMap.put(prefName, null);
}
}
}
} catch (JSONException e) {
Log.e(LOGTAG, "Exception handling preferences answer: "
+ e.getMessage());
return false;
}
return true;
}
protected void configureSync() {
final String userName = mSyncSettingsMap.get("services.sync.account");
final String syncKey = mSyncSettingsMap.get("Mozilla Services Encryption Passphrase");
@@ -692,7 +637,6 @@ public class ProfileMigrator {
protected void registerAndRequest() {
GeckoAppShell.getHandler().post(new Runnable() {
public void run() {
registerEventListener("Preferences:Data", SyncTask.this);
requestValues();
}
});
@@ -718,14 +662,6 @@ public class ProfileMigrator {
}
}.execute(mContext);
}
private void registerEventListener(String event, GeckoEventListener listener) {
GeckoAppShell.getEventDispatcher().registerEventListener(event, listener);
}
private void unregisterEventListener(String event, GeckoEventListener listener) {
GeckoAppShell.getEventDispatcher().unregisterEventListener(event, listener);
}
}
private class MiscTask implements Runnable {

View File

@@ -6,6 +6,7 @@
package org.mozilla.gecko.gfx;
import org.mozilla.gecko.GeckoAppShell;
import org.mozilla.gecko.PrefsHelper;
import org.mozilla.gecko.util.FloatUtils;
import org.json.JSONArray;
@@ -15,6 +16,7 @@ import android.graphics.RectF;
import android.util.FloatMath;
import android.util.Log;
import java.util.HashMap;
import java.util.Map;
final class DisplayPortCalculator {
@@ -58,7 +60,8 @@ final class DisplayPortCalculator {
sStrategy.resetPageState();
}
static void addPrefNames(JSONArray prefs) {
static void initPrefs() {
JSONArray prefs = new JSONArray();
prefs.put(PREF_DISPLAYPORT_STRATEGY);
prefs.put(PREF_DISPLAYPORT_FM_MULTIPLIER);
prefs.put(PREF_DISPLAYPORT_FM_DANGER_X);
@@ -71,6 +74,18 @@ final class DisplayPortCalculator {
prefs.put(PREF_DISPLAYPORT_VB_DANGER_X_INCR);
prefs.put(PREF_DISPLAYPORT_VB_DANGER_Y_INCR);
prefs.put(PREF_DISPLAYPORT_PB_VELOCITY_THRESHOLD);
PrefsHelper.getPrefs(prefs, new PrefsHelper.PrefHandlerBase() {
private Map<String, Integer> mValues = new HashMap<String, Integer>();
@Override public void prefValue(String pref, int value) {
mValues.put(pref, value);
}
@Override public void finish() {
setStrategy(mValues);
}
});
}
/**

View File

@@ -15,7 +15,6 @@ import org.mozilla.gecko.ui.PanZoomTarget;
import org.mozilla.gecko.util.EventDispatcher;
import org.mozilla.gecko.util.GeckoEventResponder;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
@@ -130,17 +129,14 @@ public class GeckoLayerClient
registerEventListener("Viewport:PageSize");
registerEventListener("Viewport:CalculateDisplayPort");
registerEventListener("Checkerboard:Toggle");
registerEventListener("Preferences:Data");
mView.setListener(this);
mView.setLayerRenderer(mLayerRenderer);
sendResizeEventIfNecessary(true);
JSONArray prefs = new JSONArray();
DisplayPortCalculator.addPrefNames(prefs);
PluginLayer.addPrefNames(prefs);
GeckoAppShell.sendEventToGecko(GeckoEvent.createBroadcastEvent("Preferences:Get", prefs.toString()));
DisplayPortCalculator.initPrefs();
PluginLayer.initPrefs();
}
public void destroy() {
@@ -149,7 +145,6 @@ public class GeckoLayerClient
unregisterEventListener("Viewport:PageSize");
unregisterEventListener("Viewport:CalculateDisplayPort");
unregisterEventListener("Checkerboard:Toggle");
unregisterEventListener("Preferences:Data");
}
private void registerEventListener(String event) {
@@ -362,25 +357,6 @@ public class GeckoLayerClient
mReturnDisplayPort = DisplayPortCalculator.calculate(newMetrics, null);
} else if ("Checkerboard:Toggle".equals(event)) {
mView.setCheckerboardShouldShowChecks(message.getBoolean("value"));
} else if ("Preferences:Data".equals(event)) {
JSONArray jsonPrefs = message.getJSONArray("preferences");
Map<String, Integer> prefValues = new HashMap<String, Integer>();
for (int i = jsonPrefs.length() - 1; i >= 0; i--) {
JSONObject pref = jsonPrefs.getJSONObject(i);
String name = pref.getString("name");
try {
prefValues.put(name, pref.getInt("value"));
} catch (JSONException je) {
// the pref value couldn't be parsed as an int. drop this pref
// and continue with the rest
}
}
// check return value from setStrategy to make sure that this is the
// right batch of prefs, since other java code may also have sent requests
// for prefs.
if (DisplayPortCalculator.setStrategy(prefValues) && PluginLayer.setUsePlaceholder(prefValues)) {
unregisterEventListener("Preferences:Data");
}
}
} catch (JSONException e) {
Log.e(LOGTAG, "Error decoding JSON in " + event + " handler", e);

View File

@@ -6,11 +6,10 @@ package org.mozilla.gecko.gfx;
import org.mozilla.gecko.GeckoApp;
import org.mozilla.gecko.GeckoAppShell;
import org.mozilla.gecko.PrefsHelper;
import org.mozilla.gecko.SurfaceBits;
import org.mozilla.gecko.util.FloatUtils;
import org.json.JSONArray;
import android.graphics.PixelFormat;
import android.graphics.Rect;
import android.graphics.RectF;
@@ -22,7 +21,6 @@ import android.view.View;
import android.widget.AbsoluteLayout;
import java.nio.FloatBuffer;
import java.util.Map;
public class PluginLayer extends TileLayer {
private static final String LOGTAG = "PluginLayer";
@@ -68,19 +66,13 @@ public class PluginLayer extends TileLayer {
mLayoutParams = new PluginLayoutParams(rect, maxDimension);
}
static void addPrefNames(JSONArray prefs) {
prefs.put(PREF_PLUGIN_USE_PLACEHOLDER);
}
static boolean setUsePlaceholder(Map<String, Integer> prefs) {
Integer usePlaceholder = prefs.get(PREF_PLUGIN_USE_PLACEHOLDER);
if (usePlaceholder == null) {
return false;
}
sUsePlaceholder = (int)usePlaceholder == 1 ? true : false;
Log.i(LOGTAG, "Using plugin placeholder: " + sUsePlaceholder);
return true;
static void initPrefs() {
PrefsHelper.getPref(PREF_PLUGIN_USE_PLACEHOLDER, new PrefsHelper.PrefHandlerBase() {
@Override public void prefValue(String pref, int value) {
sUsePlaceholder = (value == 1);
Log.i(LOGTAG, "Using plugin placeholder: " + sUsePlaceholder);
}
});
}
public void setVisible(boolean newVisible) {

View File

@@ -129,21 +129,26 @@ public class testPasswordEncrypt extends BaseTest {
jsonPref.put("type", "string");
jsonPref.put("value", passwd);
mActions.sendGeckoEvent("Preferences:Set", jsonPref.toString());
// Wait for confirmation of the pref change before proceeding with the test.
JSONArray getPrefData = new JSONArray();
getPrefData.put("privacy.masterpassword.enabled");
JSONObject message = new JSONObject();
message.put("requestId", "testPasswordEncrypt");
message.put("preferences", getPrefData);
Actions.RepeatedEventExpecter contentEventExpecter = mActions.expectGeckoEvent("Preferences:Data");
mActions.sendGeckoEvent("Preferences:Get", message.toString());
// Receiving a Preferences:Data event is not conclusive evidence that *our*
// preference has been set -- another component may be changing preferences
// at the same time. Mitigate this risk by waiting for a Preference:Data
// and then waiting for a period of time in which no more Preference:Data
// events are received.
// TODO: add a new expectGeckoEvent function that listens for a Preferences:Data
// message with a specific requestId
contentEventExpecter.blockUntilClear(2000);
} catch (Exception ex) {
mAsserter.ok(false, "exception in toggleMasterPassword", ex.toString());
}
// Wait for confirmation of the pref change before proceeding with the test.
JSONArray getPrefData = new JSONArray();
getPrefData.put("privacy.masterpassword.enabled");
Actions.RepeatedEventExpecter contentEventExpecter = mActions.expectGeckoEvent("Preferences:Data");
mActions.sendGeckoEvent("Preferences:Get", getPrefData.toString());
// Receiving a Preferences:Data event is not conclusive evidence that *our*
// preference has been set -- another component may be changing preferences
// at the same time. Mitigate this risk by waiting for a Preference:Data
// and then waiting for a period of time in which no more Preference:Data
// events are received.
contentEventExpecter.blockUntilClear(2000);
}
public void tearDown() throws Exception {

View File

@@ -5,6 +5,7 @@
package org.mozilla.gecko.ui;
import org.mozilla.gecko.PrefsHelper;
import org.mozilla.gecko.util.FloatUtils;
import org.json.JSONArray;
@@ -12,6 +13,7 @@ import org.json.JSONArray;
import android.util.Log;
import android.view.View;
import java.util.HashMap;
import java.util.Map;
/**
@@ -61,7 +63,8 @@ abstract class Axis {
return (value == null || value < 0 ? defaultValue : value);
}
static void addPrefNames(JSONArray prefs) {
static void initPrefs() {
JSONArray prefs = new JSONArray();
prefs.put(PREF_SCROLLING_FRICTION_FAST);
prefs.put(PREF_SCROLLING_FRICTION_SLOW);
prefs.put(PREF_SCROLLING_VELOCITY_THRESHOLD);
@@ -69,6 +72,18 @@ abstract class Axis {
prefs.put(PREF_SCROLLING_OVERSCROLL_DECEL_RATE);
prefs.put(PREF_SCROLLING_OVERSCROLL_SNAP_LIMIT);
prefs.put(PREF_SCROLLING_MIN_SCROLLABLE_DISTANCE);
PrefsHelper.getPrefs(prefs, new PrefsHelper.PrefHandlerBase() {
Map<String, Integer> mPrefs = new HashMap<String, Integer>();
@Override public void prefValue(String name, int value) {
mPrefs.put(name, value);
}
@Override public void finish() {
setPrefs(mPrefs);
}
});
}
static void setPrefs(Map<String, Integer> prefs) {

View File

@@ -8,6 +8,7 @@ package org.mozilla.gecko.ui;
import org.mozilla.gecko.GeckoApp;
import org.mozilla.gecko.GeckoAppShell;
import org.mozilla.gecko.GeckoEvent;
import org.mozilla.gecko.PrefsHelper;
import org.mozilla.gecko.ZoomConstraints;
import org.mozilla.gecko.gfx.ImmutableViewportMetrics;
import org.mozilla.gecko.gfx.PointUtils;
@@ -16,8 +17,6 @@ import org.mozilla.gecko.util.EventDispatcher;
import org.mozilla.gecko.util.FloatUtils;
import org.mozilla.gecko.util.GeckoEventListener;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import android.graphics.PointF;
@@ -28,8 +27,6 @@ import android.view.GestureDetector;
import android.view.MotionEvent;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.StringTokenizer;
import java.util.Timer;
import java.util.TimerTask;
@@ -48,8 +45,6 @@ public class PanZoomController
private static String MESSAGE_ZOOM_RECT = "Browser:ZoomToRect";
private static String MESSAGE_ZOOM_PAGE = "Browser:ZoomToPageWidth";
private static String MESSAGE_PREFS_GET = "Preferences:Get";
private static String MESSAGE_PREFS_DATA = "Preferences:Data";
private static final String PREF_ZOOM_ANIMATION_FRAMES = "ui.zooming.animation_frames";
@@ -139,18 +134,18 @@ public class PanZoomController
mEventDispatcher = eventDispatcher;
registerEventListener(MESSAGE_ZOOM_RECT);
registerEventListener(MESSAGE_ZOOM_PAGE);
registerEventListener(MESSAGE_PREFS_DATA);
JSONArray prefs = new JSONArray();
prefs.put(PREF_ZOOM_ANIMATION_FRAMES);
Axis.addPrefNames(prefs);
GeckoAppShell.sendEventToGecko(GeckoEvent.createBroadcastEvent(MESSAGE_PREFS_GET, prefs.toString()));
PrefsHelper.getPref(PREF_ZOOM_ANIMATION_FRAMES, new PrefsHelper.PrefHandlerBase() {
@Override public void prefValue(String pref, String value) {
setZoomAnimationFrames(value);
}
});
Axis.initPrefs();
}
public void destroy() {
unregisterEventListener(MESSAGE_ZOOM_RECT);
unregisterEventListener(MESSAGE_ZOOM_PAGE);
unregisterEventListener(MESSAGE_PREFS_DATA);
mSubscroller.destroy();
}
@@ -213,32 +208,6 @@ public class PanZoomController
animatedZoomTo(r);
}
});
} else if (MESSAGE_PREFS_DATA.equals(event)) {
JSONArray jsonPrefs = message.getJSONArray("preferences");
Map<String, Integer> axisPrefs = new HashMap<String, Integer>();
String zoomAnimationFrames = null;
for (int i = jsonPrefs.length() - 1; i >= 0; i--) {
JSONObject pref = jsonPrefs.getJSONObject(i);
String name = pref.getString("name");
if (PREF_ZOOM_ANIMATION_FRAMES.equals(name)) {
zoomAnimationFrames = pref.getString("value");
} else {
try {
axisPrefs.put(name, pref.getInt("value"));
} catch (JSONException je) {
// the value could not be parsed as an int. ignore this
// pref and continue
}
}
}
// check for null to make sure the batch of preferences we got notified
// of are in the fact the ones we requested and not those requested by
// other java code
if (zoomAnimationFrames != null) {
setZoomAnimationFrames(zoomAnimationFrames);
Axis.setPrefs(axisPrefs);
unregisterEventListener(MESSAGE_PREFS_DATA);
}
}
} catch (Exception e) {
Log.e(LOGTAG, "Exception handling message \"" + event + "\":", e);

View File

@@ -811,7 +811,7 @@ var BrowserApp = {
let json = JSON.parse(aPrefNames);
let prefs = [];
for each (let prefName in json) {
for each (let prefName in json.preferences) {
let pref = {
name: prefName
};
@@ -880,6 +880,7 @@ var BrowserApp = {
sendMessageToJava({
gecko: {
type: "Preferences:Data",
requestId: json.requestId, // opaque request identifier, can be any string/int/whatever
preferences: prefs
}
});