From 7e9fdf69a489c76e58e2731bf32add887782a7a4 Mon Sep 17 00:00:00 2001 From: "Wesley.CW Wang" Date: Fri, 16 Jul 2021 14:17:46 +0800 Subject: [PATCH 1/6] Update dark theme battery info error text color screenshot: https://screenshot.googleplex.com/8UyMj5q7tLJ2uA8.png Bug: 187611525 Test: make SettingsRoboTests Change-Id: Iefec51d9ca6d27c9173af0756301f4278e928433 --- res/layout/preference_battery_error.xml | 1 + res/values/colors.xml | 3 +++ 2 files changed, 4 insertions(+) diff --git a/res/layout/preference_battery_error.xml b/res/layout/preference_battery_error.xml index 68ac6a2ee54..05d842bf77e 100644 --- a/res/layout/preference_battery_error.xml +++ b/res/layout/preference_battery_error.xml @@ -47,6 +47,7 @@ android:layout_marginTop="12dp" android:layout_marginBottom="16dp" android:text="@string/battery_missing_message" + android:textColor="@color/battery_info_error_color_black" android:textAppearance="?android:attr/textAppearanceListItem" /> @*android:color/ripple_material_dark + + + @*android:color/primary_text_default_material_light From 0a8916a808bb64466af5741eab24fb230a12b955 Mon Sep 17 00:00:00 2001 From: Curtis Belmonte Date: Tue, 20 Jul 2021 13:25:49 -0700 Subject: [PATCH 2/6] Move multi-biometric logic to base fp intro activity Ensures that the relevant multi-biometric logic--specifically, logic to ensure that fingerprint enroll is shown exactly once after face enroll--is present in both the SUW and non-SUW versions of the fingerprint enroll introduction activity. This fixes an issue where fingerprint enroll would occur multiple times when triggering the multi-biometric enroll flow outside of SUW (e.g. via an enroll intent action). Test: CTS-Verifier: Biometric Tests > 2a: Strong Biometrics + Crypto Bug: 193601823 Change-Id: I17c09e9a72ced2f23b0b279ea51a6aa209668485 --- .../FingerprintEnrollIntroduction.java | 38 +++++++++++++++++++ .../SetupFingerprintEnrollIntroduction.java | 24 ------------ 2 files changed, 38 insertions(+), 24 deletions(-) diff --git a/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollIntroduction.java b/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollIntroduction.java index a75fb0f4526..b3d10485172 100644 --- a/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollIntroduction.java +++ b/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollIntroduction.java @@ -24,6 +24,7 @@ import android.hardware.fingerprint.FingerprintManager; import android.hardware.fingerprint.FingerprintSensorPropertiesInternal; import android.os.Bundle; import android.util.Log; +import android.view.View; import android.widget.ImageView; import android.widget.TextView; @@ -35,7 +36,9 @@ import com.android.settings.R; import com.android.settings.Utils; import com.android.settings.biometrics.BiometricEnrollIntroduction; import com.android.settings.biometrics.BiometricUtils; +import com.android.settings.biometrics.MultiBiometricEnrollHelper; import com.android.settings.password.ChooseLockSettingsHelper; +import com.android.settings.password.SetupSkipDialog; import com.android.settingslib.HelpUtils; import com.android.settingslib.RestrictedLockUtilsInternal; @@ -89,6 +92,32 @@ public class FingerprintEnrollIntroduction extends BiometricEnrollIntroduction { footerTitle2.setText(getFooterTitle2()); } + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent data) { + // If user has skipped or finished enrolling, don't restart enrollment. + final boolean isEnrollRequest = requestCode == BIOMETRIC_FIND_SENSOR_REQUEST + || requestCode == ENROLL_NEXT_BIOMETRIC_REQUEST; + final boolean isResultSkipOrFinished = resultCode == RESULT_SKIP + || resultCode == SetupSkipDialog.RESULT_SKIP || resultCode == RESULT_FINISHED; + if (isEnrollRequest && isResultSkipOrFinished) { + data = setSkipPendingEnroll(data); + } + super.onActivityResult(requestCode, resultCode, data); + } + + @Override + protected void onCancelButtonClick(View view) { + // User has explicitly canceled enroll. Don't restart it automatically. + Intent data = setSkipPendingEnroll(new Intent()); + setResult(RESULT_SKIP, data); + finish(); + } + + @Override + protected void onSkipButtonClick(View view) { + onCancelButtonClick(view); + } + @StringRes int getNegativeButtonTextId() { return R.string.security_settings_fingerprint_enroll_introduction_no_thanks; @@ -282,4 +311,13 @@ public class FingerprintEnrollIntroduction extends BiometricEnrollIntroduction { protected int getMoreButtonTextRes() { return R.string.security_settings_face_enroll_introduction_more; } + + @NonNull + protected static Intent setSkipPendingEnroll(@Nullable Intent data) { + if (data == null) { + data = new Intent(); + } + data.putExtra(MultiBiometricEnrollHelper.EXTRA_SKIP_PENDING_ENROLL, true); + return data; + } } diff --git a/src/com/android/settings/biometrics/fingerprint/SetupFingerprintEnrollIntroduction.java b/src/com/android/settings/biometrics/fingerprint/SetupFingerprintEnrollIntroduction.java index 63faf5e4672..7d8d12e8cb5 100644 --- a/src/com/android/settings/biometrics/fingerprint/SetupFingerprintEnrollIntroduction.java +++ b/src/com/android/settings/biometrics/fingerprint/SetupFingerprintEnrollIntroduction.java @@ -29,7 +29,6 @@ import com.android.internal.widget.LockPatternUtils; import com.android.settings.SetupWizardUtils; import com.android.settings.Utils; import com.android.settings.biometrics.BiometricUtils; -import com.android.settings.biometrics.MultiBiometricEnrollHelper; import com.android.settings.password.ChooseLockSettingsHelper; import com.android.settings.password.SetupChooseLockGeneric; import com.android.settings.password.SetupSkipDialog; @@ -85,16 +84,6 @@ public class SetupFingerprintEnrollIntroduction extends FingerprintEnrollIntrodu data = setFingerprintCount(data); } } - - // If user has skipped or finished enrolling, don't restart enrollment. - final boolean isEnrollRequest = requestCode == BIOMETRIC_FIND_SENSOR_REQUEST - || requestCode == ENROLL_NEXT_BIOMETRIC_REQUEST; - final boolean isResultSkipOrFinished = resultCode == RESULT_SKIP - || resultCode == SetupSkipDialog.RESULT_SKIP || resultCode == RESULT_FINISHED; - if (isEnrollRequest && isResultSkipOrFinished) { - data = setSkipPendingEnroll(data); - } - super.onActivityResult(requestCode, resultCode, data); } @@ -122,14 +111,6 @@ public class SetupFingerprintEnrollIntroduction extends FingerprintEnrollIntrodu return data; } - private Intent setSkipPendingEnroll(Intent data) { - if (data == null) { - data = new Intent(); - } - data.putExtra(MultiBiometricEnrollHelper.EXTRA_SKIP_PENDING_ENROLL, true); - return data; - } - @Override protected void onCancelButtonClick(View view) { final int resultCode; @@ -151,11 +132,6 @@ public class SetupFingerprintEnrollIntroduction extends FingerprintEnrollIntrodu finish(); } - @Override - protected void onSkipButtonClick(View view) { - onCancelButtonClick(view); - } - /** * Propagate lock screen metrics if the user goes back from the fingerprint setup screen * after having added lock screen to his device. From f0248e096e4015eb39bd8febf2e48f7d9b421083 Mon Sep 17 00:00:00 2001 From: Jason Chiu Date: Tue, 20 Jul 2021 16:59:32 +0800 Subject: [PATCH 3/6] Add logs for tracking Slice provider startup Bug: 191555397 Test: build, manual Change-Id: Ic95fb0a7a8ba30f7802111a7a453fb73f4c918fe --- .../settings/slices/SettingsSliceProvider.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/com/android/settings/slices/SettingsSliceProvider.java b/src/com/android/settings/slices/SettingsSliceProvider.java index 7c487baad03..c42b51b24a3 100644 --- a/src/com/android/settings/slices/SettingsSliceProvider.java +++ b/src/com/android/settings/slices/SettingsSliceProvider.java @@ -145,13 +145,17 @@ public class SettingsSliceProvider extends SliceProvider { final Map mPinnedWorkers = new ArrayMap<>(); private Boolean mNightMode; + private boolean mFirstSlicePinned; + private boolean mFirstSliceBound; public SettingsSliceProvider() { super(READ_SEARCH_INDEXABLES); + Log.d(TAG, "init"); } @Override public boolean onCreateSliceProvider() { + Log.d(TAG, "onCreateSliceProvider"); mSlicesDatabaseAccessor = new SlicesDatabaseAccessor(getContext()); mSliceWeakDataCache = new WeakHashMap<>(); return true; @@ -159,6 +163,10 @@ public class SettingsSliceProvider extends SliceProvider { @Override public void onSlicePinned(Uri sliceUri) { + if (!mFirstSlicePinned) { + Log.d(TAG, "onSlicePinned: " + sliceUri); + mFirstSlicePinned = true; + } if (CustomSliceRegistry.isValidUri(sliceUri)) { final Context context = getContext(); final CustomSliceable sliceable = FeatureFactory.getFactory(context) @@ -194,6 +202,9 @@ public class SettingsSliceProvider extends SliceProvider { @Override public Slice onBindSlice(Uri sliceUri) { + if (!mFirstSliceBound) { + Log.d(TAG, "onBindSlice start: " + sliceUri); + } final StrictMode.ThreadPolicy oldPolicy = StrictMode.getThreadPolicy(); try { if (!ThreadUtils.isMainThread()) { @@ -261,6 +272,10 @@ public class SettingsSliceProvider extends SliceProvider { return SliceBuilderUtils.buildSlice(getContext(), cachedSliceData); } finally { StrictMode.setThreadPolicy(oldPolicy); + if (!mFirstSliceBound) { + Log.v(TAG, "onBindSlice end"); + mFirstSliceBound = true; + } } } From 26af50c21eeb635d299bde32bd83e802cbaff9b0 Mon Sep 17 00:00:00 2001 From: ykhung Date: Thu, 8 Jul 2021 15:35:47 +0800 Subject: [PATCH 4/6] Include new "dex2oat64" process to map into App Optimization name Bug: 191991503 Test: make SettingsRoboTests Change-Id: Ib392ed3adf7fe37fdaf73076dd1c3cd8361468eb (cherry picked from commit d76c12f69ca440575d476123f0ae142792ef1320) --- .../settings/fuelgauge/BatteryEntry.java | 3 +- .../settings/fuelgauge/BatteryEntryTest.java | 77 +++++++++++++++++++ 2 files changed, 79 insertions(+), 1 deletion(-) diff --git a/src/com/android/settings/fuelgauge/BatteryEntry.java b/src/com/android/settings/fuelgauge/BatteryEntry.java index 0478c8b5630..5c9d07128d0 100644 --- a/src/com/android/settings/fuelgauge/BatteryEntry.java +++ b/src/com/android/settings/fuelgauge/BatteryEntry.java @@ -572,7 +572,8 @@ public class BatteryEntry { name = context.getResources().getString(R.string.process_kernel_label); } else if ("mediaserver".equals(name)) { name = context.getResources().getString(R.string.process_mediaserver_label); - } else if ("dex2oat".equals(name)) { + } else if ("dex2oat".equals(name) || "dex2oat32".equals(name) || + "dex2oat64".equals(name)) { name = context.getResources().getString(R.string.process_dex2oat_label); } return new NameAndIcon(name, icon, 0 /* iconId */); diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BatteryEntryTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BatteryEntryTest.java index 96f0ec7e1b8..c1b17618073 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/BatteryEntryTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/BatteryEntryTest.java @@ -22,6 +22,7 @@ import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.spy; import static org.mockito.Mockito.when; import android.content.Context; @@ -36,6 +37,7 @@ import android.os.UserBatteryConsumer; import android.os.UserManager; import com.android.settings.R; +import com.android.settings.fuelgauge.BatteryEntry.NameAndIcon; import org.junit.Before; import org.junit.Rule; @@ -64,6 +66,7 @@ public class BatteryEntryTest { @Mock(answer = Answers.RETURNS_DEEP_STUBS) private Context mMockContext; + private Context mContext; @Mock private Handler mockHandler; @Mock private PackageManager mockPackageManager; @Mock private UserManager mockUserManager; @@ -71,6 +74,7 @@ public class BatteryEntryTest { @Before public void stubContextToReturnMockPackageManager() { + mContext = spy(RuntimeEnvironment.application); when(mMockContext.getPackageManager()).thenReturn(mockPackageManager); } @@ -248,4 +252,77 @@ public class BatteryEntryTest { final String key = entry.getKey(); assertThat(key).isEqualTo("U|2"); } + + @Test + public void getNameAndIconFromUserId_nullUserInfo_returnDefaultNameAndIcon() { + final int userId = 1001; + doReturn(mockUserManager).when(mContext).getSystemService(UserManager.class); + doReturn(null).when(mockUserManager).getUserInfo(userId); + + final NameAndIcon nameAndIcon = BatteryEntry.getNameAndIconFromUserId( + mContext, userId); + assertThat(nameAndIcon.name).isEqualTo(getString( + R.string.running_process_item_removed_user_label)); + assertThat(nameAndIcon.icon).isNull(); + } + + @Test + public void getNameAndIconFromUid_rerturnExpectedName() { + final NameAndIcon nameAndIcon = BatteryEntry.getNameAndIconFromUid( + mContext, /* name */ null, /* uid */ 0); + assertThat(nameAndIcon.name).isEqualTo(getString(R.string.process_kernel_label)); + + assertNameAndIcon("mediaserver", R.string.process_mediaserver_label); + assertNameAndIcon("dex2oat32", R.string.process_dex2oat_label); + assertNameAndIcon("dex2oat64", R.string.process_dex2oat_label); + assertNameAndIcon("dex2oat", R.string.process_dex2oat_label); + } + + @Test + public void getNameAndIconFromPowerComponent_rerturnExpectedNameAndIcon() { + assertNameAndIcon(BatteryConsumer.POWER_COMPONENT_AMBIENT_DISPLAY, + R.string.ambient_display_screen_title, + R.drawable.ic_settings_aod); + assertNameAndIcon(BatteryConsumer.POWER_COMPONENT_BLUETOOTH, + R.string.power_bluetooth, + com.android.internal.R.drawable.ic_settings_bluetooth); + assertNameAndIcon(BatteryConsumer.POWER_COMPONENT_CAMERA, + R.string.power_camera, + R.drawable.ic_settings_camera); + assertNameAndIcon(BatteryConsumer.POWER_COMPONENT_MOBILE_RADIO, + R.string.power_cell, + R.drawable.ic_cellular_1_bar); + assertNameAndIcon(BatteryConsumer.POWER_COMPONENT_FLASHLIGHT, + R.string.power_flashlight, + R.drawable.ic_settings_display); + assertNameAndIcon(BatteryConsumer.POWER_COMPONENT_PHONE, + R.string.power_phone, + R.drawable.ic_settings_voice_calls); + assertNameAndIcon(BatteryConsumer.POWER_COMPONENT_SCREEN, + R.string.power_screen, + R.drawable.ic_settings_display); + assertNameAndIcon(BatteryConsumer.POWER_COMPONENT_WIFI, + R.string.power_wifi, + R.drawable.ic_settings_wireless); + assertNameAndIcon(BatteryConsumer.POWER_COMPONENT_IDLE, + R.string.power_idle, + R.drawable.ic_settings_phone_idle); + } + + private void assertNameAndIcon(String name, int stringId) { + final NameAndIcon nameAndIcon = BatteryEntry.getNameAndIconFromUid( + mContext, name, /* uid */ 1000); + assertThat(nameAndIcon.name).isEqualTo(getString(stringId)); + } + + private void assertNameAndIcon(int powerComponentId, int stringId, int iconId) { + final NameAndIcon nameAndIcon = BatteryEntry.getNameAndIconFromPowerComponent( + mContext, powerComponentId); + assertThat(nameAndIcon.name).isEqualTo(getString(stringId)); + assertThat(nameAndIcon.iconId).isEqualTo(iconId); + } + + private String getString(int stringId) { + return mContext.getResources().getString(stringId); + } } From 09e1164c0c5850a3f85d4ad01f186bde8e54f829 Mon Sep 17 00:00:00 2001 From: ykhung Date: Fri, 9 Jul 2021 11:01:47 +0800 Subject: [PATCH 5/6] Remove items from not allowed show summary list (legacy rule) Bug: 191991503 Test: make SettingsRoboTests Change-Id: Ieadc97eddcbd149e04ec85477859a9b3ffd8f06b (cherry picked from commit b6d95d1c4fd888f4c3811bbc1a7c3d7261b0ec04) --- res/values/arrays.xml | 2 -- .../BatteryAppListPreferenceControllerTest.java | 8 ++++++-- .../BatteryChartPreferenceControllerTest.java | 11 +++++++---- 3 files changed, 13 insertions(+), 8 deletions(-) diff --git a/res/values/arrays.xml b/res/values/arrays.xml index 34506658c45..7d6745cb755 100644 --- a/res/values/arrays.xml +++ b/res/values/arrays.xml @@ -1529,8 +1529,6 @@ - - "com.google.android.googlequicksearchbox"