From abe9246caa0a1b853eddf04af1f3535406129afb Mon Sep 17 00:00:00 2001 From: Julia Reynolds Date: Mon, 2 Aug 2021 14:17:00 -0400 Subject: [PATCH 1/5] Limit the number of concurrent notifs appear on screen To avoid an ANR in notification history Test: Manual; with an app with 10k recent notifications Bug: 183712803 Change-Id: Ia1340accadf43620c7b5a2c94ca1032cfe49ea59 --- res/layout/notification_history_app_layout.xml | 17 +++++++++-------- .../history/NotificationHistoryAdapter.java | 5 +++++ .../NotificationHistoryRecyclerView.java | 1 - 3 files changed, 14 insertions(+), 9 deletions(-) diff --git a/res/layout/notification_history_app_layout.xml b/res/layout/notification_history_app_layout.xml index 8f66628e74b..24a43c66c71 100644 --- a/res/layout/notification_history_app_layout.xml +++ b/res/layout/notification_history_app_layout.xml @@ -78,13 +78,14 @@ android:layout_height="1dp" android:background="?android:attr/listDivider"/> - + \ No newline at end of file diff --git a/src/com/android/settings/notification/history/NotificationHistoryAdapter.java b/src/com/android/settings/notification/history/NotificationHistoryAdapter.java index 0683ef7612d..dfa8a30c15d 100644 --- a/src/com/android/settings/notification/history/NotificationHistoryAdapter.java +++ b/src/com/android/settings/notification/history/NotificationHistoryAdapter.java @@ -71,6 +71,11 @@ public class NotificationHistoryAdapter extends return new NotificationHistoryViewHolder(view); } + @Override + public long getItemId(int position) { + return mValues.get(position).hashCode(); + } + @Override public void onBindViewHolder(final @NonNull NotificationHistoryViewHolder holder, int position) { diff --git a/src/com/android/settings/notification/history/NotificationHistoryRecyclerView.java b/src/com/android/settings/notification/history/NotificationHistoryRecyclerView.java index 06c74bc3432..224c31d1f55 100644 --- a/src/com/android/settings/notification/history/NotificationHistoryRecyclerView.java +++ b/src/com/android/settings/notification/history/NotificationHistoryRecyclerView.java @@ -40,7 +40,6 @@ public class NotificationHistoryRecyclerView extends RecyclerView { ItemTouchHelper touchHelper = new ItemTouchHelper( new DismissTouchHelper(0, ItemTouchHelper.START | ItemTouchHelper.END)); touchHelper.attachToRecyclerView(this); - setNestedScrollingEnabled(false); } public void setOnItemSwipeDeleteListener(OnItemSwipeDeleteListener listener) { From 715e337af8a32ff2d72bfd55014dd14678d42d16 Mon Sep 17 00:00:00 2001 From: Kevin Chyn Date: Wed, 11 Aug 2021 16:31:36 -0700 Subject: [PATCH 2/5] Add debugReason to BiometricUtils#tryStartingNextBiometricEnroll Bug: 196060286 Test: adb shell am start -a android.settings.BIOMETRIC_ENROLL Change-Id: Ib157dd916b1cfd2238cf6844a970d70cbf56faa6 --- .../android/settings/biometrics/BiometricUtils.java | 4 +++- .../biometrics/face/FaceEnrollEducation.java | 3 ++- .../biometrics/face/FaceEnrollIntroduction.java | 12 ++++++++---- 3 files changed, 13 insertions(+), 6 deletions(-) diff --git a/src/com/android/settings/biometrics/BiometricUtils.java b/src/com/android/settings/biometrics/BiometricUtils.java index a98c3555f71..7dd63850dee 100644 --- a/src/com/android/settings/biometrics/BiometricUtils.java +++ b/src/com/android/settings/biometrics/BiometricUtils.java @@ -244,7 +244,9 @@ public class BiometricUtils { * @return true if the next enrollment was started */ public static boolean tryStartingNextBiometricEnroll(@NonNull Activity activity, - int requestCode) { + int requestCode, String debugReason) { + + Log.d(TAG, "tryStartingNextBiometricEnroll, debugReason: " + debugReason); final PendingIntent pendingIntent = (PendingIntent) activity.getIntent() .getExtra(MultiBiometricEnrollHelper.EXTRA_ENROLL_AFTER_FACE); if (pendingIntent != null) { diff --git a/src/com/android/settings/biometrics/face/FaceEnrollEducation.java b/src/com/android/settings/biometrics/face/FaceEnrollEducation.java index fa8f5564f2e..6509d4e6e2e 100644 --- a/src/com/android/settings/biometrics/face/FaceEnrollEducation.java +++ b/src/com/android/settings/biometrics/face/FaceEnrollEducation.java @@ -216,7 +216,8 @@ public class FaceEnrollEducation extends BiometricEnrollBase { } protected void onSkipButtonClick(View view) { - if (!BiometricUtils.tryStartingNextBiometricEnroll(this, ENROLL_NEXT_BIOMETRIC_REQUEST)) { + if (!BiometricUtils.tryStartingNextBiometricEnroll(this, ENROLL_NEXT_BIOMETRIC_REQUEST, + "edu_skip")) { setResult(RESULT_SKIP); finish(); } diff --git a/src/com/android/settings/biometrics/face/FaceEnrollIntroduction.java b/src/com/android/settings/biometrics/face/FaceEnrollIntroduction.java index e9092c795ea..1de4bc71c3d 100644 --- a/src/com/android/settings/biometrics/face/FaceEnrollIntroduction.java +++ b/src/com/android/settings/biometrics/face/FaceEnrollIntroduction.java @@ -59,28 +59,32 @@ public class FaceEnrollIntroduction extends BiometricEnrollIntroduction { @Override protected void onCancelButtonClick(View view) { - if (!BiometricUtils.tryStartingNextBiometricEnroll(this, ENROLL_NEXT_BIOMETRIC_REQUEST)) { + if (!BiometricUtils.tryStartingNextBiometricEnroll(this, ENROLL_NEXT_BIOMETRIC_REQUEST, + "cancel")) { super.onCancelButtonClick(view); } } @Override protected void onSkipButtonClick(View view) { - if (!BiometricUtils.tryStartingNextBiometricEnroll(this, ENROLL_NEXT_BIOMETRIC_REQUEST)) { + if (!BiometricUtils.tryStartingNextBiometricEnroll(this, ENROLL_NEXT_BIOMETRIC_REQUEST, + "skip")) { super.onSkipButtonClick(view); } } @Override protected void onEnrollmentSkipped(@Nullable Intent data) { - if (!BiometricUtils.tryStartingNextBiometricEnroll(this, ENROLL_NEXT_BIOMETRIC_REQUEST)) { + if (!BiometricUtils.tryStartingNextBiometricEnroll(this, ENROLL_NEXT_BIOMETRIC_REQUEST, + "skipped")) { super.onEnrollmentSkipped(data); } } @Override protected void onFinishedEnrolling(@Nullable Intent data) { - if (!BiometricUtils.tryStartingNextBiometricEnroll(this, ENROLL_NEXT_BIOMETRIC_REQUEST)) { + if (!BiometricUtils.tryStartingNextBiometricEnroll(this, ENROLL_NEXT_BIOMETRIC_REQUEST, + "finished")) { super.onFinishedEnrolling(data); } } From ad346e12d57a41bf052900d16a9af27086d80782 Mon Sep 17 00:00:00 2001 From: ykhung Date: Mon, 9 Aug 2021 15:14:07 +0800 Subject: [PATCH 3/5] [Robustness] protect get battery stats from DeadSystemException In some corner cases, we will receive the DeadSystemException from BatteryStatService when invoking getBatteryUsageStats() method. Before this issue is resolved by BatteryStatService team, we will add some protections to avoid Settings app is crashed. Bug: 195306545 Bug: 195467687 Test: make SettingsRoboTests Change-Id: I75fcf63f4f69d86d6dce0e12bd4d738b1219ae47 --- src/com/android/settings/fuelgauge/BatteryInfo.java | 11 +++++++++-- .../settings/fuelgauge/BatteryUsageStatsLoader.java | 9 ++++++++- src/com/android/settings/fuelgauge/BatteryUtils.java | 10 ++++++++-- .../settings/fuelgauge/PowerUsageSummary.java | 9 +++++++++ .../fuelgauge/batterytip/BatteryTipLoader.java | 12 +++++++----- 5 files changed, 41 insertions(+), 10 deletions(-) diff --git a/src/com/android/settings/fuelgauge/BatteryInfo.java b/src/com/android/settings/fuelgauge/BatteryInfo.java index 92151c0c58d..4433da2c9cc 100644 --- a/src/com/android/settings/fuelgauge/BatteryInfo.java +++ b/src/com/android/settings/fuelgauge/BatteryInfo.java @@ -25,6 +25,7 @@ import android.os.BatteryStatsManager; import android.os.BatteryUsageStats; import android.os.SystemClock; import android.text.format.Formatter; +import android.util.Log; import android.util.SparseIntArray; import androidx.annotation.NonNull; @@ -42,6 +43,7 @@ import com.android.settingslib.utils.PowerUtil; import com.android.settingslib.utils.StringUtil; public class BatteryInfo { + private static final String TAG = "BatteryInfo"; public CharSequence chargeLabel; public CharSequence remainingLabel; @@ -155,8 +157,13 @@ public class BatteryInfo { if (batteryUsageStats != null) { stats = batteryUsageStats; } else { - stats = context.getSystemService(BatteryStatsManager.class) - .getBatteryUsageStats(); + try { + stats = context.getSystemService(BatteryStatsManager.class) + .getBatteryUsageStats(); + } catch (RuntimeException e) { + Log.e(TAG, "getBatteryInfo() from getBatteryUsageStats()", e); + return null; + } } return getBatteryInfo(context, stats, shortString); } diff --git a/src/com/android/settings/fuelgauge/BatteryUsageStatsLoader.java b/src/com/android/settings/fuelgauge/BatteryUsageStatsLoader.java index d35ef82b818..0acc54e758b 100644 --- a/src/com/android/settings/fuelgauge/BatteryUsageStatsLoader.java +++ b/src/com/android/settings/fuelgauge/BatteryUsageStatsLoader.java @@ -20,6 +20,7 @@ import android.content.Context; import android.os.BatteryStatsManager; import android.os.BatteryUsageStats; import android.os.BatteryUsageStatsQuery; +import android.util.Log; import com.android.settingslib.utils.AsyncLoaderCompat; @@ -27,6 +28,7 @@ import com.android.settingslib.utils.AsyncLoaderCompat; * Loader to get new {@link BatteryUsageStats} in the background */ public class BatteryUsageStatsLoader extends AsyncLoaderCompat { + private static final String TAG = "BatteryUsageStatsLoader"; private final BatteryStatsManager mBatteryStatsManager; private final boolean mIncludeBatteryHistory; @@ -42,7 +44,12 @@ public class BatteryUsageStatsLoader extends AsyncLoaderCompat loader, BatteryInfo batteryInfo) { + if (batteryInfo == null) { + Log.w(TAG, "mBatteryInfoLoaderCallbacks: batteryInfo = null"); + return; + } mBatteryHeaderPreferenceController.updateHeaderPreference(batteryInfo); mBatteryHeaderPreferenceController.updateHeaderByBatteryTips( mBatteryTipPreferenceController.getCurrentBatteryTip(), batteryInfo); @@ -126,6 +131,10 @@ public class PowerUsageSummary extends PowerUsageBase implements @Override public void onLoadFinished(Loader> loader, List data) { + if (mBatteryInfo == null) { + Log.w(TAG, "mBatteryTipsCallbacks: batteryInfo = null"); + return; + } mBatteryTipPreferenceController.updateBatteryTips(data); mBatteryHeaderPreferenceController.updateHeaderByBatteryTips( mBatteryTipPreferenceController.getCurrentBatteryTip(), mBatteryInfo); diff --git a/src/com/android/settings/fuelgauge/batterytip/BatteryTipLoader.java b/src/com/android/settings/fuelgauge/batterytip/BatteryTipLoader.java index 7d11ba5a718..b6806e8573a 100644 --- a/src/com/android/settings/fuelgauge/batterytip/BatteryTipLoader.java +++ b/src/com/android/settings/fuelgauge/batterytip/BatteryTipLoader.java @@ -18,6 +18,7 @@ package com.android.settings.fuelgauge.batterytip; import android.content.Context; import android.os.BatteryUsageStats; +import android.util.Log; import androidx.annotation.VisibleForTesting; @@ -67,16 +68,17 @@ public class BatteryTipLoader extends AsyncLoaderCompat> { final BatteryInfo batteryInfo = mBatteryUtils.getBatteryInfo(TAG); final Context context = getContext(); + tips.add(new EarlyWarningDetector(policy, context).detect()); + if (batteryInfo == null) { + Log.w(TAG, "loadInBackground() batteryInfo = null"); + return tips; + } + tips.add(new LowBatteryDetector(context, policy, batteryInfo).detect()); tips.add(new HighUsageDetector(context, policy, mBatteryUsageStats, batteryInfo).detect()); tips.add(new SmartBatteryDetector( context, policy, batteryInfo, context.getContentResolver()).detect()); - tips.add(new EarlyWarningDetector(policy, context).detect()); tips.add(new BatteryDefenderDetector(batteryInfo).detect()); - // Disable this feature now since it introduces false positive cases. We will try to improve - // it in the future. - // tips.add(new RestrictAppDetector(context, policy).detect()); - Collections.sort(tips); return tips; } From fbbcc55fc02916df4dd38108d41d3ed86efd3aba Mon Sep 17 00:00:00 2001 From: ykhung Date: Mon, 9 Aug 2021 23:02:29 +0800 Subject: [PATCH 4/5] Add time unit into battery usage chart and refine some UI - add time unit into battery chart for 12/24 hours - refine the radius size for chart bar - use fixed font size for timestamp and percentage screenshots: 24-hour format: https://screenshot.googleplex.com/3VNedE2nAx6LrXu 12-hour format: https://screenshot.googleplex.com/3tpTXjYfrasrenW fixed-size: https://screenshot.googleplex.com/nPRKm7XCkmFzW6K Bug: 194836607 Test: make SettingsRoboTests Change-Id: I5b35b0fa808eb8a5f607962ee973c2896529b078 --- res/layout/battery_chart_graph.xml | 4 +- res/values/dimens.xml | 2 +- res/values/strings.xml | 4 -- .../settings/fuelgauge/BatteryChartView.java | 23 ++++--- .../settings/fuelgauge/ConvertUtils.java | 51 ++++---------- .../BatteryChartPreferenceControllerTest.java | 40 +---------- .../fuelgauge/BatteryChartViewTest.java | 19 ------ .../settings/fuelgauge/ConvertUtilsTest.java | 66 ------------------- 8 files changed, 31 insertions(+), 178 deletions(-) diff --git a/res/layout/battery_chart_graph.xml b/res/layout/battery_chart_graph.xml index db86693043e..e89c9120c74 100644 --- a/res/layout/battery_chart_graph.xml +++ b/res/layout/battery_chart_graph.xml @@ -40,12 +40,14 @@ android:contentDescription="@string/battery_usage_chart" android:textAppearance="?android:attr/textAppearanceSmall" settings:textColor="?android:attr/textColorSecondary" /> + + android:textColor="?android:attr/textColorSecondary" + android:textSize="14dp" /> diff --git a/res/values/dimens.xml b/res/values/dimens.xml index 1b8179abdaf..7a7588315ef 100755 --- a/res/values/dimens.xml +++ b/res/values/dimens.xml @@ -437,7 +437,7 @@ 6dp 1dp 4dp - 3dp + 5dp 1dp 2dp diff --git a/res/values/strings.xml b/res/values/strings.xml index a05640b0d5e..742dd836395 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -6654,10 +6654,6 @@ System usage for %s App usage for %s - - am - - pm Total: less than a min diff --git a/src/com/android/settings/fuelgauge/BatteryChartView.java b/src/com/android/settings/fuelgauge/BatteryChartView.java index a98c644b22a..7bc60b23c38 100644 --- a/src/com/android/settings/fuelgauge/BatteryChartView.java +++ b/src/com/android/settings/fuelgauge/BatteryChartView.java @@ -57,7 +57,8 @@ public class BatteryChartView extends AppCompatImageView implements View.OnClick Arrays.asList("SwitchAccessService", "TalkBackService", "JustSpeakService"); private static final int DEFAULT_TRAPEZOID_COUNT = 12; - private static final int DEFAULT_TIMESTAMP_COUNT = 5; + private static final int DEFAULT_TIMESTAMP_COUNT = 4; + private static final int TIMESTAMP_GAPS_COUNT = DEFAULT_TIMESTAMP_COUNT - 1; private static final int DIVIDER_COLOR = Color.parseColor("#CDCCC5"); private static final long UPDATE_STATE_DELAYED_TIME = 500L; @@ -91,7 +92,7 @@ public class BatteryChartView extends AppCompatImageView implements View.OnClick new Rect[] {new Rect(), new Rect(), new Rect()}; // For drawing the timestamp information. private final Rect[] mTimestampsBounds = - new Rect[] {new Rect(), new Rect(), new Rect(), new Rect(), new Rect()}; + new Rect[] {new Rect(), new Rect(), new Rect(), new Rect()}; @VisibleForTesting Handler mHandler = new Handler(); @@ -198,13 +199,14 @@ public class BatteryChartView extends AppCompatImageView implements View.OnClick if (mTimestamps == null) { mTimestamps = new String[DEFAULT_TIMESTAMP_COUNT]; } - final long timeSlotOffset = DateUtils.HOUR_IN_MILLIS * 6; + final long timeSlotOffset = + DateUtils.HOUR_IN_MILLIS * (/*total 24 hours*/ 24 / TIMESTAMP_GAPS_COUNT); final boolean is24HourFormat = DateFormat.is24HourFormat(getContext()); for (int index = 0; index < DEFAULT_TIMESTAMP_COUNT; index++) { mTimestamps[index] = ConvertUtils.utcToLocalTimeHour( getContext(), - latestTimestamp - (4 - index) * timeSlotOffset, + latestTimestamp - (TIMESTAMP_GAPS_COUNT - index) * timeSlotOffset, is24HourFormat); } requestLayout(); @@ -426,8 +428,9 @@ public class BatteryChartView extends AppCompatImageView implements View.OnClick final float[] xOffsets = new float[DEFAULT_TIMESTAMP_COUNT]; final float baselineX = mDividerWidth * .5f; final float offsetX = mDividerWidth + unitWidth; + final int slotBarOffset = (/*total 12 bars*/ 12) / TIMESTAMP_GAPS_COUNT; for (int index = 0; index < DEFAULT_TIMESTAMP_COUNT; index++) { - xOffsets[index] = baselineX + index * offsetX * 3; + xOffsets[index] = baselineX + index * offsetX * slotBarOffset; } drawTimestamp(canvas, xOffsets); } @@ -439,13 +442,15 @@ public class BatteryChartView extends AppCompatImageView implements View.OnClick mTimestamps[0], xOffsets[0] - mTimestampsBounds[0].left, getTimestampY(0), mTextPaint); + final int latestIndex = DEFAULT_TIMESTAMP_COUNT - 1; // Draws the last timestamp info. canvas.drawText( - mTimestamps[4], - xOffsets[4] - mTimestampsBounds[4].width() - mTimestampsBounds[4].left, - getTimestampY(4), mTextPaint); + mTimestamps[latestIndex], + xOffsets[latestIndex] - mTimestampsBounds[latestIndex].width() + - mTimestampsBounds[latestIndex].left, + getTimestampY(latestIndex), mTextPaint); // Draws the rest of timestamp info since it is located in the center. - for (int index = 1; index <= 3; index++) { + for (int index = 1; index <= DEFAULT_TIMESTAMP_COUNT - 2; index++) { canvas.drawText( mTimestamps[index], xOffsets[index] - diff --git a/src/com/android/settings/fuelgauge/ConvertUtils.java b/src/com/android/settings/fuelgauge/ConvertUtils.java index 001e9e912a4..827ac920778 100644 --- a/src/com/android/settings/fuelgauge/ConvertUtils.java +++ b/src/com/android/settings/fuelgauge/ConvertUtils.java @@ -19,6 +19,7 @@ import android.content.Context; import android.os.BatteryUsageStats; import android.os.LocaleList; import android.os.UserHandle; +import android.text.format.DateFormat; import android.text.format.DateUtils; import android.util.Log; @@ -26,10 +27,8 @@ import androidx.annotation.VisibleForTesting; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; -import java.text.SimpleDateFormat; import java.time.Duration; import java.util.ArrayList; -import java.util.Date; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; @@ -76,19 +75,6 @@ public final class ConvertUtils { public static final int CONSUMER_TYPE_USER_BATTERY = 2; public static final int CONSUMER_TYPE_SYSTEM_BATTERY = 3; - // For language is changed. - @VisibleForTesting static Locale sLocale; - @VisibleForTesting static Locale sLocaleForHour; - // For time zone is changed. - @VisibleForTesting static String sZoneId; - @VisibleForTesting static String sZoneIdForHour; - private static boolean sIs24HourFormat; - - @VisibleForTesting - static SimpleDateFormat sSimpleDateFormat; - @VisibleForTesting - static SimpleDateFormat sSimpleDateFormatForHour; - private ConvertUtils() {} public static ContentValues convert( @@ -136,36 +122,21 @@ public final class ConvertUtils { /** Converts UTC timestamp to human readable local time string. */ public static String utcToLocalTime(Context context, long timestamp) { - final Locale currentLocale = getLocale(context); - final String currentZoneId = TimeZone.getDefault().getID(); - if (!currentZoneId.equals(sZoneId) - || !currentLocale.equals(sLocale) - || sSimpleDateFormat == null) { - sLocale = currentLocale; - sZoneId = currentZoneId; - sSimpleDateFormat = - new SimpleDateFormat("MMM dd,yyyy HH:mm:ss", currentLocale); - } - return sSimpleDateFormat.format(new Date(timestamp)); + final Locale locale = getLocale(context); + final String pattern = + DateFormat.getBestDateTimePattern(locale, "MMM dd,yyyy HH:mm:ss"); + return DateFormat.format(pattern, timestamp).toString(); } /** Converts UTC timestamp to local time hour data. */ public static String utcToLocalTimeHour( Context context, long timestamp, boolean is24HourFormat) { - final Locale currentLocale = getLocale(context); - final String currentZoneId = TimeZone.getDefault().getID(); - if (!currentZoneId.equals(sZoneIdForHour) - || !currentLocale.equals(sLocaleForHour) - || sIs24HourFormat != is24HourFormat - || sSimpleDateFormatForHour == null) { - sLocaleForHour = currentLocale; - sZoneIdForHour = currentZoneId; - sIs24HourFormat = is24HourFormat; - sSimpleDateFormatForHour = new SimpleDateFormat( - sIs24HourFormat ? "HH" : "h", currentLocale); - } - return sSimpleDateFormatForHour.format(new Date(timestamp)) - .toLowerCase(currentLocale); + final Locale locale = getLocale(context); + // e.g. for 12-hour format: 9 pm + // e.g. for 24-hour format: 09:00 + final String skeleton = is24HourFormat ? "HHm" : "ha"; + final String pattern = DateFormat.getBestDateTimePattern(locale, skeleton); + return DateFormat.format(pattern, timestamp).toString().toLowerCase(locale); } /** Gets indexed battery usage data for each corresponding time slot. */ diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BatteryChartPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BatteryChartPreferenceControllerTest.java index fd4e82d4b23..43fbe81a3a1 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/BatteryChartPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/BatteryChartPreferenceControllerTest.java @@ -50,7 +50,6 @@ import com.android.settings.testutils.FakeFeatureFactory; import com.android.settingslib.core.instrumentation.MetricsFeatureProvider; import org.junit.Before; -import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; @@ -65,7 +64,6 @@ import java.util.HashMap; import java.util.Locale; import java.util.List; import java.util.Map; -import java.util.TimeZone; @RunWith(RobolectricTestRunner.class) public final class BatteryChartPreferenceControllerTest { @@ -125,37 +123,6 @@ public final class BatteryChartPreferenceControllerTest { createBatteryHistoryMap()); } - @Ignore - @Test - public void testOnResume_uiModeIsChanged_clearBatteryDiffEntryCache() { - doReturn(mResources).when(mContext).getResources(); - doReturn(mConfiguration).when(mResources).getConfiguration(); - mConfiguration.uiMode = Configuration.UI_MODE_NIGHT_UNDEFINED; - // Ensures the testing environment is correct. - assertThat(BatteryDiffEntry.sResourceCache).hasSize(1); - mBatteryChartPreferenceController.onResume(); - // Changes the uiMode in the configuration. - mConfiguration.uiMode = Configuration.UI_MODE_NIGHT_YES; - - mBatteryChartPreferenceController.onResume(); - assertThat(BatteryDiffEntry.sResourceCache).isEmpty(); - } - - @Ignore - @Test - public void testOnResume_uiModeIsNotChanged_notClearBatteryDiffEntryCache() { - doReturn(mResources).when(mContext).getResources(); - doReturn(mConfiguration).when(mResources).getConfiguration(); - mConfiguration.uiMode = Configuration.UI_MODE_NIGHT_UNDEFINED; - // Ensures the testing environment is correct. - assertThat(BatteryDiffEntry.sResourceCache).hasSize(1); - - mBatteryChartPreferenceController.onResume(); - assertThat(BatteryDiffEntry.sResourceCache).isNotEmpty(); - verify(mMetricsFeatureProvider) - .action(mContext, SettingsEnums.OPEN_BATTERY_USAGE); - } - @Test public void testOnDestroy_activityIsChanging_clearBatteryEntryCache() { doReturn(true).when(mSettingsActivity).isChangingConfigurations(); @@ -579,12 +546,12 @@ public final class BatteryChartPreferenceControllerTest { // Verifies the title in the preference group. verify(mBatteryChartPreferenceController.mAppListPrefGroup) .setTitle(captor.capture()); - assertThat(captor.getValue()).isEqualTo("App usage for 4 - 7"); + assertThat(captor.getValue()).isNotEqualTo("App usage for past 24 hr"); // Verifies the title in the expandable divider. captor = ArgumentCaptor.forClass(String.class); verify(mBatteryChartPreferenceController.mExpandDividerPreference) .setTitle(captor.capture()); - assertThat(captor.getValue()).isEqualTo("System usage for 4 - 7"); + assertThat(captor.getValue()).isNotEqualTo("System usage for past 24 hr"); } @Test @@ -722,9 +689,6 @@ public final class BatteryChartPreferenceControllerTest { new long[] {1619196786769L, 0L, 1619247636826L}; ConvertUtils.utcToLocalTimeHour( mContext, /*timestamp=*/ 0, /*is24HourFormat=*/ false); - // Simulates the locale in GMT. - ConvertUtils.sSimpleDateFormatForHour - .setTimeZone(TimeZone.getTimeZone("GMT")); } private BatteryChartPreferenceController createController() { diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BatteryChartViewTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BatteryChartViewTest.java index d19a012812e..0b75e798423 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/BatteryChartViewTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/BatteryChartViewTest.java @@ -33,7 +33,6 @@ import android.view.accessibility.AccessibilityManager; import com.android.settings.testutils.FakeFeatureFactory; import org.junit.Before; -import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; @@ -44,7 +43,6 @@ import org.robolectric.RuntimeEnvironment; import java.util.Arrays; import java.util.ArrayList; import java.util.Locale; -import java.util.TimeZone; @RunWith(RobolectricTestRunner.class) public final class BatteryChartViewTest { @@ -233,21 +231,4 @@ public final class BatteryChartViewTest { verify(mBatteryChartView.mHandler) .postDelayed(mBatteryChartView.mUpdateClickableStateRun, 500L); } - - @Ignore - @Test - public void testSetLatestTimestamp_generateExpectedTimestamps() { - final long timestamp = 1619196786769L; - ConvertUtils.sSimpleDateFormatForHour = null; - // Invokes the method first to create the SimpleDateFormat. - ConvertUtils.utcToLocalTimeHour( - mContext, /*timestamp=*/ 0, /*is24HourFormat=*/ false); - ConvertUtils.sSimpleDateFormatForHour - .setTimeZone(TimeZone.getTimeZone("America/Los_Angeles")); - final String[] expectedTimestamps = new String[] {"00", "06", "12", "18", "00"}; - - mBatteryChartView.setLatestTimestamp(timestamp); - - assertThat(mBatteryChartView.mTimestamps).isEqualTo(expectedTimestamps); - } } diff --git a/tests/robotests/src/com/android/settings/fuelgauge/ConvertUtilsTest.java b/tests/robotests/src/com/android/settings/fuelgauge/ConvertUtilsTest.java index 0b1a1e31642..8ae50489216 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/ConvertUtilsTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/ConvertUtilsTest.java @@ -30,7 +30,6 @@ import android.os.UserHandle; import com.android.settings.testutils.FakeFeatureFactory; import org.junit.Before; -import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; @@ -317,71 +316,6 @@ public final class ConvertUtilsTest { .isEqualTo(entry.mConsumePower * ratio); } - @Ignore - @Test - public void testUtcToLocalTime_returnExpectedResult() { - ConvertUtils.sZoneId = null; - ConvertUtils.sLocale = null; - final long timestamp = 1619196786769L; - final String expectedZoneId = "America/Los_Angeles"; - ConvertUtils.sSimpleDateFormat = null; - // Invokes the method first to create the SimpleDateFormat. - ConvertUtils.utcToLocalTime(mContext, /*timestamp=*/ 0); - ConvertUtils.sSimpleDateFormat - .setTimeZone(TimeZone.getTimeZone(expectedZoneId)); - mContext.getResources().getConfiguration().setLocales( - new LocaleList(new Locale("en_US"))); - - assertThat(ConvertUtils.utcToLocalTime(mContext, timestamp)) - .isEqualTo("Apr 24,2021 00:53:06"); - assertThat(ConvertUtils.sZoneId).isNotEqualTo(expectedZoneId); - assertThat(ConvertUtils.sLocale).isEqualTo(new Locale("en_US")); - } - - @Ignore - @Test - public void testUtcToLocalTimeHour_12HourFormat_returnExpectedResult() { - ConvertUtils.sZoneIdForHour = null; - ConvertUtils.sLocaleForHour = null; - final long timestamp = 1619000086769L; - final String expectedZoneId = "America/Los_Angeles"; - ConvertUtils.sSimpleDateFormatForHour = null; - // Invokes the method first to create the SimpleDateFormat. - ConvertUtils.utcToLocalTimeHour( - mContext, /*timestamp=*/ 0, /*is24HourFormat=*/ false); - ConvertUtils.sSimpleDateFormatForHour - .setTimeZone(TimeZone.getTimeZone(expectedZoneId)); - mContext.getResources().getConfiguration().setLocales( - new LocaleList(new Locale("en_US"))); - - assertThat(ConvertUtils.utcToLocalTimeHour( - mContext, timestamp, /*is24HourFormat=*/ false)).isEqualTo("6"); - assertThat(ConvertUtils.sZoneIdForHour).isNotEqualTo(expectedZoneId); - assertThat(ConvertUtils.sLocaleForHour).isEqualTo(new Locale("en_US")); - } - - @Ignore - @Test - public void testUtcToLocalTimeHour_24HourFormat_returnExpectedResult() { - ConvertUtils.sZoneIdForHour = null; - ConvertUtils.sLocaleForHour = null; - final long timestamp = 1619000086769L; - final String expectedZoneId = "America/Los_Angeles"; - ConvertUtils.sSimpleDateFormatForHour = null; - // Invokes the method first to create the SimpleDateFormat. - ConvertUtils.utcToLocalTimeHour( - mContext, /*timestamp=*/ 0, /*is24HourFormat=*/ false); - ConvertUtils.sSimpleDateFormatForHour - .setTimeZone(TimeZone.getTimeZone(expectedZoneId)); - mContext.getResources().getConfiguration().setLocales( - new LocaleList(new Locale("en_US"))); - - assertThat(ConvertUtils.utcToLocalTimeHour( - mContext, timestamp, /*is24HourFormat=*/ true)).isEqualTo("18"); - assertThat(ConvertUtils.sZoneIdForHour).isNotEqualTo(expectedZoneId); - assertThat(ConvertUtils.sLocaleForHour).isEqualTo(new Locale("en_US")); - } - @Test public void getLocale_nullContext_returnDefaultLocale() { assertThat(ConvertUtils.getLocale(/*context=*/ null)) From 91f0c5938bb9869b14ce0f825fb63a75a640d263 Mon Sep 17 00:00:00 2001 From: Wendy Sung Date: Wed, 28 Jul 2021 08:28:04 +0000 Subject: [PATCH 5/5] Fix typo for Illustration Preference (picked from Wendy's patch) Test: Manual Build Bug: 194819372 Change-Id: Idbc6891dc1139227e5fb5585e2aadb717d5d6205 --- res/xml/smart_battery_detail.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/res/xml/smart_battery_detail.xml b/res/xml/smart_battery_detail.xml index 9c0aac58318..97951252525 100644 --- a/res/xml/smart_battery_detail.xml +++ b/res/xml/smart_battery_detail.xml @@ -22,7 +22,7 @@ android:title="@string/smart_battery_manager_title" settings:keywords="@string/keywords_battery_adaptive_preferences"> -