Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(4)

Unified Diff: chrome/android/java_staging/src/org/chromium/chrome/browser/enhancedbookmarks/EnhancedBookmarkManager.java

Issue 1206673003: Merge java_staging/src into java/src. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: rebase Created 5 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/android/java_staging/src/org/chromium/chrome/browser/enhancedbookmarks/EnhancedBookmarkManager.java
diff --git a/chrome/android/java_staging/src/org/chromium/chrome/browser/enhancedbookmarks/EnhancedBookmarkManager.java b/chrome/android/java_staging/src/org/chromium/chrome/browser/enhancedbookmarks/EnhancedBookmarkManager.java
deleted file mode 100644
index 97b46d9c1b0ac917bd9f90626ce5fcca8cc2ef31..0000000000000000000000000000000000000000
--- a/chrome/android/java_staging/src/org/chromium/chrome/browser/enhancedbookmarks/EnhancedBookmarkManager.java
+++ /dev/null
@@ -1,533 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.chrome.browser.enhancedbookmarks;
-
-import android.app.Activity;
-import android.preference.PreferenceManager;
-import android.support.v4.widget.DrawerLayout;
-import android.util.Log;
-import android.view.Gravity;
-import android.view.View;
-import android.view.ViewGroup;
-
-import org.chromium.base.ObserverList;
-import org.chromium.base.metrics.RecordHistogram;
-import org.chromium.chrome.R;
-import org.chromium.chrome.browser.BookmarksBridge.BookmarkItem;
-import org.chromium.chrome.browser.BookmarksBridge.BookmarkModelObserver;
-import org.chromium.chrome.browser.UrlConstants;
-import org.chromium.chrome.browser.enhanced_bookmarks.EnhancedBookmarksModel;
-import org.chromium.chrome.browser.enhanced_bookmarks.LaunchLocation;
-import org.chromium.chrome.browser.ntp.NewTabPageUma;
-import org.chromium.chrome.browser.partnerbookmarks.PartnerBookmarksShim;
-import org.chromium.chrome.browser.snackbar.SnackbarManager.SnackbarManageable;
-import org.chromium.components.bookmarks.BookmarkId;
-
-import java.io.UnsupportedEncodingException;
-import java.net.URLDecoder;
-import java.net.URLEncoder;
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-import java.util.Stack;
-
-/**
- * The new bookmark manager that is planned to replace the existing bookmark manager. It holds all
- * views and shared logics between tablet and phone. For tablet/phone specific logics, see
- * {@link EnhancedBookmarkActivity} (phone) and {@link EnhancedBookmarkPage} (tablet).
- */
-public class EnhancedBookmarkManager implements EnhancedBookmarkDelegate {
- private static final String PREF_LAST_USED_URL = "enhanced_bookmark_last_used_url";
-
- private Activity mActivity;
- private ViewGroup mMainView;
- private EnhancedBookmarksModel mEnhancedBookmarksModel;
- private EnhancedBookmarkUndoController mUndoController;
- private final ObserverList<EnhancedBookmarkUIObserver> mUIObservers =
- new ObserverList<EnhancedBookmarkUIObserver>();
- private Set<BookmarkId> mSelectedBookmarks = new HashSet<>();
- private EnhancedBookmarkStateChangeListener mUrlChangeListener;
- private EnhancedBookmarkContentView mContentView;
- private DrawerLayout mDrawer;
- private EnhancedBookmarkDrawerListView mDrawerListView;
- private final Stack<UIState> mStateStack = new Stack<>();
-
- private final BookmarkModelObserver mBookmarkModelObserver = new BookmarkModelObserver() {
- @Override
- public void bookmarkNodeRemoved(BookmarkItem parent, int oldIndex, BookmarkItem node) {
- // If the folder is removed in folder mode, show the parent folder or falls back to all
- // bookmarks mode.
- if (getCurrentState() == UIState.STATE_FOLDER
- && node.getId().equals(mStateStack.peek().mFolder)) {
- if (mEnhancedBookmarksModel.getTopLevelFolderIDs(true, true).contains(
- node.getId())) {
- openAllBookmarks();
- } else {
- openFolder(parent.getId());
- }
- }
- clearSelection();
- }
-
- @Override
- public void bookmarkNodeMoved(BookmarkItem oldParent, int oldIndex, BookmarkItem newParent,
- int newIndex) {
- clearSelection();
- }
-
- @Override
- public void bookmarkModelLoaded() {
- initializeIfBookmarkModelLoaded();
- }
-
- @Override
- public void bookmarkModelChanged() {
- // If the folder no longer exists in folder mode, we need to fall back. Relying on the
- // default behavior by setting the folder mode again.
- if (getCurrentState() == UIState.STATE_FOLDER) {
- setState(mStateStack.peek());
- }
- clearSelection();
- }
- };
-
- /**
- * Creates an instance of {@link EnhancedBookmarkManager}. It also initializes resources,
- * bookmark models and jni bridges.
- * @param activity The activity context to use.
- */
- public EnhancedBookmarkManager(Activity activity) {
- mActivity = activity;
- mEnhancedBookmarksModel = new EnhancedBookmarksModel();
- mMainView = (ViewGroup) mActivity.getLayoutInflater().inflate(R.layout.eb_main, null);
- mDrawer = (DrawerLayout) mMainView.findViewById(R.id.eb_drawer_layout);
- mDrawerListView = (EnhancedBookmarkDrawerListView) mMainView.findViewById(
- R.id.eb_drawer_list);
- mContentView = (EnhancedBookmarkContentView) mMainView.findViewById(R.id.eb_content_view);
- mUndoController = new EnhancedBookmarkUndoController(activity, mEnhancedBookmarksModel,
- ((SnackbarManageable) activity).getSnackbarManager());
- mEnhancedBookmarksModel.addModelObserver(mBookmarkModelObserver);
- initializeIfBookmarkModelLoaded();
-
- // Load partner bookmarks explicitly. We load partner bookmarks in the deferred startup
- // code, but that might be executed much later. Especially on L, showing loading
- // progress bar blocks that so it won't be loaded. http://crbug.com/429383
- PartnerBookmarksShim.kickOffReading(activity);
- }
-
- /**
- * Destroys and cleans up itself. This must be called after done using this class.
- */
- public void destroy() {
- for (EnhancedBookmarkUIObserver observer : mUIObservers) {
- observer.onDestroy();
- }
- assert mUIObservers.size() == 0;
-
- if (mUndoController != null) {
- mUndoController.destroy();
- mUndoController = null;
- }
- mEnhancedBookmarksModel.removeModelObserver(mBookmarkModelObserver);
- mEnhancedBookmarksModel.destroy();
- mEnhancedBookmarksModel = null;
- }
-
- /**
- * Called when the user presses the back key. This is only going to be called on Phone.
- * @return True if manager handles this event, false if it decides to ignore.
- */
- public boolean onBackPressed() {
- if (doesDrawerExist()) {
- if (mDrawer.isDrawerVisible(Gravity.START)) {
- mDrawer.closeDrawer(Gravity.START);
- return true;
- }
- }
-
- if (mContentView.onBackPressed()) return true;
-
- if (!mStateStack.empty()) {
- mStateStack.pop();
- if (!mStateStack.empty()) {
- setState(mStateStack.pop());
- return true;
- }
- }
- return false;
- }
-
- public View getView() {
- return mMainView;
- }
-
- /**
- * Sets the listener that reacts upon the change of the UI state of bookmark manager.
- */
- public void setUrlChangeListener(EnhancedBookmarkStateChangeListener urlListner) {
- mUrlChangeListener = urlListner;
- }
-
- /**
- * @return Current URL representing the UI state of bookmark manager. If no state has been shown
- * yet in this session, on phone return last used state stored in preference; on tablet
- * return the url previously set by {@link #updateForUrl(String)}.
- */
- public String getCurrentUrl() {
- if (mStateStack.isEmpty()) return null;
- return mStateStack.peek().mUrl;
- }
-
- /**
- * Updates UI based on the new URL on tablet. If the bookmark model is not loaded yet, creates a
- * temporary loading state carrying this url. This method is supposed to align with
- * {@link EnhancedBookmarkPage#updateForUrl(String)}
- * <p>
- * @param url The url to navigate to.
- */
- public void updateForUrl(String url) {
- if (mEnhancedBookmarksModel != null && mEnhancedBookmarksModel.isBookmarkModelLoaded()) {
- setState(UIState.createStateFromUrl(url, mEnhancedBookmarksModel));
- } else {
- // Note this does not guarantee to update the UI, as at this time the onCreateView()
- // might not has even been called yet.
- setState(UIState.createLoadingState(url));
- }
- }
-
- /**
- * Initialization method that has 3 different behaviors based on whether bookmark model is
- * loaded. If the bookmark model is not loaded yet, it pushes a loading state to backstack which
- * contains the url from preference. If the model is loaded and the backstack is empty, it
- * creates a state by fetching the last visited bookmark url stored in preference. If the
- * bookmark model is loaded but backstack contains a pending loading state, it creates a new
- * state by getting the url of the loading state and replace the previous loading state with the
- * new normal state.
- */
- private void initializeIfBookmarkModelLoaded() {
- if (mEnhancedBookmarksModel.isBookmarkModelLoaded()) {
- mDrawerListView.onEnhancedBookmarkDelegateInitialized(this);
- mContentView.onEnhancedBookmarkDelegateInitialized(this);
- if (mStateStack.isEmpty()) {
- setState(UIState.createStateFromUrl(getUrlFromPreference(),
- mEnhancedBookmarksModel));
- } else if (mStateStack.peek().mState == UIState.STATE_LOADING) {
- String url = mStateStack.pop().mUrl;
- setState(UIState.createStateFromUrl(url, mEnhancedBookmarksModel));
- }
- } else {
- mContentView.showLoadingUi();
- mDrawerListView.showLoadingUi();
- mContentView.showLoadingUi();
- if (mStateStack.isEmpty() || mStateStack.peek().mState != UIState.STATE_LOADING) {
- setState(UIState.createLoadingState(getUrlFromPreference()));
- } else if (!mStateStack.isEmpty()) {
- // Refresh the UI. This is needed because on tablet, updateForUrl might set up
- // loading state too early and at that time all UI components are not created yet.
- // Therefore we need to set the previous loading state once again to trigger all UI
- // updates.
- setState(mStateStack.pop());
- }
- }
- }
-
- /**
- * Saves url to preference. Note this method should be used after the main view is attached to
- * an activity.
- */
- private void saveUrlToPreference(String url) {
- PreferenceManager.getDefaultSharedPreferences(mActivity).edit()
- .putString(PREF_LAST_USED_URL, url).apply();
- }
-
- /**
- * Fetches url to preference. Note this method should be used after the main view is attached to
- * an activity.
- */
- private String getUrlFromPreference() {
- return PreferenceManager.getDefaultSharedPreferences(mActivity).getString(
- PREF_LAST_USED_URL, UrlConstants.BOOKMARKS_URL);
- }
-
- /**
- * This is the ultimate internal method that updates UI and controls backstack. And it is the
- * only method that pushes states to {@link #mStateStack}.
- * <p>
- * If the given state is not valid, all_bookmark state will be shown. Afterwards, this method
- * checks the current state: if currently in loading state, it pops it out and adds the new
- * state to the back stack. It also notifies the {@link #mUrlChangeListener} (if any) that the
- * url has changed.
- * <p>
- * Also note that even if we store states to {@link #mStateStack}, on tablet the back navigation
- * and back button are not controlled by the manager: the tab handles back key and backstack
- * navigation.
- */
- private void setState(UIState state) {
- if (!state.isValid(mEnhancedBookmarksModel)) {
- state = UIState.createAllBookmarksState(mEnhancedBookmarksModel);
- }
- if (!mStateStack.isEmpty()) {
- if (mStateStack.peek().equals(state)) return;
- if (mStateStack.peek().mState == UIState.STATE_LOADING) {
- mStateStack.pop();
- }
- }
- mStateStack.push(state);
- if (state.mState != UIState.STATE_LOADING) {
- // Loading state may be pushed to the stack but should never be stored in preferences.
- saveUrlToPreference(state.mUrl);
- // If a loading state is replaced by another loading state, do not notify this change.
- if (mUrlChangeListener != null) mUrlChangeListener.onBookmarkUIStateChange(state.mUrl);
- }
-
- clearSelection();
-
- for (EnhancedBookmarkUIObserver observer : mUIObservers) {
- notifyStateChange(observer);
- }
- }
-
- // EnhancedBookmarkDelegate implementations.
-
- @Override
- public void openFolder(BookmarkId folder) {
- setState(UIState.createFolderState(folder, mEnhancedBookmarksModel));
- }
-
- @Override
- public void openAllBookmarks() {
- setState(UIState.createAllBookmarksState(mEnhancedBookmarksModel));
- }
-
- @Override
- public void clearSelection() {
- mSelectedBookmarks.clear();
- for (EnhancedBookmarkUIObserver observer : mUIObservers) {
- observer.onSelectionStateChange(new ArrayList<BookmarkId>(mSelectedBookmarks));
- }
- }
-
- @Override
- public boolean toggleSelectionForBookmark(BookmarkId bookmark) {
- if (!mEnhancedBookmarksModel.getBookmarkById(bookmark).isEditable()) return false;
-
- if (mSelectedBookmarks.contains(bookmark)) mSelectedBookmarks.remove(bookmark);
- else mSelectedBookmarks.add(bookmark);
- for (EnhancedBookmarkUIObserver observer : mUIObservers) {
- observer.onSelectionStateChange(new ArrayList<BookmarkId>(mSelectedBookmarks));
- }
-
- return isBookmarkSelected(bookmark);
- }
-
- @Override
- public boolean isBookmarkSelected(BookmarkId bookmark) {
- return mSelectedBookmarks.contains(bookmark);
- }
-
- @Override
- public boolean isSelectionEnabled() {
- return !mSelectedBookmarks.isEmpty();
- }
-
- @Override
- public List<BookmarkId> getSelectedBookmarks() {
- return new ArrayList<BookmarkId>(mSelectedBookmarks);
- }
-
- @Override
- public void notifyStateChange(EnhancedBookmarkUIObserver observer) {
- int state = getCurrentState();
- switch (state) {
- case UIState.STATE_ALL_BOOKMARKS:
- observer.onAllBookmarksStateSet();
- break;
- case UIState.STATE_FOLDER:
- observer.onFolderStateSet(mStateStack.peek().mFolder);
- break;
- case UIState.STATE_LOADING:
- // In loading state, onEnhancedBookmarkDelegateInitialized() is not called for all
- // UIObservers, which means that there will be no observers at the time. Do nothing.
- assert mUIObservers.isEmpty();
- break;
- default:
- assert false : "State not valid";
- break;
- }
- }
-
- @Override
- public boolean doesDrawerExist() {
- return mDrawer != null;
- }
-
- @Override
- public void closeDrawer() {
- if (!doesDrawerExist()) return;
-
- mDrawer.closeDrawer(Gravity.START);
- }
-
- @Override
- public DrawerLayout getDrawerLayout() {
- return mDrawer;
- }
-
- @Override
- public void openBookmark(BookmarkId bookmark, int launchLocation) {
- clearSelection();
- NewTabPageUma.recordAction(NewTabPageUma.ACTION_OPENED_BOOKMARK);
- RecordHistogram.recordEnumeratedHistogram("Stars.LaunchLocation", launchLocation,
- LaunchLocation.COUNT);
- EnhancedBookmarkUtils.openBookmark(mActivity,
- mEnhancedBookmarksModel.getBookmarkById(bookmark).getUrl());
- finishActivityOnPhone();
- }
-
- @Override
- public void finishActivityOnPhone() {
- Activity activity = mActivity;
- if (activity instanceof EnhancedBookmarkActivity) {
- activity.finish();
- }
- }
-
- @Override
- public void addUIObserver(EnhancedBookmarkUIObserver observer) {
- mUIObservers.addObserver(observer);
- }
-
- @Override
- public void removeUIObserver(EnhancedBookmarkUIObserver observer) {
- mUIObservers.removeObserver(observer);
- }
-
- @Override
- public EnhancedBookmarksModel getModel() {
- return mEnhancedBookmarksModel;
- }
-
- @Override
- public int getCurrentState() {
- if (mStateStack.isEmpty()) return UIState.STATE_LOADING;
- return mStateStack.peek().mState;
- }
-
- /**
- * Internal state that represents a url. Note every state needs to have a _valid_ url. For
- * loading state, {@link #mUrl} indicates the target to open after the bookmark model is loaded.
- */
- static class UIState {
- private static final int STATE_INVALID = 0;
- static final int STATE_LOADING = 1;
- static final int STATE_ALL_BOOKMARKS = 2;
- static final int STATE_FOLDER = 3;
- static final int STATE_FILTER = 4;
-
- private static final String TAG = "UIState";
- private static final String URL_CHARSET = "UTF-8";
- /**
- * One of the STATE_* constants.
- */
- private int mState;
- private String mUrl;
- private BookmarkId mFolder;
-
- private static UIState createLoadingState(String url) {
- UIState state = new UIState();
- state.mUrl = url;
- state.mState = STATE_LOADING;
- return state;
- }
-
- private static UIState createAllBookmarksState(EnhancedBookmarksModel bookmarkModel) {
- return createStateFromUrl(UrlConstants.BOOKMARKS_URL, bookmarkModel);
- }
-
- private static UIState createFolderState(BookmarkId folder,
- EnhancedBookmarksModel bookmarkModel) {
- return createStateFromUrl(UrlConstants.BOOKMARKS_FOLDER_URL + folder.toString(),
- bookmarkModel);
- }
-
- /**
- * @return A state corresponding to the url. If the url is not valid, return all_bookmarks.
- */
- private static UIState createStateFromUrl(String url,
- EnhancedBookmarksModel bookmarkModel) {
- UIState state = new UIState();
- state.mState = STATE_INVALID;
- state.mUrl = url;
-
- if (url.equals(UrlConstants.BOOKMARKS_URL)) {
- state.mState = STATE_ALL_BOOKMARKS;
- } else if (url.startsWith(UrlConstants.BOOKMARKS_FOLDER_URL)) {
- String suffix = decodeSuffix(url, UrlConstants.BOOKMARKS_FOLDER_URL);
- if (!suffix.isEmpty()) {
- state.mFolder = BookmarkId.getBookmarkIdFromString(suffix);
- state.mState = STATE_FOLDER;
- }
- }
-
- if (!state.isValid(bookmarkModel)) {
- state.mState = STATE_ALL_BOOKMARKS;
- state.mUrl = UrlConstants.BOOKMARKS_URL;
- }
-
- return state;
- }
-
- private UIState() {
- }
-
- /**
- * @return Whether this state is valid.
- */
- private boolean isValid(EnhancedBookmarksModel bookmarkModel) {
- if (mUrl == null || mState == STATE_INVALID) return false;
-
- if (mState == STATE_FOLDER) {
- if (mFolder == null) return false;
-
- return bookmarkModel.doesBookmarkExist(mFolder)
- && !mFolder.equals(bookmarkModel.getRootFolderId());
- }
-
- return true;
- }
-
- private static String decodeSuffix(String url, String prefix) {
- String suffix = url.substring(prefix.length());
- try {
- suffix = URLDecoder.decode(suffix, URL_CHARSET);
- } catch (UnsupportedEncodingException e) {
- Log.w(TAG, "Bookmark URL parsing failed. " + URL_CHARSET + " not supported.");
- }
- return suffix;
- }
-
- private static String encodeUrl(String prefix, String suffix) {
- try {
- suffix = URLEncoder.encode(suffix, URL_CHARSET);
- } catch (UnsupportedEncodingException e) {
- Log.w(TAG, "Bookmark URL parsing failed. " + URL_CHARSET + " not supported.");
- }
- return prefix + suffix;
- }
-
- @Override
- public int hashCode() {
- return 31 * mUrl.hashCode() + mState;
- }
-
- @Override
- public boolean equals(Object obj) {
- if (!(obj instanceof UIState)) return false;
- UIState other = (UIState) obj;
- return mState == other.mState && mUrl.equals(other.mUrl);
- }
- }
-}

Powered by Google App Engine
This is Rietveld 408576698