Commit 138de6d5 authored by Peter Kotwicz's avatar Peter Kotwicz Committed by Commit Bot

[Android WebAPK] Daggerize WebApkUpdateManager

This CL:
- Adds @Inject constructor to WebApkUpdateManager
- Makes WebApkUpdateManager listen for activity destruction instead of having
WebApkActivity call WebApkUpdateManager#destroy()

BUG=1042147

Change-Id: I803900ffe2eaf7c8999dc54248676c93caf5b0bb
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2001360
Commit-Queue: Peter Kotwicz <pkotwicz@chromium.org>
Reviewed-by: default avatarYaron Friedman <yfriedman@chromium.org>
Reviewed-by: default avatarGlenn Hartmann <hartmanng@chromium.org>
Cr-Commit-Position: refs/heads/master@{#732667}
parent c2b99265
...@@ -24,9 +24,6 @@ import org.chromium.webapk.lib.common.WebApkConstants; ...@@ -24,9 +24,6 @@ import org.chromium.webapk.lib.common.WebApkConstants;
* UI-less Chrome. * UI-less Chrome.
*/ */
public class WebApkActivity extends WebappActivity { public class WebApkActivity extends WebappActivity {
/** Manages whether to check update for the WebAPK, and starts update check if needed. */
private WebApkUpdateManager mUpdateManager;
/** The start time that the activity becomes focused in milliseconds since boot. */ /** The start time that the activity becomes focused in milliseconds since boot. */
private long mStartTime; private long mStartTime;
...@@ -90,8 +87,7 @@ public class WebApkActivity extends WebappActivity { ...@@ -90,8 +87,7 @@ public class WebApkActivity extends WebappActivity {
WebApkUma.recordShellApkVersion(info.shellApkVersion(), info.distributor()); WebApkUma.recordShellApkVersion(info.shellApkVersion(), info.distributor());
storage.incrementLaunchCount(); storage.incrementLaunchCount();
mUpdateManager = new WebApkUpdateManager(storage); getComponent().resolveWebApkUpdateManager().updateIfNeeded(storage, info);
mUpdateManager.updateIfNeeded(getActivityTab(), info);
} }
@Override @Override
...@@ -129,10 +125,6 @@ public class WebApkActivity extends WebappActivity { ...@@ -129,10 +125,6 @@ public class WebApkActivity extends WebappActivity {
@Override @Override
protected void onDestroyInternal() { protected void onDestroyInternal() {
if (mUpdateManager != null) {
mUpdateManager.destroy();
}
// The common case is to be connected to just one WebAPK's services. For the sake of // The common case is to be connected to just one WebAPK's services. For the sake of
// simplicity disconnect from the services of all WebAPKs. // simplicity disconnect from the services of all WebAPKs.
ChromeWebApkHost.disconnectFromAllServices(true /* waitForPendingWork */); ChromeWebApkHost.disconnectFromAllServices(true /* waitForPendingWork */);
......
...@@ -17,8 +17,12 @@ import org.chromium.base.ContextUtils; ...@@ -17,8 +17,12 @@ import org.chromium.base.ContextUtils;
import org.chromium.base.Log; import org.chromium.base.Log;
import org.chromium.base.annotations.CalledByNative; import org.chromium.base.annotations.CalledByNative;
import org.chromium.base.annotations.NativeMethods; import org.chromium.base.annotations.NativeMethods;
import org.chromium.chrome.browser.ChromeActivity;
import org.chromium.chrome.browser.ChromeSwitches; import org.chromium.chrome.browser.ChromeSwitches;
import org.chromium.chrome.browser.ShortcutHelper; import org.chromium.chrome.browser.ShortcutHelper;
import org.chromium.chrome.browser.dependency_injection.ActivityScope;
import org.chromium.chrome.browser.lifecycle.ActivityLifecycleDispatcher;
import org.chromium.chrome.browser.lifecycle.Destroyable;
import org.chromium.chrome.browser.metrics.WebApkUma; import org.chromium.chrome.browser.metrics.WebApkUma;
import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.browser.tab.Tab;
import org.chromium.chrome.browser.util.UrlUtilities; import org.chromium.chrome.browser.util.UrlUtilities;
...@@ -29,16 +33,21 @@ import org.chromium.webapk.lib.client.WebApkVersion; ...@@ -29,16 +33,21 @@ import org.chromium.webapk.lib.client.WebApkVersion;
import java.util.Map; import java.util.Map;
import javax.inject.Inject;
/** /**
* WebApkUpdateManager manages when to check for updates to the WebAPK's Web Manifest, and sends * WebApkUpdateManager manages when to check for updates to the WebAPK's Web Manifest, and sends
* an update request to the WebAPK Server when an update is needed. * an update request to the WebAPK Server when an update is needed.
*/ */
public class WebApkUpdateManager implements WebApkUpdateDataFetcher.Observer { @ActivityScope
public class WebApkUpdateManager implements WebApkUpdateDataFetcher.Observer, Destroyable {
private static final String TAG = "WebApkUpdateManager"; private static final String TAG = "WebApkUpdateManager";
// Maximum wait time for WebAPK update to be scheduled. // Maximum wait time for WebAPK update to be scheduled.
private static final long UPDATE_TIMEOUT_MILLISECONDS = DateUtils.SECOND_IN_MILLIS * 30; private static final long UPDATE_TIMEOUT_MILLISECONDS = DateUtils.SECOND_IN_MILLIS * 30;
private final ChromeActivity mActivity;
/** Whether updates are enabled. Some tests disable updates. */ /** Whether updates are enabled. Some tests disable updates. */
private static boolean sUpdatesEnabled = true; private static boolean sUpdatesEnabled = true;
...@@ -46,7 +55,7 @@ public class WebApkUpdateManager implements WebApkUpdateDataFetcher.Observer { ...@@ -46,7 +55,7 @@ public class WebApkUpdateManager implements WebApkUpdateDataFetcher.Observer {
private WebApkInfo mInfo; private WebApkInfo mInfo;
/** The WebappDataStorage with cached data about prior update requests. */ /** The WebappDataStorage with cached data about prior update requests. */
private final WebappDataStorage mStorage; private WebappDataStorage mStorage;
private WebApkUpdateDataFetcher mFetcher; private WebApkUpdateDataFetcher mFetcher;
...@@ -59,20 +68,24 @@ public class WebApkUpdateManager implements WebApkUpdateDataFetcher.Observer { ...@@ -59,20 +68,24 @@ public class WebApkUpdateManager implements WebApkUpdateDataFetcher.Observer {
public void onResultFromNative(@WebApkInstallResult int result, boolean relaxUpdates); public void onResultFromNative(@WebApkInstallResult int result, boolean relaxUpdates);
} }
public WebApkUpdateManager(WebappDataStorage storage) { @Inject
mStorage = storage; public WebApkUpdateManager(
ChromeActivity activity, ActivityLifecycleDispatcher lifecycleDispatcher) {
mActivity = activity;
lifecycleDispatcher.register(this);
} }
/** /**
* Checks whether the WebAPK's Web Manifest has changed. Requests an updated WebAPK if the Web * Checks whether the WebAPK's Web Manifest has changed. Requests an updated WebAPK if the Web
* Manifest has changed. Skips the check if the check was done recently. * Manifest has changed. Skips the check if the check was done recently.
* @param tab The tab of the WebAPK.
* @param info The WebApkInfo of the WebAPK.
*/ */
public void updateIfNeeded(Tab tab, WebApkInfo info) { public void updateIfNeeded(WebappDataStorage storage, WebApkInfo info) {
mStorage = storage;
mInfo = info; mInfo = info;
if (!shouldCheckIfWebManifestUpdated(mInfo)) return; Tab tab = mActivity.getActivityTab();
if (tab == null || !shouldCheckIfWebManifestUpdated(mInfo)) return;
mFetcher = buildFetcher(); mFetcher = buildFetcher();
mFetcher.start(tab, mInfo, this); mFetcher.start(tab, mInfo, this);
...@@ -85,6 +98,7 @@ public class WebApkUpdateManager implements WebApkUpdateDataFetcher.Observer { ...@@ -85,6 +98,7 @@ public class WebApkUpdateManager implements WebApkUpdateDataFetcher.Observer {
}, UPDATE_TIMEOUT_MILLISECONDS); }, UPDATE_TIMEOUT_MILLISECONDS);
} }
@Override
public void destroy() { public void destroy() {
destroyFetcher(); destroyFetcher();
if (mUpdateFailureHandler != null) { if (mUpdateFailureHandler != null) {
......
...@@ -8,6 +8,7 @@ import org.chromium.chrome.browser.browserservices.trustedwebactivityui.controll ...@@ -8,6 +8,7 @@ import org.chromium.chrome.browser.browserservices.trustedwebactivityui.controll
import org.chromium.chrome.browser.customtabs.dependency_injection.BaseCustomTabActivityComponent; import org.chromium.chrome.browser.customtabs.dependency_injection.BaseCustomTabActivityComponent;
import org.chromium.chrome.browser.dependency_injection.ActivityScope; import org.chromium.chrome.browser.dependency_injection.ActivityScope;
import org.chromium.chrome.browser.dependency_injection.ChromeActivityCommonsModule; import org.chromium.chrome.browser.dependency_injection.ChromeActivityCommonsModule;
import org.chromium.chrome.browser.webapps.WebApkUpdateManager;
import org.chromium.chrome.browser.webapps.WebappActivityTabController; import org.chromium.chrome.browser.webapps.WebappActivityTabController;
import dagger.Subcomponent; import dagger.Subcomponent;
...@@ -21,4 +22,5 @@ import dagger.Subcomponent; ...@@ -21,4 +22,5 @@ import dagger.Subcomponent;
public interface WebappActivityComponent extends BaseCustomTabActivityComponent { public interface WebappActivityComponent extends BaseCustomTabActivityComponent {
TrustedWebActivityBrowserControlsVisibilityManager resolveBrowserControlsVisibilityManager(); TrustedWebActivityBrowserControlsVisibilityManager resolveBrowserControlsVisibilityManager();
WebappActivityTabController resolveTabController(); WebappActivityTabController resolveTabController();
WebApkUpdateManager resolveWebApkUpdateManager();
} }
...@@ -18,9 +18,11 @@ import org.chromium.base.metrics.RecordHistogram; ...@@ -18,9 +18,11 @@ import org.chromium.base.metrics.RecordHistogram;
import org.chromium.base.test.util.CallbackHelper; import org.chromium.base.test.util.CallbackHelper;
import org.chromium.base.test.util.CommandLineFlags; import org.chromium.base.test.util.CommandLineFlags;
import org.chromium.base.test.util.Feature; import org.chromium.base.test.util.Feature;
import org.chromium.chrome.browser.ChromeActivity;
import org.chromium.chrome.browser.ChromeSwitches; import org.chromium.chrome.browser.ChromeSwitches;
import org.chromium.chrome.browser.ShortcutHelper; import org.chromium.chrome.browser.ShortcutHelper;
import org.chromium.chrome.browser.flags.ChromeFeatureList; import org.chromium.chrome.browser.flags.ChromeFeatureList;
import org.chromium.chrome.browser.lifecycle.ActivityLifecycleDispatcher;
import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.browser.tab.Tab;
import org.chromium.chrome.test.ChromeJUnit4ClassRunner; import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
import org.chromium.chrome.test.ChromeTabbedActivityTestRule; import org.chromium.chrome.test.ChromeTabbedActivityTestRule;
...@@ -69,6 +71,7 @@ public class WebApkUpdateManagerTest { ...@@ -69,6 +71,7 @@ public class WebApkUpdateManagerTest {
private static final long WEBAPK_THEME_COLOR = 2147483648L; private static final long WEBAPK_THEME_COLOR = 2147483648L;
private static final long WEBAPK_BACKGROUND_COLOR = 2147483648L; private static final long WEBAPK_BACKGROUND_COLOR = 2147483648L;
private ChromeActivity mActivity;
private Tab mTab; private Tab mTab;
/** /**
...@@ -79,8 +82,9 @@ public class WebApkUpdateManagerTest { ...@@ -79,8 +82,9 @@ public class WebApkUpdateManagerTest {
private CallbackHelper mWaiter; private CallbackHelper mWaiter;
private boolean mNeedsUpdate; private boolean mNeedsUpdate;
public TestWebApkUpdateManager(CallbackHelper waiter, WebappDataStorage storage) { public TestWebApkUpdateManager(CallbackHelper waiter, ChromeActivity activity,
super(storage); ActivityLifecycleDispatcher lifecycleDispatcher) {
super(activity, lifecycleDispatcher);
mWaiter = waiter; mWaiter = waiter;
} }
...@@ -141,7 +145,8 @@ public class WebApkUpdateManagerTest { ...@@ -141,7 +145,8 @@ public class WebApkUpdateManagerTest {
public void setUp() throws Exception { public void setUp() throws Exception {
mActivityTestRule.startMainActivityOnBlankPage(); mActivityTestRule.startMainActivityOnBlankPage();
RecordHistogram.setDisabledForTests(true); RecordHistogram.setDisabledForTests(true);
mTab = mActivityTestRule.getActivity().getActivityTab(); mActivity = mActivityTestRule.getActivity();
mTab = mActivity.getActivityTab();
TestFetchStorageCallback callback = new TestFetchStorageCallback(); TestFetchStorageCallback callback = new TestFetchStorageCallback();
WebappRegistry.getInstance().register(WEBAPK_ID, callback); WebappRegistry.getInstance().register(WEBAPK_ID, callback);
...@@ -156,10 +161,12 @@ public class WebApkUpdateManagerTest { ...@@ -156,10 +161,12 @@ public class WebApkUpdateManagerTest {
/** Checks whether a WebAPK update is needed. */ /** Checks whether a WebAPK update is needed. */
private boolean checkUpdateNeeded(final CreationData creationData) throws Exception { private boolean checkUpdateNeeded(final CreationData creationData) throws Exception {
CallbackHelper waiter = new CallbackHelper(); CallbackHelper waiter = new CallbackHelper();
WebappDataStorage storage = WebappRegistry.getInstance().getWebappDataStorage(WEBAPK_ID); final TestWebApkUpdateManager updateManager =
final TestWebApkUpdateManager updateManager = new TestWebApkUpdateManager(waiter, storage); new TestWebApkUpdateManager(waiter, mActivity, mActivity.getLifecycleDispatcher());
TestThreadUtils.runOnUiThreadBlocking(() -> { TestThreadUtils.runOnUiThreadBlocking(() -> {
WebappDataStorage storage =
WebappRegistry.getInstance().getWebappDataStorage(WEBAPK_ID);
WebApkInfo info = WebApkInfo.create( WebApkInfo info = WebApkInfo.create(
"", creationData.scope, null, null, null, creationData.name, "", creationData.scope, null, null, null, creationData.name,
creationData.shortName, creationData.displayMode, creationData.orientation, 0, creationData.shortName, creationData.displayMode, creationData.orientation, 0,
...@@ -172,7 +179,7 @@ public class WebApkUpdateManagerTest { ...@@ -172,7 +179,7 @@ public class WebApkUpdateManagerTest {
1 /* webApkVersionCode */ 1 /* webApkVersionCode */
); );
updateManager.updateIfNeeded(mTab, info); updateManager.updateIfNeeded(storage, info);
}); });
waiter.waitForCallback(0); waiter.waitForCallback(0);
......
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