Add more assertions for View temporary detach

This CL does not require new behavior change but only clarify how
currently View is behaving, as a preparation to fix Bug 30791718.

Bug: 30791718
Change-Id: I1bb73f5de9e3b817dd6f9c71f70afb7cc43e9713
diff --git a/tests/tests/view/src/android/view/cts/MockView.java b/tests/tests/view/src/android/view/cts/MockView.java
index c5e4ab4..6b2cc18 100644
--- a/tests/tests/view/src/android/view/cts/MockView.java
+++ b/tests/tests/view/src/android/view/cts/MockView.java
@@ -71,10 +71,6 @@
     private boolean mCalledOnKeyPreIme = false;
     private boolean mCalledOnResolvePointerIcon = false;
     private boolean mCalledOnVisibilityAggregated = false;
-    private boolean mCalledDispatchStartTemporaryDetach = false;
-    private boolean mCalledDispatchFinishTemporaryDetach = false;
-    private boolean mCalledOnStartTemporaryDetach = false;
-    private boolean mCalledOnFinishTemporaryDetach = false;
 
     private int mOldWidth = -1;
     private int mOldHeight = -1;
@@ -638,46 +634,6 @@
         return mLastAggregatedVisibility;
     }
 
-    @Override
-    public void dispatchStartTemporaryDetach() {
-        super.dispatchStartTemporaryDetach();
-        mCalledDispatchStartTemporaryDetach = true;
-    }
-
-    @Override
-    public void dispatchFinishTemporaryDetach() {
-        super.dispatchFinishTemporaryDetach();
-        mCalledDispatchFinishTemporaryDetach = true;
-    }
-
-    @Override
-    public void onStartTemporaryDetach() {
-        super.onStartTemporaryDetach();
-        mCalledOnStartTemporaryDetach = true;
-    }
-
-    @Override
-    public void onFinishTemporaryDetach() {
-        super.onFinishTemporaryDetach();
-        mCalledOnFinishTemporaryDetach = true;
-    }
-
-    public boolean hasCalledDispatchStartTemporaryDetach() {
-        return mCalledDispatchStartTemporaryDetach;
-    }
-
-    public boolean hasCalledDispatchFinishTemporaryDetach() {
-        return mCalledDispatchFinishTemporaryDetach;
-    }
-
-    public boolean hasCalledOnStartTemporaryDetach() {
-        return mCalledOnStartTemporaryDetach;
-    }
-
-    public boolean hasCalledOnFinishTemporaryDetach() {
-        return mCalledOnFinishTemporaryDetach;
-    }
-
     public void reset() {
         mCalledOnCreateContextMenu = false;
 
@@ -719,10 +675,6 @@
         mCalledOnResolvePointerIcon = false;
         mCalledOnVisibilityAggregated = false;
         mCalledOnVisibilityAggregated = false;
-        mCalledDispatchStartTemporaryDetach = false;
-        mCalledDispatchFinishTemporaryDetach = false;
-        mCalledOnStartTemporaryDetach = false;
-        mCalledOnFinishTemporaryDetach = false;
 
         mOldWidth = -1;
         mOldHeight = -1;
diff --git a/tests/tests/view/src/android/view/cts/ViewTest.java b/tests/tests/view/src/android/view/cts/ViewTest.java
index 7d11c68..876878f 100644
--- a/tests/tests/view/src/android/view/cts/ViewTest.java
+++ b/tests/tests/view/src/android/view/cts/ViewTest.java
@@ -94,6 +94,7 @@
 import java.util.Collections;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicBoolean;
 
 /**
  * Test {@link View}.
@@ -3622,13 +3623,100 @@
     }
 
     public void testOnStartAndFinishTemporaryDetach() throws Throwable {
-        final MockView view = (MockView) mActivity.findViewById(R.id.mock_view);
+        final AtomicBoolean exitedDispatchStartTemporaryDetach = new AtomicBoolean(false);
+        final AtomicBoolean exitedDispatchFinishTemporaryDetach = new AtomicBoolean(false);
+
+        final View view = new View(mActivity) {
+            private boolean mEnteredDispatchStartTemporaryDetach = false;
+            private boolean mExitedDispatchStartTemporaryDetach = false;
+            private boolean mEnteredDispatchFinishTemporaryDetach = false;
+            private boolean mExitedDispatchFinishTemporaryDetach = false;
+
+            private boolean mCalledOnStartTemporaryDetach = false;
+            private boolean mCalledOnFinishTemporaryDetach = false;
+
+            @Override
+            public void dispatchStartTemporaryDetach() {
+                assertFalse(mEnteredDispatchStartTemporaryDetach);
+                assertFalse(mExitedDispatchStartTemporaryDetach);
+                assertFalse(mEnteredDispatchFinishTemporaryDetach);
+                assertFalse(mExitedDispatchFinishTemporaryDetach);
+                assertFalse(mCalledOnStartTemporaryDetach);
+                assertFalse(mCalledOnFinishTemporaryDetach);
+                mEnteredDispatchStartTemporaryDetach = true;
+
+                assertFalse(isTemporarilyDetached());
+
+                super.dispatchStartTemporaryDetach();
+
+                assertTrue(isTemporarilyDetached());
+
+                assertTrue(mEnteredDispatchStartTemporaryDetach);
+                assertFalse(mExitedDispatchStartTemporaryDetach);
+                assertFalse(mEnteredDispatchFinishTemporaryDetach);
+                assertFalse(mExitedDispatchFinishTemporaryDetach);
+                assertTrue(mCalledOnStartTemporaryDetach);
+                assertFalse(mCalledOnFinishTemporaryDetach);
+                mExitedDispatchStartTemporaryDetach = true;
+                exitedDispatchStartTemporaryDetach.set(true);
+            }
+
+            @Override
+            public void dispatchFinishTemporaryDetach() {
+                assertTrue(mEnteredDispatchStartTemporaryDetach);
+                assertTrue(mExitedDispatchStartTemporaryDetach);
+                assertFalse(mEnteredDispatchFinishTemporaryDetach);
+                assertFalse(mExitedDispatchFinishTemporaryDetach);
+                assertTrue(mCalledOnStartTemporaryDetach);
+                assertFalse(mCalledOnFinishTemporaryDetach);
+                mEnteredDispatchFinishTemporaryDetach = true;
+
+                assertTrue(isTemporarilyDetached());
+
+                super.dispatchFinishTemporaryDetach();
+
+                assertFalse(isTemporarilyDetached());
+
+                assertTrue(mEnteredDispatchStartTemporaryDetach);
+                assertTrue(mExitedDispatchStartTemporaryDetach);
+                assertTrue(mEnteredDispatchFinishTemporaryDetach);
+                assertFalse(mExitedDispatchFinishTemporaryDetach);
+                assertTrue(mCalledOnStartTemporaryDetach);
+                assertTrue(mCalledOnFinishTemporaryDetach);
+                mExitedDispatchFinishTemporaryDetach = true;
+                exitedDispatchFinishTemporaryDetach.set(true);
+            }
+
+            @Override
+            public void onStartTemporaryDetach() {
+                assertTrue(mEnteredDispatchStartTemporaryDetach);
+                assertFalse(mExitedDispatchStartTemporaryDetach);
+                assertFalse(mEnteredDispatchFinishTemporaryDetach);
+                assertFalse(mExitedDispatchFinishTemporaryDetach);
+                assertFalse(mCalledOnStartTemporaryDetach);
+                assertFalse(mCalledOnFinishTemporaryDetach);
+
+                assertTrue(isTemporarilyDetached());
+
+                mCalledOnStartTemporaryDetach = true;
+            }
+
+            @Override
+            public void onFinishTemporaryDetach() {
+                assertTrue(mEnteredDispatchStartTemporaryDetach);
+                assertTrue(mExitedDispatchStartTemporaryDetach);
+                assertTrue(mEnteredDispatchFinishTemporaryDetach);
+                assertFalse(mExitedDispatchFinishTemporaryDetach);
+                assertTrue(mCalledOnStartTemporaryDetach);
+                assertFalse(mCalledOnFinishTemporaryDetach);
+
+                assertTrue(isTemporarilyDetached());
+
+                mCalledOnFinishTemporaryDetach = true;
+            }
+        };
 
         assertFalse(view.isTemporarilyDetached());
-        assertFalse(view.hasCalledDispatchStartTemporaryDetach());
-        assertFalse(view.hasCalledDispatchFinishTemporaryDetach());
-        assertFalse(view.hasCalledOnStartTemporaryDetach());
-        assertFalse(view.hasCalledOnFinishTemporaryDetach());
 
         runTestOnUiThread(new Runnable() {
             @Override
@@ -3639,10 +3727,8 @@
         getInstrumentation().waitForIdleSync();
 
         assertTrue(view.isTemporarilyDetached());
-        assertTrue(view.hasCalledDispatchStartTemporaryDetach());
-        assertFalse(view.hasCalledDispatchFinishTemporaryDetach());
-        assertTrue(view.hasCalledOnStartTemporaryDetach());
-        assertFalse(view.hasCalledOnFinishTemporaryDetach());
+        assertTrue(exitedDispatchStartTemporaryDetach.get());
+        assertFalse(exitedDispatchFinishTemporaryDetach.get());
 
         runTestOnUiThread(new Runnable() {
             @Override
@@ -3653,10 +3739,8 @@
         getInstrumentation().waitForIdleSync();
 
         assertFalse(view.isTemporarilyDetached());
-        assertTrue(view.hasCalledDispatchStartTemporaryDetach());
-        assertTrue(view.hasCalledDispatchFinishTemporaryDetach());
-        assertTrue(view.hasCalledOnStartTemporaryDetach());
-        assertTrue(view.hasCalledOnFinishTemporaryDetach());
+        assertTrue(exitedDispatchStartTemporaryDetach.get());
+        assertTrue(exitedDispatchFinishTemporaryDetach.get());
     }
 
     public void testKeyPreIme() throws Throwable {