Merge "[Battery usage U] [UI] Show screen time in the battery detail usage page"

This commit is contained in:
Zaiyue Xue
2023-01-12 09:18:25 +00:00
committed by Android (Google) Code Review
5 changed files with 364 additions and 295 deletions

View File

@@ -26,7 +26,6 @@ import android.content.pm.PackageManager;
import android.os.Bundle;
import android.os.UserHandle;
import android.text.TextUtils;
import android.text.format.DateUtils;
import android.util.Log;
import android.view.View;
@@ -51,7 +50,6 @@ import com.android.settingslib.applications.AppUtils;
import com.android.settingslib.applications.ApplicationsState;
import com.android.settingslib.core.AbstractPreferenceController;
import com.android.settingslib.core.instrumentation.Instrumentable;
import com.android.settingslib.utils.StringUtil;
import com.android.settingslib.widget.FooterPreference;
import com.android.settingslib.widget.LayoutPreference;
import com.android.settingslib.widget.SelectorWithWidgetPreference;
@@ -74,6 +72,7 @@ public class AdvancedPowerUsageDetail extends DashboardFragment implements
public static final String EXTRA_PACKAGE_NAME = "extra_package_name";
public static final String EXTRA_FOREGROUND_TIME = "extra_foreground_time";
public static final String EXTRA_BACKGROUND_TIME = "extra_background_time";
public static final String EXTRA_SCREEN_ON_TIME = "extra_screen_on_time";
public static final String EXTRA_SLOT_TIME = "extra_slot_time";
public static final String EXTRA_LABEL = "extra_label";
public static final String EXTRA_ICON_ID = "extra_icon_id";
@@ -87,6 +86,8 @@ public class AdvancedPowerUsageDetail extends DashboardFragment implements
private static final String KEY_FOOTER_PREFERENCE = "app_usage_footer_preference";
private static final String PACKAGE_NAME_NONE = "none";
private static final String HEADER_SUMMARY_FORMAT = "%s\n(%s)";
private static final int REQUEST_UNINSTALL = 0;
private static final int REQUEST_REMOVE_DEVICE_ADMIN = 1;
@@ -129,6 +130,7 @@ public class AdvancedPowerUsageDetail extends DashboardFragment implements
private int mConsumedPower;
private long mForegroundTimeMs;
private long mBackgroundTimeMs;
private long mScreenOnTimeMs;
private boolean mIsUserEntry;
}
@@ -156,6 +158,7 @@ public class AdvancedPowerUsageDetail extends DashboardFragment implements
launchArgs.mConsumedPower = (int) diffEntry.mConsumePower;
launchArgs.mForegroundTimeMs = diffEntry.mForegroundUsageTimeInMs;
launchArgs.mBackgroundTimeMs = diffEntry.mBackgroundUsageTimeInMs;
launchArgs.mScreenOnTimeMs = diffEntry.mScreenOnTimeInMs;
launchArgs.mIsUserEntry = histEntry.isUserEntry();
startBatteryDetailPage(context, sourceMetricsCategory, launchArgs);
}
@@ -191,6 +194,7 @@ public class AdvancedPowerUsageDetail extends DashboardFragment implements
args.putInt(EXTRA_UID, launchArgs.mUid);
args.putLong(EXTRA_BACKGROUND_TIME, launchArgs.mBackgroundTimeMs);
args.putLong(EXTRA_FOREGROUND_TIME, launchArgs.mForegroundTimeMs);
args.putLong(EXTRA_SCREEN_ON_TIME, launchArgs.mScreenOnTimeMs);
args.putString(EXTRA_SLOT_TIME, launchArgs.mSlotInformation);
args.putString(EXTRA_POWER_USAGE_PERCENT, launchArgs.mUsagePercent);
args.putInt(EXTRA_POWER_USAGE_AMOUNT, launchArgs.mConsumedPower);
@@ -323,7 +327,7 @@ public class AdvancedPowerUsageDetail extends DashboardFragment implements
controller.setIsInstantApp(AppUtils.isInstant(mAppEntry.info));
}
controller.setSummary(getAppActiveTime(bundle));
controller.setSummary(getHeaderSummary(bundle));
controller.done(context, true /* rebindActions */);
}
@@ -474,113 +478,20 @@ public class AdvancedPowerUsageDetail extends DashboardFragment implements
}
}
private CharSequence getAppActiveTime(Bundle bundle) {
private CharSequence getHeaderSummary(Bundle bundle) {
final long foregroundTimeMs = bundle.getLong(EXTRA_FOREGROUND_TIME);
final long backgroundTimeMs = bundle.getLong(EXTRA_BACKGROUND_TIME);
final long screenOnTimeInMs = bundle.getLong(EXTRA_SCREEN_ON_TIME);
final String slotTime = bundle.getString(EXTRA_SLOT_TIME, null);
final long totalTimeMs = foregroundTimeMs + backgroundTimeMs;
final CharSequence usageTimeSummary;
final String usageSummary = BatteryUtils.buildBatteryUsageTimeSummary(getContext(),
/* isSystem= */ false, foregroundTimeMs, backgroundTimeMs, screenOnTimeInMs);
if (totalTimeMs == 0) {
usageTimeSummary = getText(R.string.battery_usage_without_time);
} else if (slotTime == null) {
// Shows summary text with last full charge if slot time is null.
usageTimeSummary = getAppFullChargeActiveSummary(
foregroundTimeMs, backgroundTimeMs, totalTimeMs);
if (usageSummary.isEmpty()) {
return getText(R.string.battery_usage_without_time);
} else {
// Shows summary text with slot time.
usageTimeSummary = getAppActiveSummaryWithSlotTime(
foregroundTimeMs, backgroundTimeMs, totalTimeMs, slotTime);
}
return usageTimeSummary;
}
private CharSequence getAppFullChargeActiveSummary(
long foregroundTimeMs, long backgroundTimeMs, long totalTimeMs) {
// Shows background summary only if we don't have foreground usage time.
if (foregroundTimeMs == 0 && backgroundTimeMs != 0) {
return backgroundTimeMs < DateUtils.MINUTE_IN_MILLIS ?
getText(R.string.battery_bg_usage_less_minute) :
TextUtils.expandTemplate(getText(R.string.battery_bg_usage),
StringUtil.formatElapsedTime(
getContext(),
backgroundTimeMs,
/* withSeconds */ false,
/* collapseTimeUnit */ false));
// Shows total usage summary only if total usage time is small.
} else if (totalTimeMs < DateUtils.MINUTE_IN_MILLIS) {
return getText(R.string.battery_total_usage_less_minute);
// Shows different total usage summary when background usage time is small.
} else if (backgroundTimeMs < DateUtils.MINUTE_IN_MILLIS) {
return TextUtils.expandTemplate(
getText(backgroundTimeMs == 0 ?
R.string.battery_total_usage :
R.string.battery_total_usage_and_bg_less_minute_usage),
StringUtil.formatElapsedTime(
getContext(),
totalTimeMs,
/* withSeconds */ false,
/* collapseTimeUnit */ false));
// Shows default summary.
} else {
return TextUtils.expandTemplate(
getText(R.string.battery_total_and_bg_usage),
StringUtil.formatElapsedTime(
getContext(),
totalTimeMs,
/* withSeconds */ false,
/* collapseTimeUnit */ false),
StringUtil.formatElapsedTime(
getContext(),
backgroundTimeMs,
/* withSeconds */ false,
/* collapseTimeUnit */ false));
}
}
private CharSequence getAppActiveSummaryWithSlotTime(
long foregroundTimeMs, long backgroundTimeMs, long totalTimeMs, String slotTime) {
// Shows background summary only if we don't have foreground usage time.
if (foregroundTimeMs == 0 && backgroundTimeMs != 0) {
return backgroundTimeMs < DateUtils.MINUTE_IN_MILLIS ?
TextUtils.expandTemplate(
getText(R.string.battery_bg_usage_less_minute_with_period),
slotTime) :
TextUtils.expandTemplate(getText(R.string.battery_bg_usage_with_period),
StringUtil.formatElapsedTime(
getContext(),
backgroundTimeMs,
/* withSeconds */ false,
/* collapseTimeUnit */ false), slotTime);
// Shows total usage summary only if total usage time is small.
} else if (totalTimeMs < DateUtils.MINUTE_IN_MILLIS) {
return TextUtils.expandTemplate(
getText(R.string.battery_total_usage_less_minute_with_period), slotTime);
// Shows different total usage summary when background usage time is small.
} else if (backgroundTimeMs < DateUtils.MINUTE_IN_MILLIS) {
return TextUtils.expandTemplate(
getText(backgroundTimeMs == 0 ?
R.string.battery_total_usage_with_period :
R.string.battery_total_usage_and_bg_less_minute_usage_with_period),
StringUtil.formatElapsedTime(
getContext(),
totalTimeMs,
/* withSeconds */ false,
/* collapseTimeUnit */ false), slotTime);
// Shows default summary.
} else {
return TextUtils.expandTemplate(
getText(R.string.battery_total_and_bg_usage_with_period),
StringUtil.formatElapsedTime(
getContext(),
totalTimeMs,
/* withSeconds */ false,
/* collapseTimeUnit */ false),
StringUtil.formatElapsedTime(
getContext(),
backgroundTimeMs,
/* withSeconds */ false,
/* collapseTimeUnit */ false), slotTime);
CharSequence slotSummary = slotTime == null
? getText(R.string.battery_usage_since_last_full_charge) : slotTime;
return String.format("%s\n(%s)", usageSummary, slotSummary);
}
}
}

View File

@@ -34,6 +34,7 @@ import android.os.SystemClock;
import android.os.UidBatteryConsumer;
import android.os.UserHandle;
import android.provider.Settings;
import android.text.format.DateUtils;
import android.util.Base64;
import android.util.Log;
@@ -43,6 +44,7 @@ import androidx.annotation.VisibleForTesting;
import androidx.annotation.WorkerThread;
import com.android.internal.util.ArrayUtils;
import com.android.settings.R;
import com.android.settings.fuelgauge.batterytip.AnomalyDatabaseHelper;
import com.android.settings.fuelgauge.batterytip.AnomalyInfo;
import com.android.settings.fuelgauge.batterytip.BatteryDatabaseManager;
@@ -53,6 +55,7 @@ import com.android.settingslib.fuelgauge.Estimate;
import com.android.settingslib.fuelgauge.EstimateKt;
import com.android.settingslib.fuelgauge.PowerAllowlistBackend;
import com.android.settingslib.utils.PowerUtil;
import com.android.settingslib.utils.StringUtil;
import com.android.settingslib.utils.ThreadUtils;
import com.google.protobuf.InvalidProtocolBufferException;
@@ -616,4 +619,45 @@ public class BatteryUtils {
}
return DockDefenderMode.DISABLED;
}
/** Builds the battery usage time summary. */
public static String buildBatteryUsageTimeSummary(final Context context, final boolean isSystem,
final long foregroundUsageTimeInMs, final long backgroundUsageTimeInMs,
final long screenOnTimeInMs) {
StringBuilder summary = new StringBuilder();
if (isSystem) {
final long totalUsageTimeInMs = foregroundUsageTimeInMs + backgroundUsageTimeInMs;
if (totalUsageTimeInMs != 0) {
summary.append(buildBatteryUsageTimeInfo(context, totalUsageTimeInMs,
R.string.battery_usage_total_less_than_one_minute,
R.string.battery_usage_for_total_time));
}
} else {
if (screenOnTimeInMs != 0) {
summary.append(buildBatteryUsageTimeInfo(context, screenOnTimeInMs,
R.string.battery_usage_screen_time_less_than_one_minute,
R.string.battery_usage_screen_time));
}
if (screenOnTimeInMs != 0 && backgroundUsageTimeInMs != 0) {
summary.append('\n');
}
if (backgroundUsageTimeInMs != 0) {
summary.append(buildBatteryUsageTimeInfo(context, backgroundUsageTimeInMs,
R.string.battery_usage_background_less_than_one_minute,
R.string.battery_usage_for_background_time));
}
}
return summary.toString();
}
/** Builds the battery usage time information for one timestamp. */
private static String buildBatteryUsageTimeInfo(final Context context, long timeInMs,
final int lessThanOneMinuteResId, final int normalResId) {
if (timeInMs < DateUtils.MINUTE_IN_MILLIS) {
return context.getString(lessThanOneMinuteResId);
}
final CharSequence timeSequence = StringUtil.formatElapsedTime(
context, (double) timeInMs, /*withSeconds=*/ false, /*collapseTimeUnit=*/ false);
return context.getString(normalResId, timeSequence);
}
}

