When FaceSettings or FingerprintSettings are closed because of onStop(), this information can't been passed back to previous Preference screen, CombinedBiometricSettings, because handlePreferenceTreeClick() from AbstractPreferenceController class only can launchActivity() throguh preference's Context. In order to recevice the activity result code from FaceSettings or FingerprintSettings, add handleBiometricPreferenceTreeClick() method in BiometricStatusPreferenceController. Then CombinedBiometricSettings uses this method to show FaceSettings or FingerprintSettings through launchActivityForResult(). Bug: 263057093 Test: atest BiometricNavigationUtilsTest Test: Manually open camera through double-click power key on different pages inside "Face & Fingerprint Unlock" Change-Id: I99167739766ad5ea5f204b0f0543ba6ad18fac31
131 lines
5.3 KiB
Java
131 lines
5.3 KiB
Java
/*
|
|
* Copyright (C) 2022 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.settings.biometrics;
|
|
|
|
import static com.android.settings.Utils.SETTINGS_PACKAGE_NAME;
|
|
import static com.android.settings.biometrics.BiometricEnrollBase.EXTRA_FROM_SETTINGS_SUMMARY;
|
|
|
|
import android.app.admin.DevicePolicyManager;
|
|
import android.content.Context;
|
|
import android.content.Intent;
|
|
import android.os.Bundle;
|
|
import android.os.UserHandle;
|
|
import android.os.UserManager;
|
|
|
|
import androidx.activity.result.ActivityResultLauncher;
|
|
import androidx.annotation.Nullable;
|
|
|
|
import com.android.internal.app.UnlaunchableAppActivity;
|
|
import com.android.settings.core.SettingsBaseActivity;
|
|
import com.android.settingslib.RestrictedLockUtils;
|
|
import com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
|
|
import com.android.settingslib.transition.SettingsTransitionHelper;
|
|
|
|
/**
|
|
* Utilities for navigation shared between Security Settings and Safety Center.
|
|
*/
|
|
public class BiometricNavigationUtils {
|
|
|
|
private final int mUserId;
|
|
|
|
public BiometricNavigationUtils(int userId) {
|
|
mUserId = userId;
|
|
}
|
|
|
|
/**
|
|
* Tries to launch the Settings screen if Quiet Mode is not enabled
|
|
* for managed profile, otherwise shows a dialog to disable the Quiet Mode.
|
|
*
|
|
* @param className The class name of Settings screen to launch.
|
|
* @param extras Extras to put into the launching {@link Intent}.
|
|
* @param launcher Launcher to launch activity if non-quiet mode
|
|
* @return true if the Settings screen is launching.
|
|
*/
|
|
public boolean launchBiometricSettings(Context context, String className, Bundle extras,
|
|
@Nullable ActivityResultLauncher<Intent> launcher) {
|
|
final Intent quietModeDialogIntent = getQuietModeDialogIntent(context);
|
|
if (quietModeDialogIntent != null) {
|
|
context.startActivity(quietModeDialogIntent);
|
|
return false;
|
|
}
|
|
|
|
final Intent settingsPageIntent = getSettingsPageIntent(className, extras);
|
|
if (launcher != null) {
|
|
launcher.launch(settingsPageIntent);
|
|
} else {
|
|
context.startActivity(settingsPageIntent);
|
|
}
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* Returns {@link Intent} to launch an appropriate Settings screen.
|
|
*
|
|
* <p>If the Setting is disabled by admin, returns {@link Intent} to launch an explanation.
|
|
* If Quiet Mode is enabled for managed profile, returns {@link Intent} to launch a dialog
|
|
* to disable the Quiet Mode. Otherwise, returns {@link Intent} to launch the Settings screen.
|
|
*
|
|
* @param className The class name of Settings screen to launch.
|
|
* @param enforcedAdmin Details of admin account that disables changing the setting.
|
|
* @param extras Extras to put into the result {@link Intent}.
|
|
*/
|
|
public Intent getBiometricSettingsIntent(Context context, String className,
|
|
EnforcedAdmin enforcedAdmin, Bundle extras) {
|
|
if (enforcedAdmin != null) {
|
|
return getRestrictedDialogIntent(context, enforcedAdmin);
|
|
}
|
|
final Intent quietModeDialogIntent = getQuietModeDialogIntent(context);
|
|
return quietModeDialogIntent != null ? quietModeDialogIntent
|
|
: getSettingsPageIntent(className, extras);
|
|
}
|
|
|
|
private Intent getQuietModeDialogIntent(Context context) {
|
|
final UserManager userManager = UserManager.get(context);
|
|
if (userManager.isQuietModeEnabled(UserHandle.of(mUserId))) {
|
|
return UnlaunchableAppActivity.createInQuietModeDialogIntent(mUserId);
|
|
}
|
|
return null;
|
|
}
|
|
|
|
private Intent getRestrictedDialogIntent(Context context, EnforcedAdmin enforcedAdmin) {
|
|
final Intent intent = RestrictedLockUtils
|
|
.getShowAdminSupportDetailsIntent(context, enforcedAdmin);
|
|
int targetUserId = mUserId;
|
|
if (enforcedAdmin.user != null && RestrictedLockUtils
|
|
.isCurrentUserOrProfile(context, enforcedAdmin.user.getIdentifier())) {
|
|
targetUserId = enforcedAdmin.user.getIdentifier();
|
|
}
|
|
intent.putExtra(DevicePolicyManager.EXTRA_RESTRICTION, enforcedAdmin.enforcedRestriction);
|
|
intent.putExtra(Intent.EXTRA_USER_ID, targetUserId);
|
|
return intent;
|
|
}
|
|
|
|
private Intent getSettingsPageIntent(String className, Bundle extras) {
|
|
final Intent intent = new Intent();
|
|
intent.setClassName(SETTINGS_PACKAGE_NAME, className);
|
|
if (!extras.isEmpty()) {
|
|
intent.putExtras(extras);
|
|
}
|
|
intent.putExtra(EXTRA_FROM_SETTINGS_SUMMARY, true);
|
|
intent.putExtra(Intent.EXTRA_USER_ID, mUserId);
|
|
intent.putExtra(SettingsBaseActivity.EXTRA_PAGE_TRANSITION_TYPE,
|
|
SettingsTransitionHelper.TransitionType.TRANSITION_SLIDE);
|
|
|
|
return intent;
|
|
}
|
|
}
|