Bug 1232439 - Part 1: Setup A/B experiment for enabling full bookmark management in Nightly. r?Grisha draft
authorJing-wei Wu <topwu.tw@gmail.com>
Thu, 23 Mar 2017 14:14:24 +0800
changeset 563499 9c9f5fe89eb541c74507eb53be0e9860758ced81
parent 563410 c697e756f738ce37abc56f31bfbc48f55625d617
child 563500 8b42c46b321cf2d38dd2c3fdee178bc053d217e4
child 563517 00c9cf5c82b2995b717c7fb1213d9ee9f42de547
push id54324
push userbmo:topwu.tw@gmail.com
push dateMon, 17 Apr 2017 06:13:00 +0000
reviewersGrisha
bugs1232439
milestone55.0a1
Bug 1232439 - Part 1: Setup A/B experiment for enabling full bookmark management in Nightly. r?Grisha The experiment in Switchboard is "full-bookmark-management", and it's enabled for 100% of the Nightly audience. MozReview-Commit-ID: EhA0BcouPPn
mobile/android/base/java/org/mozilla/gecko/Experiments.java
mobile/android/base/java/org/mozilla/gecko/bookmark/BookmarkUtils.java
mobile/android/base/java/org/mozilla/gecko/delegates/BookmarkStateChangeDelegate.java
mobile/android/base/java/org/mozilla/gecko/home/BookmarksPanel.java
mobile/android/base/moz.build
--- a/mobile/android/base/java/org/mozilla/gecko/Experiments.java
+++ b/mobile/android/base/java/org/mozilla/gecko/Experiments.java
@@ -63,16 +63,19 @@ public class Experiments {
     public static final String ACTIVITY_STREAM_SETTING = "activity-stream-setting";
 
     // Enable Activity stream by default for users in the "opt out" group.
     public static final String ACTIVITY_STREAM_OPT_OUT = "activity-stream-opt-out";
 
     // Tabs tray: Arrange tabs in two columns in portrait mode
     public static final String COMPACT_TABS = "compact-tabs";
 
+    // Enable full bookmark management(full-page dialog, bookmark/folder modification, etc.)
+    public static final String FULL_BOOKMARK_MANAGEMENT = "full-bookmark-management";
+
     /**
      * Returns if a user is in certain local experiment.
      * @param experiment Name of experiment to look up
      * @return returns value for experiment or false if experiment does not exist.
      */
     public static boolean isInExperimentLocal(Context context, String experiment) {
         if (SwitchBoard.isInBucket(context, 0, 20)) {
             return Experiments.ONBOARDING3_A.equals(experiment);
new file mode 100644
--- /dev/null
+++ b/mobile/android/base/java/org/mozilla/gecko/bookmark/BookmarkUtils.java
@@ -0,0 +1,24 @@
+/* -*- 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.bookmark;
+
+import android.content.Context;
+
+import org.mozilla.gecko.AppConstants;
+import org.mozilla.gecko.Experiments;
+import org.mozilla.gecko.switchboard.SwitchBoard;
+
+public class BookmarkUtils {
+
+    /**
+     * Get the switch from {@link SwitchBoard}. It's used to enable/disable
+     * full bookmark management features(full-page dialog, bookmark/folder modification, etc.)
+     */
+    public static boolean isEnabled(Context context) {
+        return AppConstants.NIGHTLY_BUILD &&
+                       SwitchBoard.isInExperiment(context, Experiments.FULL_BOOKMARK_MANAGEMENT);
+    }
+}
--- a/mobile/android/base/java/org/mozilla/gecko/delegates/BookmarkStateChangeDelegate.java
+++ b/mobile/android/base/java/org/mozilla/gecko/delegates/BookmarkStateChangeDelegate.java
@@ -5,25 +5,21 @@
 
 package org.mozilla.gecko.delegates;
 
 import android.content.Intent;
 import android.content.SharedPreferences;
 import android.content.res.Resources;
 import android.graphics.Color;
 import android.graphics.drawable.Drawable;
-import android.os.Bundle;
 import android.support.design.widget.Snackbar;
 import android.support.v4.content.ContextCompat;
-import android.util.Log;
 import android.view.View;
 import android.widget.ListView;
 
-import org.json.JSONException;
-import org.json.JSONObject;
 import org.mozilla.gecko.AboutPages;
 import org.mozilla.gecko.BrowserApp;
 import org.mozilla.gecko.EditBookmarkDialog;
 import org.mozilla.gecko.GeckoAppShell;
 import org.mozilla.gecko.GeckoSharedPrefs;
 import org.mozilla.gecko.R;
 import org.mozilla.gecko.SnackbarBuilder;
 import org.mozilla.gecko.Tab;
@@ -33,18 +29,16 @@ import org.mozilla.gecko.TelemetryContra
 import org.mozilla.gecko.home.HomeConfig;
 import org.mozilla.gecko.promotion.SimpleHelperUI;
 import org.mozilla.gecko.prompts.Prompt;
 import org.mozilla.gecko.prompts.PromptListItem;
 import org.mozilla.gecko.util.DrawableUtil;
 import org.mozilla.gecko.util.GeckoBundle;
 import org.mozilla.gecko.util.ThreadUtils;
 
-import java.lang.ref.WeakReference;
-
 /**
  * Delegate to watch for bookmark state changes.
  *
  * This is responsible for showing snackbars and helper UIs related to the addition/removal
  * of bookmarks, or reader view bookmarks.
  */
 public class BookmarkStateChangeDelegate extends BrowserAppDelegateWithReference implements Tabs.OnTabsChangedListener {
     private static final String LOGTAG = "BookmarkDelegate";
--- a/mobile/android/base/java/org/mozilla/gecko/home/BookmarksPanel.java
+++ b/mobile/android/base/java/org/mozilla/gecko/home/BookmarksPanel.java
@@ -5,34 +5,31 @@
 
 package org.mozilla.gecko.home;
 
 import java.util.ArrayList;
 import java.util.LinkedList;
 import java.util.List;
 
 import org.mozilla.gecko.GeckoSharedPrefs;
-import org.mozilla.gecko.PrefsHelper;
 import org.mozilla.gecko.R;
 import org.mozilla.gecko.db.BrowserContract;
 import org.mozilla.gecko.db.BrowserContract.Bookmarks;
 import org.mozilla.gecko.db.BrowserDB;
 import org.mozilla.gecko.distribution.PartnerBookmarksProviderProxy;
 import org.mozilla.gecko.home.BookmarksListAdapter.FolderInfo;
 import org.mozilla.gecko.home.BookmarksListAdapter.OnRefreshFolderListener;
 import org.mozilla.gecko.home.BookmarksListAdapter.RefreshType;
 import org.mozilla.gecko.home.HomeContextMenuInfo.RemoveItemType;
 import org.mozilla.gecko.home.HomePager.OnUrlOpenListener;
-import org.mozilla.gecko.media.MediaControlService;
 import org.mozilla.gecko.preferences.GeckoPreferences;
 
 import android.app.Activity;
 import android.content.ContentResolver;
 import android.content.Context;
-import android.content.Intent;
 import android.content.res.Configuration;
 import android.database.Cursor;
 import android.database.MergeCursor;
 import android.os.Bundle;
 import android.support.annotation.NonNull;
 import android.support.v4.app.LoaderManager;
 import android.support.v4.content.Loader;
 import android.view.LayoutInflater;
@@ -43,36 +40,28 @@ import android.widget.ImageView;
 import android.widget.TextView;
 
 /**
  * A page in about:home that displays a ListView of bookmarks.
  */
 public class BookmarksPanel extends HomeFragment {
     public static final String LOGTAG = "GeckoBookmarksPanel";
 
-    public static final String BOOKMARK_MOBILE_FOLDER_PREF = "ui.bookmark.mobilefolder.enabled";
-
     // Cursor loader ID for list of bookmarks.
     private static final int LOADER_ID_BOOKMARKS_LIST = 0;
 
     // Information about the target bookmarks folder.
     private static final String BOOKMARKS_FOLDER_INFO = "folder_info";
 
     // Refresh type for folder refreshing loader.
     private static final String BOOKMARKS_REFRESH_TYPE = "refresh_type";
 
     // Position that the list view should be scrolled to after loading has finished.
     private static final String BOOKMARKS_SCROLL_POSITION = "listview_position";
 
-    private final String[] mPrefs = { BOOKMARK_MOBILE_FOLDER_PREF };
-
-    private PrefsHelper.PrefHandler mPrefsObserver;
-
-    private boolean mIfMobileFolderPrefOn = true;
-
     // List of bookmarks.
     private BookmarksListView mList;
 
     // Adapter for list of bookmarks.
     private BookmarksListAdapter mListAdapter;
 
     // Adapter's parent stack.
     private List<FolderInfo> mSavedParentStack;
@@ -97,19 +86,16 @@ public class BookmarksPanel extends Home
             mSavedParentStack = new LinkedList<FolderInfo>(stack);
         } else {
             mListAdapter.restoreData(stack);
         }
     }
 
     @Override
     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
-
-        setupPrefHandler();
-
         final View view = inflater.inflate(R.layout.home_bookmarks_panel, container, false);
 
         mList = (BookmarksListView) view.findViewById(R.id.bookmarks_list);
 
         mList.setContextMenuInfoFactory(new HomeContextMenuInfo.Factory() {
             @Override
             public HomeContextMenuInfo makeInfoForCursor(View view, int position, long id, Cursor cursor) {
                 final int type = cursor.getInt(cursor.getColumnIndexOrThrow(Bookmarks.TYPE));
@@ -124,28 +110,16 @@ public class BookmarksPanel extends Home
                 info.itemType = RemoveItemType.BOOKMARKS;
                 return info;
             }
         });
 
         return view;
     }
 
-    private void setupPrefHandler() {
-        mPrefsObserver = new PrefsHelper.PrefHandlerBase() {
-            @Override
-            public void prefValue(String pref, boolean value) {
-                if (pref.equals(BOOKMARK_MOBILE_FOLDER_PREF)) {
-                    mIfMobileFolderPrefOn = value;
-                }
-            }
-        };
-        PrefsHelper.addObserver(mPrefs, mPrefsObserver);
-    }
-
     @Override
     public void onViewCreated(View view, Bundle savedInstanceState) {
         super.onViewCreated(view, savedInstanceState);
 
         OnUrlOpenListener listener = null;
         try {
             listener = (OnUrlOpenListener) getActivity();
         } catch (ClassCastException e) {
--- a/mobile/android/base/moz.build
+++ b/mobile/android/base/moz.build
@@ -474,16 +474,17 @@ gbjar.sources += ['java/org/mozilla/geck
     'activitystream/Utils.java',
     'adjust/AdjustBrowserAppDelegate.java',
     'animation/AnimationUtils.java',
     'animation/HeightChangeAnimation.java',
     'animation/PropertyAnimator.java',
     'animation/Rotate3DAnimation.java',
     'animation/ViewHelper.java',
     'ANRReporter.java',
+    'bookmark/BookmarkUtils.java',
     'BootReceiver.java',
     'BrowserApp.java',
     'BrowserLocaleManager.java',
     'cleanup/FileCleanupController.java',
     'cleanup/FileCleanupService.java',
     'CustomEditText.java',
     'customtabs/ActionBarPresenter.java',
     'customtabs/CustomTabsActivity.java',