Disable click on privacy chip before provision
Test: atest QuickStatusBarHeaderControllerTest
Bug: 253043058
Change-Id: I8099dfd259b149cd18509677d623de7a352f5de0
Merged-In: I9c8f642976f3332f4d5c9db89a4917dae501f251
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeaderController.java b/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeaderController.java
index 18d6e64..dc9f2ce 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeaderController.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeaderController.java
@@ -41,6 +41,7 @@
import com.android.systemui.statusbar.phone.StatusBarIconController;
import com.android.systemui.statusbar.phone.StatusIconContainer;
import com.android.systemui.statusbar.policy.Clock;
+import com.android.systemui.statusbar.policy.DeviceProvisionedController;
import com.android.systemui.statusbar.policy.VariableDateViewController;
import com.android.systemui.util.ViewController;
@@ -71,6 +72,7 @@
private final PrivacyDialogController mPrivacyDialogController;
private final QSExpansionPathInterpolator mQSExpansionPathInterpolator;
private final FeatureFlags mFeatureFlags;
+ private final DeviceProvisionedController mDeviceProvisionedController;
private final VariableDateViewController mVariableDateViewControllerDateView;
private final VariableDateViewController mVariableDateViewControllerClockDateView;
@@ -79,6 +81,7 @@
private boolean mMicCameraIndicatorsEnabled;
private boolean mLocationIndicatorsEnabled;
private boolean mPrivacyChipLogged;
+ private volatile boolean mDeviceProvisioned;
private final String mCameraSlot;
private final String mMicSlot;
private final String mLocationSlot;
@@ -119,6 +122,7 @@
@Override
public void onClick(View v) {
if (v == mPrivacyChip) {
+ if (!mDeviceProvisioned) return;
// If the privacy chip is visible, it means there were some indicators
mUiEventLogger.log(PrivacyChipEvent.ONGOING_INDICATORS_CHIP_CLICK);
mPrivacyDialogController.showDialog(getContext());
@@ -126,6 +130,14 @@
}
};
+ private DeviceProvisionedController.DeviceProvisionedListener mDeviceProvisionedListener =
+ new DeviceProvisionedController.DeviceProvisionedListener() {
+ @Override
+ public void onDeviceProvisionedChanged() {
+ mDeviceProvisioned = mDeviceProvisionedController.isDeviceProvisioned();
+ }
+ };
+
@Inject
QuickStatusBarHeaderController(QuickStatusBarHeader view,
PrivacyItemController privacyItemController,
@@ -139,7 +151,8 @@
PrivacyDialogController privacyDialogController,
QSExpansionPathInterpolator qsExpansionPathInterpolator,
FeatureFlags featureFlags,
- VariableDateViewController.Factory variableDateViewControllerFactory) {
+ VariableDateViewController.Factory variableDateViewControllerFactory,
+ DeviceProvisionedController deviceProvisionedController) {
super(view);
mPrivacyItemController = privacyItemController;
mActivityStarter = activityStarter;
@@ -151,6 +164,7 @@
mPrivacyDialogController = privacyDialogController;
mQSExpansionPathInterpolator = qsExpansionPathInterpolator;
mFeatureFlags = featureFlags;
+ mDeviceProvisionedController = deviceProvisionedController;
mQSCarrierGroupController = qsCarrierGroupControllerBuilder
.setQSCarrierGroup(mView.findViewById(R.id.carrier_group))
@@ -182,6 +196,7 @@
@Override
protected void onViewAttached() {
+ mDeviceProvisionedController.addCallback(mDeviceProvisionedListener);
mPrivacyChip.setOnClickListener(mOnClickListener);
mMicCameraIndicatorsEnabled = mPrivacyItemController.getMicCameraAvailable();
@@ -224,6 +239,7 @@
@Override
protected void onViewDetached() {
mColorExtractor.removeOnColorsChangedListener(mOnColorsChangedListener);
+ mDeviceProvisionedController.removeCallback(mDeviceProvisionedListener);
mPrivacyChip.setOnClickListener(null);
mStatusBarIconController.removeIconGroup(mIconManager);
mQSCarrierGroupController.setOnSingleCarrierChangedListener(null);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/QuickStatusBarHeaderControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/qs/QuickStatusBarHeaderControllerTest.kt
index 8b7e20e..552f60d 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/QuickStatusBarHeaderControllerTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/QuickStatusBarHeaderControllerTest.kt
@@ -36,6 +36,7 @@
import com.android.systemui.statusbar.phone.StatusBarIconController
import com.android.systemui.statusbar.phone.StatusIconContainer
import com.android.systemui.statusbar.policy.Clock
+import com.android.systemui.statusbar.policy.DeviceProvisionedController
import com.android.systemui.statusbar.policy.VariableDateView
import com.android.systemui.statusbar.policy.VariableDateViewController
import com.android.systemui.util.mockito.any
@@ -50,6 +51,7 @@
import org.mockito.ArgumentMatchers.anyInt
import org.mockito.Mock
import org.mockito.Mockito.`when`
+import org.mockito.Mockito.never
import org.mockito.Mockito.reset
import org.mockito.Mockito.verify
import org.mockito.MockitoAnnotations
@@ -103,6 +105,7 @@
@Mock
private lateinit var featureFlags: FeatureFlags
+ private lateinit var deviceProvisionedController: FakeDeviceProvisionedController
private val qsExpansionPathInterpolator = QSExpansionPathInterpolator()
private lateinit var controller: QuickStatusBarHeaderController
@@ -123,6 +126,9 @@
`when`(view.isAttachedToWindow).thenReturn(true)
`when`(view.context).thenReturn(context)
+ deviceProvisionedController = FakeDeviceProvisionedController()
+ deviceProvisionedController.provisioned = true
+
cameraSlotName = mContext.resources.getString(
com.android.internal.R.string.status_bar_camera)
microphoneSlotName = mContext.resources.getString(
@@ -144,7 +150,8 @@
privacyDialogController,
qsExpansionPathInterpolator,
featureFlags,
- variableDateViewControllerFactory
+ variableDateViewControllerFactory,
+ deviceProvisionedController
)
}
@@ -279,6 +286,34 @@
verify(view).setIsSingleCarrier(false)
}
+ @Test
+ fun testDeviceNotProvisionedBeforeInit_clickOnChipDoesntShowDialog() {
+ deviceProvisionedController.provisioned = false
+ controller.init()
+
+ val captor = argumentCaptor<View.OnClickListener>()
+ verify(privacyChip).setOnClickListener(capture(captor))
+
+ captor.value.onClick(privacyChip)
+
+ verify(privacyDialogController, never()).showDialog(any(Context::class.java))
+ }
+
+ @Test
+ fun testDeviceNotProvisionedBeforeInit_provisionedAfter_clickOnChipDoesntShowDialog() {
+ deviceProvisionedController.provisioned = false
+ controller.init()
+
+ deviceProvisionedController.provisioned = true
+
+ val captor = argumentCaptor<View.OnClickListener>()
+ verify(privacyChip).setOnClickListener(capture(captor))
+
+ captor.value.onClick(privacyChip)
+
+ verify(privacyDialogController).showDialog(any(Context::class.java))
+ }
+
private fun stubViews() {
`when`(view.findViewById<View>(anyInt())).thenReturn(mockView)
`when`(view.findViewById<QSCarrierGroup>(R.id.carrier_group)).thenReturn(qsCarrierGroup)
@@ -293,4 +328,40 @@
`when`(privacyItemController.micCameraAvailable).thenReturn(micCamera)
`when`(privacyItemController.locationAvailable).thenReturn(location)
}
+
+ // We only care about device provisioned
+ class FakeDeviceProvisionedController : DeviceProvisionedController {
+ val callbacks = mutableSetOf<DeviceProvisionedController.DeviceProvisionedListener>()
+ var provisioned = false
+ set(value) {
+ if (field != value) {
+ field = value
+ callbacks.forEach { it.onDeviceProvisionedChanged() }
+ }
+ }
+
+ override fun addCallback(listener: DeviceProvisionedController.DeviceProvisionedListener) {
+ if (callbacks.add(listener)) {
+ listener.onDeviceProvisionedChanged()
+ }
+ }
+
+ override fun removeCallback(
+ listener: DeviceProvisionedController.DeviceProvisionedListener
+ ) {
+ callbacks.remove(listener)
+ }
+
+ override fun isDeviceProvisioned(): Boolean {
+ return provisioned
+ }
+
+ override fun isUserSetup(currentUser: Int): Boolean {
+ return true
+ }
+
+ override fun getCurrentUser(): Int {
+ return 0
+ }
+ }
}