Disable click on privacy chip before provision
Test: atest QuickStatusBarHeaderControllerTest Bug: 253043058 Change-Id: I8099dfd259b149cd18509677d623de7a352f5de0 Merged-In: I9c8f642976f3332f4d5c9db89a4917dae501f251 Merged-In: I8099dfd259b149cd18509677d623de7a352f5de0
This commit is contained in:
@@ -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.util.ViewController;
|
import com.android.systemui.util.ViewController;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@@ -70,11 +71,13 @@ 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 boolean mListening;
|
private boolean mListening;
|
||||||
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;
|
||||||
@@ -115,6 +118,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());
|
||||||
@@ -122,6 +126,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,
|
||||||
@@ -134,7 +146,8 @@ class QuickStatusBarHeaderController extends ViewController<QuickStatusBarHeader
|
|||||||
SysuiColorExtractor colorExtractor,
|
SysuiColorExtractor colorExtractor,
|
||||||
PrivacyDialogController privacyDialogController,
|
PrivacyDialogController privacyDialogController,
|
||||||
QSExpansionPathInterpolator qsExpansionPathInterpolator,
|
QSExpansionPathInterpolator qsExpansionPathInterpolator,
|
||||||
FeatureFlags featureFlags) {
|
FeatureFlags featureFlags,
|
||||||
|
DeviceProvisionedController deviceProvisionedController) {
|
||||||
super(view);
|
super(view);
|
||||||
mPrivacyItemController = privacyItemController;
|
mPrivacyItemController = privacyItemController;
|
||||||
mActivityStarter = activityStarter;
|
mActivityStarter = activityStarter;
|
||||||
@@ -146,6 +159,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))
|
||||||
@@ -171,6 +185,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();
|
||||||
@@ -210,6 +225,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);
|
||||||
|
|||||||
@@ -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.util.mockito.any
|
import com.android.systemui.util.mockito.any
|
||||||
import com.android.systemui.util.mockito.argumentCaptor
|
import com.android.systemui.util.mockito.argumentCaptor
|
||||||
import com.android.systemui.util.mockito.capture
|
import com.android.systemui.util.mockito.capture
|
||||||
@@ -48,6 +49,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
|
||||||
@@ -95,6 +97,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
|
||||||
@@ -113,6 +116,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(
|
||||||
@@ -133,7 +139,8 @@ class QuickStatusBarHeaderControllerTest : SysuiTestCase() {
|
|||||||
colorExtractor,
|
colorExtractor,
|
||||||
privacyDialogController,
|
privacyDialogController,
|
||||||
qsExpansionPathInterpolator,
|
qsExpansionPathInterpolator,
|
||||||
featureFlags
|
featureFlags,
|
||||||
|
deviceProvisionedController
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -268,6 +275,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)
|
||||||
@@ -280,4 +315,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
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user