View File

@@ -22,7 +22,6 @@ import android.graphics.drawable.Drawable;
import android.os.Handler;
import android.os.Looper;
import android.text.TextUtils;
import android.text.format.DateUtils;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
@@ -38,12 +37,12 @@ import com.android.settings.SettingsActivity;
import com.android.settings.core.BasePreferenceController;
import com.android.settings.core.InstrumentedPreferenceFragment;
import com.android.settings.fuelgauge.AdvancedPowerUsageDetail;
import com.android.settings.fuelgauge.BatteryUtils;
import com.android.settings.overlay.FeatureFactory;
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.utils.StringUtil;
import com.android.settingslib.widget.FooterPreference;
import java.util.HashMap;
@@ -296,43 +295,9 @@ public class BatteryUsageBreakdownController extends BasePreferenceController
@VisibleForTesting
void setPreferenceSummary(
PowerGaugePreference preference, BatteryDiffEntry entry) {
final long screenOnTimeInMs = entry.mScreenOnTimeInMs;
final long foregroundUsageTimeInMs = entry.mForegroundUsageTimeInMs;
final long backgroundUsageTimeInMs = entry.mBackgroundUsageTimeInMs;
final long totalUsageTimeInMs = foregroundUsageTimeInMs + backgroundUsageTimeInMs;
StringBuilder usageTimeSummary = new StringBuilder();
if (entry.isSystemEntry()) {
if (totalUsageTimeInMs != 0) {
usageTimeSummary.append(buildUsageTimeInfo(totalUsageTimeInMs,
R.string.battery_usage_total_less_than_one_minute,
R.string.battery_usage_for_total_time));
}
} else {
if (screenOnTimeInMs != 0) {
usageTimeSummary.append(buildUsageTimeInfo(screenOnTimeInMs,
R.string.battery_usage_screen_time_less_than_one_minute,
R.string.battery_usage_screen_time));
}
if (screenOnTimeInMs != 0 && backgroundUsageTimeInMs != 0) {
usageTimeSummary.append('\n');
}
if (backgroundUsageTimeInMs != 0) {
usageTimeSummary.append(buildUsageTimeInfo(backgroundUsageTimeInMs,
R.string.battery_usage_background_less_than_one_minute,
R.string.battery_usage_for_background_time));
}
}
preference.setSummary(usageTimeSummary);
}
private String buildUsageTimeInfo(long timeInMs, int lessThanOneMinuteResId, int normalResId) {
if (timeInMs < DateUtils.MINUTE_IN_MILLIS) {
return mPrefContext.getString(lessThanOneMinuteResId);
}
final CharSequence timeSequence =
StringUtil.formatElapsedTime(mPrefContext, (double) timeInMs,
/*withSeconds=*/ false, /*collapseTimeUnit=*/ false);
return mPrefContext.getString(normalResId, timeSequence);
preference.setSummary(
BatteryUtils.buildBatteryUsageTimeSummary(mPrefContext, entry.isSystemEntry(),
entry.mForegroundUsageTimeInMs, entry.mBackgroundUsageTimeInMs,
entry.mScreenOnTimeInMs));
}
}