Merge "Update and expose ModemActivityInfo"

This commit is contained in:
Sarah Chin
2021-09-07 21:57:26 +00:00
committed by Gerrit Code Review
6 changed files with 245 additions and 170 deletions

View File

@@ -9671,6 +9671,25 @@ package android.telephony {
field public static final String MBMS_STREAMING_SERVICE_ACTION = "android.telephony.action.EmbmsStreaming";
}
public final class ModemActivityInfo implements android.os.Parcelable {
method public int describeContents();
method @NonNull public android.telephony.ModemActivityInfo getDelta(@NonNull android.telephony.ModemActivityInfo);
method public long getIdleTimeMillis();
method public static int getNumTxPowerLevels();
method public long getReceiveTimeMillis();
method public long getSleepTimeMillis();
method public long getTimestampMillis();
method public long getTransmitDurationMillisAtPowerLevel(int);
method @NonNull public android.util.Range<java.lang.Integer> getTransmitPowerRange(int);
method public void writeToParcel(@NonNull android.os.Parcel, int);
field @NonNull public static final android.os.Parcelable.Creator<android.telephony.ModemActivityInfo> CREATOR;
field public static final int TX_POWER_LEVEL_0 = 0; // 0x0
field public static final int TX_POWER_LEVEL_1 = 1; // 0x1
field public static final int TX_POWER_LEVEL_2 = 2; // 0x2
field public static final int TX_POWER_LEVEL_3 = 3; // 0x3
field public static final int TX_POWER_LEVEL_4 = 4; // 0x4
}
public final class NetworkRegistrationInfo implements android.os.Parcelable {
method @Nullable public android.telephony.DataSpecificRegistrationInfo getDataSpecificInfo();
method public int getRegistrationState();

View File

@@ -1649,6 +1649,27 @@ package android.telephony {
field public static final String MBMS_STREAMING_SERVICE_OVERRIDE_METADATA = "mbms-streaming-service-override";
}
public final class ModemActivityInfo implements android.os.Parcelable {
ctor public ModemActivityInfo(long, int, int, @NonNull int[], int);
method public int describeContents();
method @NonNull public android.telephony.ModemActivityInfo getDelta(@NonNull android.telephony.ModemActivityInfo);
method public long getIdleTimeMillis();
method public static int getNumTxPowerLevels();
method public long getReceiveTimeMillis();
method public long getSleepTimeMillis();
method public long getTimestampMillis();
method public long getTransmitDurationMillisAtPowerLevel(int);
method @NonNull public android.util.Range<java.lang.Integer> getTransmitPowerRange(int);
method public boolean isValid();
method public void writeToParcel(@NonNull android.os.Parcel, int);
field @NonNull public static final android.os.Parcelable.Creator<android.telephony.ModemActivityInfo> CREATOR;
field public static final int TX_POWER_LEVEL_0 = 0; // 0x0
field public static final int TX_POWER_LEVEL_1 = 1; // 0x1
field public static final int TX_POWER_LEVEL_2 = 2; // 0x2
field public static final int TX_POWER_LEVEL_3 = 3; // 0x3
field public static final int TX_POWER_LEVEL_4 = 4; // 0x4
}
public class PhoneNumberUtils {
method public static int getMinMatchForTest();
method public static void setMinMatchForTest(int);

View File

@@ -109,7 +109,7 @@ public final class CellularBatteryStats implements Parcelable {
CellSignalStrength.getNumSignalStrengthLevels()));
mTxTimeMs = Arrays.copyOfRange(
txTimeMs, 0,
Math.min(txTimeMs.length, ModemActivityInfo.TX_POWER_LEVELS));
Math.min(txTimeMs.length, ModemActivityInfo.getNumTxPowerLevels()));
mMonitoredRailChargeConsumedMaMs = monitoredRailChargeConsumedMaMs;
}

View File

