Commit a0234117 authored by Jian Li's avatar Jian Li Committed by Commit Bot

Subsequent offline indicator should be shown after offline is stablized

Bug: 852577
Change-Id: I5d929cd04499a9c694c72ab5607871455ff65169
Reviewed-on: https://chromium-review.googlesource.com/1196011Reviewed-by: default avatarPeter Williamson <petewil@chromium.org>
Commit-Queue: Jian Li <jianli@chromium.org>
Cr-Commit-Position: refs/heads/master@{#587755}
parent 4debbed7
...@@ -8,6 +8,7 @@ import android.annotation.SuppressLint; ...@@ -8,6 +8,7 @@ import android.annotation.SuppressLint;
import android.app.Activity; import android.app.Activity;
import android.graphics.Color; import android.graphics.Color;
import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable;
import android.os.SystemClock;
import android.support.v7.content.res.AppCompatResources; import android.support.v7.content.res.AppCompatResources;
import org.chromium.base.ApplicationStatus; import org.chromium.base.ApplicationStatus;
...@@ -38,12 +39,24 @@ public class OfflineIndicatorController ...@@ -38,12 +39,24 @@ public class OfflineIndicatorController
private static final int DURATION_MS = 10000; private static final int DURATION_MS = 10000;
// Time in milliseconds to wait until the offline state is stablized in the case of flaky
// connections.
private static final int TIME_TO_WAIT_FOR_STABLE_OFFLINE = 3 * 60 * 1000;
@SuppressLint("StaticFieldLeak") @SuppressLint("StaticFieldLeak")
private static OfflineIndicatorController sInstance; private static OfflineIndicatorController sInstance;
private static int sTimeToWaitForStableOffline = TIME_TO_WAIT_FOR_STABLE_OFFLINE;
private boolean mIsShowingOfflineIndicator = false; private boolean mIsShowingOfflineIndicator = false;
// Set to true if the offline indicator has been shown once.
private boolean mHasOfflineIndicatorShown = false;
private ConnectivityDetector mConnectivityDetector; private ConnectivityDetector mConnectivityDetector;
private boolean mIsOnline = false;
// Last time when the online state is detected. It is recorded as milliseconds since boot.
private long mLastOnlineTime = 0;
private OfflineIndicatorController() { private OfflineIndicatorController() {
mConnectivityDetector = new ConnectivityDetector(this); mConnectivityDetector = new ConnectivityDetector(this);
} }
...@@ -98,6 +111,13 @@ public class OfflineIndicatorController ...@@ -98,6 +111,13 @@ public class OfflineIndicatorController
} }
private void updateOfflineIndicator(boolean isOnline) { private void updateOfflineIndicator(boolean isOnline) {
if (isOnline != mIsOnline) {
if (isOnline) {
mLastOnlineTime = SystemClock.elapsedRealtime();
}
mIsOnline = isOnline;
}
Activity activity = ApplicationStatus.getLastTrackedFocusedActivity(); Activity activity = ApplicationStatus.getLastTrackedFocusedActivity();
if (!(activity instanceof SnackbarManageable)) return; if (!(activity instanceof SnackbarManageable)) return;
SnackbarManager snackbarManager = ((SnackbarManageable) activity).getSnackbarManager(); SnackbarManager snackbarManager = ((SnackbarManageable) activity).getSnackbarManager();
...@@ -128,6 +148,14 @@ public class OfflineIndicatorController ...@@ -128,6 +148,14 @@ public class OfflineIndicatorController
private void showOfflineIndicator(Activity activity, SnackbarManager snackbarManager) { private void showOfflineIndicator(Activity activity, SnackbarManager snackbarManager) {
if (mIsShowingOfflineIndicator || !canShowOfflineIndicator(activity)) return; if (mIsShowingOfflineIndicator || !canShowOfflineIndicator(activity)) return;
// If this is the first time to show offline indicator, show it. Otherwise, it will only
// be shown if the user has been continuously online for the required duration, then goes
// back to being offline.
if (mHasOfflineIndicatorShown
&& SystemClock.elapsedRealtime() - mLastOnlineTime < sTimeToWaitForStableOffline) {
return;
}
Drawable icon = AppCompatResources.getDrawable(activity, R.drawable.ic_offline_pin_white); Drawable icon = AppCompatResources.getDrawable(activity, R.drawable.ic_offline_pin_white);
Snackbar snackbar = Snackbar snackbar =
Snackbar.make(activity.getString(R.string.offline_indicator_offline_title), this, Snackbar.make(activity.getString(R.string.offline_indicator_offline_title), this,
...@@ -144,6 +172,7 @@ public class OfflineIndicatorController ...@@ -144,6 +172,7 @@ public class OfflineIndicatorController
RecordHistogram.recordEnumeratedHistogram("OfflineIndicator.CTR", RecordHistogram.recordEnumeratedHistogram("OfflineIndicator.CTR",
OFFLINE_INDICATOR_CTR_DISPLAYED, OFFLINE_INDICATOR_CTR_COUNT); OFFLINE_INDICATOR_CTR_DISPLAYED, OFFLINE_INDICATOR_CTR_COUNT);
mIsShowingOfflineIndicator = true; mIsShowingOfflineIndicator = true;
mHasOfflineIndicatorShown = true;
} }
private void hideOfflineIndicator(SnackbarManager snackbarManager) { private void hideOfflineIndicator(SnackbarManager snackbarManager) {
...@@ -155,4 +184,9 @@ public class OfflineIndicatorController ...@@ -155,4 +184,9 @@ public class OfflineIndicatorController
public ConnectivityDetector getConnectivityDetectorForTesting() { public ConnectivityDetector getConnectivityDetectorForTesting() {
return mConnectivityDetector; return mConnectivityDetector;
} }
@VisibleForTesting
static void overrideTimeToWaitForStableOfflineForTesting(int time) {
sTimeToWaitForStableOffline = time;
}
} }
...@@ -4,6 +4,7 @@ ...@@ -4,6 +4,7 @@
package org.chromium.chrome.browser.offlinepages.indicator; package org.chromium.chrome.browser.offlinepages.indicator;
import android.os.SystemClock;
import android.support.test.InstrumentationRegistry; import android.support.test.InstrumentationRegistry;
import android.support.test.filters.MediumTest; import android.support.test.filters.MediumTest;
...@@ -56,6 +57,8 @@ public class OfflineIndicatorControllerTest { ...@@ -56,6 +57,8 @@ public class OfflineIndicatorControllerTest {
} }
NetworkChangeNotifier.forceConnectivityState(true); NetworkChangeNotifier.forceConnectivityState(true);
OfflineIndicatorController.initialize(); OfflineIndicatorController.initialize();
OfflineIndicatorController.getInstance().overrideTimeToWaitForStableOfflineForTesting(
1500);
}); });
} }
...@@ -116,6 +119,43 @@ public class OfflineIndicatorControllerTest { ...@@ -116,6 +119,43 @@ public class OfflineIndicatorControllerTest {
checkOfflineIndicatorVisibility(mActivityTestRule.getActivity(), false); checkOfflineIndicatorVisibility(mActivityTestRule.getActivity(), false);
} }
@Test
@MediumTest
public void testDoNotShowSubsequentOfflineIndicatorWhenFlaky() throws Exception {
EmbeddedTestServer testServer =
EmbeddedTestServer.createAndStartServer(InstrumentationRegistry.getContext());
String testUrl = testServer.getURL(TEST_PAGE);
// Load a page.
loadPage(testUrl);
// Disconnect the network.
setNetworkConnectivity(false);
// Offline indicator should be shown.
checkOfflineIndicatorVisibility(mActivityTestRule.getActivity(), true);
// Reconnect the network.
setNetworkConnectivity(true);
// Offline indicator should go away.
checkOfflineIndicatorVisibility(mActivityTestRule.getActivity(), false);
// Disconnect the network.
setNetworkConnectivity(false);
// Subsequent offline indicator should not be shown.
checkOfflineIndicatorVisibility(mActivityTestRule.getActivity(), false);
// Reconnect the network and keep it for some time before disconnecting it.
setNetworkConnectivity(true);
SystemClock.sleep(2000);
setNetworkConnectivity(false);
// Subsequent offline indicator should be shown.
checkOfflineIndicatorVisibility(mActivityTestRule.getActivity(), true);
}
@Test @Test
@MediumTest @MediumTest
public void testDoNotShowOfflineIndicatorOnErrorPageWhenOffline() throws Exception { public void testDoNotShowOfflineIndicatorOnErrorPageWhenOffline() throws Exception {
......
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