mobile/android/base/sync/config/activities/SelectEnginesActivity.java

Wed, 31 Dec 2014 06:09:35 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Wed, 31 Dec 2014 06:09:35 +0100
changeset 0
6474c204b198
permissions
-rw-r--r--

Cloned upstream origin tor-browser at tor-browser-31.3.0esr-4.5-1-build1
revision ID fc1c9ff7c1b2defdbc039f12214767608f46423f for hacking purpose.

     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.sync.config.activities;
     7 import java.util.HashMap;
     8 import java.util.Map;
     9 import java.util.Map.Entry;
    10 import java.util.Set;
    12 import org.mozilla.gecko.R;
    13 import org.mozilla.gecko.background.common.log.Logger;
    14 import org.mozilla.gecko.sync.SyncConfiguration;
    15 import org.mozilla.gecko.sync.ThreadPool;
    16 import org.mozilla.gecko.sync.setup.SyncAccounts;
    17 import org.mozilla.gecko.sync.syncadapter.SyncAdapter;
    19 import android.accounts.Account;
    20 import android.accounts.AccountManager;
    21 import android.app.Activity;
    22 import android.app.AlertDialog;
    23 import android.content.Context;
    24 import android.content.DialogInterface;
    25 import android.content.DialogInterface.OnDismissListener;
    26 import android.content.SharedPreferences;
    27 import android.os.Bundle;
    28 import android.widget.ListView;
    29 import android.widget.Toast;
    31 /**
    32  * Provides a user-facing interface for selecting engines to sync. This activity
    33  * can be launched from the Sync Settings preferences screen, and will save the
    34  * selected engines to the
    35  * <code>SyncConfiguration.PREF_USER_SELECTED_ENGINES_TO_SYNC</code> pref.
    36  *
    37  * On launch, it displays the engines stored in the saved pref if it exists, or
    38  * <code>SyncConfiguration.enabledEngineNames()</code> if it doesn't, defaulting
    39  * to <code>SyncConfiguration.validEngineNames()</code> if neither exists.
    40  *
    41  * During a sync, the
    42  * <code>SyncConfiguration.PREF_USER_SELECTED_ENGINES_TO_SYNC</code> pref will
    43  * be cleared after the engine changes are applied to meta/global.
    44  */
    46 public class SelectEnginesActivity extends Activity implements
    47     DialogInterface.OnClickListener, DialogInterface.OnMultiChoiceClickListener {
    48   public final static String LOG_TAG = "SelectEnginesAct";
    50   protected AccountManager mAccountManager;
    51   protected Context mContext;
    53   // Collections names corresponding to displayed (localized) engine options.
    54   final String[] _collectionsNames = new String[] {
    55     "bookmarks",
    56     "passwords",
    57     "history",
    58     "tabs"
    59   };
    61   // Engine names localized for display in Sync Settings.
    62   protected String[] _options;
    63   // Selection state of engines corresponding to _options array.
    64   final boolean[] _selections = new boolean[_collectionsNames.length];
    65   protected Account account;
    66   protected SharedPreferences accountPrefs;
    68   @Override
    69   public void onCreate(Bundle savedInstanceState) {
    70     super.onCreate(savedInstanceState);
    71     mContext = getApplicationContext();
    72     mAccountManager = AccountManager.get(mContext);
    73     _options = new String[] {
    74         getString(R.string.sync_configure_engines_title_bookmarks),
    75         getString(R.string.sync_configure_engines_title_passwords),
    76         getString(R.string.sync_configure_engines_title_history),
    77         getString(R.string.sync_configure_engines_title_tabs) };
    79     // Fetch account prefs for configuring engines.
    80     ThreadPool.run(new Runnable() {
    81       @Override
    82       public void run() {
    83         Account[] accounts = SyncAccounts.syncAccounts(mContext);
    84         if (accounts.length == 0) {
    85           Logger.error(LOG_TAG, "Failed to get account!");
    86           finish();
    87           return;
    88         } else {
    89           // Only supports one account per type.
    90           account = accounts[0];
    91           try {
    92             if (accountPrefs == null) {
    93               accountPrefs = SyncAccounts.blockingPrefsFromDefaultProfileV0(mContext, mAccountManager, account);
    94             }
    95           } catch (Exception e) {
    96             Logger.error(LOG_TAG, "Failed to get sync account info or shared preferences.", e);
    97             finish();
    98           }
    99           setSelectionsInArray(getEnginesToSelect(accountPrefs), _selections);
   100         }
   101       }
   102     });
   103   }
   105   @Override
   106   public void onResume() {
   107     super.onResume();
   108     if (accountPrefs != null) {
   109       setSelectionsInArray(getEnginesToSelect(accountPrefs), _selections);
   110     }
   111     AlertDialog dialog = new AlertDialog.Builder(this)
   112         .setTitle(R.string.sync_configure_engines_sync_my_title)
   113         .setMultiChoiceItems(_options, _selections, this)
   114         .setIcon(R.drawable.icon).setPositiveButton(android.R.string.ok, this)
   115         .setNegativeButton(android.R.string.cancel, this).create();
   117     dialog.setOnDismissListener(new OnDismissListener() {
   118       @Override
   119       public void onDismiss(DialogInterface dialog) {
   120         finish();
   121       }
   122     });
   124     dialog.show();
   125   }
   127   private static Set<String> getEnginesFromPrefs(SharedPreferences syncPrefs) {
   128     Set<String> engines = SyncConfiguration.getEnabledEngineNames(syncPrefs);
   129     if (engines == null) {
   130       engines = SyncConfiguration.validEngineNames();
   131     }
   132     return engines;
   133   }
   135   /**
   136    * Fetches the engine names that should be displayed as selected for syncing.
   137    * Check first for selected engines set by this activity, then the enabled
   138    * engines, and finally default to the set of valid engine names for Android
   139    * Sync if neither exists.
   140    *
   141    * @param syncPrefs
   142    *          <code>SharedPreferences</code> of Account being modified.
   143    * @return Set<String> of engine names to display as selected. Should never be
   144    *         null.
   145    */
   146   public static Set<String> getEnginesToSelect(SharedPreferences syncPrefs) {
   147     Set<String> engines = getEnginesFromPrefs(syncPrefs);
   148     Map<String, Boolean> engineSelections = SyncConfiguration.getUserSelectedEngines(syncPrefs);
   149     if (engineSelections != null) {
   150       for (Entry<String, Boolean> pair : engineSelections.entrySet()) {
   151         if (pair.getValue()) {
   152           engines.add(pair.getKey());
   153         } else {
   154           engines.remove(pair.getKey());
   155         }
   156       }
   157     }
   158     return engines;
   159   }
   161   public void setSelectionsInArray(Set<String> selected, boolean[] array) {
   162     for (int i = 0; i < _collectionsNames.length; i++) {
   163       array[i] = selected.contains(_collectionsNames[i]);
   164     }
   165   }
   167   @Override
   168   public void onClick(DialogInterface dialog, int which) {
   169     if (which == DialogInterface.BUTTON_POSITIVE) {
   170       Logger.debug(LOG_TAG, "Saving selected engines.");
   171       saveSelections();
   172       setResult(RESULT_OK);
   173       Toast.makeText(this, R.string.sync_notification_savedprefs, Toast.LENGTH_SHORT).show();
   174     } else {
   175       setResult(RESULT_CANCELED);
   176     }
   177     finish();
   178   }
   180   @Override
   181   public void onClick(DialogInterface dialog, int which, boolean isChecked) {
   182     // Display multi-selection clicks in UI.
   183     _selections[which] = isChecked;
   184     ListView selectionsList = ((AlertDialog) dialog).getListView();
   185     selectionsList.setItemChecked(which, isChecked);
   186   }
   188   /**
   189    * Persists engine selection state to SharedPreferences if it has changed.
   190    *
   191    * @return true if changed, false otherwise.
   192    */
   193   private void saveSelections() {
   194     boolean[] origSelections = new boolean[_options.length];
   195     setSelectionsInArray(getEnginesFromPrefs(accountPrefs), origSelections);
   197     Map<String, Boolean> engineSelections = new HashMap<String, Boolean>();
   198     for (int i = 0; i < _selections.length; i++) {
   199       if (_selections[i] != origSelections[i]) {
   200         engineSelections.put(_collectionsNames[i], _selections[i]);
   201       }
   202     }
   204     // No GlobalSession.config, so store directly to prefs.
   205     SyncConfiguration.storeSelectedEnginesToPrefs(accountPrefs, engineSelections);
   207     // Request immediate sync.
   208     SyncAdapter.requestImmediateSync(account, null);
   209   }
   210 }

mercurial