Cleanup listener reference in SmartAutoRotate

This will fix a memory leak caused by dangling SensorPrivacy listeners.

Test: opened/closed display and auto-rotate fragment and verified no
leaks in android studio profiler
Bug: 244382423

Change-Id: Ie2d070e796fa473e8f2794c9934c62edc4f7092c
This commit is contained in:
Abel Tesfaye
2022-09-01 02:35:07 +00:00
parent fd39906d62
commit febccc4990
4 changed files with 66 additions and 23 deletions

View File

@@ -19,11 +19,16 @@ package com.android.settings.display;
import static android.hardware.SensorPrivacyManager.Sensors.CAMERA;
import static android.hardware.SensorPrivacyManager.Sources.DIALOG;
import static androidx.lifecycle.Lifecycle.Event.ON_START;
import static androidx.lifecycle.Lifecycle.Event.ON_STOP;
import static com.android.settings.display.SmartAutoRotateController.isRotationResolverServiceAvailable;
import android.content.Context;
import android.hardware.SensorPrivacyManager;
import androidx.lifecycle.LifecycleObserver;
import androidx.lifecycle.OnLifecycleEvent;
import androidx.preference.Preference;
import androidx.preference.PreferenceScreen;
@@ -36,20 +41,37 @@ import com.android.settingslib.widget.BannerMessagePreference;
* The controller of camera based rotate privacy sensor warning preference. The preference appears
* when the privacy sensor service disables camera functionality completely.
*/
public class SmartAutoRotateCameraStateController extends BasePreferenceController {
public class SmartAutoRotateCameraStateController extends BasePreferenceController implements
LifecycleObserver {
private final SensorPrivacyManager mPrivacyManager;
private Preference mPreference;
private final SensorPrivacyManager.OnSensorPrivacyChangedListener mPrivacyChangedListener =
new SensorPrivacyManager.OnSensorPrivacyChangedListener() {
@Override
public void onSensorPrivacyChanged(int sensor, boolean enabled) {
if (mPreference != null) {
mPreference.setVisible(isAvailable());
}
updateState(mPreference);
}
};
public SmartAutoRotateCameraStateController(Context context, String key) {
super(context, key);
mPrivacyManager = SensorPrivacyManager.getInstance(context);
mPrivacyManager.addSensorPrivacyListener(CAMERA, (sensor, enabled) -> {
if (mPreference != null) {
mPreference.setVisible(isAvailable());
}
updateState(mPreference);
});
}
@OnLifecycleEvent(ON_START)
public void onStart() {
mPrivacyManager.addSensorPrivacyListener(CAMERA, mPrivacyChangedListener);
}
@OnLifecycleEvent(ON_STOP)
public void onStop() {
mPrivacyManager.removeSensorPrivacyListener(CAMERA, mPrivacyChangedListener);
}
@VisibleForTesting