Move bitmap recycle to onDestroy()
If we recycle it in OnStop() and this page isn't destoried, it will crash when we revisit it. Fixes: 130185099 Test: RunSettingsRoboTests Change-Id: I4d3c1c12debcccb1ee7d676a1c5accece0b42e09
This commit is contained in:
@@ -41,6 +41,7 @@ import com.android.settings.core.BasePreferenceController;
|
|||||||
import com.android.settings.fuelgauge.BatteryMeterView;
|
import com.android.settings.fuelgauge.BatteryMeterView;
|
||||||
import com.android.settingslib.bluetooth.CachedBluetoothDevice;
|
import com.android.settingslib.bluetooth.CachedBluetoothDevice;
|
||||||
import com.android.settingslib.core.lifecycle.LifecycleObserver;
|
import com.android.settingslib.core.lifecycle.LifecycleObserver;
|
||||||
|
import com.android.settingslib.core.lifecycle.events.OnDestroy;
|
||||||
import com.android.settingslib.core.lifecycle.events.OnStart;
|
import com.android.settingslib.core.lifecycle.events.OnStart;
|
||||||
import com.android.settingslib.core.lifecycle.events.OnStop;
|
import com.android.settingslib.core.lifecycle.events.OnStop;
|
||||||
import com.android.settingslib.utils.ThreadUtils;
|
import com.android.settingslib.utils.ThreadUtils;
|
||||||
@@ -54,7 +55,7 @@ import java.util.Map;
|
|||||||
* This class adds a header with device name and status (connected/disconnected, etc.).
|
* This class adds a header with device name and status (connected/disconnected, etc.).
|
||||||
*/
|
*/
|
||||||
public class AdvancedBluetoothDetailsHeaderController extends BasePreferenceController implements
|
public class AdvancedBluetoothDetailsHeaderController extends BasePreferenceController implements
|
||||||
LifecycleObserver, OnStart, OnStop, CachedBluetoothDevice.Callback {
|
LifecycleObserver, OnStart, OnStop, OnDestroy, CachedBluetoothDevice.Callback {
|
||||||
private static final String TAG = "AdvancedBtHeaderCtrl";
|
private static final String TAG = "AdvancedBtHeaderCtrl";
|
||||||
|
|
||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
@@ -118,7 +119,13 @@ public class AdvancedBluetoothDetailsHeaderController extends BasePreferenceCont
|
|||||||
}
|
}
|
||||||
mCachedDevice.unregisterCallback(this::onDeviceAttributesChanged);
|
mCachedDevice.unregisterCallback(this::onDeviceAttributesChanged);
|
||||||
mBluetoothAdapter.unregisterMetadataListener(mCachedDevice.getDevice());
|
mBluetoothAdapter.unregisterMetadataListener(mCachedDevice.getDevice());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onDestroy() {
|
||||||
|
if (!isAvailable()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
// Destroy icon bitmap associated with this header
|
// Destroy icon bitmap associated with this header
|
||||||
for (Bitmap bitmap : mIconCache.values()) {
|
for (Bitmap bitmap : mIconCache.values()) {
|
||||||
if (bitmap != null) {
|
if (bitmap != null) {
|
||||||
|
@@ -209,6 +209,18 @@ public class AdvancedBluetoothDetailsHeaderControllerTest{
|
|||||||
verify(mBluetoothAdapter, never()).unregisterMetadataListener(mBluetoothDevice);
|
verify(mBluetoothAdapter, never()).unregisterMetadataListener(mBluetoothDevice);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void onDestroy_isAvailable_recycleBitmap() {
|
||||||
|
when(mBluetoothDevice.getMetadata(BluetoothDevice.METADATA_IS_UNTHETHERED_HEADSET))
|
||||||
|
.thenReturn("true");
|
||||||
|
mController.mIconCache.put(ICON_URI, mBitmap);
|
||||||
|
|
||||||
|
mController.onDestroy();
|
||||||
|
|
||||||
|
assertThat(mController.mIconCache).isEmpty();
|
||||||
|
verify(mBitmap).recycle();
|
||||||
|
}
|
||||||
|
|
||||||
private void assertBatteryLevel(LinearLayout linearLayout, int batteryLevel) {
|
private void assertBatteryLevel(LinearLayout linearLayout, int batteryLevel) {
|
||||||
final TextView textView = linearLayout.findViewById(R.id.bt_battery_summary);
|
final TextView textView = linearLayout.findViewById(R.id.bt_battery_summary);
|
||||||
assertThat(textView.getText().toString()).isEqualTo(
|
assertThat(textView.getText().toString()).isEqualTo(
|
||||||
|
Reference in New Issue
Block a user