From 4350317580b481fd0f98179ae4d7590924d9b4d0 Mon Sep 17 00:00:00 2001 From: Lei Yu Date: Mon, 8 Apr 2019 16:16:20 -0700 Subject: [PATCH] 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 --- .../AdvancedBluetoothDetailsHeaderController.java | 9 ++++++++- ...AdvancedBluetoothDetailsHeaderControllerTest.java | 12 ++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/src/com/android/settings/bluetooth/AdvancedBluetoothDetailsHeaderController.java b/src/com/android/settings/bluetooth/AdvancedBluetoothDetailsHeaderController.java index 1d2d793496a..9a651d207f2 100644 --- a/src/com/android/settings/bluetooth/AdvancedBluetoothDetailsHeaderController.java +++ b/src/com/android/settings/bluetooth/AdvancedBluetoothDetailsHeaderController.java @@ -41,6 +41,7 @@ import com.android.settings.core.BasePreferenceController; import com.android.settings.fuelgauge.BatteryMeterView; import com.android.settingslib.bluetooth.CachedBluetoothDevice; 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.OnStop; 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.). */ public class AdvancedBluetoothDetailsHeaderController extends BasePreferenceController implements - LifecycleObserver, OnStart, OnStop, CachedBluetoothDevice.Callback { + LifecycleObserver, OnStart, OnStop, OnDestroy, CachedBluetoothDevice.Callback { private static final String TAG = "AdvancedBtHeaderCtrl"; @VisibleForTesting @@ -118,7 +119,13 @@ public class AdvancedBluetoothDetailsHeaderController extends BasePreferenceCont } mCachedDevice.unregisterCallback(this::onDeviceAttributesChanged); mBluetoothAdapter.unregisterMetadataListener(mCachedDevice.getDevice()); + } + @Override + public void onDestroy() { + if (!isAvailable()) { + return; + } // Destroy icon bitmap associated with this header for (Bitmap bitmap : mIconCache.values()) { if (bitmap != null) { diff --git a/tests/robotests/src/com/android/settings/bluetooth/AdvancedBluetoothDetailsHeaderControllerTest.java b/tests/robotests/src/com/android/settings/bluetooth/AdvancedBluetoothDetailsHeaderControllerTest.java index b9616697099..3532bf89a54 100644 --- a/tests/robotests/src/com/android/settings/bluetooth/AdvancedBluetoothDetailsHeaderControllerTest.java +++ b/tests/robotests/src/com/android/settings/bluetooth/AdvancedBluetoothDetailsHeaderControllerTest.java @@ -209,6 +209,18 @@ public class AdvancedBluetoothDetailsHeaderControllerTest{ 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) { final TextView textView = linearLayout.findViewById(R.id.bt_battery_summary); assertThat(textView.getText().toString()).isEqualTo(