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

Commit ae10f49a authored by Oli Thompson's avatar Oli Thompson
Browse files

Guard against duplicate calls to setQuietModeEnabled

check if quiet mode is already in the desired state before calling
setQuietModeEnabled

Bug: 303722527
Bug: 293441361
Test: atest WorkModePreferenceControllerTest, atest
ManagedProfileQuietModeEnablerTest

Change-Id: I6a809b6f1b9a78382dccb1cc8b0ae4d8c88fa51a
parent 59709d40
Loading
Loading
Loading
Loading
+9 −1
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@

package com.android.settings.accounts;

import android.app.admin.flags.Flags;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
@@ -58,7 +59,14 @@ final class ManagedProfileQuietModeEnabler implements DefaultLifecycleObserver {
    }

    public void setQuietModeEnabled(boolean enabled) {
        if (mManagedProfile != null) {
        if (mManagedProfile == null) {
            return;
        }
        if (Flags.quietModeCredentialBugFix()) {
            if (isQuietModeEnabled() != enabled) {
                mUserManager.requestQuietModeEnabled(enabled, mManagedProfile);
            }
        } else {
            mUserManager.requestQuietModeEnabled(enabled, mManagedProfile);
        }
    }
+3 −0
Original line number Diff line number Diff line
@@ -70,6 +70,9 @@ public class WorkModePreferenceController extends BasePreferenceController
    @Override
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
        mQuietModeEnabler.setQuietModeEnabled(!isChecked);
        if (android.app.admin.flags.Flags.quietModeCredentialBugFix()) {
            updateState(mPreference);
        }
    }

    @Override
+35 −6
Original line number Diff line number Diff line
@@ -19,18 +19,22 @@ package com.android.settings.accounts;
import static com.google.common.truth.Truth.assertThat;

import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;

import android.app.admin.flags.Flags;
import android.content.Context;
import android.content.Intent;
import android.content.pm.UserInfo;
import android.os.UserHandle;
import android.os.UserManager;
import android.platform.test.annotations.RequiresFlagsEnabled;

import androidx.lifecycle.Lifecycle;
import androidx.lifecycle.LifecycleOwner;
@@ -42,13 +46,15 @@ import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.ParameterizedRobolectricTestRunner;
import org.robolectric.annotation.LooperMode;

import java.util.Arrays;
import java.util.Collections;
import java.util.List;


@RunWith(RobolectricTestRunner.class)
@RunWith(ParameterizedRobolectricTestRunner.class)
@LooperMode(LooperMode.Mode.LEGACY)
public class ManagedProfileQuietModeEnablerTest {
    private static final int MANAGED_USER_ID = 10;
@@ -63,6 +69,12 @@ public class ManagedProfileQuietModeEnablerTest {
        }
    };

    @ParameterizedRobolectricTestRunner.Parameters
    public static List<?> params() {
        return Arrays.asList(true, false);
    }
    final boolean mEnable;

    @Mock
    private ManagedProfileQuietModeEnabler.QuietModeChangeListener mOnQuietModeChangeListener;
    @Mock
