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" /> - - "com.google.android.googlequicksearchbox" @*android:color/ripple_material_dark + + + @*android:color/primary_text_default_material_light 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. diff --git a/src/com/android/settings/fuelgauge/BatteryChartPreferenceController.java b/src/com/android/settings/fuelgauge/BatteryChartPreferenceController.java index 3c9cbaa8e89..3bb8448878a 100644 --- a/src/com/android/settings/fuelgauge/BatteryChartPreferenceController.java +++ b/src/com/android/settings/fuelgauge/BatteryChartPreferenceController.java @@ -332,9 +332,12 @@ public class BatteryChartPreferenceController extends AbstractPreferenceControll mTrapezoidIndex = trapezoidIndex; mHandler.post(() -> { + final long start = System.currentTimeMillis(); removeAndCacheAllPrefs(); addAllPreferences(); refreshCategoryTitle(); + Log.d(TAG, String.format("refreshUi is finished in %d/ms", + (System.currentTimeMillis() - start))); }); return true; } 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/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; + } } } diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BatteryAppListPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BatteryAppListPreferenceControllerTest.java index 1faa75fb700..c3b3075612f 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/BatteryAppListPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/BatteryAppListPreferenceControllerTest.java @@ -25,6 +25,7 @@ import static org.mockito.Mockito.when; import android.content.Context; import android.content.pm.PackageManager; +import android.content.res.Resources; import android.os.UserManager; import android.text.format.DateUtils; @@ -72,11 +73,14 @@ public class BatteryAppListPreferenceControllerTest { MockitoAnnotations.initMocks(this); mContext = spy(RuntimeEnvironment.application); + final Resources resources = spy(mContext.getResources()); + when(mContext.getResources()).thenReturn(resources); when(mContext.getPackageManager()).thenReturn(mPackageManager); when(mContext.getApplicationContext()).thenReturn(mContext); when(mContext.getSystemService(UserManager.class)).thenReturn(mUserManager); when(mUserManager.getProfileIdsWithDisabled(anyInt())).thenReturn(new int[] {}); - + when(resources.getTextArray(R.array.allowlist_hide_summary_in_battery_usage)) + .thenReturn(new String[] {"com.android.googlequicksearchbox"}); FakeFeatureFactory.setupForTest(); mPreference = new PowerGaugePreference(mContext); @@ -119,7 +123,7 @@ public class BatteryAppListPreferenceControllerTest { public void testSetUsageSummary_timeMoreThanOneMinute_GoogleApp_shouldNotSetScreenSummary() { when(mBatteryEntry.getTimeInForegroundMs()).thenReturn(2 * DateUtils.MINUTE_IN_MILLIS); when(mBatteryEntry.getDefaultPackageName()) - .thenReturn("com.google.android.googlequicksearchbox"); + .thenReturn("com.android.googlequicksearchbox"); doReturn(mContext.getText(R.string.battery_used_for)).when(mFragment).getText( R.string.battery_used_for); doReturn(mContext).when(mFragment).getContext(); diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BatteryChartPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BatteryChartPreferenceControllerTest.java index ef76eeeaa67..fd4e82d4b23 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/BatteryChartPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/BatteryChartPreferenceControllerTest.java @@ -101,8 +101,11 @@ public final class BatteryChartPreferenceControllerTest { mFeatureFactory = FakeFeatureFactory.setupForTest(); mMetricsFeatureProvider = mFeatureFactory.metricsFeatureProvider; mContext = spy(RuntimeEnvironment.application); - mContext.getResources().getConfiguration().setLocales( - new LocaleList(new Locale("en_US"))); + final Resources resources = spy(mContext.getResources()); + resources.getConfiguration().setLocales(new LocaleList(new Locale("en_US"))); + doReturn(resources).when(mContext).getResources(); + doReturn(new String[] {"com.android.googlequicksearchbox"}) + .when(resources).getTextArray(R.array.allowlist_hide_summary_in_battery_usage); mBatteryChartPreferenceController = createController(); mBatteryChartPreferenceController.mPrefContext = mContext; mBatteryChartPreferenceController.mAppListPrefGroup = mAppListGroup; @@ -467,7 +470,7 @@ public final class BatteryChartPreferenceControllerTest { spy(createBatteryDiffEntry( /*foregroundUsageTimeInMs=*/ DateUtils.MINUTE_IN_MILLIS, /*backgroundUsageTimeInMs=*/ DateUtils.MINUTE_IN_MILLIS)); - doReturn("com.google.android.googlequicksearchbox").when(batteryDiffEntry) + doReturn("com.android.googlequicksearchbox").when(batteryDiffEntry) .getPackageName(); mBatteryChartPreferenceController.setPreferenceSummary(pref, batteryDiffEntry); @@ -678,7 +681,7 @@ public final class BatteryChartPreferenceControllerTest { // Verifies the item which is defined in the array list. assertThat(mBatteryChartPreferenceController - .isValidToShowSummary("com.google.android.googlequicksearchbox")) + .isValidToShowSummary("com.android.googlequicksearchbox")) .isFalse(); } 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); + } }