OSDN Git Service

Fixed CTS failure due to selecting wrong transition.
authorWale Ogunwale <ogunwale@google.com>
Tue, 23 May 2017 17:34:48 +0000 (10:34 -0700)
committerWale Ogunwale <ogunwale@google.com>
Tue, 23 May 2017 23:14:02 +0000 (16:14 -0700)
ag/2253646 fixed an issue where a starting window can be displayed prematurely.
However, it also prevented an app from being added to the opening apps list if
it was already visible. This caused wrong transition animation to be selected
for the closing app. We now always set the visibility to true even if the app
is already visible so that the app can be added to the opening apps list and
the right transition animation selected. We don't set visibility to false if
the app isn't visible so it isn't added to the closing apps list which covers
the case ag/2253646 attempted to fix.

Bug: 34545029
Change-Id: I06363beb0c524146a8b871eff8157678452c3d1d
Fixes: 38505794
Test: cts/.../run-test android.server.cts.ActivityManagerTransitionSelectionTests

services/core/java/com/android/server/am/ActivityRecord.java
services/core/java/com/android/server/wm/AppWindowContainerController.java

index 55ec3b0..5636e19 100644 (file)
@@ -284,7 +284,6 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo
     boolean visible;        // does this activity's window need to be shown?
     boolean visibleIgnoringKeyguard; // is this activity visible, ignoring the fact that Keyguard
                                      // might hide this activity?
-    private boolean mLastSetWindowVisibility; // The last window visibility state that was set.
     private boolean mDeferHidingClient; // If true we told WM to defer reporting to the client
                                         // process that it is hidden.
     boolean sleeping;       // have we told the activity to sleep?
@@ -1589,10 +1588,6 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo
     }
 
     void setVisibility(boolean visible) {
-        if (mLastSetWindowVisibility == visible) {
-            return;
-        }
-        mLastSetWindowVisibility = visible;
         mWindowContainerController.setVisibility(visible, mDeferHidingClient);
         mStackSupervisor.mActivityMetricsLogger.notifyVisibilityChanged(this, visible);
     }
index c982f08..479a112 100644 (file)
@@ -348,6 +348,24 @@ public class AppWindowContainerController
 
             final AppWindowToken wtoken = mContainer;
 
+            // Don't set visibility to false if we were already not visible. This prevents WM from
+            // adding the app to the closing app list which doesn't make sense for something that is
+            // already not visible. However, set visibility to true even if we are already visible.
+            // This makes sure the app is added to the opening apps list so that the right
+            // transition can be selected.
+            // TODO: Probably a good idea to separate the concept of opening/closing apps from the
+            // concept of setting visibility...
+            if (!visible && wtoken.hiddenRequested) {
+
+                if (!deferHidingClient && wtoken.mDeferHidingClient) {
+                    // We previously deferred telling the client to hide itself when visibility was
+                    // initially set to false. Now we would like it to hide, so go ahead and set it.
+                    wtoken.mDeferHidingClient = deferHidingClient;
+                    wtoken.setClientHidden(true);
+                }
+                return;
+            }
+
             if (DEBUG_APP_TRANSITIONS || DEBUG_ORIENTATION) Slog.v(TAG_WM, "setAppVisibility("
                     + mToken + ", visible=" + visible + "): " + mService.mAppTransition
                     + " hidden=" + wtoken.hidden + " hiddenRequested="