summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--packages/CarSystemUI/src/com/android/systemui/car/userswitcher/CarTrustAgentUnlockDialogHelper.java268
-rw-r--r--packages/CarSystemUI/src/com/android/systemui/car/userswitcher/FullscreenUserSwitcherViewMediator.java131
2 files changed, 7 insertions, 392 deletions
diff --git a/packages/CarSystemUI/src/com/android/systemui/car/userswitcher/CarTrustAgentUnlockDialogHelper.java b/packages/CarSystemUI/src/com/android/systemui/car/userswitcher/CarTrustAgentUnlockDialogHelper.java
deleted file mode 100644
index 597716569e9b..000000000000
--- a/packages/CarSystemUI/src/com/android/systemui/car/userswitcher/CarTrustAgentUnlockDialogHelper.java
+++ /dev/null
@@ -1,268 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.car.userswitcher;
-
-import android.app.admin.DevicePolicyManager;
-import android.bluetooth.BluetoothAdapter;
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.content.res.Resources;
-import android.graphics.PixelFormat;
-import android.os.Handler;
-import android.os.UserHandle;
-import android.os.UserManager;
-import android.util.Log;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.WindowManager;
-import android.widget.Button;
-import android.widget.ImageView;
-import android.widget.TextView;
-
-import com.android.internal.widget.LockPatternUtils;
-import com.android.systemui.R;
-import com.android.systemui.dagger.qualifiers.Main;
-
-import javax.inject.Inject;
-import javax.inject.Singleton;
-
-/**
- * A helper class displays an unlock dialog and receives broadcast about detecting trusted device
- * & unlocking state to show the appropriate message on the dialog.
- */
-@Singleton
-class CarTrustAgentUnlockDialogHelper extends BroadcastReceiver{
- private static final String TAG = CarTrustAgentUnlockDialogHelper.class.getSimpleName();
-
- private final Context mContext;
- private final Resources mResources;
- private final WindowManager mWindowManager;
- private final UserManager mUserManager;
- private final WindowManager.LayoutParams mParams;
- /**
- * Not using Dialog because context passed from {@link FullscreenUserSwitcherViewMediator}
- * is not an activity.
- */
- private final View mUnlockDialogLayout;
- private final TextView mUnlockingText;
- private final Button mButton;
- private final IntentFilter mFilter;
- private int mUid;
- private boolean mIsDialogShowing;
- private OnHideListener mOnHideListener;
-
- @Inject
- CarTrustAgentUnlockDialogHelper(Context context, @Main Resources resources,
- UserManager userManager, WindowManager windowManager) {
- mContext = context;
- mResources = resources;
- mUserManager = userManager;
- mWindowManager = windowManager;
- mParams = createLayoutParams();
- mFilter = getIntentFilter();
-
- mParams.packageName = mContext.getPackageName();
- mParams.setTitle(mContext.getString(R.string.unlock_dialog_title));
-
- mUnlockDialogLayout = LayoutInflater.from(mContext).inflate(
- R.layout.trust_agent_unlock_dialog, null);
- mUnlockDialogLayout.setLayoutParams(mParams);
-
- View dialogParent = mUnlockDialogLayout.findViewById(R.id.unlock_dialog_parent);
- dialogParent.setOnTouchListener((v, event)-> {
- hideUnlockDialog(/* dismissUserSwitcher= */ false);
- return true;
- });
- View unlockDialog = mUnlockDialogLayout.findViewById(R.id.unlock_dialog);
- unlockDialog.setOnTouchListener((v, event) -> {
- // If the person taps inside the unlock dialog, the touch event will be intercepted here
- // and the dialog will not exit
- return true;
- });
- mUnlockingText = mUnlockDialogLayout.findViewById(R.id.unlocking_text);
- mButton = mUnlockDialogLayout.findViewById(R.id.enter_pin_button);
- mButton.setOnClickListener(v -> {
- hideUnlockDialog(/* dismissUserSwitcher= */true);
- // TODO(b/138250105) Stop unlock advertising
- });
-
- BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
- if (bluetoothAdapter != null
- && bluetoothAdapter.getLeState() == BluetoothAdapter.STATE_BLE_ON) {
- mUnlockingText.setText(R.string.unlock_dialog_message_start);
- }
- }
-
- /**
- * This filter is listening on:
- * {@link BluetoothAdapter#ACTION_BLE_STATE_CHANGED} for starting unlock advertising;
- * {@link Intent#ACTION_USER_UNLOCKED} for IHU unlocked
- */
- private IntentFilter getIntentFilter() {
- IntentFilter filter = new IntentFilter();
- filter.addAction(BluetoothAdapter.ACTION_BLE_STATE_CHANGED);
- filter.addAction(Intent.ACTION_USER_UNLOCKED);
- return filter;
- }
-
- /**
- * Show dialog for the given user
- */
- void showUnlockDialog(int uid, OnHideListener listener) {
- showUnlockDialogAfterDelay(uid, 0, listener);
- }
-
- /**
- * Show dialog for the given user after the certain time of delay has elapsed
- *
- * @param uid the user to unlock
- * @param listener listener that listens to dialog hide
- */
- void showUnlockDialogAfterDelay(int uid, OnHideListener listener) {
- long delayMillis = mResources.getInteger(R.integer.unlock_dialog_delay_ms);
- showUnlockDialogAfterDelay(uid, delayMillis, listener);
- }
-
- /**
- * Show dialog for the given user after the supplied delay has elapsed
- */
- private void showUnlockDialogAfterDelay(int uid, long delayMillis, OnHideListener listener) {
- setUid(uid);
- mOnHideListener = listener;
- if (!mIsDialogShowing) {
- logd("Receiver registered");
- mContext.registerReceiverAsUser(this, UserHandle.ALL, mFilter,
- /* broadcastPermission= */ null,
- /* scheduler= */ null);
- new Handler().postDelayed(() -> {
- if (!mUserManager.isUserUnlocked(uid)) {
- logd("Showed unlock dialog for user: " + uid + " after " + delayMillis
- + " delay.");
- mWindowManager.addView(mUnlockDialogLayout, mParams);
- }
- }, delayMillis);
- }
- mIsDialogShowing = true;
- }
-
- private void setUid(int uid) {
- mUid = uid;
- TextView userName = mUnlockDialogLayout.findViewById(R.id.user_name);
- userName.setText(mUserManager.getUserInfo(mUid).name);
- ImageView avatar = mUnlockDialogLayout.findViewById(R.id.avatar);
- avatar.setImageBitmap(mUserManager.getUserIcon(mUid));
- setButtonText();
- }
-
- private void hideUnlockDialog(boolean dismissUserSwitcher) {
- if (!mIsDialogShowing) {
- return;
- }
- mWindowManager.removeView(mUnlockDialogLayout);
- logd("Receiver unregistered");
- mContext.unregisterReceiver(this);
- if (mOnHideListener != null) {
- mOnHideListener.onHide(dismissUserSwitcher);
- }
- mIsDialogShowing = false;
- }
-
- @Override
- public void onReceive(Context context, Intent intent) {
- String action = intent.getAction();
- if (action == null) {
- return;
- }
- switch (action) {
- case BluetoothAdapter.ACTION_BLE_STATE_CHANGED:
- logd("Received ACTION_BLE_STATE_CHANGED");
- int state = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, -1);
- if (state == BluetoothAdapter.STATE_BLE_ON) {
- logd("Received BLE_ON");
- mUnlockingText.setText(R.string.unlock_dialog_message_start);
- }
- break;
- case Intent.ACTION_USER_UNLOCKED:
- int uid = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, -1);
- if (uid == mUid) {
- logd("IHU unlocked");
- hideUnlockDialog(/* notifyOnHideListener= */false);
- } else {
- Log.e(TAG, "Received ACTION_USER_UNLOCKED for unexpected uid: " + uid);
- }
- break;
- default:
- Log.e(TAG, "Encountered unexpected action when attempting to set "
- + "unlock state message: " + action);
- }
- }
-
- // Set button text based on screen lock type
- private void setButtonText() {
- LockPatternUtils lockPatternUtils = new LockPatternUtils(mContext);
- int passwordQuality = lockPatternUtils.getActivePasswordQuality(mUid);
- switch (passwordQuality) {
- // PIN
- case DevicePolicyManager.PASSWORD_QUALITY_NUMERIC:
- case DevicePolicyManager.PASSWORD_QUALITY_NUMERIC_COMPLEX:
- mButton.setText(R.string.unlock_dialog_button_text_pin);
- break;
- // Pattern
- case DevicePolicyManager.PASSWORD_QUALITY_SOMETHING:
- mButton.setText(R.string.unlock_dialog_button_text_pattern);
- break;
- // Password
- case DevicePolicyManager.PASSWORD_QUALITY_ALPHABETIC:
- case DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC:
- case DevicePolicyManager.PASSWORD_QUALITY_COMPLEX:
- mButton.setText(R.string.unlock_dialog_button_text_password);
- break;
- default:
- Log.e(TAG, "Encountered unexpected screen lock type when attempting to set "
- + "button text:" + passwordQuality);
- }
- }
-
- private WindowManager.LayoutParams createLayoutParams() {
- final WindowManager.LayoutParams attrs = new WindowManager.LayoutParams(
- WindowManager.LayoutParams.MATCH_PARENT,
- WindowManager.LayoutParams.MATCH_PARENT,
- WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG,
- WindowManager.LayoutParams.FLAG_FULLSCREEN
- | WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS
- | WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION,
- PixelFormat.TRANSLUCENT
- );
- attrs.setFitInsetsTypes(0 /* types */);
- return attrs;
- }
-
- private void logd(String message) {
- if (Log.isLoggable(TAG, Log.DEBUG)) {
- Log.d(TAG, message);
- }
- }
-
- /**
- * Listener used to notify when the dialog is hidden
- */
- interface OnHideListener {
- void onHide(boolean dismissUserSwitcher);
- }
-}
diff --git a/packages/CarSystemUI/src/com/android/systemui/car/userswitcher/FullscreenUserSwitcherViewMediator.java b/packages/CarSystemUI/src/com/android/systemui/car/userswitcher/FullscreenUserSwitcherViewMediator.java
index 627729768e88..50e43bea65eb 100644
--- a/packages/CarSystemUI/src/com/android/systemui/car/userswitcher/FullscreenUserSwitcherViewMediator.java
+++ b/packages/CarSystemUI/src/com/android/systemui/car/userswitcher/FullscreenUserSwitcherViewMediator.java
@@ -16,23 +16,14 @@
package com.android.systemui.car.userswitcher;
-import android.car.Car;
-import android.car.trust.CarTrustAgentEnrollmentManager;
-import android.car.userlib.CarUserManagerHelper;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
-import android.content.pm.UserInfo;
import android.content.res.Resources;
import android.os.Handler;
-import android.os.UserHandle;
-import android.os.UserManager;
-import android.util.Log;
-import com.android.internal.widget.LockPatternUtils;
import com.android.systemui.R;
-import com.android.systemui.car.CarServiceProvider;
import com.android.systemui.dagger.qualifiers.Main;
import com.android.systemui.keyguard.ScreenLifecycle;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
@@ -52,9 +43,6 @@ public class FullscreenUserSwitcherViewMediator implements OverlayViewMediator {
private static final String TAG = FullscreenUserSwitcherViewMediator.class.getSimpleName();
private final Context mContext;
- private final UserManager mUserManager;
- private final CarServiceProvider mCarServiceProvider;
- private final CarTrustAgentUnlockDialogHelper mUnlockDialogHelper;
private final CarStatusBarKeyguardViewManager mCarStatusBarKeyguardViewManager;
private final Handler mMainHandler;
private final StatusBarStateController mStatusBarStateController;
@@ -62,39 +50,12 @@ public class FullscreenUserSwitcherViewMediator implements OverlayViewMediator {
private final ScreenLifecycle mScreenLifecycle;
private final CarStatusBar mCarStatusBar;
private final boolean mIsUserSwitcherEnabled;
- private final CarUserManagerHelper mCarUserManagerHelper;
-
- private CarTrustAgentEnrollmentManager mEnrollmentManager;
- private UserGridRecyclerView.UserRecord mSelectedUser;
- private final CarTrustAgentUnlockDialogHelper.OnHideListener mOnHideListener =
- dismissUserSwitcher -> {
- if (dismissUserSwitcher) {
- dismissUserSwitcher();
- } else {
- // Re-draw the parent view, otherwise the unlock dialog will not be removed
- // from the screen immediately.
- invalidateFullscreenUserSwitcherView();
- }
- };
- private final BroadcastReceiver mUserUnlockReceiver = new BroadcastReceiver() {
- @Override
- public void onReceive(Context context, Intent intent) {
- if (Log.isLoggable(TAG, Log.DEBUG)) {
- Log.d(TAG, "user 0 is unlocked, SharedPreference is accessible.");
- }
- showDialogForInitialUser();
- mContext.unregisterReceiver(mUserUnlockReceiver);
- }
- };
@Inject
public FullscreenUserSwitcherViewMediator(
Context context,
@Main Resources resources,
@Main Handler mainHandler,
- UserManager userManager,
- CarServiceProvider carServiceProvider,
- CarTrustAgentUnlockDialogHelper carTrustAgentUnlockDialogHelper,
CarStatusBarKeyguardViewManager carStatusBarKeyguardViewManager,
CarStatusBar carStatusBar,
StatusBarStateController statusBarStateController,
@@ -105,21 +66,12 @@ public class FullscreenUserSwitcherViewMediator implements OverlayViewMediator {
mIsUserSwitcherEnabled = resources.getBoolean(R.bool.config_enableFullscreenUserSwitcher);
mMainHandler = mainHandler;
- mUserManager = userManager;
- mCarServiceProvider = carServiceProvider;
- mCarServiceProvider.addListener(
- car -> mEnrollmentManager = (CarTrustAgentEnrollmentManager) car.getCarManager(
- Car.CAR_TRUST_AGENT_ENROLLMENT_SERVICE));
-
- mUnlockDialogHelper = carTrustAgentUnlockDialogHelper;
mCarStatusBarKeyguardViewManager = carStatusBarKeyguardViewManager;
mCarStatusBar = carStatusBar;
mStatusBarStateController = statusBarStateController;
mFullScreenUserSwitcherViewController = fullScreenUserSwitcherViewController;
mScreenLifecycle = screenLifecycle;
-
- mCarUserManagerHelper = new CarUserManagerHelper(mContext);
}
@Override
@@ -127,18 +79,6 @@ public class FullscreenUserSwitcherViewMediator implements OverlayViewMediator {
registerUserSwitcherShowListeners();
registerUserSwitcherHideListeners();
registerHideKeyguardListeners();
-
- if (mUserManager.isUserUnlocked(UserHandle.USER_SYSTEM)) {
- // User0 is unlocked, switched to the initial user
- showDialogForInitialUser();
- } else {
- // listen to USER_UNLOCKED
- mContext.registerReceiverAsUser(mUserUnlockReceiver,
- UserHandle.getUserHandleForUid(UserHandle.USER_SYSTEM),
- new IntentFilter(Intent.ACTION_USER_UNLOCKED),
- /* broadcastPermission= */ null,
- /* scheduler= */ null);
- }
}
private void registerUserSwitcherShowListeners() {
@@ -194,26 +134,16 @@ public class FullscreenUserSwitcherViewMediator implements OverlayViewMediator {
}
/**
- * Every time user clicks on an item in the switcher, if the clicked user has no trusted
- * device, we hide the switcher, either gradually or immediately.
- * If the user has trusted device, we show an unlock dialog to notify user the unlock
- * state.
- * When the unlock dialog is dismissed by user, we hide the unlock dialog and the switcher.
- * We dismiss the entire keyguard when we hide the switcher if user clicked on the
- * foreground user (user we're already logged in as).
+ * Every time user clicks on an item in the switcher, we hide the switcher.
+ *
+ * We dismiss the entire keyguard if user clicked on the foreground user (user we're already
+ * logged in as).
*/
private void onUserSelected(UserGridRecyclerView.UserRecord record) {
- mSelectedUser = record;
- if (record.mInfo != null) {
- if (hasScreenLock(record.mInfo.id) && hasTrustedDevice(record.mInfo.id)) {
- mUnlockDialogHelper.showUnlockDialog(record.mInfo.id, mOnHideListener);
- return;
- }
- if (Log.isLoggable(TAG, Log.DEBUG)) {
- Log.d(TAG, "no trusted device enrolled for uid: " + record.mInfo.id);
- }
+ hide();
+ if (record.mType == UserGridRecyclerView.UserRecord.FOREGROUND_USER) {
+ mCarStatusBar.dismissKeyguard();
}
- dismissUserSwitcher();
}
// We automatically dismiss keyguard unless user switcher is being shown above the keyguard.
@@ -234,53 +164,6 @@ public class FullscreenUserSwitcherViewMediator implements OverlayViewMediator {
}
}
- private boolean hasScreenLock(int uid) {
- LockPatternUtils lockPatternUtils = new LockPatternUtils(mContext);
- return lockPatternUtils.getCredentialTypeForUser(uid)
- != LockPatternUtils.CREDENTIAL_TYPE_NONE;
- }
-
- private boolean hasTrustedDevice(int uid) {
- if (mEnrollmentManager == null) { // car service not ready, so it cannot be available.
- return false;
- }
- return !mEnrollmentManager.getEnrolledDeviceInfoForUser(uid).isEmpty();
- }
-
- private void dismissUserSwitcher() {
- if (mSelectedUser == null) {
- Log.e(TAG, "Request to dismiss user switcher, but no user selected");
- return;
- }
- if (mSelectedUser.mType == UserGridRecyclerView.UserRecord.FOREGROUND_USER) {
- hide();
- mCarStatusBar.dismissKeyguard();
- return;
- }
- hide();
- }
-
- private void showDialogForInitialUser() {
- int initialUser = mCarUserManagerHelper.getInitialUser();
- UserInfo initialUserInfo = mUserManager.getUserInfo(initialUser);
- mSelectedUser = new UserGridRecyclerView.UserRecord(initialUserInfo,
- UserGridRecyclerView.UserRecord.FOREGROUND_USER);
-
- // If the initial user has screen lock and trusted device, display the unlock dialog on the
- // keyguard.
- if (hasScreenLock(initialUser) && hasTrustedDevice(initialUser)) {
- mUnlockDialogHelper.showUnlockDialogAfterDelay(initialUser,
- mOnHideListener);
- } else {
- // If no trusted device, dismiss the keyguard.
- dismissUserSwitcher();
- }
- }
-
- private void invalidateFullscreenUserSwitcherView() {
- mFullScreenUserSwitcherViewController.invalidate();
- }
-
private void hide() {
mFullScreenUserSwitcherViewController.stop();
}