Fade in quick settings when shade opens

Call stack for previous QQS slide-in animation:
- PVC #setExpandedHeightInternal #onHeightUpdated
- NPVC #onHeightUpdated #updateHeader #updateQsExpansion
- QSFragment #setQsExpanson (which calls NPVC #getHeaderTranslation,
which moved QQS down/up on shade open/close)

This change uses the setup above and fades QQS in/out
depending on whether the header translation is 0.

Bug: 172289889
Test: open shade, qqs fades in
      close shade, qqs fades out

Change-Id: I5b48a450cc2da6dab8c997c9a6a395d54c2b9067
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSAnimator.java b/packages/SystemUI/src/com/android/systemui/qs/QSAnimator.java
index e9207f1..bba8579 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSAnimator.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSAnimator.java
@@ -29,6 +29,7 @@
 import com.android.systemui.qs.TouchAnimator.Builder;
 import com.android.systemui.qs.TouchAnimator.Listener;
 import com.android.systemui.qs.dagger.QSScope;
+import com.android.systemui.statusbar.CrossFadeHelper;
 import com.android.systemui.tuner.TunerService;
 import com.android.systemui.tuner.TunerService.Tunable;
 
@@ -49,7 +50,9 @@
     private static final String MOVE_FULL_ROWS = "sysui_qs_move_whole_rows";
 
     public static final float EXPANDED_TILE_DELAY = .86f;
-
+    private static final long QQS_FADE_IN_DURATION = 200L;
+    // Fade out faster than fade in to finish before QQS hides.
+    private static final long QQS_FADE_OUT_DURATION = 50L;
 
     private final ArrayList<View> mAllViews = new ArrayList<>();
     /**
@@ -77,6 +80,7 @@
     private TouchAnimator mBrightnessAnimator;
     private boolean mNeedsAnimatorUpdate = false;
 
+    private boolean mToShowing;
     private boolean mOnKeyguard;
 
     private boolean mAllowFancy;
@@ -133,6 +137,18 @@
         }
     }
 
+    void startAlphaAnimation(boolean show) {
+        if (show == mToShowing) {
+            return;
+        }
+        mToShowing = show;
+        if (show) {
+            CrossFadeHelper.fadeIn(mQs.getView(), QQS_FADE_IN_DURATION, 0 /* delay */);
+        } else {
+            CrossFadeHelper.fadeOut(mQs.getView(), QQS_FADE_OUT_DURATION, 0 /* delay */,
+                    null /* endRunnable */);
+        }
+    }
 
     /**
      * Sets whether or not the keyguard is currently being shown with a collapsed header.
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSContainerImpl.java b/packages/SystemUI/src/com/android/systemui/qs/QSContainerImpl.java
index 16e9590..562ac64 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSContainerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSContainerImpl.java
@@ -91,6 +91,11 @@
         setImportantForAccessibility(IMPORTANT_FOR_ACCESSIBILITY_NO);
     }
 
+    @Override
+    public boolean hasOverlappingRendering() {
+        return false;
+    }
+
     void onMediaVisibilityChanged(boolean qsVisible) {
         mAnimateBottomOnNextLayout = qsVisible;
     }
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java b/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java
index dbdd04a..9a0827d 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java
@@ -186,7 +186,7 @@
                 (v, left, top, right, bottom, oldLeft, oldTop, oldRight, oldBottom) -> {
                     boolean sizeChanged = (oldTop - oldBottom) != (top - bottom);
                     if (sizeChanged) {
-                        setQsExpansion(mLastQSExpansion, mLastQSExpansion);
+                        setQsExpansion(mLastQSExpansion, mLastHeaderTranslation);
                     }
                 });
     }
@@ -391,6 +391,9 @@
     @Override
     public void setQsExpansion(float expansion, float headerTranslation) {
         if (DEBUG) Log.d(TAG, "setQSExpansion " + expansion + " " + headerTranslation);
+        if (mQSAnimator != null) {
+            mQSAnimator.startAlphaAnimation(headerTranslation == 0 /* show */);
+        }
         mContainer.setExpansion(expansion);
         final float translationScaleY = expansion - 1;
         boolean onKeyguardAndExpanded = isKeyguardShowing() && !mShowCollapsedOnKeyguard;