mobile/android/base/preferences/SearchPreferenceCategory.java

Wed, 31 Dec 2014 07:22:50 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Wed, 31 Dec 2014 07:22:50 +0100
branch
TOR_BUG_3246
changeset 4
fc2d59ddac77
permissions
-rw-r--r--

Correct previous dual key logic pending first delivery installment.

     1 /* This Source Code Form is subject to the terms of the Mozilla Public
     2  * License, v. 2.0. If a copy of the MPL was not distributed with this
     3  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
     5 package org.mozilla.gecko.preferences;
     7 import android.content.Context;
     8 import android.preference.Preference;
     9 import android.util.AttributeSet;
    10 import android.util.Log;
    12 import org.json.JSONArray;
    13 import org.json.JSONException;
    14 import org.json.JSONObject;
    16 import org.mozilla.gecko.GeckoAppShell;
    17 import org.mozilla.gecko.GeckoEvent;
    18 import org.mozilla.gecko.util.GeckoEventListener;
    19 import org.mozilla.gecko.util.ThreadUtils;
    21 public class SearchPreferenceCategory extends CustomListCategory implements GeckoEventListener {
    22     public static final String LOGTAG = "SearchPrefCategory";
    24     public SearchPreferenceCategory(Context context) {
    25         super(context);
    26     }
    28     public SearchPreferenceCategory(Context context, AttributeSet attrs) {
    29         super(context, attrs);
    30     }
    32     public SearchPreferenceCategory(Context context, AttributeSet attrs, int defStyle) {
    33         super(context, attrs, defStyle);
    34     }
    36     @Override
    37     protected void onAttachedToActivity() {
    38         super.onAttachedToActivity();
    40         // Register for SearchEngines messages and request list of search engines from Gecko.
    41         GeckoAppShell.registerEventListener("SearchEngines:Data", this);
    42         GeckoAppShell.sendEventToGecko(GeckoEvent.createBroadcastEvent("SearchEngines:GetVisible", null));
    43     }
    45     @Override
    46     protected void onPrepareForRemoval() {
    47         GeckoAppShell.unregisterEventListener("SearchEngines:Data", this);
    48     }
    50     @Override
    51     public void setDefault(CustomListPreference item) {
    52         super.setDefault(item);
    54         sendGeckoEngineEvent("SearchEngines:SetDefault", item.getTitle().toString());
    55     }
    57     @Override
    58     public void uninstall(CustomListPreference item) {
    59         super.uninstall(item);
    61         sendGeckoEngineEvent("SearchEngines:Remove", item.getTitle().toString());
    62     }
    64     @Override
    65     public void handleMessage(String event, final JSONObject data) {
    66         if (event.equals("SearchEngines:Data")) {
    67             // Parse engines array from JSON.
    68             JSONArray engines;
    69             try {
    70                 engines = data.getJSONArray("searchEngines");
    71             } catch (JSONException e) {
    72                 Log.e(LOGTAG, "Unable to decode search engine data from Gecko.", e);
    73                 return;
    74             }
    76             // Clear the preferences category from this thread.
    77             this.removeAll();
    79             // Create an element in this PreferenceCategory for each engine.
    80             for (int i = 0; i < engines.length(); i++) {
    81                 try {
    82                     JSONObject engineJSON = engines.getJSONObject(i);
    83                     final String engineName = engineJSON.getString("name");
    85                     final SearchEnginePreference enginePreference = new SearchEnginePreference(getContext(), this);
    86                     enginePreference.setSearchEngineFromJSON(engineJSON);
    87                     enginePreference.setOnPreferenceClickListener(new OnPreferenceClickListener() {
    88                         @Override
    89                         public boolean onPreferenceClick(Preference preference) {
    90                             SearchEnginePreference sPref = (SearchEnginePreference) preference;
    91                             // Display the configuration dialog associated with the tapped engine.
    92                             sPref.showDialog();
    93                             return true;
    94                         }
    95                     });
    97                     addPreference(enginePreference);
    99                     // The first element in the array is the default engine.
   100                     if (i == 0) {
   101                         // We set this here, not in setSearchEngineFromJSON, because it allows us to
   102                         // keep a reference  to the default engine to use when the AlertDialog
   103                         // callbacks are used.
   104                         ThreadUtils.postToUiThread(new Runnable() {
   105                             @Override
   106                             public void run() {
   107                                 enginePreference.setIsDefault(true);
   108                             }
   109                         });
   110                         mDefaultReference = enginePreference;
   111                     }
   112                 } catch (JSONException e) {
   113                     Log.e(LOGTAG, "JSONException parsing engine at index " + i, e);
   114                 }
   115             }
   116         }
   117     }
   119     /**
   120      * Helper method to send a particular event string to Gecko with an associated engine name.
   121      * @param event The type of event to send.
   122      * @param engine The engine to which the event relates.
   123      */
   124     private void sendGeckoEngineEvent(String event, String engineName) {
   125         JSONObject json = new JSONObject();
   126         try {
   127             json.put("engine", engineName);
   128         } catch (JSONException e) {
   129             Log.e(LOGTAG, "JSONException creating search engine configuration change message for Gecko.", e);
   130             return;
   131         }
   132         GeckoAppShell.notifyGeckoOfEvent(GeckoEvent.createBroadcastEvent(event, json.toString()));
   133     }
   134 }

mercurial