Index: chrome/android/java_staging/src/org/chromium/chrome/browser/ntp/BookmarksPage.java |
diff --git a/chrome/android/java_staging/src/org/chromium/chrome/browser/ntp/BookmarksPage.java b/chrome/android/java_staging/src/org/chromium/chrome/browser/ntp/BookmarksPage.java |
deleted file mode 100644 |
index d15c0c161913f36c94b0e1b2e9f23950da38d261..0000000000000000000000000000000000000000 |
--- a/chrome/android/java_staging/src/org/chromium/chrome/browser/ntp/BookmarksPage.java |
+++ /dev/null |
@@ -1,579 +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.ntp; |
- |
-import android.content.Context; |
-import android.content.SharedPreferences; |
-import android.content.res.Resources; |
-import android.graphics.Bitmap; |
-import android.graphics.Canvas; |
-import android.preference.PreferenceManager; |
-import android.view.LayoutInflater; |
-import android.view.View; |
-import android.view.ViewGroup; |
- |
-import org.chromium.chrome.R; |
-import org.chromium.chrome.browser.BookmarksBridge; |
-import org.chromium.chrome.browser.BookmarksBridge.BookmarkItem; |
-import org.chromium.chrome.browser.BookmarksBridge.BookmarkModelObserver; |
-import org.chromium.chrome.browser.BookmarksBridge.BookmarksCallback; |
-import org.chromium.chrome.browser.NativePage; |
-import org.chromium.chrome.browser.Tab; |
-import org.chromium.chrome.browser.UrlConstants; |
-import org.chromium.chrome.browser.bookmark.EditBookmarkHelper; |
-import org.chromium.chrome.browser.compositor.layouts.content.InvalidationAwareThumbnailProvider; |
-import org.chromium.chrome.browser.favicon.FaviconHelper; |
-import org.chromium.chrome.browser.favicon.FaviconHelper.FaviconImageCallback; |
-import org.chromium.chrome.browser.ntp.BookmarksPageView.BookmarksPageManager; |
-import org.chromium.chrome.browser.preferences.PrefServiceBridge; |
-import org.chromium.chrome.browser.profiles.Profile; |
-import org.chromium.chrome.browser.tabmodel.TabModel.TabLaunchType; |
-import org.chromium.chrome.browser.tabmodel.TabModelSelector; |
-import org.chromium.chrome.browser.util.ViewUtils; |
-import org.chromium.components.bookmarks.BookmarkId; |
-import org.chromium.components.bookmarks.BookmarkType; |
-import org.chromium.content_public.browser.LoadUrlParams; |
- |
-import java.util.List; |
- |
-/** |
- * Provides functionality when the user interacts with the bookmarks page. This class supports |
- * the regular bookmarks page as well as "select bookmark mode", in which context menus are |
- * disabled and clicking a bookmark just notifies a listener instead of loading the bookmark URL. |
- */ |
-public class BookmarksPage implements NativePage, InvalidationAwareThumbnailProvider { |
- |
- private static final String LAST_USED_BOOKMARK_FOLDER_ID = "last_used_folder_id"; |
- |
- private static final int PAGE_MODE_NORMAL = 0; |
- private static final int PAGE_MODE_SELECT_BOOKMARK = 1; |
- private static final int PAGE_MODE_DOCUMENT = 2; |
- |
- private final Profile mProfile; |
- private BookmarksBridge mBookmarksBridge; |
- private FaviconHelper mFaviconHelper; |
- |
- private final BookmarksPageView mPageView; |
- private final String mTitle; |
- private final int mBackgroundColor; |
- |
- // Whether destroy() has been called. |
- private boolean mIsDestroyed; |
- |
- private BookmarkId mCurrentFolderId; |
- |
- private final SharedPreferences mSharedPreferences; |
- |
- /** |
- * Interface to be notified when the user clicks on a bookmark. To be used with |
- * buildPageForShortcutActivity(). |
- */ |
- public interface BookmarkSelectedListener { |
- /** |
- * Called when a bookmark is selected. |
- * @param url The url of the selected bookmark. |
- * @param title The title of the selected bookmark. |
- * @param favicon The favicon of the selected bookmark. |
- */ |
- void onBookmarkSelected(String url, String title, Bitmap favicon); |
- |
- /** |
- * Called when a new tab has been opened in a new tab. |
- */ |
- void onNewTabOpened(); |
- } |
- |
- /** |
- * Creates a BookmarksPage to be shown in a tab. |
- * @param context The view context for showing the page. |
- * @param tab The tab in which the page will be shown. |
- * @param tabModelSelector The TabModelSelector to use when opening new tabs from the bookmarks |
- * page. |
- * @return The new BookmarksPage object. |
- */ |
- public static BookmarksPage buildPage(Context context, Tab tab, |
- TabModelSelector tabModelSelector) { |
- return new BookmarksPage(context, tab.getProfile(), tab, tabModelSelector, null, |
- PAGE_MODE_NORMAL); |
- } |
- |
- /** |
- * Creates a BookmarksPage to be shown in the ShortcutActivity. |
- * @param context The view context for showing the page. |
- * @param profile The profile from which to load bookmarks. |
- * @param listener The BookmarkSelectedListener to notify when the user clicks a bookmark. |
- * @return The new BookmarksPage object. |
- */ |
- public static BookmarksPage buildPageInSelectBookmarkMode(Context context, |
- Profile profile, BookmarkSelectedListener listener) { |
- return new BookmarksPage(context, profile, null, null, listener, PAGE_MODE_SELECT_BOOKMARK); |
- } |
- |
- /** |
- * Creates a BookmarksPage to be shown in document mode. |
- * @param context The view context for showing the page. |
- * @param tab The tab from which bookmarks page is loaded. |
- * @param tabModelSelector The TabModelSelector to use when opening new tabs from the bookmarks |
- * page. |
- * @param profile The profile from which to load bookmarks. |
- * @param listener The BookmarkSelectedListener to notify when the user clicks a bookmark. |
- * @return The new BookmarksPage object. |
- */ |
- public static BookmarksPage buildPageInDocumentMode(Context context, Tab tab, |
- TabModelSelector tabModelSelector, Profile profile, BookmarkSelectedListener listener) { |
- return new BookmarksPage( |
- context, profile, tab, tabModelSelector, listener, PAGE_MODE_DOCUMENT); |
- } |
- |
- /** |
- * Delegates user triggered actions for the bookmarks page. |
- */ |
- private class BookmarksPageManagerImpl implements BookmarksPageManager { |
- protected Tab mTab; |
- protected TabModelSelector mTabModelSelector; |
- |
- public BookmarksPageManagerImpl(Tab tab, TabModelSelector tabModelSelector) { |
- mTab = tab; |
- mTabModelSelector = tabModelSelector; |
- } |
- |
- protected void recordOpenedBookmark() { |
- if (!isIncognito()) { |
- NewTabPageUma.recordAction(NewTabPageUma.ACTION_OPENED_BOOKMARK); |
- } |
- } |
- |
- @Override |
- public boolean isDestroyed() { |
- return mIsDestroyed; |
- } |
- |
- @Override |
- public boolean isIncognito() { |
- return mTab.isIncognito(); |
- } |
- |
- @Override |
- public boolean shouldShowOpenInNewTab() { |
- return !isIncognito(); |
- } |
- |
- @Override |
- public boolean shouldShowOpenInNewIncognitoTab() { |
- return PrefServiceBridge.getInstance().isIncognitoModeEnabled(); |
- } |
- |
- @Override |
- public boolean isContextMenuEnabled() { |
- return true; |
- } |
- |
- @Override |
- public void open(BookmarkItemView item) { |
- if (item.isFolder()) { |
- mTab.loadUrl(new LoadUrlParams( |
- UrlConstants.BOOKMARKS_FOLDER_URL + item.getBookmarkId().toString())); |
- } else { |
- recordOpenedBookmark(); |
- mTab.loadUrl(new LoadUrlParams(item.getUrl())); |
- } |
- } |
- |
- @Override |
- public void openInNewTab(BookmarkItemView item) { |
- assert !item.isFolder(); |
- recordOpenedBookmark(); |
- mTabModelSelector.openNewTab(new LoadUrlParams(item.getUrl()), |
- TabLaunchType.FROM_LONGPRESS_BACKGROUND, mTab, |
- mTabModelSelector.isIncognitoSelected()); |
- } |
- |
- @Override |
- public void openInNewIncognitoTab(BookmarkItemView item) { |
- assert !item.isFolder(); |
- recordOpenedBookmark(); |
- mTabModelSelector.openNewTab(new LoadUrlParams(item.getUrl()), |
- TabLaunchType.FROM_LONGPRESS_FOREGROUND, mTab, true); |
- } |
- |
- @Override |
- public void openFolder(BookmarkFolderHierarchyItem item) { |
- mTab.loadUrl(new LoadUrlParams( |
- UrlConstants.BOOKMARKS_FOLDER_URL + item.getFolderId())); |
- } |
- |
- @Override |
- public void delete(BookmarkItemView item) { |
- if (mBookmarksBridge == null) return; |
- mBookmarksBridge.deleteBookmark(item.getBookmarkId()); |
- } |
- |
- @Override |
- public void edit(BookmarkItemView item) { |
- BookmarksPage.this.edit(item); |
- } |
- |
- @Override |
- public void getFaviconImageForUrl( |
- String url, int size, FaviconImageCallback faviconCallback) { |
- BookmarksPage.this.getFaviconImageForUrl(url, size, faviconCallback); |
- } |
- } |
- |
- private class DocumentModeManager extends BookmarksPageManagerImpl { |
- private final BookmarkSelectedListener mListener; |
- |
- public DocumentModeManager(Tab tab, TabModelSelector tabModelSelector, |
- BookmarkSelectedListener listener) { |
- super(tab, tabModelSelector); |
- mListener = listener; |
- } |
- |
- @Override |
- public void openInNewTab(BookmarkItemView item) { |
- super.openInNewTab(item); |
- mListener.onNewTabOpened(); |
- } |
- |
- @Override |
- public void openInNewIncognitoTab(BookmarkItemView item) { |
- super.openInNewIncognitoTab(item); |
- mListener.onNewTabOpened(); |
- } |
- |
- @Override |
- public void open(BookmarkItemView item) { |
- if (item.isFolder()) { |
- updateBookmarksPageContents(item.getBookmarkId(), false); |
- } else { |
- recordOpenedBookmark(); |
- mListener.onBookmarkSelected(item.getUrl(), item.getTitle(), item.getFavicon()); |
- } |
- } |
- |
- @Override |
- public void openFolder(BookmarkFolderHierarchyItem item) { |
- updateBookmarksPageContents(item.getFolderId(), false); |
- } |
- } |
- |
- private BookmarksPage(Context context, Profile profile, Tab tab, |
- TabModelSelector tabModelSelector, BookmarkSelectedListener listener, |
- int pageMode) { |
- mProfile = profile; |
- mFaviconHelper = new FaviconHelper(); |
- mTitle = context.getResources().getString(R.string.ntp_bookmarks); |
- mBackgroundColor = context.getResources().getColor(R.color.ntp_bg); |
- mCurrentFolderId = new BookmarkId(BookmarkId.INVALID_FOLDER_ID, BookmarkType.NORMAL); |
- mSharedPreferences = PreferenceManager.getDefaultSharedPreferences(context); |
- |
- LayoutInflater inflater = LayoutInflater.from(context); |
- mPageView = (BookmarksPageView) inflater.inflate(R.layout.bookmarks_page, null); |
- |
- if (pageMode == PAGE_MODE_NORMAL || pageMode == PAGE_MODE_DOCUMENT) { |
- // mPageView (which has a transparent background) needs top padding of size |
- // R.dimen.tab_strip_height so that the bookmarks page isn't drawn over the tab strip. |
- // mPageView's first child (which has a white background) needs top padding of size |
- // R.dimen.toolbar_height_no_shadow so that the bookmarks page contents start below |
- // the URL bar. |
- // TODO(newt): combine these padding values and apply them just to mPageView, once the |
- // classic NTP is gone. Until then, we need to draw white behind the URL bar so the |
- // animation shown when pressing the "+" button in the tab switcher to open a new tab |
- // on the bookmarks page looks good. |
- Resources res = context.getResources(); |
- int tabStripHeight = res.getDimensionPixelOffset(R.dimen.tab_strip_height); |
- int toolbarHeightNoShadow = res.getDimensionPixelOffset( |
- R.dimen.toolbar_height_no_shadow); |
- mPageView.setPadding(mPageView.getPaddingLeft(), tabStripHeight, |
- mPageView.getPaddingRight(), mPageView.getPaddingBottom()); |
- View v = ((ViewGroup) mPageView).getChildAt(0); |
- v.setPadding(v.getPaddingLeft(), toolbarHeightNoShadow, v.getPaddingRight(), |
- v.getPaddingBottom()); |
- } |
- |
- BookmarksPageManager manager = null; |
- switch (pageMode) { |
- case PAGE_MODE_NORMAL: |
- manager = buildManager(tab, tabModelSelector); |
- break; |
- case PAGE_MODE_SELECT_BOOKMARK: |
- manager = buildManagerForSelectBookmarkMode(listener); |
- break; |
- case PAGE_MODE_DOCUMENT: |
- manager = buildManagerForDocumentMode(tab, tabModelSelector, listener); |
- break; |
- default: |
- assert false; |
- break; |
- } |
- |
- mPageView.initialize(manager); |
- |
- mBookmarksBridge = new BookmarksBridge(mProfile); |
- mBookmarksBridge.addObserver(new BookmarkModelObserver() { |
- private void updateIfNodeIsCurrentFolder(BookmarkId nodeId) { |
- updateIfEitherNodeIsCurrentFolder(nodeId, nodeId); |
- } |
- |
- private void updateIfEitherNodeIsCurrentFolder(BookmarkId firstNodeId, |
- BookmarkId secondNodeId) { |
- if ((mCurrentFolderId.equals(firstNodeId) |
- || mCurrentFolderId.equals(secondNodeId))) { |
- updateBookmarksPageContents(mCurrentFolderId, true); |
- } |
- } |
- |
- @Override |
- public void bookmarkNodeMoved(BookmarkItem oldParent, |
- int oldIndex, BookmarkItem newParent, int newIndex) { |
- updateIfEitherNodeIsCurrentFolder(oldParent.getId(), newParent.getId()); |
- } |
- |
- @Override |
- public void bookmarkNodeAdded(BookmarkItem parent, int index) { |
- updateIfNodeIsCurrentFolder(parent.getId()); |
- } |
- |
- @Override |
- public void bookmarkNodeRemoved(BookmarkItem parent, int oldIndex, BookmarkItem node, |
- boolean isExtensiveBookmarkChangesHappening) { |
- // Since the node is already removed, it does not have a parent. Hence, we need |
- // to pass the old parent information to check if it is the current folder. |
- // node.getParentId() is INVALID_FOLDER_ID. |
- updateIfEitherNodeIsCurrentFolder(node.getId(), parent.getId()); |
- } |
- |
- @Override |
- public void bookmarkNodeChanged(BookmarkItem node) { |
- updateIfEitherNodeIsCurrentFolder(node.getId(), node.getParentId()); |
- } |
- |
- @Override |
- public void bookmarkNodeChildrenReordered(BookmarkItem node) { |
- updateIfNodeIsCurrentFolder(node.getId()); |
- } |
- |
- @Override |
- public void bookmarkModelLoaded() { |
- // Purposefully don't do anything because we will be getting callbacks. |
- } |
- |
- @Override |
- public void bookmarkModelChanged() { |
- updateBookmarksPageContents(mCurrentFolderId, true); |
- } |
- }); |
- } |
- |
- private BookmarksPageManager buildManager(Tab tab, TabModelSelector tabModelSelector) { |
- return new BookmarksPageManagerImpl(tab, tabModelSelector); |
- } |
- |
- private BookmarksPageManager buildManagerForDocumentMode( |
- Tab tab, TabModelSelector tabModelSelector, BookmarkSelectedListener listener) { |
- return new DocumentModeManager(tab, tabModelSelector, listener); |
- } |
- |
- private BookmarksPageManager buildManagerForSelectBookmarkMode( |
- final BookmarkSelectedListener listener) { |
- return new BookmarksPageManager() { |
- @Override |
- public boolean isDestroyed() { |
- return mIsDestroyed; |
- } |
- |
- @Override |
- public boolean isIncognito() { |
- return false; |
- } |
- |
- @Override |
- public boolean shouldShowOpenInNewTab() { |
- return false; |
- } |
- |
- @Override |
- public boolean shouldShowOpenInNewIncognitoTab() { |
- return false; |
- } |
- |
- @Override |
- public boolean isContextMenuEnabled() { |
- return false; |
- } |
- |
- @Override |
- public void open(BookmarkItemView item) { |
- if (item.isFolder()) { |
- updateBookmarksPageContents(item.getBookmarkId(), false); |
- } else { |
- listener.onBookmarkSelected(item.getUrl(), item.getTitle(), item.getFavicon()); |
- } |
- } |
- |
- @Override |
- public void openInNewTab(BookmarkItemView item) { |
- } |
- |
- @Override |
- public void openInNewIncognitoTab(BookmarkItemView item) { |
- } |
- |
- @Override |
- public void openFolder(BookmarkFolderHierarchyItem item) { |
- updateBookmarksPageContents(item.getFolderId(), false); |
- } |
- |
- @Override |
- public void delete(BookmarkItemView item) { |
- } |
- |
- @Override |
- public void edit(BookmarkItemView item) { |
- } |
- |
- @Override |
- public void getFaviconImageForUrl( |
- String url, int size, FaviconImageCallback faviconCallback) { |
- BookmarksPage.this.getFaviconImageForUrl(url, size, faviconCallback); |
- } |
- }; |
- } |
- |
- private void getFaviconImageForUrl(String url, int size, FaviconImageCallback faviconCallback) { |
- if (mFaviconHelper == null) return; |
- mFaviconHelper.getLocalFaviconImageForURL(mProfile, url, |
- FaviconHelper.FAVICON | FaviconHelper.TOUCH_ICON |
- | FaviconHelper.TOUCH_PRECOMPOSED_ICON, |
- size, faviconCallback); |
- } |
- |
- private void edit(BookmarkItemView item) { |
- Context context = mPageView.getContext(); |
- if (item.getBookmarkId().getType() == BookmarkType.PARTNER) { |
- EditBookmarkHelper.editPartnerBookmark(context, mProfile, item.getBookmarkId().getId(), |
- item.getTitle(), item.isFolder()); |
- } else { |
- EditBookmarkHelper.editBookmark(context, item.getBookmarkId().getId(), item.isFolder()); |
- } |
- } |
- |
- /** |
- * Updates the contents of the bookmark page if the current folder has changed. |
- * @param folderId The ID of the folder to load. |
- * @param force Whether to force the update even if the folder has not changed. |
- */ |
- private void updateBookmarksPageContents(BookmarkId folderId, boolean force) { |
- if (mBookmarksBridge == null) return; |
- if (!force && mCurrentFolderId.equals(folderId)) return; |
- BookmarksCallback callbackWrapper = new BookmarksCallback() { |
- @Override |
- public void onBookmarksFolderHierarchyAvailable(BookmarkId folderId, |
- List<BookmarkItem> bookmarksList) { |
- mPageView.onBookmarksFolderHierarchyAvailable(folderId, bookmarksList); |
- } |
- |
- @Override |
- public void onBookmarksAvailable(BookmarkId folderId, |
- List<BookmarkItem> bookmarksList) { |
- // Update the folder ID based on the response, as sometimes it will be changed |
- // from the passed in value (if the ID passed in was invalid). |
- mCurrentFolderId = folderId; |
- updateLastUsedFolderId(); |
- mPageView.onBookmarksAvailable(folderId, bookmarksList); |
- } |
- }; |
- mBookmarksBridge.getBookmarksForFolder(folderId, callbackWrapper); |
- mBookmarksBridge.getCurrentFolderHierarchy(folderId, callbackWrapper); |
- } |
- |
- private void updateLastUsedFolderId() { |
- mSharedPreferences.edit().putString( |
- LAST_USED_BOOKMARK_FOLDER_ID, mCurrentFolderId.toString()).apply(); |
- } |
- |
- /** |
- * @return The last used bookmark folder id with fallback to the root folder id. |
- */ |
- private BookmarkId getLastUsedFolderId() { |
- // If null shared prefs returns null, getBookmarkIdFromString() returns root folder id. |
- return BookmarkId.getBookmarkIdFromString(mSharedPreferences.getString( |
- LAST_USED_BOOKMARK_FOLDER_ID, null)); |
- } |
- |
- // NativePage overrides |
- |
- @Override |
- public String getUrl() { |
- if (mCurrentFolderId.getId() < 0) { |
- return UrlConstants.BOOKMARKS_URL; |
- } else { |
- return UrlConstants.BOOKMARKS_FOLDER_URL + mCurrentFolderId.toString(); |
- } |
- } |
- |
- @Override |
- public String getTitle() { |
- return mTitle; |
- } |
- |
- @Override |
- public int getBackgroundColor() { |
- return mBackgroundColor; |
- } |
- |
- @Override |
- public View getView() { |
- return mPageView; |
- } |
- |
- /** |
- * Releases internal resources. This must be called eventually, and the object should not used |
- * after calling this. |
- */ |
- @Override |
- public void destroy() { |
- if (mFaviconHelper != null) { |
- mFaviconHelper.destroy(); |
- mFaviconHelper = null; |
- } |
- if (mBookmarksBridge != null) { |
- mBookmarksBridge.destroy(); |
- mBookmarksBridge = null; |
- } |
- mIsDestroyed = true; |
- } |
- |
- @Override |
- public String getHost() { |
- return UrlConstants.BOOKMARKS_HOST; |
- } |
- |
- @Override |
- public void updateForUrl(String url) { |
- BookmarkId folderId = null; |
- if (url != null && url.startsWith(UrlConstants.BOOKMARKS_FOLDER_URL)) { |
- String fragment = url.substring(UrlConstants.BOOKMARKS_FOLDER_URL.length()); |
- if (!fragment.isEmpty()) { |
- folderId = BookmarkId.getBookmarkIdFromString(fragment); |
- } |
- } |
- if (folderId == null) folderId = getLastUsedFolderId(); |
- updateBookmarksPageContents(folderId, false); |
- } |
- |
- // InvalidationAwareThumbnailProvider |
- |
- @Override |
- public boolean shouldCaptureThumbnail() { |
- return mPageView.shouldCaptureThumbnail(); |
- } |
- |
- @Override |
- public void captureThumbnail(Canvas canvas) { |
- ViewUtils.captureBitmap(mPageView, canvas); |
- mPageView.updateThumbnailState(); |
- } |
-} |