Disable click on privacy chip before provision

Test: atest QuickStatusBarHeaderControllerTest
Bug: 253043058
Change-Id: I8099dfd259b149cd18509677d623de7a352f5de0
Merged-In: I9c8f642976f3332f4d5c9db89a4917dae501f251
This commit is contained in:
Fabian Kozynski
2022-11-02 16:20:19 -04:00
parent 35bd1367af
commit bf4d73f6ba
2 changed files with 89 additions and 2 deletions

View File

@@ -41,6 +41,7 @@ import com.android.systemui.statusbar.FeatureFlags;
import com.android.systemui.statusbar.phone.StatusBarIconController; import com.android.systemui.statusbar.phone.StatusBarIconController;
import com.android.systemui.statusbar.phone.StatusIconContainer; import com.android.systemui.statusbar.phone.StatusIconContainer;
import com.android.systemui.statusbar.policy.Clock; 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.statusbar.policy.VariableDateViewController;
import com.android.systemui.util.ViewController; import com.android.systemui.util.ViewController;
@@ -71,6 +72,7 @@ class QuickStatusBarHeaderController extends ViewController<QuickStatusBarHeader
private final PrivacyDialogController mPrivacyDialogController; private final PrivacyDialogController mPrivacyDialogController;
private final QSExpansionPathInterpolator mQSExpansionPathInterpolator; private final QSExpansionPathInterpolator mQSExpansionPathInterpolator;
private final FeatureFlags mFeatureFlags; private final FeatureFlags mFeatureFlags;
private final DeviceProvisionedController mDeviceProvisionedController;
private final VariableDateViewController mVariableDateViewControllerDateView; private final VariableDateViewController mVariableDateViewControllerDateView;
private final VariableDateViewController mVariableDateViewControllerClockDateView; private final VariableDateViewController mVariableDateViewControllerClockDateView;
@@ -79,6 +81,7 @@ class QuickStatusBarHeaderController extends ViewController<QuickStatusBarHeader
private boolean mMicCameraIndicatorsEnabled; private boolean mMicCameraIndicatorsEnabled;
private boolean mLocationIndicatorsEnabled; private boolean mLocationIndicatorsEnabled;
private boolean mPrivacyChipLogged; private boolean mPrivacyChipLogged;
private volatile boolean mDeviceProvisioned;
private final String mCameraSlot; private final String mCameraSlot;
private final String mMicSlot; private final String mMicSlot;
private final String mLocationSlot; private final String mLocationSlot;
@@ -119,6 +122,7 @@ class QuickStatusBarHeaderController extends ViewController<QuickStatusBarHeader
@Override @Override
public void onClick(View v) { public void onClick(View v) {
if (v == mPrivacyChip) { if (v == mPrivacyChip) {
if (!mDeviceProvisioned) return;
// If the privacy chip is visible, it means there were some indicators // If the privacy chip is visible, it means there were some indicators
mUiEventLogger.log(PrivacyChipEvent.ONGOING_INDICATORS_CHIP_CLICK); mUiEventLogger.log(PrivacyChipEvent.ONGOING_INDICATORS_CHIP_CLICK);
mPrivacyDialogController.showDialog(getContext()); mPrivacyDialogController.showDialog(getContext());
@@ -126,6 +130,14 @@ class QuickStatusBarHeaderController extends ViewController<QuickStatusBarHeader
} }
}; };
private DeviceProvisionedController.DeviceProvisionedListener mDeviceProvisionedListener =
new DeviceProvisionedController.DeviceProvisionedListener() {
@Override
public void onDeviceProvisionedChanged() {
mDeviceProvisioned = mDeviceProvisionedController.isDeviceProvisioned();
}
};
@Inject @Inject
QuickStatusBarHeaderController(QuickStatusBarHeader view, QuickStatusBarHeaderController(QuickStatusBarHeader view,
PrivacyItemController privacyItemController, PrivacyItemController privacyItemController,
@@ -139,7 +151,8 @@ class QuickStatusBarHeaderController extends ViewController<QuickStatusBarHeader
PrivacyDialogController privacyDialogController, PrivacyDialogController privacyDialogController,
QSExpansionPathInterpolator qsExpansionPathInterpolator, QSExpansionPathInterpolator qsExpansionPathInterpolator,
FeatureFlags featureFlags, FeatureFlags featureFlags,
VariableDateViewController.Factory variableDateViewControllerFactory) { VariableDateViewController.Factory variableDateViewControllerFactory,
DeviceProvisionedController deviceProvisionedController) {
super(view); super(view);
mPrivacyItemController = privacyItemController; mPrivacyItemController = privacyItemController;
mActivityStarter = activityStarter; mActivityStarter = activityStarter;
@@ -151,6 +164,7 @@ class QuickStatusBarHeaderController extends ViewController<QuickStatusBarHeader
mPrivacyDialogController = privacyDialogController; mPrivacyDialogController = privacyDialogController;
mQSExpansionPathInterpolator = qsExpansionPathInterpolator; mQSExpansionPathInterpolator = qsExpansionPathInterpolator;
mFeatureFlags = featureFlags; mFeatureFlags = featureFlags;
mDeviceProvisionedController = deviceProvisionedController;
mQSCarrierGroupController = qsCarrierGroupControllerBuilder mQSCarrierGroupController = qsCarrierGroupControllerBuilder
.setQSCarrierGroup(mView.findViewById(R.id.carrier_group)) .setQSCarrierGroup(mView.findViewById(R.id.carrier_group))
@@ -182,6 +196,7 @@ class QuickStatusBarHeaderController extends ViewController<QuickStatusBarHeader
@Override @Override
protected void onViewAttached() { protected void onViewAttached() {
mDeviceProvisionedController.addCallback(mDeviceProvisionedListener);
mPrivacyChip.setOnClickListener(mOnClickListener); mPrivacyChip.setOnClickListener(mOnClickListener);
mMicCameraIndicatorsEnabled = mPrivacyItemController.getMicCameraAvailable(); mMicCameraIndicatorsEnabled = mPrivacyItemController.getMicCameraAvailable();
@@ -224,6 +239,7 @@ class QuickStatusBarHeaderController extends ViewController<QuickStatusBarHeader
@Override @Override
protected void onViewDetached() { protected void onViewDetached() {
mColorExtractor.removeOnColorsChangedListener(mOnColorsChangedListener); mColorExtractor.removeOnColorsChangedListener(mOnColorsChangedListener);
mDeviceProvisionedController.removeCallback(mDeviceProvisionedListener);
mPrivacyChip.setOnClickListener(null); mPrivacyChip.setOnClickListener(null);
mStatusBarIconController.removeIconGroup(mIconManager); mStatusBarIconController.removeIconGroup(mIconManager);
mQSCarrierGroupController.setOnSingleCarrierChangedListener(null); mQSCarrierGroupController.setOnSingleCarrierChangedListener(null);

View File

@@ -36,6 +36,7 @@ import com.android.systemui.statusbar.FeatureFlags
import com.android.systemui.statusbar.phone.StatusBarIconController import com.android.systemui.statusbar.phone.StatusBarIconController
import com.android.systemui.statusbar.phone.StatusIconContainer import com.android.systemui.statusbar.phone.StatusIconContainer
import com.android.systemui.statusbar.policy.Clock 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.VariableDateView
import com.android.systemui.statusbar.policy.VariableDateViewController import com.android.systemui.statusbar.policy.VariableDateViewController
import com.android.systemui.util.mockito.any import com.android.systemui.util.mockito.any
@@ -50,6 +51,7 @@ import org.mockito.Answers
import org.mockito.ArgumentMatchers.anyInt import org.mockito.ArgumentMatchers.anyInt
import org.mockito.Mock import org.mockito.Mock
import org.mockito.Mockito.`when` import org.mockito.Mockito.`when`
import org.mockito.Mockito.never
import org.mockito.Mockito.reset import org.mockito.Mockito.reset
import org.mockito.Mockito.verify import org.mockito.Mockito.verify
import org.mockito.MockitoAnnotations import org.mockito.MockitoAnnotations
@@ -103,6 +105,7 @@ class QuickStatusBarHeaderControllerTest : SysuiTestCase() {
@Mock @Mock
private lateinit var featureFlags: FeatureFlags private lateinit var featureFlags: FeatureFlags
private lateinit var deviceProvisionedController: FakeDeviceProvisionedController
private val qsExpansionPathInterpolator = QSExpansionPathInterpolator() private val qsExpansionPathInterpolator = QSExpansionPathInterpolator()
private lateinit var controller: QuickStatusBarHeaderController private lateinit var controller: QuickStatusBarHeaderController
@@ -123,6 +126,9 @@ class QuickStatusBarHeaderControllerTest : SysuiTestCase() {
`when`(view.isAttachedToWindow).thenReturn(true) `when`(view.isAttachedToWindow).thenReturn(true)
`when`(view.context).thenReturn(context) `when`(view.context).thenReturn(context)
deviceProvisionedController = FakeDeviceProvisionedController()
deviceProvisionedController.provisioned = true
cameraSlotName = mContext.resources.getString( cameraSlotName = mContext.resources.getString(
com.android.internal.R.string.status_bar_camera) com.android.internal.R.string.status_bar_camera)
microphoneSlotName = mContext.resources.getString( microphoneSlotName = mContext.resources.getString(
@@ -144,7 +150,8 @@ class QuickStatusBarHeaderControllerTest : SysuiTestCase() {
privacyDialogController, privacyDialogController,
qsExpansionPathInterpolator, qsExpansionPathInterpolator,
featureFlags, featureFlags,
variableDateViewControllerFactory variableDateViewControllerFactory,
deviceProvisionedController
) )
} }
@@ -279,6 +286,34 @@ class QuickStatusBarHeaderControllerTest : SysuiTestCase() {
verify(view).setIsSingleCarrier(false) 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() { private fun stubViews() {
`when`(view.findViewById<View>(anyInt())).thenReturn(mockView) `when`(view.findViewById<View>(anyInt())).thenReturn(mockView)
`when`(view.findViewById<QSCarrierGroup>(R.id.carrier_group)).thenReturn(qsCarrierGroup) `when`(view.findViewById<QSCarrierGroup>(R.id.carrier_group)).thenReturn(qsCarrierGroup)
@@ -293,4 +328,40 @@ class QuickStatusBarHeaderControllerTest : SysuiTestCase() {
`when`(privacyItemController.micCameraAvailable).thenReturn(micCamera) `when`(privacyItemController.micCameraAvailable).thenReturn(micCamera)
`when`(privacyItemController.locationAvailable).thenReturn(location) `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
}
}
} }