Merge "Fix BluetoothUpdateWorkerTest." into main
diff --git a/src/com/android/settings/development/BackAnimationPreferenceController.java b/src/com/android/settings/development/BackAnimationPreferenceController.java
index aa4faf5..95ffc25 100644
--- a/src/com/android/settings/development/BackAnimationPreferenceController.java
+++ b/src/com/android/settings/development/BackAnimationPreferenceController.java
@@ -16,6 +16,8 @@
package com.android.settings.development;
+import static com.android.window.flags.Flags.predictiveBackSystemAnimations;
+
import android.content.Context;
import android.provider.Settings;
@@ -56,6 +58,11 @@
}
@Override
+ public boolean isAvailable() {
+ return !predictiveBackSystemAnimations();
+ }
+
+ @Override
public String getPreferenceKey() {
return BACK_NAVIGATION_ANIMATION_KEY;
}
diff --git a/src/com/android/settings/development/GrammaticalGenderPreferenceController.java b/src/com/android/settings/development/GrammaticalGenderPreferenceController.java
index 7b8ec65..0540974 100644
--- a/src/com/android/settings/development/GrammaticalGenderPreferenceController.java
+++ b/src/com/android/settings/development/GrammaticalGenderPreferenceController.java
@@ -95,4 +95,9 @@
listPreference.setValue(mListValues[index]);
listPreference.setSummary(mListSummaries[index]);
}
+
+ @Override
+ public boolean isAvailable() {
+ return android.app.Flags.systemTermsOfAddressEnabled();
+ }
}
diff --git a/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java b/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java
index 86ef3cf..23680d9 100644
--- a/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java
+++ b/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java
@@ -148,7 +148,8 @@
launchArgs.mShowTimeInformation = showTimeInformation;
if (launchArgs.mShowTimeInformation) {
launchArgs.mForegroundTimeMs = diffEntry.mForegroundUsageTimeInMs;
- launchArgs.mBackgroundTimeMs = diffEntry.mBackgroundUsageTimeInMs;
+ launchArgs.mBackgroundTimeMs =
+ diffEntry.mBackgroundUsageTimeInMs + diffEntry.mForegroundServiceUsageTimeInMs;
launchArgs.mScreenOnTimeMs = diffEntry.mScreenOnTimeInMs;
launchArgs.mAnomalyHintPrefKey = anomalyHintPrefKey;
launchArgs.mAnomalyHintText = anomalyHintText;
diff --git a/src/com/android/settings/fuelgauge/batteryusage/BatteryDiffEntry.java b/src/com/android/settings/fuelgauge/batteryusage/BatteryDiffEntry.java
index bad1b76..2c376e5 100644
--- a/src/com/android/settings/fuelgauge/batteryusage/BatteryDiffEntry.java
+++ b/src/com/android/settings/fuelgauge/batteryusage/BatteryDiffEntry.java
@@ -92,6 +92,7 @@
public String mLegacyLabel;
public int mConsumerType;
public long mForegroundUsageTimeInMs;
+ public long mForegroundServiceUsageTimeInMs;
public long mBackgroundUsageTimeInMs;
public long mScreenOnTimeInMs;
public double mConsumePower;
@@ -125,6 +126,7 @@
String legacyLabel,
int consumerType,
long foregroundUsageTimeInMs,
+ long foregroundServiceUsageTimeInMs,
long backgroundUsageTimeInMs,
long screenOnTimeInMs,
double consumePower,
@@ -142,6 +144,7 @@
mLegacyLabel = legacyLabel;
mConsumerType = consumerType;
mForegroundUsageTimeInMs = foregroundUsageTimeInMs;
+ mForegroundServiceUsageTimeInMs = foregroundServiceUsageTimeInMs;
mBackgroundUsageTimeInMs = backgroundUsageTimeInMs;
mScreenOnTimeInMs = screenOnTimeInMs;
mConsumePower = consumePower;
@@ -164,6 +167,7 @@
legacyLabel,
consumerType,
/* foregroundUsageTimeInMs= */ 0,
+ /* foregroundServiceUsageTimeInMs= */ 0,
/* backgroundUsageTimeInMs= */ 0,
/* screenOnTimeInMs= */ 0,
/* consumePower= */ 0,
@@ -232,6 +236,7 @@
this.mLegacyLabel,
this.mConsumerType,
this.mForegroundUsageTimeInMs,
+ this.mForegroundServiceUsageTimeInMs,
this.mBackgroundUsageTimeInMs,
this.mScreenOnTimeInMs,
this.mConsumePower,
@@ -515,48 +520,50 @@
@Override
public String toString() {
- final StringBuilder builder =
- new StringBuilder()
- .append("BatteryDiffEntry{")
- .append(
- String.format(
- "\n\tname=%s restrictable=%b",
- mAppLabel, mValidForRestriction))
- .append(
- String.format(
- "\n\tconsume=%.2f%% %f/%f",
- mPercentage, mConsumePower, mTotalConsumePower))
- .append(
- String.format(
- "\n\tconsume power= foreground:%f foregroundService:%f",
- mForegroundUsageConsumePower,
- mForegroundServiceUsageConsumePower))
- .append(
- String.format(
- "\n\tconsume power= background:%f cached:%f",
- mBackgroundUsageConsumePower, mCachedUsageConsumePower))
- .append(
- String.format(
- "\n\ttime= foreground:%s background:%s screen-on:%s",
- StringUtil.formatElapsedTime(
- mContext,
- (double) mForegroundUsageTimeInMs,
- /* withSeconds= */ true,
- /* collapseTimeUnit= */ false),
- StringUtil.formatElapsedTime(
- mContext,
- (double) mBackgroundUsageTimeInMs,
- /* withSeconds= */ true,
- /* collapseTimeUnit= */ false),
- StringUtil.formatElapsedTime(
- mContext,
- (double) mScreenOnTimeInMs,
- /* withSeconds= */ true,
- /* collapseTimeUnit= */ false)))
- .append(
- String.format(
- "\n\tpackage:%s|%s uid:%d userId:%d",
- mLegacyPackageName, getPackageName(), mUid, mUserId));
+ final StringBuilder builder = new StringBuilder();
+ builder.append("BatteryDiffEntry{");
+ builder.append(
+ String.format("\n\tname=%s restrictable=%b", mAppLabel, mValidForRestriction));
+ builder.append(
+ String.format(
+ "\n\tconsume=%.2f%% %f/%f",
+ mPercentage, mConsumePower, mTotalConsumePower));
+ builder.append(
+ String.format(
+ "\n\tconsume power= foreground:%f foregroundService:%f",
+ mForegroundUsageConsumePower, mForegroundServiceUsageConsumePower));
+ builder.append(
+ String.format(
+ "\n\tconsume power= background:%f cached:%f",
+ mBackgroundUsageConsumePower, mCachedUsageConsumePower));
+ builder.append(
+ String.format(
+ "\n\ttime= foreground:%s foregroundService:%s "
+ + "background:%s screen-on:%s",
+ StringUtil.formatElapsedTime(
+ mContext,
+ (double) mForegroundUsageTimeInMs,
+ /* withSeconds= */ true,
+ /* collapseTimeUnit= */ false),
+ StringUtil.formatElapsedTime(
+ mContext,
+ (double) mForegroundServiceUsageTimeInMs,
+ /* withSeconds= */ true,
+ /* collapseTimeUnit= */ false),
+ StringUtil.formatElapsedTime(
+ mContext,
+ (double) mBackgroundUsageTimeInMs,
+ /* withSeconds= */ true,
+ /* collapseTimeUnit= */ false),
+ StringUtil.formatElapsedTime(
+ mContext,
+ (double) mScreenOnTimeInMs,
+ /* withSeconds= */ true,
+ /* collapseTimeUnit= */ false)));
+ builder.append(
+ String.format(
+ "\n\tpackage:%s|%s uid:%d userId:%d",
+ mLegacyPackageName, getPackageName(), mUid, mUserId));
return builder.toString();
}
diff --git a/src/com/android/settings/fuelgauge/batteryusage/BatteryEntry.java b/src/com/android/settings/fuelgauge/batteryusage/BatteryEntry.java
index 751e7ad..4b65cc9 100644
--- a/src/com/android/settings/fuelgauge/batteryusage/BatteryEntry.java
+++ b/src/com/android/settings/fuelgauge/batteryusage/BatteryEntry.java
@@ -111,6 +111,7 @@
@BatteryConsumer.PowerComponent private final int mPowerComponentId;
private long mUsageDurationMs;
private long mTimeInForegroundMs;
+ private long mTimeInForegroundServiceMs;
private long mTimeInBackgroundMs;
public String mName;
@@ -188,9 +189,14 @@
}
}
mTimeInForegroundMs =
- uidBatteryConsumer.getTimeInStateMs(UidBatteryConsumer.STATE_FOREGROUND);
+ uidBatteryConsumer.getTimeInProcessStateMs(
+ UidBatteryConsumer.PROCESS_STATE_FOREGROUND);
+ mTimeInForegroundServiceMs =
+ uidBatteryConsumer.getTimeInProcessStateMs(
+ UidBatteryConsumer.PROCESS_STATE_FOREGROUND_SERVICE);
mTimeInBackgroundMs =
- uidBatteryConsumer.getTimeInStateMs(UidBatteryConsumer.STATE_BACKGROUND);
+ uidBatteryConsumer.getTimeInProcessStateMs(
+ UidBatteryConsumer.PROCESS_STATE_BACKGROUND);
mConsumedPowerInForeground =
safeGetConsumedPower(
uidBatteryConsumer, BATTERY_DIMENSIONS[BATTERY_USAGE_INDEX_FOREGROUND]);
@@ -433,20 +439,19 @@
/** Returns foreground time/ms that is attributed to this entry. */
public long getTimeInForegroundMs() {
- if (mBatteryConsumer instanceof UidBatteryConsumer) {
- return mTimeInForegroundMs;
- } else {
- return mUsageDurationMs;
- }
+ return (mBatteryConsumer instanceof UidBatteryConsumer)
+ ? mTimeInForegroundMs
+ : mUsageDurationMs;
+ }
+
+ /** Returns foreground service time/ms that is attributed to this entry. */
+ public long getTimeInForegroundServiceMs() {
+ return (mBatteryConsumer instanceof UidBatteryConsumer) ? mTimeInForegroundServiceMs : 0;
}
/** Returns background activity time/ms that is attributed to this entry. */
public long getTimeInBackgroundMs() {
- if (mBatteryConsumer instanceof UidBatteryConsumer) {
- return mTimeInBackgroundMs;
- } else {
- return 0;
- }
+ return (mBatteryConsumer instanceof UidBatteryConsumer) ? mTimeInBackgroundMs : 0;
}
/** Returns total amount of power (in milli-amp-hours) that is attributed to this entry. */
@@ -510,9 +515,14 @@
if (batteryConsumer instanceof UidBatteryConsumer) {
UidBatteryConsumer uidBatteryConsumer = (UidBatteryConsumer) batteryConsumer;
mTimeInForegroundMs +=
- uidBatteryConsumer.getTimeInStateMs(UidBatteryConsumer.STATE_FOREGROUND);
+ uidBatteryConsumer.getTimeInProcessStateMs(
+ UidBatteryConsumer.PROCESS_STATE_FOREGROUND);
+ mTimeInForegroundServiceMs +=
+ uidBatteryConsumer.getTimeInProcessStateMs(
+ UidBatteryConsumer.PROCESS_STATE_FOREGROUND_SERVICE);
mTimeInBackgroundMs +=
- uidBatteryConsumer.getTimeInStateMs(UidBatteryConsumer.STATE_BACKGROUND);
+ uidBatteryConsumer.getTimeInProcessStateMs(
+ UidBatteryConsumer.PROCESS_STATE_BACKGROUND);
mConsumedPowerInForeground +=
safeGetConsumedPower(
uidBatteryConsumer, BATTERY_DIMENSIONS[BATTERY_USAGE_INDEX_FOREGROUND]);
diff --git a/src/com/android/settings/fuelgauge/batteryusage/BatteryHistEntry.java b/src/com/android/settings/fuelgauge/batteryusage/BatteryHistEntry.java
index 97cdc34..b42d373 100644
--- a/src/com/android/settings/fuelgauge/batteryusage/BatteryHistEntry.java
+++ b/src/com/android/settings/fuelgauge/batteryusage/BatteryHistEntry.java
@@ -20,8 +20,6 @@
import android.os.BatteryConsumer;
import android.util.Log;
-import java.time.Duration;
-
/** A container class to carry data from {@link ContentValues}. */
public class BatteryHistEntry {
private static final boolean DEBUG = false;
@@ -57,6 +55,7 @@
public final double mCachedUsageConsumePower;
public final double mPercentOfTotal;
public final long mForegroundUsageTimeInMs;
+ public final long mForegroundServiceUsageTimeInMs;
public final long mBackgroundUsageTimeInMs;
@BatteryConsumer.PowerComponent public final int mDrainType;
@ConvertUtils.ConsumerType public final int mConsumerType;
@@ -89,6 +88,7 @@
mCachedUsageConsumePower = batteryInformation.getCachedUsageConsumePower();
mPercentOfTotal = batteryInformation.getPercentOfTotal();
mForegroundUsageTimeInMs = batteryInformation.getForegroundUsageTimeInMs();
+ mForegroundServiceUsageTimeInMs = batteryInformation.getForegroundServiceUsageTimeInMs();
mBackgroundUsageTimeInMs = batteryInformation.getBackgroundUsageTimeInMs();
mDrainType = batteryInformation.getDrainType();
final DeviceBatteryState deviceBatteryState = batteryInformation.getDeviceBatteryState();
@@ -118,6 +118,7 @@
mCachedUsageConsumePower = batteryInformation.getCachedUsageConsumePower();
mPercentOfTotal = batteryInformation.getPercentOfTotal();
mForegroundUsageTimeInMs = batteryInformation.getForegroundUsageTimeInMs();
+ mForegroundServiceUsageTimeInMs = batteryInformation.getForegroundServiceUsageTimeInMs();
mBackgroundUsageTimeInMs = batteryInformation.getBackgroundUsageTimeInMs();
mDrainType = batteryInformation.getDrainType();
final DeviceBatteryState deviceBatteryState = batteryInformation.getDeviceBatteryState();
@@ -137,6 +138,7 @@
double backgroundUsageConsumePower,
double cachedUsageConsumePower,
long foregroundUsageTimeInMs,
+ long foregroundServiceUsageTimeInMs,
long backgroundUsageTimeInMs,
int batteryLevel) {
mUid = fromEntry.mUid;
@@ -155,6 +157,7 @@
mCachedUsageConsumePower = cachedUsageConsumePower;
mPercentOfTotal = fromEntry.mPercentOfTotal;
mForegroundUsageTimeInMs = foregroundUsageTimeInMs;
+ mForegroundServiceUsageTimeInMs = foregroundServiceUsageTimeInMs;
mBackgroundUsageTimeInMs = backgroundUsageTimeInMs;
mDrainType = fromEntry.mDrainType;
mConsumerType = fromEntry.mConsumerType;
@@ -189,45 +192,40 @@
@Override
public String toString() {
final String recordAtDateTime = ConvertUtils.utcToLocalTimeForLogging(mTimestamp);
- final StringBuilder builder =
- new StringBuilder()
- .append("\nBatteryHistEntry{")
- .append(
- String.format(
- "\n\tpackage=%s|label=%s|uid=%d|userId=%d|isHidden=%b",
- mPackageName, mAppLabel, mUid, mUserId, mIsHidden))
- .append(
- String.format(
- "\n\ttimestamp=%s|zoneId=%s|bootTimestamp=%d",
- recordAtDateTime,
- mZoneId,
- Duration.ofMillis(mBootTimestamp).getSeconds()))
- .append(
- String.format(
- "\n\tusage=%f|total=%f|consume=%f",
- mPercentOfTotal, mTotalPower, mConsumePower))
- .append(
- String.format(
- "\n\tforeground=%f|foregroundService=%f",
- mForegroundUsageConsumePower,
- mForegroundServiceUsageConsumePower))
- .append(
- String.format(
- "\n\tbackground=%f|cached=%f",
- mBackgroundUsageConsumePower, mCachedUsageConsumePower))
- .append(
- String.format(
- "\n\telapsedTime=%d|%d",
- Duration.ofMillis(mForegroundUsageTimeInMs).getSeconds(),
- Duration.ofMillis(mBackgroundUsageTimeInMs).getSeconds()))
- .append(
- String.format(
- "\n\tdrainType=%d|consumerType=%d",
- mDrainType, mConsumerType))
- .append(
- String.format(
- "\n\tbattery=%d|status=%d|health=%d\n}",
- mBatteryLevel, mBatteryStatus, mBatteryHealth));
+ final StringBuilder builder = new StringBuilder();
+ builder.append("\nBatteryHistEntry{");
+ builder.append(
+ String.format(
+ "\n\tpackage=%s|label=%s|uid=%d|userId=%d|isHidden=%b",
+ mPackageName, mAppLabel, mUid, mUserId, mIsHidden));
+ builder.append(
+ String.format(
+ "\n\ttimestamp=%s|zoneId=%s|bootTimestamp=%d",
+ recordAtDateTime, mZoneId, TimestampUtils.getSeconds(mBootTimestamp)));
+ builder.append(
+ String.format(
+ "\n\tusage=%f|total=%f|consume=%f",
+ mPercentOfTotal, mTotalPower, mConsumePower));
+ builder.append(
+ String.format(
+ "\n\tforeground=%f|foregroundService=%f",
+ mForegroundUsageConsumePower, mForegroundServiceUsageConsumePower));
+ builder.append(
+ String.format(
+ "\n\tbackground=%f|cached=%f",
+ mBackgroundUsageConsumePower, mCachedUsageConsumePower));
+ builder.append(
+ String.format(
+ "\n\telapsedTime,fg=%d|fgs=%d|bg=%d",
+ TimestampUtils.getSeconds(mBackgroundUsageTimeInMs),
+ TimestampUtils.getSeconds(mForegroundServiceUsageTimeInMs),
+ TimestampUtils.getSeconds(mBackgroundUsageTimeInMs)));
+ builder.append(
+ String.format("\n\tdrainType=%d|consumerType=%d", mDrainType, mConsumerType));
+ builder.append(
+ String.format(
+ "\n\tbattery=%d|status=%d|health=%d\n}",
+ mBatteryLevel, mBatteryStatus, mBatteryHealth));
return builder.toString();
}
@@ -323,19 +321,20 @@
ratio);
final double foregroundUsageTimeInMs =
interpolate(
- (double)
- (lowerHistEntry == null
- ? 0
- : lowerHistEntry.mForegroundUsageTimeInMs),
- (double) upperHistEntry.mForegroundUsageTimeInMs,
+ (lowerHistEntry == null ? 0 : lowerHistEntry.mForegroundUsageTimeInMs),
+ upperHistEntry.mForegroundUsageTimeInMs,
+ ratio);
+ final double foregroundServiceUsageTimeInMs =
+ interpolate(
+ (lowerHistEntry == null
+ ? 0
+ : lowerHistEntry.mForegroundServiceUsageTimeInMs),
+ upperHistEntry.mForegroundServiceUsageTimeInMs,
ratio);
final double backgroundUsageTimeInMs =
interpolate(
- (double)
- (lowerHistEntry == null
- ? 0
- : lowerHistEntry.mBackgroundUsageTimeInMs),
- (double) upperHistEntry.mBackgroundUsageTimeInMs,
+ (lowerHistEntry == null ? 0 : lowerHistEntry.mBackgroundUsageTimeInMs),
+ upperHistEntry.mBackgroundUsageTimeInMs,
ratio);
// Checks whether there is any abnormal cases!
if (upperHistEntry.mConsumePower < consumePower
@@ -345,6 +344,7 @@
|| upperHistEntry.mBackgroundUsageConsumePower < backgroundUsageConsumePower
|| upperHistEntry.mCachedUsageConsumePower < cachedUsageConsumePower
|| upperHistEntry.mForegroundUsageTimeInMs < foregroundUsageTimeInMs
+ || upperHistEntry.mForegroundServiceUsageTimeInMs < foregroundServiceUsageTimeInMs
|| upperHistEntry.mBackgroundUsageTimeInMs < backgroundUsageTimeInMs) {
if (DEBUG) {
Log.w(
@@ -371,6 +371,7 @@
backgroundUsageConsumePower,
cachedUsageConsumePower,
Math.round(foregroundUsageTimeInMs),
+ Math.round(foregroundServiceUsageTimeInMs),
Math.round(backgroundUsageTimeInMs),
(int) Math.round(batteryLevel));
}
diff --git a/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageBreakdownController.java b/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageBreakdownController.java
index d6f8709..0ffd090 100644
--- a/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageBreakdownController.java
+++ b/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageBreakdownController.java
@@ -400,7 +400,7 @@
mPrefContext,
entry.isSystemEntry(),
entry.mForegroundUsageTimeInMs,
- entry.mBackgroundUsageTimeInMs,
+ entry.mBackgroundUsageTimeInMs + entry.mForegroundServiceUsageTimeInMs,
entry.mScreenOnTimeInMs));
}
}
diff --git a/src/com/android/settings/fuelgauge/batteryusage/ConvertUtils.java b/src/com/android/settings/fuelgauge/batteryusage/ConvertUtils.java
index ae93734..e23e219 100644
--- a/src/com/android/settings/fuelgauge/batteryusage/ConvertUtils.java
+++ b/src/com/android/settings/fuelgauge/batteryusage/ConvertUtils.java
@@ -544,6 +544,7 @@
batteryUsageDiff.getLabel(),
batteryUsageDiff.getConsumerType(),
batteryUsageDiff.getForegroundUsageTime(),
+ batteryUsageDiff.getForegroundServiceUsageTime(),
batteryUsageDiff.getBackgroundUsageTime(),
batteryUsageDiff.getScreenOnTime(),
batteryUsageDiff.getConsumePower(),
@@ -612,6 +613,7 @@
.setPercentOfTotal(entry.mPercent)
.setDrainType(entry.getPowerComponentId())
.setForegroundUsageTimeInMs(entry.getTimeInForegroundMs())
+ .setForegroundServiceUsageTimeInMs(entry.getTimeInForegroundServiceMs())
.setBackgroundUsageTimeInMs(entry.getTimeInBackgroundMs());
}
diff --git a/src/com/android/settings/fuelgauge/batteryusage/DataProcessor.java b/src/com/android/settings/fuelgauge/batteryusage/DataProcessor.java
index d8f0a77..2ef12f1 100644
--- a/src/com/android/settings/fuelgauge/batteryusage/DataProcessor.java
+++ b/src/com/android/settings/fuelgauge/batteryusage/DataProcessor.java
@@ -675,6 +675,7 @@
entry.mAppLabel,
entry.mConsumerType,
entry.mForegroundUsageTimeInMs,
+ entry.mForegroundServiceUsageTimeInMs,
entry.mBackgroundUsageTimeInMs,
/* screenOnTimeInMs= */ 0,
entry.mConsumePower,
@@ -1412,6 +1413,7 @@
// Cumulative values is a specific time slot for a specific app.
long foregroundUsageTimeInMs = 0;
+ long foregroundServiceUsageTimeInMs = 0;
long backgroundUsageTimeInMs = 0;
double consumePower = 0;
double foregroundUsageConsumePower = 0;
@@ -1425,6 +1427,10 @@
getDiffValue(
currentEntry.mForegroundUsageTimeInMs,
nextEntry.mForegroundUsageTimeInMs);
+ foregroundServiceUsageTimeInMs +=
+ getDiffValue(
+ currentEntry.mForegroundServiceUsageTimeInMs,
+ nextEntry.mForegroundServiceUsageTimeInMs);
backgroundUsageTimeInMs +=
getDiffValue(
currentEntry.mBackgroundUsageTimeInMs,
@@ -1453,24 +1459,32 @@
foregroundUsageTimeInMs = slotScreenOnTime;
}
// Excludes entry since we don't have enough data to calculate.
- if (foregroundUsageTimeInMs == 0 && backgroundUsageTimeInMs == 0 && consumePower == 0) {
+ if (foregroundUsageTimeInMs == 0
+ && foregroundServiceUsageTimeInMs == 0
+ && backgroundUsageTimeInMs == 0
+ && consumePower == 0) {
continue;
}
// Forces refine the cumulative value since it may introduce deviation error since we
// will apply the interpolation arithmetic.
- final float totalUsageTimeInMs = foregroundUsageTimeInMs + backgroundUsageTimeInMs;
+ final float totalUsageTimeInMs =
+ foregroundUsageTimeInMs
+ + backgroundUsageTimeInMs
+ + foregroundServiceUsageTimeInMs;
if (totalUsageTimeInMs > slotDuration) {
final float ratio = slotDuration / totalUsageTimeInMs;
if (sDebug) {
Log.w(
TAG,
String.format(
- "abnormal usage time %d|%d for:\n%s",
+ "abnormal usage time %d|%d|%d for:\n%s",
Duration.ofMillis(foregroundUsageTimeInMs).getSeconds(),
+ Duration.ofMillis(foregroundServiceUsageTimeInMs).getSeconds(),
Duration.ofMillis(backgroundUsageTimeInMs).getSeconds(),
selectedBatteryEntry));
}
foregroundUsageTimeInMs = Math.round(foregroundUsageTimeInMs * ratio);
+ foregroundServiceUsageTimeInMs = Math.round(foregroundServiceUsageTimeInMs * ratio);
backgroundUsageTimeInMs = Math.round(backgroundUsageTimeInMs * ratio);
consumePower = consumePower * ratio;
foregroundUsageConsumePower = foregroundUsageConsumePower * ratio;
@@ -1487,9 +1501,14 @@
appUsageMap,
selectedBatteryEntry.mUserId,
selectedBatteryEntry.mPackageName));
- // Make sure the background + screen-on time will not exceed the threshold.
+ // Ensure the following value will not exceed the threshold.
+ // value = background + foregroundService + screen-on
backgroundUsageTimeInMs =
Math.min(backgroundUsageTimeInMs, (long) slotDuration - screenOnTime);
+ foregroundServiceUsageTimeInMs =
+ Math.min(
+ foregroundServiceUsageTimeInMs,
+ (long) slotDuration - screenOnTime - backgroundUsageTimeInMs);
final BatteryDiffEntry currentBatteryDiffEntry =
new BatteryDiffEntry(
context,
@@ -1502,6 +1521,7 @@
selectedBatteryEntry.mAppLabel,
selectedBatteryEntry.mConsumerType,
foregroundUsageTimeInMs,
+ foregroundServiceUsageTimeInMs,
backgroundUsageTimeInMs,
screenOnTime,
consumePower,
@@ -1647,6 +1667,8 @@
} else {
// Sums up some field data into the existing one.
oldBatteryDiffEntry.mForegroundUsageTimeInMs += entry.mForegroundUsageTimeInMs;
+ oldBatteryDiffEntry.mForegroundServiceUsageTimeInMs +=
+ entry.mForegroundServiceUsageTimeInMs;
oldBatteryDiffEntry.mBackgroundUsageTimeInMs += entry.mBackgroundUsageTimeInMs;
oldBatteryDiffEntry.mScreenOnTimeInMs += entry.mScreenOnTimeInMs;
oldBatteryDiffEntry.mConsumePower += entry.mConsumePower;
diff --git a/src/com/android/settings/fuelgauge/batteryusage/DatabaseUtils.java b/src/com/android/settings/fuelgauge/batteryusage/DatabaseUtils.java
index 7160da4..ee0e449 100644
--- a/src/com/android/settings/fuelgauge/batteryusage/DatabaseUtils.java
+++ b/src/com/android/settings/fuelgauge/batteryusage/DatabaseUtils.java
@@ -660,36 +660,39 @@
// Creates the ContentValues list to insert them into provider.
final List<ContentValues> valuesList = new ArrayList<>();
if (batteryEntryList != null) {
- batteryEntryList.stream()
- .filter(
- entry -> {
- final long foregroundMs = entry.getTimeInForegroundMs();
- final long backgroundMs = entry.getTimeInBackgroundMs();
- if (entry.getConsumedPower() == 0
- && (foregroundMs != 0 || backgroundMs != 0)) {
- Log.w(
- TAG,
- String.format(
- "no consumed power but has running time for %s"
- + " time=%d|%d",
- entry.getLabel(), foregroundMs, backgroundMs));
- }
- return entry.getConsumedPower() != 0
- || foregroundMs != 0
- || backgroundMs != 0;
- })
- .forEach(
- entry ->
- valuesList.add(
- ConvertUtils.convertBatteryEntryToContentValues(
- entry,
- batteryUsageStats,
- batteryLevel,
- batteryStatus,
- batteryHealth,
- snapshotBootTimestamp,
- snapshotTimestamp,
- isFullChargeStart)));
+ for (BatteryEntry entry : batteryEntryList) {
+ final long foregroundMs = entry.getTimeInForegroundMs();
+ final long foregroundServiceMs = entry.getTimeInForegroundServiceMs();
+ final long backgroundMs = entry.getTimeInBackgroundMs();
+ if (entry.getConsumedPower() == 0
+ && (foregroundMs != 0 || foregroundServiceMs != 0 || backgroundMs != 0)) {
+ Log.w(
+ TAG,
+ String.format(
+ "no consumed power but has running time for %s"
+ + " time=%d|%d|%d",
+ entry.getLabel(),
+ foregroundMs,
+ foregroundServiceMs,
+ backgroundMs));
+ }
+ if (entry.getConsumedPower() == 0
+ && foregroundMs == 0
+ && foregroundServiceMs == 0
+ && backgroundMs == 0) {
+ continue;
+ }
+ valuesList.add(
+ ConvertUtils.convertBatteryEntryToContentValues(
+ entry,
+ batteryUsageStats,
+ batteryLevel,
+ batteryStatus,
+ batteryHealth,
+ snapshotBootTimestamp,
+ snapshotTimestamp,
+ isFullChargeStart));
+ }
}
int size = 1;
diff --git a/src/com/android/settings/fuelgauge/batteryusage/TimestampUtils.java b/src/com/android/settings/fuelgauge/batteryusage/TimestampUtils.java
index 594a0ef..41a2254 100644
--- a/src/com/android/settings/fuelgauge/batteryusage/TimestampUtils.java
+++ b/src/com/android/settings/fuelgauge/batteryusage/TimestampUtils.java
@@ -16,6 +16,7 @@
package com.android.settings.fuelgauge.batteryusage;
+import java.time.Duration;
import java.util.Calendar;
/** A utility class for timestamp operations. */
@@ -48,6 +49,10 @@
return calendar.getTimeInMillis();
}
+ static long getSeconds(final long timeInMs) {
+ return Duration.ofMillis(timeInMs).getSeconds();
+ }
+
static boolean isMidnight(final long timestamp) {
final Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(timestamp);
diff --git a/src/com/android/settings/fuelgauge/protos/battery_usage_slot.proto b/src/com/android/settings/fuelgauge/protos/battery_usage_slot.proto
index 5bc1a3e..7f67770 100644
--- a/src/com/android/settings/fuelgauge/protos/battery_usage_slot.proto
+++ b/src/com/android/settings/fuelgauge/protos/battery_usage_slot.proto
@@ -31,4 +31,5 @@
optional int64 foreground_usage_time = 14;
optional int64 background_usage_time = 15;
optional int64 screen_on_time = 16;
+ optional int64 foreground_service_usage_time = 17;
}
diff --git a/src/com/android/settings/fuelgauge/protos/fuelgauge_usage_state.proto b/src/com/android/settings/fuelgauge/protos/fuelgauge_usage_state.proto
index b9b05a3..d53b814 100644
--- a/src/com/android/settings/fuelgauge/protos/fuelgauge_usage_state.proto
+++ b/src/com/android/settings/fuelgauge/protos/fuelgauge_usage_state.proto
@@ -36,4 +36,5 @@
optional double foreground_service_usage_consume_power = 17;
optional double background_usage_consume_power = 18;
optional double cached_usage_consume_power = 19;
+ optional int64 foreground_service_usage_time_in_ms = 20;
}
\ No newline at end of file
diff --git a/src/com/android/settings/network/SubscriptionInfoListViewModel.kt b/src/com/android/settings/network/SubscriptionInfoListViewModel.kt
index d30b21d..ee88177 100644
--- a/src/com/android/settings/network/SubscriptionInfoListViewModel.kt
+++ b/src/com/android/settings/network/SubscriptionInfoListViewModel.kt
@@ -19,8 +19,10 @@
import android.app.Application
import android.telephony.SubscriptionInfo
import android.telephony.SubscriptionManager
+
import androidx.lifecycle.AndroidViewModel
import androidx.lifecycle.viewModelScope
+
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.asExecutor
import kotlinx.coroutines.channels.awaitClose
@@ -32,13 +34,12 @@
class SubscriptionInfoListViewModel(application: Application) : AndroidViewModel(application) {
private val scope = viewModelScope + Dispatchers.Default
-
val subscriptionInfoListFlow = callbackFlow<List<SubscriptionInfo>> {
val subscriptionManager = application.getSystemService(SubscriptionManager::class.java)!!
val listener = object : SubscriptionManager.OnSubscriptionsChangedListener() {
override fun onSubscriptionsChanged() {
- trySend(subscriptionManager.activeSubscriptionInfoList ?: emptyList())
+ trySend(SubscriptionUtil.getActiveSubscriptions(subscriptionManager))
}
}
diff --git a/src/com/android/settings/network/SubscriptionUtil.java b/src/com/android/settings/network/SubscriptionUtil.java
index 9974ba2..7a127bb 100644
--- a/src/com/android/settings/network/SubscriptionUtil.java
+++ b/src/com/android/settings/network/SubscriptionUtil.java
@@ -18,6 +18,8 @@
import static android.telephony.SubscriptionManager.INVALID_SIM_SLOT_INDEX;
import static android.telephony.UiccSlotInfo.CARD_STATE_INFO_PRESENT;
+import static android.telephony.SubscriptionManager.PROFILE_CLASS_PROVISIONING;
+
import static com.android.internal.util.CollectionUtils.emptyIfNull;
import android.annotation.Nullable;
@@ -36,9 +38,11 @@
import android.text.TextUtils;
import android.util.Log;
+import androidx.annotation.NonNull;
import androidx.annotation.VisibleForTesting;
import com.android.internal.telephony.MccTable;
+import com.android.internal.telephony.flags.Flags;
import com.android.settings.R;
import com.android.settings.network.helper.SelectableSubscriptions;
import com.android.settings.network.helper.SubscriptionAnnotation;
@@ -84,6 +88,8 @@
}
public static List<SubscriptionInfo> getActiveSubscriptions(SubscriptionManager manager) {
+ //TODO (b/315499317) : Refactor the subscription utils.
+
if (sActiveResultsForTesting != null) {
return sActiveResultsForTesting;
}
@@ -94,7 +100,12 @@
if (subscriptions == null) {
return new ArrayList<>();
}
- return subscriptions;
+ // Since the SubscriptionManager.getActiveSubscriptionInfoList() has checked whether the
+ // sim visible by the SubscriptionManager.isSubscriptionVisible(), here only checks whether
+ // the esim visible here.
+ return subscriptions.stream()
+ .filter(subInfo -> subInfo != null && isEmbeddedSubscriptionVisible(subInfo))
+ .collect(Collectors.toList());
}
/**
@@ -128,7 +139,7 @@
}
/**
- * Get subscription which is available to be displayed to the user
+ * Get subscriptionInfo which is available to be displayed to the user
* per subscription id.
*
* @param context {@code Context}
@@ -138,13 +149,20 @@
* @return {@code SubscriptionInfo} based on the given subscription id. Null of subscription
* is invalid or not allowed to be displayed to the user.
*/
- public static SubscriptionInfo getAvailableSubscription(Context context,
+ public static SubscriptionInfo getAvailableSubscriptionBySubIdAndShowingForUser(Context context,
ProxySubscriptionManager subscriptionManager, int subId) {
+ //TODO (b/315499317) : Refactor the subscription utils.
final SubscriptionInfo subInfo = subscriptionManager.getAccessibleSubscriptionInfo(subId);
if (subInfo == null) {
return null;
}
+ // hide provisioning/bootstrap and satellite profiles for user
+ if (isEmbeddedSubscriptionVisible(subInfo)) {
+ Log.d(TAG, "Do not insert the provision eSIM or NTN eSim");
+ return null;
+ }
+
final ParcelUuid groupUuid = subInfo.getGroupUuid();
if (groupUuid != null) {
@@ -567,6 +585,12 @@
public static boolean isSubscriptionVisible(
SubscriptionManager subscriptionManager, Context context, SubscriptionInfo info) {
if (info == null) return false;
+
+ // hide provisioning/bootstrap and satellite profiles for user
+ if (isEmbeddedSubscriptionVisible(info)) {
+ return false;
+ }
+
// If subscription is NOT grouped opportunistic subscription, it's visible.
if (info.getGroupUuid() == null || !info.isOpportunistic()) return true;
@@ -786,4 +810,14 @@
}
return (currentSubInfo == null) ? null : currentSubInfo.getSubInfo();
}
+
+ private static boolean isEmbeddedSubscriptionVisible(@NonNull SubscriptionInfo subInfo) {
+ if (subInfo.isEmbedded()
+ && (subInfo.getProfileClass() == PROFILE_CLASS_PROVISIONING
+ || (Flags.oemEnabledSatelliteFlag()
+ && subInfo.isOnlyNonTerrestrialNetwork()))) {
+ return false;
+ }
+ return true;
+ }
}
diff --git a/src/com/android/settings/network/SubscriptionsPreferenceController.java b/src/com/android/settings/network/SubscriptionsPreferenceController.java
index 0c3e6bd..6601828 100644
--- a/src/com/android/settings/network/SubscriptionsPreferenceController.java
+++ b/src/com/android/settings/network/SubscriptionsPreferenceController.java
@@ -521,7 +521,7 @@
* Uses to inject function and value for class and test class.
*/
public boolean canSubscriptionBeDisplayed(Context context, int subId) {
- return (SubscriptionUtil.getAvailableSubscription(context,
+ return (SubscriptionUtil.getAvailableSubscriptionBySubIdAndShowingForUser(context,
ProxySubscriptionManager.getInstance(context), subId) != null);
}
diff --git a/src/com/android/settings/privatespace/PrivateSpaceMaintainer.java b/src/com/android/settings/privatespace/PrivateSpaceMaintainer.java
index 3ec7c92..b5e76920 100644
--- a/src/com/android/settings/privatespace/PrivateSpaceMaintainer.java
+++ b/src/com/android/settings/privatespace/PrivateSpaceMaintainer.java
@@ -34,6 +34,7 @@
import android.util.Log;
import androidx.annotation.Nullable;
+import androidx.annotation.VisibleForTesting;
import com.android.internal.annotations.GuardedBy;
@@ -226,6 +227,26 @@
HIDE_PRIVATE_SPACE_ENTRY_POINT_DISABLED_VAL);
}
+ /**
+ * Returns true if private space exists and quiet mode is successfully enabled, otherwise
+ * returns false
+ */
+ public synchronized boolean lockPrivateSpace() {
+ if (isPrivateProfileRunning()) {
+ return mUserManager.requestQuietModeEnabled(true, mUserHandle);
+ }
+ return false;
+ }
+
+ /** Returns true if private space exists and is running, otherwise returns false */
+ @VisibleForTesting
+ synchronized boolean isPrivateProfileRunning() {
+ if (doesPrivateSpaceExist() && mUserHandle != null) {
+ return mUserManager.isUserRunning(mUserHandle);
+ }
+ return false;
+ }
+
private void resetPrivateSpaceSettings() {
setHidePrivateSpaceEntryPointSetting(HIDE_PRIVATE_SPACE_ENTRY_POINT_DISABLED_VAL);
}
diff --git a/src/com/android/settings/privatespace/SetupSuccessFragment.java b/src/com/android/settings/privatespace/SetupSuccessFragment.java
index 0b1b9d9..ebeae7a 100644
--- a/src/com/android/settings/privatespace/SetupSuccessFragment.java
+++ b/src/com/android/settings/privatespace/SetupSuccessFragment.java
@@ -84,6 +84,8 @@
if (activity != null) {
mMetricsFeatureProvider.action(
getContext(), SettingsEnums.ACTION_PRIVATE_SPACE_SETUP_DONE);
+ //TODO(b/307729746): Add a test to verify PS is locked after setup completion.
+ PrivateSpaceMaintainer.getInstance(activity).lockPrivateSpace();
Intent allAppsIntent = new Intent(Intent.ACTION_ALL_APPS);
ResolveInfo resolveInfo =
activity.getPackageManager()
diff --git a/src/com/android/settings/spa/SpaActivity.kt b/src/com/android/settings/spa/SpaActivity.kt
index e5bee8b..5eade81 100644
--- a/src/com/android/settings/spa/SpaActivity.kt
+++ b/src/com/android/settings/spa/SpaActivity.kt
@@ -18,9 +18,11 @@
import android.content.Context
import android.content.Intent
+import android.os.Bundle
import android.util.Log
import androidx.annotation.VisibleForTesting
import com.android.settings.spa.app.appinfo.AppInfoSettingsProvider
+import com.android.settingslib.core.lifecycle.HideNonSystemOverlayMixin
import com.android.settingslib.spa.framework.BrowseActivity
import com.android.settingslib.spa.framework.common.SettingsPage
import com.android.settingslib.spa.framework.util.SESSION_BROWSE
@@ -31,6 +33,11 @@
override fun isPageEnabled(page: SettingsPage) =
super.isPageEnabled(page) && !isSuwAndPageBlocked(page.sppName)
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ lifecycle.addObserver(HideNonSystemOverlayMixin(this))
+ }
+
companion object {
private const val TAG = "SpaActivity"
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java b/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java
index d01d7e0..2f83da6 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java
@@ -49,7 +49,9 @@
import com.android.settings.R;
import com.android.settings.SettingsActivity;
+import com.android.settings.fuelgauge.batteryusage.BatteryDiffEntry;
import com.android.settings.fuelgauge.batteryusage.BatteryEntry;
+import com.android.settings.fuelgauge.batteryusage.ConvertUtils;
import com.android.settings.testutils.FakeFeatureFactory;
import com.android.settings.testutils.shadow.ShadowActivityManager;
import com.android.settings.testutils.shadow.ShadowEntityHeaderController;
@@ -91,11 +93,10 @@
private static final String USAGE_PERCENT = "16%";
private static final int ICON_ID = 123;
private static final int UID = 1;
+ private static final long FOREGROUND_TIME_MS = 444;
+ private static final long FOREGROUND_SERVICE_TIME_MS = 123;
private static final long BACKGROUND_TIME_MS = 100;
- private static final long FOREGROUND_ACTIVITY_TIME_MS = 123;
- private static final long FOREGROUND_SERVICE_TIME_MS = 444;
- private static final long FOREGROUND_TIME_MS =
- FOREGROUND_ACTIVITY_TIME_MS + FOREGROUND_SERVICE_TIME_MS;
+ private static final long SCREEN_ON_TIME_MS = 321;
private static final String KEY_ALLOW_BACKGROUND_USAGE = "allow_background_usage";
@Mock(answer = Answers.RETURNS_DEEP_STUBS)
@@ -105,7 +106,6 @@
@Mock private LayoutPreference mHeaderPreference;
@Mock private ApplicationsState mState;
@Mock private ApplicationsState.AppEntry mAppEntry;
- @Mock private Bundle mBundle;
@Mock private BatteryEntry mBatteryEntry;
@Mock private PackageManager mPackageManager;
@Mock private InstallSourceInfo mInstallSourceInfo;
@@ -120,6 +120,8 @@
private SettingsActivity mTestActivity;
private FakeFeatureFactory mFeatureFactory;
private MetricsFeatureProvider mMetricsFeatureProvider;
+ private BatteryDiffEntry mBatteryDiffEntry;
+ private Bundle mBundle;
@Before
public void setUp() {
@@ -131,6 +133,7 @@
mMetricsFeatureProvider = mFeatureFactory.metricsFeatureProvider;
mFragment = spy(new AdvancedPowerUsageDetail());
+ mBundle = spy(new Bundle());
doReturn(mContext).when(mFragment).getContext();
doReturn(mActivity).when(mFragment).getActivity();
doReturn(SUMMARY).when(mFragment).getString(anyInt());
@@ -163,10 +166,35 @@
when(mBatteryEntry.getUid()).thenReturn(UID);
when(mBatteryEntry.getLabel()).thenReturn(APP_LABEL);
- when(mBatteryEntry.getTimeInBackgroundMs()).thenReturn(BACKGROUND_TIME_MS);
when(mBatteryEntry.getTimeInForegroundMs()).thenReturn(FOREGROUND_TIME_MS);
+ when(mBatteryEntry.getTimeInForegroundServiceMs()).thenReturn(FOREGROUND_SERVICE_TIME_MS);
+ when(mBatteryEntry.getTimeInBackgroundMs()).thenReturn(BACKGROUND_TIME_MS);
mBatteryEntry.mIconId = ICON_ID;
+ mBatteryDiffEntry =
+ spy(
+ new BatteryDiffEntry(
+ mContext,
+ /* uid= */ UID,
+ /* userId= */ 0,
+ /* key= */ "key",
+ /* isHidden= */ false,
+ /* componentId= */ -1,
+ /* legacyPackageName= */ null,
+ /* legacyLabel= */ null,
+ /*consumerType*/ ConvertUtils.CONSUMER_TYPE_USER_BATTERY,
+ /* foregroundUsageTimeInMs= */ FOREGROUND_TIME_MS,
+ /* foregroundSerUsageTimeInMs= */ FOREGROUND_SERVICE_TIME_MS,
+ /* backgroundUsageTimeInMs= */ BACKGROUND_TIME_MS,
+ /* screenOnTimeInMs= */ SCREEN_ON_TIME_MS,
+ /* consumePower= */ 0,
+ /* foregroundUsageConsumePower= */ 0,
+ /* foregroundServiceUsageConsumePower= */ 0,
+ /* backgroundUsageConsumePower= */ 0,
+ /* cachedUsageConsumePower= */ 0));
+ when(mBatteryDiffEntry.getAppLabel()).thenReturn(APP_LABEL);
+ when(mBatteryDiffEntry.getAppIconId()).thenReturn(ICON_ID);
+
mFragment.mHeaderPreference = mHeaderPreference;
mFragment.mState = mState;
mFragment.mBatteryOptimizeUtils = mBatteryOptimizeUtils;
@@ -191,6 +219,7 @@
.when(mActivity)
.startActivityAsUser(captor.capture(), nullable(UserHandle.class));
doAnswer(callable).when(mActivity).startActivity(captor.capture());
+ doAnswer(callable).when(mContext).startActivity(captor.capture());
mAllowBackgroundUsagePreference = new PrimarySwitchPreference(mContext);
mAllowBackgroundUsagePreference.setKey(KEY_ALLOW_BACKGROUND_USAGE);
@@ -256,6 +285,7 @@
@Test
public void startBatteryDetailPage_invalidToShowSummary_noFGBDData() {
+ mBundle.clear();
AdvancedPowerUsageDetail.startBatteryDetailPage(
mActivity, mFragment, mBatteryEntry, USAGE_PERCENT);
@@ -268,6 +298,35 @@
}
@Test
+ public void startBatteryDetailPage_showSummary_hasFGBDData() {
+ final ArgumentCaptor<Intent> captor = ArgumentCaptor.forClass(Intent.class);
+ mBundle.clear();
+ AdvancedPowerUsageDetail.startBatteryDetailPage(
+ mContext,
+ mFragment.getMetricsCategory(),
+ mBatteryDiffEntry,
+ USAGE_PERCENT,
+ /* slotInformation= */ null,
+ /* showTimeInformation= */ true,
+ /* anomalyHintPrefKey= */ null,
+ /* anomalyHintText= */ null);
+
+ verify(mContext).startActivity(captor.capture());
+ assertThat(mBundle.getInt(AdvancedPowerUsageDetail.EXTRA_UID)).isEqualTo(UID);
+ assertThat(mBundle.getLong(AdvancedPowerUsageDetail.EXTRA_BACKGROUND_TIME))
+ .isEqualTo(BACKGROUND_TIME_MS + FOREGROUND_SERVICE_TIME_MS);
+ assertThat(mBundle.getLong(AdvancedPowerUsageDetail.EXTRA_FOREGROUND_TIME))
+ .isEqualTo(FOREGROUND_TIME_MS);
+ assertThat(mBundle.getLong(AdvancedPowerUsageDetail.EXTRA_SCREEN_ON_TIME))
+ .isEqualTo(SCREEN_ON_TIME_MS);
+ assertThat(mBundle.getString(AdvancedPowerUsageDetail.EXTRA_POWER_USAGE_PERCENT))
+ .isEqualTo(USAGE_PERCENT);
+ assertThat(mBundle.getString(AdvancedPowerUsageDetail.EXTRA_SLOT_TIME))
+ .isEqualTo(null);
+ }
+
+
+ @Test
public void startBatteryDetailPage_noBatteryUsage_hasBasicData() {
final ArgumentCaptor<Intent> captor = ArgumentCaptor.forClass(Intent.class);
@@ -292,6 +351,7 @@
@Test
public void startBatteryDetailPage_batteryEntryNotExisted_extractUidFromPackageName()
throws PackageManager.NameNotFoundException {
+ mBundle.clear();
doReturn(UID).when(mPackageManager).getPackageUid(PACKAGE_NAME[0], 0 /* no flag */);
AdvancedPowerUsageDetail.startBatteryDetailPage(
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryDiffDataTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryDiffDataTest.java
index ffe3c44..d351ca3 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryDiffDataTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryDiffDataTest.java
@@ -207,6 +207,7 @@
batteryHistEntry.mAppLabel,
batteryHistEntry.mConsumerType,
/* foregroundUsageTimeInMs= */ 0,
+ /* foregroundServiceUsageTimeInMs= */ 0,
/* backgroundUsageTimeInMs= */ 0,
/* screenOnTimeInMs= */ 0,
consumePower,
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryDiffEntryTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryDiffEntryTest.java
index d8b733c..6f1dce6 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryDiffEntryTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryDiffEntryTest.java
@@ -111,8 +111,9 @@
/* legacyLabel= */ null,
/*consumerType*/ ConvertUtils.CONSUMER_TYPE_UID_BATTERY,
/* foregroundUsageTimeInMs= */ 10001L,
- /* backgroundUsageTimeInMs= */ 20002L,
- /* screenOnTimeInMs= */ 30003L,
+ /* foregroundServiceUsageTimeInMs= */ 20002L,
+ /* backgroundUsageTimeInMs= */ 30003L,
+ /* screenOnTimeInMs= */ 40004L,
/* consumePower= */ 22.0,
/* foregroundUsageConsumePower= */ 10.0,
/* foregroundServiceUsageConsumePower= */ 10.0,
@@ -137,8 +138,9 @@
/* legacyLabel= */ null,
/*consumerType*/ ConvertUtils.CONSUMER_TYPE_UID_BATTERY,
/* foregroundUsageTimeInMs= */ 10001L,
- /* backgroundUsageTimeInMs= */ 20002L,
- /* screenOnTimeInMs= */ 30003L,
+ /* foregroundServiceUsageTimeInMs= */ 20002L,
+ /* backgroundUsageTimeInMs= */ 30003L,
+ /* screenOnTimeInMs= */ 40004L,
/* consumePower= */ 22.0,
/* foregroundUsageConsumePower= */ 10.0,
/* foregroundServiceUsageConsumePower= */ 10.0,
@@ -165,6 +167,7 @@
/* legacyLabel= */ BatteryDiffEntry.SYSTEM_APPS_KEY,
/*consumerType*/ ConvertUtils.CONSUMER_TYPE_UID_BATTERY,
/* foregroundUsageTimeInMs= */ 0,
+ /* foregroundServiceUsageTimeInMs= */ 0,
/* backgroundUsageTimeInMs= */ 0,
/* screenOnTimeInMs= */ 0,
/* consumePower= */ 0,
@@ -552,6 +555,7 @@
/* legacyLabel= */ null,
/*consumerType*/ consumerType,
/* foregroundUsageTimeInMs= */ 0,
+ /* foregroundServiceUsageTimeInMs= */ 0,
/* backgroundUsageTimeInMs= */ 0,
/* screenOnTimeInMs= */ 0,
/* consumePower= */ 0,
@@ -576,6 +580,7 @@
batteryHistEntry.mConsumerType,
/* foregroundUsageTimeInMs= */ 0,
/* backgroundUsageTimeInMs= */ 0,
+ /* foregroundServiceUsageTimeInMs= */ 0,
/* screenOnTimeInMs= */ 0,
consumePower,
/* foregroundUsageConsumePower= */ 0,
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryEntryTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryEntryTest.java
index 83b4458..450d058 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryEntryTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryEntryTest.java
@@ -195,7 +195,8 @@
@Test
public void getTimeInForegroundMs_app() {
- when(mUidBatteryConsumer.getTimeInStateMs(UidBatteryConsumer.STATE_FOREGROUND))
+ when(mUidBatteryConsumer.getTimeInProcessStateMs(
+ UidBatteryConsumer.PROCESS_STATE_FOREGROUND))
.thenReturn(100L);
final BatteryEntry entry =
@@ -226,8 +227,9 @@
@Test
public void getTimeInBackgroundMs_app() {
- when(mUidBatteryConsumer.getTimeInStateMs(UidBatteryConsumer.STATE_BACKGROUND))
- .thenReturn(100L);
+ when(mUidBatteryConsumer.getTimeInProcessStateMs(
+ UidBatteryConsumer.PROCESS_STATE_BACKGROUND))
+ .thenReturn(30L);
final BatteryEntry entry =
new BatteryEntry(
@@ -239,7 +241,26 @@
null,
null);
- assertThat(entry.getTimeInBackgroundMs()).isEqualTo(100L);
+ assertThat(entry.getTimeInBackgroundMs()).isEqualTo(30L);
+ }
+
+ @Test
+ public void getTimeInForegroundServiceMs_app() {
+ when(mUidBatteryConsumer.getTimeInProcessStateMs(
+ UidBatteryConsumer.PROCESS_STATE_FOREGROUND_SERVICE))
+ .thenReturn(70L);
+
+ final BatteryEntry entry =
+ new BatteryEntry(
+ RuntimeEnvironment.application,
+ mMockUserManager,
+ mUidBatteryConsumer,
+ false,
+ 0,
+ null,
+ null);
+
+ assertThat(entry.getTimeInForegroundServiceMs()).isEqualTo(70L);
}
@Test
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryHistEntryTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryHistEntryTest.java
index 02800f7..dc868c8 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryHistEntryTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryHistEntryTest.java
@@ -65,6 +65,7 @@
when(mMockBatteryEntry.getConsumedPowerInCached()).thenReturn(1.5);
mMockBatteryEntry.mPercent = 0.3;
when(mMockBatteryEntry.getTimeInForegroundMs()).thenReturn(1234L);
+ when(mMockBatteryEntry.getTimeInForegroundServiceMs()).thenReturn(3456L);
when(mMockBatteryEntry.getTimeInBackgroundMs()).thenReturn(5689L);
when(mMockBatteryEntry.getPowerComponentId()).thenReturn(expectedType);
when(mMockBatteryEntry.getConsumerType())
@@ -105,6 +106,7 @@
/* backgroundUsageConsumePower= */ 1.4,
/* cachedUsageConsumePower= */ 1.5,
/* foregroundUsageTimeInMs= */ 1234L,
+ /* foregroundServiceUsageTimeInMs= */ 3456L,
/* backgroundUsageTimeInMs= */ 5689L,
/* batteryLevel= */ 12),
/* drainType= */ 3,
@@ -211,6 +213,7 @@
/* backgroundUsageConsumePower= */ 3,
/* cachedUsageConsumePower= */ 4,
/* foregroundUsageTimeInMs= */ 100,
+ /* foregroundServiceUsageTimeInMs= */ 150,
/* backgroundUsageTimeInMs= */ 200,
/* batteryLevel= */ 90);
final BatteryHistEntry upperHistEntry =
@@ -224,6 +227,7 @@
/* backgroundUsageConsumePower= */ 6,
/* cachedUsageConsumePower= */ 5,
/* foregroundUsageTimeInMs= */ 200,
+ /* foregroundServiceUsageTimeInMs= */ 250,
/* backgroundUsageTimeInMs= */ 300,
/* batteryLevel= */ 80);
@@ -244,6 +248,7 @@
/* backgroundUsageConsumePower= */ 3 + 0.5 * (6 - 3),
/* cachedUsageConsumePower= */ 4 + 0.5 * (5 - 4),
/* foregroundUsageTimeInMs= */ Math.round(100 + 0.5 * (200 - 100)),
+ /* foregroundServiceUsageTimeInMs= */ Math.round(150 + 0.5 * (250 - 150)),
/* backgroundUsageTimeInMs= */ Math.round(200 + 0.5 * (300 - 200)),
/* batteryLevel= */ (int) Math.round(90 + 0.5 * (80 - 90)));
}
@@ -264,6 +269,7 @@
/* backgroundUsageConsumePower= */ 6,
/* cachedUsageConsumePower= */ 5,
/* foregroundUsageTimeInMs= */ 200,
+ /* foregroundServiceUsageTimeInMs= */ 250,
/* backgroundUsageTimeInMs= */ 300,
/* batteryLevel= */ 80);
@@ -288,6 +294,7 @@
/* backgroundUsageConsumePower= */ 0.5 * 6,
/* cachedUsageConsumePower= */ 0.5 * 5,
/* foregroundUsageTimeInMs= */ Math.round(0.5 * 200),
+ /* foregroundServiceUsageTimeInMs= */ Math.round(0.5 * 250),
/* backgroundUsageTimeInMs= */ Math.round(0.5 * 300),
/* batteryLevel= */ upperHistEntry.mBatteryLevel);
}
@@ -317,6 +324,7 @@
/* backgroundUsageConsumePower= */ 1.4,
/* cachedUsageConsumePower= */ 1.5,
/* foregroundUsageTimeInMs= */ 1234L,
+ /*foregroundServiceUsageTimeInMs=*/ 3456L,
/* backgroundUsageTimeInMs= */ 5689L,
/* batteryLevel= */ 12);
}
@@ -334,6 +342,7 @@
double backgroundUsageConsumePower,
double cachedUsageConsumePower,
long foregroundUsageTimeInMs,
+ long foregroundServiceUsageTimeInMs,
long backgroundUsageTimeInMs,
int batteryLevel) {
assertThat(entry.isValidEntry()).isTrue();
@@ -354,6 +363,7 @@
assertThat(entry.mCachedUsageConsumePower).isEqualTo(cachedUsageConsumePower);
assertThat(entry.mPercentOfTotal).isEqualTo(percentOfTotal);
assertThat(entry.mForegroundUsageTimeInMs).isEqualTo(foregroundUsageTimeInMs);
+ assertThat(entry.mForegroundServiceUsageTimeInMs).isEqualTo(foregroundServiceUsageTimeInMs);
assertThat(entry.mBackgroundUsageTimeInMs).isEqualTo(backgroundUsageTimeInMs);
assertThat(entry.mDrainType).isEqualTo(drainType);
assertThat(entry.mConsumerType).isEqualTo(ConvertUtils.CONSUMER_TYPE_SYSTEM_BATTERY);
@@ -372,6 +382,7 @@
double backgroundUsageConsumePower,
double cachedUsageConsumePower,
long foregroundUsageTimeInMs,
+ long foregroundServiceUsageTimeInMs,
long backgroundUsageTimeInMs,
int batteryLevel) {
final MatrixCursor cursor =
@@ -406,6 +417,7 @@
.setPercentOfTotal(0.3)
.setDrainType(3)
.setForegroundUsageTimeInMs(foregroundUsageTimeInMs)
+ .setForegroundServiceUsageTimeInMs(foregroundServiceUsageTimeInMs)
.setBackgroundUsageTimeInMs(backgroundUsageTimeInMs)
.build();
cursor.addRow(
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageBreakdownControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageBreakdownControllerTest.java
index fc30702..5704be9 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageBreakdownControllerTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageBreakdownControllerTest.java
@@ -100,7 +100,8 @@
/* legacyLabel= */ null,
/* consumerType= */ ConvertUtils.CONSUMER_TYPE_UID_BATTERY,
/* foregroundUsageTimeInMs= */ 1,
- /* backgroundUsageTimeInMs= */ 2,
+ /* foregroundServiceUsageTimeInMs= */ 2,
+ /* backgroundUsageTimeInMs= */ 3,
/* screenOnTimeInMs= */ 0,
/* consumePower= */ 3,
/* foregroundUsageConsumePower= */ 0,
@@ -275,6 +276,7 @@
/* isSystem= */ true,
/* screenOnTimeInMs= */ 0,
/* foregroundUsageTimeInMs= */ 0,
+ /* foregroundServiceUsageTimeInMs= */ 0,
/* backgroundUsageTimeInMs= */ 0);
batteryDiffEntry.mConsumePower = 0.8;
batteryDiffEntry.setTotalConsumePower(100);
@@ -293,6 +295,7 @@
/* isSystem= */ true,
/* screenOnTimeInMs= */ 0,
/* foregroundUsageTimeInMs= */ 0,
+ /* foregroundServiceUsageTimeInMs= */ 0,
/* backgroundUsageTimeInMs= */ 0);
batteryDiffEntry.mConsumePower = 16;
batteryDiffEntry.setTotalConsumePower(100);
@@ -314,6 +317,7 @@
/* isSystem= */ true,
/* screenOnTimeInMs= */ 0,
/* foregroundUsageTimeInMs= */ 0,
+ /* foregroundServiceUsageTimeInMs= */ 0,
/* backgroundUsageTimeInMs= */ 0));
assertThat(pref.getSummary().toString().isEmpty()).isTrue();
}
@@ -329,6 +333,7 @@
/* isSystem= */ true,
/* screenOnTimeInMs= */ 0,
/* foregroundUsageTimeInMs= */ DateUtils.MINUTE_IN_MILLIS - 1,
+ /* foregroundServiceUsageTimeInMs= */ 0,
/* backgroundUsageTimeInMs= */ 0));
assertThat(pref.getSummary().toString()).isEqualTo("Total: less than a min");
}
@@ -344,6 +349,7 @@
/* isSystem= */ true,
/* screenOnTimeInMs= */ 0,
/* foregroundUsageTimeInMs= */ DateUtils.MINUTE_IN_MILLIS * 2,
+ /* foregroundServiceUsageTimeInMs= */ 0,
/* backgroundUsageTimeInMs= */ 0));
assertThat(pref.getSummary().toString()).isEqualTo("Total: 2 min");
}
@@ -359,6 +365,7 @@
/* isSystem= */ false,
/* screenOnTimeInMs= */ 0,
/* foregroundUsageTimeInMs= */ 0,
+ /* foregroundServiceUsageTimeInMs= */ 0,
/* backgroundUsageTimeInMs= */ 0));
assertThat(pref.getSummary().toString().isEmpty()).isTrue();
}
@@ -374,11 +381,28 @@
/* isSystem= */ false,
/* screenOnTimeInMs= */ 0,
/* foregroundUsageTimeInMs= */ 0,
+ /* foregroundServiceUsageTimeInMs= */ 0,
/* backgroundUsageTimeInMs= */ DateUtils.MINUTE_IN_MILLIS));
assertThat(pref.getSummary().toString()).isEqualTo("Background: 1 min");
}
@Test
+ public void setPreferenceSummary_appEntryWithFGSTime_expectedSummary() {
+ final PowerGaugePreference pref = new PowerGaugePreference(mContext);
+ pref.setSummary(PREF_SUMMARY);
+
+ mBatteryUsageBreakdownController.setPreferenceSummary(
+ pref,
+ createBatteryDiffEntry(
+ /* isSystem= */ false,
+ /* screenOnTimeInMs= */ 0,
+ /* foregroundUsageTimeInMs= */ 0,
+ /* foregroundServiceUsageTimeInMs= */ DateUtils.MINUTE_IN_MILLIS / 2,
+ /* backgroundUsageTimeInMs= */ DateUtils.MINUTE_IN_MILLIS / 2));
+ assertThat(pref.getSummary().toString()).isEqualTo("Background: 1 min");
+ }
+
+ @Test
public void setPreferenceSummary_appEntryScreenOnTimeOnly_expectedSummary() {
final PowerGaugePreference pref = new PowerGaugePreference(mContext);
pref.setSummary(PREF_SUMMARY);
@@ -389,6 +413,7 @@
/* isSystem= */ false,
/* screenOnTimeInMs= */ DateUtils.MINUTE_IN_MILLIS,
/* foregroundUsageTimeInMs= */ 0,
+ /* foregroundServiceUsageTimeInMs= */ 0,
/* backgroundUsageTimeInMs= */ 0));
assertThat(pref.getSummary().toString()).isEqualTo("Screen time: 1 min");
}
@@ -404,6 +429,7 @@
/* isSystem= */ false,
/* screenOnTimeInMs= */ DateUtils.MINUTE_IN_MILLIS - 1,
/* foregroundUsageTimeInMs= */ DateUtils.MINUTE_IN_MILLIS - 1,
+ /* foregroundServiceUsageTimeInMs= */ 0,
/* backgroundUsageTimeInMs= */ DateUtils.MINUTE_IN_MILLIS - 1));
assertThat(pref.getSummary().toString())
.isEqualTo("Screen time: less than a min\nBackground: less than a min");
@@ -413,6 +439,7 @@
boolean isSystem,
long screenOnTimeInMs,
long foregroundUsageTimeInMs,
+ long foregroundServiceUsageTimeInMs,
long backgroundUsageTimeInMs) {
final ContentValues contentValues = new ContentValues();
contentValues.put(
@@ -435,6 +462,7 @@
batteryHistEntry.mConsumerType,
foregroundUsageTimeInMs,
backgroundUsageTimeInMs,
+ foregroundServiceUsageTimeInMs,
screenOnTimeInMs,
/* consumePower= */ 0,
/* foregroundUsageConsumePower= */ 0,
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageContentProviderTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageContentProviderTest.java
index 95b950f..950f828 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageContentProviderTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageContentProviderTest.java
@@ -290,6 +290,7 @@
.setPercentOfTotal(0.9)
.setForegroundUsageTimeInMs(1000)
.setBackgroundUsageTimeInMs(2000)
+ .setForegroundServiceUsageTimeInMs(1500)
.setDrainType(1)
.build();
final String expectedBatteryInformationString =
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/ConvertUtilsTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/ConvertUtilsTest.java
index 672bc54..e68b892 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/ConvertUtilsTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/ConvertUtilsTest.java
@@ -92,6 +92,7 @@
mMockBatteryEntry.mPercent = 0.3;
when(mMockBatteryEntry.getTimeInForegroundMs()).thenReturn(1234L);
when(mMockBatteryEntry.getTimeInBackgroundMs()).thenReturn(5689L);
+ when(mMockBatteryEntry.getTimeInForegroundServiceMs()).thenReturn(3456L);
when(mMockBatteryEntry.getPowerComponentId()).thenReturn(-1);
when(mMockBatteryEntry.getConsumerType())
.thenReturn(ConvertUtils.CONSUMER_TYPE_UID_BATTERY);
@@ -133,6 +134,7 @@
assertThat(batteryInformation.getPercentOfTotal()).isEqualTo(0.3);
assertThat(batteryInformation.getForegroundUsageTimeInMs()).isEqualTo(1234L);
assertThat(batteryInformation.getBackgroundUsageTimeInMs()).isEqualTo(5689L);
+ assertThat(batteryInformation.getForegroundServiceUsageTimeInMs()).isEqualTo(3456L);
assertThat(batteryInformation.getDrainType()).isEqualTo(-1);
assertThat(deviceBatteryState.getBatteryLevel()).isEqualTo(12);
assertThat(deviceBatteryState.getBatteryStatus())
@@ -157,6 +159,7 @@
mMockBatteryEntry.mPercent = 0.3;
when(mMockBatteryEntry.getTimeInForegroundMs()).thenReturn(1234L);
when(mMockBatteryEntry.getTimeInBackgroundMs()).thenReturn(5689L);
+ when(mMockBatteryEntry.getTimeInForegroundServiceMs()).thenReturn(3456L);
when(mMockBatteryEntry.getConsumerType())
.thenReturn(ConvertUtils.CONSUMER_TYPE_SYSTEM_BATTERY);
@@ -196,6 +199,7 @@
assertThat(batteryInformation.getPercentOfTotal()).isEqualTo(0.3);
assertThat(batteryInformation.getForegroundUsageTimeInMs()).isEqualTo(1234L);
assertThat(batteryInformation.getBackgroundUsageTimeInMs()).isEqualTo(5689L);
+ assertThat(batteryInformation.getForegroundServiceUsageTimeInMs()).isEqualTo(3456L);
assertThat(batteryInformation.getDrainType())
.isEqualTo(BatteryConsumer.POWER_COMPONENT_CPU);
assertThat(deviceBatteryState.getBatteryLevel()).isEqualTo(12);
@@ -307,6 +311,7 @@
mMockBatteryEntry.mPercent = 0.3;
when(mMockBatteryEntry.getTimeInForegroundMs()).thenReturn(1234L);
when(mMockBatteryEntry.getTimeInBackgroundMs()).thenReturn(5689L);
+ when(mMockBatteryEntry.getTimeInForegroundServiceMs()).thenReturn(3456L);
when(mMockBatteryEntry.getPowerComponentId()).thenReturn(expectedType);
when(mMockBatteryEntry.getConsumerType())
.thenReturn(ConvertUtils.CONSUMER_TYPE_SYSTEM_BATTERY);
@@ -331,6 +336,7 @@
assertThat(batteryHistEntry.mPercentOfTotal).isEqualTo(0.3);
assertThat(batteryHistEntry.mForegroundUsageTimeInMs).isEqualTo(1234L);
assertThat(batteryHistEntry.mBackgroundUsageTimeInMs).isEqualTo(5689L);
+ assertThat(batteryHistEntry.mForegroundServiceUsageTimeInMs).isEqualTo(3456L);
assertThat(batteryHistEntry.mDrainType).isEqualTo(expectedType);
assertThat(batteryHistEntry.mConsumerType)
.isEqualTo(ConvertUtils.CONSUMER_TYPE_SYSTEM_BATTERY);
diff --git a/tests/screenshot/Android.bp b/tests/screenshot/Android.bp
index e20b5d3..5989381 100644
--- a/tests/screenshot/Android.bp
+++ b/tests/screenshot/Android.bp
@@ -29,42 +29,46 @@
"androidx.fragment_fragment",
"androidx.test.runner",
"androidx.test.core",
- ],
- uses_libs: ["org.apache.http.legacy"],
-
- aaptflags: ["--extra-packages com.android.settings"],
- manifest: "AndroidManifest.xml",
-}
-
-android_test {
- name: "SettingsScreenshotTests",
- platform_apis: true,
- certificate: "platform",
- test_suites: ["device-tests"],
- srcs: [
- "src/**/*.kt",
- ],
- static_libs: [
- "androidx.fragment_fragment-testing",
- "androidx.fragment_fragment",
"androidx.test.rules",
"androidx.test.ext.junit",
"platform-screenshot-diff-core",
"Settings-testutils2",
- "androidx.test.core",
"androidx.test.espresso.core",
"kotlinx-coroutines-android",
"androidx.lifecycle_lifecycle-runtime-testing",
"kotlinx_coroutines_test",
- "Settings-core",
- "androidx.test.runner",
],
uses_libs: ["org.apache.http.legacy"],
- compile_multilib: "both",
+ aaptflags: ["--extra-packages com.android.settings"],
manifest: "AndroidManifest.xml",
- test_config: "AndroidTest.xml",
- use_embedded_native_libs: false,
- asset_dirs: ["assets"],
+}
+
+// This is a RNG (Robolectric native graphics) test target.
+android_robolectric_test {
+ name: "SettingsScreenshotRNGTests",
+ srcs: [
+ "src/**/*.kt",
+ ],
+ test_suites: ["general-tests"],
+
+ // Do not add any libraries here, instead add them to the ScreenshotTestStub
+ static_libs: [
+ "androidx.compose.runtime_runtime",
+ "androidx.test.uiautomator_uiautomator",
+ "androidx.test.ext.junit",
+ "inline-mockito-robolectric-prebuilt",
+ "platform-parametric-runner-lib",
+ "uiautomator-helpers",
+
+ ],
+ libs: [
+ "android.test.runner",
+ "android.test.base",
+ "android.test.mock",
+ "truth",
+ ],
+
+ upstream: true,
instrumentation_for: "ScreenshotTestStub",
- data: [":ScreenshotTestStub"],
+ java_resource_dirs: ["config"],
}
diff --git a/tests/screenshot/AndroidManifest.xml b/tests/screenshot/AndroidManifest.xml
index 9cbc882..6c8bb88 100644
--- a/tests/screenshot/AndroidManifest.xml
+++ b/tests/screenshot/AndroidManifest.xml
@@ -16,32 +16,13 @@
-->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:tools="http://schemas.android.com/tools"
- package="com.android.settings.tests.screenshot"
- >
-
- <application android:debuggable="true">
- <provider
- android:name="com.android.settings.slices.SettingsSliceProvider"
- android:authorities="com.android.settings.tests.screenshot.disabled"
- android:enabled="false"
- tools:node="remove"
- tools:replace="android:authorities" />
-
- </application>
-
- <uses-permission android:name="android.permission.PACKAGE_USAGE_STATS" />
- <uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS" />
- <uses-permission android:name="android.permission.READ_LOGS" />
- <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
- <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
- <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
- <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
+ xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"
+ coreApp="true"
+ package="com.android.settings">
<uses-permission android:name="android.permission.READ_DEVICE_CONFIG" />
- <instrumentation
- android:name="androidx.test.runner.AndroidJUnitRunner"
- android:label="Android Settings Screenshot tests"
- android:targetPackage="com.android.settings.tests.screenshot" />
+ <application>
+ <activity android:name="com.android.settings.test.screenshot.ContainerActivity" android:exported="true" />
+ </application>
-</manifest>
+</manifest>
\ No newline at end of file
diff --git a/tests/screenshot/AndroidTest.xml b/tests/screenshot/AndroidTest.xml
deleted file mode 100644
index 7496ffd..0000000
--- a/tests/screenshot/AndroidTest.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<!--
- ~ Copyright (C) 2023 The Android Open Source Project
- ~
- ~ Licensed under the Apache License, Version 2.0 (the "License");
- ~ you may not use this file except in compliance with the License.
- ~ You may obtain a copy of the License at
- ~
- ~ http://www.apache.org/licenses/LICENSE-2.0
- ~
- ~ Unless required by applicable law or agreed to in writing, software
- ~ distributed under the License is distributed on an "AS IS" BASIS,
- ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ~ See the License for the specific language governing permissions and
- ~ limitations under the License.
- -->
-
-<configuration description="Runs settings screendiff tests.">
- <option name="test-suite-tag" value="apct-instrumentation" />
- <option name="test-suite-tag" value="apct" />
- <target_preparer class="com.android.tradefed.targetprep.DeviceSetup">
- <option name="optimized-property-setting" value="true" />
- </target_preparer>
- <target_preparer class="com.android.tradefed.targetprep.suite.SuiteApkInstaller">
- <option name="cleanup-apks" value="true" />
- <option name="test-file-name" value="SettingsScreenshotTests.apk" />
- </target_preparer>
- <metrics_collector class="com.android.tradefed.device.metric.FilePullerLogCollector">
- <option name="directory-keys"
- value="/data/user/0/com.android.settings.tests.screenshot/" />
- <option name="collect-on-run-ended-only" value="true" />
- </metrics_collector>
- <test class="com.android.tradefed.testtype.AndroidJUnitTest">
- <option name="package" value="com.android.settings.tests.screenshot" />
- <option name="runner" value="androidx.test.runner.AndroidJUnitRunner" />
- </test>
-</configuration>
diff --git "a/tests/screenshot/assets/pixel_4a_\0505g\051/fp_enroll_intro.png" "b/tests/screenshot/assets/pixel_4a_\0505g\051/fp_enroll_intro.png"
deleted file mode 100644
index 1129250..0000000
--- "a/tests/screenshot/assets/pixel_4a_\0505g\051/fp_enroll_intro.png"
+++ /dev/null
Binary files differ
diff --git a/tests/screenshot/assets/robolectric/fp_enroll_intro.png b/tests/screenshot/assets/robolectric/fp_enroll_intro.png
new file mode 100644
index 0000000..308ab55
--- /dev/null
+++ b/tests/screenshot/assets/robolectric/fp_enroll_intro.png
Binary files differ
diff --git a/tests/screenshot/config/robolectric.properties b/tests/screenshot/config/robolectric.properties
new file mode 100644
index 0000000..88443e3
--- /dev/null
+++ b/tests/screenshot/config/robolectric.properties
@@ -0,0 +1,16 @@
+# Copyright (C) 2023 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+sdk=NEWEST_SDK
+graphicsMode=NATIVE
\ No newline at end of file
diff --git a/tests/screenshot/src/com/android/settings/tests/screenshot/ContainerActivity.kt b/tests/screenshot/src/com/android/settings/tests/screenshot/ContainerActivity.kt
new file mode 100644
index 0000000..a505ef5
--- /dev/null
+++ b/tests/screenshot/src/com/android/settings/tests/screenshot/ContainerActivity.kt
@@ -0,0 +1,37 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.tests.screenshot
+
+import android.os.Bundle
+import androidx.fragment.app.FragmentActivity
+import androidx.fragment.app.FragmentContainerView
+
+/**
+ * This activity is a container for all RNG (Robolectric Native Graphic) Settings screenshot tests.
+ */
+class ContainerActivity : FragmentActivity() {
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ val contentView = FragmentContainerView(this)
+ contentView.setId(CONTAINER_VIEW_ID)
+ setContentView(contentView)
+ }
+
+ companion object {
+ const val CONTAINER_VIEW_ID = 1234
+ }
+}
\ No newline at end of file
diff --git a/tests/spa_unit/src/com/android/settings/network/SubscriptionInfoListViewModelTest.kt b/tests/spa_unit/src/com/android/settings/network/SubscriptionInfoListViewModelTest.kt
new file mode 100644
index 0000000..020a470
--- /dev/null
+++ b/tests/spa_unit/src/com/android/settings/network/SubscriptionInfoListViewModelTest.kt
@@ -0,0 +1,153 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.network
+
+import android.telephony.SubscriptionManager.PROFILE_CLASS_PROVISIONING
+
+import android.app.Application
+import android.content.Context
+import android.platform.test.flag.junit.SetFlagsRule
+import android.telephony.SubscriptionInfo
+import android.telephony.SubscriptionManager
+import android.telephony.TelephonyCallback
+import android.telephony.TelephonyManager
+import androidx.test.core.app.ApplicationProvider
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import com.android.internal.telephony.flags.Flags
+import com.android.settings.network.telephony.CallStateFlowTest
+import com.android.settingslib.spa.testutils.toListWithTimeout
+import com.google.common.truth.Truth.assertThat
+import kotlinx.coroutines.async
+import kotlinx.coroutines.delay
+import kotlinx.coroutines.runBlocking
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mockito.kotlin.any
+import org.mockito.kotlin.doAnswer
+import org.mockito.kotlin.doReturn
+import org.mockito.kotlin.mock
+import org.mockito.kotlin.spy
+import org.mockito.kotlin.stub
+
+@RunWith(AndroidJUnit4::class)
+class SubscriptionInfoListViewModelTest {
+ @get:Rule
+ val mSetFlagsRule = SetFlagsRule()
+ private var subInfoListener: SubscriptionManager.OnSubscriptionsChangedListener? = null
+ private val mockSubscriptionManager = mock<SubscriptionManager> {
+ on { activeSubscriptionInfoList } doAnswer { activeSubscriptionInfoList }
+ on { addOnSubscriptionsChangedListener(any(), any()) } doAnswer {
+ subInfoListener =
+ it.arguments[1] as SubscriptionManager.OnSubscriptionsChangedListener
+ subInfoListener?.onSubscriptionsChanged()
+ }
+ }
+
+ private val context: Context = spy(ApplicationProvider.getApplicationContext()) {
+ on { getSystemService(SubscriptionManager::class.java) } doReturn mockSubscriptionManager
+ }
+
+ private val subscriptionInfoListViewModel: SubscriptionInfoListViewModel =
+ SubscriptionInfoListViewModel(context as Application);
+
+ private var activeSubscriptionInfoList: List<SubscriptionInfo>? = null
+
+ @Test
+ fun onSubscriptionsChanged_noProvisioning_resultSameAsInput() = runBlocking {
+ activeSubscriptionInfoList = listOf(SUB_INFO_1, SUB_INFO_2)
+
+ val listDeferred = async {
+ subscriptionInfoListViewModel.subscriptionInfoListFlow.toListWithTimeout()
+ }
+ delay(100)
+ subInfoListener?.onSubscriptionsChanged()
+
+ assertThat(listDeferred.await()).contains(activeSubscriptionInfoList)
+ }
+
+ @Test
+ fun onSubscriptionsChanged_hasProvisioning_filterProvisioning() = runBlocking {
+ activeSubscriptionInfoList = listOf(SUB_INFO_1, SUB_INFO_2, SUB_INFO_3)
+ val expectation = listOf(SUB_INFO_1, SUB_INFO_2)
+
+ val listDeferred = async {
+ subscriptionInfoListViewModel.subscriptionInfoListFlow.toListWithTimeout()
+ }
+ delay(100)
+ subInfoListener?.onSubscriptionsChanged()
+
+ assertThat(listDeferred.await()).contains(expectation)
+ }
+
+ @Test
+ fun onSubscriptionsChanged_flagOffHasNonTerrestrialNetwork_filterNonTerrestrialNetwork() =
+ runBlocking {
+ mSetFlagsRule.disableFlags(Flags.FLAG_OEM_ENABLED_SATELLITE_FLAG)
+
+ activeSubscriptionInfoList = listOf(SUB_INFO_1, SUB_INFO_2, SUB_INFO_4)
+ val expectation = listOf(SUB_INFO_1, SUB_INFO_2, SUB_INFO_4)
+
+ val listDeferred = async {
+ subscriptionInfoListViewModel.subscriptionInfoListFlow.toListWithTimeout()
+ }
+ delay(100)
+ subInfoListener?.onSubscriptionsChanged()
+
+ assertThat(listDeferred.await()).contains(expectation)
+ }
+
+ @Test
+ fun onSubscriptionsChanged_flagOnHasNonTerrestrialNetwork_filterNonTerrestrialNetwork() =
+ runBlocking {
+ mSetFlagsRule.enableFlags(Flags.FLAG_OEM_ENABLED_SATELLITE_FLAG)
+
+ activeSubscriptionInfoList = listOf(SUB_INFO_1, SUB_INFO_2, SUB_INFO_4)
+ val expectation = listOf(SUB_INFO_1, SUB_INFO_2)
+
+ val listDeferred = async {
+ subscriptionInfoListViewModel.subscriptionInfoListFlow.toListWithTimeout()
+ }
+ delay(100)
+ subInfoListener?.onSubscriptionsChanged()
+
+ assertThat(listDeferred.await()).contains(expectation)
+ }
+
+ private companion object {
+ val SUB_INFO_1: SubscriptionInfo = SubscriptionInfo.Builder().apply {
+ setId(1)
+ }.build()
+
+ val SUB_INFO_2: SubscriptionInfo = SubscriptionInfo.Builder().apply {
+ setId(2)
+ }.build()
+
+ val SUB_INFO_3: SubscriptionInfo = SubscriptionInfo.Builder().apply {
+ setId(3)
+ setEmbedded(true)
+ setProfileClass(PROFILE_CLASS_PROVISIONING)
+ setOnlyNonTerrestrialNetwork(false)
+ }.build()
+
+ val SUB_INFO_4: SubscriptionInfo = SubscriptionInfo.Builder().apply {
+ setId(4)
+ setEmbedded(true)
+ setOnlyNonTerrestrialNetwork(true)
+ }.build()
+ }
+}
\ No newline at end of file
diff --git a/tests/unit/src/com/android/settings/development/BackAnimationPreferenceControllerTest.java b/tests/unit/src/com/android/settings/development/BackAnimationPreferenceControllerTest.java
index 3669358..dc4f56a 100644
--- a/tests/unit/src/com/android/settings/development/BackAnimationPreferenceControllerTest.java
+++ b/tests/unit/src/com/android/settings/development/BackAnimationPreferenceControllerTest.java
@@ -29,6 +29,10 @@
import android.os.Handler;
import android.os.Looper;
import android.os.UserHandle;
+import android.platform.test.annotations.RequiresFlagsDisabled;
+import android.platform.test.annotations.RequiresFlagsEnabled;
+import android.platform.test.flag.junit.CheckFlagsRule;
+import android.platform.test.flag.junit.DeviceFlagsValueProvider;
import android.provider.Settings;
import androidx.preference.PreferenceManager;
@@ -37,8 +41,11 @@
import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.platform.app.InstrumentationRegistry;
+import com.android.window.flags.Flags;
+
import org.junit.Assert;
import org.junit.Before;
+import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.MockitoAnnotations;
@@ -58,6 +65,9 @@
private BackAnimationPreferenceController mController;
private Looper mLooper;
+ @Rule
+ public final CheckFlagsRule mCheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule();
+
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
@@ -81,6 +91,18 @@
}
@Test
+ @RequiresFlagsEnabled(Flags.FLAG_PREDICTIVE_BACK_SYSTEM_ANIMATIONS)
+ public void controllerNotAvailable_whenAconfigFlagEnabled() {
+ assertFalse(mController.isAvailable());
+ }
+
+ @Test
+ @RequiresFlagsDisabled(Flags.FLAG_PREDICTIVE_BACK_SYSTEM_ANIMATIONS)
+ public void controllerAvailable_whenAconfigFlagDisabled() {
+ assertTrue(mController.isAvailable());
+ }
+
+ @Test
public void onPreferenceChange_switchEnabled_shouldEnableBackAnimations() {
mController.onPreferenceChange(mPreference, true /* new value */);
diff --git a/tests/unit/src/com/android/settings/privatespace/PrivateSpaceMaintainerTest.java b/tests/unit/src/com/android/settings/privatespace/PrivateSpaceMaintainerTest.java
index 0a2f3d1..1d27326 100644
--- a/tests/unit/src/com/android/settings/privatespace/PrivateSpaceMaintainerTest.java
+++ b/tests/unit/src/com/android/settings/privatespace/PrivateSpaceMaintainerTest.java
@@ -21,8 +21,11 @@
import static com.google.common.truth.Truth.assertThat;
+import android.app.ActivityManager;
+import android.app.IActivityManager;
import android.content.ContentResolver;
import android.content.Context;
+import android.os.RemoteException;
import android.provider.Settings;
import androidx.test.core.app.ApplicationProvider;
@@ -30,6 +33,8 @@
import com.android.settings.privatespace.PrivateSpaceMaintainer.ErrorDeletingPrivateSpace;
+import org.junit.After;
+import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -37,6 +42,7 @@
@RunWith(AndroidJUnit4.class)
public class PrivateSpaceMaintainerTest {
+ private static final String TAG = "PSMaintainerTest";
private Context mContext;
private ContentResolver mContentResolver;
@@ -48,6 +54,13 @@
mContentResolver = mContext.getContentResolver();
}
+ @After
+ public void tearDown() {
+ PrivateSpaceMaintainer privateSpaceMaintainer =
+ PrivateSpaceMaintainer.getInstance(mContext);
+ privateSpaceMaintainer.deletePrivateSpace();
+ }
+
/** Tests that {@link PrivateSpaceMaintainer#deletePrivateSpace()} deletes PS when PS exists. */
@Test
public void deletePrivateSpace_psExists_deletesPS() {
@@ -137,4 +150,52 @@
assertThat(privateSpaceMaintainer.getHidePrivateSpaceEntryPointSetting())
.isEqualTo(HIDE_PRIVATE_SPACE_ENTRY_POINT_ENABLED_VAL);
}
+
+ /**
+ * Tests that {@link PrivateSpaceMaintainer#lockPrivateSpace()} when PS exists and is running
+ * locks the private profile.
+ */
+ @Test
+ public void lockPrivateSpace_psExistsAndPrivateProfileRunning_locksCreatedPrivateSpace() {
+ PrivateSpaceMaintainer privateSpaceMaintainer =
+ PrivateSpaceMaintainer.getInstance(mContext);
+ privateSpaceMaintainer.createPrivateSpace();
+ assertThat(privateSpaceMaintainer.doesPrivateSpaceExist()).isTrue();
+ assertThat(privateSpaceMaintainer.isPrivateProfileRunning()).isTrue();
+ assertThat(privateSpaceMaintainer.isPrivateSpaceLocked()).isFalse();
+ assertThat(privateSpaceMaintainer.lockPrivateSpace()).isTrue();
+ assertThat(privateSpaceMaintainer.isPrivateSpaceLocked()).isTrue();
+ }
+
+ /**
+ * Tests that {@link PrivateSpaceMaintainer#lockPrivateSpace()} when PS exist and private
+ * profile not running returns false.
+ */
+ @Test
+ public void lockPrivateSpace_psExistsAndPrivateProfileNotRunning_returnsFalse() {
+ PrivateSpaceMaintainer privateSpaceMaintainer =
+ PrivateSpaceMaintainer.getInstance(mContext);
+ privateSpaceMaintainer.createPrivateSpace();
+ assertThat(privateSpaceMaintainer.doesPrivateSpaceExist()).isTrue();
+ assertThat(privateSpaceMaintainer.isPrivateProfileRunning()).isTrue();
+ IActivityManager am = ActivityManager.getService();
+ try {
+ am.stopProfile(privateSpaceMaintainer.getPrivateProfileHandle().getIdentifier());
+ } catch (RemoteException e) {
+ Assert.fail("Stop profile failed with exception " + e.getMessage());
+ }
+ assertThat(privateSpaceMaintainer.isPrivateProfileRunning()).isFalse();
+ assertThat(privateSpaceMaintainer.lockPrivateSpace()).isFalse();
+ }
+
+ /**
+ * Tests that {@link PrivateSpaceMaintainer#lockPrivateSpace()} when no PS exists returns false.
+ */
+ @Test
+ public void lockPrivateSpace_psDoesNotExist_returnsFalse() {
+ PrivateSpaceMaintainer privateSpaceMaintainer =
+ PrivateSpaceMaintainer.getInstance(mContext);
+ assertThat(privateSpaceMaintainer.doesPrivateSpaceExist()).isFalse();
+ assertThat(privateSpaceMaintainer.lockPrivateSpace()).isFalse();
+ }
}