Loading packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeaderController.java +17 −1 Original line number Diff line number Diff line Loading @@ -41,6 +41,7 @@ import com.android.systemui.statusbar.FeatureFlags; 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.util.ViewController; import java.util.List; Loading Loading @@ -70,11 +71,13 @@ class QuickStatusBarHeaderController extends ViewController<QuickStatusBarHeader private final PrivacyDialogController mPrivacyDialogController; private final QSExpansionPathInterpolator mQSExpansionPathInterpolator; private final FeatureFlags mFeatureFlags; private final DeviceProvisionedController mDeviceProvisionedController; private boolean mListening; 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; Loading Loading @@ -115,6 +118,7 @@ class QuickStatusBarHeaderController extends ViewController<QuickStatusBarHeader @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()); Loading @@ -122,6 +126,14 @@ class QuickStatusBarHeaderController extends ViewController<QuickStatusBarHeader } }; private DeviceProvisionedController.DeviceProvisionedListener mDeviceProvisionedListener = new DeviceProvisionedController.DeviceProvisionedListener() { @Override public void onDeviceProvisionedChanged() { mDeviceProvisioned = mDeviceProvisionedController.isDeviceProvisioned(); } }; @Inject QuickStatusBarHeaderController(QuickStatusBarHeader view, PrivacyItemController privacyItemController, Loading @@ -134,7 +146,8 @@ class QuickStatusBarHeaderController extends ViewController<QuickStatusBarHeader SysuiColorExtractor colorExtractor, PrivacyDialogController privacyDialogController, QSExpansionPathInterpolator qsExpansionPathInterpolator, FeatureFlags featureFlags) { FeatureFlags featureFlags, DeviceProvisionedController deviceProvisionedController) { super(view); mPrivacyItemController = privacyItemController; mActivityStarter = activityStarter; Loading @@ -146,6 +159,7 @@ class QuickStatusBarHeaderController extends ViewController<QuickStatusBarHeader mPrivacyDialogController = privacyDialogController; mQSExpansionPathInterpolator = qsExpansionPathInterpolator; mFeatureFlags = featureFlags; mDeviceProvisionedController = deviceProvisionedController; mQSCarrierGroupController = qsCarrierGroupControllerBuilder .setQSCarrierGroup(mView.findViewById(R.id.carrier_group)) Loading @@ -171,6 +185,7 @@ class QuickStatusBarHeaderController extends ViewController<QuickStatusBarHeader @Override protected void onViewAttached() { mDeviceProvisionedController.addCallback(mDeviceProvisionedListener); mPrivacyChip.setOnClickListener(mOnClickListener); mMicCameraIndicatorsEnabled = mPrivacyItemController.getMicCameraAvailable(); Loading Loading @@ -210,6 +225,7 @@ class QuickStatusBarHeaderController extends ViewController<QuickStatusBarHeader @Override protected void onViewDetached() { mColorExtractor.removeOnColorsChangedListener(mOnColorsChangedListener); mDeviceProvisionedController.removeCallback(mDeviceProvisionedListener); mPrivacyChip.setOnClickListener(null); mStatusBarIconController.removeIconGroup(mIconManager); mQSCarrierGroupController.setOnSingleCarrierChangedListener(null); Loading packages/SystemUI/tests/src/com/android/systemui/qs/QuickStatusBarHeaderControllerTest.kt +72 −1 Original line number Diff line number Diff line Loading @@ -36,6 +36,7 @@ import com.android.systemui.statusbar.FeatureFlags 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.util.mockito.any import com.android.systemui.util.mockito.argumentCaptor import com.android.systemui.util.mockito.capture Loading @@ -48,6 +49,7 @@ import org.mockito.Answers 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 Loading Loading @@ -95,6 +97,7 @@ class QuickStatusBarHeaderControllerTest : SysuiTestCase() { @Mock private lateinit var featureFlags: FeatureFlags private lateinit var deviceProvisionedController: FakeDeviceProvisionedController private val qsExpansionPathInterpolator = QSExpansionPathInterpolator() private lateinit var controller: QuickStatusBarHeaderController Loading @@ -113,6 +116,9 @@ class QuickStatusBarHeaderControllerTest : SysuiTestCase() { `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( Loading @@ -133,7 +139,8 @@ class QuickStatusBarHeaderControllerTest : SysuiTestCase() { colorExtractor, privacyDialogController, qsExpansionPathInterpolator, featureFlags featureFlags, deviceProvisionedController ) } Loading Loading @@ -268,6 +275,34 @@ class QuickStatusBarHeaderControllerTest : SysuiTestCase() { 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) Loading @@ -280,4 +315,40 @@ class QuickStatusBarHeaderControllerTest : SysuiTestCase() { `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 } } } Loading
packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeaderController.java +17 −1 Original line number Diff line number Diff line Loading @@ -41,6 +41,7 @@ import com.android.systemui.statusbar.FeatureFlags; 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.util.ViewController; import java.util.List; Loading Loading @@ -70,11 +71,13 @@ class QuickStatusBarHeaderController extends ViewController<QuickStatusBarHeader private final PrivacyDialogController mPrivacyDialogController; private final QSExpansionPathInterpolator mQSExpansionPathInterpolator; private final FeatureFlags mFeatureFlags; private final DeviceProvisionedController mDeviceProvisionedController; private boolean mListening; 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; Loading Loading @@ -115,6 +118,7 @@ class QuickStatusBarHeaderController extends ViewController<QuickStatusBarHeader @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()); Loading @@ -122,6 +126,14 @@ class QuickStatusBarHeaderController extends ViewController<QuickStatusBarHeader } }; private DeviceProvisionedController.DeviceProvisionedListener mDeviceProvisionedListener = new DeviceProvisionedController.DeviceProvisionedListener() { @Override public void onDeviceProvisionedChanged() { mDeviceProvisioned = mDeviceProvisionedController.isDeviceProvisioned(); } }; @Inject QuickStatusBarHeaderController(QuickStatusBarHeader view, PrivacyItemController privacyItemController, Loading @@ -134,7 +146,8 @@ class QuickStatusBarHeaderController extends ViewController<QuickStatusBarHeader SysuiColorExtractor colorExtractor, PrivacyDialogController privacyDialogController, QSExpansionPathInterpolator qsExpansionPathInterpolator, FeatureFlags featureFlags) { FeatureFlags featureFlags, DeviceProvisionedController deviceProvisionedController) { super(view); mPrivacyItemController = privacyItemController; mActivityStarter = activityStarter; Loading @@ -146,6 +159,7 @@ class QuickStatusBarHeaderController extends ViewController<QuickStatusBarHeader mPrivacyDialogController = privacyDialogController; mQSExpansionPathInterpolator = qsExpansionPathInterpolator; mFeatureFlags = featureFlags; mDeviceProvisionedController = deviceProvisionedController; mQSCarrierGroupController = qsCarrierGroupControllerBuilder .setQSCarrierGroup(mView.findViewById(R.id.carrier_group)) Loading @@ -171,6 +185,7 @@ class QuickStatusBarHeaderController extends ViewController<QuickStatusBarHeader @Override protected void onViewAttached() { mDeviceProvisionedController.addCallback(mDeviceProvisionedListener); mPrivacyChip.setOnClickListener(mOnClickListener); mMicCameraIndicatorsEnabled = mPrivacyItemController.getMicCameraAvailable(); Loading Loading @@ -210,6 +225,7 @@ class QuickStatusBarHeaderController extends ViewController<QuickStatusBarHeader @Override protected void onViewDetached() { mColorExtractor.removeOnColorsChangedListener(mOnColorsChangedListener); mDeviceProvisionedController.removeCallback(mDeviceProvisionedListener); mPrivacyChip.setOnClickListener(null); mStatusBarIconController.removeIconGroup(mIconManager); mQSCarrierGroupController.setOnSingleCarrierChangedListener(null); Loading
packages/SystemUI/tests/src/com/android/systemui/qs/QuickStatusBarHeaderControllerTest.kt +72 −1 Original line number Diff line number Diff line Loading @@ -36,6 +36,7 @@ import com.android.systemui.statusbar.FeatureFlags 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.util.mockito.any import com.android.systemui.util.mockito.argumentCaptor import com.android.systemui.util.mockito.capture Loading @@ -48,6 +49,7 @@ import org.mockito.Answers 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 Loading Loading @@ -95,6 +97,7 @@ class QuickStatusBarHeaderControllerTest : SysuiTestCase() { @Mock private lateinit var featureFlags: FeatureFlags private lateinit var deviceProvisionedController: FakeDeviceProvisionedController private val qsExpansionPathInterpolator = QSExpansionPathInterpolator() private lateinit var controller: QuickStatusBarHeaderController Loading @@ -113,6 +116,9 @@ class QuickStatusBarHeaderControllerTest : SysuiTestCase() { `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( Loading @@ -133,7 +139,8 @@ class QuickStatusBarHeaderControllerTest : SysuiTestCase() { colorExtractor, privacyDialogController, qsExpansionPathInterpolator, featureFlags featureFlags, deviceProvisionedController ) } Loading Loading @@ -268,6 +275,34 @@ class QuickStatusBarHeaderControllerTest : SysuiTestCase() { 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) Loading @@ -280,4 +315,40 @@ class QuickStatusBarHeaderControllerTest : SysuiTestCase() { `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 } } }