Auto dim the nav bar to help prevent diff aging

Test: runtest systemui
Bug: 63630024
Change-Id: If2a6c0934f8751f82c027dbb3b5f103a34dc78d4
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/BarTransitions.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/BarTransitions.java
index f3c2bc5..f379a46 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/BarTransitions.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/BarTransitions.java
@@ -75,6 +75,10 @@
         return mMode;
     }
 
+    public void setAutoDim(boolean autoDim) {
+        // Default is don't care.
+    }
+
     /**
      * @param alwaysOpaque if {@code true}, the bar's background will always be opaque, regardless
      *         of what mode it is currently set to.
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarTransitions.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarTransitions.java
index cb925d5..f3ca66f 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarTransitions.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarTransitions.java
@@ -32,6 +32,7 @@
     private final LightBarTransitionsController mLightTransitionsController;
 
     private boolean mLightsOut;
+    private boolean mAutoDim;
 
     public NavigationBarTransitions(NavigationBarView view) {
         super(view, R.drawable.nav_background);
@@ -44,7 +45,19 @@
 
     public void init() {
         applyModeBackground(-1, getMode(), false /*animate*/);
-        applyMode(getMode(), false /*animate*/, true /*force*/);
+        applyLightsOut(false /*animate*/, true /*force*/);
+    }
+
+    @Override
+    public void setAutoDim(boolean autoDim) {
+        if (mAutoDim == autoDim) return;
+        mAutoDim = autoDim;
+        applyLightsOut(true, false);
+    }
+
+    @Override
+    protected boolean isLightsOut(int mode) {
+        return super.isLightsOut(mode) || mAutoDim;
     }
 
     public LightBarTransitionsController getLightTransitionsController() {
@@ -54,13 +67,12 @@
     @Override
     protected void onTransition(int oldMode, int newMode, boolean animate) {
         super.onTransition(oldMode, newMode, animate);
-        applyMode(newMode, animate, false /*force*/);
+        applyLightsOut(animate, false /*force*/);
     }
 
-    private void applyMode(int mode, boolean animate, boolean force) {
-
+    private void applyLightsOut(boolean animate, boolean force) {
         // apply to lights out
-        applyLightsOut(isLightsOut(mode), animate, force);
+        applyLightsOut(isLightsOut(getMode()), animate, force);
     }
 
     private void applyLightsOut(boolean lightsOut, boolean animate, boolean force) {
@@ -86,7 +98,6 @@
         }
     }
 
-
     public void reapplyDarkIntensity() {
         applyDarkIntensity(mLightTransitionsController.getCurrentDarkIntensity());
     }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
index 75db6e9..0ce2bcf 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
@@ -558,14 +558,12 @@
     protected DozeScrimController mDozeScrimController;
     private final UiOffloadThread mUiOffloadThread = Dependency.get(UiOffloadThread.class);
 
-    private final Runnable mAutohide = new Runnable() {
-        @Override
-        public void run() {
-            int requested = mSystemUiVisibility & ~STATUS_OR_NAV_TRANSIENT;
-            if (mSystemUiVisibility != requested) {
-                notifyUiVisibilityChanged(requested);
-            }
-        }};
+    private final Runnable mAutohide = () -> {
+        int requested = mSystemUiVisibility & ~STATUS_OR_NAV_TRANSIENT;
+        if (mSystemUiVisibility != requested) {
+            notifyUiVisibilityChanged(requested);
+        }
+    };
 
     private boolean mWaitingForKeyguardExit;
     protected boolean mDozing;
@@ -3322,6 +3320,7 @@
         } else {
             cancelAutohide();
         }
+        touchAutoDim();
     }
 
     protected int computeStatusBarMode(int oldVal, int newVal) {
@@ -3407,6 +3406,7 @@
             dismissVolumeDialog();
         }
         checkBarModes();
+        touchAutoDim();
     }
 
     private void dismissVolumeDialog() {
@@ -3438,6 +3438,16 @@
         mHandler.postDelayed(mAutohide, AUTOHIDE_TIMEOUT_MS);
     }
 
