Merge "Fix work challenge lockscreen being dismissed" into rvc-dev

This commit is contained in:
Eran Messeri
2020-04-28 14:29:48 +00:00
committed by Android (Google) Code Review

View File

@@ -30,6 +30,7 @@ import android.content.IntentSender;
import android.os.Handler;
import android.os.RemoteException;
import android.os.UserHandle;
import android.util.Log;
import android.view.View;
import android.view.ViewParent;
@@ -47,6 +48,8 @@ import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow
import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayout;
import com.android.systemui.statusbar.policy.KeyguardStateController;
import java.util.concurrent.atomic.AtomicReference;
import javax.inject.Inject;
import javax.inject.Singleton;
@@ -54,7 +57,8 @@ import javax.inject.Singleton;
*/
@Singleton
public class StatusBarRemoteInputCallback implements Callback, Callbacks,
StatusBarStateController.StateListener {
StatusBarStateController.StateListener, KeyguardStateController.Callback {
private static final String TAG = StatusBarRemoteInputCallback.class.getSimpleName();
private final KeyguardStateController mKeyguardStateController;
private final SysuiStatusBarStateController mStatusBarStateController;
@@ -72,6 +76,7 @@ public class StatusBarRemoteInputCallback implements Callback, Callbacks,
private int mDisabled2;
protected BroadcastReceiver mChallengeReceiver = new ChallengeReceiver();
private Handler mMainHandler = new Handler();
private final AtomicReference<Intent> mPendingConfirmCredentialIntent = new AtomicReference();
/**
*/
@@ -98,6 +103,9 @@ public class StatusBarRemoteInputCallback implements Callback, Callbacks,
mCommandQueue.addCallback(this);
mActivityIntentHelper = new ActivityIntentHelper(mContext);
mGroupManager = groupManager;
// Listen to onKeyguardShowingChanged in case a managed profile needs to be unlocked
// once the primary profile's keyguard is no longer shown.
mKeyguardStateController.addCallback(this);
}
@Override
@@ -201,12 +209,39 @@ public class StatusBarRemoteInputCallback implements Callback, Callbacks,
// Clear pending remote view, as we do not want to trigger pending remote input view when
// it's called by other code
mPendingWorkRemoteInputView = null;
// Begin old BaseStatusBar.startWorkChallengeIfNecessary.
final Intent newIntent = mKeyguardManager.createConfirmDeviceCredentialIntent(null,
null, userId);
final Intent newIntent = createConfirmDeviceCredentialIntent(
userId, intendSender, notificationKey);
if (newIntent == null) {
Log.w(TAG, String.format("Cannot create intent to unlock user %d", userId));
return false;
}
mPendingConfirmCredentialIntent.set(newIntent);
// If the Keyguard is currently showing, starting the ConfirmDeviceCredentialActivity
// would cause it to pause, not letting the user actually unlock the managed profile.
// Instead, wait until we receive a callback indicating it is no longer showing and
// then start the pending intent.
if (mKeyguardStateController.isShowing()) {
// Do nothing, since the callback will get the pending intent and start it.
Log.w(TAG, String.format("Keyguard is showing, waiting until it's not"));
} else {
startPendingConfirmDeviceCredentialIntent();
}
return true;
}
private Intent createConfirmDeviceCredentialIntent(
int userId, IntentSender intendSender, String notificationKey) {
final Intent newIntent = mKeyguardManager.createConfirmDeviceCredentialIntent(null,
null, userId);
if (newIntent == null) {
return null;
}
final Intent callBackIntent = new Intent(NOTIFICATION_UNLOCKED_BY_WORK_CHALLENGE_ACTION);
callBackIntent.putExtra(Intent.EXTRA_INTENT, intendSender);
callBackIntent.putExtra(Intent.EXTRA_INDEX, notificationKey);
@@ -222,14 +257,40 @@ public class StatusBarRemoteInputCallback implements Callback, Callbacks,
newIntent.putExtra(
Intent.EXTRA_INTENT,
callBackPendingIntent.getIntentSender());
return newIntent;
}
private void startPendingConfirmDeviceCredentialIntent() {
final Intent pendingIntent = mPendingConfirmCredentialIntent.getAndSet(null);
if (pendingIntent == null) {
return;
}
try {
ActivityManager.getService().startConfirmDeviceCredentialIntent(newIntent,
if (mKeyguardStateController.isShowing()) {
Log.w(TAG, "Keyguard is showing while starting confirm device credential intent.");
}
ActivityManager.getService().startConfirmDeviceCredentialIntent(pendingIntent,
null /*options*/);
} catch (RemoteException ex) {
// ignore
}
return true;
// End old BaseStatusBar.startWorkChallengeIfNecessary.
}
@Override
public void onKeyguardShowingChanged() {
if (mKeyguardStateController.isShowing()) {
// In order to avoid jarring UX where/ the managed profile challenge is shown and
// immediately dismissed, do not attempt to start the confirm device credential
// activity if the keyguard is still showing.
if (mPendingConfirmCredentialIntent.get() != null) {
Log.w(TAG, "There's a pending unlock intent but keyguard is still showing, abort.");
}
return;
}
startPendingConfirmDeviceCredentialIntent();
}
@Override