Commit 21c870a1 authored by Bernhard Bauer's avatar Bernhard Bauer Committed by Commit Bot

Re-reland "Split ThumbnailProviderImpl cache into a LRU and a deduplication cache."

This is a reland of 6d4871d1
Original change's description:
> Reland "Split ThumbnailProviderImpl cache into a LRU and a deduplication cache."
> 
> This is a reland of a4f8bff1
> Original change's description:
> > Split ThumbnailProviderImpl cache into a LRU and a deduplication cache.
> > 
> > Bug: 718925
> > Change-Id: I8bfe2d4b743c8fdb014b2112683aba1f74835753
> > Reviewed-on: https://chromium-review.googlesource.com/582958
> > Reviewed-by: Theresa <twellington@chromium.org>
> > Reviewed-by: Michael van Ouwerkerk <mvanouwerkerk@chromium.org>
> > Commit-Queue: Bernhard Bauer <bauerb@chromium.org>
> > Cr-Commit-Position: refs/heads/master@{#500574}
> 
> TBR: twellington@chromium.org
> Bug: 718925
> Change-Id: I68b0184d30c4bc4e712e3ceb1522879b15f5e1d7
> Reviewed-on: https://chromium-review.googlesource.com/659879
> Commit-Queue: Bernhard Bauer <bauerb@chromium.org>
> Reviewed-by: Michael van Ouwerkerk <mvanouwerkerk@chromium.org>
> Cr-Commit-Position: refs/heads/master@{#500948}

Bug: 718925
Change-Id: I5101af7da3a470499901e57fab08d1ec580eec04
Reviewed-on: https://chromium-review.googlesource.com/663017Reviewed-by: default avatarMichael van Ouwerkerk <mvanouwerkerk@chromium.org>
Reviewed-by: default avatarTheresa <twellington@chromium.org>
Commit-Queue: Bernhard Bauer <bauerb@chromium.org>
Cr-Commit-Position: refs/heads/master@{#501326}
parent 81fe9724
......@@ -77,8 +77,7 @@ import org.chromium.chrome.browser.dom_distiller.DistilledPagePrefsView;
import org.chromium.chrome.browser.dom_distiller.ReaderModeManager;
import org.chromium.chrome.browser.download.DownloadManagerService;
import org.chromium.chrome.browser.download.DownloadUtils;
import org.chromium.chrome.browser.download.items
.OfflineContentAggregatorNotificationBridgeUiFactory;
import org.chromium.chrome.browser.download.items.OfflineContentAggregatorNotificationBridgeUiFactory;
import org.chromium.chrome.browser.firstrun.ForcedSigninProcessor;
import org.chromium.chrome.browser.fullscreen.ChromeFullscreenManager;
import org.chromium.chrome.browser.gsa.ContextReporter;
......@@ -2242,7 +2241,10 @@ public abstract class ChromeActivity extends AsyncInitializationActivity
/**
* @return the reference pool for this activity.
* @deprecated Use {@link ChromeApplication#getReferencePool} instead.
*/
// TODO(bauerb): Migrate clients to ChromeApplication#getReferencePool.
@Deprecated
public DiscardableReferencePool getReferencePool() {
return mReferencePool;
}
......
......@@ -11,6 +11,7 @@ import org.chromium.base.ActivityState;
import org.chromium.base.ApplicationStatus;
import org.chromium.base.CommandLineInitUtil;
import org.chromium.base.ContextUtils;
import org.chromium.base.DiscardableReferencePool;
import org.chromium.base.ThreadUtils;
import org.chromium.base.TraceEvent;
import org.chromium.base.annotations.MainDex;
......@@ -34,11 +35,9 @@ import org.chromium.content.app.ContentApplication;
public class ChromeApplication extends ContentApplication {
public static final String COMMAND_LINE_FILE = "chrome-command-line";
private static final String TAG = "ChromiumApplication";
private static final String PREF_BOOT_TIMESTAMP =
"com.google.android.apps.chrome.ChromeMobileApplication.BOOT_TIMESTAMP";
private static final long BOOT_TIMESTAMP_MARGIN_MS = 1000;
private static DocumentTabModelSelector sDocumentTabModelSelector;
private DiscardableReferencePool mReferencePool;
@Override
protected void attachBaseContext(Context base) {
......@@ -63,6 +62,17 @@ public class ChromeApplication extends ContentApplication {
TraceEvent.end("ChromeApplication.onCreate");
}
@Override
public void onTrimMemory(int level) {
super.onTrimMemory(level);
// The conditions are expressed using ranges to capture intermediate levels possibly added
// to the API in the future.
if ((level >= TRIM_MEMORY_RUNNING_LOW && level < TRIM_MEMORY_UI_HIDDEN)
|| level >= TRIM_MEMORY_MODERATE) {
if (mReferencePool != null) mReferencePool.drain();
}
}
/**
* Shows an error dialog following a startup error, and then exits the application.
* @param e The exception reported by Chrome initialization.
......@@ -97,4 +107,15 @@ public class ChromeApplication extends ContentApplication {
}
return sDocumentTabModelSelector;
}
/**
* @return The DiscardableReferencePool for the application.
*/
public DiscardableReferencePool getReferencePool() {
ThreadUtils.assertOnUiThread();
if (mReferencePool == null) {
mReferencePool = new DiscardableReferencePool();
}
return mReferencePool;
}
}
......@@ -16,6 +16,7 @@ import android.view.LayoutInflater;
import android.view.MenuItem;
import android.view.ViewGroup;
import org.chromium.base.DiscardableReferencePool;
import org.chromium.base.FileUtils;
import org.chromium.base.ObserverList;
import org.chromium.base.VisibleForTesting;
......@@ -23,6 +24,7 @@ import org.chromium.base.metrics.RecordHistogram;
import org.chromium.base.metrics.RecordUserAction;
import org.chromium.chrome.R;
import org.chromium.chrome.browser.BasicNativePage;
import org.chromium.chrome.browser.ChromeApplication;
import org.chromium.chrome.browser.download.DownloadManagerService;
import org.chromium.chrome.browser.download.DownloadUtils;
import org.chromium.chrome.browser.offlinepages.downloads.OfflinePageDownloadBridge;
......@@ -70,10 +72,10 @@ public class DownloadManagerUi implements OnMenuItemClickListener, SearchDelegat
private SelectionDelegate<DownloadHistoryItemWrapper> mSelectionDelegate;
private ThumbnailProvider mThumbnailProvider;
DownloadBackendProvider() {
DownloadBackendProvider(DiscardableReferencePool referencePool) {
mOfflinePageBridge = new OfflinePageDownloadBridge(Profile.getLastUsedProfile());
mSelectionDelegate = new DownloadItemSelectionDelegate();
mThumbnailProvider = new ThumbnailProviderImpl();
mThumbnailProvider = new ThumbnailProviderImpl(referencePool);
}
@Override
......@@ -182,8 +184,10 @@ public class DownloadManagerUi implements OnMenuItemClickListener, SearchDelegat
ComponentName parentComponent, boolean isSeparateActivity,
SnackbarManager snackbarManager) {
mActivity = activity;
mBackendProvider =
sProviderForTests == null ? new DownloadBackendProvider() : sProviderForTests;
ChromeApplication application = (ChromeApplication) activity.getApplication();
mBackendProvider = sProviderForTests == null
? new DownloadBackendProvider(application.getReferencePool())
: sProviderForTests;
mSnackbarManager = snackbarManager;
mMainView = (ViewGroup) LayoutInflater.from(activity).inflate(R.layout.download_main, null);
......
......@@ -9,6 +9,7 @@ import android.graphics.Bitmap;
import android.os.SystemClock;
import org.chromium.base.Callback;
import org.chromium.base.DiscardableReferencePool;
import org.chromium.base.Promise;
import org.chromium.base.VisibleForTesting;
import org.chromium.chrome.browser.NativePageHost;
......@@ -60,13 +61,16 @@ public class ImageFetcher {
private final SuggestionsSource mSuggestionsSource;
private final Profile mProfile;
private final DiscardableReferencePool mReferencePool;
private ThumbnailProvider mThumbnailProvider;
private FaviconHelper mFaviconHelper;
private LargeIconBridge mLargeIconBridge;
public ImageFetcher(SuggestionsSource suggestionsSource, Profile profile, NativePageHost host) {
public ImageFetcher(SuggestionsSource suggestionsSource, Profile profile,
DiscardableReferencePool referencePool, NativePageHost host) {
mSuggestionsSource = suggestionsSource;
mProfile = profile;
mReferencePool = referencePool;
mUseFaviconService = CardsVariationParameters.isFaviconServiceEnabled();
mHost = host;
}
......@@ -298,8 +302,8 @@ public class ImageFetcher {
*/
private ThumbnailProvider getThumbnailProvider() {
if (mThumbnailProvider == null) {
mThumbnailProvider =
SuggestionsDependencyFactory.getInstance().createThumbnailProvider();
mThumbnailProvider = SuggestionsDependencyFactory.getInstance().createThumbnailProvider(
mReferencePool);
}
return mThumbnailProvider;
}
......
......@@ -4,6 +4,7 @@
package org.chromium.chrome.browser.suggestions;
import org.chromium.base.DiscardableReferencePool;
import org.chromium.base.ThreadUtils;
import org.chromium.base.VisibleForTesting;
import org.chromium.chrome.browser.download.ui.ThumbnailProvider;
......@@ -53,8 +54,8 @@ public class SuggestionsDependencyFactory {
return new LargeIconBridge(profile);
}
public ThumbnailProvider createThumbnailProvider() {
return new ThumbnailProviderImpl();
public ThumbnailProvider createThumbnailProvider(DiscardableReferencePool referencePool) {
return new ThumbnailProviderImpl(referencePool);
}
public FaviconHelper createFaviconHelper() {
......
......@@ -38,7 +38,7 @@ public class SuggestionsUiDelegateImpl implements SuggestionsUiDelegate {
mSuggestionsRanker = new SuggestionsRanker();
mSuggestionsEventReporter = eventReporter;
mSuggestionsNavigationDelegate = navigationDelegate;
mImageFetcher = new ImageFetcher(suggestionsSource, profile, host);
mImageFetcher = new ImageFetcher(suggestionsSource, profile, referencePool, host);
mHost = host;
mReferencePool = referencePool;
......
......@@ -7,14 +7,14 @@ package org.chromium.chrome.browser.download.ui;
import android.graphics.Bitmap;
import android.support.test.filters.MediumTest;
import junit.framework.Assert;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.chromium.base.DiscardableReferencePool;
import org.chromium.base.ThreadUtils;
import org.chromium.base.test.util.CallbackHelper;
import org.chromium.base.test.util.CommandLineFlags;
......@@ -40,17 +40,20 @@ public class ThumbnailProviderImplTest {
public ChromeTabbedActivityTestRule mActivityTestRule = new ChromeTabbedActivityTestRule();
private ThumbnailProviderImpl mThumbnailProvider;
private DiscardableReferencePool mReferencePool;
@Before
public void setUp() throws Exception {
mActivityTestRule.startMainActivityOnBlankPage();
mThumbnailProvider = new ThumbnailProviderImpl();
clearThumbnailCache();
ThreadUtils.runOnUiThread(() -> {
mReferencePool = new DiscardableReferencePool();
mThumbnailProvider = new ThumbnailProviderImpl(mReferencePool);
});
}
@After
public void tearDown() {
clearThumbnailCache();
ThreadUtils.runOnUiThread(mThumbnailProvider::destroy);
}
@Test
......@@ -65,10 +68,8 @@ public class ThumbnailProviderImplTest {
final TestThumbnailRequest request = new TestThumbnailRequest(
testFilePath, requiredSize, thumbnailRetrievedCallbackHelper);
ThreadUtils.runOnUiThread(new Runnable() {
public void run() {
ThreadUtils.runOnUiThread(() -> {
mThumbnailProvider.getThumbnail(request);
}
});
thumbnailRetrievedCallbackHelper.waitForCallback(
......@@ -89,10 +90,8 @@ public class ThumbnailProviderImplTest {
final TestThumbnailRequest request = new TestThumbnailRequest(
testFilePath, requiredSize, thumbnailRetrievedCallbackHelper);
ThreadUtils.runOnUiThread(new Runnable() {
public void run() {
ThreadUtils.runOnUiThread(() -> {
mThumbnailProvider.getThumbnail(request);
}
});
thumbnailRetrievedCallbackHelper.waitForCallback(
......@@ -113,10 +112,8 @@ public class ThumbnailProviderImplTest {
final TestThumbnailRequest request = new TestThumbnailRequest(
testFilePath, requiredSize, thumbnailRetrievedCallbackHelper);
ThreadUtils.runOnUiThread(new Runnable() {
public void run() {
ThreadUtils.runOnUiThread(() -> {
mThumbnailProvider.getThumbnail(request);
}
});
thumbnailRetrievedCallbackHelper.waitForCallback(
......@@ -137,10 +134,8 @@ public class ThumbnailProviderImplTest {
final TestThumbnailRequest request = new TestThumbnailRequest(
testFilePath, requiredSize, thumbnailRetrievedCallbackHelper);
ThreadUtils.runOnUiThread(new Runnable() {
public void run() {
ThreadUtils.runOnUiThread(() -> {
mThumbnailProvider.getThumbnail(request);
}
});
thumbnailRetrievedCallbackHelper.waitForCallback(
......@@ -161,10 +156,8 @@ public class ThumbnailProviderImplTest {
final TestThumbnailRequest request = new TestThumbnailRequest(
testFilePath, requiredSize, thumbnailRetrievedCallbackHelper);
ThreadUtils.runOnUiThread(new Runnable() {
public void run() {
ThreadUtils.runOnUiThread(() -> {
mThumbnailProvider.getThumbnail(request);
}
});
thumbnailRetrievedCallbackHelper.waitForCallback(
......@@ -179,15 +172,6 @@ public class ThumbnailProviderImplTest {
Assert.assertEquals(expectedHeight, request.getRetrievedThumbnail().getHeight());
}
private void clearThumbnailCache() {
ThreadUtils.runOnUiThread(new Runnable() {
@Override
public void run() {
ThumbnailProviderImpl.clearCache();
}
});
}
private static class TestThumbnailRequest implements ThumbnailRequest {
private final String mTestFilePath;
private final int mRequiredSize;
......
......@@ -415,7 +415,8 @@ public class ArticleSnippetsTest {
new DummySuggestionsEventReporter();
private final SuggestionsRanker mSuggestionsRanker = new SuggestionsRanker();
private final DiscardableReferencePool mReferencePool = new DiscardableReferencePool();
private final ImageFetcher mImageFetcher = new MockImageFetcher(mSnippetsSource);
private final ImageFetcher mImageFetcher =
new MockImageFetcher(mSnippetsSource, mReferencePool);
@Override
public SuggestionsSource getSuggestionsSource() {
......@@ -457,8 +458,9 @@ public class ArticleSnippetsTest {
}
private class MockImageFetcher extends ImageFetcher {
public MockImageFetcher(SuggestionsSource suggestionsSource) {
super(suggestionsSource, null, null);
public MockImageFetcher(
SuggestionsSource suggestionsSource, DiscardableReferencePool referencePool) {
super(suggestionsSource, null, referencePool, null);
}
@Override
......
......@@ -21,6 +21,7 @@ import org.mockito.MockitoAnnotations;
import org.robolectric.annotation.Config;
import org.chromium.base.Callback;
import org.chromium.base.DiscardableReferencePool;
import org.chromium.chrome.browser.DisableHistogramsRule;
import org.chromium.chrome.browser.NativePageHost;
import org.chromium.chrome.browser.download.ui.ThumbnailProvider;
......@@ -53,8 +54,10 @@ public class ImageFetcherTest {
@Rule
public SuggestionsDependenciesRule mSuggestionsDeps = new SuggestionsDependenciesRule();
private DiscardableReferencePool mReferencePool = new DiscardableReferencePool();
@Mock
FaviconHelper mFaviconHelper;
private FaviconHelper mFaviconHelper;
@Mock
private ThumbnailProvider mThumbnailProvider;
@Mock
......@@ -75,8 +78,8 @@ public class ImageFetcherTest {
@Test
public void testFaviconFetch() {
ImageFetcher imageFetcher = new ImageFetcher(
mSuggestionsSource, mock(Profile.class), mock(NativePageHost.class));
ImageFetcher imageFetcher = new ImageFetcher(mSuggestionsSource, mock(Profile.class),
mReferencePool, mock(NativePageHost.class));
SnippetArticle suggestion = createDummySuggestion(KnownCategories.BOOKMARKS);
imageFetcher.makeFaviconRequest(suggestion, IMAGE_SIZE_PX, mock(Callback.class));
......@@ -90,8 +93,8 @@ public class ImageFetcherTest {
@Test
public void testDownloadThumbnailFetch() {
ImageFetcher imageFetcher = new ImageFetcher(
mSuggestionsSource, mock(Profile.class), mock(NativePageHost.class));
ImageFetcher imageFetcher = new ImageFetcher(mSuggestionsSource, mock(Profile.class),
mReferencePool, mock(NativePageHost.class));
SnippetArticle suggestion = createDummySuggestion(KnownCategories.DOWNLOADS);
......@@ -105,8 +108,8 @@ public class ImageFetcherTest {
@Test
public void testArticleThumbnailFetch() {
ImageFetcher imageFetcher = new ImageFetcher(
mSuggestionsSource, mock(Profile.class), mock(NativePageHost.class));
ImageFetcher imageFetcher = new ImageFetcher(mSuggestionsSource, mock(Profile.class),
mReferencePool, mock(NativePageHost.class));
SnippetArticle suggestion = createDummySuggestion(KnownCategories.ARTICLES);
imageFetcher.makeArticleThumbnailRequest(suggestion, mock(Callback.class));
......@@ -116,8 +119,8 @@ public class ImageFetcherTest {
@Test
public void testLargeIconFetch() {
ImageFetcher imageFetcher = new ImageFetcher(
mSuggestionsSource, mock(Profile.class), mock(NativePageHost.class));
ImageFetcher imageFetcher = new ImageFetcher(mSuggestionsSource, mock(Profile.class),
mReferencePool, mock(NativePageHost.class));
imageFetcher.makeLargeIconRequest(URL_STRING, IMAGE_SIZE_PX, mock(LargeIconCallback.class));
......
......@@ -483,7 +483,7 @@ public class TileGroupUnitTest {
private final List<LargeIconCallback> mCallbackList = new ArrayList<>();
public FakeImageFetcher() {
super(null, null, null);
super(null, null, null, null);
}
@Override
......
......@@ -7,6 +7,7 @@ package org.chromium.chrome.test.util.browser.suggestions;
import org.junit.rules.TestWatcher;
import org.junit.runner.Description;
import org.chromium.base.DiscardableReferencePool;
import org.chromium.base.annotations.SuppressFBWarnings;
import org.chromium.chrome.browser.download.ui.ThumbnailProvider;
import org.chromium.chrome.browser.favicon.FaviconHelper;
......@@ -89,9 +90,9 @@ public class SuggestionsDependenciesRule extends TestWatcher {
}
@Override
public ThumbnailProvider createThumbnailProvider() {
public ThumbnailProvider createThumbnailProvider(DiscardableReferencePool referencePool) {
if (thumbnailProvider != null) return thumbnailProvider;
return super.createThumbnailProvider();
return super.createThumbnailProvider(referencePool);
}
@Override
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment