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

Commit 39357500 authored by Fabian Kozynski's avatar Fabian Kozynski Committed by Android (Google) Code Review
Browse files

Merge "Disable click on privacy chip before provision" into sc-dev

parents 6c525cb8 daf67271
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
        }
    }
}