Prerepa Viswanadham | 5c72899 | 2015-05-28 00:12:37 -0700 | [diff] [blame] | 1 | /* |
| 2 | * Copyright (C) 2015 The Android Open Source Project |
| 3 | * |
| 4 | * Licensed under the Apache License, Version 2.0 (the "License"); |
| 5 | * you may not use this file except in compliance with the License. |
| 6 | * You may obtain a copy of the License at |
| 7 | * |
| 8 | * http://www.apache.org/licenses/LICENSE-2.0 |
| 9 | * |
| 10 | * Unless required by applicable law or agreed to in writing, software |
| 11 | * distributed under the License is distributed on an "AS IS" BASIS, |
| 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| 13 | * See the License for the specific language governing permissions and |
| 14 | * limitations under the License. |
| 15 | */ |
| 16 | |
| 17 | package android.telephony; |
| 18 | |
SongFerngWang | 53515a0 | 2020-02-18 22:54:23 +0800 | [diff] [blame] | 19 | import android.annotation.IntDef; |
Chen Xu | 7322e4a | 2019-09-07 15:51:22 -0700 | [diff] [blame] | 20 | import android.annotation.NonNull; |
Prerepa Viswanadham | 5c72899 | 2015-05-28 00:12:37 -0700 | [diff] [blame] | 21 | import android.os.Parcel; |
| 22 | import android.os.Parcelable; |
Chen Xu | 7322e4a | 2019-09-07 15:51:22 -0700 | [diff] [blame] | 23 | import android.os.SystemClock; |
| 24 | import android.util.Range; |
zhouwenjie | df0e410 | 2019-10-08 15:01:26 -0700 | [diff] [blame] | 25 | |
SongFerngWang | 53515a0 | 2020-02-18 22:54:23 +0800 | [diff] [blame] | 26 | import java.lang.annotation.Retention; |
| 27 | import java.lang.annotation.RetentionPolicy; |
Chen Xu | 7322e4a | 2019-09-07 15:51:22 -0700 | [diff] [blame] | 28 | import java.util.ArrayList; |
Chen Xu | 7322e4a | 2019-09-07 15:51:22 -0700 | [diff] [blame] | 29 | import java.util.List; |
Prerepa Viswanadham | 5c72899 | 2015-05-28 00:12:37 -0700 | [diff] [blame] | 30 | |
| 31 | /** |
Chen Xu | 7322e4a | 2019-09-07 15:51:22 -0700 | [diff] [blame] | 32 | * Reports modem activity information. |
Prerepa Viswanadham | 5c72899 | 2015-05-28 00:12:37 -0700 | [diff] [blame] | 33 | * @hide |
| 34 | */ |
Chen Xu | 7322e4a | 2019-09-07 15:51:22 -0700 | [diff] [blame] | 35 | public final class ModemActivityInfo implements Parcelable { |
Prerepa Viswanadham | 5c72899 | 2015-05-28 00:12:37 -0700 | [diff] [blame] | 36 | /** |
Chen Xu | 7322e4a | 2019-09-07 15:51:22 -0700 | [diff] [blame] | 37 | * Tx(transmit) power level. see power index below |
| 38 | * <ul> |
| 39 | * <li> index 0 = tx_power < 0dBm. </li> |
| 40 | * <li> index 1 = 0dBm < tx_power < 5dBm. </li> |
| 41 | * <li> index 2 = 5dBm < tx_power < 15dBm. </li> |
| 42 | * <li> index 3 = 15dBm < tx_power < 20dBm. </li> |
| 43 | * <li> index 4 = tx_power > 20dBm. </li> |
| 44 | * </ul> |
Prerepa Viswanadham | 5c72899 | 2015-05-28 00:12:37 -0700 | [diff] [blame] | 45 | */ |
| 46 | public static final int TX_POWER_LEVELS = 5; |
SongFerngWang | 53515a0 | 2020-02-18 22:54:23 +0800 | [diff] [blame] | 47 | /** |
| 48 | * Tx(transmit) power level 0: tx_power < 0dBm |
| 49 | */ |
| 50 | public static final int TX_POWER_LEVEL_0 = 0; |
| 51 | /** |
| 52 | * Tx(transmit) power level 1: 0dBm < tx_power < 5dBm |
| 53 | */ |
| 54 | public static final int TX_POWER_LEVEL_1 = 1; |
| 55 | /** |
| 56 | * Tx(transmit) power level 2: 5dBm < tx_power < 15dBm |
| 57 | */ |
| 58 | public static final int TX_POWER_LEVEL_2 = 2; |
| 59 | /** |
| 60 | * Tx(transmit) power level 3: 15dBm < tx_power < 20dBm. |
| 61 | */ |
| 62 | public static final int TX_POWER_LEVEL_3 = 3; |
| 63 | /** |
| 64 | * Tx(transmit) power level 4: tx_power > 20dBm |
| 65 | */ |
| 66 | public static final int TX_POWER_LEVEL_4 = 4; |
| 67 | |
| 68 | /** @hide */ |
| 69 | @IntDef(prefix = {"TX_POWER_LEVEL_"}, value = { |
| 70 | TX_POWER_LEVEL_0, |
| 71 | TX_POWER_LEVEL_1, |
| 72 | TX_POWER_LEVEL_2, |
| 73 | TX_POWER_LEVEL_3, |
| 74 | TX_POWER_LEVEL_4, |
| 75 | }) |
| 76 | @Retention(RetentionPolicy.SOURCE) |
| 77 | public @interface TxPowerLevel {} |
| 78 | |
Chen Xu | 7322e4a | 2019-09-07 15:51:22 -0700 | [diff] [blame] | 79 | private static final Range<Integer>[] TX_POWER_RANGES = new Range[] { |
| 80 | new Range<>(Integer.MIN_VALUE, 0), |
| 81 | new Range<>(0, 5), |
| 82 | new Range<>(5, 15), |
| 83 | new Range<>(15, 20), |
| 84 | new Range<>(20, Integer.MAX_VALUE) |
| 85 | |
| 86 | }; |
Prerepa Viswanadham | 5c72899 | 2015-05-28 00:12:37 -0700 | [diff] [blame] | 87 | |
Chenjie Yu | 8908339 | 2018-01-11 14:53:31 -0800 | [diff] [blame] | 88 | private long mTimestamp; |
| 89 | private int mSleepTimeMs; |
| 90 | private int mIdleTimeMs; |
Chen Xu | 7322e4a | 2019-09-07 15:51:22 -0700 | [diff] [blame] | 91 | private List<TransmitPower> mTransmitPowerInfo = new ArrayList<>(TX_POWER_LEVELS); |
Chenjie Yu | 8908339 | 2018-01-11 14:53:31 -0800 | [diff] [blame] | 92 | private int mRxTimeMs; |
Prerepa Viswanadham | 5c72899 | 2015-05-28 00:12:37 -0700 | [diff] [blame] | 93 | |
| 94 | public ModemActivityInfo(long timestamp, int sleepTimeMs, int idleTimeMs, |
Tomasz Wasilczyk | ed8b2e1 | 2020-01-21 23:53:39 +0000 | [diff] [blame] | 95 | @NonNull int[] txTimeMs, int rxTimeMs) { |
Prerepa Viswanadham | 5c72899 | 2015-05-28 00:12:37 -0700 | [diff] [blame] | 96 | mTimestamp = timestamp; |
| 97 | mSleepTimeMs = sleepTimeMs; |
| 98 | mIdleTimeMs = idleTimeMs; |
zhouwenjie | df0e410 | 2019-10-08 15:01:26 -0700 | [diff] [blame] | 99 | populateTransmitPowerRange(txTimeMs); |
Prerepa Viswanadham | 5c72899 | 2015-05-28 00:12:37 -0700 | [diff] [blame] | 100 | mRxTimeMs = rxTimeMs; |
Chen Xu | 7322e4a | 2019-09-07 15:51:22 -0700 | [diff] [blame] | 101 | } |
| 102 | |
| 103 | /** helper API to populate tx power range for each bucket **/ |
Tomasz Wasilczyk | ed8b2e1 | 2020-01-21 23:53:39 +0000 | [diff] [blame] | 104 | private void populateTransmitPowerRange(@NonNull int[] transmitPowerMs) { |
zhouwenjie | df0e410 | 2019-10-08 15:01:26 -0700 | [diff] [blame] | 105 | int i = 0; |
Tomasz Wasilczyk | ed8b2e1 | 2020-01-21 23:53:39 +0000 | [diff] [blame] | 106 | for ( ; i < Math.min(transmitPowerMs.length, TX_POWER_LEVELS); i++) { |
| 107 | mTransmitPowerInfo.add(i, new TransmitPower(TX_POWER_RANGES[i], transmitPowerMs[i])); |
Chen Xu | 7322e4a | 2019-09-07 15:51:22 -0700 | [diff] [blame] | 108 | } |
zhouwenjie | df0e410 | 2019-10-08 15:01:26 -0700 | [diff] [blame] | 109 | // Make sure that mTransmitPowerInfo is fully initialized. |
| 110 | for ( ; i < TX_POWER_LEVELS; i++) { |
| 111 | mTransmitPowerInfo.add(i, new TransmitPower(TX_POWER_RANGES[i], 0)); |
| 112 | } |
Prerepa Viswanadham | 5c72899 | 2015-05-28 00:12:37 -0700 | [diff] [blame] | 113 | } |
| 114 | |
| 115 | @Override |
| 116 | public String toString() { |
| 117 | return "ModemActivityInfo{" |
| 118 | + " mTimestamp=" + mTimestamp |
| 119 | + " mSleepTimeMs=" + mSleepTimeMs |
Adam Lesinski | 21f76aa | 2016-01-25 12:27:06 -0800 | [diff] [blame] | 120 | + " mIdleTimeMs=" + mIdleTimeMs |
Chen Xu | 7322e4a | 2019-09-07 15:51:22 -0700 | [diff] [blame] | 121 | + " mTransmitPowerInfo[]=" + mTransmitPowerInfo.toString() |
Prerepa Viswanadham | 5c72899 | 2015-05-28 00:12:37 -0700 | [diff] [blame] | 122 | + " mRxTimeMs=" + mRxTimeMs |
Prerepa Viswanadham | 5c72899 | 2015-05-28 00:12:37 -0700 | [diff] [blame] | 123 | + "}"; |
| 124 | } |
| 125 | |
| 126 | public int describeContents() { |
| 127 | return 0; |
| 128 | } |
| 129 | |
Tomasz Wasilczyk | ed8b2e1 | 2020-01-21 23:53:39 +0000 | [diff] [blame] | 130 | public static final @android.annotation.NonNull Parcelable.Creator<ModemActivityInfo> CREATOR = |
Prerepa Viswanadham | 5c72899 | 2015-05-28 00:12:37 -0700 | [diff] [blame] | 131 | new Parcelable.Creator<ModemActivityInfo>() { |
| 132 | public ModemActivityInfo createFromParcel(Parcel in) { |
| 133 | long timestamp = in.readLong(); |
| 134 | int sleepTimeMs = in.readInt(); |
| 135 | int idleTimeMs = in.readInt(); |
| 136 | int[] txTimeMs = new int[TX_POWER_LEVELS]; |
| 137 | for (int i = 0; i < TX_POWER_LEVELS; i++) { |
| 138 | txTimeMs[i] = in.readInt(); |
| 139 | } |
| 140 | int rxTimeMs = in.readInt(); |
Prerepa Viswanadham | 5c72899 | 2015-05-28 00:12:37 -0700 | [diff] [blame] | 141 | return new ModemActivityInfo(timestamp, sleepTimeMs, idleTimeMs, |
Chen Xu | 7322e4a | 2019-09-07 15:51:22 -0700 | [diff] [blame] | 142 | txTimeMs, rxTimeMs); |
Prerepa Viswanadham | 5c72899 | 2015-05-28 00:12:37 -0700 | [diff] [blame] | 143 | } |
| 144 | |
| 145 | public ModemActivityInfo[] newArray(int size) { |
| 146 | return new ModemActivityInfo[size]; |
| 147 | } |
| 148 | }; |
| 149 | |
| 150 | public void writeToParcel(Parcel dest, int flags) { |
| 151 | dest.writeLong(mTimestamp); |
| 152 | dest.writeInt(mSleepTimeMs); |
| 153 | dest.writeInt(mIdleTimeMs); |
| 154 | for (int i = 0; i < TX_POWER_LEVELS; i++) { |
Chen Xu | 7322e4a | 2019-09-07 15:51:22 -0700 | [diff] [blame] | 155 | dest.writeInt(mTransmitPowerInfo.get(i).getTimeInMillis()); |
Prerepa Viswanadham | 5c72899 | 2015-05-28 00:12:37 -0700 | [diff] [blame] | 156 | } |
| 157 | dest.writeInt(mRxTimeMs); |
Prerepa Viswanadham | 5c72899 | 2015-05-28 00:12:37 -0700 | [diff] [blame] | 158 | } |
| 159 | |
| 160 | /** |
Chen Xu | 7322e4a | 2019-09-07 15:51:22 -0700 | [diff] [blame] | 161 | * @return milliseconds since boot, including mTimeInMillis spent in sleep. |
| 162 | * @see SystemClock#elapsedRealtime() |
Prerepa Viswanadham | 5c72899 | 2015-05-28 00:12:37 -0700 | [diff] [blame] | 163 | */ |
| 164 | public long getTimestamp() { |
| 165 | return mTimestamp; |
| 166 | } |
| 167 | |
Chen Xu | 7322e4a | 2019-09-07 15:51:22 -0700 | [diff] [blame] | 168 | /** @hide */ |
Chenjie Yu | 8908339 | 2018-01-11 14:53:31 -0800 | [diff] [blame] | 169 | public void setTimestamp(long timestamp) { |
| 170 | mTimestamp = timestamp; |
| 171 | } |
| 172 | |
Prerepa Viswanadham | 5c72899 | 2015-05-28 00:12:37 -0700 | [diff] [blame] | 173 | /** |
Chen Xu | 7322e4a | 2019-09-07 15:51:22 -0700 | [diff] [blame] | 174 | * @return an arrayList of {@link TransmitPower} with each element representing the total time where |
| 175 | * transmitter is awake time (in ms) for a given power range (in dbm). |
| 176 | * |
| 177 | * @see #TX_POWER_LEVELS |
Prerepa Viswanadham | 5c72899 | 2015-05-28 00:12:37 -0700 | [diff] [blame] | 178 | */ |
Chen Xu | 7322e4a | 2019-09-07 15:51:22 -0700 | [diff] [blame] | 179 | @NonNull |
| 180 | public List<TransmitPower> getTransmitPowerInfo() { |
| 181 | return mTransmitPowerInfo; |
Prerepa Viswanadham | 5c72899 | 2015-05-28 00:12:37 -0700 | [diff] [blame] | 182 | } |
| 183 | |
Chen Xu | 7322e4a | 2019-09-07 15:51:22 -0700 | [diff] [blame] | 184 | /** @hide */ |
Tomasz Wasilczyk | ed8b2e1 | 2020-01-21 23:53:39 +0000 | [diff] [blame] | 185 | public void setTransmitTimeMillis(int[] txTimeMs) { |
Chen Xu | 7322e4a | 2019-09-07 15:51:22 -0700 | [diff] [blame] | 186 | populateTransmitPowerRange(txTimeMs); |
| 187 | } |
| 188 | |
| 189 | /** @hide */ |
| 190 | @NonNull |
| 191 | public int[] getTransmitTimeMillis() { |
| 192 | int[] transmitTimeMillis = new int[TX_POWER_LEVELS]; |
| 193 | for (int i = 0; i < transmitTimeMillis.length; i++) { |
| 194 | transmitTimeMillis[i] = mTransmitPowerInfo.get(i).getTimeInMillis(); |
| 195 | } |
| 196 | return transmitTimeMillis; |
Chenjie Yu | 8908339 | 2018-01-11 14:53:31 -0800 | [diff] [blame] | 197 | } |
| 198 | |
Prerepa Viswanadham | 5c72899 | 2015-05-28 00:12:37 -0700 | [diff] [blame] | 199 | /** |
Chen Xu | 7322e4a | 2019-09-07 15:51:22 -0700 | [diff] [blame] | 200 | * @return total mTimeInMillis (in ms) when modem is in a low power or sleep state. |
Prerepa Viswanadham | 5c72899 | 2015-05-28 00:12:37 -0700 | [diff] [blame] | 201 | */ |
| 202 | public int getSleepTimeMillis() { |
| 203 | return mSleepTimeMs; |
| 204 | } |
| 205 | |
Chen Xu | 7322e4a | 2019-09-07 15:51:22 -0700 | [diff] [blame] | 206 | /** @hide */ |
Chenjie Yu | 8908339 | 2018-01-11 14:53:31 -0800 | [diff] [blame] | 207 | public void setSleepTimeMillis(int sleepTimeMillis) { |
| 208 | mSleepTimeMs = sleepTimeMillis; |
| 209 | } |
| 210 | |
Prerepa Viswanadham | 5c72899 | 2015-05-28 00:12:37 -0700 | [diff] [blame] | 211 | /** |
Chen Xu | 7322e4a | 2019-09-07 15:51:22 -0700 | [diff] [blame] | 212 | * @return total mTimeInMillis (in ms) when modem is awake but neither the transmitter nor receiver are |
| 213 | * active. |
Prerepa Viswanadham | 5c72899 | 2015-05-28 00:12:37 -0700 | [diff] [blame] | 214 | */ |
| 215 | public int getIdleTimeMillis() { |
| 216 | return mIdleTimeMs; |
| 217 | } |
| 218 | |
Chen Xu | 7322e4a | 2019-09-07 15:51:22 -0700 | [diff] [blame] | 219 | /** @hide */ |
Chenjie Yu | 8908339 | 2018-01-11 14:53:31 -0800 | [diff] [blame] | 220 | public void setIdleTimeMillis(int idleTimeMillis) { |
| 221 | mIdleTimeMs = idleTimeMillis; |
| 222 | } |
| 223 | |
Prerepa Viswanadham | 5c72899 | 2015-05-28 00:12:37 -0700 | [diff] [blame] | 224 | /** |
Chen Xu | 7322e4a | 2019-09-07 15:51:22 -0700 | [diff] [blame] | 225 | * @return rx(receive) mTimeInMillis in ms. |
Prerepa Viswanadham | 5c72899 | 2015-05-28 00:12:37 -0700 | [diff] [blame] | 226 | */ |
Chen Xu | 7322e4a | 2019-09-07 15:51:22 -0700 | [diff] [blame] | 227 | public int getReceiveTimeMillis() { |
Prerepa Viswanadham | 5c72899 | 2015-05-28 00:12:37 -0700 | [diff] [blame] | 228 | return mRxTimeMs; |
| 229 | } |
| 230 | |
Chen Xu | 7322e4a | 2019-09-07 15:51:22 -0700 | [diff] [blame] | 231 | /** @hide */ |
| 232 | public void setReceiveTimeMillis(int rxTimeMillis) { |
Chenjie Yu | 8908339 | 2018-01-11 14:53:31 -0800 | [diff] [blame] | 233 | mRxTimeMs = rxTimeMillis; |
| 234 | } |
| 235 | |
Prerepa Viswanadham | 5c72899 | 2015-05-28 00:12:37 -0700 | [diff] [blame] | 236 | /** |
Shuo Qian | 3349553 | 2019-12-17 10:53:05 -0800 | [diff] [blame] | 237 | * Indicate if the ModemActivityInfo is invalid due to modem's invalid reporting. |
| 238 | * |
Chen Xu | 7322e4a | 2019-09-07 15:51:22 -0700 | [diff] [blame] | 239 | * @return {@code true} if this {@link ModemActivityInfo} record is valid, |
| 240 | * {@code false} otherwise. |
Prerepa Viswanadham | 5c72899 | 2015-05-28 00:12:37 -0700 | [diff] [blame] | 241 | */ |
| 242 | public boolean isValid() { |
Chen Xu | 7322e4a | 2019-09-07 15:51:22 -0700 | [diff] [blame] | 243 | for (TransmitPower powerInfo : getTransmitPowerInfo()) { |
| 244 | if(powerInfo.getTimeInMillis() < 0) { |
Nathan Harold | 98a40d3 | 2016-04-19 17:17:59 -0700 | [diff] [blame] | 245 | return false; |
| 246 | } |
Prerepa Viswanadham | 5c72899 | 2015-05-28 00:12:37 -0700 | [diff] [blame] | 247 | } |
Nathan Harold | 98a40d3 | 2016-04-19 17:17:59 -0700 | [diff] [blame] | 248 | |
| 249 | return ((getIdleTimeMillis() >= 0) && (getSleepTimeMillis() >= 0) |
Chen Xu | 7322e4a | 2019-09-07 15:51:22 -0700 | [diff] [blame] | 250 | && (getReceiveTimeMillis() >= 0) && !isEmpty()); |
Nathan Harold | 98a40d3 | 2016-04-19 17:17:59 -0700 | [diff] [blame] | 251 | } |
| 252 | |
| 253 | private boolean isEmpty() { |
Chen Xu | 7322e4a | 2019-09-07 15:51:22 -0700 | [diff] [blame] | 254 | for (TransmitPower txVal : getTransmitPowerInfo()) { |
| 255 | if(txVal.getTimeInMillis() != 0) { |
Nathan Harold | 98a40d3 | 2016-04-19 17:17:59 -0700 | [diff] [blame] | 256 | return false; |
| 257 | } |
| 258 | } |
| 259 | |
| 260 | return ((getIdleTimeMillis() == 0) && (getSleepTimeMillis() == 0) |
Chen Xu | 7322e4a | 2019-09-07 15:51:22 -0700 | [diff] [blame] | 261 | && (getReceiveTimeMillis() == 0)); |
| 262 | } |
| 263 | |
| 264 | /** |
| 265 | * Transmit power Information, including the power range in dbm and the total time (in ms) where |
| 266 | * the transmitter is active/awake for this power range. |
| 267 | * e.g, range: 0dbm(lower) ~ 5dbm(upper) |
| 268 | * time: 5ms |
| 269 | */ |
| 270 | public class TransmitPower { |
| 271 | private int mTimeInMillis; |
| 272 | private Range<Integer> mPowerRangeInDbm; |
| 273 | /** @hide */ |
| 274 | public TransmitPower(@NonNull Range<Integer> range, int time) { |
| 275 | this.mTimeInMillis = time; |
| 276 | this.mPowerRangeInDbm = range; |
| 277 | } |
| 278 | |
| 279 | /** |
| 280 | * @return the total time in ms where the transmitter is active/wake for this power range |
| 281 | * {@link #getPowerRangeInDbm()}. |
| 282 | */ |
| 283 | public int getTimeInMillis() { |
| 284 | return mTimeInMillis; |
| 285 | } |
| 286 | |
| 287 | /** |
| 288 | * @return the power range in dbm. e.g, range: 0dbm(lower) ~ 5dbm(upper) |
| 289 | */ |
| 290 | @NonNull |
| 291 | public Range<Integer> getPowerRangeInDbm() { |
| 292 | return mPowerRangeInDbm; |
| 293 | } |
| 294 | |
| 295 | @Override |
| 296 | public String toString() { |
| 297 | return "TransmitPower{" |
| 298 | + " mTimeInMillis=" + mTimeInMillis |
| 299 | + " mPowerRangeInDbm={" + mPowerRangeInDbm.getLower() |
| 300 | + "," + mPowerRangeInDbm.getUpper() |
| 301 | + "}}"; |
| 302 | } |
Prerepa Viswanadham | 5c72899 | 2015-05-28 00:12:37 -0700 | [diff] [blame] | 303 | } |
| 304 | } |