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

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

Issue 1637613003: We have problems with multiple listeners per tab. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Make tab observer list package private. Created 4 years, 11 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/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");
}
}

Powered by Google App Engine
This is Rietveld 408576698