[Settings] Fix about phone crash no leave

Avoid from crash when LifecycleOwnerLiveData reports null during
destroy.

Bug: 267513122
Test: local

Change-Id: Ie541b0e5b81aa14bd064087c5343716b6bc066a3
This commit is contained in:
Bonian Chen
2023-02-02 06:09:05 +00:00
parent 6ef43a4c2c
commit 211920bc7c

View File

@@ -24,6 +24,8 @@ import android.text.TextUtils;
import androidx.annotation.VisibleForTesting; import androidx.annotation.VisibleForTesting;
import androidx.fragment.app.Fragment; import androidx.fragment.app.Fragment;
import androidx.lifecycle.LifecycleOwner;
import androidx.lifecycle.LiveData;
import androidx.lifecycle.Observer; import androidx.lifecycle.Observer;
import androidx.preference.Preference; import androidx.preference.Preference;
import androidx.preference.PreferenceCategory; import androidx.preference.PreferenceCategory;
@@ -44,6 +46,7 @@ public class SimStatusPreferenceController extends BasePreferenceController {
private Fragment mFragment; private Fragment mFragment;
private SlotSimStatus mSlotSimStatus; private SlotSimStatus mSlotSimStatus;
private Observer<LifecycleOwner> mLifecycleOwnerObserver;
private Observer mSimChangeObserver; private Observer mSimChangeObserver;
public SimStatusPreferenceController(Context context, String prefKey) { public SimStatusPreferenceController(Context context, String prefKey) {
@@ -112,13 +115,25 @@ public class SimStatusPreferenceController extends BasePreferenceController {
if (mFragment == null) { if (mFragment == null) {
return; return;
} }
final int simSlot = getSimSlotIndex(); if (mLifecycleOwnerObserver == null) {
if (mSimChangeObserver == null) { final LiveData<LifecycleOwner> dataLifecycleOwner
mSimChangeObserver = x -> updateStateBySlot(preference, simSlot); = mFragment.getViewLifecycleOwnerLiveData();
mFragment.getViewLifecycleOwnerLiveData().observeForever(lifecycleOwner -> { mLifecycleOwnerObserver = owner -> {
mSlotSimStatus.observe(lifecycleOwner, mSimChangeObserver); if (owner != null) {
}); final int simSlot = getSimSlotIndex();
} else { 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); updateStateBySlot(preference, simSlot);
} }
} }