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

Commit 65d9917e authored by Xin Li's avatar Xin Li
Browse files

RESTRICT AUTOMERGE - Merge TQ2A.230305.008

Bug: 264720040
Merged-In: Id3ebc6627d6b46172cae1ce9e5c7500a652e719d
Merged-In: I8b9a2cbd5af7fa1bba56ff9ba62771d677d4a932
Change-Id: I5833464626eb06a01d6979c477be98ba06827893
parents 420a8474 b420deb9
Loading
Loading
Loading
Loading
+8 −3
Original line number Original line Diff line number Diff line
@@ -39,6 +39,7 @@ import com.android.settings.SetupWizardUtils;
import com.android.settings.biometrics.face.FaceEnrollIntroduction;
import com.android.settings.biometrics.face.FaceEnrollIntroduction;
import com.android.settings.biometrics.fingerprint.FingerprintEnrollFindSensor;
import com.android.settings.biometrics.fingerprint.FingerprintEnrollFindSensor;
import com.android.settings.biometrics.fingerprint.FingerprintEnrollIntroduction;
import com.android.settings.biometrics.fingerprint.FingerprintEnrollIntroduction;
import com.android.settings.biometrics.fingerprint.SetupFingerprintEnrollFindSensor;
import com.android.settings.biometrics.fingerprint.SetupFingerprintEnrollIntroduction;
import com.android.settings.biometrics.fingerprint.SetupFingerprintEnrollIntroduction;
import com.android.settings.password.ChooseLockGeneric;
import com.android.settings.password.ChooseLockGeneric;
import com.android.settings.password.ChooseLockSettingsHelper;
import com.android.settings.password.ChooseLockSettingsHelper;
@@ -152,9 +153,13 @@ public class BiometricUtils {
     */
     */
    public static Intent getFingerprintFindSensorIntent(@NonNull Context context,
    public static Intent getFingerprintFindSensorIntent(@NonNull Context context,
            @NonNull Intent activityIntent) {
            @NonNull Intent activityIntent) {
        Intent intent = new Intent(context, FingerprintEnrollFindSensor.class);
        if (WizardManagerHelper.isAnySetupWizard(activityIntent)) {
            Intent intent = new Intent(context, SetupFingerprintEnrollFindSensor.class);
            SetupWizardUtils.copySetupExtras(activityIntent, intent);
            SetupWizardUtils.copySetupExtras(activityIntent, intent);
            return intent;
            return intent;
        } else {
            return new Intent(context, FingerprintEnrollFindSensor.class);
        }
    }
    }


    /**
    /**
+13 −56
Original line number Original line Diff line number Diff line
@@ -16,7 +16,6 @@


package com.android.settings.notification;
package com.android.settings.notification;


import android.app.ActivityThread;
import android.app.INotificationManager;
import android.app.INotificationManager;
import android.app.NotificationManager;
import android.app.NotificationManager;
import android.content.BroadcastReceiver;
import android.content.BroadcastReceiver;
@@ -30,32 +29,26 @@ import android.os.Looper;
import android.os.Message;
import android.os.Message;
import android.os.ServiceManager;
import android.os.ServiceManager;
import android.os.Vibrator;
import android.os.Vibrator;
import android.provider.DeviceConfig;
import android.service.notification.NotificationListenerService;
import android.service.notification.NotificationListenerService;
import android.text.TextUtils;
import android.text.TextUtils;
import android.util.Log;
import android.util.Log;


import androidx.lifecycle.OnLifecycleEvent;
import androidx.lifecycle.OnLifecycleEvent;
import androidx.preference.PreferenceScreen;


import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.config.sysui.SystemUiDeviceConfigFlags;
import com.android.settings.R;
import com.android.settings.R;
import com.android.settings.Utils;
import com.android.settings.Utils;
import com.android.settingslib.core.lifecycle.Lifecycle;
import com.android.settingslib.core.lifecycle.Lifecycle;


import java.util.Objects;
import java.util.Objects;
import java.util.Set;


/**
/**
 * Update notification volume icon in Settings in response to user adjusting volume.
 * Update notification volume icon in Settings in response to user adjusting volume
 */
 */
public class NotificationVolumePreferenceController extends VolumeSeekBarPreferenceController {
public class NotificationVolumePreferenceController extends VolumeSeekBarPreferenceController {


    private static final String TAG = "NotificationVolumePreferenceController";
    private static final String TAG = "NotificationVolumePreferenceController";
    private static final String KEY_NOTIFICATION_VOLUME = "notification_volume";
    private static final String KEY_NOTIFICATION_VOLUME = "notification_volume";
    private static final boolean CONFIG_DEFAULT_VAL = false;
    private boolean mSeparateNotification;


    private Vibrator mVibrator;
    private Vibrator mVibrator;
    private int mRingerMode = AudioManager.RINGER_MODE_NORMAL;
    private int mRingerMode = AudioManager.RINGER_MODE_NORMAL;
@@ -63,74 +56,39 @@ public class NotificationVolumePreferenceController extends VolumeSeekBarPrefere
    private final RingReceiver mReceiver = new RingReceiver();
    private final RingReceiver mReceiver = new RingReceiver();
    private final H mHandler = new H();
    private final H mHandler = new H();
    private INotificationManager mNoMan;
    private INotificationManager mNoMan;


    private int mMuteIcon;
    private int mMuteIcon;
    private final int mNormalIconId =  R.drawable.ic_notifications;
    private final int mNormalIconId =  R.drawable.ic_notifications;
    private final int mVibrateIconId = R.drawable.ic_volume_ringer_vibrate;
    private final int mVibrateIconId = R.drawable.ic_volume_ringer_vibrate;
    private final int mSilentIconId = R.drawable.ic_notifications_off_24dp;
    private final int mSilentIconId = R.drawable.ic_notifications_off_24dp;


    private final boolean mRingNotificationAliased;


    public NotificationVolumePreferenceController(Context context) {
    public NotificationVolumePreferenceController(Context context) {
        this(context, KEY_NOTIFICATION_VOLUME);
        this(context, KEY_NOTIFICATION_VOLUME);
    }
    }


    public NotificationVolumePreferenceController(Context context, String key) {
    public NotificationVolumePreferenceController(Context context, String key) {
        super(context, key);
        super(context, key);

        mVibrator = (Vibrator) mContext.getSystemService(Context.VIBRATOR_SERVICE);
        mVibrator = (Vibrator) mContext.getSystemService(Context.VIBRATOR_SERVICE);
        if (mVibrator != null && !mVibrator.hasVibrator()) {
        if (mVibrator != null && !mVibrator.hasVibrator()) {
            mVibrator = null;
            mVibrator = null;
        }
        }


        mRingNotificationAliased = mContext.getResources().getBoolean(
                com.android.internal.R.bool.config_alias_ring_notif_stream_types);
        updateRingerMode();
        updateRingerMode();
    }
    }


    /**
     * Allow for notification slider to be enabled in the scenario where the config switches on
     * while settings page is already on the screen by always configuring the preference, even if it
     * is currently inactive.
     */
    @Override
    public void displayPreference(PreferenceScreen screen) {
        super.displayPreference(screen);
        if (mPreference == null) {
            setupVolPreference(screen);
        }
        mSeparateNotification = DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_SYSTEMUI,
                SystemUiDeviceConfigFlags.VOLUME_SEPARATE_NOTIFICATION, CONFIG_DEFAULT_VAL);
        if (mPreference != null) {
            mPreference.setVisible(getAvailabilityStatus() == AVAILABLE);
        }
        updateEffectsSuppressor();
        updatePreferenceIconAndSliderState();
    }

    /**
     * Only display the notification slider when the corresponding device config flag is set
     */
    private void onDeviceConfigChange(DeviceConfig.Properties properties) {
        Set<String> changeSet = properties.getKeyset();

        if (changeSet.contains(SystemUiDeviceConfigFlags.VOLUME_SEPARATE_NOTIFICATION)) {
            boolean newVal = properties.getBoolean(
                    SystemUiDeviceConfigFlags.VOLUME_SEPARATE_NOTIFICATION, CONFIG_DEFAULT_VAL);
            if (newVal != mSeparateNotification) {
                mSeparateNotification = newVal;
                // manually hiding the preference because being unavailable does not do the job
                if (mPreference != null) {
                    mPreference.setVisible(getAvailabilityStatus() == AVAILABLE);
                }
            }
        }
    }


    @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
    @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
    @Override
    @Override
    public void onResume() {
    public void onResume() {
        super.onResume();
        super.onResume();
        mReceiver.register(true);
        mReceiver.register(true);
        DeviceConfig.addOnPropertiesChangedListener(DeviceConfig.NAMESPACE_SYSTEMUI,
        updateEffectsSuppressor();
                ActivityThread.currentApplication().getMainExecutor(),
        updatePreferenceIconAndSliderState();
                this::onDeviceConfigChange);
    }
    }


    @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
    @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
@@ -138,17 +96,16 @@ public class NotificationVolumePreferenceController extends VolumeSeekBarPrefere
    public void onPause() {
    public void onPause() {
        super.onPause();
        super.onPause();
        mReceiver.register(false);
        mReceiver.register(false);
        DeviceConfig.removeOnPropertiesChangedListener(this::onDeviceConfigChange);
    }
    }


    @Override
    @Override
    public int getAvailabilityStatus() {
    public int getAvailabilityStatus() {
        boolean separateNotification = DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_SYSTEMUI,
                SystemUiDeviceConfigFlags.VOLUME_SEPARATE_NOTIFICATION, false);


        // Show separate notification slider if ring/notification are not aliased by AudioManager --
        // if they are, notification volume is controlled by RingVolumePreferenceController.
        return mContext.getResources().getBoolean(R.bool.config_show_notification_volume)
        return mContext.getResources().getBoolean(R.bool.config_show_notification_volume)
                && (!mRingNotificationAliased || !Utils.isVoiceCapable(mContext))
                && !mHelper.isSingleVolume()
                && !mHelper.isSingleVolume()
                && (separateNotification || !Utils.isVoiceCapable(mContext))
                ? AVAILABLE : UNSUPPORTED_ON_DEVICE;
                ? AVAILABLE : UNSUPPORTED_ON_DEVICE;
    }
    }


+30 −63
Original line number Original line Diff line number Diff line
@@ -16,7 +16,6 @@


package com.android.settings.notification;
package com.android.settings.notification;


import android.app.ActivityThread;
import android.app.INotificationManager;
import android.app.INotificationManager;
import android.app.NotificationManager;
import android.app.NotificationManager;
import android.content.BroadcastReceiver;
import android.content.BroadcastReceiver;
@@ -30,7 +29,6 @@ import android.os.Looper;
import android.os.Message;
import android.os.Message;
import android.os.ServiceManager;
import android.os.ServiceManager;
import android.os.Vibrator;
import android.os.Vibrator;
import android.provider.DeviceConfig;
import android.service.notification.NotificationListenerService;
import android.service.notification.NotificationListenerService;
import android.text.TextUtils;
import android.text.TextUtils;
import android.util.Log;
import android.util.Log;
@@ -38,13 +36,11 @@ import android.util.Log;
import androidx.lifecycle.OnLifecycleEvent;
import androidx.lifecycle.OnLifecycleEvent;


import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.config.sysui.SystemUiDeviceConfigFlags;
import com.android.settings.R;
import com.android.settings.R;
import com.android.settings.Utils;
import com.android.settings.Utils;
import com.android.settingslib.core.lifecycle.Lifecycle;
import com.android.settingslib.core.lifecycle.Lifecycle;


import java.util.Objects;
import java.util.Objects;
import java.util.Set;


/**
/**
 * This slider can represent both ring and notification, if the corresponding streams are aliased,
 * This slider can represent both ring and notification, if the corresponding streams are aliased,
@@ -63,21 +59,24 @@ public class RingVolumePreferenceController extends VolumeSeekBarPreferenceContr


    private int mMuteIcon;
    private int mMuteIcon;


    private int mNormalIconId;
    /*
     * Whether ring and notification streams are aliased together by AudioManager.
     * If they are, we'll present one volume control for both.
     * If not, we'll present separate volume controls.
     */
    private final boolean mRingAliasNotif;

    private final int mNormalIconId;
    @VisibleForTesting
    @VisibleForTesting
    int mVibrateIconId;
    final int mVibrateIconId;
    @VisibleForTesting
    @VisibleForTesting
    int mSilentIconId;
    final int mSilentIconId;


    @VisibleForTesting
    @VisibleForTesting
    int mTitleId;
    final int mTitleId;

    private boolean mSeparateNotification;


    private INotificationManager mNoMan;
    private INotificationManager mNoMan;


    private static final boolean CONFIG_DEFAULT_VAL = false;

    public RingVolumePreferenceController(Context context) {
    public RingVolumePreferenceController(Context context) {
        this(context, KEY_RING_VOLUME);
        this(context, KEY_RING_VOLUME);
    }
    }
@@ -88,56 +87,29 @@ public class RingVolumePreferenceController extends VolumeSeekBarPreferenceContr
        if (mVibrator != null && !mVibrator.hasVibrator()) {
        if (mVibrator != null && !mVibrator.hasVibrator()) {
            mVibrator = null;
            mVibrator = null;
        }
        }
        mSeparateNotification = DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_SYSTEMUI,
                SystemUiDeviceConfigFlags.VOLUME_SEPARATE_NOTIFICATION, CONFIG_DEFAULT_VAL);
        loadPreferenceIconResources(mSeparateNotification);
        updateRingerMode();
    }


    private void loadPreferenceIconResources(boolean separateNotification) {
        mRingAliasNotif = isRingAliasNotification();
        if (separateNotification) {
        if (mRingAliasNotif) {
            mTitleId = R.string.separate_ring_volume_option_title;
            mNormalIconId = R.drawable.ic_ring_volume;
            mSilentIconId = R.drawable.ic_ring_volume_off;
        } else {
            mTitleId = R.string.ring_volume_option_title;
            mTitleId = R.string.ring_volume_option_title;

            mNormalIconId = R.drawable.ic_notifications;
            mNormalIconId = R.drawable.ic_notifications;
            mSilentIconId = R.drawable.ic_notifications_off_24dp;
            mSilentIconId = R.drawable.ic_notifications_off_24dp;
        } else {
            mTitleId = R.string.separate_ring_volume_option_title;

            mNormalIconId = R.drawable.ic_ring_volume;
            mSilentIconId = R.drawable.ic_ring_volume_off;
        }
        }
        // todo: set a distinct vibrate icon for ring vs notification
        // todo: set a distinct vibrate icon for ring vs notification
        mVibrateIconId = R.drawable.ic_volume_ringer_vibrate;
        mVibrateIconId = R.drawable.ic_volume_ringer_vibrate;
    }


    /**
        updateRingerMode();
     * As the responsibility of this slider changes, so should its title & icon
     */
    public void onDeviceConfigChange(DeviceConfig.Properties properties) {
        Set<String> changeSet = properties.getKeyset();
        if (changeSet.contains(SystemUiDeviceConfigFlags.VOLUME_SEPARATE_NOTIFICATION)) {
            boolean valueUpdated = readSeparateNotificationVolumeConfig();
            if (valueUpdated) {
                updateEffectsSuppressor();
                selectPreferenceIconState();
                setPreferenceTitle();
            }
        }
    }

    /**
     * side effect: updates the cached value of the config, and also the icon
     * @return has the config changed?
     */
    private boolean readSeparateNotificationVolumeConfig() {
        boolean newVal = DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_SYSTEMUI,
                SystemUiDeviceConfigFlags.VOLUME_SEPARATE_NOTIFICATION, CONFIG_DEFAULT_VAL);

        boolean valueUpdated = newVal != mSeparateNotification;
        if (valueUpdated) {
            mSeparateNotification = newVal;
            loadPreferenceIconResources(newVal);
    }
    }


        return valueUpdated;
    @VisibleForTesting
    boolean isRingAliasNotification() {
        return mContext.getResources().getBoolean(
                com.android.internal.R.bool.config_alias_ring_notif_stream_types);
    }
    }


    @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
    @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
