OLD | NEW |
(Empty) | |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. |
| 4 |
| 5 package org.chromium.chrome.browser.ntp; |
| 6 |
| 7 import android.annotation.TargetApi; |
| 8 import android.app.Activity; |
| 9 import android.app.Dialog; |
| 10 import android.graphics.Bitmap; |
| 11 import android.os.Build; |
| 12 import android.view.ContextMenu; |
| 13 import android.view.LayoutInflater; |
| 14 import android.view.Menu; |
| 15 import android.view.MenuItem.OnMenuItemClickListener; |
| 16 import android.view.View; |
| 17 |
| 18 import com.google.android.apps.chrome.R; |
| 19 |
| 20 import org.chromium.base.metrics.RecordHistogram; |
| 21 import org.chromium.base.metrics.RecordUserAction; |
| 22 import org.chromium.chrome.browser.LogoBridge.LogoObserver; |
| 23 import org.chromium.chrome.browser.NativePage; |
| 24 import org.chromium.chrome.browser.Tab; |
| 25 import org.chromium.chrome.browser.UrlConstants; |
| 26 import org.chromium.chrome.browser.document.DocumentMetricIds; |
| 27 import org.chromium.chrome.browser.enhancedbookmarks.EnhancedBookmarkUtils; |
| 28 import org.chromium.chrome.browser.favicon.FaviconHelper; |
| 29 import org.chromium.chrome.browser.favicon.FaviconHelper.FaviconImageCallback; |
| 30 import org.chromium.chrome.browser.favicon.LargeIconBridge; |
| 31 import org.chromium.chrome.browser.favicon.LargeIconBridge.LargeIconCallback; |
| 32 import org.chromium.chrome.browser.ntp.BookmarksPage.BookmarkSelectedListener; |
| 33 import org.chromium.chrome.browser.ntp.NewTabPageView.NewTabPageManager; |
| 34 import org.chromium.chrome.browser.preferences.DocumentModeManager; |
| 35 import org.chromium.chrome.browser.preferences.DocumentModePreference; |
| 36 import org.chromium.chrome.browser.preferences.PrefServiceBridge; |
| 37 import org.chromium.chrome.browser.preferences.PreferencesLauncher; |
| 38 import org.chromium.chrome.browser.profiles.MostVisitedSites; |
| 39 import org.chromium.chrome.browser.profiles.MostVisitedSites.MostVisitedURLsObse
rver; |
| 40 import org.chromium.chrome.browser.profiles.MostVisitedSites.ThumbnailCallback; |
| 41 import org.chromium.chrome.browser.profiles.Profile; |
| 42 import org.chromium.chrome.browser.tabmodel.TabModel.TabLaunchType; |
| 43 import org.chromium.chrome.browser.tabmodel.TabModelSelector; |
| 44 import org.chromium.content_public.browser.LoadUrlParams; |
| 45 import org.chromium.ui.base.PageTransition; |
| 46 |
| 47 /** |
| 48 * Provides functionality when the user interacts with the most visited websites
page. |
| 49 */ |
| 50 public class DocumentNewTabPage implements NativePage { |
| 51 private static final int ID_OPEN_IN_NEW_TAB = 0; |
| 52 private static final int ID_OPEN_IN_INCOGNITO_TAB = 1; |
| 53 private static final int ID_REMOVE = 2; |
| 54 |
| 55 // The number of times that an opt-out promo will be shown. |
| 56 private static final int MAX_OPT_OUT_PROMO_COUNT = 10; |
| 57 |
| 58 private final Tab mTab; |
| 59 private final TabModelSelector mTabModelSelector; |
| 60 private final Activity mActivity; |
| 61 |
| 62 private final Profile mProfile; |
| 63 private final String mTitle; |
| 64 private final int mBackgroundColor; |
| 65 private final NewTabPageView mNewTabPageView; |
| 66 |
| 67 private MostVisitedSites mMostVisitedSites; |
| 68 private FaviconHelper mFaviconHelper; |
| 69 private LargeIconBridge mLargeIconBridge; |
| 70 |
| 71 private final NewTabPageManager mNewTabPageManager = new NewTabPageManager()
{ |
| 72 private void recordOpenedMostVisitedItem(MostVisitedItem item) { |
| 73 NewTabPageUma.recordAction(NewTabPageUma.ACTION_OPENED_MOST_VISITED_
ENTRY); |
| 74 RecordHistogram.recordEnumeratedHistogram("NewTabPage.MostVisited",
item.getIndex(), |
| 75 NewTabPageView.MAX_MOST_VISITED_SITES); |
| 76 mMostVisitedSites.recordOpenedMostVisitedItem(item.getIndex()); |
| 77 } |
| 78 |
| 79 private void recordDocumentOptOutPromoClick(int which) { |
| 80 RecordHistogram.recordEnumeratedHistogram("DocumentActivity.OptOutCl
ick", which, |
| 81 DocumentMetricIds.OPT_OUT_CLICK_COUNT); |
| 82 } |
| 83 |
| 84 @Override |
| 85 public void open(MostVisitedItem item) { |
| 86 String url = item.getUrl(); |
| 87 mTab.loadUrl(new LoadUrlParams(url, PageTransition.LINK)); |
| 88 } |
| 89 |
| 90 @Override |
| 91 public void onCreateContextMenu(ContextMenu menu, OnMenuItemClickListene
r listener) { |
| 92 menu.add(Menu.NONE, ID_OPEN_IN_NEW_TAB, Menu.NONE, R.string.contextm
enu_open_in_new_tab) |
| 93 .setOnMenuItemClickListener(listener); |
| 94 if (PrefServiceBridge.getInstance().isIncognitoModeEnabled()) { |
| 95 menu.add(Menu.NONE, ID_OPEN_IN_INCOGNITO_TAB, Menu.NONE, |
| 96 R.string.contextmenu_open_in_incognito_tab).setOnMenuIte
mClickListener( |
| 97 listener); |
| 98 } |
| 99 menu.add(Menu.NONE, ID_REMOVE, Menu.NONE, R.string.remove) |
| 100 .setOnMenuItemClickListener(listener); |
| 101 } |
| 102 |
| 103 @Override |
| 104 @TargetApi(Build.VERSION_CODES.LOLLIPOP) |
| 105 public boolean onMenuItemClick(int menuId, MostVisitedItem item) { |
| 106 switch (menuId) { |
| 107 case ID_OPEN_IN_NEW_TAB: |
| 108 recordOpenedMostVisitedItem(item); |
| 109 mTabModelSelector.openNewTab(new LoadUrlParams(item.getUrl()
), |
| 110 TabLaunchType.FROM_LONGPRESS_BACKGROUND, mTab, false
); |
| 111 return true; |
| 112 case ID_OPEN_IN_INCOGNITO_TAB: |
| 113 recordOpenedMostVisitedItem(item); |
| 114 mActivity.finishAndRemoveTask(); |
| 115 mTabModelSelector.openNewTab(new LoadUrlParams(item.getUrl()
), |
| 116 TabLaunchType.FROM_LONGPRESS_FOREGROUND, mTab, true)
; |
| 117 return true; |
| 118 case ID_REMOVE: |
| 119 mMostVisitedSites.blacklistUrl(item.getUrl()); |
| 120 return true; |
| 121 default: |
| 122 return false; |
| 123 } |
| 124 } |
| 125 |
| 126 @Override |
| 127 public void setMostVisitedURLsObserver(MostVisitedURLsObserver observer,
int numResults) { |
| 128 mMostVisitedSites.setMostVisitedURLsObserver(observer, numResults); |
| 129 } |
| 130 |
| 131 @Override |
| 132 public void getURLThumbnail(String url, ThumbnailCallback thumbnailCallb
ack) { |
| 133 mMostVisitedSites.getURLThumbnail(url, thumbnailCallback); |
| 134 } |
| 135 |
| 136 @Override |
| 137 public void getLocalFaviconImageForURL( |
| 138 String url, int size, FaviconImageCallback faviconCallback) { |
| 139 if (mFaviconHelper == null) mFaviconHelper = new FaviconHelper(); |
| 140 mFaviconHelper.getLocalFaviconImageForURL(mProfile, url, FaviconHelp
er.FAVICON |
| 141 | FaviconHelper.TOUCH_ICON | FaviconHelper.TOUCH_PRECOMPOSED
_ICON, size, |
| 142 faviconCallback); |
| 143 } |
| 144 |
| 145 @Override |
| 146 public void getLargeIconForUrl(String url, int size, LargeIconCallback c
allback) { |
| 147 if (mLargeIconBridge == null) mLargeIconBridge = new LargeIconBridge
(); |
| 148 mLargeIconBridge.getLargeIconForUrl(mProfile, url, size, callback); |
| 149 } |
| 150 |
| 151 @Override |
| 152 public void onLoadingComplete() { |
| 153 } |
| 154 |
| 155 @Override |
| 156 public void navigateToBookmarks() { |
| 157 RecordUserAction.record("MobileNTPSwitchToBookmarks"); |
| 158 launchBookmarksDialog(mActivity, mTab, mTabModelSelector); |
| 159 } |
| 160 |
| 161 @Override |
| 162 public void navigateToRecentTabs() { |
| 163 RecordUserAction.record("MobileNTPSwitchToOpenTabs"); |
| 164 launchRecentTabsDialog(mActivity, mTab, true); |
| 165 } |
| 166 |
| 167 @Override |
| 168 public boolean isLocationBarShownInNTP() { |
| 169 return false; |
| 170 } |
| 171 |
| 172 @Override |
| 173 public void focusSearchBox(boolean beginVoiceSearch, String pastedText)
{ |
| 174 } |
| 175 |
| 176 @Override |
| 177 public void openLogoLink() { |
| 178 } |
| 179 |
| 180 @Override |
| 181 public void getSearchProviderLogo(LogoObserver logoObserver) { |
| 182 } |
| 183 |
| 184 @Override |
| 185 public boolean shouldShowOptOutPromo() { |
| 186 DocumentModeManager documentModeManager = DocumentModeManager.getIns
tance(mActivity); |
| 187 return !documentModeManager.isOptOutPromoDismissed() |
| 188 && (documentModeManager.getOptOutShownCount() < MAX_OPT_OUT_
PROMO_COUNT); |
| 189 } |
| 190 |
| 191 @Override |
| 192 public void optOutPromoShown() { |
| 193 DocumentModeManager.getInstance(mActivity).incrementOptOutShownCount
(); |
| 194 RecordUserAction.record("DocumentActivity_OptOutShownOnHome"); |
| 195 } |
| 196 |
| 197 @Override |
| 198 public void optOutPromoClicked(boolean settingsClicked) { |
| 199 if (settingsClicked) { |
| 200 recordDocumentOptOutPromoClick(DocumentMetricIds.OPT_OUT_CLICK_S
ETTINGS); |
| 201 PreferencesLauncher.launchSettingsPage(mActivity, |
| 202 DocumentModePreference.class.getName()); |
| 203 } else { |
| 204 recordDocumentOptOutPromoClick(DocumentMetricIds.OPT_OUT_CLICK_G
OT_IT); |
| 205 DocumentModeManager documentModeManager = DocumentModeManager.ge
tInstance( |
| 206 mActivity); |
| 207 documentModeManager.setOptedOutState(DocumentModeManager.OPT_OUT
_PROMO_DISMISSED); |
| 208 } |
| 209 } |
| 210 }; |
| 211 |
| 212 /** |
| 213 * Constructs a NewTabPage. |
| 214 * @param activity Activity that owns the page. |
| 215 * @param tab Tab displayed on the page. |
| 216 */ |
| 217 public DocumentNewTabPage(Activity activity, Tab tab, TabModelSelector tabMo
delSelector) { |
| 218 mTab = tab; |
| 219 mActivity = activity; |
| 220 mTabModelSelector = tabModelSelector; |
| 221 mProfile = tab.getProfile().getOriginalProfile(); |
| 222 |
| 223 mTitle = activity.getResources().getString(R.string.button_new_tab); |
| 224 mBackgroundColor = activity.getResources().getColor(R.color.ntp_bg); |
| 225 |
| 226 mMostVisitedSites = new MostVisitedSites(mProfile); |
| 227 |
| 228 LayoutInflater inflater = LayoutInflater.from(activity); |
| 229 mNewTabPageView = (NewTabPageView) inflater.inflate(R.layout.new_tab_pag
e, null); |
| 230 mNewTabPageView.initialize(mNewTabPageManager, false, false); |
| 231 } |
| 232 |
| 233 @Override |
| 234 public View getView() { |
| 235 return mNewTabPageView; |
| 236 } |
| 237 |
| 238 @Override |
| 239 public void destroy() { |
| 240 assert getView().getParent() == null : "Destroy called before removed fr
om window"; |
| 241 if (mFaviconHelper != null) { |
| 242 mFaviconHelper.destroy(); |
| 243 mFaviconHelper = null; |
| 244 } |
| 245 if (mLargeIconBridge != null) { |
| 246 mLargeIconBridge.destroy(); |
| 247 mLargeIconBridge = null; |
| 248 } |
| 249 if (mMostVisitedSites != null) { |
| 250 mMostVisitedSites.destroy(); |
| 251 mMostVisitedSites = null; |
| 252 } |
| 253 } |
| 254 |
| 255 @Override |
| 256 public String getTitle() { |
| 257 return mTitle; |
| 258 } |
| 259 |
| 260 @Override |
| 261 public String getUrl() { |
| 262 return UrlConstants.NTP_URL; |
| 263 } |
| 264 |
| 265 @Override |
| 266 public String getHost() { |
| 267 return UrlConstants.NTP_HOST; |
| 268 } |
| 269 |
| 270 @Override |
| 271 public int getBackgroundColor() { |
| 272 return mBackgroundColor; |
| 273 } |
| 274 |
| 275 @Override |
| 276 public void updateForUrl(String url) { |
| 277 } |
| 278 |
| 279 private static class BookmarkDialogSelectedListener implements BookmarkSelec
tedListener { |
| 280 private Dialog mDialog; |
| 281 private final Tab mTab; |
| 282 |
| 283 public BookmarkDialogSelectedListener(Tab tab) { |
| 284 mTab = tab; |
| 285 } |
| 286 |
| 287 @Override |
| 288 public void onNewTabOpened() { |
| 289 if (mDialog != null) mDialog.dismiss(); |
| 290 } |
| 291 |
| 292 @Override |
| 293 public void onBookmarkSelected(String url, String title, Bitmap favicon)
{ |
| 294 if (mDialog != null) mDialog.dismiss(); |
| 295 mTab.loadUrl(new LoadUrlParams(url)); |
| 296 } |
| 297 |
| 298 public void setDialog(Dialog dialog) { |
| 299 mDialog = dialog; |
| 300 } |
| 301 } |
| 302 |
| 303 public static void launchBookmarksDialog(Activity activity, Tab tab, |
| 304 TabModelSelector tabModelSelector) { |
| 305 if (!EnhancedBookmarkUtils.showEnhancedBookmarkIfEnabled(activity)) { |
| 306 BookmarkDialogSelectedListener listener = new BookmarkDialogSelected
Listener(tab); |
| 307 NativePage page = BookmarksPage.buildPageInDocumentMode( |
| 308 activity, tab, tabModelSelector, Profile.getLastUsedProfile(
), |
| 309 listener); |
| 310 page.updateForUrl(UrlConstants.BOOKMARKS_URL); |
| 311 Dialog dialog = new NativePageDialog(activity, page); |
| 312 listener.setDialog(dialog); |
| 313 dialog.show(); |
| 314 } |
| 315 } |
| 316 |
| 317 public static void launchRecentTabsDialog(Activity activity, Tab tab, |
| 318 boolean finishActivityOnOpen) { |
| 319 DocumentRecentTabsManager manager = |
| 320 new DocumentRecentTabsManager(tab, activity, finishActivityOnOpe
n); |
| 321 NativePage page = new RecentTabsPage(activity, manager); |
| 322 page.updateForUrl(UrlConstants.RECENT_TABS_URL); |
| 323 Dialog dialog = new NativePageDialog(activity, page); |
| 324 manager.setDialog(dialog); |
| 325 dialog.show(); |
| 326 } |
| 327 } |
OLD | NEW |