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

Commit 402e5bb3 authored by Jacky Wang's avatar Jacky Wang
Browse files

Fix IntentReceiver leaked on Sound & vibration

The root cause is that PreferenceController migrated to Catalyst will be
removed by DashboardFragment and VolumeSeekBarPreferenceController
onPause() is not invoked.

NO_IFTTT=Controller only

Fix: 386162594
Flag: EXEMPT bugfix
Test: atest&manual
Change-Id: I13f8588c8259ed4ddb9895ffc60e209c99c05269
parent a7fa6efe
Loading
Loading
Loading
Loading
+6 −9
Original line number Diff line number Diff line
@@ -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);
    }

+1 −2
Original line number Diff line number Diff line
@@ -49,8 +49,7 @@ public class RemoteVolumeSeekBarPreference extends VolumeSeekBarPreference {
    }

    @Override
    protected void init() {
        if (mSeekBar == null) return;
    protected void onBindViewHolder() {
        setContinuousUpdates(true);
        updateIconView();
        updateSuppressionText();
+6 −9
Original line number Diff line number Diff line
@@ -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);
    }

+6 −9
Original line number Diff line number Diff line
@@ -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);
    }

+20 −25
Original line number Diff line number Diff line
@@ -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.start();
        mVolumizer.setSeekBar(mSeekBar);
        updateIconView();
        updateSuppressionText();
        if (mListener != null) {
            mListener.onUpdateMuteState();
        }
    }

    protected void updateIconView() {
Loading