| OLD | NEW |
| 1 // Copyright 2017 The Chromium Authors. All rights reserved. | 1 // Copyright 2017 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 package org.chromium.chrome.browser.suggestions; | 5 package org.chromium.chrome.browser.suggestions; |
| 6 | 6 |
| 7 import android.content.Context; | 7 import android.content.Context; |
| 8 import android.content.res.Resources; | 8 import android.content.res.Resources; |
| 9 import android.graphics.Bitmap; | 9 import android.graphics.Bitmap; |
| 10 import android.graphics.BitmapFactory; | 10 import android.graphics.BitmapFactory; |
| 11 import android.graphics.Color; | 11 import android.graphics.Color; |
| 12 import android.graphics.drawable.BitmapDrawable; | 12 import android.graphics.drawable.BitmapDrawable; |
| 13 import android.support.annotation.Nullable; | 13 import android.support.annotation.Nullable; |
| 14 import android.support.v4.graphics.drawable.RoundedBitmapDrawable; | 14 import android.support.v4.graphics.drawable.RoundedBitmapDrawable; |
| 15 import android.support.v4.graphics.drawable.RoundedBitmapDrawableFactory; | 15 import android.support.v4.graphics.drawable.RoundedBitmapDrawableFactory; |
| 16 import android.view.ContextMenu; | 16 import android.view.ContextMenu; |
| 17 import android.view.ContextMenu.ContextMenuInfo; | 17 import android.view.ContextMenu.ContextMenuInfo; |
| 18 import android.view.LayoutInflater; | 18 import android.view.LayoutInflater; |
| 19 import android.view.View; | 19 import android.view.View; |
| 20 import android.view.View.OnClickListener; | 20 import android.view.View.OnClickListener; |
| 21 import android.view.View.OnCreateContextMenuListener; | 21 import android.view.View.OnCreateContextMenuListener; |
| 22 import android.view.ViewGroup; | 22 import android.view.ViewGroup; |
| 23 | 23 |
| 24 import org.chromium.base.ApiCompatibilityUtils; | 24 import org.chromium.base.ApiCompatibilityUtils; |
| 25 import org.chromium.base.Callback; | 25 import org.chromium.base.Callback; |
| 26 import org.chromium.base.Log; | 26 import org.chromium.base.Log; |
| 27 import org.chromium.base.VisibleForTesting; | 27 import org.chromium.base.VisibleForTesting; |
| 28 import org.chromium.base.metrics.RecordUserAction; | |
| 29 import org.chromium.chrome.R; | 28 import org.chromium.chrome.R; |
| 30 import org.chromium.chrome.browser.ChromeFeatureList; | 29 import org.chromium.chrome.browser.ChromeFeatureList; |
| 31 import org.chromium.chrome.browser.favicon.LargeIconBridge.LargeIconCallback; | 30 import org.chromium.chrome.browser.favicon.LargeIconBridge.LargeIconCallback; |
| 32 import org.chromium.chrome.browser.ntp.ContextMenuManager; | 31 import org.chromium.chrome.browser.ntp.ContextMenuManager; |
| 33 import org.chromium.chrome.browser.ntp.ContextMenuManager.ContextMenuItemId; | 32 import org.chromium.chrome.browser.ntp.ContextMenuManager.ContextMenuItemId; |
| 34 import org.chromium.chrome.browser.offlinepages.OfflinePageBridge; | 33 import org.chromium.chrome.browser.offlinepages.OfflinePageBridge; |
| 35 import org.chromium.chrome.browser.widget.RoundedIconGenerator; | 34 import org.chromium.chrome.browser.widget.RoundedIconGenerator; |
| 36 import org.chromium.ui.mojom.WindowOpenDisposition; | 35 import org.chromium.ui.mojom.WindowOpenDisposition; |
| 37 | 36 |
| 38 import java.util.ArrayList; | 37 import java.util.ArrayList; |
| (...skipping 395 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 434 | 433 |
| 435 public TileInteractionDelegate(String url) { | 434 public TileInteractionDelegate(String url) { |
| 436 mUrl = url; | 435 mUrl = url; |
| 437 } | 436 } |
| 438 | 437 |
| 439 @Override | 438 @Override |
| 440 public void onClick(View view) { | 439 public void onClick(View view) { |
| 441 Tile tile = getTile(mUrl); | 440 Tile tile = getTile(mUrl); |
| 442 if (tile == null) return; | 441 if (tile == null) return; |
| 443 | 442 |
| 443 SuggestionsMetrics.recordTileTapped(); |
| 444 mTileGroupDelegate.openMostVisitedItem(WindowOpenDisposition.CURRENT
_TAB, tile); | 444 mTileGroupDelegate.openMostVisitedItem(WindowOpenDisposition.CURRENT
_TAB, tile); |
| 445 } | 445 } |
| 446 | 446 |
| 447 @Override | 447 @Override |
| 448 public void openItem(int windowDisposition) { | 448 public void openItem(int windowDisposition) { |
| 449 Tile tile = getTile(mUrl); | 449 Tile tile = getTile(mUrl); |
| 450 if (tile == null) return; | 450 if (tile == null) return; |
| 451 | 451 |
| 452 mTileGroupDelegate.openMostVisitedItem(windowDisposition, tile); | 452 mTileGroupDelegate.openMostVisitedItem(windowDisposition, tile); |
| 453 } | 453 } |
| (...skipping 26 matching lines...) Expand all Loading... |
| 480 public void onCreateContextMenu( | 480 public void onCreateContextMenu( |
| 481 ContextMenu contextMenu, View view, ContextMenuInfo contextMenuI
nfo) { | 481 ContextMenu contextMenu, View view, ContextMenuInfo contextMenuI
nfo) { |
| 482 mContextMenuManager.createContextMenu(contextMenu, view, this); | 482 mContextMenuManager.createContextMenu(contextMenu, view, this); |
| 483 } | 483 } |
| 484 } | 484 } |
| 485 | 485 |
| 486 private class RemovalUndoneCallback extends Callback<String> { | 486 private class RemovalUndoneCallback extends Callback<String> { |
| 487 @Override | 487 @Override |
| 488 public void onResult(String restoredUrl) { | 488 public void onResult(String restoredUrl) { |
| 489 mPendingInsertionUrl = restoredUrl; | 489 mPendingInsertionUrl = restoredUrl; |
| 490 | |
| 491 RecordUserAction.record("Suggestions.Tile.RemovalUndone"); | |
| 492 } | 490 } |
| 493 } | 491 } |
| 494 | 492 |
| 495 private class OfflineModelObserver extends SuggestionsOfflineModelObserver<T
ile> { | 493 private class OfflineModelObserver extends SuggestionsOfflineModelObserver<T
ile> { |
| 496 public OfflineModelObserver(OfflinePageBridge bridge) { | 494 public OfflineModelObserver(OfflinePageBridge bridge) { |
| 497 super(bridge); | 495 super(bridge); |
| 498 } | 496 } |
| 499 | 497 |
| 500 @Override | 498 @Override |
| 501 public void onSuggestionOfflineIdChanged(Tile suggestion, @Nullable Long
id) { | 499 public void onSuggestionOfflineIdChanged(Tile suggestion, @Nullable Long
id) { |
| 502 // Retrieve a tile from the internal data, to make sure we don't upd
ate a stale object. | 500 // Retrieve a tile from the internal data, to make sure we don't upd
ate a stale object. |
| 503 Tile tile = getTile(suggestion.getUrl()); | 501 Tile tile = getTile(suggestion.getUrl()); |
| 504 if (tile == null) return; | 502 if (tile == null) return; |
| 505 | 503 |
| 506 boolean oldOfflineAvailable = tile.isOfflineAvailable(); | 504 boolean oldOfflineAvailable = tile.isOfflineAvailable(); |
| 507 tile.setOfflinePageOfflineId(id); | 505 tile.setOfflinePageOfflineId(id); |
| 508 | 506 |
| 509 // Only notify to update the view if there will be a visible change. | 507 // Only notify to update the view if there will be a visible change. |
| 510 if (oldOfflineAvailable == tile.isOfflineAvailable()) return; | 508 if (oldOfflineAvailable == tile.isOfflineAvailable()) return; |
| 511 mObserver.onTileOfflineBadgeVisibilityChanged(tile); | 509 mObserver.onTileOfflineBadgeVisibilityChanged(tile); |
| 512 } | 510 } |
| 513 | 511 |
| 514 @Override | 512 @Override |
| 515 public Iterable<Tile> getOfflinableSuggestions() { | 513 public Iterable<Tile> getOfflinableSuggestions() { |
| 516 return Arrays.asList(mTiles); | 514 return Arrays.asList(mTiles); |
| 517 } | 515 } |
| 518 } | 516 } |
| 519 } | 517 } |
| OLD | NEW |