Merge "Fix memory leak in TetherSettings"

This commit is contained in:
TreeHugger Robot
2022-07-04 02:31:26 +00:00
committed by Android (Google) Code Review

View File

@@ -324,13 +324,13 @@ public class TetherSettings extends RestrictedSettingsFragment
mStartTetheringCallback = new OnStartTetheringCallback(this); mStartTetheringCallback = new OnStartTetheringCallback(this);
mTetheringEventCallback = new TetheringEventCallback(); mTetheringEventCallback = new TetheringEventCallback(this);
mTm.registerTetheringEventCallback(r -> mHandler.post(r), mTetheringEventCallback); mTm.registerTetheringEventCallback(r -> mHandler.post(r), mTetheringEventCallback);
mMassStorageActive = Environment.MEDIA_SHARED.equals(Environment.getExternalStorageState()); mMassStorageActive = Environment.MEDIA_SHARED.equals(Environment.getExternalStorageState());
registerReceiver(); registerReceiver();
mEthernetListener = new EthernetListener(); mEthernetListener = new EthernetListener(this);
if (mEm != null) if (mEm != null)
mEm.addInterfaceStateListener(r -> mHandler.post(r), mEthernetListener); mEm.addInterfaceStateListener(r -> mHandler.post(r), mEthernetListener);
@@ -640,19 +640,51 @@ public class TetherSettings extends RestrictedSettingsFragment
} }
} }
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 @Override
public void onTetheredInterfacesChanged(List<String> interfaces) { public void onTetheredInterfacesChanged(List<String> interfaces) {
Log.d(TAG, "onTetheredInterfacesChanged() interfaces : " + interfaces.toString()); final TetherSettings tetherSettings = mTetherSettings.get();
String[] tethered = interfaces.toArray(new String[interfaces.size()]); if (tetherSettings == null) {
updateUsbState(tethered); return;
updateBluetoothAndEthernetState(tethered); }
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, public void onInterfaceStateChanged(@NonNull String iface, int state, int role,
@NonNull IpConfiguration configuration) { @NonNull IpConfiguration configuration) {
final TetherSettings tetherSettings = mTetherSettings.get();
if (tetherSettings == null) {
return;
}
tetherSettings.onInterfaceStateChanged(iface, state, role, configuration);
}
}
void onInterfaceStateChanged(@NonNull String iface, int state, int role,
@NonNull IpConfiguration configuration) {
if (state == EthernetManager.STATE_LINK_UP) { if (state == EthernetManager.STATE_LINK_UP) {
mAvailableInterfaces.add(iface); mAvailableInterfaces.add(iface);
} else { } else {
@@ -661,4 +693,3 @@ public class TetherSettings extends RestrictedSettingsFragment
updateBluetoothAndEthernetState(); updateBluetoothAndEthernetState();
} }
} }
}