@@ -66,7 +66,6 @@ import android.provider.Settings;
import android.telephony.CellSignalStrength;
import android.telephony.DataConnectionRealTimeInfo;
import android.telephony.ModemActivityInfo;
import android.telephony.ModemActivityInfo.TransmitPower;
import android.telephony.ServiceState;
import android.telephony.SignalStrength;
import android.telephony.TelephonyManager;
@@ -7205,7 +7204,7 @@ public class BatteryStatsImpl extends BatteryStats {
public ControllerActivityCounterImpl getOrCreateModemControllerActivityLocked() {
if (mModemControllerActivity == null) {
mModemControllerActivity = new ControllerActivityCounterImpl(mBsi.mOnBatteryTimeBase,
ModemActivityInfo.TX_POWER_LEVELS);
ModemActivityInfo.getNumTxPowerLevels());
}
return mModemControllerActivity;
}
@@ -8687,7 +8686,7 @@ public class BatteryStatsImpl extends BatteryStats {
if (in.readInt() != 0) {
mModemControllerActivity = new ControllerActivityCounterImpl(mBsi.mOnBatteryTimeBase,
ModemActivityInfo.TX_POWER_LEVELS, in);
ModemActivityInfo.getNumTxPowerLevels(), in);
} else {
mModemControllerActivity = null;
}
@@ -9953,7 +9952,7 @@ public class BatteryStatsImpl extends BatteryStats {
mBluetoothActivity = new ControllerActivityCounterImpl(mOnBatteryTimeBase,
NUM_BT_TX_LEVELS);
mModemActivity = new ControllerActivityCounterImpl(mOnBatteryTimeBase,
ModemActivityInfo.TX_POWER_LEVELS);
ModemActivityInfo.getNumTxPowerLevels());
mMobileRadioActiveTimer = new StopwatchTimer(mClocks, null, -400, null, mOnBatteryTimeBase);
mMobileRadioActivePerAppTimer = new StopwatchTimer(mClocks, null, -401, null,
mOnBatteryTimeBase);
@@ -11131,26 +11130,7 @@ public class BatteryStatsImpl extends BatteryStats {
}
}
private ModemActivityInfo mLastModemActivityInfo =
new ModemActivityInfo(0, 0, 0, new int[0], 0);
private ModemActivityInfo getDeltaModemActivityInfo(ModemActivityInfo activityInfo) {
if (activityInfo == null) {
return null;
}
int[] txTimeMs = new int[ModemActivityInfo.TX_POWER_LEVELS];
for (int i = 0; i < ModemActivityInfo.TX_POWER_LEVELS; i++) {
txTimeMs[i] = activityInfo.getTransmitPowerInfo().get(i).getTimeInMillis()
- mLastModemActivityInfo.getTransmitPowerInfo().get(i).getTimeInMillis();
}
ModemActivityInfo deltaInfo = new ModemActivityInfo(activityInfo.getTimestamp(),
activityInfo.getSleepTimeMillis() - mLastModemActivityInfo.getSleepTimeMillis(),
activityInfo.getIdleTimeMillis() - mLastModemActivityInfo.getIdleTimeMillis(),
txTimeMs,
activityInfo.getReceiveTimeMillis() - mLastModemActivityInfo.getReceiveTimeMillis());
mLastModemActivityInfo = activityInfo;
return deltaInfo;
}
private ModemActivityInfo mLastModemActivityInfo = null;
/**
* Distribute Cell radio energy info and network traffic to apps.
@@ -11159,7 +11139,9 @@ public class BatteryStatsImpl extends BatteryStats {
if (DEBUG_ENERGY) {
Slog.d(TAG, "Updating mobile radio stats with " + activityInfo);
}
ModemActivityInfo deltaInfo = getDeltaModemActivityInfo(activityInfo);
ModemActivityInfo deltaInfo = mLastModemActivityInfo == null ? activityInfo
: mLastModemActivityInfo.getDelta(activityInfo);
mLastModemActivityInfo = activityInfo;
// Add modem tx power to history.
addModemTxPowerToHistory(deltaInfo);
@@ -11191,10 +11173,9 @@ public class BatteryStatsImpl extends BatteryStats {
mModemActivity.getSleepTimeCounter().addCountLocked(
deltaInfo.getSleepTimeMillis());
mModemActivity.getRxTimeCounter().addCountLocked(deltaInfo.getReceiveTimeMillis());
for (int lvl = 0; lvl < ModemActivityInfo.TX_POWER_LEVELS; lvl++) {
for (int lvl = 0; lvl < ModemActivityInfo.getNumTxPowerLevels(); lvl++) {
mModemActivity.getTxTimeCounters()[lvl]
.addCountLocked(deltaInfo.getTransmitPowerInfo()
.get(lvl).getTimeInMillis());
.addCountLocked(deltaInfo.getTransmitDurationMillisAtPowerLevel(lvl));
}
// POWER_MODEM_CONTROLLER_OPERATING_VOLTAGE is measured in mV, so convert to V.
@@ -11208,11 +11189,11 @@ public class BatteryStatsImpl extends BatteryStats {
mPowerProfile.getAveragePower(PowerProfile.POWER_MODEM_CONTROLLER_IDLE)
+ deltaInfo.getReceiveTimeMillis() *
mPowerProfile.getAveragePower(PowerProfile.POWER_MODEM_CONTROLLER_RX);
List<TransmitPower> txPowerInfo = deltaInfo.getTransmitPowerInfo();
for (int i = 0; i < Math.min(txPowerInfo.size(),
for (int i = 0; i < Math.min(ModemActivityInfo.getNumTxPowerLevels(),
CellSignalStrength.getNumSignalStrengthLevels()); i++) {
energyUsed += txPowerInfo.get(i).getTimeInMillis() * mPowerProfile
.getAveragePower(PowerProfile.POWER_MODEM_CONTROLLER_TX, i);
energyUsed += deltaInfo.getTransmitDurationMillisAtPowerLevel(i)
* mPowerProfile.getAveragePower(
PowerProfile.POWER_MODEM_CONTROLLER_TX, i);
}
// We store the power drain as mAms.
@@ -11307,10 +11288,10 @@ public class BatteryStatsImpl extends BatteryStats {
}
if (totalTxPackets > 0 && entry.txPackets > 0) {
for (int lvl = 0; lvl < ModemActivityInfo.TX_POWER_LEVELS; lvl++) {
long txMs =
entry.txPackets * deltaInfo.getTransmitPowerInfo()
.get(lvl).getTimeInMillis();
for (int lvl = 0; lvl < ModemActivityInfo.getNumTxPowerLevels();
lvl++) {
long txMs = entry.txPackets
* deltaInfo.getTransmitDurationMillisAtPowerLevel(lvl);
txMs /= totalTxPackets;
activityCounter.getTxTimeCounters()[lvl].addCountLocked(txMs);
}
@@ -11341,20 +11322,16 @@ public class BatteryStatsImpl extends BatteryStats {
if (activityInfo == null) {
return;
}
List<TransmitPower> txPowerInfo = activityInfo.getTransmitPowerInfo();
if (txPowerInfo == null || txPowerInfo.size() != ModemActivityInfo.TX_POWER_LEVELS) {
return;
}
final long elapsedRealtime = mClocks.elapsedRealtime();
final long uptime = mClocks.uptimeMillis();
int levelMaxTimeSpent = 0;
for (int i = 1; i < txPowerInfo.size(); i++) {
if (txPowerInfo.get(i).getTimeInMillis() > txPowerInfo.get(levelMaxTimeSpent)
.getTimeInMillis()) {
for (int i = 1; i < ModemActivityInfo.getNumTxPowerLevels(); i++) {
if (activityInfo.getTransmitDurationMillisAtPowerLevel(i)
> activityInfo.getTransmitDurationMillisAtPowerLevel(levelMaxTimeSpent)) {
levelMaxTimeSpent = i;
}
}
if (levelMaxTimeSpent == ModemActivityInfo.TX_POWER_LEVELS - 1) {
if (levelMaxTimeSpent == ModemActivityInfo.getNumTxPowerLevels() - 1) {
mHistoryCur.states2 |= HistoryItem.STATE2_CELLULAR_HIGH_TX_POWER_FLAG;
addHistoryRecordLocked(elapsedRealtime, uptime);
}
@@ -12771,7 +12748,7 @@ public class BatteryStatsImpl extends BatteryStats {
timeInRxSignalStrengthLevelMs[i]
= getPhoneSignalStrengthTime(i, rawRealTime, which) / 1000;
}
long[] txTimeMs = new long[Math.min(ModemActivityInfo.TX_POWER_LEVELS,
long[] txTimeMs = new long[Math.min(ModemActivityInfo.getNumTxPowerLevels(),
counter.getTxTimeCounters().length)];
long totalTxTimeMs = 0;
for (int i = 0; i < txTimeMs.length; i++) {
@@ -14817,7 +14794,7 @@ public class BatteryStatsImpl extends BatteryStats {
mBluetoothActivity = new ControllerActivityCounterImpl(mOnBatteryTimeBase,
NUM_BT_TX_LEVELS, in);
mModemActivity = new ControllerActivityCounterImpl(mOnBatteryTimeBase,
ModemActivityInfo.TX_POWER_LEVELS, in);
ModemActivityInfo.getNumTxPowerLevels(), in);
mHasWifiReporting = in.readInt() != 0;
mHasBluetoothReporting = in.readInt() != 0;
mHasModemReporting = in.readInt() != 0;

View File

@@ -1739,14 +1739,14 @@ public class StatsPullAtomService extends SystemService {
}
StatsEvent e = StatsEvent.newBuilder()
.setAtomId(atomTag)
.writeLong(modemInfo.getTimestamp())
.writeLong(modemInfo.getTimestampMillis())
.writeLong(modemInfo.getSleepTimeMillis())
.writeLong(modemInfo.getIdleTimeMillis())
.writeLong(modemInfo.getTransmitPowerInfo().get(0).getTimeInMillis())
.writeLong(modemInfo.getTransmitPowerInfo().get(1).getTimeInMillis())
.writeLong(modemInfo.getTransmitPowerInfo().get(2).getTimeInMillis())
.writeLong(modemInfo.getTransmitPowerInfo().get(3).getTimeInMillis())
.writeLong(modemInfo.getTransmitPowerInfo().get(4).getTimeInMillis())
.writeLong(modemInfo.getTransmitDurationMillisAtPowerLevel(0))
.writeLong(modemInfo.getTransmitDurationMillisAtPowerLevel(1))
.writeLong(modemInfo.getTransmitDurationMillisAtPowerLevel(2))
.writeLong(modemInfo.getTransmitDurationMillisAtPowerLevel(3))
.writeLong(modemInfo.getTransmitDurationMillisAtPowerLevel(4))
.writeLong(modemInfo.getReceiveTimeMillis())
.build();
pulledData.add(e);

View File

@@ -16,8 +16,12 @@
package android.telephony;
import android.annotation.DurationMillisLong;
import android.annotation.ElapsedRealtimeLong;
import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.SystemApi;
import android.annotation.TestApi;
import android.os.Parcel;
import android.os.Parcelable;
import android.os.SystemClock;
@@ -25,46 +29,50 @@ import android.util.Range;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.ArrayList;
import java.util.List;
import java.util.Arrays;
import java.util.Objects;
/**
* Reports modem activity information.
* Contains information about the modem's activity. May be useful for power stats reporting.
* @hide
*/
@SystemApi
@TestApi
public final class ModemActivityInfo implements Parcelable {
private static final int TX_POWER_LEVELS = 5;
/**
* Tx(transmit) power level. see power index below
* <ul>
* <li> index 0 = tx_power < 0dBm. </li>
* <li> index 1 = 0dBm < tx_power < 5dBm. </li>
* <li> index 2 = 5dBm < tx_power < 15dBm. </li>
* <li> index 3 = 15dBm < tx_power < 20dBm. </li>
* <li> index 4 = tx_power > 20dBm. </li>
* </ul>
*/
public static final int TX_POWER_LEVELS = 5;
/**
* Tx(transmit) power level 0: tx_power < 0dBm
* Corresponds to transmit power of less than 0dBm.
*/
public static final int TX_POWER_LEVEL_0 = 0;
/**
* Tx(transmit) power level 1: 0dBm < tx_power < 5dBm
* Corresponds to transmit power between 0dBm and 5dBm.
*/
public static final int TX_POWER_LEVEL_1 = 1;
/**
* Tx(transmit) power level 2: 5dBm < tx_power < 15dBm
* Corresponds to transmit power between 5dBm and 15dBm.
*/
public static final int TX_POWER_LEVEL_2 = 2;
/**
* Tx(transmit) power level 3: 15dBm < tx_power < 20dBm.
* Corresponds to transmit power between 15dBm and 20dBm.
*/
public static final int TX_POWER_LEVEL_3 = 3;
/**
* Tx(transmit) power level 4: tx_power > 20dBm
* Corresponds to transmit power above 20dBm.
*/
public static final int TX_POWER_LEVEL_4 = 4;
/**
* The number of transmit power levels. Fixed by HAL definition.
*/
public static int getNumTxPowerLevels() {
return TX_POWER_LEVELS;
}
/** @hide */
@IntDef(prefix = {"TX_POWER_LEVEL_"}, value = {
TX_POWER_LEVEL_0,
@@ -82,34 +90,39 @@ public final class ModemActivityInfo implements Parcelable {
new Range<>(5, 15),
new Range<>(15, 20),
new Range<>(20, Integer.MAX_VALUE)
};
private long mTimestamp;
private int mSleepTimeMs;
private int mIdleTimeMs;
private List<TransmitPower> mTransmitPowerInfo = new ArrayList<>(TX_POWER_LEVELS);
private int[] mTxTimeMs;
private int mRxTimeMs;
/**
* @hide
*/
@TestApi
public ModemActivityInfo(long timestamp, int sleepTimeMs, int idleTimeMs,
@NonNull int[] txTimeMs, int rxTimeMs) {
Objects.requireNonNull(txTimeMs);
if (txTimeMs.length != TX_POWER_LEVELS) {
throw new IllegalArgumentException("txTimeMs must have length == TX_POWER_LEVELS");
}
mTimestamp = timestamp;
mSleepTimeMs = sleepTimeMs;
mIdleTimeMs = idleTimeMs;
populateTransmitPowerRange(txTimeMs);
mTxTimeMs = txTimeMs;
mRxTimeMs = rxTimeMs;
}
/** helper API to populate tx power range for each bucket **/
private void populateTransmitPowerRange(@NonNull int[] transmitPowerMs) {
int i = 0;
for ( ; i < Math.min(transmitPowerMs.length, TX_POWER_LEVELS); i++) {
mTransmitPowerInfo.add(i, new TransmitPower(TX_POWER_RANGES[i], transmitPowerMs[i]));
}
// Make sure that mTransmitPowerInfo is fully initialized.
for ( ; i < TX_POWER_LEVELS; i++) {
mTransmitPowerInfo.add(i, new TransmitPower(TX_POWER_RANGES[i], 0));
}
/**
* Provided for convenience in manipulation since the API exposes long values but internal
* representations are ints.
* @hide
*/
public ModemActivityInfo(long timestamp, long sleepTimeMs, long idleTimeMs,
@NonNull int[] txTimeMs, long rxTimeMs) {
this(timestamp, (int) sleepTimeMs, (int) idleTimeMs, txTimeMs, (int) rxTimeMs);
}
@Override
@@ -118,7 +131,7 @@ public final class ModemActivityInfo implements Parcelable {
+ " mTimestamp=" + mTimestamp
+ " mSleepTimeMs=" + mSleepTimeMs
+ " mIdleTimeMs=" + mIdleTimeMs
+ " mTransmitPowerInfo[]=" + mTransmitPowerInfo.toString()
+ " mTxTimeMs[]=" + mTxTimeMs
+ " mRxTimeMs=" + mRxTimeMs
+ "}";
}
@@ -129,14 +142,12 @@ public final class ModemActivityInfo implements Parcelable {
public static final @android.annotation.NonNull Parcelable.Creator<ModemActivityInfo> CREATOR =
new Parcelable.Creator<ModemActivityInfo>() {
public ModemActivityInfo createFromParcel(Parcel in) {
public ModemActivityInfo createFromParcel(@NonNull Parcel in) {
long timestamp = in.readLong();
int sleepTimeMs = in.readInt();
int idleTimeMs = in.readInt();
int[] txTimeMs = new int[TX_POWER_LEVELS];
for (int i = 0; i < TX_POWER_LEVELS; i++) {
txTimeMs[i] = in.readInt();
}
in.readIntArray(txTimeMs);
int rxTimeMs = in.readInt();
return new ModemActivityInfo(timestamp, sleepTimeMs, idleTimeMs,
txTimeMs, rxTimeMs);
@@ -147,21 +158,25 @@ public final class ModemActivityInfo implements Parcelable {
}
};
public void writeToParcel(Parcel dest, int flags) {
/**
* @param dest The Parcel in which the object should be written.
* @param flags Additional flags about how the object should be written.
*/
public void writeToParcel(@NonNull Parcel dest, int flags) {
dest.writeLong(mTimestamp);
dest.writeInt(mSleepTimeMs);
dest.writeInt(mIdleTimeMs);
for (int i = 0; i < TX_POWER_LEVELS; i++) {
dest.writeInt(mTransmitPowerInfo.get(i).getTimeInMillis());
}
dest.writeIntArray(mTxTimeMs);
dest.writeInt(mRxTimeMs);
}
/**
* @return milliseconds since boot, including mTimeInMillis spent in sleep.
* @see SystemClock#elapsedRealtime()
* Gets the timestamp at which this modem activity info was recorded.
*
* @return The timestamp, as returned by {@link SystemClock#elapsedRealtime()}, when this
* {@link ModemActivityInfo} was recorded.
*/
public long getTimestamp() {
public @ElapsedRealtimeLong long getTimestampMillis() {
return mTimestamp;
}
@@ -171,35 +186,48 @@ public final class ModemActivityInfo implements Parcelable {
}
/**
* @return an arrayList of {@link TransmitPower} with each element representing the total time where
* transmitter is awake time (in ms) for a given power range (in dbm).
* Gets the amount of time the modem spent transmitting at a certain power level.
*
* @see #TX_POWER_LEVELS
* @param powerLevel The power level to query.
* @return The amount of time, in milliseconds, that the modem spent transmitting at the
* given power level.
*/
@NonNull
public List<TransmitPower> getTransmitPowerInfo() {
return mTransmitPowerInfo;
public @DurationMillisLong long getTransmitDurationMillisAtPowerLevel(
@TxPowerLevel int powerLevel) {
return mTxTimeMs[powerLevel];
}
/**
* Gets the range of transmit powers corresponding to a certain power level.
*
* @param powerLevel The power level to query
* @return A {@link Range} object representing the range of intensities (in dBm) to which this
* power level corresponds.
*/
public @NonNull Range<Integer> getTransmitPowerRange(@TxPowerLevel int powerLevel) {
return TX_POWER_RANGES[powerLevel];
}
/** @hide */
public void setTransmitTimeMillis(int[] txTimeMs) {
populateTransmitPowerRange(txTimeMs);
}
/** @hide */
@NonNull
public int[] getTransmitTimeMillis() {
int[] transmitTimeMillis = new int[TX_POWER_LEVELS];
for (int i = 0; i < transmitTimeMillis.length; i++) {
transmitTimeMillis[i] = mTransmitPowerInfo.get(i).getTimeInMillis();
}
return transmitTimeMillis;
mTxTimeMs = Arrays.copyOf(txTimeMs, TX_POWER_LEVELS);
}
/**
* @return total mTimeInMillis (in ms) when modem is in a low power or sleep state.
* @return The raw array of transmit power durations
* @hide
*/
public int getSleepTimeMillis() {
@NonNull
public int[] getTransmitTimeMillis() {
return mTxTimeMs;
}
/**
* Gets the amount of time (in milliseconds) when the modem is in a low power or sleep state.
*
* @return Time in milliseconds.
*/
public @DurationMillisLong long getSleepTimeMillis() {
return mSleepTimeMs;
}
@@ -209,10 +237,44 @@ public final class ModemActivityInfo implements Parcelable {
}
/**
* @return total mTimeInMillis (in ms) when modem is awake but neither the transmitter nor receiver are
* active.
* Provided for convenience, since the API surface needs to return longs but internal
* representations are ints.
* @hide
*/
public int getIdleTimeMillis() {
public void setSleepTimeMillis(long sleepTimeMillis) {
mSleepTimeMs = (int) sleepTimeMillis;
}
/**
* Computes the difference between this instance of {@link ModemActivityInfo} and another
* instance.
*
* This method should be used to compute the amount of activity that has happened between two
* samples of modem activity taken at separate times. The sample passed in as an argument to
* this method should be the one that's taken later in time (and therefore has more activity).
* @param other The other instance of {@link ModemActivityInfo} to diff against.
* @return An instance of {@link ModemActivityInfo} representing the difference in modem
* activity.
*/
public @NonNull ModemActivityInfo getDelta(@NonNull ModemActivityInfo other) {
int[] txTimeMs = new int[ModemActivityInfo.TX_POWER_LEVELS];
for (int i = 0; i < ModemActivityInfo.TX_POWER_LEVELS; i++) {
txTimeMs[i] = other.mTxTimeMs[i] - mTxTimeMs[i];
}
return new ModemActivityInfo(other.getTimestampMillis(),
other.getSleepTimeMillis() - getSleepTimeMillis(),
other.getIdleTimeMillis() - getIdleTimeMillis(),
txTimeMs,
other.getReceiveTimeMillis() - getReceiveTimeMillis());
}
/**
* Gets the amount of time (in milliseconds) when the modem is awake but neither transmitting
* nor receiving.
*
* @return Time in milliseconds.
*/
public @DurationMillisLong long getIdleTimeMillis() {
return mIdleTimeMs;
}
@@ -222,9 +284,20 @@ public final class ModemActivityInfo implements Parcelable {
}
/**
* @return rx(receive) mTimeInMillis in ms.
* Provided for convenience, since the API surface needs to return longs but internal
* representations are ints.
* @hide
*/
public int getReceiveTimeMillis() {
public void setIdleTimeMillis(long idleTimeMillis) {
mIdleTimeMs = (int) idleTimeMillis;
}
/**
* Gets the amount of time (in milliseconds) when the modem is awake and receiving data.
*
* @return Time in milliseconds.
*/
public @DurationMillisLong long getReceiveTimeMillis() {
return mRxTimeMs;
}
@@ -233,72 +306,57 @@ public final class ModemActivityInfo implements Parcelable {
mRxTimeMs = rxTimeMillis;
}
/**
* Provided for convenience, since the API surface needs to return longs but internal
* representations are ints.
* @hide
*/
public void setReceiveTimeMillis(long receiveTimeMillis) {
mRxTimeMs = (int) receiveTimeMillis;
}
/**
* Indicates if the modem has reported valid {@link ModemActivityInfo}.
*
* @return {@code true} if this {@link ModemActivityInfo} record is valid,
* {@code false} otherwise.
* TODO: remove usages of this outside Telephony by always returning a valid (or null) result
* from telephony.
* @hide
*/
@TestApi
public boolean isValid() {
for (TransmitPower powerInfo : getTransmitPowerInfo()) {
if(powerInfo.getTimeInMillis() < 0) {
return false;
}
}
boolean isTxPowerValid = Arrays.stream(mTxTimeMs).allMatch((i) -> i >= 0);
return ((getIdleTimeMillis() >= 0) && (getSleepTimeMillis() >= 0)
return isTxPowerValid && ((getIdleTimeMillis() >= 0) && (getSleepTimeMillis() >= 0)
&& (getReceiveTimeMillis() >= 0) && !isEmpty());
}
private boolean isEmpty() {
for (TransmitPower txVal : getTransmitPowerInfo()) {
if(txVal.getTimeInMillis() != 0) {
return false;
}
}
boolean isTxPowerEmpty = mTxTimeMs == null || mTxTimeMs.length == 0
|| Arrays.stream(mTxTimeMs).allMatch((i) -> i == 0);
return ((getIdleTimeMillis() == 0) && (getSleepTimeMillis() == 0)
return isTxPowerEmpty && ((getIdleTimeMillis() == 0) && (getSleepTimeMillis() == 0)
&& (getReceiveTimeMillis() == 0));
}
/**
* Transmit power Information, including the power range in dbm and the total time (in ms) where
* the transmitter is active/awake for this power range.
* e.g, range: 0dbm(lower) ~ 5dbm(upper)
* time: 5ms
*/
public class TransmitPower {
private int mTimeInMillis;
private Range<Integer> mPowerRangeInDbm;
/** @hide */
public TransmitPower(@NonNull Range<Integer> range, int time) {
this.mTimeInMillis = time;
this.mPowerRangeInDbm = range;
}
/**
* @return the total time in ms where the transmitter is active/wake for this power range
* {@link #getPowerRangeInDbm()}.
*/
public int getTimeInMillis() {
return mTimeInMillis;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
ModemActivityInfo that = (ModemActivityInfo) o;
return mTimestamp == that.mTimestamp
&& mSleepTimeMs == that.mSleepTimeMs
&& mIdleTimeMs == that.mIdleTimeMs
&& mRxTimeMs == that.mRxTimeMs
&& Arrays.equals(mTxTimeMs, that.mTxTimeMs);
}
/**
* @return the power range in dbm. e.g, range: 0dbm(lower) ~ 5dbm(upper)
*/
@NonNull
public Range<Integer> getPowerRangeInDbm() {
return mPowerRangeInDbm;
}
@Override
public String toString() {
return "TransmitPower{"
+ " mTimeInMillis=" + mTimeInMillis
+ " mPowerRangeInDbm={" + mPowerRangeInDbm.getLower()
+ "," + mPowerRangeInDbm.getUpper()
+ "}}";
}
@Override
public int hashCode() {
int result = Objects.hash(mTimestamp, mSleepTimeMs, mIdleTimeMs, mRxTimeMs);
result = 31 * result + Arrays.hashCode(mTxTimeMs);
return result;
}
}