Animate drag handle so it stays centered

Test: visual
Bug: 70799093
Change-Id: Ib804748052ec4b605ad80e4f24d14ed37fd4ba55
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSFooterImpl.java b/packages/SystemUI/src/com/android/systemui/qs/QSFooterImpl.java
index 9c87e1b..7f34acb 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSFooterImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSFooterImpl.java
@@ -21,7 +21,6 @@
 import android.content.Context;
 import android.content.Intent;
 import android.content.res.Configuration;
-import android.content.res.Resources;
 import android.graphics.PorterDuff.Mode;
 import android.graphics.drawable.Drawable;
 import android.graphics.drawable.RippleDrawable;
@@ -47,7 +46,6 @@
 import com.android.systemui.plugins.ActivityStarter;
 import com.android.systemui.qs.TouchAnimator.Builder;
 import com.android.systemui.statusbar.CommandQueue;
-import com.android.systemui.statusbar.phone.ExpandableIndicator;
 import com.android.systemui.statusbar.phone.MultiUserSwitch;
 import com.android.systemui.statusbar.phone.SettingsButton;
 import com.android.systemui.statusbar.policy.DeviceProvisionedController;
@@ -61,6 +59,7 @@
 public class QSFooterImpl extends FrameLayout implements QSFooter,
         OnClickListener, OnUserInfoChangedListener, EmergencyListener,
         SignalCallback, CommandQueue.Callbacks {
+
     private ActivityStarter mActivityStarter;
     private UserInfoController mUserInfoController;
     private SettingsButton mSettingsButton;
@@ -79,16 +78,22 @@
     protected MultiUserSwitch mMultiUserSwitch;
     private ImageView mMultiUserAvatar;
 
-    protected TouchAnimator mSettingsAlpha;
+    protected TouchAnimator mFooterAnimator;
     private float mExpansionAmount;
 
     protected View mEdit;
-    private TouchAnimator mAnimator;
+    private TouchAnimator mSettingsCogAnimator;
 
     private View mActionsContainer;
+    private View mDragHandle;
+    private final int mDragHandleExpandOffset;
 
     public QSFooterImpl(Context context, AttributeSet attrs) {
         super(context, attrs);
+
+        mDragHandleExpandOffset = getResources().
+                getDimensionPixelSize(R.dimen.qs_footer_drag_handle_offset);
+
     }
 
     @Override
@@ -109,6 +114,7 @@
         mMultiUserSwitch = findViewById(R.id.multi_user_switch);
         mMultiUserAvatar = mMultiUserSwitch.findViewById(R.id.multi_user_avatar);
 
+        mDragHandle = findViewById(R.id.qs_drag_handle_view);
         mActionsContainer = findViewById(R.id.qs_footer_actions_container);
 
         // RenderThread is doing more harm than good when touching the header (to expand quick
@@ -130,7 +136,7 @@
         int remaining = (width - numTiles * size) / (numTiles - 1);
         int defSpace = mContext.getResources().getDimensionPixelOffset(R.dimen.default_gear_space);
 
-        mAnimator = new Builder()
+        mSettingsCogAnimator = new Builder()
                 .addFloat(mSettingsContainer, "translationX",
                         isLayoutRtl() ? (remaining - defSpace) : -(remaining - defSpace), 0)
                 .addFloat(mSettingsButton, "rotation", -120, 0)
@@ -152,19 +158,20 @@
     }
 
     private void updateResources() {
-        updateSettingsAnimator();
+        updateFooterAnimator();
     }
 
-    private void updateSettingsAnimator() {
-        mSettingsAlpha = createSettingsAlphaAnimator();
+    private void updateFooterAnimator() {
+        mFooterAnimator = createFooterAnimator();
     }
 
     @Nullable
-    private TouchAnimator createSettingsAlphaAnimator() {
+    private TouchAnimator createFooterAnimator() {
         return new TouchAnimator.Builder()
                 .addFloat(mDivider, "alpha", 0, 1)
                 .addFloat(mCarrierText, "alpha", 0, 1)
                 .addFloat(mActionsContainer, "alpha", 0, 1)
+                .addFloat(mDragHandle, "translationY", 0, -mDragHandleExpandOffset)
                 .build();
     }
 
@@ -183,10 +190,10 @@
     @Override
     public void setExpansion(float headerExpansionFraction) {
         mExpansionAmount = headerExpansionFraction;
-        if (mAnimator != null) mAnimator.setPosition(headerExpansionFraction);
+        if (mSettingsCogAnimator != null) mSettingsCogAnimator.setPosition(headerExpansionFraction);
 
-        if (mSettingsAlpha != null) {
-            mSettingsAlpha.setPosition(headerExpansionFraction);
+        if (mFooterAnimator != null) {
+            mFooterAnimator.setPosition(headerExpansionFraction);
         }
     }