Merge changes from topic "sound" into main
* changes: Fix IntentReceiver leaked on Sound & vibration Get rid of VolumeSeekBarPreferenceController.setCallback
This commit is contained in:
@@ -28,17 +28,18 @@ import android.os.Message;
|
||||
import android.service.notification.NotificationListenerService;
|
||||
import android.view.View;
|
||||
|
||||
import androidx.lifecycle.OnLifecycleEvent;
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.lifecycle.DefaultLifecycleObserver;
|
||||
import androidx.lifecycle.LifecycleOwner;
|
||||
import androidx.preference.PreferenceScreen;
|
||||
|
||||
import com.android.settings.R;
|
||||
import com.android.settingslib.core.lifecycle.Lifecycle;
|
||||
|
||||
/**
|
||||
* Update notification volume icon in Settings in response to user adjusting volume.
|
||||
*/
|
||||
public class NotificationVolumePreferenceController extends
|
||||
RingerModeAffectedVolumePreferenceController {
|
||||
RingerModeAffectedVolumePreferenceController implements DefaultLifecycleObserver {
|
||||
|
||||
private static final String KEY_NOTIFICATION_VOLUME = "notification_volume";
|
||||
private static final String TAG = "NotificationVolumePreferenceController";
|
||||
@@ -80,17 +81,13 @@ public class NotificationVolumePreferenceController extends
|
||||
updateEnabledState();
|
||||
}
|
||||
|
||||
@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
|
||||
@Override
|
||||
public void onResume() {
|
||||
super.onResume();
|
||||
public void onResume(@NonNull LifecycleOwner owner) {
|
||||
mReceiver.register(true);
|
||||
}
|
||||
|
||||
@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
|
||||
@Override
|
||||
public void onPause() {
|
||||
super.onPause();
|
||||
public void onPause(@NonNull LifecycleOwner owner) {
|
||||
mReceiver.register(false);
|
||||
}
|
||||
|
||||
|
||||
@@ -49,8 +49,7 @@ public class RemoteVolumeSeekBarPreference extends VolumeSeekBarPreference {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void init() {
|
||||
if (mSeekBar == null) return;
|
||||
protected void onBindViewHolder() {
|
||||
setContinuousUpdates(true);
|
||||
updateIconView();
|
||||
updateSuppressionText();
|
||||
|
||||
@@ -27,16 +27,17 @@ import android.os.Looper;
|
||||
import android.os.Message;
|
||||
import android.service.notification.NotificationListenerService;
|
||||
|
||||
import androidx.lifecycle.OnLifecycleEvent;
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.lifecycle.DefaultLifecycleObserver;
|
||||
import androidx.lifecycle.LifecycleOwner;
|
||||
|
||||
import com.android.settings.R;
|
||||
import com.android.settingslib.core.lifecycle.Lifecycle;
|
||||
|
||||
/**
|
||||
* This slider represents both ring and notification
|
||||
*/
|
||||
public class RingVolumePreferenceController extends
|
||||
RingerModeAffectedVolumePreferenceController {
|
||||
RingerModeAffectedVolumePreferenceController implements DefaultLifecycleObserver {
|
||||
|
||||
private static final String KEY_RING_VOLUME = "ring_volume";
|
||||
private static final String TAG = "RingVolumePreferenceController";
|
||||
@@ -58,10 +59,8 @@ public class RingVolumePreferenceController extends
|
||||
updateRingerMode();
|
||||
}
|
||||
|
||||
@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
|
||||
@Override
|
||||
public void onResume() {
|
||||
super.onResume();
|
||||
public void onResume(@NonNull LifecycleOwner owner) {
|
||||
mReceiver.register(true);
|
||||
updateEffectsSuppressor();
|
||||
selectPreferenceIconState();
|
||||
@@ -71,10 +70,8 @@ public class RingVolumePreferenceController extends
|
||||
}
|
||||
}
|
||||
|
||||
@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
|
||||
@Override
|
||||
public void onPause() {
|
||||
super.onPause();
|
||||
public void onPause(@NonNull LifecycleOwner owner) {
|
||||
mReceiver.register(false);
|
||||
}
|
||||
|
||||
|
||||
@@ -27,17 +27,18 @@ import android.os.Looper;
|
||||
import android.os.Message;
|
||||
import android.service.notification.NotificationListenerService;
|
||||
|
||||
import androidx.lifecycle.OnLifecycleEvent;
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.lifecycle.DefaultLifecycleObserver;
|
||||
import androidx.lifecycle.LifecycleOwner;
|
||||
|
||||
import com.android.settings.R;
|
||||
import com.android.settingslib.core.lifecycle.Lifecycle;
|
||||
|
||||
/**
|
||||
* This slider is used to represent ring volume when ring is separated from notification
|
||||
*/
|
||||
// LINT.IfChange
|
||||
public class SeparateRingVolumePreferenceController extends
|
||||
RingerModeAffectedVolumePreferenceController {
|
||||
RingerModeAffectedVolumePreferenceController implements DefaultLifecycleObserver {
|
||||
|
||||
private static final String KEY_SEPARATE_RING_VOLUME = "separate_ring_volume";
|
||||
private static final String TAG = "SeparateRingVolumePreferenceController";
|
||||
@@ -59,10 +60,8 @@ public class SeparateRingVolumePreferenceController extends
|
||||
updateRingerMode();
|
||||
}
|
||||
|
||||
@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
|
||||
@Override
|
||||
public void onResume() {
|
||||
super.onResume();
|
||||
public void onResume(@NonNull LifecycleOwner owner) {
|
||||
mReceiver.register(true);
|
||||
updateEffectsSuppressor();
|
||||
selectPreferenceIconState();
|
||||
@@ -73,10 +72,8 @@ public class SeparateRingVolumePreferenceController extends
|
||||
}
|
||||
}
|
||||
|
||||
@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
|
||||
@Override
|
||||
public void onPause() {
|
||||
super.onPause();
|
||||
public void onPause(@NonNull LifecycleOwner owner) {
|
||||
mReceiver.register(false);
|
||||
}
|
||||
|
||||
|
||||
@@ -46,6 +46,7 @@ import com.android.settings.widget.UpdatableListPreferenceDialogFragment;
|
||||
import com.android.settingslib.core.AbstractPreferenceController;
|
||||
import com.android.settingslib.core.instrumentation.Instrumentable;
|
||||
import com.android.settingslib.core.lifecycle.Lifecycle;
|
||||
import com.android.settingslib.preference.UtilsKt;
|
||||
import com.android.settingslib.search.SearchIndexable;
|
||||
|
||||
import java.util.ArrayList;
|
||||
@@ -113,14 +114,12 @@ public class SoundSettings extends DashboardFragment implements OnActivityResult
|
||||
if (phoneRingTonePreference != null && openPhoneRingtonePicker) {
|
||||
onPreferenceTreeClick(phoneRingTonePreference);
|
||||
}
|
||||
if (isCatalystEnabled()) {
|
||||
for (String key : getPreferenceKeysInHierarchy()) {
|
||||
Preference preference = findPreference(key);
|
||||
if (preference instanceof VolumeSeekBarPreference) {
|
||||
((VolumeSeekBarPreference) preference).setCallback(mVolumeCallback);
|
||||
}
|
||||
UtilsKt.forEachRecursively(getPreferenceScreen(), preference -> {
|
||||
if (preference instanceof VolumeSeekBarPreference) {
|
||||
((VolumeSeekBarPreference) preference).setCallback(mVolumeCallback);
|
||||
}
|
||||
}
|
||||
return null;
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -203,22 +202,11 @@ public class SoundSettings extends DashboardFragment implements OnActivityResult
|
||||
@Override
|
||||
public void onAttach(Context context) {
|
||||
super.onAttach(context);
|
||||
ArrayList<VolumeSeekBarPreferenceController> volumeControllers = new ArrayList<>();
|
||||
volumeControllers.add(use(AlarmVolumePreferenceController.class));
|
||||
volumeControllers.add(use(MediaVolumePreferenceController.class));
|
||||
volumeControllers.add(use(SeparateRingVolumePreferenceController.class));
|
||||
volumeControllers.add(use(NotificationVolumePreferenceController.class));
|
||||
volumeControllers.add(use(CallVolumePreferenceController.class));
|
||||
|
||||
use(HandsFreeProfileOutputPreferenceController.class).setCallback(listPreference ->
|
||||
onPreferenceDataChanged(listPreference));
|
||||
mHfpOutputControllerKey =
|
||||
use(HandsFreeProfileOutputPreferenceController.class).getPreferenceKey();
|
||||
|
||||
for (VolumeSeekBarPreferenceController controller : volumeControllers) {
|
||||
controller.setCallback(mVolumeCallback);
|
||||
getSettingsLifecycle().addObserver(controller);
|
||||
}
|
||||
}
|
||||
|
||||
// === Volumes ===
|
||||
|
||||
@@ -62,7 +62,6 @@ public class VolumeSeekBarPreference extends SeekBarPreference {
|
||||
private boolean mZenMuted;
|
||||
private int mIconResId;
|
||||
private int mMuteIconResId;
|
||||
private boolean mStopped;
|
||||
@VisibleForTesting
|
||||
AudioManager mAudioManager;
|
||||
private Locale mLocale;
|
||||
@@ -114,18 +113,13 @@ public class VolumeSeekBarPreference extends SeekBarPreference {
|
||||
mListener = listener;
|
||||
}
|
||||
|
||||
public void onActivityResume() {
|
||||
if (mStopped) {
|
||||
init();
|
||||
}
|
||||
}
|
||||
|
||||
public void onActivityPause() {
|
||||
mStopped = true;
|
||||
@Override
|
||||
public void onDetached() {
|
||||
if (mVolumizer != null) {
|
||||
mVolumizer.stop();
|
||||
mVolumizer = null;
|
||||
}
|
||||
super.onDetached();
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -135,16 +129,25 @@ public class VolumeSeekBarPreference extends SeekBarPreference {
|
||||
mIconView = (ImageView) view.findViewById(com.android.internal.R.id.icon);
|
||||
mSuppressionTextView = (TextView) view.findViewById(R.id.suppression_text);
|
||||
mTitle = (TextView) view.findViewById(com.android.internal.R.id.title);
|
||||
init();
|
||||
onBindViewHolder();
|
||||
}
|
||||
|
||||
protected void init() {
|
||||
if (mSeekBar == null) return;
|
||||
// It's unnecessary to set up relevant volumizer configuration if preference is disabled.
|
||||
if (!isEnabled()) {
|
||||
mSeekBar.setEnabled(false);
|
||||
return;
|
||||
protected void onBindViewHolder() {
|
||||
boolean isEnabled = isEnabled();
|
||||
mSeekBar.setEnabled(isEnabled);
|
||||
if (mVolumizer == null) {
|
||||
createSeekBarVolumizer();
|
||||
}
|
||||
mVolumizer.setSeekBar(mSeekBar);
|
||||
updateIconView();
|
||||
updateSuppressionText();
|
||||
if (isEnabled && mListener != null) {
|
||||
mListener.onUpdateMuteState();
|
||||
}
|
||||
}
|
||||
|
||||
@SuppressWarnings("NullAway")
|
||||
protected void createSeekBarVolumizer() {
|
||||
final SeekBarVolumizer.Callback sbvc = new SeekBarVolumizer.Callback() {
|
||||
@Override
|
||||
public void onSampleStarting(SeekBarVolumizer sbv) {
|
||||
@@ -184,16 +187,8 @@ public class VolumeSeekBarPreference extends SeekBarPreference {
|
||||
}
|
||||
};
|
||||
final Uri sampleUri = mStream == AudioManager.STREAM_MUSIC ? getMediaVolumeUri() : null;
|
||||
if (mVolumizer == null) {
|
||||
mVolumizer = mSeekBarVolumizerFactory.create(mStream, sampleUri, sbvc);
|
||||
}
|
||||
mVolumizer = mSeekBarVolumizerFactory.create(mStream, sampleUri, sbvc);
|
||||
mVolumizer.start();
|
||||
mVolumizer.setSeekBar(mSeekBar);
|
||||
updateIconView();
|
||||
updateSuppressionText();
|
||||
if (mListener != null) {
|
||||
mListener.onUpdateMuteState();
|
||||
}
|
||||
}
|
||||
|
||||
protected void updateIconView() {
|
||||
|
||||
@@ -19,22 +19,17 @@ package com.android.settings.notification;
|
||||
import android.content.Context;
|
||||
|
||||
import androidx.annotation.VisibleForTesting;
|
||||
import androidx.lifecycle.LifecycleObserver;
|
||||
import androidx.lifecycle.OnLifecycleEvent;
|
||||
import androidx.preference.PreferenceScreen;
|
||||
|
||||
import com.android.settings.R;
|
||||
import com.android.settings.notification.VolumeSeekBarPreference.Callback;
|
||||
import com.android.settingslib.core.lifecycle.Lifecycle;
|
||||
|
||||
/**
|
||||
* Base class for preference controller that handles VolumeSeekBarPreference
|
||||
*/
|
||||
public abstract class VolumeSeekBarPreferenceController extends
|
||||
AdjustVolumeRestrictedPreferenceController implements LifecycleObserver {
|
||||
AdjustVolumeRestrictedPreferenceController {
|
||||
|
||||
protected VolumeSeekBarPreference mPreference;
|
||||
protected VolumeSeekBarPreference.Callback mVolumePreferenceCallback;
|
||||
protected AudioHelper mHelper;
|
||||
protected VolumeSeekBarPreference.Listener mVolumePreferenceListener;
|
||||
|
||||
@@ -48,10 +43,6 @@ public abstract class VolumeSeekBarPreferenceController extends
|
||||
mHelper = helper;
|
||||
}
|
||||
|
||||
public void setCallback(Callback callback) {
|
||||
mVolumePreferenceCallback = callback;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void displayPreference(PreferenceScreen screen) {
|
||||
super.displayPreference(screen);
|
||||
@@ -62,26 +53,11 @@ public abstract class VolumeSeekBarPreferenceController extends
|
||||
|
||||
protected void setupVolPreference(PreferenceScreen screen) {
|
||||
mPreference = screen.findPreference(getPreferenceKey());
|
||||
mPreference.setCallback(mVolumePreferenceCallback);
|
||||
mPreference.setListener(mVolumePreferenceListener);
|
||||
mPreference.setStream(getAudioStream());
|
||||
mPreference.setMuteIcon(getMuteIcon());
|
||||
}
|
||||
|
||||
@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
|
||||
public void onResume() {
|
||||
if (mPreference != null) {
|
||||
mPreference.onActivityResume();
|
||||
}
|
||||
}
|
||||
|
||||
@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
|
||||
public void onPause() {
|
||||
if (mPreference != null) {
|
||||
mPreference.onActivityPause();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getSliceHighlightMenuRes() {
|
||||
return R.string.menu_key_sound;
|
||||
|
||||
Reference in New Issue
Block a user