Bug 1288127 - Add Bookmarks mode to CombinedHistoryPanel r=grisha
MozReview-Commit-ID: J5lksrY7EfD
--- 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;