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

Commit 7d1835a3 authored by Evan Severson's avatar Evan Severson
Browse files

Set toggle state for profile group

The toggle state should be set for all users in the current profile
group; for example a profile user.

Test: make RunSettingsRoboTests ROBOTEST_FILTER=SensorToggleControllerTest
Fixes: 194280328
Change-Id: Ib0b74e7b27722b44b116e614dc960bff72983a38
parent d7753f4c
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -59,7 +59,8 @@ public abstract class SensorToggleController extends TogglePreferenceController

    @Override
    public boolean setChecked(boolean isChecked) {
        mSensorPrivacyManagerHelper.setSensorBlocked(SETTINGS, getSensor(), !isChecked);
        mSensorPrivacyManagerHelper.setSensorBlockedForProfileGroup(SETTINGS, getSensor(),
                !isChecked);
        return true;
    }

+21 −0
Original line number Diff line number Diff line
@@ -172,6 +172,27 @@ public class SensorPrivacyManagerHelper {
        mSensorPrivacyManager.setSensorPrivacy(source, sensor, blocked, userId);
    }

    /**
     * Sets the sensor privacy for the current profile group.
     * @param source The source with which sensor privacy is toggled.
     * @param sensor The sensor to set for
     * @param blocked The state to set to
     */
    public void setSensorBlockedForProfileGroup(int source, int sensor, boolean blocked) {
        mSensorPrivacyManager.setSensorPrivacyForProfileGroup(source, sensor, blocked);
    }

    /**
     * Sets the sensor privacy for the given user's profile group.
     * @param source The source with which sensor privacy is toggled.
     * @param sensor The sensor to set for
     * @param blocked The state to set to
     */
    public void setSensorBlockedForProfileGroup(int source, int sensor, boolean blocked,
            int userId) {
        mSensorPrivacyManager.setSensorPrivacyForProfileGroup(source, sensor, blocked, userId);
    }

    /**
     * Adds a listener for the state of the current user. If the current user changes and the state
     * of the new user is different, a callback will be received.
+106 −24
Original line number Diff line number Diff line
@@ -33,6 +33,8 @@ import android.content.Context;
import android.hardware.SensorPrivacyManager;
import android.hardware.SensorPrivacyManager.OnSensorPrivacyChangedListener;
import android.util.ArraySet;
import android.util.SparseArray;
import android.util.SparseBooleanArray;

import com.android.settings.utils.SensorPrivacyManagerHelper;

@@ -54,10 +56,10 @@ public class SensorToggleControllerTest {
    private Context mContext;
    @Mock
    private SensorPrivacyManager mSensorPrivacyManager;
    private boolean mMicState;
    private boolean mCamState;
    private Set<OnSensorPrivacyChangedListener> mMicListeners;
    private Set<OnSensorPrivacyChangedListener> mCamListeners;
    private SparseBooleanArray mMicState;
    private SparseBooleanArray mCamState;
    private SparseArray<Set<OnSensorPrivacyChangedListener>> mMicListeners;
    private SparseArray<Set<OnSensorPrivacyChangedListener>> mCamListeners;

    @Before
    public void setUp() {
@@ -73,39 +75,85 @@ public class SensorToggleControllerTest {
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
        mMicState = false;
        mCamState = false;
        mMicListeners = new ArraySet<>();
        mCamListeners = new ArraySet<>();
        mMicState = new SparseBooleanArray();
        mCamState = new SparseBooleanArray();
        mMicState.put(0, false);
        mCamState.put(0, false);
        mMicState.put(10, false);
        mCamState.put(10, false);
        mMicListeners = new SparseArray<>();
        mCamListeners = new SparseArray<>();
        mMicListeners.put(0, new ArraySet<>());
        mMicListeners.put(10, new ArraySet<>());
        mCamListeners.put(0, new ArraySet<>());
        mCamListeners.put(10, new ArraySet<>());

        doReturn(0).when(mContext).getUserId();
        doReturn(mSensorPrivacyManager).when(mContext)
                .getSystemService(SensorPrivacyManager.class);

        doAnswer(invocation -> mMicState)
        doAnswer(invocation -> mMicState.get(0))
                .when(mSensorPrivacyManager).isSensorPrivacyEnabled(eq(MICROPHONE));
        doAnswer(invocation -> mCamState)
        doAnswer(invocation -> mCamState.get(0))
                .when(mSensorPrivacyManager).isSensorPrivacyEnabled(eq(CAMERA));
        doAnswer(invocation -> mMicState.get(invocation.getArgument(1)))
                .when(mSensorPrivacyManager).isSensorPrivacyEnabled(eq(MICROPHONE), anyInt());
        doAnswer(invocation -> mCamState.get(invocation.getArgument(1)))
                .when(mSensorPrivacyManager).isSensorPrivacyEnabled(eq(CAMERA), anyInt());

        doAnswer(invocation -> {
            mMicState = invocation.getArgument(1);
            for (OnSensorPrivacyChangedListener listener : mMicListeners) {
                listener.onSensorPrivacyChanged(MICROPHONE, mMicState);
            mMicState.put(0, invocation.getArgument(2));
            mMicState.put(10, invocation.getArgument(2));
            for (OnSensorPrivacyChangedListener listener : mMicListeners.get(0)) {
                listener.onSensorPrivacyChanged(MICROPHONE, mMicState.get(0));
            }
            return null;
        }).when(mSensorPrivacyManager).setSensorPrivacy(anyInt(), eq(MICROPHONE), anyBoolean());
        doAnswer(invocation -> {
            mCamState = invocation.getArgument(1);
            for (OnSensorPrivacyChangedListener listener : mMicListeners) {
                listener.onSensorPrivacyChanged(CAMERA, mMicState);
            mCamState.put(0, invocation.getArgument(2));
            mCamState.put(10, invocation.getArgument(2));
            for (OnSensorPrivacyChangedListener listener : mMicListeners.get(0)) {
                listener.onSensorPrivacyChanged(CAMERA, mMicState.get(0));
            }
            return null;
        }).when(mSensorPrivacyManager).setSensorPrivacy(anyInt(), eq(CAMERA), anyBoolean());

        doAnswer(invocation -> mMicListeners.add(invocation.getArgument(1)))
        doAnswer(invocation -> {
            mMicState.put(0, invocation.getArgument(2));
            mMicState.put(10, invocation.getArgument(2));
            for (OnSensorPrivacyChangedListener listener : mMicListeners.get(0)) {
                listener.onSensorPrivacyChanged(MICROPHONE, mMicState.get(0));
            }
            for (OnSensorPrivacyChangedListener listener : mMicListeners.get(10)) {
                listener.onSensorPrivacyChanged(MICROPHONE, mMicState.get(10));
            }
            return null;
        }).when(mSensorPrivacyManager)
                .setSensorPrivacyForProfileGroup(anyInt(), eq(MICROPHONE), anyBoolean());
        doAnswer(invocation -> {
            mCamState.put(0, invocation.getArgument(2));
            mCamState.put(10, invocation.getArgument(2));
            for (OnSensorPrivacyChangedListener listener : mCamListeners.get(0)) {
                listener.onSensorPrivacyChanged(CAMERA, mCamState.get(0));
            }
            for (OnSensorPrivacyChangedListener listener : mCamListeners.get(10)) {
                listener.onSensorPrivacyChanged(CAMERA, mCamState.get(10));
            }
            return null;
        }).when(mSensorPrivacyManager)
                .setSensorPrivacyForProfileGroup(anyInt(), eq(CAMERA), anyBoolean());

        doAnswer(invocation -> mMicListeners.get(0).add(invocation.getArgument(1)))
                .when(mSensorPrivacyManager).addSensorPrivacyListener(eq(MICROPHONE), any());
        doAnswer(invocation -> mCamListeners.add(invocation.getArgument(1)))
        doAnswer(invocation -> mCamListeners.get(0).add(invocation.getArgument(1)))
                .when(mSensorPrivacyManager).addSensorPrivacyListener(eq(CAMERA), any());

        doAnswer(invocation -> mMicListeners.get(invocation.getArgument(2))
                .add(invocation.getArgument(1))).when(mSensorPrivacyManager)
                .addSensorPrivacyListener(eq(MICROPHONE), anyInt(), any());
        doAnswer(invocation -> mCamListeners.get(invocation.getArgument(2))
                .add(invocation.getArgument(1))).when(mSensorPrivacyManager)
                .addSensorPrivacyListener(eq(CAMERA), anyInt(), any());
    }

    @Test
@@ -143,7 +191,7 @@ public class SensorToggleControllerTest {
        mSensorPrivacyManager.setSensorPrivacy(OTHER, MICROPHONE, false);
        MicToggleController micToggleController = new MicToggleController(mContext, "mic_toggle");
        micToggleController.setChecked(false);
        assertTrue(mMicState);
        assertTrue(mMicState.get(0));
    }

    @Test
@@ -151,7 +199,23 @@ public class SensorToggleControllerTest {
        mSensorPrivacyManager.setSensorPrivacy(OTHER, MICROPHONE, true);
        MicToggleController micToggleController = new MicToggleController(mContext, "mic_toggle");
        micToggleController.setChecked(true);
        assertFalse(mMicState);
        assertFalse(mMicState.get(0));
    }

    @Test
    public void isMicrophoneSensorPrivacyEnabledForProfileUser_uncheckMicToggle_returnTrue() {
        mSensorPrivacyManager.setSensorPrivacy(OTHER, MICROPHONE, false);
        MicToggleController micToggleController = new MicToggleController(mContext, "mic_toggle");
        micToggleController.setChecked(false);
        assertTrue(mMicState.get(10));
    }

    @Test
    public void isMicrophoneSensorPrivacyEnabledProfileUser_checkMicToggle_returnFalse() {
        mSensorPrivacyManager.setSensorPrivacy(OTHER, MICROPHONE, true);
        MicToggleController micToggleController = new MicToggleController(mContext, "mic_toggle");
        micToggleController.setChecked(true);
        assertFalse(mMicState.get(10));
    }

    @Test
@@ -189,20 +253,38 @@ public class SensorToggleControllerTest {
    }

    @Test
    public void isCameraSensorPrivacyEnabled_uncheckMicToggle_returnTrue() {
    public void isCameraSensorPrivacyEnabled_uncheckCanToggle_returnTrue() {
        mSensorPrivacyManager.setSensorPrivacy(OTHER, CAMERA, false);
        CameraToggleController camToggleController =
                new CameraToggleController(mContext, "cam_toggle");
        camToggleController.setChecked(false);
        assertTrue(mCamState.get(0));
    }

    @Test
    public void isCameraSensorPrivacyEnabled_checkCamToggle_returnFalse() {
        mSensorPrivacyManager.setSensorPrivacy(OTHER, CAMERA, true);
        CameraToggleController camToggleController =
                new CameraToggleController(mContext, "cam_toggle");
        camToggleController.setChecked(true);
        assertFalse(mCamState.get(0));
    }

    @Test
    public void isCameraSensorPrivacyEnabledForProfileUser_uncheckCamToggle_returnTrue() {
        mSensorPrivacyManager.setSensorPrivacy(OTHER, CAMERA, false);
        CameraToggleController camToggleController =
                new CameraToggleController(mContext, "cam_toggle");
        camToggleController.setChecked(false);
        assertTrue(mCamState);
        assertTrue(mCamState.get(10));
    }

    @Test
    public void isCameraSensorPrivacyEnabled_checkMicToggle_returnFalse() {
    public void isCameraSensorPrivacyEnabledProfileUser_checkCamToggle_returnFalse() {
        mSensorPrivacyManager.setSensorPrivacy(OTHER, CAMERA, true);
        CameraToggleController camToggleController =
                new CameraToggleController(mContext, "cam_toggle");
        camToggleController.setChecked(true);
        assertFalse(mCamState);
        assertFalse(mCamState.get(10));
    }
}