@@ -145,11 +117,8 @@ public class RingVolumePreferenceController extends VolumeSeekBarPreferenceContr
    public void onResume() {
    public void onResume() {
        super.onResume();
        super.onResume();
        mReceiver.register(true);
        mReceiver.register(true);
        readSeparateNotificationVolumeConfig();
        DeviceConfig.addOnPropertiesChangedListener(DeviceConfig.NAMESPACE_SYSTEMUI,
                ActivityThread.currentApplication().getMainExecutor(), this::onDeviceConfigChange);
        updateEffectsSuppressor();
        updateEffectsSuppressor();
        selectPreferenceIconState();
        updatePreferenceIcon();
        setPreferenceTitle();
        setPreferenceTitle();
    }
    }


@@ -158,7 +127,6 @@ public class RingVolumePreferenceController extends VolumeSeekBarPreferenceContr
    public void onPause() {
    public void onPause() {
        super.onPause();
        super.onPause();
        mReceiver.register(false);
        mReceiver.register(false);
        DeviceConfig.removeOnPropertiesChangedListener(this::onDeviceConfigChange);
    }
    }


    @Override
    @Override
@@ -202,7 +170,7 @@ public class RingVolumePreferenceController extends VolumeSeekBarPreferenceContr
        final int ringerMode = mHelper.getRingerModeInternal();
        final int ringerMode = mHelper.getRingerModeInternal();
        if (mRingerMode == ringerMode) return;
        if (mRingerMode == ringerMode) return;
        mRingerMode = ringerMode;
        mRingerMode = ringerMode;
        selectPreferenceIconState();
        updatePreferenceIcon();
    }
    }


    private void updateEffectsSuppressor() {
    private void updateEffectsSuppressor() {
@@ -222,8 +190,7 @@ public class RingVolumePreferenceController extends VolumeSeekBarPreferenceContr
            return;
            return;
        }
        }


        if (hintsMatch(hints, DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_SYSTEMUI,
        if (hintsMatch(hints, mRingAliasNotif)) {
                SystemUiDeviceConfigFlags.VOLUME_SEPARATE_NOTIFICATION, false))) {
            mSuppressor = suppressor;
            mSuppressor = suppressor;
            if (mPreference != null) {
            if (mPreference != null) {
                final String text = SuppressorHelper.getSuppressionText(mContext, suppressor);
                final String text = SuppressorHelper.getSuppressionText(mContext, suppressor);
@@ -233,11 +200,11 @@ public class RingVolumePreferenceController extends VolumeSeekBarPreferenceContr
    }
    }


    @VisibleForTesting
    @VisibleForTesting
    boolean hintsMatch(int hints, boolean notificationSeparated) {
    boolean hintsMatch(int hints, boolean ringNotificationAliased) {
        return (hints & NotificationListenerService.HINT_HOST_DISABLE_CALL_EFFECTS) != 0
        return (hints & NotificationListenerService.HINT_HOST_DISABLE_CALL_EFFECTS) != 0
                || (hints & NotificationListenerService.HINT_HOST_DISABLE_EFFECTS) != 0
                || (hints & NotificationListenerService.HINT_HOST_DISABLE_EFFECTS) != 0
                || ((hints & NotificationListenerService.HINT_HOST_DISABLE_NOTIFICATION_EFFECTS)
                || ((hints & NotificationListenerService.HINT_HOST_DISABLE_NOTIFICATION_EFFECTS)
                != 0 && !notificationSeparated);
                != 0 && ringNotificationAliased);
    }
    }


    @VisibleForTesting
    @VisibleForTesting
@@ -250,7 +217,7 @@ public class RingVolumePreferenceController extends VolumeSeekBarPreferenceContr
        mVibrator = vibrator;
        mVibrator = vibrator;
    }
    }


    private void selectPreferenceIconState() {
    private void updatePreferenceIcon() {
        if (mPreference != null) {
        if (mPreference != null) {
            if (mRingerMode == AudioManager.RINGER_MODE_NORMAL) {
            if (mRingerMode == AudioManager.RINGER_MODE_NORMAL) {
                mPreference.showIcon(mNormalIconId);
                mPreference.showIcon(mNormalIconId);
+4 −8
Original line number Original line Diff line number Diff line
@@ -55,16 +55,12 @@ public abstract class VolumeSeekBarPreferenceController extends
    public void displayPreference(PreferenceScreen screen) {
    public void displayPreference(PreferenceScreen screen) {
        super.displayPreference(screen);
        super.displayPreference(screen);
        if (isAvailable()) {
        if (isAvailable()) {
            setupVolPreference(screen);
        }
    }

    protected void setupVolPreference(PreferenceScreen screen) {
            mPreference = screen.findPreference(getPreferenceKey());
            mPreference = screen.findPreference(getPreferenceKey());
            mPreference.setCallback(mVolumePreferenceCallback);
            mPreference.setCallback(mVolumePreferenceCallback);
            mPreference.setStream(getAudioStream());
            mPreference.setStream(getAudioStream());
            mPreference.setMuteIcon(getMuteIcon());
            mPreference.setMuteIcon(getMuteIcon());
        }
        }
    }


    @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
    @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
    public void onResume() {
    public void onResume() {
+4 −88
Original line number Original line Diff line number Diff line
@@ -18,7 +18,6 @@ package com.android.settings.notification;


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


import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.when;
import static org.mockito.Mockito.when;


@@ -26,17 +25,10 @@ import android.content.Context;
import android.content.res.Resources;
import android.content.res.Resources;
import android.media.AudioManager;
import android.media.AudioManager;
import android.os.Vibrator;
import android.os.Vibrator;
import android.provider.DeviceConfig;
import android.service.notification.NotificationListenerService;
import android.service.notification.NotificationListenerService;
import android.telephony.TelephonyManager;
import android.telephony.TelephonyManager;


import androidx.preference.PreferenceManager;
import com.android.internal.R;
import androidx.preference.PreferenceScreen;
import androidx.test.core.app.ApplicationProvider;

import com.android.internal.config.sysui.SystemUiDeviceConfigFlags;
import com.android.settings.core.BasePreferenceController;
import com.android.settings.testutils.shadow.ShadowDeviceConfig;


import org.junit.Before;
import org.junit.Before;
import org.junit.Test;
import org.junit.Test;
@@ -45,12 +37,11 @@ import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.mockito.MockitoAnnotations;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.RuntimeEnvironment;
import org.robolectric.RuntimeEnvironment;
import org.robolectric.Shadows;
import org.robolectric.annotation.Config;
import org.robolectric.annotation.Config;


@RunWith(RobolectricTestRunner.class)
@RunWith(RobolectricTestRunner.class)
@Config(shadows = {ShadowDeviceConfig.class})
public class NotificationVolumePreferenceControllerTest {
public class NotificationVolumePreferenceControllerTest {

    @Mock
    @Mock
    private AudioHelper mHelper;
    private AudioHelper mHelper;
    @Mock
    @Mock
@@ -61,11 +52,6 @@ public class NotificationVolumePreferenceControllerTest {
    private Vibrator mVibrator;
    private Vibrator mVibrator;
    @Mock
    @Mock
    private Resources mResources;
    private Resources mResources;
    @Mock
    private PreferenceManager mPreferenceManager;

    private static final String READ_DEVICE_CONFIG_PERMISSION =
            "android.permission.READ_DEVICE_CONFIG";


    private Context mContext;
    private Context mContext;
    private NotificationVolumePreferenceController mController;
    private NotificationVolumePreferenceController mController;
@@ -101,9 +87,7 @@ public class NotificationVolumePreferenceControllerTest {
    public void isAvailable_voiceCapable_aliasedWithRing_shouldReturnFalse() {
    public void isAvailable_voiceCapable_aliasedWithRing_shouldReturnFalse() {
        when(mResources.getBoolean(
        when(mResources.getBoolean(
                com.android.settings.R.bool.config_show_notification_volume)).thenReturn(true);
                com.android.settings.R.bool.config_show_notification_volume)).thenReturn(true);

        when(mResources.getBoolean(R.bool.config_alias_ring_notif_stream_types)).thenReturn(true);
        DeviceConfig.setProperty(DeviceConfig.NAMESPACE_SYSTEMUI,
                SystemUiDeviceConfigFlags.VOLUME_SEPARATE_NOTIFICATION, "false", false);


        NotificationVolumePreferenceController controller =
        NotificationVolumePreferenceController controller =
                new NotificationVolumePreferenceController(mContext);
                new NotificationVolumePreferenceController(mContext);
@@ -121,9 +105,7 @@ public class NotificationVolumePreferenceControllerTest {
    public void isAvailable_voiceCapable_separatedFromRing_shouldReturnTrue() {
    public void isAvailable_voiceCapable_separatedFromRing_shouldReturnTrue() {
        when(mResources.getBoolean(
        when(mResources.getBoolean(
                com.android.settings.R.bool.config_show_notification_volume)).thenReturn(true);
                com.android.settings.R.bool.config_show_notification_volume)).thenReturn(true);

        when(mResources.getBoolean(R.bool.config_alias_ring_notif_stream_types)).thenReturn(false);
        DeviceConfig.setProperty(DeviceConfig.NAMESPACE_SYSTEMUI,
                SystemUiDeviceConfigFlags.VOLUME_SEPARATE_NOTIFICATION, "true", false);


        NotificationVolumePreferenceController controller =
        NotificationVolumePreferenceController controller =
                new NotificationVolumePreferenceController(mContext);
                new NotificationVolumePreferenceController(mContext);
@@ -188,70 +170,4 @@ public class NotificationVolumePreferenceControllerTest {
                .isTrue();
                .isTrue();
    }
    }


    @Test
    public void enableSeparateNotificationConfig_controllerBecomesAvailable() {
        PreferenceScreen screen = spy(new PreferenceScreen(mContext, null));
        VolumeSeekBarPreference volumeSeekBarPreference = mock(VolumeSeekBarPreference.class);
        when(screen.getPreferenceManager()).thenReturn(mPreferenceManager);
        when(screen.getContext()).thenReturn(mContext);
        when(mResources.getBoolean(
                com.android.settings.R.bool.config_show_notification_volume)).thenReturn(true);
        // block the alternative condition to enable controller
        when(mTelephonyManager.isVoiceCapable()).thenReturn(true);

        DeviceConfig.setProperty(DeviceConfig.NAMESPACE_SYSTEMUI,
                SystemUiDeviceConfigFlags.VOLUME_SEPARATE_NOTIFICATION, "false", false);

        NotificationVolumePreferenceController controller =
                new NotificationVolumePreferenceController(mContext);
        when(screen.findPreference(controller.getPreferenceKey()))
                .thenReturn(volumeSeekBarPreference);

        // allow the controller to subscribe
        Shadows.shadowOf((android.app.Application) ApplicationProvider.getApplicationContext())
                .grantPermissions(READ_DEVICE_CONFIG_PERMISSION);
        controller.onResume();
        controller.displayPreference(screen);

        DeviceConfig.setProperty(DeviceConfig.NAMESPACE_SYSTEMUI,
                SystemUiDeviceConfigFlags.VOLUME_SEPARATE_NOTIFICATION, Boolean.toString(true),
                false);

        assertThat(controller.getAvailabilityStatus()
                == BasePreferenceController.AVAILABLE).isTrue();
    }

    @Test
    public void disableSeparateNotificationConfig_controllerBecomesUnavailable() {
        PreferenceScreen screen = spy(new PreferenceScreen(mContext, null));
        VolumeSeekBarPreference volumeSeekBarPreference = mock(VolumeSeekBarPreference.class);
        when(screen.getPreferenceManager()).thenReturn(mPreferenceManager);
        when(screen.getContext()).thenReturn(mContext);
        when(mResources.getBoolean(
                com.android.settings.R.bool.config_show_notification_volume)).thenReturn(true);

        // block the alternative condition to enable controller
        when(mTelephonyManager.isVoiceCapable()).thenReturn(true);

        DeviceConfig.setProperty(DeviceConfig.NAMESPACE_SYSTEMUI,
                SystemUiDeviceConfigFlags.VOLUME_SEPARATE_NOTIFICATION, "true", false);

        NotificationVolumePreferenceController controller =
                new NotificationVolumePreferenceController(mContext);

        when(screen.findPreference(controller.getPreferenceKey()))
                .thenReturn(volumeSeekBarPreference);

        Shadows.shadowOf((android.app.Application) ApplicationProvider.getApplicationContext())
                .grantPermissions(READ_DEVICE_CONFIG_PERMISSION);
        controller.onResume();
        controller.displayPreference(screen);

        DeviceConfig.setProperty(DeviceConfig.NAMESPACE_SYSTEMUI,
                SystemUiDeviceConfigFlags.VOLUME_SEPARATE_NOTIFICATION, "false", false);

        assertThat(controller.getAvailabilityStatus()
                == BasePreferenceController.UNSUPPORTED_ON_DEVICE).isTrue();
    }

}
}
Loading