Bug 1288127 - Add Bookmarks mode to CombinedHistoryPanel r=grisha draft
authorAndrzej Hunt <ahunt@mozilla.com>
Thu, 28 Jul 2016 11:01:23 -0700
changeset 399344 0fe680d7ebc47e0eb03c8e56b1d6d9a85bccb1ea
parent 399343 158a8c8ad6241382310711dbacc07bf5342f9fee
child 399345 0a5f1d70e234d0bf2af605ba5f9e97ff188cd6f4
push id25805
push userahunt@mozilla.com
push dateWed, 10 Aug 2016 22:18:08 +0000
reviewersgrisha
bugs1288127
milestone51.0a1
Bug 1288127 - Add Bookmarks mode to CombinedHistoryPanel r=grisha MozReview-Commit-ID: J5lksrY7EfD
mobile/android/base/java/org/mozilla/gecko/home/CombinedHistoryPanel.java
--- a/mobile/android/base/java/org/mozilla/gecko/home/CombinedHistoryPanel.java
+++ b/mobile/android/base/java/org/mozilla/gecko/home/CombinedHistoryPanel.java
@@ -55,16 +55,22 @@ import org.mozilla.gecko.widget.HistoryD
 
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 
 public class CombinedHistoryPanel extends HomeFragment implements RemoteClientsDialogFragment.RemoteClientsListener {
     private static final String LOGTAG = "GeckoCombinedHistoryPnl";
 
+    /**
+     * Enable bookmarks mode: in this mode a list of chronologically sorted and sectioned bookmarks
+     * is shown.
+     */
+    public static final String ARG_BOOKMARKS_MODE = "bookmarks_mode";
+
     private static final String[] STAGES_TO_SYNC_ON_REFRESH = new String[] { "clients", "tabs" };
     private final int LOADER_ID_HISTORY = 0;
     private final int LOADER_ID_REMOTE = 1;
 
     // String placeholders to mark formatting.
     private final static String FORMAT_S1 = "%1$s";
     private final static String FORMAT_S2 = "%2$s";
 
@@ -90,16 +96,18 @@ public class CombinedHistoryPanel extend
     // Sync listener that stops refreshing when a sync is completed.
     protected RemoteTabsSyncListener mSyncStatusListener;
 
     // Reference to the View to display when there are no results.
     private View mHistoryEmptyView;
     private View mClientsEmptyView;
     private View mRecentTabsEmptyView;
 
+    private boolean mBookmarksMode;
+
     public interface OnPanelLevelChangeListener {
         enum PanelLevel {
         PARENT, CHILD_SYNC, CHILD_RECENT_TABS
     }
 
         /**
          * Propagates level changes.
          * @param level
@@ -107,26 +115,32 @@ public class CombinedHistoryPanel extend
          */
         boolean changeLevel(PanelLevel level);
     }
 
     @Override
     public void onCreate(Bundle savedInstance) {
         super.onCreate(savedInstance);
 
-        mHistoryAdapter = new CombinedHistoryAdapter(getResources());
-        mClientsAdapter = new ClientsAdapter(getContext());
-        // The RecentTabsAdapter doesn't use a cursor and therefore can't use the CursorLoader's
-        // onLoadFinished() callback for updating the panel state when the closed tab count changes.
-        // Instead, we provide it with independent callbacks as necessary.
-        mRecentTabsAdapter = new RecentTabsAdapter(getContext(),
-                mHistoryAdapter.getRecentTabsUpdateHandler(), getPanelStateUpdateHandler());
+        mBookmarksMode = getArguments() != null &&
+                         getArguments().containsKey(ARG_BOOKMARKS_MODE);
+
+        mHistoryAdapter = new CombinedHistoryAdapter(getResources(), mBookmarksMode);
 
-        mSyncStatusListener = new RemoteTabsSyncListener();
-        FirefoxAccounts.addSyncStatusListener(mSyncStatusListener);
+        if (!mBookmarksMode) {
+            mClientsAdapter = new ClientsAdapter(getContext());
+            // The RecentTabsAdapter doesn't use a cursor and therefore can't use the CursorLoader's
+            // onLoadFinished() callback for updating the panel state when the closed tab count changes.
+            // Instead, we provide it with independent callbacks as necessary.
+            mRecentTabsAdapter = new RecentTabsAdapter(getContext(),
+                    mHistoryAdapter.getRecentTabsUpdateHandler(), getPanelStateUpdateHandler());
+
+            mSyncStatusListener = new RemoteTabsSyncListener();
+            FirefoxAccounts.addSyncStatusListener(mSyncStatusListener);
+        }
     }
 
     @Override
     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
         return inflater.inflate(R.layout.home_combined_history_panel, container, false);
     }
 
     @Override
@@ -143,17 +157,19 @@ public class CombinedHistoryPanel extend
         mHistoryEmptyView = view.findViewById(R.id.home_history_empty_view);
         mRecentTabsEmptyView = view.findViewById(R.id.home_recent_tabs_empty_view);
         setUpEmptyViews();
 
         mPanelFooterButton = (Button) view.findViewById(R.id.history_panel_footer_button);
         mPanelFooterButton.setText(R.string.home_clear_history_button);
         mPanelFooterButton.setOnClickListener(new OnFooterButtonClickListener());
 
