Index: chrome/android/java/src/org/chromium/chrome/browser/offlinepages/OfflinePageTabObserver.java |
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/OfflinePageTabObserver.java b/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/OfflinePageTabObserver.java |
index 4095422ef2152bc20a18e25e3774533087ec4408..1c48932c23ea03087f1678e4e0c8c86b486eb594 100644 |
--- a/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/OfflinePageTabObserver.java |
+++ b/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/OfflinePageTabObserver.java |
@@ -26,8 +26,41 @@ public class OfflinePageTabObserver extends EmptyTabObserver { |
private boolean mWasHidden; |
private OfflinePageConnectivityListener mListener; |
- private static final Map<Integer, OfflinePageConnectivityListener> sConnectivityListeners = |
- new TreeMap<Integer, OfflinePageConnectivityListener>(); |
+ static final Map<Integer, OfflinePageTabObserver> sTabObservers = |
+ new TreeMap<Integer, OfflinePageTabObserver>(); |
+ |
+ /** |
+ * Create and attach a tab observer if we don't already have one, otherwise update it. |
+ * @param activity The ChromeActivity we are associated with. |
+ * @param tab The tab we are adding an observer for. |
+ * @param conneted True if we were connected when this call was made. |
+ * @param bookmarkId The ID of the bookmark we are adding an observer for. |
+ */ |
+ public static void addObserverForTab( |
+ ChromeActivity activity, Tab tab, boolean connected, long bookmarkId) { |
+ // See if we already have an observer for this tab. |
+ int tabId = tab.getId(); |
+ OfflinePageTabObserver observer = sTabObservers.get(tabId); |
+ |
+ if (observer == null) { |
+ // If we don't have an observer, build one and attach it to the tab. |
+ observer = new OfflinePageTabObserver(activity, tab, connected, bookmarkId); |
+ sTabObservers.put(tabId, observer); |
+ tab.addObserver(observer); |
+ Log.d(TAG, "Added tab observer connected " + connected + ", bookmarkId " + bookmarkId); |
+ } else { |
+ // If we already have an observer, update the bookmark ID and connected state. |
+ observer.setConnected(connected); |
+ observer.setBookmarkId(bookmarkId); |
+ // If we already have an observer and addObserver was called, we should re-enable |
+ // the connectivity listener in case we go offline again. This typically happens |
+ // if a background page comes back to the foreground. |
+ if (!connected) { |
+ observer.enableConnectivityListener(); |
+ } |
+ Log.d(TAG, "Updated tab observer " + connected + ", bookmarkId " + bookmarkId); |
+ } |
+ } |
/** |
* Builds a new OfflinePageTabObserver. |
@@ -35,7 +68,7 @@ public class OfflinePageTabObserver extends EmptyTabObserver { |
* @param connected True if the phone is connected when the observer is created. |
* @param bookmarkId Id of the bookmark (offline page) that is associated with this observer. |
*/ |
- public OfflinePageTabObserver( |
+ private OfflinePageTabObserver( |
ChromeActivity activity, Tab tab, boolean connected, long bookmarkId) { |
mActivity = activity; |
mConnected = connected; |
@@ -45,10 +78,21 @@ public class OfflinePageTabObserver extends EmptyTabObserver { |
mWasHidden = tab.isHidden(); |
mListener = new OfflinePageConnectivityListener(activity, tab); |
- sConnectivityListeners.put(tab.getId(), mListener); |
Log.d(TAG, "OfflinePageTabObserver built"); |
} |
+ public void setConnected(boolean connected) { |
+ mConnected = connected; |
+ } |
+ |
+ public void setBookmarkId(long bookmarkId) { |
+ mBookmarkId = bookmarkId; |
+ } |
+ |
+ public void enableConnectivityListener() { |
+ mListener.enable(); |
+ } |
+ |
@Override |
public void onShown(Tab visibleTab) { |
if (mWasHidden) { |
@@ -68,6 +112,8 @@ public class OfflinePageTabObserver extends EmptyTabObserver { |
public void onHidden(Tab hiddenTab) { |
mWasHidden = true; |
// TODO(petewil): In case any snackbars are showing, dismiss them before we switch tabs. |
+ // We will need a handle on the snackbar manager (likely via ChromeActivity) and the |
+ // snackbar controller (likely via showReload/EditSnackbar). |
} |
@Override |
@@ -78,22 +124,16 @@ public class OfflinePageTabObserver extends EmptyTabObserver { |
@Override |
public void onDestroyed(Tab destroyedTab) { |
// Unregister this tab for OS connectivity notifications. |
- if (mListener != null) { |
- mListener.disable(); |
- destroyedTab.removeObserver(this); |
- sConnectivityListeners.remove(destroyedTab.getId()); |
- Log.d(TAG, "onDestroyed"); |
- } |
+ mListener.disable(); |
+ destroyedTab.removeObserver(this); |
+ sTabObservers.remove(destroyedTab.getId()); |
+ Log.d(TAG, "onDestroyed"); |
} |
@Override |
public void onUrlUpdated(Tab reloadingTab) { |
// Unregister this tab for OS connectivity notifications. |
- if (mListener != null) { |
- mListener.disable(); |
- reloadingTab.removeObserver(this); |
- sConnectivityListeners.remove(reloadingTab.getId()); |
- Log.d(TAG, "onUrlUpdated"); |
- } |
+ mListener.disable(); |
+ Log.d(TAG, "onUrlUpdated"); |
} |
} |