@@ -72,6 +84,10 @@ public class ManagedProfileQuietModeEnablerTest {
    @Mock
    private UserInfo mUserInfo;

    public ManagedProfileQuietModeEnablerTest(boolean enable) {
        mEnable = enable;
    }

    @Before
    public void setUp() {
        MockitoAnnotations.initMocks(this);
@@ -88,10 +104,21 @@ public class ManagedProfileQuietModeEnablerTest {

    @Test
    public void onSetQuietMode_shouldRequestQuietModeEnabled() {
        mQuietModeEnabler.setQuietModeEnabled(false);
        verify(mUserManager).requestQuietModeEnabled(false, mManagedUser);
        mQuietModeEnabler.setQuietModeEnabled(true);
        verify(mUserManager).requestQuietModeEnabled(true, mManagedUser);
        when(mUserManager.isQuietModeEnabled(any(UserHandle.class))).thenReturn(!mEnable);

        mQuietModeEnabler.setQuietModeEnabled(mEnable);

        verify(mUserManager).requestQuietModeEnabled(mEnable, mManagedUser);
    }

    @Test
    @RequiresFlagsEnabled(Flags.FLAG_QUIET_MODE_CREDENTIAL_BUG_FIX)
    public void onSetQuietMode_ifQuietModeAlreadyInDesiredState_shouldNotRequestQuietModeEnabled() {
        when(mUserManager.isQuietModeEnabled(any(UserHandle.class))).thenReturn(mEnable);

        mQuietModeEnabler.setQuietModeEnabled(mEnable);

        verify(mUserManager, never()).requestQuietModeEnabled(anyBoolean(), any());
    }

    @Test
@@ -107,6 +134,7 @@ public class ManagedProfileQuietModeEnablerTest {
                Intent.EXTRA_USER_HANDLE, MANAGED_USER_ID));
        mContext.sendBroadcast(new Intent(Intent.ACTION_MANAGED_PROFILE_UNAVAILABLE).putExtra(
                Intent.EXTRA_USER_HANDLE, MANAGED_USER_ID));

        verify(mOnQuietModeChangeListener, times(2)).onQuietModeChanged();
    }

@@ -123,6 +151,7 @@ public class ManagedProfileQuietModeEnablerTest {
                Context.RECEIVER_EXPORTED/*UNAUDITED*/);

        mQuietModeEnabler.onStop(mLifecycleOwner);

        verify(mContext).unregisterReceiver(mQuietModeEnabler.mReceiver);
    }
}
+17 −14
Original line number Diff line number Diff line
@@ -40,9 +40,12 @@ import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.robolectric.ParameterizedRobolectricTestRunner;
import org.robolectric.RobolectricTestRunner;

import java.util.Arrays;
import java.util.Collections;
import java.util.List;

@RunWith(RobolectricTestRunner.class)
public class WorkModePreferenceControllerTest {
@@ -54,6 +57,11 @@ public class WorkModePreferenceControllerTest {
    private WorkModePreferenceController mController;
    private MainSwitchPreference mPreference;

    @ParameterizedRobolectricTestRunner.Parameters
    public static List<?> params() {
        return Arrays.asList(true, false);
    }
    final boolean mEnable;
    @Mock
    private UserManager mUserManager;
    @Mock
@@ -65,6 +73,10 @@ public class WorkModePreferenceControllerTest {
    @Mock
    Switch mSwitch;

    public WorkModePreferenceControllerTest(boolean enable) {
        mEnable = enable;
    }

    @Before
    public void setUp() {
        MockitoAnnotations.initMocks(this);
@@ -99,28 +111,19 @@ public class WorkModePreferenceControllerTest {
    @Test
    public void updateState_shouldRefreshContent() {
        when(mUserManager.isQuietModeEnabled(any(UserHandle.class)))
                .thenReturn(false);
                .thenReturn(mEnable);

        mController.updateState(mPreference);

        assertThat(mPreference.isChecked()).isTrue();

        when(mUserManager.isQuietModeEnabled(any(UserHandle.class)))
                .thenReturn(true);

        mController.updateState(mPreference);

        assertThat(mPreference.isChecked()).isFalse();
        assertThat(mPreference.isChecked()).isEqualTo(!mEnable);
    }

    @Test
    public void onPreferenceChange_shouldRequestQuietModeEnabled() {
        mController.onCheckedChanged(mSwitch, true);

        verify(mUserManager).requestQuietModeEnabled(false, mManagedUser);
        when(mUserManager.isQuietModeEnabled(any(UserHandle.class))).thenReturn(mEnable);

        mController.onCheckedChanged(mSwitch, false);
        mController.onCheckedChanged(mSwitch, mEnable);

        verify(mUserManager).requestQuietModeEnabled(true, mManagedUser);
        verify(mUserManager).requestQuietModeEnabled(!mEnable, mManagedUser);
    }
}
 No newline at end of file