From 211920bc7c4548c8efd64d78d469755539c06911 Mon Sep 17 00:00:00 2001 From: Bonian Chen Date: Thu, 2 Feb 2023 06:09:05 +0000 Subject: [PATCH] [Settings] Fix about phone crash no leave Avoid from crash when LifecycleOwnerLiveData reports null during destroy. Bug: 267513122 Test: local Change-Id: Ie541b0e5b81aa14bd064087c5343716b6bc066a3 --- .../SimStatusPreferenceController.java | 29 ++++++++++++++----- 1 file changed, 22 insertions(+), 7 deletions(-) diff --git a/src/com/android/settings/deviceinfo/simstatus/SimStatusPreferenceController.java b/src/com/android/settings/deviceinfo/simstatus/SimStatusPreferenceController.java index ae002f342b8..828e016bdc7 100644 --- a/src/com/android/settings/deviceinfo/simstatus/SimStatusPreferenceController.java +++ b/src/com/android/settings/deviceinfo/simstatus/SimStatusPreferenceController.java @@ -24,6 +24,8 @@ import android.text.TextUtils; import androidx.annotation.VisibleForTesting; import androidx.fragment.app.Fragment; +import androidx.lifecycle.LifecycleOwner; +import androidx.lifecycle.LiveData; import androidx.lifecycle.Observer; import androidx.preference.Preference; import androidx.preference.PreferenceCategory; @@ -44,6 +46,7 @@ public class SimStatusPreferenceController extends BasePreferenceController { private Fragment mFragment; private SlotSimStatus mSlotSimStatus; + private Observer mLifecycleOwnerObserver; private Observer mSimChangeObserver; public SimStatusPreferenceController(Context context, String prefKey) { @@ -112,13 +115,25 @@ public class SimStatusPreferenceController extends BasePreferenceController { if (mFragment == null) { return; } - final int simSlot = getSimSlotIndex(); - if (mSimChangeObserver == null) { - mSimChangeObserver = x -> updateStateBySlot(preference, simSlot); - mFragment.getViewLifecycleOwnerLiveData().observeForever(lifecycleOwner -> { - mSlotSimStatus.observe(lifecycleOwner, mSimChangeObserver); - }); - } else { + if (mLifecycleOwnerObserver == null) { + final LiveData dataLifecycleOwner + = mFragment.getViewLifecycleOwnerLiveData(); + mLifecycleOwnerObserver = owner -> { + if (owner != null) { + final int simSlot = getSimSlotIndex(); + mSimChangeObserver = x -> updateStateBySlot(preference, simSlot); + mSlotSimStatus.observe(owner, mSimChangeObserver); + } else { + if (mSimChangeObserver != null) { + mSlotSimStatus.removeObserver(mSimChangeObserver); + mSimChangeObserver = null; + } + dataLifecycleOwner.removeObserver(mLifecycleOwnerObserver); + } + }; + dataLifecycleOwner.observeForever(mLifecycleOwnerObserver); + } else if (mSimChangeObserver != null) { + final int simSlot = getSimSlotIndex(); updateStateBySlot(preference, simSlot); } }