Bug 1232968 - Choosing to import only one option from onboarding screen will import both bookmarks and history. r=sebastian draft
authorChenxia Liu <liuche@mozilla.com>
Thu, 17 Dec 2015 16:29:45 -0800
changeset 316128 e5c75c368db09242a4067311920e1d372e351b50
parent 316127 6a2ad662612370d248530465d690785c20abcf0b
child 512132 e253e390f799f34e087074a61db1eefebf8b491d
push id8515
push usercliu@mozilla.com
push dateFri, 18 Dec 2015 00:34:21 +0000
reviewerssebastian
bugs1232968
milestone46.0a1
Bug 1232968 - Choosing to import only one option from onboarding screen will import both bookmarks and history. r=sebastian
mobile/android/base/java/org/mozilla/gecko/firstrun/ImportPanel.java
--- a/mobile/android/base/java/org/mozilla/gecko/firstrun/ImportPanel.java
+++ b/mobile/android/base/java/org/mozilla/gecko/firstrun/ImportPanel.java
@@ -12,28 +12,27 @@ import android.content.DialogInterface;
 import android.os.Bundle;
 import android.util.Log;
 import android.util.SparseBooleanArray;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
 import android.widget.AdapterView;
 import android.widget.Button;
+import android.widget.CheckedTextView;
 import android.widget.ImageView;
 import android.widget.ListView;
 import org.mozilla.gecko.AppConstants;
 import org.mozilla.gecko.R;
 import org.mozilla.gecko.Telemetry;
 import org.mozilla.gecko.TelemetryContract;
 import org.mozilla.gecko.preferences.AndroidImport;
 import org.mozilla.gecko.util.ThreadUtils;
 
-import java.util.ArrayList;
 import java.util.Arrays;
-import java.util.List;
 
 public class ImportPanel extends FirstrunPanel {
     public static final String LOGTAG = "GeckoImportPanel";
     public static final int TITLE_RES = R.string.firstrun_import_title;
     private static final int AUTOADVANCE_DELAY_MS = 1500;
 
     // These match the item positions in R.array.pref_import_android_entries.
     private static int BOOKMARKS_INDEX = 0;
@@ -46,61 +45,66 @@ public class ImportPanel extends Firstru
     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstance) {
         final ViewGroup root = (ViewGroup) inflater.inflate(R.layout.firstrun_import_fragment, container, false);
         choiceButton = (Button) root.findViewById(R.id.import_action_button);
         confirmImage = (ImageView) root.findViewById(R.id.confirm_check);
         choiceButton.setOnClickListener(new View.OnClickListener() {
             @Override
             public void onClick(View v) {
                 final AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
-                final List<Integer> checked = new ArrayList<>(Arrays.asList(0, 1));
+                final Boolean[] checked = new Boolean[2];
+                Arrays.fill(checked, true);
                 Telemetry.sendUIEvent(TelemetryContract.Event.ACTION, TelemetryContract.Method.BUTTON, "firstrun-import-action");
+
+                // We set ListView.OnItemClickListener later, which overrides OnMultiChoiceClickListener, so don't make one here.
                 builder.setTitle(R.string.firstrun_import_action)
-                       .setMultiChoiceItems(R.array.pref_import_android_entries, makeBooleanArray(R.array.pref_import_android_defaults), new DialogInterface.OnMultiChoiceClickListener() {
-                           @Override
-                           public void onClick(DialogInterface dialogInterface, int index, boolean isChecked) {
-                               // Add telemetry for toggling checkboxes.
-                               Telemetry.sendUIEvent(TelemetryContract.Event.EDIT, TelemetryContract.Method.DIALOG, "firstrun-import-dialog-checkbox");
-                               if (isChecked && !checked.contains(index)) {
-                                   checked.add(index);
-                               } else if (!isChecked && checked.contains(index)) {
-                                   checked.remove(checked.indexOf(index));
-                               }
-                           }
-                       })
+                       .setMultiChoiceItems(R.array.pref_import_android_entries, makeBooleanArray(R.array.pref_import_android_defaults), null)
                        .setNegativeButton(R.string.button_cancel, new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int i) {
                                Telemetry.sendUIEvent(TelemetryContract.Event.CANCEL, TelemetryContract.Method.BUTTON, "firstrun-import-dialog");
                                dialog.dismiss();
                            }
                        })
                        .setPositiveButton(R.string.firstrun_import_dialog_button, new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int i) {
-                               final boolean importBookmarks = checked.contains(BOOKMARKS_INDEX);
-                               final boolean importHistory = checked.contains(HISTORY_INDEX);
+                               final boolean importBookmarks = checked[BOOKMARKS_INDEX];
+                               final boolean importHistory = checked[HISTORY_INDEX];
 
                                runImport(importBookmarks, importHistory);
 
                                // Telemetry for what options are confirmed.
                                final int importState = (importBookmarks ? 1 : 0) + (importHistory ? 2 : 0);
                                Telemetry.sendUIEvent(TelemetryContract.Event.SAVE, TelemetryContract.Method.BUTTON, "firstrun-import-dialog-" + importState);
                                dialog.dismiss();
                            }
                        });
 
                 final AlertDialog dialog = builder.create();
                 dialog.show();
 
                 final Button importButton = dialog.getButton(DialogInterface.BUTTON_POSITIVE);
                 final ListView listView = dialog.getListView();
+
+                // Setting this listView listener is equivalent to setting OnMultiChoiceClickListener.
                 listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                     @Override
                     public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
+                        Telemetry.sendUIEvent(TelemetryContract.Event.EDIT, TelemetryContract.Method.DIALOG, "firstrun-import-dialog-checkbox");
+
+                        // Keep track of checked state.
+                        final boolean isChecked = ((CheckedTextView) view).isChecked();
+                        if (isChecked) {
+                            checked[i] = true;
+                        } else {
+                            checked[i] = false;
+                        }
+
+                        // Update importButton state.
                         if (AppConstants.Versions.feature11Plus) {
                             if (listView.getCheckedItemCount() == 0) {
                                 importButton.setEnabled(false);
                             } else {
                                 importButton.setEnabled(true);
                             }
                         } else {
                             final SparseBooleanArray checkedItems = listView.getCheckedItemPositions();