diff --git a/res/values/strings.xml b/res/values/strings.xml
index 12a343959c1..937c16c5388 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -3098,7 +3098,9 @@
Face Detection
- Automatically adjust the screen orientation when you move your phone between portrait and landscape
+ Automatically adjust the screen orientation when you move your phone between portrait and landscape
+
+ Automatically adjust the screen orientation when you move your tablet between portrait and landscape
Learn more about auto-rotate
diff --git a/src/com/android/settings/biometrics/BiometricEnrollActivity.java b/src/com/android/settings/biometrics/BiometricEnrollActivity.java
index 6b830c9e4d7..932c41073e4 100644
--- a/src/com/android/settings/biometrics/BiometricEnrollActivity.java
+++ b/src/com/android/settings/biometrics/BiometricEnrollActivity.java
@@ -564,7 +564,13 @@ public class BiometricEnrollActivity extends InstrumentedActivity {
Intent intent = BiometricUtils.getChooseLockIntent(this, getIntent());
intent.putExtra(ChooseLockGeneric.ChooseLockGenericFragment.HIDE_INSECURE_OPTIONS, true);
intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_REQUEST_GK_PW_HANDLE, true);
- intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_FOR_BIOMETRICS, true);
+ if (mHasFeatureFingerprint && mHasFeatureFace) {
+ intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_FOR_BIOMETRICS, true);
+ } else if (mHasFeatureFace) {
+ intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_FOR_FACE, true);
+ } else if (mHasFeatureFingerprint) {
+ intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_FOR_FINGERPRINT, true);
+ }
if (mUserId != UserHandle.USER_NULL) {
intent.putExtra(Intent.EXTRA_USER_ID, mUserId);
diff --git a/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollIntroduction.java b/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollIntroduction.java
index 838c472fb15..4598483ec32 100644
--- a/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollIntroduction.java
+++ b/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollIntroduction.java
@@ -248,6 +248,11 @@ public class FingerprintEnrollIntroduction extends BiometricEnrollIntroduction {
return findViewById(R.id.error_text);
}
+ private boolean isFromSetupWizardSuggestAction(@Nullable Intent intent) {
+ return intent != null && intent.getBooleanExtra(
+ WizardManagerHelper.EXTRA_IS_SUW_SUGGESTED_ACTION_FLOW, false);
+ }
+
@Override
protected int checkMaxEnrolled() {
final boolean isSetupWizard = WizardManagerHelper.isAnySetupWizard(getIntent());
@@ -255,6 +260,7 @@ public class FingerprintEnrollIntroduction extends BiometricEnrollIntroduction {
WizardManagerHelper.isDeferredSetupWizard(getIntent());
final boolean isPortalSetupWizard =
WizardManagerHelper.isPortalSetupWizard(getIntent());
+ final boolean isFromSetupWizardSuggestAction = isFromSetupWizardSuggestAction(getIntent());
if (mFingerprintManager != null) {
final List props =
mFingerprintManager.getSensorPropertiesInternal();
@@ -266,7 +272,8 @@ public class FingerprintEnrollIntroduction extends BiometricEnrollIntroduction {
getApplicationContext()
.getResources()
.getInteger(R.integer.suw_max_fingerprints_enrollable);
- if (isSetupWizard && !isDeferredSetupWizard && !isPortalSetupWizard) {
+ if (isSetupWizard && !isDeferredSetupWizard && !isPortalSetupWizard
+ && !isFromSetupWizardSuggestAction) {
if (numEnrolledFingerprints >= maxFingerprintsEnrollableIfSUW) {
return R.string.fingerprint_intro_error_max;
} else {
diff --git a/src/com/android/settings/bluetooth/BluetoothPairingRequest.java b/src/com/android/settings/bluetooth/BluetoothPairingRequest.java
index 6b80256285a..d5de41a20f9 100644
--- a/src/com/android/settings/bluetooth/BluetoothPairingRequest.java
+++ b/src/com/android/settings/bluetooth/BluetoothPairingRequest.java
@@ -24,6 +24,7 @@ import android.content.Intent;
import android.os.PowerManager;
import android.os.UserHandle;
import android.text.TextUtils;
+import android.util.Log;
import com.android.settingslib.bluetooth.LocalBluetoothManager;
@@ -34,6 +35,7 @@ import com.android.settingslib.bluetooth.LocalBluetoothManager;
* starts a notification in the status bar that can be clicked to bring up the same dialog.
*/
public final class BluetoothPairingRequest extends BroadcastReceiver {
+ private static final String TAG = "BluetoothPairingRequest";
@Override
public void onReceive(Context context, Intent intent) {
@@ -74,6 +76,7 @@ public final class BluetoothPairingRequest extends BroadcastReceiver {
}
} else if (TextUtils.equals(action,
BluetoothCsipSetCoordinator.ACTION_CSIS_SET_MEMBER_AVAILABLE)) {
+ Log.d(TAG, "Receive ACTION_CSIS_SET_MEMBER_AVAILABLE");
if (device == null) {
return;
}
diff --git a/src/com/android/settings/fuelgauge/batteryusage/BatteryChartPreferenceController.java b/src/com/android/settings/fuelgauge/batteryusage/BatteryChartPreferenceController.java
index 6d2c1a1232d..26379ebfd81 100644
--- a/src/com/android/settings/fuelgauge/batteryusage/BatteryChartPreferenceController.java
+++ b/src/com/android/settings/fuelgauge/batteryusage/BatteryChartPreferenceController.java
@@ -16,6 +16,8 @@
package com.android.settings.fuelgauge.batteryusage;
+import android.animation.Animator;
+import android.animation.AnimatorListenerAdapter;
import android.app.settings.SettingsEnums;
import android.content.Context;
import android.content.res.Configuration;
@@ -68,9 +70,8 @@ public class BatteryChartPreferenceController extends AbstractPreferenceControll
private static final int ENABLED_ICON_ALPHA = 255;
private static final int DISABLED_ICON_ALPHA = 255 / 3;
- private static final long FADE_ANIMATION_DURATION = 350L;
- private static final long VALID_USAGE_TIME_DURATION = DateUtils.HOUR_IN_MILLIS * 2;
- private static final long VALID_DIFF_DURATION = DateUtils.MINUTE_IN_MILLIS * 3;
+ private static final long FADE_IN_ANIMATION_DURATION = 400L;
+ private static final long FADE_OUT_ANIMATION_DURATION = 200L;
// Keys for bundle instance to restore configurations.
private static final String KEY_EXPAND_SYSTEM_INFO = "expand_system_info";
@@ -121,6 +122,10 @@ public class BatteryChartPreferenceController extends AbstractPreferenceControll
private final CharSequence[] mNotAllowShowSummaryPackages;
private final MetricsFeatureProvider mMetricsFeatureProvider;
private final Handler mHandler = new Handler(Looper.getMainLooper());
+ private final AnimatorListenerAdapter mHourlyChartFadeInAdapter =
+ createHourlyChartAnimatorListenerAdapter(/*isToShow=*/ true);
+ private final AnimatorListenerAdapter mHourlyChartFadeOutAdapter =
+ createHourlyChartAnimatorListenerAdapter(/*isToShow=*/ false);
// Preference cache to avoid create new instance each time.
@VisibleForTesting
@@ -382,9 +387,9 @@ public class BatteryChartPreferenceController extends AbstractPreferenceControll
if (mDailyChartIndex == BatteryChartViewModel.SELECTED_INDEX_ALL) {
// Multiple days are selected, hide the hourly chart view.
- mHourlyChartView.setVisibility(View.GONE);
+ animateBatteryHourlyChartView(/*isToShow=*/ false);
} else {
- mHourlyChartView.setVisibility(View.VISIBLE);
+ animateBatteryHourlyChartView(/*isToShow=*/ true);
final BatteryChartViewModel hourlyViewModel = mHourlyViewModels.get(mDailyChartIndex);
hourlyViewModel.setSelectedIndex(mHourlyChartIndex);
mHourlyChartView.setViewModel(hourlyViewModel);
@@ -626,11 +631,55 @@ public class BatteryChartPreferenceController extends AbstractPreferenceControll
private void animateBatteryChartViewGroup() {
if (mBatteryChartViewGroup != null && mBatteryChartViewGroup.getAlpha() == 0) {
- mBatteryChartViewGroup.animate().alpha(1f).setDuration(FADE_ANIMATION_DURATION)
+ mBatteryChartViewGroup.animate().alpha(1f).setDuration(FADE_IN_ANIMATION_DURATION)
.start();
}
}
+ private void animateBatteryHourlyChartView(final boolean isToShow) {
+ if (mHourlyChartView == null) {
+ return;
+ }
+
+ if (isToShow) {
+ mHourlyChartView.setAlpha(0f);
+ mHourlyChartView.setVisibility(View.VISIBLE);
+ mHourlyChartView.animate()
+ .alpha(1f)
+ .setDuration(FADE_IN_ANIMATION_DURATION)
+ .setListener(mHourlyChartFadeInAdapter)
+ .start();
+ } else {
+ mHourlyChartView.animate()
+ .alpha(0f)
+ .setDuration(FADE_OUT_ANIMATION_DURATION)
+ .setListener(mHourlyChartFadeOutAdapter)
+ .start();
+ }
+ }
+
+ private AnimatorListenerAdapter createHourlyChartAnimatorListenerAdapter(
+ final boolean isToShow) {
+ final int visibility = isToShow ? View.VISIBLE : View.GONE;
+
+ return new AnimatorListenerAdapter() {
+ @Override
+ public void onAnimationEnd(Animator animation) {
+ super.onAnimationEnd(animation);
+ if (mHourlyChartView != null) {
+ mHourlyChartView.setVisibility(visibility);
+ }
+ }
+ @Override
+ public void onAnimationCancel(Animator animation) {
+ super.onAnimationCancel(animation);
+ if (mHourlyChartView != null) {
+ mHourlyChartView.setVisibility(visibility);
+ }
+ }
+ };
+ }
+
private void addFooterPreferenceIfNeeded(boolean containAppItems) {
if (mIsFooterPrefAdded || mFooterPreference == null) {
return;
diff --git a/tests/componenttests/src/com/android/settings/biometrics/BiometricEnrollActivityTest.java b/tests/componenttests/src/com/android/settings/biometrics/BiometricEnrollActivityTest.java
index 0ef57a0b676..c5e3a19cc92 100644
--- a/tests/componenttests/src/com/android/settings/biometrics/BiometricEnrollActivityTest.java
+++ b/tests/componenttests/src/com/android/settings/biometrics/BiometricEnrollActivityTest.java
@@ -20,6 +20,11 @@ import static android.provider.Settings.ACTION_BIOMETRIC_ENROLL;
import static androidx.test.espresso.intent.Intents.intended;
import static androidx.test.espresso.intent.matcher.IntentMatchers.hasComponent;
+import static androidx.test.espresso.intent.matcher.IntentMatchers.hasExtra;
+
+import static com.android.settings.password.ChooseLockSettingsHelper.EXTRA_KEY_FOR_BIOMETRICS;
+import static com.android.settings.password.ChooseLockSettingsHelper.EXTRA_KEY_FOR_FACE;
+import static com.android.settings.password.ChooseLockSettingsHelper.EXTRA_KEY_FOR_FINGERPRINT;
import static com.google.common.truth.Truth.assertThat;
@@ -83,6 +88,13 @@ public class BiometricEnrollActivityTest {
try (ActivityScenario scenario =
ActivityScenario.launch(getIntent())) {
intended(hasComponent(ChooseLockGeneric.class.getName()));
+ if (mHasFace && mHasFingerprint) {
+ intended(hasExtra(EXTRA_KEY_FOR_BIOMETRICS, true));
+ } else if (mHasFace) {
+ intended(hasExtra(EXTRA_KEY_FOR_FACE, true));
+ } else if (mHasFingerprint) {
+ intended(hasExtra(EXTRA_KEY_FOR_FINGERPRINT, true));
+ }
}
}
@@ -109,11 +121,9 @@ public class BiometricEnrollActivityTest {
response.getGatekeeperPasswordHandle());
}).get();
-
-
try (ActivityScenario scenario =
ActivityScenario.launch(intent)) {
- intended(hasComponent(mHasFace
+ intended(hasComponent(mHasFace && !mHasFingerprint
? FaceEnrollIntroduction.class.getName()
: FingerprintEnrollIntroduction.class.getName()));
}