+    public void touchAutoDim() {
+        if (mNavigationBar != null) {
+            mNavigationBar.getBarTransitions().setAutoDim(false);
+        }
+        mHandler.removeCallbacks(mAutoDim);
+        if (mState != StatusBarState.KEYGUARD && mState != StatusBarState.SHADE_LOCKED) {
+            mHandler.postDelayed(mAutoDim, AUTOHIDE_TIMEOUT_MS);
+        }
+    }
+
     void checkUserAutohide(View v, MotionEvent event) {
         if ((mSystemUiVisibility & STATUS_OR_NAV_TRANSIENT) != 0  // a transient bar is revealed
                 && event.getAction() == MotionEvent.ACTION_OUTSIDE // touch outside the source bar
@@ -4856,6 +4866,7 @@
         updateReportRejectedTouchVisibility();
         updateDozing();
         updateTheme();
+        touchAutoDim();
         mNotificationShelf.setStatusBarState(state);
     }
 
@@ -5371,6 +5382,7 @@
 
     @Override
     public void appTransitionFinished() {
+        touchAutoDim();
         EventBus.getDefault().send(new AppTransitionFinishedEvent());
     }
 
@@ -7560,4 +7572,10 @@
         }
     }
     // End Extra BaseStatusBarMethods.
+
+    private final Runnable mAutoDim = () -> {
+        if (mNavigationBar != null) {
+            mNavigationBar.getBarTransitions().setAutoDim(true);
+        }
+    };
 }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/DeadZone.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/DeadZone.java
index 13ee23f..06040e2 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/DeadZone.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/DeadZone.java
@@ -28,6 +28,8 @@
 import android.view.View;
 
 import com.android.systemui.R;
+import com.android.systemui.SysUiServiceProvider;
+import com.android.systemui.statusbar.phone.StatusBar;
 
 /**
  * The "dead zone" consumes unintentional taps along the top edge of the navigation bar.
@@ -44,6 +46,7 @@
     public static final int VERTICAL = 1;  // Consume taps along the left edge.
 
     private static final boolean CHATTY = true; // print to logcat when we eat a click
+    private final StatusBar mStatusBar;
 
     private boolean mShouldFlash;
     private float mFlashFrac = 0f;
@@ -88,6 +91,7 @@
                     + (mVertical ? " vertical" : " horizontal"));
 
         setFlashOnTouchCapture(context.getResources().getBoolean(R.bool.config_dead_zone_flash));
+        mStatusBar = SysUiServiceProvider.getComponent(context, StatusBar.class);
     }
 
     static float lerp(float a, float b, float f) {
@@ -132,6 +136,7 @@
             if (DEBUG) {
                 Slog.v(TAG, this + " ACTION_DOWN: " + event.getX() + "," + event.getY());
             }
+            if (mStatusBar != null) mStatusBar.touchAutoDim();
             int size = (int) getSize(event.getEventTime());
             // In the vertical orientation consume taps along the left edge.
             // In horizontal orientation consume taps along the top edge.
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NavigationBarTransitionsTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NavigationBarTransitionsTest.java
new file mode 100644
index 0000000..0c1baaa
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NavigationBarTransitionsTest.java
@@ -0,0 +1,69 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the
+ * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the specific language governing
+ * permissions and limitations under the License.
+ */
+
+package com.android.systemui.statusbar.phone;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.when;
+
+import android.support.test.filters.SmallTest;
+import android.testing.AndroidTestingRunner;
+import android.testing.TestableLooper.RunWithLooper;
+
+import com.android.systemui.SysuiTestCase;
+import com.android.systemui.statusbar.CommandQueue;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@RunWith(AndroidTestingRunner.class)
+@RunWithLooper
+@SmallTest
+public class NavigationBarTransitionsTest extends SysuiTestCase {
+
+    private NavigationBarTransitions mTransitions;
+
+    @Before
+    public void setup() {
+        mContext.putComponent(CommandQueue.class, mock(CommandQueue.class));
+        NavigationBarView navBar = spy(new NavigationBarView(mContext, null));
+        when(navBar.getCurrentView()).thenReturn(navBar);
+        when(navBar.findViewById(anyInt())).thenReturn(navBar);
+        mTransitions = new NavigationBarTransitions(navBar);
+    }
+
+    @Test
+    public void setIsLightsOut_NoAutoDim() {
+        mTransitions.setAutoDim(false);
+
+        assertFalse(mTransitions.isLightsOut(BarTransitions.MODE_OPAQUE));
+
+        assertTrue(mTransitions.isLightsOut(BarTransitions.MODE_LIGHTS_OUT));
+    }
+
+    @Test
+    public void setIsLightsOut_AutoDim() {
+        mTransitions.setAutoDim(true);
+
+        assertTrue(mTransitions.isLightsOut(BarTransitions.MODE_OPAQUE));
+
+        assertTrue(mTransitions.isLightsOut(BarTransitions.MODE_LIGHTS_OUT));
+    }
+
+}
\ No newline at end of file