Loading res/layout/battery_chart_graph.xml +3 −1 Original line number Diff line number Diff line Loading @@ -40,12 +40,14 @@ android:contentDescription="@string/battery_usage_chart" android:textAppearance="?android:attr/textAppearanceSmall" settings:textColor="?android:attr/textColorSecondary" /> <!-- Use non-scalable text size from text_size_small_material --> <TextView android:id="@+id/companion_text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:visibility="gone" android:textAppearance="?android:attr/textAppearanceSmall" android:textColor="?android:attr/textColorSecondary"/> android:textColor="?android:attr/textColorSecondary" android:textSize="14dp" /> </LinearLayout> res/values/dimens.xml +1 −1 Original line number Diff line number Diff line Loading @@ -437,7 +437,7 @@ <dimen name="chartview_text_padding">6dp</dimen> <dimen name="chartview_divider_width">1dp</dimen> <dimen name="chartview_divider_height">4dp</dimen> <dimen name="chartview_trapezoid_radius">3dp</dimen> <dimen name="chartview_trapezoid_radius">5dp</dimen> <dimen name="chartview_trapezoid_margin_start">1dp</dimen> <dimen name="chartview_trapezoid_margin_bottom">2dp</dimen> </resources> res/values/strings.xml +0 −4 Original line number Diff line number Diff line Loading @@ -6614,10 +6614,6 @@ <string name="battery_system_usage_for">System usage for <xliff:g id="slot">%s</xliff:g></string> <!-- [CHAR_LIMIT=NONE] Battery app usage section header --> <string name="battery_app_usage_for">App usage for <xliff:g id="slot">%s</xliff:g></string> <!-- [CHAR_LIMIT=NONE] Battery usage section header for a specific time slot --> <string name="battery_usage_time_am">am</string> <!-- [CHAR_LIMIT=NONE] Battery usage section header for a specific time slot --> <string name="battery_usage_time_pm">pm</string> <!-- [CHAR_LIMIT=NONE] Battery usage item for total usage time less than a minute --> <string name="battery_usage_total_less_than_one_minute">Total: less than a min</string> <!-- [CHAR_LIMIT=NONE] Battery usage item for total background time less than a minute --> src/com/android/settings/fuelgauge/BatteryChartView.java +14 −9 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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(); Loading Loading @@ -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(); Loading Loading @@ -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); } Loading @@ -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] - Loading src/com/android/settings/fuelgauge/ConvertUtils.java +11 −40 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading Loading @@ -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( Loading Loading @@ -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. */ Loading Loading
res/layout/battery_chart_graph.xml +3 −1 Original line number Diff line number Diff line Loading @@ -40,12 +40,14 @@ android:contentDescription="@string/battery_usage_chart" android:textAppearance="?android:attr/textAppearanceSmall" settings:textColor="?android:attr/textColorSecondary" /> <!-- Use non-scalable text size from text_size_small_material --> <TextView android:id="@+id/companion_text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:visibility="gone" android:textAppearance="?android:attr/textAppearanceSmall" android:textColor="?android:attr/textColorSecondary"/> android:textColor="?android:attr/textColorSecondary" android:textSize="14dp" /> </LinearLayout>
res/values/dimens.xml +1 −1 Original line number Diff line number Diff line Loading @@ -437,7 +437,7 @@ <dimen name="chartview_text_padding">6dp</dimen> <dimen name="chartview_divider_width">1dp</dimen> <dimen name="chartview_divider_height">4dp</dimen> <dimen name="chartview_trapezoid_radius">3dp</dimen> <dimen name="chartview_trapezoid_radius">5dp</dimen> <dimen name="chartview_trapezoid_margin_start">1dp</dimen> <dimen name="chartview_trapezoid_margin_bottom">2dp</dimen> </resources>
res/values/strings.xml +0 −4 Original line number Diff line number Diff line Loading @@ -6614,10 +6614,6 @@ <string name="battery_system_usage_for">System usage for <xliff:g id="slot">%s</xliff:g></string> <!-- [CHAR_LIMIT=NONE] Battery app usage section header --> <string name="battery_app_usage_for">App usage for <xliff:g id="slot">%s</xliff:g></string> <!-- [CHAR_LIMIT=NONE] Battery usage section header for a specific time slot --> <string name="battery_usage_time_am">am</string> <!-- [CHAR_LIMIT=NONE] Battery usage section header for a specific time slot --> <string name="battery_usage_time_pm">pm</string> <!-- [CHAR_LIMIT=NONE] Battery usage item for total usage time less than a minute --> <string name="battery_usage_total_less_than_one_minute">Total: less than a min</string> <!-- [CHAR_LIMIT=NONE] Battery usage item for total background time less than a minute -->
src/com/android/settings/fuelgauge/BatteryChartView.java +14 −9 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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(); Loading Loading @@ -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(); Loading Loading @@ -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); } Loading @@ -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] - Loading
src/com/android/settings/fuelgauge/ConvertUtils.java +11 −40 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading Loading @@ -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( Loading Loading @@ -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. */ Loading