Fix memory leak in TetherSettings
- Make declare callback as static class to avoid memory leak.
Bug: 236914626
Test: manual test
Change-Id: Icdf511dc14d62e6422bbe4e30d4345f6944d81a8
diff --git a/src/com/android/settings/TetherSettings.java b/src/com/android/settings/TetherSettings.java
index 012996b..561fde8 100644
--- a/src/com/android/settings/TetherSettings.java
+++ b/src/com/android/settings/TetherSettings.java
@@ -324,13 +324,13 @@
mStartTetheringCallback = new OnStartTetheringCallback(this);
- mTetheringEventCallback = new TetheringEventCallback();
+ mTetheringEventCallback = new TetheringEventCallback(this);
mTm.registerTetheringEventCallback(r -> mHandler.post(r), mTetheringEventCallback);
mMassStorageActive = Environment.MEDIA_SHARED.equals(Environment.getExternalStorageState());
registerReceiver();
- mEthernetListener = new EthernetListener();
+ mEthernetListener = new EthernetListener(this);
if (mEm != null)
mEm.addInterfaceStateListener(r -> mHandler.post(r), mEthernetListener);
@@ -640,25 +640,56 @@
}
}
- private final class TetheringEventCallback implements TetheringManager.TetheringEventCallback {
+ private static final class TetheringEventCallback implements
+ TetheringManager.TetheringEventCallback {
+ final WeakReference<TetherSettings> mTetherSettings;
+
+ TetheringEventCallback(TetherSettings settings) {
+ mTetherSettings = new WeakReference<>(settings);
+ }
+
@Override
public void onTetheredInterfacesChanged(List<String> interfaces) {
- Log.d(TAG, "onTetheredInterfacesChanged() interfaces : " + interfaces.toString());
- String[] tethered = interfaces.toArray(new String[interfaces.size()]);
- updateUsbState(tethered);
- updateBluetoothAndEthernetState(tethered);
+ final TetherSettings tetherSettings = mTetherSettings.get();
+ if (tetherSettings == null) {
+ return;
+ }
+ tetherSettings.onTetheredInterfacesChanged(interfaces);
}
}
- private final class EthernetListener implements EthernetManager.InterfaceStateListener {
+ void onTetheredInterfacesChanged(List<String> interfaces) {
+ Log.d(TAG, "onTetheredInterfacesChanged() interfaces : " + interfaces.toString());
+ final String[] tethered = interfaces.toArray(new String[interfaces.size()]);
+ updateUsbState(tethered);
+ updateBluetoothAndEthernetState(tethered);
+ }
+
+ private static final class EthernetListener implements EthernetManager.InterfaceStateListener {
+ final WeakReference<TetherSettings> mTetherSettings;
+
+ EthernetListener(TetherSettings settings) {
+ mTetherSettings = new WeakReference<>(settings);
+ }
+
+ @Override
public void onInterfaceStateChanged(@NonNull String iface, int state, int role,
@NonNull IpConfiguration configuration) {
- if (state == EthernetManager.STATE_LINK_UP) {
- mAvailableInterfaces.add(iface);
- } else {
- mAvailableInterfaces.remove(iface);
+ final TetherSettings tetherSettings = mTetherSettings.get();
+ if (tetherSettings == null) {
+ return;
}
- updateBluetoothAndEthernetState();
+ tetherSettings.onInterfaceStateChanged(iface, state, role, configuration);
}
}
+
+ void onInterfaceStateChanged(@NonNull String iface, int state, int role,
+ @NonNull IpConfiguration configuration) {
+ if (state == EthernetManager.STATE_LINK_UP) {
+ mAvailableInterfaces.add(iface);
+ } else {
+ mAvailableInterfaces.remove(iface);
+ }
+ updateBluetoothAndEthernetState();
+ }
}