Merge "Make volume sliders sliceable" into pi-dev

This commit is contained in:
Julia Reynolds
2018-04-06 20:48:31 +00:00
committed by Android (Google) Code Review
16 changed files with 200 additions and 102 deletions

View File

@@ -24,6 +24,7 @@ import android.support.v7.preference.Preference;
import com.android.internal.annotations.VisibleForTesting;
import com.android.settings.accounts.AccountRestrictionHelper;
import com.android.settings.core.PreferenceControllerMixin;
import com.android.settings.core.SliderPreferenceController;
import com.android.settingslib.RestrictedPreference;
import com.android.settingslib.core.AbstractPreferenceController;
@@ -32,17 +33,18 @@ import com.android.settingslib.core.AbstractPreferenceController;
* restriction
*/
public abstract class AdjustVolumeRestrictedPreferenceController extends
AbstractPreferenceController implements PreferenceControllerMixin {
SliderPreferenceController implements PreferenceControllerMixin {
private AccountRestrictionHelper mHelper;
public AdjustVolumeRestrictedPreferenceController(Context context) {
this(context, new AccountRestrictionHelper(context));
public AdjustVolumeRestrictedPreferenceController(Context context, String key) {
this(context, new AccountRestrictionHelper(context), key);
}
@VisibleForTesting
AdjustVolumeRestrictedPreferenceController(Context context, AccountRestrictionHelper helper) {
super(context);
AdjustVolumeRestrictedPreferenceController(Context context, AccountRestrictionHelper helper,
String key) {
super(context, key);
mHelper = helper;
}

View File

@@ -20,32 +20,21 @@ import android.content.Context;
import android.media.AudioManager;
import com.android.internal.annotations.VisibleForTesting;
import com.android.settings.notification.VolumeSeekBarPreference.Callback;
import com.android.settings.R;
import com.android.settingslib.core.lifecycle.Lifecycle;
public class AlarmVolumePreferenceController extends
VolumeSeekBarPreferenceController {
private static final String KEY_ALARM_VOLUME = "alarm_volume";
private AudioHelper mHelper;
public AlarmVolumePreferenceController(Context context, Callback callback,
Lifecycle lifecycle) {
this(context, callback, lifecycle, new AudioHelper(context));
}
@VisibleForTesting
AlarmVolumePreferenceController(Context context, Callback callback, Lifecycle lifecycle,
AudioHelper helper) {
super(context, callback, lifecycle);
mHelper = helper;
public AlarmVolumePreferenceController(Context context) {
super(context, KEY_ALARM_VOLUME);
}
@Override
public boolean isAvailable() {
public int getAvailabilityStatus() {
return mContext.getResources().getBoolean(R.bool.config_show_alarm_volume)
&& !mHelper.isSingleVolume();
&& !mHelper.isSingleVolume() ? AVAILABLE : DISABLED_UNSUPPORTED;
}
@Override
@@ -62,5 +51,4 @@ public class AlarmVolumePreferenceController extends
public int getMuteIcon() {
return com.android.internal.R.drawable.ic_audio_alarm_mute;
}
}

View File

@@ -18,6 +18,7 @@ package com.android.settings.notification;
import android.annotation.UserIdInt;
import android.content.Context;
import android.media.AudioManager;
import android.media.AudioSystem;
import android.os.UserHandle;
import android.os.UserManager;
@@ -29,9 +30,11 @@ import com.android.settings.Utils;
public class AudioHelper {
private Context mContext;
private AudioManager mAudioManager;
public AudioHelper(Context context) {
mContext = context;
mAudioManager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE);
}
public boolean isSingleVolume() {
@@ -49,4 +52,25 @@ public class AudioHelper {
public Context createPackageContextAsUser(@UserIdInt int profileId) {
return Utils.createPackageContextAsUser(mContext, profileId);
}
public int getRingerModeInternal() {
return mAudioManager.getRingerModeInternal();
}
public int getLastAudibleStreamVolume(int stream) {
return mAudioManager.getLastAudibleStreamVolume(stream);
}
public int getStreamVolume(int stream) {
return mAudioManager.getStreamVolume(stream);
}
public boolean setStreamVolume(int stream, int volume) {
mAudioManager.setStreamVolume(stream, volume, 0);
return true;
}
public int getMaxVolume(int stream) {
return mAudioManager.getStreamMaxVolume(stream);
}
}

View File

@@ -27,13 +27,15 @@ public class MediaVolumePreferenceController extends
private static final String KEY_MEDIA_VOLUME = "media_volume";
public MediaVolumePreferenceController(Context context, Callback callback, Lifecycle lifecycle) {
super(context, callback, lifecycle);
public MediaVolumePreferenceController(Context context) {
super(context, KEY_MEDIA_VOLUME);
}
@Override
public boolean isAvailable() {
return mContext.getResources().getBoolean(R.bool.config_show_media_volume);
public int getAvailabilityStatus() {
return mContext.getResources().getBoolean(R.bool.config_show_media_volume)
? AVAILABLE
: DISABLED_UNSUPPORTED;
}
@Override
@@ -50,5 +52,4 @@ public class MediaVolumePreferenceController extends
public int getMuteIcon() {
return com.android.internal.R.drawable.ic_audio_media_mute;
}
}

View File

@@ -22,32 +22,21 @@ import android.media.AudioManager;
import com.android.internal.annotations.VisibleForTesting;
import com.android.settings.R;
import com.android.settings.Utils;
import com.android.settings.notification.VolumeSeekBarPreference.Callback;
import com.android.settingslib.core.lifecycle.Lifecycle;
public class NotificationVolumePreferenceController extends
RingVolumePreferenceController {
private static final String KEY_NOTIFICATION_VOLUME = "notification_volume";
private AudioHelper mHelper;
public NotificationVolumePreferenceController(Context context, Callback callback,
Lifecycle lifecycle) {
this(context, callback, lifecycle, new AudioHelper(context));
public NotificationVolumePreferenceController(Context context) {
super(context, KEY_NOTIFICATION_VOLUME);
}
@VisibleForTesting
NotificationVolumePreferenceController(Context context,
Callback callback, Lifecycle lifecycle, AudioHelper helper) {
super(context, callback, lifecycle);
mHelper = helper;
}
@Override
public boolean isAvailable() {
public int getAvailabilityStatus() {
return mContext.getResources().getBoolean(R.bool.config_show_notification_volume)
&& !Utils.isVoiceCapable(mContext) && !mHelper.isSingleVolume();
&& !Utils.isVoiceCapable(mContext) && !mHelper.isSingleVolume()
? AVAILABLE : DISABLED_UNSUPPORTED;
}
@Override

View File

@@ -31,8 +31,6 @@ import android.os.Vibrator;
import com.android.internal.annotations.VisibleForTesting;
import com.android.settings.R;
import com.android.settings.Utils;
import com.android.settings.notification.VolumeSeekBarPreference.Callback;
import com.android.settingslib.core.lifecycle.Lifecycle;
import java.util.Objects;
@@ -41,24 +39,18 @@ public class RingVolumePreferenceController extends VolumeSeekBarPreferenceContr
private static final String TAG = "RingVolumeController";
private static final String KEY_RING_VOLUME = "ring_volume";
private AudioManager mAudioManager;
private Vibrator mVibrator;
private int mRingerMode = -1;
private ComponentName mSuppressor;
private final RingReceiver mReceiver = new RingReceiver();
private final H mHandler = new H();
private AudioHelper mHelper;
public RingVolumePreferenceController(Context context, Callback callback, Lifecycle lifecycle) {
this(context, callback, lifecycle, new AudioHelper(context));
public RingVolumePreferenceController(Context context) {
this(context, KEY_RING_VOLUME);
}
@VisibleForTesting
RingVolumePreferenceController(Context context, Callback callback, Lifecycle lifecycle,
AudioHelper helper) {
super(context, callback, lifecycle);
mHelper = helper;
mAudioManager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE);
public RingVolumePreferenceController(Context context, String key) {
super(context, key);
mVibrator = (Vibrator) mContext.getSystemService(Context.VIBRATOR_SERVICE);
if (mVibrator != null && !mVibrator.hasVibrator()) {
mVibrator = null;
@@ -86,8 +78,9 @@ public class RingVolumePreferenceController extends VolumeSeekBarPreferenceContr
}
@Override
public boolean isAvailable() {
return Utils.isVoiceCapable(mContext) && !mHelper.isSingleVolume();
public int getAvailabilityStatus() {
return Utils.isVoiceCapable(mContext) && !mHelper.isSingleVolume()
? AVAILABLE : DISABLED_UNSUPPORTED;
}
@Override
@@ -101,7 +94,7 @@ public class RingVolumePreferenceController extends VolumeSeekBarPreferenceContr
}
private void updateRingerMode() {
final int ringerMode = mAudioManager.getRingerModeInternal();
final int ringerMode = mHelper.getRingerModeInternal();
if (mRingerMode == ringerMode) return;
mRingerMode = ringerMode;
updatePreferenceIcon();
@@ -109,7 +102,7 @@ public class RingVolumePreferenceController extends VolumeSeekBarPreferenceContr
private boolean wasRingerModeVibrate() {
return mVibrator != null && mRingerMode == AudioManager.RINGER_MODE_SILENT
&& mAudioManager.getLastAudibleStreamVolume(AudioManager.STREAM_RING) == 0;
&& mHelper.getLastAudibleStreamVolume(getAudioStream()) == 0;
}
private void updateEffectsSuppressor() {

View File

@@ -124,7 +124,7 @@ public class SoundSettings extends DashboardFragment {
@Override
protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
return buildPreferenceControllers(context, this, mVolumeCallback, getLifecycle());
return buildPreferenceControllers(context, this, getLifecycle());
}
@Override
@@ -143,6 +143,15 @@ public class SoundSettings extends DashboardFragment {
}
}
@Override
public void onAttach(Context context) {
super.onAttach(context);
use(AlarmVolumePreferenceController.class).setCallback(mVolumeCallback);
use(MediaVolumePreferenceController.class).setCallback(mVolumeCallback);
use(RingVolumePreferenceController.class).setCallback(mVolumeCallback);
use(NotificationVolumePreferenceController.class).setCallback(mVolumeCallback);
}
// === Volumes ===
final class VolumePreferenceCallback implements VolumeSeekBarPreference.Callback {
@@ -176,18 +185,12 @@ public class SoundSettings extends DashboardFragment {
}
private static List<AbstractPreferenceController> buildPreferenceControllers(Context context,
SoundSettings fragment, VolumeSeekBarPreference.Callback callback,
Lifecycle lifecycle) {
SoundSettings fragment, Lifecycle lifecycle) {
final List<AbstractPreferenceController> controllers = new ArrayList<>();
controllers.add(new ZenModePreferenceController(context, lifecycle, KEY_ZEN_MODE));
controllers.add(new VibrateWhenRingPreferenceController(context));
// === Volumes ===
controllers.add(new AlarmVolumePreferenceController(context, callback, lifecycle));
controllers.add(new MediaVolumePreferenceController(context, callback, lifecycle));
controllers.add(
new NotificationVolumePreferenceController(context, callback, lifecycle));
controllers.add(new RingVolumePreferenceController(context, callback, lifecycle));
// Volumes are added via xml
// === Phone & notification ringtone ===
controllers.add(new PhoneRingtonePreferenceController(context));
@@ -257,7 +260,7 @@ public class SoundSettings extends DashboardFragment {
public List<AbstractPreferenceController> createPreferenceControllers(
Context context) {
return buildPreferenceControllers(context, null /* fragment */,
null /* callback */, null /* lifecycle */);
null /* lifecycle */);
}
@Override

View File

@@ -16,31 +16,37 @@
package com.android.settings.notification;
import android.arch.lifecycle.LifecycleObserver;
import android.arch.lifecycle.OnLifecycleEvent;
import android.content.Context;
import android.support.v7.preference.PreferenceScreen;
import com.android.internal.annotations.VisibleForTesting;
import com.android.settings.notification.VolumeSeekBarPreference.Callback;
import com.android.settingslib.core.lifecycle.Lifecycle;
import com.android.settingslib.core.lifecycle.LifecycleObserver;
import com.android.settingslib.core.lifecycle.events.OnPause;
import com.android.settingslib.core.lifecycle.events.OnResume;
/**
* Base class for preference controller that handles VolumeSeekBarPreference
*/
public abstract class VolumeSeekBarPreferenceController extends
AdjustVolumeRestrictedPreferenceController implements LifecycleObserver, OnResume, OnPause {
AdjustVolumeRestrictedPreferenceController implements LifecycleObserver {
protected VolumeSeekBarPreference mPreference;
protected VolumeSeekBarPreference.Callback mVolumePreferenceCallback;
protected AudioHelper mHelper;
public VolumeSeekBarPreferenceController(Context context, Callback callback,
Lifecycle lifecycle) {
super(context);
public VolumeSeekBarPreferenceController(Context context, String key) {
super(context, key);
setAudioHelper(new AudioHelper(context));
}
@VisibleForTesting
void setAudioHelper(AudioHelper helper) {
mHelper = helper;
}
public void setCallback(Callback callback) {
mVolumePreferenceCallback = callback;
if (lifecycle != null) {
lifecycle.addObserver(this);
}
}
@Override
@@ -54,20 +60,44 @@ public abstract class VolumeSeekBarPreferenceController extends
}
}
@Override
@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
public void onResume() {
if (mPreference != null) {
mPreference.onActivityResume();
}
}
@Override
@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
public void onPause() {
if (mPreference != null) {
mPreference.onActivityPause();
}
}
@Override
public int getSliderPosition() {
if (mPreference != null) {
return mPreference.getProgress();
}
return mHelper.getStreamVolume(getAudioStream());
}
@Override
public boolean setSliderPosition(int position) {
if (mPreference != null) {
mPreference.setProgress(position);
}
return mHelper.setStreamVolume(getAudioStream(), position);
}
@Override
public int getMaxSteps() {
if (mPreference != null) {
return mPreference.getMax();
}
return mHelper.getMaxVolume(getAudioStream());
}
protected abstract int getAudioStream();
protected abstract int getMuteIcon();

View File

@@ -27,13 +27,15 @@ import android.support.v7.preference.Preference;
import android.support.v7.preference.PreferenceScreen;
import android.util.Slog;
import com.android.settings.core.PreferenceControllerMixin;
import com.android.settingslib.core.AbstractPreferenceController;
import com.android.settingslib.core.lifecycle.Lifecycle;
import com.android.settingslib.core.lifecycle.LifecycleObserver;
import com.android.settingslib.core.lifecycle.events.OnPause;
import com.android.settingslib.core.lifecycle.events.OnResume;
public class ZenModePreferenceController extends AdjustVolumeRestrictedPreferenceController
implements LifecycleObserver, OnResume, OnPause {
public class ZenModePreferenceController extends AbstractPreferenceController
implements LifecycleObserver, OnResume, OnPause, PreferenceControllerMixin {
private final String mKey;
private SettingObserver mSettingObserver;