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