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); |
- } |
- } |
-} |