Starts a pending download immediately when swiping to that image.

Add a new Attachment state, PAUSED, for when we've queued the attachment in the
DownloadManager, but it hasn't started yet.

Modified onViewActivated() so it would only get triggered once when you swipe to
that fragment.

Bug: 8023818
Change-Id: I319f12235559feb1f716515155881188894d6f05
diff --git a/src/com/android/ex/photo/PhotoViewActivity.java b/src/com/android/ex/photo/PhotoViewActivity.java
index 7408952..0d5e8bd 100644
--- a/src/com/android/ex/photo/PhotoViewActivity.java
+++ b/src/com/android/ex/photo/PhotoViewActivity.java
@@ -45,7 +45,9 @@
 import com.android.ex.photo.loaders.PhotoPagerLoader;
 import com.android.ex.photo.provider.PhotoContract;
 
+import java.util.HashMap;
 import java.util.HashSet;
+import java.util.Map;
 import java.util.Set;
 
 /**
@@ -90,8 +92,9 @@
     protected PhotoPagerAdapter mAdapter;
     /** Whether or not we're in "full screen" mode */
     private boolean mFullScreen;
-    /** The set of listeners wanting full screen state */
-    private Set<OnScreenListener> mScreenListeners = new HashSet<OnScreenListener>();
+    /** The listeners wanting full screen state for each screen position */
+    private Map<Integer, OnScreenListener>
+            mScreenListeners = new HashMap<Integer, OnScreenListener>();
     /** The set of listeners wanting full screen state */
     private Set<CursorChangedListener> mCursorListeners = new HashSet<CursorChangedListener>();
     /** When {@code true}, restart the loader when the activity becomes active */
@@ -156,6 +159,7 @@
         mMaxInitialScale = mIntent.getFloatExtra(Intents.EXTRA_MAX_INITIAL_SCALE, 1.0f);
 
         mPhotoIndex = currentItem;
+        mIsEmpty = true;
 
         setContentView(R.layout.photo_activity_view);
 
@@ -231,13 +235,13 @@
     }
 
     @Override
-    public void addScreenListener(OnScreenListener listener) {
-        mScreenListeners.add(listener);
+    public void addScreenListener(int position, OnScreenListener listener) {
+        mScreenListeners.put(position, listener);
     }
 
     @Override
-    public void removeScreenListener(OnScreenListener listener) {
-        mScreenListeners.remove(listener);
+    public void removeScreenListener(int position) {
+        mScreenListeners.remove(position);
     }
 
     @Override
@@ -318,6 +322,7 @@
                     mRestartLoader = true;
                     return;
                 }
+                boolean wasEmpty = mIsEmpty;
                 mIsEmpty = false;
 
                 mAdapter.swapCursor(data);
@@ -335,7 +340,9 @@
                 }
 
                 mViewPager.setCurrentItem(itemIndex, false);
-                setViewActivated();
+                if (wasEmpty) {
+                    setViewActivated(itemIndex);
+                }
             }
             // Update the any action items
             updateActionItems();
@@ -368,7 +375,7 @@
     @Override
     public void onPageSelected(int position) {
         mPhotoIndex = position;
-        setViewActivated();
+        setViewActivated(position);
     }
 
     @Override
@@ -393,14 +400,13 @@
         boolean interceptLeft = false;
         boolean interceptRight = false;
 
-        for (OnScreenListener listener : mScreenListeners) {
+        for (OnScreenListener listener : mScreenListeners.values()) {
             if (!interceptLeft) {
                 interceptLeft = listener.onInterceptMoveLeft(origX, origY);
             }
             if (!interceptRight) {
                 interceptRight = listener.onInterceptMoveRight(origX, origY);
             }
-            listener.onViewActivated();
         }
 
         if (interceptLeft) {
@@ -432,7 +438,7 @@
         }
 
         if (fullScreenChanged) {
-            for (OnScreenListener listener : mScreenListeners) {
+            for (OnScreenListener listener : mScreenListeners.values()) {
                 listener.onFullScreenChanged(mFullScreen);
             }
         }
@@ -480,8 +486,9 @@
     };
 
     @Override
-    public void setViewActivated() {
-        for (OnScreenListener listener : mScreenListeners) {
+    public void setViewActivated(int position) {
+        OnScreenListener listener = mScreenListeners.get(position);
+        if (listener != null) {
             listener.onViewActivated();
         }
     }
@@ -553,8 +560,8 @@
     }
 
     @Override
-    public void onNewPhotoLoaded() {
-        setViewActivated();
+    public void onNewPhotoLoaded(int position) {
+        // do nothing
     }
 
     protected boolean isFullScreen() {
diff --git a/src/com/android/ex/photo/PhotoViewCallbacks.java b/src/com/android/ex/photo/PhotoViewCallbacks.java
index 7e789c6..075b116 100644
--- a/src/com/android/ex/photo/PhotoViewCallbacks.java
+++ b/src/com/android/ex/photo/PhotoViewCallbacks.java
@@ -50,17 +50,17 @@
         public void onCursorChanged(Cursor cursor);
     }
 
-    public void addScreenListener(OnScreenListener listener);
+    public void addScreenListener(int position, OnScreenListener listener);
 
-    public void removeScreenListener(OnScreenListener listener);
+    public void removeScreenListener(int position);
 
     public void addCursorListener(CursorChangedListener listener);
 
     public void removeCursorListener(CursorChangedListener listener);
 
-    public void setViewActivated();
+    public void setViewActivated(int position);
 
-    public void onNewPhotoLoaded();
+    public void onNewPhotoLoaded(int position);
 
     public void toggleFullScreen();
 
diff --git a/src/com/android/ex/photo/fragments/PhotoViewFragment.java b/src/com/android/ex/photo/fragments/PhotoViewFragment.java
index 21c355a..bfa8a3c 100644
--- a/src/com/android/ex/photo/fragments/PhotoViewFragment.java
+++ b/src/com/android/ex/photo/fragments/PhotoViewFragment.java
@@ -215,7 +215,7 @@
     @Override
     public void onResume() {
         super.onResume();
-        mCallback.addScreenListener(this);
+        mCallback.addScreenListener(mPosition, this);
         mCallback.addCursorListener(this);
 
         if (!isPhotoBound()) {
@@ -231,7 +231,7 @@
     public void onPause() {
         // Remove listeners
         mCallback.removeCursorListener(this);
-        mCallback.removeScreenListener(this);
+        mCallback.removeScreenListener(mPosition);
         resetPhotoView();
         super.onPause();
     }
@@ -313,7 +313,7 @@
         }
 
         if (data != null) {
-            mCallback.onNewPhotoLoaded();
+            mCallback.onNewPhotoLoaded(mPosition);
         }
         setViewVisibility();
     }