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
+        }
+    }
 }