Merge "Merge "TEMP" am: 844e7e7f6b am: 1888a8a8d1 am: a2ab613738" into sc-dev
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/events/PrivacyDotViewController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/events/PrivacyDotViewController.kt
index 2481ed4..5f10e55 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/events/PrivacyDotViewController.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/events/PrivacyDotViewController.kt
@@ -29,13 +29,11 @@
 import com.android.systemui.dagger.SysUISingleton
 import com.android.systemui.dagger.qualifiers.Main
 import com.android.systemui.plugins.statusbar.StatusBarStateController
+import com.android.systemui.statusbar.StatusBarState.SHADE
+import com.android.systemui.statusbar.StatusBarState.SHADE_LOCKED
 import com.android.systemui.statusbar.phone.StatusBarLocationPublisher
 import com.android.systemui.statusbar.phone.StatusBarMarginUpdatedListener
 import com.android.systemui.util.concurrency.DelayableExecutor
-import com.android.systemui.util.leak.RotationUtils.ROTATION_LANDSCAPE
-import com.android.systemui.util.leak.RotationUtils.ROTATION_NONE
-import com.android.systemui.util.leak.RotationUtils.ROTATION_SEASCAPE
-import com.android.systemui.util.leak.RotationUtils.ROTATION_UPSIDE_DOWN
 
 import java.lang.IllegalStateException
 import java.util.concurrent.Executor
@@ -50,7 +48,7 @@
  * will have its gravity set towards the corner (i.e., top-right corner gets top|right gravity), and
  * the contained ImageView will be set to center_vertical and away from the corner horizontally. The
  * Views will match the status bar top padding and status bar height so that the dot can appear to
- * reside directly after the status bar system contents (basically to the right of the battery).
+ * reside directly after the status bar system contents (basically after the battery).
  *
  * NOTE: any operation that modifies views directly must run on the provided executor, because
  * these views are owned by ScreenDecorations and it runs in its own thread
@@ -85,21 +83,27 @@
 
     // Privacy dots are created in ScreenDecoration's UiThread, which is not the main thread
     private var uiExecutor: DelayableExecutor? = null
-    private var e: DelayableExecutor? = null
+
+    private val marginListener: StatusBarMarginUpdatedListener =
+            object : StatusBarMarginUpdatedListener {
+        override fun onStatusBarMarginUpdated(marginLeft: Int, marginRight: Int) {
+            setStatusBarMargins(marginLeft, marginRight)
+        }
+    }
 
     private val views: Sequence<View>
         get() = if (!this::tl.isInitialized) sequenceOf() else sequenceOf(tl, tr, br, bl)
 
     init {
-        locationPublisher.addCallback(object : StatusBarMarginUpdatedListener {
-            override fun onStatusBarMarginUpdated(marginLeft: Int, marginRight: Int) {
-                setStatusBarMargins(marginLeft, marginRight)
-            }
-        })
+        locationPublisher.addCallback(marginListener)
 
         stateController.addCallback(object : StatusBarStateController.StateListener {
             override fun onExpandedChanged(isExpanded: Boolean) {
-                setStatusBarExpanded(isExpanded)
+                updateStatusBarState()
+            }
+
+            override fun onStateChanged(newState: Int) {
+                updateStatusBarState()
             }
         })
     }
@@ -108,6 +112,13 @@
         uiExecutor = e
     }
 
+    fun setQsExpanded(expanded: Boolean) {
+        dlog("setQsExpanded $expanded")
+        synchronized(lock) {
+            nextViewState = nextViewState.copy(qsExpanded = expanded)
+        }
+    }
+
     @UiThread
     fun setNewRotation(rot: Int) {
         dlog("updateRotation: $rot")
@@ -125,8 +136,8 @@
         val index = newCorner.cornerIndex()
 
         val h = when (rot) {
-            ROTATION_NONE, ROTATION_UPSIDE_DOWN -> sbHeightPortrait
-            ROTATION_LANDSCAPE, ROTATION_SEASCAPE -> sbHeightLandscape
+            0, 2 -> sbHeightPortrait
+            1, 3 -> sbHeightLandscape
             else -> 0
         }
         synchronized(lock) {
@@ -326,15 +337,22 @@
         }
     }
 
-    /**
-     *  We won't show the dot when quick settings is showing
-     */
-    private fun setStatusBarExpanded(expanded: Boolean) {
+    private fun updateStatusBarState() {
         synchronized(lock) {
-            nextViewState = nextViewState.copy(hideDotForQuickSettings = expanded)
+            nextViewState = nextViewState.copy(shadeExpanded = isShadeInQs())
         }
     }
 
+    /**
+     * If we are unlocked with an expanded shade, QS is showing. On keyguard, the shade is always
+     * expanded so we use other signals from the panel view controller to know if QS is expanded
+     */
+    @GuardedBy("lock")
+    private fun isShadeInQs(): Boolean {
+        return (stateController.isExpanded && stateController.state == SHADE) ||
+                (stateController.state == SHADE_LOCKED)
+    }
+
     private fun scheduleUpdate() {
         dlog("scheduleUpdate: ")
 
@@ -431,13 +449,20 @@
     }
 }
 
