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