Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(855)

Unified Diff: chrome/android/java/src/org/chromium/chrome/browser/offlinepages/OfflinePageUtils.java

Issue 2836333004: [Offline pages] Update of OfflinePageUtils for better testability (Closed)
Patch Set: Rebasing and addressing feedback Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/android/java/src/org/chromium/chrome/browser/offlinepages/OfflinePageUtils.java
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/OfflinePageUtils.java b/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/OfflinePageUtils.java
index fb0f227cdc53ddd4ab7b6a36e878228fa5bd0d71..54e0c0e2799083b71c68fb03f8eac88297abb101 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/OfflinePageUtils.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/OfflinePageUtils.java
@@ -76,7 +76,8 @@ public class OfflinePageUtils {
// Used instead of the constant so tests can override the value.
private static int sSnackbarDurationMs = DEFAULT_SNACKBAR_DURATION_MS;
- private static OfflinePageUtils sInstance;
+ /** Instance carrying actual implementation of utility methods. */
+ private static Internal sInstance;
private static File sOfflineSharingDirectory;
@@ -88,6 +89,88 @@ public class OfflinePageUtils {
private static Map<ChromeActivity, RecentTabTracker> sTabModelObservers = new HashMap<>();
/**
+ * Interface for implementation of offline page utilities, that can be implemented for testing.
+ * We are using an internal interface, so that instance methods can have the same names as
+ * static methods.
+ */
+ @VisibleForTesting
+ interface Internal {
+ /** Returns offline page bridge for specified profile. */
+ OfflinePageBridge getOfflinePageBridge(Profile profile);
+
+ /** Returns whether the network is connected. */
+ boolean isConnected();
+
+ /**
+ * Checks if an offline page is shown for the tab.
+ * @param tab The tab to be reloaded.
+ * @return True if the offline page is opened.
+ */
+ boolean isOfflinePage(Tab tab);
+
+ /**
+ * Returns whether the tab is showing offline preview.
+ * @param tab The current tab.
+ */
+ boolean isShowingOfflinePreview(Tab tab);
+
+ /**
+ * Shows the "reload" snackbar for the given tab.
+ * @param context The application context.
+ * @param snackbarManager Class that shows the snackbar.
+ * @param snackbarController Class to control the snackbar.
+ * @param tabId Id of a tab that the snackbar is related to.
+ */
+ void showReloadSnackbar(Context context, SnackbarManager snackbarManager,
+ final SnackbarController snackbarController, int tabId);
+ }
+
+ private static class OfflinePageUtilsImpl implements Internal {
+ @Override
+ public OfflinePageBridge getOfflinePageBridge(Profile profile) {
+ return OfflinePageBridge.getForProfile(profile);
+ }
+
+ @Override
+ public boolean isConnected() {
+ return NetworkChangeNotifier.isOnline();
+ }
+
+ @Override
+ public boolean isOfflinePage(Tab tab) {
+ WebContents webContents = tab.getWebContents();
+ if (webContents == null) return false;
+ OfflinePageBridge offlinePageBridge =
+ getInstance().getOfflinePageBridge(tab.getProfile());
+ if (offlinePageBridge == null) return false;
+ return offlinePageBridge.isOfflinePage(webContents);
+ }
+
+ @Override
+ public boolean isShowingOfflinePreview(Tab tab) {
+ OfflinePageBridge offlinePageBridge = getOfflinePageBridge(tab.getProfile());
+ if (offlinePageBridge == null) return false;
+ return offlinePageBridge.isShowingOfflinePreview(tab.getWebContents());
+ }
+
+ @Override
+ public void showReloadSnackbar(Context context, SnackbarManager snackbarManager,
+ final SnackbarController snackbarController, int tabId) {
+ if (tabId == Tab.INVALID_TAB_ID) return;
+
+ Log.d(TAG, "showReloadSnackbar called with controller " + snackbarController);
+ Snackbar snackbar =
+ Snackbar.make(context.getString(R.string.offline_pages_viewing_offline_page),
+ snackbarController, Snackbar.TYPE_ACTION,
+ Snackbar.UMA_OFFLINE_PAGE_RELOAD)
+ .setSingleLine(false)
+ .setAction(context.getString(R.string.reload), tabId);
+ snackbar.setDuration(sSnackbarDurationMs);
+ snackbarManager.showSnackbar(snackbar);
+ }
+ }
+
+ /**
* Contains values from the histogram enum OfflinePagesTabRestoreType used for reporting the
* OfflinePages.TabRestore metric.
*/
@@ -107,9 +190,9 @@ public class OfflinePageUtils {
public static final int COUNT = 10;
}
- private static OfflinePageUtils getInstance() {
+ private static Internal getInstance() {
if (sInstance == null) {
- sInstance = new OfflinePageUtils();
+ sInstance = new OfflinePageUtilsImpl();
}
return sInstance;
}
@@ -128,11 +211,9 @@ public class OfflinePageUtils {
return Environment.getDataDirectory().getTotalSpace();
}
- /**
- * Returns true if the network is connected.
- */
+ /** Returns whether the network is connected. */
public static boolean isConnected() {
- return NetworkChangeNotifier.isOnline();
+ return getInstance().isConnected();
}
/*
@@ -203,25 +284,21 @@ public class OfflinePageUtils {
OfflinePageTabObserver.addObserverForTab(tab);
}
+ protected void showReloadSnackbarInternal(Context context, SnackbarManager snackbarManager,
+ final SnackbarController snackbarController, int tabId) {}
+
/**
* Shows the "reload" snackbar for the given tab.
- * @param activity The activity owning the tab.
- * @param snackbarController Class to show the snackbar.
+ * @param context The application context.
+ * @param snackbarManager Class that shows the snackbar.
+ * @param snackbarController Class to control the snackbar.
+ * @param tabId Id of a tab that the snackbar is related to.
*/
public static void showReloadSnackbar(Context context, SnackbarManager snackbarManager,
final SnackbarController snackbarController, int tabId) {
- if (tabId == Tab.INVALID_TAB_ID) return;
-
- Log.d(TAG, "showReloadSnackbar called with controller " + snackbarController);
- Snackbar snackbar =
- Snackbar.make(context.getString(R.string.offline_pages_viewing_offline_page),
- snackbarController, Snackbar.TYPE_ACTION, Snackbar.UMA_OFFLINE_PAGE_RELOAD)
- .setSingleLine(false).setAction(context.getString(R.string.reload), tabId);
- snackbar.setDuration(sSnackbarDurationMs);
- snackbarManager.showSnackbar(snackbar);
+ getInstance().showReloadSnackbar(context, snackbarManager, snackbarController, tabId);
}
-
/**
* Records UMA data when the Offline Pages Background Load service awakens.
* @param context android context
@@ -558,9 +635,7 @@ public class OfflinePageUtils {
* @param tab The current tab.
*/
public static boolean isShowingOfflinePreview(Tab tab) {
- OfflinePageBridge offlinePageBridge = getInstance().getOfflinePageBridge(tab.getProfile());
- if (offlinePageBridge == null) return false;
- return offlinePageBridge.isShowingOfflinePreview(tab.getWebContents());
+ return getInstance().isShowingOfflinePreview(tab);
}
/**
@@ -569,11 +644,7 @@ public class OfflinePageUtils {
* @return True if the offline page is opened.
*/
public static boolean isOfflinePage(Tab tab) {
- WebContents webContents = tab.getWebContents();
- if (webContents == null) return false;
- OfflinePageBridge offlinePageBridge = getInstance().getOfflinePageBridge(tab.getProfile());
- if (offlinePageBridge == null) return false;
- return offlinePageBridge.isOfflinePage(webContents);
+ return getInstance().isOfflinePage(tab);
}
/**
@@ -617,10 +688,6 @@ public class OfflinePageUtils {
tab.loadUrl(params);
}
- protected OfflinePageBridge getOfflinePageBridge(Profile profile) {
- return OfflinePageBridge.getForProfile(profile);
- }
-
/**
* Tracks tab creation and closure for the Recent Tabs feature. UI needs to stop showing
* recent offline pages as soon as the tab is closed. The TabModel is used to get profile
@@ -792,7 +859,7 @@ public class OfflinePageUtils {
}
@VisibleForTesting
- static void setInstanceForTesting(OfflinePageUtils instance) {
+ static void setInstanceForTesting(Internal instance) {
sInstance = instance;
}

Powered by Google App Engine
This is Rietveld 408576698