+private fun vlog(s: String) {
+    if (DEBUG_VERBOSE) {
+        Log.d(TAG, s)
+    }
+}
+
 const val TOP_LEFT = 0
 const val TOP_RIGHT = 1
 const val BOTTOM_RIGHT = 2
 const val BOTTOM_LEFT = 3
 private const val DURATION = 160L
 private const val TAG = "PrivacyDotViewController"
-private const val DEBUG = false
+private const val DEBUG = true
+private const val DEBUG_VERBOSE = false
 
 private fun Int.toGravity(): Int {
     return when (this) {
@@ -460,10 +485,10 @@
 }
 
 private data class ViewState(
-    // don't @ me with names
     val systemPrivacyEventIsActive: Boolean = false,
-    val hideDotForQuickSettings: Boolean = false,
-    val statusBarExpanded: Boolean = false,
+    val shadeExpanded: Boolean = false,
+    val qsExpanded: Boolean = false,
+
     val rotation: Int = 0,
     val height: Int = 0,
     val marginLeft: Int = 0,
@@ -472,7 +497,7 @@
     val designatedCorner: View? = null
 ) {
     fun shouldShowDot(): Boolean {
-        return systemPrivacyEventIsActive && !hideDotForQuickSettings
+        return systemPrivacyEventIsActive && !shadeExpanded && !qsExpanded
     }
 
     fun needsLayout(other: ViewState): Boolean {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java
index c0d713b..16abd12 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java
@@ -122,6 +122,7 @@
 import com.android.systemui.statusbar.StatusBarState;
 import com.android.systemui.statusbar.SysuiStatusBarStateController;
 import com.android.systemui.statusbar.VibratorHelper;
+import com.android.systemui.statusbar.events.PrivacyDotViewController;
 import com.android.systemui.statusbar.notification.AnimatableProperty;
 import com.android.systemui.statusbar.notification.ConversationNotificationManager;
 import com.android.systemui.statusbar.notification.DynamicPrivacyController;
@@ -306,6 +307,7 @@
     private final QSDetailDisplayer mQSDetailDisplayer;
     private final FeatureFlags mFeatureFlags;
     private final ScrimController mScrimController;
+    private final PrivacyDotViewController mPrivacyDotViewController;
 
     // Maximum # notifications to show on Keyguard; extras will be collapsed in an overflow card.
     // If there are exactly 1 + mMaxKeyguardNotifications, then still shows all notifications
@@ -602,6 +604,7 @@
             FeatureFlags featureFlags,
             QuickAccessWalletClient quickAccessWalletClient,
             KeyguardMediaController keyguardMediaController,
+            PrivacyDotViewController privacyDotViewController,
             @Main Executor uiExecutor) {
         super(view, falsingManager, dozeLog, keyguardStateController,
                 (SysuiStatusBarStateController) statusBarStateController, vibratorHelper,
@@ -610,6 +613,7 @@
         mView = view;
         mVibratorHelper = vibratorHelper;
         mKeyguardMediaController = keyguardMediaController;
+        mPrivacyDotViewController = privacyDotViewController;
         mMetricsLogger = metricsLogger;
         mActivityManager = activityManager;
         mConfigurationController = configurationController;
@@ -1895,6 +1899,7 @@
             mKeyguardBypassController.setQSExpanded(expanded);
             mStatusBarKeyguardViewManager.setQsExpanded(expanded);
             mLockIconViewController.setQsExpanded(expanded);
+            mPrivacyDotViewController.setQsExpanded(expanded);
         }
     }
 
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationPanelViewTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationPanelViewTest.java
index 4bac762..45761df 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationPanelViewTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationPanelViewTest.java
@@ -89,6 +89,7 @@
 import com.android.systemui.statusbar.StatusBarStateControllerImpl;
 import com.android.systemui.statusbar.SysuiStatusBarStateController;
 import com.android.systemui.statusbar.VibratorHelper;
+import com.android.systemui.statusbar.events.PrivacyDotViewController;
 import com.android.systemui.statusbar.notification.ConversationNotificationManager;
 import com.android.systemui.statusbar.notification.DynamicPrivacyController;
 import com.android.systemui.statusbar.notification.NotificationEntryManager;
@@ -243,6 +244,8 @@
     private QuickAccessWalletClient mQuickAccessWalletClient;
     @Mock
     private KeyguardMediaController mKeyguardMediaController;
+    @Mock
+    private PrivacyDotViewController mPrivacyDotViewController;
 
     private SysuiStatusBarStateController mStatusBarStateController;
     private NotificationPanelViewController mNotificationPanelViewController;
@@ -351,6 +354,7 @@
                 mFeatureFlags,
                 mQuickAccessWalletClient,
                 mKeyguardMediaController,
+                mPrivacyDotViewController,
                 new FakeExecutor(new FakeSystemClock()));
         mNotificationPanelViewController.initDependencies(
                 mStatusBar,