OSDN Git Service

Fix 5835642: Only finish the page when it's still active.
authorChih-Chung Chang <chihchung@google.com>
Mon, 9 Jan 2012 04:41:57 +0000 (12:41 +0800)
committerChih-Chung Chang <chihchung@google.com>
Mon, 9 Jan 2012 09:12:19 +0000 (17:12 +0800)
The original code can call finishState twice in a row with the calling
stack: finishState -> onPause -> clearLoadingBit -> finishState.

Change clearLoadingBit to call finishState only when it's currently active.

Change-Id: I537dbdd6ce26b26aeb565e243c4168229d4a70ef

src/com/android/gallery3d/app/AlbumPage.java
src/com/android/gallery3d/app/AlbumSetPage.java
src/com/android/gallery3d/app/StateManager.java

index 6fb4143..fbe4533 100644 (file)
@@ -349,8 +349,10 @@ public class AlbumPage extends ActivityState implements GalleryActionBar.Cluster
         if (mSyncTask != null) {
             mSyncTask.cancel();
             mSyncTask = null;
+            clearLoadingBit(BIT_LOADING_SYNC);
         }
         mActionModeHandler.pause();
+        GalleryUtils.setSpinnerVisibility((Activity) mActivity, false);
     }
 
     @Override
@@ -572,9 +574,8 @@ public class AlbumPage extends ActivityState implements GalleryActionBar.Cluster
                 if (resultCode == MediaSet.SYNC_RESULT_SUCCESS) {
                     mInitialSynced = true;
                 }
-                if (!mIsActive) return;
                 clearLoadingBit(BIT_LOADING_SYNC);
-                if (resultCode == MediaSet.SYNC_RESULT_ERROR) {
+                if (resultCode == MediaSet.SYNC_RESULT_ERROR && mIsActive) {
                     Toast.makeText((Context) mActivity, R.string.sync_album_error,
                             Toast.LENGTH_LONG).show();
                 }
@@ -583,7 +584,7 @@ public class AlbumPage extends ActivityState implements GalleryActionBar.Cluster
     }
 
     private void setLoadingBit(int loadTaskBit) {
-        if (mLoadingBits == 0) {
+        if (mLoadingBits == 0 && mIsActive) {
             GalleryUtils.setSpinnerVisibility((Activity) mActivity, true);
         }
         mLoadingBits |= loadTaskBit;
@@ -591,7 +592,7 @@ public class AlbumPage extends ActivityState implements GalleryActionBar.Cluster
 
     private void clearLoadingBit(int loadTaskBit) {
         mLoadingBits &= ~loadTaskBit;
-        if (mLoadingBits == 0) {
+        if (mLoadingBits == 0 && mIsActive) {
             GalleryUtils.setSpinnerVisibility((Activity) mActivity, false);
 
             if (mAlbumDataAdapter.size() == 0) {
@@ -610,7 +611,6 @@ public class AlbumPage extends ActivityState implements GalleryActionBar.Cluster
 
         @Override
         public void onLoadingFinished() {
-            if (!mIsActive) return;
             clearLoadingBit(BIT_LOADING_RELOAD);
         }
     }
index e1dcade..5c39341 100644 (file)
@@ -292,7 +292,7 @@ public class AlbumSetPage extends ActivityState implements
 
     private void clearLoadingBit(int loadingBit) {
         mLoadingBits &= ~loadingBit;
-        if (mLoadingBits == 0) {
+        if (mLoadingBits == 0 && mIsActive) {
             GalleryUtils.setSpinnerVisibility((Activity) mActivity, false);
 
             // Only show toast when there's no album and we are going to finish
@@ -308,7 +308,7 @@ public class AlbumSetPage extends ActivityState implements
     }
 
     private void setLoadingBit(int loadingBit) {
-        if (mLoadingBits == 0) {
+        if (mLoadingBits == 0 && mIsActive) {
             GalleryUtils.setSpinnerVisibility((Activity) mActivity, true);
         }
         mLoadingBits |= loadingBit;
@@ -330,6 +330,7 @@ public class AlbumSetPage extends ActivityState implements
             mSyncTask = null;
             clearLoadingBit(BIT_LOADING_SYNC);
         }
+        GalleryUtils.setSpinnerVisibility((Activity) mActivity, false);
     }
 
     @Override
@@ -614,9 +615,8 @@ public class AlbumSetPage extends ActivityState implements
                 if (resultCode == MediaSet.SYNC_RESULT_SUCCESS) {
                     mInitialSynced = true;
                 }
-                if (!mIsActive) return;
                 clearLoadingBit(BIT_LOADING_SYNC);
-                if (resultCode == MediaSet.SYNC_RESULT_ERROR) {
+                if (resultCode == MediaSet.SYNC_RESULT_ERROR && mIsActive) {
                     Toast.makeText((Context) mActivity, R.string.sync_album_set_error,
                             Toast.LENGTH_LONG).show();
                 }
@@ -630,7 +630,6 @@ public class AlbumSetPage extends ActivityState implements
         }
 
         public void onLoadingFinished() {
-            if (!mIsActive) return;
             clearLoadingBit(BIT_LOADING_RELOAD);
         }
     }
index 556a06a..f171689 100644 (file)
@@ -159,7 +159,7 @@ public class StateManager {
     }
 
     void finishState(ActivityState state) {
-        Log.v(TAG, "finishState " + state.getClass());
+        Log.v(TAG, "finishState " + state);
         if (state != mStack.peek().activityState) {
             if (state.isDestroyed()) {
                 Log.d(TAG, "The state is already destroyed");