-        mRecentTabsAdapter.startListeningForClosedTabs();
+        if (!mBookmarksMode) {
+            mRecentTabsAdapter.startListeningForClosedTabs();
+        }
 
         if (mSavedRestoreBundle != null) {
             setPanelStateFromBundle(mSavedRestoreBundle);
             mSavedRestoreBundle = null;
         }
     }
 
     private void setUpRecyclerView() {
@@ -259,17 +275,19 @@ public class CombinedHistoryPanel extend
     public void onActivityCreated(Bundle savedInstanceState) {
         super.onActivityCreated(savedInstanceState);
         mCursorLoaderCallbacks = new CursorLoaderCallbacks();
     }
 
     @Override
     protected void load() {
         getLoaderManager().initLoader(LOADER_ID_HISTORY, null, mCursorLoaderCallbacks);
-        getLoaderManager().initLoader(LOADER_ID_REMOTE, null, mCursorLoaderCallbacks);
+        if (!mBookmarksMode) {
+            getLoaderManager().initLoader(LOADER_ID_REMOTE, null, mCursorLoaderCallbacks);
+        }
     }
 
     private static class RemoteTabsCursorLoader extends SimpleCursorLoader {
         private final GeckoProfile mProfile;
 
         public RemoteTabsCursorLoader(Context context) {
             super(context);
             mProfile = GeckoProfile.get(context);
@@ -293,28 +311,48 @@ public class CombinedHistoryPanel extend
 
         @Override
         public Cursor loadCursor() {
             final ContentResolver cr = getContext().getContentResolver();
             return mDB.getRecentHistory(cr, HISTORY_LIMIT);
         }
     }
 
+    private static class BookmarksCursorLoader extends SimpleCursorLoader {
+        public static final int BOOKMARKS_LIMIT = 100;
+        private final BrowserDB mDB;
+
+        public BookmarksCursorLoader(Context context) {
+            super(context);
+            mDB = GeckoProfile.get(context).getDB();
+        }
+
+        @Override
+        public Cursor loadCursor() {
+            final ContentResolver cr = getContext().getContentResolver();
+            return mDB.getRecentBookmarks(cr, BOOKMARKS_LIMIT);
+        }
+    }
+
     private class CursorLoaderCallbacks implements LoaderManager.LoaderCallbacks<Cursor> {
         private BrowserDB mDB;    // Pseudo-final: set in onCreateLoader.
 
         @Override
         public Loader<Cursor> onCreateLoader(int id, Bundle args) {
             if (mDB == null) {
                 mDB = GeckoProfile.get(getActivity()).getDB();
             }
 
             switch (id) {
                 case LOADER_ID_HISTORY:
-                    return new HistoryCursorLoader(getContext());
+                    if (mBookmarksMode) {
+                        return new BookmarksCursorLoader(getContext());
+                    } else {
+                        return new HistoryCursorLoader(getContext());
+                    }
                 case LOADER_ID_REMOTE:
                     return new RemoteTabsCursorLoader(getContext());
                 default:
                     Log.e(LOGTAG, "Unknown loader id!");
                     return null;
             }
         }
 
@@ -334,17 +372,19 @@ public class CombinedHistoryPanel extend
             }
 
             updateEmptyView();
             updateButtonFromLevel();
         }
 
         @Override
         public void onLoaderReset(Loader<Cursor> loader) {
-            mClientsAdapter.setClients(Collections.<RemoteClient>emptyList());
+            if (!mBookmarksMode) {
+                mClientsAdapter.setClients(Collections.<RemoteClient>emptyList());
+            }
             mHistoryAdapter.setHistory(null);
         }
     }
 
     public interface PanelStateUpdateHandler {
         void onPanelStateUpdated();
     }
 
@@ -385,16 +425,21 @@ public class CombinedHistoryPanel extend
 
             updateEmptyView();
             updateButtonFromLevel();
             return true;
         }
     }
 
     private void updateButtonFromLevel() {
+        if (mBookmarksMode) {
+            mPanelFooterButton.setVisibility(View.GONE);
+            return;
+        }
+
         switch (mPanelLevel) {
             case PARENT:
                 final boolean historyRestricted = !Restrictions.isAllowed(getActivity(), Restrictable.CLEAR_HISTORY);
                 if (historyRestricted || mHistoryAdapter.getItemCount() == NUM_SMART_FOLDERS) {
                     mPanelFooterButton.setVisibility(View.GONE);
                 } else {
                     mPanelFooterButton.setText(R.string.home_clear_history_button);
                     mPanelFooterButton.setVisibility(View.VISIBLE);
@@ -648,17 +693,19 @@ public class CombinedHistoryPanel extend
             mRefreshLayout.setRefreshing(false);
         }
     }
 
     @Override
     public void onDestroyView() {
         super.onDestroyView();
 
-        mRecentTabsAdapter.stopListeningForClosedTabs();
+        if (!mBookmarksMode) {
+            mRecentTabsAdapter.stopListeningForClosedTabs();
+        }
     }
 
     @Override
     public void onDestroy() {
         super.onDestroy();
         if (mSyncStatusListener != null) {
             FirefoxAccounts.removeSyncStatusListener(mSyncStatusListener);
             mSyncStatusListener = null;