Commit 2c7b080d authored by Theresa's avatar Theresa Committed by Commit Bot

[Feed] Trim stream under memory pressure

Register a MemoryPressureListener and trim the Stream memory when a
memory pressure signal is received.

BUG=860049

Change-Id: I60c7669649c1e085e0de7610fbf45b10ba327c53
Reviewed-on: https://chromium-review.googlesource.com/1178894
Commit-Queue: Theresa <twellington@chromium.org>
Reviewed-by: default avatarBecky Zhou <huayinz@chromium.org>
Cr-Commit-Position: refs/heads/master@{#584115}
parent f4b33f38
...@@ -10,6 +10,8 @@ import com.google.android.libraries.feed.api.stream.ContentChangedListener; ...@@ -10,6 +10,8 @@ import com.google.android.libraries.feed.api.stream.ContentChangedListener;
import com.google.android.libraries.feed.api.stream.ScrollListener; import com.google.android.libraries.feed.api.stream.ScrollListener;
import com.google.android.libraries.feed.api.stream.Stream; import com.google.android.libraries.feed.api.stream.Stream;
import org.chromium.base.MemoryPressureListener;
import org.chromium.base.memory.MemoryPressureCallback;
import org.chromium.chrome.R; import org.chromium.chrome.R;
import org.chromium.chrome.browser.ntp.NewTabPageLayout; import org.chromium.chrome.browser.ntp.NewTabPageLayout;
import org.chromium.chrome.browser.ntp.SnapScrollHelper; import org.chromium.chrome.browser.ntp.SnapScrollHelper;
...@@ -30,6 +32,7 @@ class FeedNewTabPageMediator implements NewTabPageLayout.ScrollDelegate { ...@@ -30,6 +32,7 @@ class FeedNewTabPageMediator implements NewTabPageLayout.ScrollDelegate {
private ScrollListener mStreamScrollListener; private ScrollListener mStreamScrollListener;
private ContentChangedListener mStreamContentChangedListener; private ContentChangedListener mStreamContentChangedListener;
private SectionHeader mSectionHeader; private SectionHeader mSectionHeader;
private MemoryPressureCallback mMemoryPressureCallback;
private boolean mStreamContentChanged; private boolean mStreamContentChanged;
private int mThumbnailWidth; private int mThumbnailWidth;
...@@ -55,6 +58,7 @@ class FeedNewTabPageMediator implements NewTabPageLayout.ScrollDelegate { ...@@ -55,6 +58,7 @@ class FeedNewTabPageMediator implements NewTabPageLayout.ScrollDelegate {
stream.removeScrollListener(mStreamScrollListener); stream.removeScrollListener(mStreamScrollListener);
stream.removeOnContentChangedListener(mStreamContentChangedListener); stream.removeOnContentChangedListener(mStreamContentChangedListener);
mPrefChangeRegistrar.destroy(); mPrefChangeRegistrar.destroy();
MemoryPressureListener.removeCallback(mMemoryPressureCallback);
} }
/** /**
...@@ -92,6 +96,9 @@ class FeedNewTabPageMediator implements NewTabPageLayout.ScrollDelegate { ...@@ -92,6 +96,9 @@ class FeedNewTabPageMediator implements NewTabPageLayout.ScrollDelegate {
this::onSectionHeaderToggled); this::onSectionHeaderToggled);
mCoordinator.getSectionHeaderView().setHeader(mSectionHeader); mCoordinator.getSectionHeaderView().setHeader(mSectionHeader);
stream.setStreamContentVisibility(mSectionHeader.isExpanded()); stream.setStreamContentVisibility(mSectionHeader.isExpanded());
mMemoryPressureCallback = pressure -> mCoordinator.getStream().trim();
MemoryPressureListener.addCallback(mMemoryPressureCallback);
} }
/** Update whether the section header should be expanded. */ /** Update whether the section header should be expanded. */
......
...@@ -11,6 +11,7 @@ import static android.support.test.espresso.matcher.ViewMatchers.withId; ...@@ -11,6 +11,7 @@ import static android.support.test.espresso.matcher.ViewMatchers.withId;
import android.app.Activity; import android.app.Activity;
import android.app.Instrumentation; import android.app.Instrumentation;
import android.app.Instrumentation.ActivityMonitor; import android.app.Instrumentation.ActivityMonitor;
import android.content.ComponentCallbacks2;
import android.graphics.Canvas; import android.graphics.Canvas;
import android.support.test.InstrumentationRegistry; import android.support.test.InstrumentationRegistry;
import android.support.test.filters.LargeTest; import android.support.test.filters.LargeTest;
...@@ -28,7 +29,9 @@ import org.junit.Rule; ...@@ -28,7 +29,9 @@ import org.junit.Rule;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.chromium.base.MemoryPressureListener;
import org.chromium.base.ThreadUtils; import org.chromium.base.ThreadUtils;
import org.chromium.base.memory.MemoryPressureCallback;
import org.chromium.base.test.params.ParameterAnnotations; import org.chromium.base.test.params.ParameterAnnotations;
import org.chromium.base.test.params.ParameterProvider; import org.chromium.base.test.params.ParameterProvider;
import org.chromium.base.test.params.ParameterSet; import org.chromium.base.test.params.ParameterSet;
...@@ -737,6 +740,27 @@ public class NewTabPageTest { ...@@ -737,6 +740,27 @@ public class NewTabPageTest {
mRenderTestRule.render(view, "expandable_header_collapsed"); mRenderTestRule.render(view, "expandable_header_collapsed");
} }
@Test
@SmallTest
@Feature({"NewTabPage", "FeedNewTabPage"})
@ParameterAnnotations.UseMethodParameter(InterestFeedParams.class)
public void testMemoryPressure(boolean interestFeedEnabled) throws Exception {
// TODO(twellington): This test currently just checks that sending a memory pressure
// signal doesn't crash. Enhance the test to also check whether certain behaviors are
// performed.
CallbackHelper callback = new CallbackHelper();
MemoryPressureCallback pressureCallback = pressure -> callback.notifyCalled();
ThreadUtils.runOnUiThreadBlocking(() -> {
MemoryPressureListener.addCallback(pressureCallback);
mActivityTestRule.getActivity().getApplication().onTrimMemory(
ComponentCallbacks2.TRIM_MEMORY_MODERATE);
});
callback.waitForCallback(0);
ThreadUtils.runOnUiThreadBlocking(
() -> MemoryPressureListener.removeCallback(pressureCallback));
}
private void assertThumbnailInvalidAndRecapture() { private void assertThumbnailInvalidAndRecapture() {
Assert.assertTrue(mNtp.shouldCaptureThumbnail()); Assert.assertTrue(mNtp.shouldCaptureThumbnail());
captureThumbnail(); captureThumbnail();
......
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