[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:
@@ -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;
|
||||
}
|
||||
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<LifecycleOwner> 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);
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user