Merge "Remove kotlin.RequiresOptIn"
diff --git a/src/com/android/settings/biometrics/MultiBiometricEnrollHelper.java b/src/com/android/settings/biometrics/MultiBiometricEnrollHelper.java
index 5d0b63c..a994b95 100644
--- a/src/com/android/settings/biometrics/MultiBiometricEnrollHelper.java
+++ b/src/com/android/settings/biometrics/MultiBiometricEnrollHelper.java
@@ -103,10 +103,9 @@
0 /* requestCode */, faceIntent,
PendingIntent.FLAG_IMMUTABLE | PendingIntent.FLAG_UPDATE_CURRENT);
intent.putExtra(EXTRA_ENROLL_AFTER_FINGERPRINT, faceAfterFp);
-
- BiometricUtils.launchEnrollForResult(mActivity, intent, REQUEST_FINGERPRINT_ENROLL,
- hardwareAuthToken, mGkPwHandle, mUserId);
}
+ BiometricUtils.launchEnrollForResult(mActivity, intent, REQUEST_FINGERPRINT_ENROLL,
+ hardwareAuthToken, mGkPwHandle, mUserId);
}));
}
}
diff --git a/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrolling.java b/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrolling.java
index 9b5f549..7fd711e 100644
--- a/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrolling.java
+++ b/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrolling.java
@@ -415,7 +415,7 @@
// showErrorDialog() will cause onWindowFocusChanged(false), set mIsCanceled to false
// before showErrorDialog() to prevent that another error dialog is triggered again.
mIsCanceled = true;
- FingerprintErrorDialog.showErrorDialog(this, errorMsgId);
+ FingerprintErrorDialog.showErrorDialog(this, errorMsgId, mCanAssumeUdfps);
mIsOrientationChanged = false;
cancelEnrollment();
stopIconAnimation();
diff --git a/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollFindSensor.java b/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollFindSensor.java
index faf4df7..200b8c5 100644
--- a/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollFindSensor.java
+++ b/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollFindSensor.java
@@ -317,7 +317,7 @@
if (mNextClicked && errMsgId == FingerprintManager.FINGERPRINT_ERROR_CANCELED) {
proceedToEnrolling(false /* cancelEnrollment */);
} else {
- FingerprintErrorDialog.showErrorDialog(this, errMsgId);
+ FingerprintErrorDialog.showErrorDialog(this, errMsgId, mCanAssumeUdfps);
}
}
diff --git a/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollFinish.java b/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollFinish.java
index b8ec5e6..2125d52 100644
--- a/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollFinish.java
+++ b/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollFinish.java
@@ -132,12 +132,12 @@
@Override
protected void onNextButtonClick(View view) {
updateFingerprintSuggestionEnableState();
- finishAndToNext();
+ finishAndToNext(RESULT_FINISHED);
}
- private void finishAndToNext() {
+ private void finishAndToNext(int resultCode) {
mIsAddAnotherOrFinish = true;
- setResult(RESULT_FINISHED);
+ setResult(resultCode);
if (WizardManagerHelper.isAnySetupWizard(getIntent())) {
postEnroll();
}
@@ -184,9 +184,12 @@
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
updateFingerprintSuggestionEnableState();
- if (requestCode == BiometricUtils.REQUEST_ADD_ANOTHER && resultCode != RESULT_CANCELED) {
+ if (requestCode == BiometricUtils.REQUEST_ADD_ANOTHER && resultCode == RESULT_TIMEOUT) {
+ finishAndToNext(resultCode);
+ } else if (requestCode == BiometricUtils.REQUEST_ADD_ANOTHER
+ && resultCode != RESULT_CANCELED) {
// If user cancel during "Add another", just use similar flow on "Next" button
- finishAndToNext();
+ finishAndToNext(RESULT_FINISHED);
} else {
super.onActivityResult(requestCode, resultCode, data);
}
diff --git a/src/com/android/settings/biometrics/fingerprint/FingerprintErrorDialog.java b/src/com/android/settings/biometrics/fingerprint/FingerprintErrorDialog.java
index 39d35dc..dc1189c 100644
--- a/src/com/android/settings/biometrics/fingerprint/FingerprintErrorDialog.java
+++ b/src/com/android/settings/biometrics/fingerprint/FingerprintErrorDialog.java
@@ -41,12 +41,14 @@
public static final String KEY_ERROR_MSG = "error_msg";
public static final String KEY_ERROR_ID = "error_id";
+ public static final String KEY_UDFPS = "is_udfps";
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
CharSequence errorString = getArguments().getCharSequence(KEY_ERROR_MSG);
final int errMsgId = getArguments().getInt(KEY_ERROR_ID);
+ final boolean canAssumeUdfps = getArguments().getBoolean(KEY_UDFPS, false);
boolean wasTimeout = errMsgId == BiometricConstants.BIOMETRIC_ERROR_TIMEOUT;
builder.setTitle(R.string.security_settings_fingerprint_enroll_error_dialog_title)
@@ -59,11 +61,15 @@
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
Activity activity = getActivity();
- activity.setResult(RESULT_FINISHED);
+ if (wasTimeout && !canAssumeUdfps) {
+ activity.setResult(RESULT_TIMEOUT);
+ } else {
+ activity.setResult(RESULT_FINISHED);
+ }
activity.finish();
}
});
- if (wasTimeout) {
+ if (wasTimeout && canAssumeUdfps) {
builder.setPositiveButton(
R.string.security_settings_fingerprint_enroll_dialog_try_again,
new DialogInterface.OnClickListener() {
@@ -95,18 +101,21 @@
return dialog;
}
- public static void showErrorDialog(BiometricEnrollBase host, int errMsgId) {
+ public static void showErrorDialog(BiometricEnrollBase host, int errMsgId,
+ boolean canAssumeUdfps) {
if (host.isFinishing()) {
return;
}
-
final FragmentManager fragmentManager = host.getSupportFragmentManager();
if (fragmentManager.isDestroyed() || fragmentManager.isStateSaved()) {
return;
}
-
- final CharSequence errMsg = host.getText(getErrorMessage(errMsgId));
- final FingerprintErrorDialog dialog = newInstance(errMsg, errMsgId);
+ CharSequence errMsg = host.getText(getErrorMessage(errMsgId));
+ if (!canAssumeUdfps
+ && errMsgId == BiometricConstants.BIOMETRIC_ERROR_TIMEOUT) {
+ errMsg = host.getText(getErrorMessage(BiometricConstants.BIOMETRIC_ERROR_CANCELED));
+ }
+ final FingerprintErrorDialog dialog = newInstance(errMsg, errMsgId, canAssumeUdfps);
dialog.show(fragmentManager, FingerprintErrorDialog.class.getName());
}
@@ -124,11 +133,13 @@
}
}
- private static FingerprintErrorDialog newInstance(CharSequence msg, int msgId) {
+ private static FingerprintErrorDialog newInstance(CharSequence msg, int msgId,
+ boolean canAssumeUdfps) {
FingerprintErrorDialog dialog = new FingerprintErrorDialog();
Bundle args = new Bundle();
args.putCharSequence(KEY_ERROR_MSG, msg);
args.putInt(KEY_ERROR_ID, msgId);
+ args.putBoolean(KEY_UDFPS, canAssumeUdfps);
dialog.setArguments(args);
return dialog;
}
diff --git a/src/com/android/settings/biometrics/fingerprint/FingerprintSettings.java b/src/com/android/settings/biometrics/fingerprint/FingerprintSettings.java
index dddef4e..ce8739b 100644
--- a/src/com/android/settings/biometrics/fingerprint/FingerprintSettings.java
+++ b/src/com/android/settings/biometrics/fingerprint/FingerprintSettings.java
@@ -54,6 +54,7 @@
import androidx.appcompat.app.AlertDialog;
import androidx.preference.Preference;
import androidx.preference.Preference.OnPreferenceChangeListener;
+import androidx.preference.PreferenceCategory;
import androidx.preference.PreferenceGroup;
import androidx.preference.PreferenceScreen;
import androidx.preference.PreferenceViewHolder;
@@ -160,6 +161,8 @@
private static final String KEY_IS_ENROLLING = "is_enrolled";
private static final String KEY_REQUIRE_SCREEN_ON_TO_AUTH =
"security_settings_require_screen_on_to_auth";
+ private static final String KEY_FINGERPRINT_UNLOCK_CATEGORY =
+ "security_settings_fingerprint_unlock_category";
private static final int MSG_REFRESH_FINGERPRINT_TEMPLATES = 1000;
private static final int MSG_FINGER_AUTH_SUCCESS = 1001;
@@ -179,6 +182,7 @@
private FingerprintSettingsRequireScreenOnToAuthPreferenceController
mRequireScreenOnToAuthPreferenceController;
private RestrictedSwitchPreference mRequireScreenOnToAuthPreference;
+ private PreferenceCategory mFingerprintUnlockCategory;
private FingerprintManager mFingerprintManager;
private FingerprintUpdater mFingerprintUpdater;
@@ -495,6 +499,7 @@
addFingerprintItemPreferences(root);
addPreferencesFromResource(getPreferenceScreenResId());
mRequireScreenOnToAuthPreference = findPreference(KEY_REQUIRE_SCREEN_ON_TO_AUTH);
+ mFingerprintUnlockCategory = findPreference(KEY_FINGERPRINT_UNLOCK_CATEGORY);
for (AbstractPreferenceController controller : mControllers) {
((FingerprintSettingsPreferenceController) controller).setUserId(mUserId);
}
@@ -506,7 +511,7 @@
mRequireScreenOnToAuthPreferenceController.setChecked(!isChecked);
return true;
});
- mRequireScreenOnToAuthPreference.setVisible(false);
+ mFingerprintUnlockCategory.setVisible(false);
if (isSfps()) {
setRequireScreenOnToAuthVisibility();
}
@@ -519,9 +524,9 @@
final boolean removalInProgress = mRemovalSidecar.inProgress();
// Removing last remaining fingerprint
if (fingerprintsEnrolled == 0 && removalInProgress) {
- mRequireScreenOnToAuthPreference.setVisible(false);
+ mFingerprintUnlockCategory.setVisible(false);
} else {
- mRequireScreenOnToAuthPreference.setVisible(true);
+ mFingerprintUnlockCategory.setVisible(true);
}
}
diff --git a/src/com/android/settings/biometrics2/factory/BiometricsViewModelFactory.java b/src/com/android/settings/biometrics2/factory/BiometricsViewModelFactory.java
index 477fdb6..a9f4356 100644
--- a/src/com/android/settings/biometrics2/factory/BiometricsViewModelFactory.java
+++ b/src/com/android/settings/biometrics2/factory/BiometricsViewModelFactory.java
@@ -42,7 +42,7 @@
private static final String TAG = "BiometricsViewModelFact";
public static final CreationExtras.Key<ChallengeGenerator> CHALLENGE_GENERATOR =
- new CreationExtras.Key<>() {};
+ new CreationExtras.Key<ChallengeGenerator>() {};
@NonNull
@Override
diff --git a/src/com/android/settings/bluetooth/BluetoothSwitchPreferenceController.java b/src/com/android/settings/bluetooth/BluetoothSwitchPreferenceController.java
index 3bf9132..ca27299 100644
--- a/src/com/android/settings/bluetooth/BluetoothSwitchPreferenceController.java
+++ b/src/com/android/settings/bluetooth/BluetoothSwitchPreferenceController.java
@@ -45,6 +45,7 @@
private SwitchWidgetController mSwitch;
private Context mContext;
private FooterPreference mFooterPreference;
+ private boolean mIsAlwaysDiscoverable;
@VisibleForTesting
AlwaysDiscoverable mAlwaysDiscoverable;
@@ -78,7 +79,9 @@
@Override
public void onStart() {
mBluetoothEnabler.resume(mContext);
- mAlwaysDiscoverable.start();
+ if (mIsAlwaysDiscoverable) {
+ mAlwaysDiscoverable.start();
+ }
if (mSwitch != null) {
updateText(mSwitch.isChecked());
}
@@ -87,7 +90,19 @@
@Override
public void onStop() {
mBluetoothEnabler.pause();
- mAlwaysDiscoverable.stop();
+ if (mIsAlwaysDiscoverable) {
+ mAlwaysDiscoverable.stop();
+ }
+ }
+
+ /**
+ * Set whether the device can be discovered. By default the value will be {@code false}.
+ *
+ * @param isAlwaysDiscoverable {@code true} if the device can be discovered,
+ * otherwise {@code false}
+ */
+ public void setAlwaysDiscoverable(boolean isAlwaysDiscoverable) {
+ mIsAlwaysDiscoverable = isAlwaysDiscoverable;
}
@Override
diff --git a/src/com/android/settings/connecteddevice/BluetoothDashboardFragment.java b/src/com/android/settings/connecteddevice/BluetoothDashboardFragment.java
index 4591b7f..b30aee4 100644
--- a/src/com/android/settings/connecteddevice/BluetoothDashboardFragment.java
+++ b/src/com/android/settings/connecteddevice/BluetoothDashboardFragment.java
@@ -18,12 +18,17 @@
import android.app.settings.SettingsEnums;
import android.content.Context;
import android.os.Bundle;
+import android.text.TextUtils;
+import android.util.Log;
+
+import androidx.annotation.VisibleForTesting;
import com.android.settings.R;
import com.android.settings.SettingsActivity;
import com.android.settings.bluetooth.BluetoothDeviceRenamePreferenceController;
import com.android.settings.bluetooth.BluetoothSwitchPreferenceController;
import com.android.settings.dashboard.DashboardFragment;
+import com.android.settings.password.PasswordUtils;
import com.android.settings.search.BaseSearchIndexProvider;
import com.android.settings.widget.MainSwitchBarController;
import com.android.settings.widget.SettingsMainSwitchBar;
@@ -40,6 +45,10 @@
private static final String TAG = "BluetoothDashboardFrag";
private static final String KEY_BLUETOOTH_SCREEN_FOOTER = "bluetooth_screen_footer";
+ private static final String SETTINGS_PACKAGE_NAME = "com.android.settings";
+ private static final String SYSTEMUI_PACKAGE_NAME = "com.android.systemui";
+ private static final String SLICE_ACTION = "com.android.settings.SEARCH_RESULT_TRAMPOLINE";
+ private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
private FooterPreference mFooterPreference;
private SettingsMainSwitchBar mSwitchBar;
@@ -80,17 +89,33 @@
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
+ String callingAppPackageName = PasswordUtils.getCallingAppPackageName(
+ getActivity().getActivityToken());
+ String action = getIntent() != null ? getIntent().getAction() : "";
+ if (DEBUG) {
+ Log.d(TAG, "onActivityCreated() calling package name is : " + callingAppPackageName
+ + ", action : " + action);
+ }
SettingsActivity activity = (SettingsActivity) getActivity();
mSwitchBar = activity.getSwitchBar();
mSwitchBar.setTitle(getContext().getString(R.string.bluetooth_main_switch_title));
mController = new BluetoothSwitchPreferenceController(activity,
new MainSwitchBarController(mSwitchBar), mFooterPreference);
+ mController.setAlwaysDiscoverable(isAlwaysDiscoverable(callingAppPackageName, action));
Lifecycle lifecycle = getSettingsLifecycle();
if (lifecycle != null) {
lifecycle.addObserver(mController);
}
}
+
+ @VisibleForTesting
+ boolean isAlwaysDiscoverable(String callingAppPackageName, String action) {
+ return TextUtils.equals(SLICE_ACTION, action) ? false
+ : TextUtils.equals(SETTINGS_PACKAGE_NAME, callingAppPackageName)
+ || TextUtils.equals(SYSTEMUI_PACKAGE_NAME, callingAppPackageName);
+ }
+
/**
* For Search.
*/
diff --git a/src/com/android/settings/wifi/p2p/WifiP2pSettings.java b/src/com/android/settings/wifi/p2p/WifiP2pSettings.java
index 27ac026..c0febe2 100644
--- a/src/com/android/settings/wifi/p2p/WifiP2pSettings.java
+++ b/src/com/android/settings/wifi/p2p/WifiP2pSettings.java
@@ -636,10 +636,13 @@
}
private void handleP2pStateChanged() {
- updateSearchMenu(false);
mThisDevicePreferenceController.setEnabled(mWifiP2pEnabled);
mPersistentCategoryController.setEnabled(mWifiP2pEnabled);
mPeerCategoryController.setEnabled(mWifiP2pEnabled);
+ if (mWifiP2pEnabled) {
+ startSearch();
+ }
+ updateSearchMenu(mWifiP2pEnabled);
}
private void updateSearchMenu(boolean searching) {
diff --git a/tests/robotests/src/com/android/settings/bluetooth/BluetoothSwitchPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/bluetooth/BluetoothSwitchPreferenceControllerTest.java
index 3c5a91d..50c82d3 100644
--- a/tests/robotests/src/com/android/settings/bluetooth/BluetoothSwitchPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/bluetooth/BluetoothSwitchPreferenceControllerTest.java
@@ -18,13 +18,14 @@
import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.Mockito.never;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import android.content.Context;
import android.provider.Settings;
-
import android.text.TextUtils;
+
import com.android.settings.R;
import com.android.settings.testutils.FakeFeatureFactory;
import com.android.settings.utils.AnnotationSpan;
@@ -109,16 +110,34 @@
}
@Test
- public void onStart_shouldStartAlwaysDiscoverable() {
+ public void onStart_setAlwaysDiscoverableAsTrue_shouldStartAlwaysDiscoverable() {
+ mController.setAlwaysDiscoverable(true);
mController.onStart();
verify(mAlwaysDiscoverable).start();
}
@Test
- public void onStop_shouldStopAlwaysDiscoverable() {
+ public void onStart_setAlwaysDiscoverableAsFalse_shouldStartAlwaysDiscoverable() {
+ mController.setAlwaysDiscoverable(false);
+ mController.onStart();
+
+ verify(mAlwaysDiscoverable, never()).start();
+ }
+
+ @Test
+ public void onStop_setAlwaysDiscoverableAsTrue_shouldStopAlwaysDiscoverable() {
+ mController.setAlwaysDiscoverable(true);
mController.onStop();
verify(mAlwaysDiscoverable).stop();
}
+
+ @Test
+ public void onStop__setAlwaysDiscoverableAsFalse_shouldStopAlwaysDiscoverable() {
+ mController.setAlwaysDiscoverable(false);
+ mController.onStop();
+
+ verify(mAlwaysDiscoverable, never()).stop();
+ }
}
diff --git a/tests/robotests/src/com/android/settings/connecteddevice/BluetoothDashboardFragmentTest.java b/tests/robotests/src/com/android/settings/connecteddevice/BluetoothDashboardFragmentTest.java
new file mode 100644
index 0000000..2aa2fa8
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/connecteddevice/BluetoothDashboardFragmentTest.java
@@ -0,0 +1,61 @@
+/*
+ * 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.connecteddevice;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
+import org.robolectric.RuntimeEnvironment;
+
+@RunWith(RobolectricTestRunner.class)
+public class BluetoothDashboardFragmentTest {
+ private static final String SETTINGS_PACKAGE_NAME = "com.android.settings";
+ private static final String SYSTEMUI_PACKAGE_NAME = "com.android.systemui";
+ private static final String SLICE_ACTION = "com.android.settings.SEARCH_RESULT_TRAMPOLINE";
+ private static final String TEST_APP_NAME = "com.testapp.settings";
+ private static final String TEST_ACTION = "com.testapp.settings.ACTION_START";
+
+ private BluetoothDashboardFragment mFragment;
+
+ @Before
+ public void setUp() {
+ mFragment = new BluetoothDashboardFragment();
+ }
+
+
+ @Test
+ public void isAlwaysDiscoverable_callingAppIsNotFromSystemApp_returnsFalse() {
+ assertThat(mFragment.isAlwaysDiscoverable(TEST_APP_NAME, TEST_ACTION)).isFalse();
+ }
+
+ @Test
+ public void isAlwaysDiscoverable_callingAppIsFromSettings_returnsTrue() {
+ assertThat(mFragment.isAlwaysDiscoverable(SETTINGS_PACKAGE_NAME, TEST_ACTION)).isTrue();
+ }
+
+ @Test
+ public void isAlwaysDiscoverable_callingAppIsFromSystemUI_returnsTrue() {
+ assertThat(mFragment.isAlwaysDiscoverable(SYSTEMUI_PACKAGE_NAME, TEST_ACTION)).isTrue();
+ }
+
+ @Test
+ public void isAlwaysDiscoverable_actionIsFromSlice_returnsFalse() {
+ assertThat(mFragment.isAlwaysDiscoverable(SYSTEMUI_PACKAGE_NAME, SLICE_ACTION)).isFalse();
+ }
+}
diff --git a/tests/robotests/src/com/android/settings/wifi/p2p/WifiP2pSettingsTest.java b/tests/robotests/src/com/android/settings/wifi/p2p/WifiP2pSettingsTest.java
index d8d7ef6..7c88d8f 100644
--- a/tests/robotests/src/com/android/settings/wifi/p2p/WifiP2pSettingsTest.java
+++ b/tests/robotests/src/com/android/settings/wifi/p2p/WifiP2pSettingsTest.java
@@ -149,7 +149,19 @@
}
@Test
- public void beSearching_getP2pStateEnabledIntent_shouldBeFalse() {
+ public void beSearching_getP2pStateDisabledIntent_shouldBeFalse() {
+ final Bundle bundle = new Bundle();
+ final Intent intent = new Intent(WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION);
+ bundle.putInt(WifiP2pManager.EXTRA_WIFI_STATE, WifiP2pManager.WIFI_P2P_STATE_DISABLED);
+ intent.putExtras(bundle);
+
+ mFragment.mReceiver.onReceive(mContext, intent);
+
+ assertThat(mFragment.mWifiP2pSearching).isFalse();
+ }
+
+ @Test
+ public void beSearching_getP2pStateEnabledIntent_shouldBeTrue() {
final Bundle bundle = new Bundle();
final Intent intent = new Intent(WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION);
bundle.putInt(WifiP2pManager.EXTRA_WIFI_STATE, WifiP2pManager.WIFI_P2P_STATE_ENABLED);
@@ -157,7 +169,7 @@
mFragment.mReceiver.onReceive(mContext, intent);
- assertThat(mFragment.mWifiP2pSearching).isFalse();
+ assertThat(mFragment.mWifiP2pSearching).isTrue();
}
@Test