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

Commit 500edc9e authored by Alejandro Nijamkin's avatar Alejandro Nijamkin
Browse files

Fixes SecurityException when switching out of Guest user

The attached bug occurs when:
1. The main user has a screen saver QS tile installed
2. The guest user is switched to and a screen saver QS tile is also
   installed there
3. The guest user mode is exited and we return to the main user
4. QS is accessed

It happens because the DreamTile implementation didn't switch the user
ID on its UserSettingObservers. This CL adds that handling.

Fix: 362308685
Test: manually verified that, with this change, the steps above don't
reproduce the SecurityException crash
Flag: EXEMPT bug fix

Change-Id: I4e80719c64d40213989abfd1159234f7bab1bc2b
parent f4b4cd27
Loading
Loading
Loading
Loading
+11 −2
Original line number Diff line number Diff line
@@ -67,8 +67,10 @@ public class DreamTile extends QSTileImpl<QSTile.BooleanState> {
    private static final String LOG_TAG = "QSDream";
    private final IDreamManager mDreamManager;
    private final BroadcastDispatcher mBroadcastDispatcher;
    private final UserSettingObserver mEnabledSettingObserver;
    private final UserSettingObserver mDreamSettingObserver;
    @VisibleForTesting
    final UserSettingObserver mEnabledSettingObserver;
    @VisibleForTesting
    final UserSettingObserver mDreamSettingObserver;
    private final UserTracker mUserTracker;
    private final boolean mDreamSupported;
    private final boolean mDreamOnlyEnabledForDockUser;
@@ -180,6 +182,13 @@ public class DreamTile extends QSTileImpl<QSTile.BooleanState> {
        state.expandedAccessibilityClassName = Switch.class.getName();
    }

    @Override
    protected void handleUserSwitch(int newUserId) {
        super.handleUserSwitch(newUserId);
        mDreamSettingObserver.setUserId(newUserId);
        mEnabledSettingObserver.setUserId(newUserId);
    }

    @Nullable
    @Override
    public Intent getLongClickIntent() {
+22 −4
Original line number Diff line number Diff line
@@ -20,6 +20,8 @@ import static android.platform.test.flag.junit.FlagsParameterization.allCombinat

import static com.android.systemui.Flags.FLAG_QS_CUSTOM_TILE_CLICK_GUARANTEED_BUG_FIX;

import static com.google.common.truth.Truth.assertThat;

import static junit.framework.TestCase.assertEquals;
import static junit.framework.TestCase.assertFalse;
import static junit.framework.TestCase.assertTrue;
@@ -59,7 +61,6 @@ import com.android.systemui.qs.tileimpl.QSTileImpl;
import com.android.systemui.res.R;
import com.android.systemui.settings.UserTracker;
import com.android.systemui.util.settings.FakeSettings;
import com.android.systemui.util.settings.SecureSettings;

import org.junit.After;
import org.junit.Before;
@@ -69,11 +70,11 @@ import org.mockito.ArgumentCaptor;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;

import java.util.List;

import platform.test.runner.parameterized.ParameterizedAndroidJunit4;
import platform.test.runner.parameterized.Parameters;

import java.util.List;

@RunWith(ParameterizedAndroidJunit4.class)
@TestableLooper.RunWithLooper(setAsMainLooper = true)
@SmallTest
@@ -107,7 +108,7 @@ public class DreamTileTest extends SysuiTestCase {

    private DreamTile mTile;

    private SecureSettings mSecureSettings;
    private FakeSettings mSecureSettings;

    private static final ComponentName COLORS_DREAM_COMPONENT_NAME = new ComponentName(
            "com.android.dreams", ".Colors");
@@ -279,6 +280,23 @@ public class DreamTileTest extends SysuiTestCase {
        destroyTile(dockedTile);
    }

    @Test
    public void testHandleUserSwitch() {
        final DreamTile dockedTile = constructTileForTest(true, false);
        dockedTile.handleSetListening(true);

        final int oldUserId = mUserTracker.getUserId();
        assertThat(dockedTile.mDreamSettingObserver.getCurrentUser()).isEqualTo(oldUserId);
        assertThat(dockedTile.mEnabledSettingObserver.getCurrentUser()).isEqualTo(oldUserId);

        final int newUserId = 1337;
        dockedTile.handleUserSwitch(newUserId);
        assertThat(dockedTile.mDreamSettingObserver.getCurrentUser()).isEqualTo(newUserId);
        assertThat(dockedTile.mEnabledSettingObserver.getCurrentUser()).isEqualTo(newUserId);

        destroyTile(dockedTile);
    }

    private void setScreensaverEnabled(boolean enabled) {
        mSecureSettings.putIntForUser(Settings.Secure.SCREENSAVER_ENABLED, enabled ? 1 : 0,
                DEFAULT_USER);