Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit daf67271 authored by Fabian Kozynski's avatar Fabian Kozynski
Browse files

Disable click on privacy chip before provision

Test: atest QuickStatusBarHeaderControllerTest
Bug: 253043058
Change-Id: I8099dfd259b149cd18509677d623de7a352f5de0
Merged-In: I9c8f642976f3332f4d5c9db89a4917dae501f251
Merged-In: I8099dfd259b149cd18509677d623de7a352f5de0
parent f0027983
Loading
Loading
Loading
Loading
+17 −1
Original line number Diff line number Diff line
@@ -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;
@@ -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;
@@ -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());
@@ -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,
@@ -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;
@@ -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))
@@ -171,6 +185,7 @@ class QuickStatusBarHeaderController extends ViewController<QuickStatusBarHeader

    @Override
    protected void onViewAttached() {
        mDeviceProvisionedController.addCallback(mDeviceProvisionedListener);
        mPrivacyChip.setOnClickListener(mOnClickListener);

        mMicCameraIndicatorsEnabled = mPrivacyItemController.getMicCameraAvailable();
@@ -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);
+72 −1
Original line number Diff line number Diff line
@@ -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
@@ -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
@@ -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
@@ -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(
@@ -133,7 +139,8 @@ class QuickStatusBarHeaderControllerTest : SysuiTestCase() {
                colorExtractor,
                privacyDialogController,
                qsExpansionPathInterpolator,
                featureFlags
                featureFlags,
                deviceProvisionedController
        )
    }

@@ -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)
@@ -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
        }
    }
}