From 408dc4122883d1296bb891196e28a5d012ab6594 Mon Sep 17 00:00:00 2001 From: Salvador Martinez Date: Fri, 19 Jan 2018 16:33:35 -0800 Subject: [PATCH] Update copy for battery estimate related features Many features are using the enhanced estimates but the copy for them has gotten out of sync. This CL moves shared strings between Settings and SysUI to SettingsLib and also updates features that use the strings to have consistent behavior/text. Test: Robotests Bug: 65656091 Bug: 66909350 Bug: 67469159 Change-Id: Ie5ef1ed65429ca9805cff374f1439e5d61eb6591 --- res/values/strings.xml | 3 + src/com/android/settings/Utils.java | 117 +---------- .../RecentAppsPreferenceController.java | 4 +- .../fuelgauge/AdvancedPowerUsageDetail.java | 5 +- .../BatteryAppListPreferenceController.java | 10 +- .../settings/fuelgauge/BatteryInfo.java | 103 +++++----- .../settings/fuelgauge/BatteryUtils.java | 43 ++-- .../fuelgauge/DebugEstimatesLoader.java | 6 +- .../fuelgauge/PowerUsageAdvanced.java | 3 +- .../settings/fuelgauge/PowerUsageSummary.java | 18 +- .../fuelgauge/PowerUsageSummaryLegacy.java | 17 +- .../batterytip/BatteryTipDialogFragment.java | 4 +- .../batterytip/HighUsageAdapter.java | 3 +- .../batterytip/tips/HighUsageTip.java | 4 +- ...centNotifyingAppsPreferenceController.java | 3 +- .../src/com/android/settings/UtilsTest.java | 188 ++---------------- .../settings/fuelgauge/BatteryInfoTest.java | 48 ++++- .../PowerUsageSummaryLegacyTest.java | 6 +- 18 files changed, 185 insertions(+), 400 deletions(-) diff --git a/res/values/strings.xml b/res/values/strings.xml index 35bc32eedd9..d462450c141 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -5133,6 +5133,9 @@ Manage battery usage + + Battery left estimate is based on your device usage + Estimated time left diff --git a/src/com/android/settings/Utils.java b/src/com/android/settings/Utils.java index f45ac5edb25..1a321274b42 100644 --- a/src/com/android/settings/Utils.java +++ b/src/com/android/settings/Utils.java @@ -52,11 +52,8 @@ import android.graphics.Canvas; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.hardware.fingerprint.FingerprintManager; -import android.icu.text.MeasureFormat; import android.icu.text.RelativeDateTimeFormatter; import android.icu.text.RelativeDateTimeFormatter.RelativeUnit; -import android.icu.util.Measure; -import android.icu.util.MeasureUnit; import android.icu.util.ULocale; import android.net.ConnectivityManager; import android.net.LinkProperties; @@ -88,8 +85,6 @@ import android.support.v7.preference.PreferenceScreen; import android.telephony.TelephonyManager; import android.text.Spannable; import android.text.SpannableString; -import android.text.SpannableStringBuilder; -import android.text.Spanned; import android.text.TextUtils; import android.text.format.DateUtils; import android.text.style.TtsSpan; @@ -112,6 +107,7 @@ import com.android.settings.wrapper.DevicePolicyManagerWrapper; import com.android.settings.wrapper.FingerprintManagerWrapper; import com.android.settingslib.core.instrumentation.VisibilityLoggerMixin; +import com.android.settingslib.utils.StringUtil; import java.net.InetAddress; import java.util.ArrayList; import java.util.Iterator; @@ -138,10 +134,6 @@ public final class Utils extends com.android.settingslib.Utils { private static final String SETTINGS_PACKAGE_NAME = "com.android.settings"; - private static final int SECONDS_PER_MINUTE = 60; - private static final int SECONDS_PER_HOUR = 60 * 60; - private static final int SECONDS_PER_DAY = 24 * 60 * 60; - public static final String OS_PKG = "os"; /** @@ -771,113 +763,6 @@ public final class Utils extends com.android.settingslib.Utils { return tm.getSimCount() > 1; } - /** - * Returns elapsed time for the given millis, in the following format: - * 2d 5h 40m 29s - * @param context the application context - * @param millis the elapsed time in milli seconds - * @param withSeconds include seconds? - * @return the formatted elapsed time - */ - public static CharSequence formatElapsedTime(Context context, double millis, - boolean withSeconds) { - SpannableStringBuilder sb = new SpannableStringBuilder(); - int seconds = (int) Math.floor(millis / 1000); - if (!withSeconds) { - // Round up. - seconds += 30; - } - - int days = 0, hours = 0, minutes = 0; - if (seconds >= SECONDS_PER_DAY) { - days = seconds / SECONDS_PER_DAY; - seconds -= days * SECONDS_PER_DAY; - } - if (seconds >= SECONDS_PER_HOUR) { - hours = seconds / SECONDS_PER_HOUR; - seconds -= hours * SECONDS_PER_HOUR; - } - if (seconds >= SECONDS_PER_MINUTE) { - minutes = seconds / SECONDS_PER_MINUTE; - seconds -= minutes * SECONDS_PER_MINUTE; - } - - final ArrayList measureList = new ArrayList(4); - if (days > 0) { - measureList.add(new Measure(days, MeasureUnit.DAY)); - } - if (hours > 0) { - measureList.add(new Measure(hours, MeasureUnit.HOUR)); - } - if (minutes > 0) { - measureList.add(new Measure(minutes, MeasureUnit.MINUTE)); - } - if (withSeconds && seconds > 0) { - measureList.add(new Measure(seconds, MeasureUnit.SECOND)); - } - if (measureList.size() == 0) { - // Everything addable was zero, so nothing was added. We add a zero. - measureList.add(new Measure(0, withSeconds ? MeasureUnit.SECOND : MeasureUnit.MINUTE)); - } - final Measure[] measureArray = measureList.toArray(new Measure[measureList.size()]); - - final Locale locale = context.getResources().getConfiguration().locale; - final MeasureFormat measureFormat = MeasureFormat.getInstance( - locale, MeasureFormat.FormatWidth.NARROW); - sb.append(measureFormat.formatMeasures(measureArray)); - - if (measureArray.length == 1 && MeasureUnit.MINUTE.equals(measureArray[0].getUnit())) { - // Add ttsSpan if it only have minute value, because it will be read as "meters" - final TtsSpan ttsSpan = new TtsSpan.MeasureBuilder().setNumber(minutes) - .setUnit("minute").build(); - sb.setSpan(ttsSpan, 0, sb.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); - } - - return sb; - } - - /** - * Returns relative time for the given millis in the past, in a short format such as "2 days - * ago", "5 hr. ago", "40 min. ago", or "29 sec. ago". - * - *

The unit is chosen to have good information value while only using one unit. So 27 hours - * and 50 minutes would be formatted as "28 hr. ago", while 50 hours would be formatted as - * "2 days ago". - * - * @param context the application context - * @param millis the elapsed time in milli seconds - * @param withSeconds include seconds? - * @return the formatted elapsed time - */ - public static CharSequence formatRelativeTime(Context context, double millis, - boolean withSeconds) { - final int seconds = (int) Math.floor(millis / 1000); - final RelativeUnit unit; - final int value; - if (withSeconds && seconds < 2 * SECONDS_PER_MINUTE) { - unit = RelativeUnit.SECONDS; - value = seconds; - } else if (seconds < 2 * SECONDS_PER_HOUR) { - unit = RelativeUnit.MINUTES; - value = (seconds + SECONDS_PER_MINUTE / 2) / SECONDS_PER_MINUTE; - } else if (seconds < 2 * SECONDS_PER_DAY) { - unit = RelativeUnit.HOURS; - value = (seconds + SECONDS_PER_HOUR / 2) / SECONDS_PER_HOUR; - } else { - unit = RelativeUnit.DAYS; - value = (seconds + SECONDS_PER_DAY / 2) / SECONDS_PER_DAY; - } - - final Locale locale = context.getResources().getConfiguration().locale; - final RelativeDateTimeFormatter formatter = RelativeDateTimeFormatter.getInstance( - ULocale.forLocale(locale), - null /* default NumberFormat */, - RelativeDateTimeFormatter.Style.SHORT, - android.icu.text.DisplayContext.CAPITALIZATION_FOR_MIDDLE_OF_SENTENCE); - - return formatter.format(value, RelativeDateTimeFormatter.Direction.LAST, unit); - } - /** * Queries for the UserInfo of a user. Returns null if the user doesn't exist (was removed). * @param userManager Instance of UserManager diff --git a/src/com/android/settings/applications/RecentAppsPreferenceController.java b/src/com/android/settings/applications/RecentAppsPreferenceController.java index e15671bc24a..b177225f1f2 100644 --- a/src/com/android/settings/applications/RecentAppsPreferenceController.java +++ b/src/com/android/settings/applications/RecentAppsPreferenceController.java @@ -38,13 +38,13 @@ import android.util.IconDrawableFactory; import android.util.Log; import com.android.settings.R; -import com.android.settings.Utils; import com.android.settings.applications.appinfo.AppInfoDashboardFragment; import com.android.settings.core.PreferenceControllerMixin; import com.android.settings.widget.AppPreference; import com.android.settingslib.applications.AppUtils; import com.android.settingslib.applications.ApplicationsState; import com.android.settingslib.core.AbstractPreferenceController; +import com.android.settingslib.utils.StringUtil; import com.android.settingslib.wrapper.PackageManagerWrapper; import java.util.ArrayList; @@ -239,7 +239,7 @@ public class RecentAppsPreferenceController extends AbstractPreferenceController pref.setKey(pkgName); pref.setTitle(appEntry.label); pref.setIcon(mIconDrawableFactory.getBadgedIcon(appEntry.info)); - pref.setSummary(Utils.formatRelativeTime(mContext, + pref.setSummary(StringUtil.formatRelativeTime(mContext, System.currentTimeMillis() - stat.getLastTimeUsed(), false)); pref.setOrder(i); pref.setOnPreferenceClickListener(preference -> { diff --git a/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java b/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java index e073456db82..981b0dc1129 100644 --- a/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java +++ b/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java @@ -58,6 +58,7 @@ import com.android.settingslib.applications.AppUtils; import com.android.settingslib.applications.ApplicationsState; import com.android.settingslib.core.AbstractPreferenceController; +import com.android.settingslib.utils.StringUtil; import java.util.ArrayList; import java.util.List; @@ -284,10 +285,10 @@ public class AdvancedPowerUsageDetail extends DashboardFragment implements final int powerMah = bundle.getInt(EXTRA_POWER_USAGE_AMOUNT); mForegroundPreference.setSummary( TextUtils.expandTemplate(getText(R.string.battery_used_for), - Utils.formatElapsedTime(context, foregroundTimeMs, false))); + StringUtil.formatElapsedTime(context, foregroundTimeMs, false))); mBackgroundPreference.setSummary( TextUtils.expandTemplate(getText(R.string.battery_active_for), - Utils.formatElapsedTime(context, backgroundTimeMs, false))); + StringUtil.formatElapsedTime(context, backgroundTimeMs, false))); mPowerUsagePreference.setSummary( getString(R.string.battery_detail_power_percentage, usagePercent, powerMah)); } diff --git a/src/com/android/settings/fuelgauge/BatteryAppListPreferenceController.java b/src/com/android/settings/fuelgauge/BatteryAppListPreferenceController.java index 91f35e2533a..2095f25e679 100644 --- a/src/com/android/settings/fuelgauge/BatteryAppListPreferenceController.java +++ b/src/com/android/settings/fuelgauge/BatteryAppListPreferenceController.java @@ -18,7 +18,6 @@ package com.android.settings.fuelgauge; import android.app.Activity; -import android.app.Fragment; import android.content.Context; import android.graphics.drawable.Drawable; import android.os.BatteryStats; @@ -31,7 +30,6 @@ import android.support.annotation.VisibleForTesting; import android.support.v14.preference.PreferenceFragment; import android.support.v7.preference.Preference; import android.support.v7.preference.PreferenceGroup; -import android.support.v7.preference.PreferenceManager; import android.support.v7.preference.PreferenceScreen; import android.text.TextUtils; import android.text.format.DateUtils; @@ -48,16 +46,14 @@ import com.android.settings.R; import com.android.settings.SettingsActivity; import com.android.settings.core.FeatureFlags; import com.android.settings.core.PreferenceControllerMixin; -import com.android.settings.Utils; import com.android.settings.fuelgauge.anomaly.Anomaly; -import com.android.settings.overlay.FeatureFactory; import com.android.settingslib.core.AbstractPreferenceController; -import com.android.settingslib.core.instrumentation.MetricsFeatureProvider; import com.android.settingslib.core.lifecycle.Lifecycle; import com.android.settingslib.core.lifecycle.LifecycleObserver; import com.android.settingslib.core.lifecycle.events.OnDestroy; import com.android.settingslib.core.lifecycle.events.OnPause; +import com.android.settingslib.utils.StringUtil; import java.util.ArrayList; import java.util.List; @@ -362,8 +358,8 @@ public class BatteryAppListPreferenceController extends AbstractPreferenceContro // Only show summary when usage time is longer than one minute final long usageTimeMs = sipper.usageTimeMs; if (usageTimeMs >= DateUtils.MINUTE_IN_MILLIS) { - final CharSequence timeSequence = Utils.formatElapsedTime(mContext, usageTimeMs, - false); + final CharSequence timeSequence = + StringUtil.formatElapsedTime(mContext, usageTimeMs, false); preference.setSummary( (sipper.drainType != DrainType.APP || mBatteryUtils.shouldHideSipper(sipper)) ? timeSequence diff --git a/src/com/android/settings/fuelgauge/BatteryInfo.java b/src/com/android/settings/fuelgauge/BatteryInfo.java index 63841307ed8..43465ab3c57 100644 --- a/src/com/android/settings/fuelgauge/BatteryInfo.java +++ b/src/com/android/settings/fuelgauge/BatteryInfo.java @@ -25,7 +25,6 @@ import android.os.BatteryStats.HistoryItem; import android.os.Bundle; import android.os.SystemClock; import android.support.annotation.WorkerThread; -import android.text.TextUtils; import android.text.format.Formatter; import android.util.SparseIntArray; @@ -34,8 +33,14 @@ import com.android.settings.Utils; import com.android.settings.graph.UsageView; import com.android.settings.overlay.FeatureFactory; import com.android.settingslib.R; +import com.android.settingslib.utils.PowerUtil; +import com.android.settingslib.utils.StringUtil; +import java.util.concurrent.TimeUnit; public class BatteryInfo { + private static final long SEVEN_MINUTES_MICROS = TimeUnit.MINUTES.toMicros(7); + private static final long FIFTEEN_MINUTES_MICROS = TimeUnit.MINUTES.toMicros(15); + private static final long ONE_DAY_MICROS = TimeUnit.DAYS.toMicros(1); public CharSequence chargeLabel; public CharSequence remainingLabel; @@ -100,7 +105,7 @@ public class BatteryInfo { if (lastTime >= 0) { points.put(lastTime, lastLevel); points.put((int) (timePeriod + - BatteryUtils.convertUsToMs(remainingTimeUs)), + PowerUtil.convertUsToMs(remainingTimeUs)), mCharging ? 100 : 0); } } @@ -160,7 +165,7 @@ public class BatteryInfo { PowerUsageFeatureProvider provider = FeatureFactory.getFactory(context).getPowerUsageFeatureProvider(context); final long elapsedRealtimeUs = - BatteryUtils.convertMsToUs(SystemClock.elapsedRealtime()); + PowerUtil.convertMsToUs(SystemClock.elapsedRealtime()); Intent batteryBroadcast = context.registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED)); @@ -176,7 +181,7 @@ public class BatteryInfo { .logRuntime(LOG_TAG, "time for enhanced BatteryInfo", startTime); return BatteryInfo.getBatteryInfo(context, batteryBroadcast, stats, elapsedRealtimeUs, shortString, - BatteryUtils.convertMsToUs(estimate.estimateMillis), + PowerUtil.convertMsToUs(estimate.estimateMillis), estimate.isBasedOnUsage); } } @@ -217,53 +222,61 @@ public class BatteryInfo { info.statusLabel = Utils.getBatteryStatus(resources, batteryBroadcast); if (!info.mCharging) { - if (drainTimeUs > 0) { - info.remainingTimeUs = drainTimeUs; - CharSequence timeString = Utils.formatElapsedTime(context, - BatteryUtils.convertUsToMs(drainTimeUs), false /* withSeconds */); - info.remainingLabel = TextUtils.expandTemplate(context.getText(shortString ? - R.string.power_remaining_duration_only_short : - (basedOnUsage ? - R.string.power_remaining_duration_only_enhanced : - R.string.power_remaining_duration_only)), timeString); - info.chargeLabel = TextUtils.expandTemplate(context.getText( - shortString ? - R.string.power_discharging_duration_short : - basedOnUsage ? - R.string.power_discharging_duration_enhanced : - R.string.power_discharging_duration), - info.batteryPercentString, timeString); - } else { - info.remainingLabel = null; - info.chargeLabel = info.batteryPercentString; - } + updateBatteryInfoDischarging(context, shortString, drainTimeUs, basedOnUsage, info); } else { - final long chargeTime = stats.computeChargeTimeRemaining(elapsedRealtimeUs); - final int status = batteryBroadcast.getIntExtra(BatteryManager.EXTRA_STATUS, - BatteryManager.BATTERY_STATUS_UNKNOWN); - info.discharging = false; - if (chargeTime > 0 && status != BatteryManager.BATTERY_STATUS_FULL) { - info.remainingTimeUs = chargeTime; - CharSequence timeString = Utils.formatElapsedTime(context, - BatteryUtils.convertUsToMs(chargeTime), false /* withSeconds */); - int resId = R.string.power_charging_duration; - info.remainingLabel = TextUtils.expandTemplate(context.getText( - R.string.power_remaining_charging_duration_only), timeString); - info.chargeLabel = TextUtils.expandTemplate(context.getText(resId), - info.batteryPercentString, timeString); - } else { - final String chargeStatusLabel = resources.getString( - R.string.battery_info_status_charging_lower); - info.remainingLabel = null; - info.chargeLabel = info.batteryLevel == 100 ? info.batteryPercentString : - resources.getString(R.string.power_charging, info.batteryPercentString, - chargeStatusLabel); - } + updateBatteryInfoCharging(context, batteryBroadcast, stats, elapsedRealtimeUs, info); } BatteryUtils.logRuntime(LOG_TAG, "time for getBatteryInfo", startTime); return info; } + private static void updateBatteryInfoCharging(Context context, Intent batteryBroadcast, + BatteryStats stats, long elapsedRealtimeUs, BatteryInfo info) { + final Resources resources = context.getResources(); + final long chargeTime = stats.computeChargeTimeRemaining(elapsedRealtimeUs); + final int status = batteryBroadcast.getIntExtra(BatteryManager.EXTRA_STATUS, + BatteryManager.BATTERY_STATUS_UNKNOWN); + info.discharging = false; + if (chargeTime > 0 && status != BatteryManager.BATTERY_STATUS_FULL) { + info.remainingTimeUs = chargeTime; + CharSequence timeString = StringUtil.formatElapsedTime(context, + PowerUtil.convertUsToMs(info.remainingTimeUs), false /* withSeconds */); + int resId = R.string.power_charging_duration; + info.remainingLabel = context.getString( + R.string.power_remaining_charging_duration_only, timeString); + info.chargeLabel = context.getString(resId, info.batteryPercentString, timeString); + } else { + final String chargeStatusLabel = resources.getString( + R.string.battery_info_status_charging_lower); + info.remainingLabel = null; + info.chargeLabel = info.batteryLevel == 100 ? info.batteryPercentString : + resources.getString(R.string.power_charging, info.batteryPercentString, + chargeStatusLabel); + } + } + + private static void updateBatteryInfoDischarging(Context context, boolean shortString, + long drainTimeUs, boolean basedOnUsage, BatteryInfo info) { + if (drainTimeUs > 0) { + info.remainingTimeUs = drainTimeUs; + info.remainingLabel = PowerUtil.getBatteryRemainingStringFormatted( + context, + PowerUtil.convertUsToMs(drainTimeUs), + null /* percentageString */, + basedOnUsage && !shortString + ); + info.chargeLabel = PowerUtil.getBatteryRemainingStringFormatted( + context, + PowerUtil.convertUsToMs(drainTimeUs), + info.batteryPercentString, + basedOnUsage && !shortString + ); + } else { + info.remainingLabel = null; + info.chargeLabel = info.batteryPercentString; + } + } + public interface BatteryDataParser { void onParsingStarted(long startTime, long endTime); diff --git a/src/com/android/settings/fuelgauge/BatteryUtils.java b/src/com/android/settings/fuelgauge/BatteryUtils.java index 5738c290eb3..da9b7059908 100644 --- a/src/com/android/settings/fuelgauge/BatteryUtils.java +++ b/src/com/android/settings/fuelgauge/BatteryUtils.java @@ -43,6 +43,7 @@ import com.android.settings.R; import com.android.settings.fuelgauge.anomaly.Anomaly; import com.android.settings.overlay.FeatureFactory; +import com.android.settingslib.utils.PowerUtil; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.util.Collections; @@ -68,19 +69,18 @@ public class BatteryUtils { int BACKGROUND = 2; int ALL = 3; } - private static final String TAG = "BatteryUtils"; private static final int MIN_POWER_THRESHOLD_MILLI_AMP = 5; + private static final int SECONDS_IN_HOUR = 60 * 60; private static BatteryUtils sInstance; - private PackageManager mPackageManager; + private AppOpsManager mAppOpsManager; private Context mContext; @VisibleForTesting PowerUsageFeatureProvider mPowerUsageFeatureProvider; - public static BatteryUtils getInstance(Context context) { if (sInstance == null || sInstance.isDataCorrupted()) { sInstance = new BatteryUtils(context); @@ -131,29 +131,30 @@ public class BatteryUtils { // Return the min value of STATE_TOP time and foreground activity time, since both of these // time have some errors - return convertUsToMs( + return PowerUtil.convertUsToMs( Math.min(timeUs, getForegroundActivityTotalTimeUs(uid, rawRealTimeUs))); } private long getScreenUsageTimeMs(BatteryStats.Uid uid, int which) { - final long rawRealTimeUs = convertMsToUs(SystemClock.elapsedRealtime()); + final long rawRealTimeUs = PowerUtil.convertMsToUs(SystemClock.elapsedRealtime()); return getScreenUsageTimeMs(uid, which, rawRealTimeUs); } private long getProcessBackgroundTimeMs(BatteryStats.Uid uid, int which) { - final long rawRealTimeUs = convertMsToUs(SystemClock.elapsedRealtime()); + final long rawRealTimeUs = PowerUtil.convertMsToUs(SystemClock.elapsedRealtime()); final long timeUs = uid.getProcessStateTime( BatteryStats.Uid.PROCESS_STATE_BACKGROUND, rawRealTimeUs, which); Log.v(TAG, "package: " + mPackageManager.getNameForUid(uid.getUid())); Log.v(TAG, "background time(us): " + timeUs); - return convertUsToMs(timeUs); + return PowerUtil.convertUsToMs(timeUs); } private long getProcessForegroundTimeMs(BatteryStats.Uid uid, int which) { - final long rawRealTimeUs = convertMsToUs(SystemClock.elapsedRealtime()); + final long rawRealTimeUs = PowerUtil.convertMsToUs(SystemClock.elapsedRealtime()); return getScreenUsageTimeMs(uid, which, rawRealTimeUs) - + convertUsToMs(getForegroundServiceTotalTimeUs(uid, rawRealTimeUs)); + + PowerUtil.convertUsToMs( + getForegroundServiceTotalTimeUs(uid, rawRealTimeUs)); } /** @@ -267,9 +268,10 @@ public class BatteryUtils { */ public long calculateRunningTimeBasedOnStatsType(BatteryStatsHelper batteryStatsHelper, int statsType) { - final long elapsedRealtimeUs = convertMsToUs(SystemClock.elapsedRealtime()); + final long elapsedRealtimeUs = PowerUtil.convertMsToUs( + SystemClock.elapsedRealtime()); // Return the battery time (millisecond) on status mStatsType - return convertUsToMs( + return PowerUtil.convertUsToMs( batteryStatsHelper.getStats().computeBatteryRealtime(elapsedRealtimeUs, statsType)); } @@ -390,25 +392,15 @@ public class BatteryUtils { } } - public static long convertUsToMs(long timeUs) { - return timeUs / 1000; - } - - public static long convertMsToUs(long timeMs) { - return timeMs * 1000; - } - public void setForceAppStandby(int uid, String packageName, int mode) { final boolean isPreOApp = isLegacyApp(packageName); if (isPreOApp) { // Control whether app could run in the background if it is pre O app - mAppOpsManager.setMode(AppOpsManager.OP_RUN_IN_BACKGROUND, uid, packageName, - mode); + mAppOpsManager.setMode(AppOpsManager.OP_RUN_IN_BACKGROUND, uid, packageName, mode); } // Control whether app could run jobs in the background - mAppOpsManager.setMode(AppOpsManager.OP_RUN_ANY_IN_BACKGROUND, uid, packageName, - mode); + mAppOpsManager.setMode(AppOpsManager.OP_RUN_ANY_IN_BACKGROUND, uid, packageName, mode); } public void initBatteryStatsHelper(BatteryStatsHelper statsHelper, Bundle bundle, @@ -425,7 +417,8 @@ public class BatteryUtils { // Stuff we always need to get BatteryInfo final Intent batteryBroadcast = mContext.registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED)); - final long elapsedRealtimeUs = BatteryUtils.convertMsToUs(SystemClock.elapsedRealtime()); + final long elapsedRealtimeUs = PowerUtil.convertMsToUs( + SystemClock.elapsedRealtime()); BatteryInfo batteryInfo; // 0 means we are discharging, anything else means charging @@ -443,7 +436,7 @@ public class BatteryUtils { if (estimate != null) { batteryInfo = BatteryInfo.getBatteryInfo(mContext, batteryBroadcast, stats, elapsedRealtimeUs, false /* shortString */, - BatteryUtils.convertMsToUs(estimate.estimateMillis), + PowerUtil.convertMsToUs(estimate.estimateMillis), estimate.isBasedOnUsage); } else { batteryInfo = BatteryInfo.getBatteryInfo(mContext, batteryBroadcast, stats, diff --git a/src/com/android/settings/fuelgauge/DebugEstimatesLoader.java b/src/com/android/settings/fuelgauge/DebugEstimatesLoader.java index e58ccd339a0..509f96758d2 100644 --- a/src/com/android/settings/fuelgauge/DebugEstimatesLoader.java +++ b/src/com/android/settings/fuelgauge/DebugEstimatesLoader.java @@ -22,6 +22,7 @@ import android.os.BatteryStats; import android.os.SystemClock; import com.android.internal.os.BatteryStatsHelper; import com.android.settings.overlay.FeatureFactory; +import com.android.settingslib.utils.PowerUtil; import com.android.settingslib.utils.AsyncLoader; import java.util.ArrayList; import java.util.List; @@ -46,7 +47,8 @@ public class DebugEstimatesLoader extends AsyncLoader> { FeatureFactory.getFactory(context).getPowerUsageFeatureProvider(context); // get stuff we'll need for both BatteryInfo - final long elapsedRealtimeUs = BatteryUtils.convertMsToUs(SystemClock.elapsedRealtime()); + final long elapsedRealtimeUs = PowerUtil.convertMsToUs( + SystemClock.elapsedRealtime()); Intent batteryBroadcast = getContext().registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED)); BatteryStats stats = mStatsHelper.getStats(); @@ -60,7 +62,7 @@ public class DebugEstimatesLoader extends AsyncLoader> { } BatteryInfo newInfo = BatteryInfo.getBatteryInfo(getContext(), batteryBroadcast, stats, elapsedRealtimeUs, false, - BatteryUtils.convertMsToUs(estimate.estimateMillis), + PowerUtil.convertMsToUs(estimate.estimateMillis), estimate.isBasedOnUsage); List infos = new ArrayList<>(); diff --git a/src/com/android/settings/fuelgauge/PowerUsageAdvanced.java b/src/com/android/settings/fuelgauge/PowerUsageAdvanced.java index 6ed92a7cb42..25351d33db5 100644 --- a/src/com/android/settings/fuelgauge/PowerUsageAdvanced.java +++ b/src/com/android/settings/fuelgauge/PowerUsageAdvanced.java @@ -47,6 +47,7 @@ import com.android.settings.overlay.FeatureFactory; import com.android.settings.search.BaseSearchIndexProvider; import com.android.settingslib.core.AbstractPreferenceController; +import com.android.settingslib.utils.StringUtil; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.util.ArrayList; @@ -318,7 +319,7 @@ public class PowerUsageAdvanced extends PowerUsageBase { return; } if (usageData.usageList.size() <= 1) { - CharSequence timeSequence = Utils.formatElapsedTime(getContext(), + CharSequence timeSequence = StringUtil.formatElapsedTime(getContext(), usageData.totalUsageTimeMs, false); usageData.summary = usageData.usageType == UsageType.IDLE ? timeSequence : TextUtils.expandTemplate(getText(R.string.battery_used_for), timeSequence); diff --git a/src/com/android/settings/fuelgauge/PowerUsageSummary.java b/src/com/android/settings/fuelgauge/PowerUsageSummary.java index 74dc986b574..3583b142b69 100644 --- a/src/com/android/settings/fuelgauge/PowerUsageSummary.java +++ b/src/com/android/settings/fuelgauge/PowerUsageSummary.java @@ -37,10 +37,7 @@ import android.view.View.OnClickListener; import android.view.View.OnLongClickListener; import android.widget.TextView; -import com.android.internal.hardware.AmbientDisplayConfiguration; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; -import com.android.internal.os.BatterySipper; -import com.android.internal.os.BatterySipper.DrainType; import com.android.settings.R; import com.android.settings.Settings.HighPowerApplicationsActivity; import com.android.settings.SettingsActivity; @@ -48,10 +45,7 @@ import com.android.settings.Utils; import com.android.settings.applications.LayoutPreference; import com.android.settings.applications.manageapplications.ManageApplications; import com.android.settings.dashboard.SummaryLoader; -import com.android.settings.display.AmbientDisplayPreferenceController; -import com.android.settings.display.AutoBrightnessPreferenceController; import com.android.settings.display.BatteryPercentagePreferenceController; -import com.android.settings.display.TimeoutPreferenceController; import com.android.settings.fuelgauge.anomaly.Anomaly; import com.android.settings.fuelgauge.anomaly.AnomalyDetectionPolicy; import com.android.settings.fuelgauge.batterytip.BatteryTipLoader; @@ -63,6 +57,8 @@ import com.android.settingslib.core.AbstractPreferenceController; import com.android.settingslib.core.instrumentation.MetricsFeatureProvider; import com.android.settingslib.core.lifecycle.Lifecycle; +import com.android.settingslib.utils.PowerUtil; +import com.android.settingslib.utils.StringUtil; import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -164,12 +160,12 @@ public class PowerUsageSummary extends PowerUsageBase implements OnLongClickList // be unplugged for a period of time before being willing ot make an estimate. summary1.setText(mPowerFeatureProvider.getOldEstimateDebugString( Formatter.formatShortElapsedTime(getContext(), - BatteryUtils.convertUsToMs(oldInfo.remainingTimeUs)))); + PowerUtil.convertUsToMs(oldInfo.remainingTimeUs)))); // for this one we can just set the string directly summary2.setText(mPowerFeatureProvider.getEnhancedEstimateDebugString( Formatter.formatShortElapsedTime(getContext(), - BatteryUtils.convertUsToMs(newInfo.remainingTimeUs)))); + PowerUtil.convertUsToMs(newInfo.remainingTimeUs)))); batteryView.setBatteryLevel(oldInfo.batteryLevel); batteryView.setCharging(!oldInfo.discharging); @@ -314,10 +310,10 @@ public class PowerUsageSummary extends PowerUsageBase implements OnLongClickList final long lastFullChargeTime = mBatteryUtils.calculateLastFullChargeTime(mStatsHelper, System.currentTimeMillis()); updateLastFullChargePreference(lastFullChargeTime); - mScreenUsagePref.setSubtitle(Utils.formatElapsedTime(getContext(), + mScreenUsagePref.setSubtitle(StringUtil.formatElapsedTime(getContext(), mBatteryUtils.calculateScreenUsageTime(mStatsHelper), false)); - final CharSequence timeSequence = Utils.formatRelativeTime(context, lastFullChargeTime, + final CharSequence timeSequence = StringUtil.formatRelativeTime(context, lastFullChargeTime, false); mBatteryAppListPreferenceController.refreshAppListGroup(mStatsHelper, false /* showAllApps */, timeSequence); @@ -340,7 +336,7 @@ public class PowerUsageSummary extends PowerUsageBase implements OnLongClickList @VisibleForTesting void updateLastFullChargePreference(long timeMs) { - final CharSequence timeSequence = Utils.formatRelativeTime(getContext(), timeMs, false); + final CharSequence timeSequence = StringUtil.formatRelativeTime(getContext(), timeMs, false); mLastFullChargePref.setSubtitle(timeSequence); } diff --git a/src/com/android/settings/fuelgauge/PowerUsageSummaryLegacy.java b/src/com/android/settings/fuelgauge/PowerUsageSummaryLegacy.java index 605591dda15..e6c49237218 100644 --- a/src/com/android/settings/fuelgauge/PowerUsageSummaryLegacy.java +++ b/src/com/android/settings/fuelgauge/PowerUsageSummaryLegacy.java @@ -69,6 +69,8 @@ import com.android.settings.overlay.FeatureFactory; import com.android.settingslib.core.instrumentation.MetricsFeatureProvider; import com.android.settingslib.core.AbstractPreferenceController; +import com.android.settingslib.utils.PowerUtil; +import com.android.settingslib.utils.StringUtil; import java.util.ArrayList; import java.util.List; @@ -210,12 +212,12 @@ public class PowerUsageSummaryLegacy extends PowerUsageBase implements // be unplugged for a period of time before being willing ot make an estimate. summary1.setText(mPowerFeatureProvider.getOldEstimateDebugString( Formatter.formatShortElapsedTime(getContext(), - BatteryUtils.convertUsToMs(oldInfo.remainingTimeUs)))); + PowerUtil.convertUsToMs(oldInfo.remainingTimeUs)))); // for this one we can just set the string directly summary2.setText(mPowerFeatureProvider.getEnhancedEstimateDebugString( Formatter.formatShortElapsedTime(getContext(), - BatteryUtils.convertUsToMs(newInfo.remainingTimeUs)))); + PowerUtil.convertUsToMs(newInfo.remainingTimeUs)))); batteryView.setBatteryLevel(oldInfo.batteryLevel); batteryView.setCharging(!oldInfo.discharging); @@ -524,7 +526,7 @@ public class PowerUsageSummaryLegacy extends PowerUsageBase implements updateScreenPreference(); updateLastFullChargePreference(lastFullChargeTime); - final CharSequence timeSequence = Utils.formatRelativeTime(context, lastFullChargeTime, + final CharSequence timeSequence = StringUtil.formatRelativeTime(context, lastFullChargeTime, false); final int resId = mShowAllApps ? R.string.power_usage_list_summary_device : R.string.power_usage_list_summary; @@ -653,12 +655,13 @@ public class PowerUsageSummaryLegacy extends PowerUsageBase implements mStatsHelper.getUsageList(), DrainType.SCREEN); final long usageTimeMs = sipper != null ? sipper.usageTimeMs : 0; - mScreenUsagePref.setSubtitle(Utils.formatElapsedTime(getContext(), usageTimeMs, false)); + mScreenUsagePref.setSubtitle( + StringUtil.formatElapsedTime(getContext(), usageTimeMs, false)); } @VisibleForTesting void updateLastFullChargePreference(long timeMs) { - final CharSequence timeSequence = Utils.formatRelativeTime(getContext(), timeMs, false); + final CharSequence timeSequence = StringUtil.formatRelativeTime(getContext(), timeMs, false); mLastFullChargePref.setSubtitle(timeSequence); } @@ -685,8 +688,8 @@ public class PowerUsageSummaryLegacy extends PowerUsageBase implements // Only show summary when usage time is longer than one minute final long usageTimeMs = sipper.usageTimeMs; if (usageTimeMs >= DateUtils.MINUTE_IN_MILLIS) { - final CharSequence timeSequence = Utils.formatElapsedTime(getContext(), usageTimeMs, - false); + final CharSequence timeSequence = + StringUtil.formatElapsedTime(getContext(), usageTimeMs, false); preference.setSummary( (sipper.drainType != DrainType.APP || mBatteryUtils.shouldHideSipper(sipper)) ? timeSequence diff --git a/src/com/android/settings/fuelgauge/batterytip/BatteryTipDialogFragment.java b/src/com/android/settings/fuelgauge/batterytip/BatteryTipDialogFragment.java index 66ce3caad01..d93b58909d4 100644 --- a/src/com/android/settings/fuelgauge/batterytip/BatteryTipDialogFragment.java +++ b/src/com/android/settings/fuelgauge/batterytip/BatteryTipDialogFragment.java @@ -36,6 +36,7 @@ import com.android.settings.fuelgauge.batterytip.tips.BatteryTip; import com.android.settings.fuelgauge.batterytip.tips.HighUsageTip; import com.android.settings.fuelgauge.batterytip.tips.RestrictAppTip; import com.android.settings.fuelgauge.batterytip.tips.UnrestrictAppTip; +import com.android.settingslib.utils.StringUtil; import java.util.List; @@ -83,7 +84,8 @@ public class BatteryTipDialogFragment extends InstrumentedDialogFragment impleme return new AlertDialog.Builder(context) .setMessage(getString(R.string.battery_tip_dialog_message, - Utils.formatElapsedTime(context, highUsageTip.getScreenTimeMs(), + StringUtil.formatElapsedTime( + context, highUsageTip.getScreenTimeMs(), false /* withSeconds */))) .setView(view) .setPositiveButton(android.R.string.ok, null) diff --git a/src/com/android/settings/fuelgauge/batterytip/HighUsageAdapter.java b/src/com/android/settings/fuelgauge/batterytip/HighUsageAdapter.java index 6c129d8a9be..d982280a4eb 100644 --- a/src/com/android/settings/fuelgauge/batterytip/HighUsageAdapter.java +++ b/src/com/android/settings/fuelgauge/batterytip/HighUsageAdapter.java @@ -30,6 +30,7 @@ import android.widget.TextView; import com.android.settings.R; import com.android.settings.Utils; +import com.android.settingslib.utils.StringUtil; import java.util.List; /** @@ -78,7 +79,7 @@ public class HighUsageAdapter extends RecyclerView.Adapter