[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.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<LifecycleOwner> mLifecycleOwnerObserver;
private Observer mSimChangeObserver;
public SimStatusPreferenceController(Context context, String prefKey) {
@@ -112,13 +115,25 @@ public class SimStatusPreferenceController extends BasePreferenceController {
if (mFragment == null) {
return;
}
if (mLifecycleOwnerObserver == null) {
final LiveData<LifecycleOwner> dataLifecycleOwner
= mFragment.getViewLifecycleOwnerLiveData();
mLifecycleOwnerObserver = owner -> {
if (owner != null) {
final int simSlot = getSimSlotIndex();
if (mSimChangeObserver == null) {
mSimChangeObserver = x -> updateStateBySlot(preference, simSlot);
mFragment.getViewLifecycleOwnerLiveData().observeForever(lifecycleOwner -> {
mSlotSimStatus.observe(lifecycleOwner, mSimChangeObserver);
});
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);
}
}