Merge "Show dialog while creating or resetting Guest from QuickSettings." into tm-dev am: 8f003f5f5a

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/17321325

Change-Id: I547ddd62d507e6363ffe8da32af1976fd6a7b563
This commit is contained in:
Yasin Kilicdere
2022-03-24 04:08:35 +00:00
committed by Automerger Merge Worker

View File

@@ -51,6 +51,7 @@ import android.util.SparseBooleanArray;
import android.view.View; import android.view.View;
import android.view.WindowManagerGlobal; import android.view.WindowManagerGlobal;
import android.widget.BaseAdapter; import android.widget.BaseAdapter;
import android.widget.Toast;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
@@ -59,6 +60,8 @@ import com.android.internal.jank.InteractionJankMonitor;
import com.android.internal.logging.UiEventLogger; import com.android.internal.logging.UiEventLogger;
import com.android.internal.util.LatencyTracker; import com.android.internal.util.LatencyTracker;
import com.android.settingslib.RestrictedLockUtilsInternal; import com.android.settingslib.RestrictedLockUtilsInternal;
import com.android.settingslib.users.UserCreatingDialog;
import com.android.settingslib.utils.ThreadUtils;
import com.android.systemui.Dumpable; import com.android.systemui.Dumpable;
import com.android.systemui.GuestResumeSessionReceiver; import com.android.systemui.GuestResumeSessionReceiver;
import com.android.systemui.Prefs; import com.android.systemui.Prefs;
@@ -89,6 +92,7 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.concurrent.Executor; import java.util.concurrent.Executor;
import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicBoolean;
import java.util.function.Consumer;
import javax.inject.Inject; import javax.inject.Inject;
@@ -482,26 +486,25 @@ public class UserSwitcherController implements Dumpable {
@VisibleForTesting @VisibleForTesting
void onUserListItemClicked(UserRecord record, DialogShower dialogShower) { void onUserListItemClicked(UserRecord record, DialogShower dialogShower) {
int id;
if (record.isGuest && record.info == null) { if (record.isGuest && record.info == null) {
// No guest user. Create one. // No guest user. Create one.
int guestId = createGuest(); createGuestAsync(guestId -> {
if (guestId == UserHandle.USER_NULL) { // guestId may be USER_NULL if we haven't reloaded the user list yet.
// This may happen if we haven't reloaded the user list yet. if (guestId != UserHandle.USER_NULL) {
return;
}
mUiEventLogger.log(QSUserSwitcherEvent.QS_USER_GUEST_ADD); mUiEventLogger.log(QSUserSwitcherEvent.QS_USER_GUEST_ADD);
id = guestId; onUserListItemClicked(guestId, record, dialogShower);
}
});
} else if (record.isAddUser) { } else if (record.isAddUser) {
showAddUserDialog(dialogShower); showAddUserDialog(dialogShower);
return;
} else if (record.isAddSupervisedUser) { } else if (record.isAddSupervisedUser) {
startSupervisedUserActivity(); startSupervisedUserActivity();
return;
} else { } else {
id = record.info.id; onUserListItemClicked(record.info.id, record, dialogShower);
}
} }
private void onUserListItemClicked(int id, UserRecord record, DialogShower dialogShower) {
int currUserId = mUserTracker.getUserId(); int currUserId = mUserTracker.getUserId();
if (currUserId == id) { if (currUserId == id) {
if (record.isGuest) { if (record.isGuest) {
@@ -509,7 +512,6 @@ public class UserSwitcherController implements Dumpable {
} }
return; return;
} }
if (UserManager.isGuestUserEphemeral()) { if (UserManager.isGuestUserEphemeral()) {
// If switching from guest, we want to bring up the guest exit dialog instead of switching // If switching from guest, we want to bring up the guest exit dialog instead of switching
UserInfo currUserInfo = mUserManager.getUserInfo(currUserId); UserInfo currUserInfo = mUserManager.getUserInfo(currUserId);
@@ -760,19 +762,24 @@ public class UserSwitcherController implements Dumpable {
return; return;
} }
try {
if (targetUserId == UserHandle.USER_NULL) { if (targetUserId == UserHandle.USER_NULL) {
// Create a new guest in the foreground, and then immediately switch to it // Create a new guest in the foreground, and then immediately switch to it
int newGuestId = createGuest(); createGuestAsync(newGuestId -> {
if (newGuestId == UserHandle.USER_NULL) { if (newGuestId == UserHandle.USER_NULL) {
Log.e(TAG, "Could not create new guest, switching back to system user"); Log.e(TAG, "Could not create new guest, switching back to system user");
switchToUserId(UserHandle.USER_SYSTEM); switchToUserId(UserHandle.USER_SYSTEM);
mUserManager.removeUser(currentUser.id); mUserManager.removeUser(currentUser.id);
try {
WindowManagerGlobal.getWindowManagerService().lockNow(/* options= */ null); WindowManagerGlobal.getWindowManagerService().lockNow(/* options= */ null);
} catch (RemoteException e) {
Log.e(TAG, "Couldn't remove guest because ActivityManager "
+ "or WindowManager is dead");
}
return; return;
} }
switchToUserId(newGuestId); switchToUserId(newGuestId);
mUserManager.removeUser(currentUser.id); mUserManager.removeUser(currentUser.id);
});
} else { } else {
if (mGuestUserAutoCreated) { if (mGuestUserAutoCreated) {
mGuestIsResetting.set(true); mGuestIsResetting.set(true);
@@ -780,10 +787,6 @@ public class UserSwitcherController implements Dumpable {
switchToUserId(targetUserId); switchToUserId(targetUserId);
mUserManager.removeUser(currentUser.id); mUserManager.removeUser(currentUser.id);
} }
} catch (RemoteException e) {
Log.e(TAG, "Couldn't remove guest because ActivityManager or WindowManager is dead");
return;
}
} }
private void scheduleGuestCreation() { private void scheduleGuestCreation() {
@@ -831,6 +834,24 @@ public class UserSwitcherController implements Dumpable {
} }
} }
private void createGuestAsync(Consumer<Integer> callback) {
final Dialog guestCreationProgressDialog =
new UserCreatingDialog(mContext, /* isGuest= */true);
guestCreationProgressDialog.show();
// userManager.createGuest will block the thread so post is needed for the dialog to show
ThreadUtils.postOnMainThread(() -> {
final int guestId = createGuest();
guestCreationProgressDialog.dismiss();
if (guestId == UserHandle.USER_NULL) {
Toast.makeText(mContext,
com.android.settingslib.R.string.add_guest_failed,
Toast.LENGTH_SHORT).show();
}
callback.accept(guestId);
});
}
/** /**
* Creates a guest user and return its multi-user user ID. * Creates a guest user and return its multi-user user ID.
* *