Fix settings crash on users page on config change

The background task loses the reference to the Activity once it is
destroyed and recreated after a config change (such as screen rotation).
This resulted in getContext() returning null and openUserDetails()
crashing.
To fix this, we simply store the context before dispatching the
background worker.

Bug: 256021119
Test: manually tested
Change-Id: I3399fa5586de0cb5fc159204166f92902dd42de0
This commit is contained in:
João Victor Mendes Freire
2022-11-30 19:03:22 +00:00
parent 35a3004491
commit 98c58a00fd

View File

@@ -590,6 +590,7 @@ public class UserSettings extends SettingsPreferenceFragment
} }
private void onAddGuestClicked() { private void onAddGuestClicked() {
Context context = getContext();
final UserCreatingDialog guestCreatingDialog = final UserCreatingDialog guestCreatingDialog =
new UserCreatingDialog(getActivity(), /* isGuest= */ true); new UserCreatingDialog(getActivity(), /* isGuest= */ true);
guestCreatingDialog.show(); guestCreatingDialog.show();
@@ -597,18 +598,18 @@ public class UserSettings extends SettingsPreferenceFragment
ThreadUtils.postOnBackgroundThread(() -> { ThreadUtils.postOnBackgroundThread(() -> {
mMetricsFeatureProvider.action(getActivity(), SettingsEnums.ACTION_USER_GUEST_ADD); mMetricsFeatureProvider.action(getActivity(), SettingsEnums.ACTION_USER_GUEST_ADD);
Trace.beginSection("UserSettings.addGuest"); Trace.beginSection("UserSettings.addGuest");
final UserInfo guest = mUserManager.createGuest(getContext()); final UserInfo guest = mUserManager.createGuest(context);
Trace.endSection(); Trace.endSection();
ThreadUtils.postOnMainThread(() -> { ThreadUtils.postOnMainThread(() -> {
guestCreatingDialog.dismiss(); guestCreatingDialog.dismiss();
if (guest == null) { if (guest == null) {
Toast.makeText(getContext(), Toast.makeText(context,
com.android.settingslib.R.string.add_guest_failed, com.android.settingslib.R.string.add_guest_failed,
Toast.LENGTH_SHORT).show(); Toast.LENGTH_SHORT).show();
return; return;
} }
openUserDetails(guest, true); openUserDetails(guest, true, context);
}); });
}); });
} }
@@ -646,11 +647,15 @@ public class UserSettings extends SettingsPreferenceFragment
} }
private void openUserDetails(UserInfo userInfo, boolean newUser) { private void openUserDetails(UserInfo userInfo, boolean newUser) {
openUserDetails(userInfo, newUser, getContext());
}
private void openUserDetails(UserInfo userInfo, boolean newUser, Context context) {
Bundle extras = new Bundle(); Bundle extras = new Bundle();
extras.putInt(UserDetailsSettings.EXTRA_USER_ID, userInfo.id); extras.putInt(UserDetailsSettings.EXTRA_USER_ID, userInfo.id);
extras.putBoolean(AppRestrictionsFragment.EXTRA_NEW_USER, newUser); extras.putBoolean(AppRestrictionsFragment.EXTRA_NEW_USER, newUser);
SubSettingLauncher launcher = new SubSettingLauncher(getContext()) SubSettingLauncher launcher = new SubSettingLauncher(context)
.setDestination(UserDetailsSettings.class.getName()) .setDestination(UserDetailsSettings.class.getName())
.setArguments(extras) .setArguments(extras)
.setTitleText(userInfo.name) .setTitleText(userInfo.name)