Show dot on keyguard but not with QS expanded

Unfortunately we just have to put a strong reference to the privacy dot
view controller from the notification panel since there is no great way
of knowing whether or not QS is expanded.

Also reverted using the RotationUtils constants since they differ from
the device rotation constants. We should probably fix that...

Test: manual
Fixes: 187659664
Change-Id: Ib1f802850948436925c52261ebe5afc6b52167ee
This commit is contained in:
Evan Laird
2021-05-11 17:21:34 -04:00
parent 7b526955cd
commit 5bbce971f2
3 changed files with 58 additions and 24 deletions

View File

@@ -29,13 +29,11 @@ import com.android.systemui.R
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 @@ import javax.inject.Inject
* 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 @@ class PrivacyDotViewController @Inject constructor(
// 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 @@ class PrivacyDotViewController @Inject constructor(
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 @@ class PrivacyDotViewController @Inject constructor(
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 @@ class PrivacyDotViewController @Inject constructor(
}
}
/**
* 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 dlog(s: String) {
}
}
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 fun Int.innerGravity(): Int {
}
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 @@ private data class ViewState(
val designatedCorner: View? = null
) {
fun shouldShowDot(): Boolean {
return systemPrivacyEventIsActive && !hideDotForQuickSettings
return systemPrivacyEventIsActive && !shadeExpanded && !qsExpanded
}
fun needsLayout(other: ViewState): Boolean {

View File

@@ -122,6 +122,7 @@ import com.android.systemui.statusbar.RemoteInputController;
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 @@ public class NotificationPanelViewController extends PanelViewController {
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 @@ public class NotificationPanelViewController extends PanelViewController {
FeatureFlags featureFlags,
QuickAccessWalletClient quickAccessWalletClient,
KeyguardMediaController keyguardMediaController,
PrivacyDotViewController privacyDotViewController,
@Main Executor uiExecutor) {
super(view, falsingManager, dozeLog, keyguardStateController,
(SysuiStatusBarStateController) statusBarStateController, vibratorHelper,
@@ -610,6 +613,7 @@ public class NotificationPanelViewController extends PanelViewController {
mView = view;
mVibratorHelper = vibratorHelper;
mKeyguardMediaController = keyguardMediaController;
mPrivacyDotViewController = privacyDotViewController;
mMetricsLogger = metricsLogger;
mActivityManager = activityManager;
mConfigurationController = configurationController;
@@ -1895,6 +1899,7 @@ public class NotificationPanelViewController extends PanelViewController {
mKeyguardBypassController.setQSExpanded(expanded);
mStatusBarKeyguardViewManager.setQsExpanded(expanded);
mLockIconViewController.setQsExpanded(expanded);
mPrivacyDotViewController.setQsExpanded(expanded);
}
}

View File

@@ -89,6 +89,7 @@ import com.android.systemui.statusbar.PulseExpansionHandler;
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 @@ public class NotificationPanelViewTest extends SysuiTestCase {
private QuickAccessWalletClient mQuickAccessWalletClient;
@Mock
private KeyguardMediaController mKeyguardMediaController;
@Mock
private PrivacyDotViewController mPrivacyDotViewController;
private SysuiStatusBarStateController mStatusBarStateController;
private NotificationPanelViewController mNotificationPanelViewController;
@@ -351,6 +354,7 @@ public class NotificationPanelViewTest extends SysuiTestCase {
mFeatureFlags,
mQuickAccessWalletClient,
mKeyguardMediaController,
mPrivacyDotViewController,
new FakeExecutor(new FakeSystemClock()));
mNotificationPanelViewController.initDependencies(
mStatusBar,