blob: 2b72ab7635c3fb9e8d3fce75381882b555de7042 [file] [log] [blame]
Prerepa Viswanadham5c728992015-05-28 00:12:37 -07001/*
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
17package android.telephony;
18
SongFerngWang53515a02020-02-18 22:54:23 +080019import android.annotation.IntDef;
Chen Xu7322e4a2019-09-07 15:51:22 -070020import android.annotation.NonNull;
Prerepa Viswanadham5c728992015-05-28 00:12:37 -070021import android.os.Parcel;
22import android.os.Parcelable;
Chen Xu7322e4a2019-09-07 15:51:22 -070023import android.os.SystemClock;
24import android.util.Range;
zhouwenjiedf0e4102019-10-08 15:01:26 -070025
SongFerngWang53515a02020-02-18 22:54:23 +080026import java.lang.annotation.Retention;
27import java.lang.annotation.RetentionPolicy;
Chen Xu7322e4a2019-09-07 15:51:22 -070028import java.util.ArrayList;
Chen Xu7322e4a2019-09-07 15:51:22 -070029import java.util.List;
Prerepa Viswanadham5c728992015-05-28 00:12:37 -070030
31/**
Chen Xu7322e4a2019-09-07 15:51:22 -070032 * Reports modem activity information.
Prerepa Viswanadham5c728992015-05-28 00:12:37 -070033 * @hide
34 */
Chen Xu7322e4a2019-09-07 15:51:22 -070035public final class ModemActivityInfo implements Parcelable {
Prerepa Viswanadham5c728992015-05-28 00:12:37 -070036 /**
Chen Xu7322e4a2019-09-07 15:51:22 -070037 * 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 Viswanadham5c728992015-05-28 00:12:37 -070045 */
46 public static final int TX_POWER_LEVELS = 5;
SongFerngWang53515a02020-02-18 22:54:23 +080047 /**
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 Xu7322e4a2019-09-07 15:51:22 -070079 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 Viswanadham5c728992015-05-28 00:12:37 -070087
Chenjie Yu89083392018-01-11 14:53:31 -080088 private long mTimestamp;
89 private int mSleepTimeMs;
90 private int mIdleTimeMs;
Chen Xu7322e4a2019-09-07 15:51:22 -070091 private List<TransmitPower> mTransmitPowerInfo = new ArrayList<>(TX_POWER_LEVELS);
Chenjie Yu89083392018-01-11 14:53:31 -080092 private int mRxTimeMs;
Prerepa Viswanadham5c728992015-05-28 00:12:37 -070093
94 public ModemActivityInfo(long timestamp, int sleepTimeMs, int idleTimeMs,
Tomasz Wasilczyked8b2e12020-01-21 23:53:39 +000095 @NonNull int[] txTimeMs, int rxTimeMs) {
Prerepa Viswanadham5c728992015-05-28 00:12:37 -070096 mTimestamp = timestamp;
97 mSleepTimeMs = sleepTimeMs;
98 mIdleTimeMs = idleTimeMs;
zhouwenjiedf0e4102019-10-08 15:01:26 -070099 populateTransmitPowerRange(txTimeMs);
Prerepa Viswanadham5c728992015-05-28 00:12:37 -0700100 mRxTimeMs = rxTimeMs;
Chen Xu7322e4a2019-09-07 15:51:22 -0700101 }
102
103 /** helper API to populate tx power range for each bucket **/
Tomasz Wasilczyked8b2e12020-01-21 23:53:39 +0000104 private void populateTransmitPowerRange(@NonNull int[] transmitPowerMs) {
zhouwenjiedf0e4102019-10-08 15:01:26 -0700105 int i = 0;
Tomasz Wasilczyked8b2e12020-01-21 23:53:39 +0000106 for ( ; i < Math.min(transmitPowerMs.length, TX_POWER_LEVELS); i++) {
107 mTransmitPowerInfo.add(i, new TransmitPower(TX_POWER_RANGES[i], transmitPowerMs[i]));
Chen Xu7322e4a2019-09-07 15:51:22 -0700108 }
zhouwenjiedf0e4102019-10-08 15:01:26 -0700109 // 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 Viswanadham5c728992015-05-28 00:12:37 -0700113 }
114
115 @Override
116 public String toString() {
117 return "ModemActivityInfo{"
118 + " mTimestamp=" + mTimestamp
119 + " mSleepTimeMs=" + mSleepTimeMs
Adam Lesinski21f76aa2016-01-25 12:27:06 -0800120 + " mIdleTimeMs=" + mIdleTimeMs
Chen Xu7322e4a2019-09-07 15:51:22 -0700121 + " mTransmitPowerInfo[]=" + mTransmitPowerInfo.toString()
Prerepa Viswanadham5c728992015-05-28 00:12:37 -0700122 + " mRxTimeMs=" + mRxTimeMs
Prerepa Viswanadham5c728992015-05-28 00:12:37 -0700123 + "}";
124 }
125
126 public int describeContents() {
127 return 0;
128 }
129
Tomasz Wasilczyked8b2e12020-01-21 23:53:39 +0000130 public static final @android.annotation.NonNull Parcelable.Creator<ModemActivityInfo> CREATOR =
Prerepa Viswanadham5c728992015-05-28 00:12:37 -0700131 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 Viswanadham5c728992015-05-28 00:12:37 -0700141 return new ModemActivityInfo(timestamp, sleepTimeMs, idleTimeMs,
Chen Xu7322e4a2019-09-07 15:51:22 -0700142 txTimeMs, rxTimeMs);
Prerepa Viswanadham5c728992015-05-28 00:12:37 -0700143 }
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 Xu7322e4a2019-09-07 15:51:22 -0700155 dest.writeInt(mTransmitPowerInfo.get(i).getTimeInMillis());
Prerepa Viswanadham5c728992015-05-28 00:12:37 -0700156 }
157 dest.writeInt(mRxTimeMs);
Prerepa Viswanadham5c728992015-05-28 00:12:37 -0700158 }
159
160 /**
Chen Xu7322e4a2019-09-07 15:51:22 -0700161 * @return milliseconds since boot, including mTimeInMillis spent in sleep.
162 * @see SystemClock#elapsedRealtime()
Prerepa Viswanadham5c728992015-05-28 00:12:37 -0700163 */
164 public long getTimestamp() {
165 return mTimestamp;
166 }
167
Chen Xu7322e4a2019-09-07 15:51:22 -0700168 /** @hide */
Chenjie Yu89083392018-01-11 14:53:31 -0800169 public void setTimestamp(long timestamp) {
170 mTimestamp = timestamp;
171 }
172
Prerepa Viswanadham5c728992015-05-28 00:12:37 -0700173 /**
Chen Xu7322e4a2019-09-07 15:51:22 -0700174 * @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 Viswanadham5c728992015-05-28 00:12:37 -0700178 */
Chen Xu7322e4a2019-09-07 15:51:22 -0700179 @NonNull
180 public List<TransmitPower> getTransmitPowerInfo() {
181 return mTransmitPowerInfo;
Prerepa Viswanadham5c728992015-05-28 00:12:37 -0700182 }
183
Chen Xu7322e4a2019-09-07 15:51:22 -0700184 /** @hide */
Tomasz Wasilczyked8b2e12020-01-21 23:53:39 +0000185 public void setTransmitTimeMillis(int[] txTimeMs) {
Chen Xu7322e4a2019-09-07 15:51:22 -0700186 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 Yu89083392018-01-11 14:53:31 -0800197 }
198
Prerepa Viswanadham5c728992015-05-28 00:12:37 -0700199 /**
Chen Xu7322e4a2019-09-07 15:51:22 -0700200 * @return total mTimeInMillis (in ms) when modem is in a low power or sleep state.
Prerepa Viswanadham5c728992015-05-28 00:12:37 -0700201 */
202 public int getSleepTimeMillis() {
203 return mSleepTimeMs;
204 }
205
Chen Xu7322e4a2019-09-07 15:51:22 -0700206 /** @hide */
Chenjie Yu89083392018-01-11 14:53:31 -0800207 public void setSleepTimeMillis(int sleepTimeMillis) {
208 mSleepTimeMs = sleepTimeMillis;
209 }
210
Prerepa Viswanadham5c728992015-05-28 00:12:37 -0700211 /**
Chen Xu7322e4a2019-09-07 15:51:22 -0700212 * @return total mTimeInMillis (in ms) when modem is awake but neither the transmitter nor receiver are
213 * active.
Prerepa Viswanadham5c728992015-05-28 00:12:37 -0700214 */
215 public int getIdleTimeMillis() {
216 return mIdleTimeMs;
217 }
218
Chen Xu7322e4a2019-09-07 15:51:22 -0700219 /** @hide */
Chenjie Yu89083392018-01-11 14:53:31 -0800220 public void setIdleTimeMillis(int idleTimeMillis) {
221 mIdleTimeMs = idleTimeMillis;
222 }
223
Prerepa Viswanadham5c728992015-05-28 00:12:37 -0700224 /**
Chen Xu7322e4a2019-09-07 15:51:22 -0700225 * @return rx(receive) mTimeInMillis in ms.
Prerepa Viswanadham5c728992015-05-28 00:12:37 -0700226 */
Chen Xu7322e4a2019-09-07 15:51:22 -0700227 public int getReceiveTimeMillis() {
Prerepa Viswanadham5c728992015-05-28 00:12:37 -0700228 return mRxTimeMs;
229 }
230
Chen Xu7322e4a2019-09-07 15:51:22 -0700231 /** @hide */
232 public void setReceiveTimeMillis(int rxTimeMillis) {
Chenjie Yu89083392018-01-11 14:53:31 -0800233 mRxTimeMs = rxTimeMillis;
234 }
235
Prerepa Viswanadham5c728992015-05-28 00:12:37 -0700236 /**
Shuo Qian33495532019-12-17 10:53:05 -0800237 * Indicate if the ModemActivityInfo is invalid due to modem's invalid reporting.
238 *
Chen Xu7322e4a2019-09-07 15:51:22 -0700239 * @return {@code true} if this {@link ModemActivityInfo} record is valid,
240 * {@code false} otherwise.
Prerepa Viswanadham5c728992015-05-28 00:12:37 -0700241 */
242 public boolean isValid() {
Chen Xu7322e4a2019-09-07 15:51:22 -0700243 for (TransmitPower powerInfo : getTransmitPowerInfo()) {
244 if(powerInfo.getTimeInMillis() < 0) {
Nathan Harold98a40d32016-04-19 17:17:59 -0700245 return false;
246 }
Prerepa Viswanadham5c728992015-05-28 00:12:37 -0700247 }
Nathan Harold98a40d32016-04-19 17:17:59 -0700248
249 return ((getIdleTimeMillis() >= 0) && (getSleepTimeMillis() >= 0)
Chen Xu7322e4a2019-09-07 15:51:22 -0700250 && (getReceiveTimeMillis() >= 0) && !isEmpty());
Nathan Harold98a40d32016-04-19 17:17:59 -0700251 }
252
253 private boolean isEmpty() {
Chen Xu7322e4a2019-09-07 15:51:22 -0700254 for (TransmitPower txVal : getTransmitPowerInfo()) {
255 if(txVal.getTimeInMillis() != 0) {
Nathan Harold98a40d32016-04-19 17:17:59 -0700256 return false;
257 }
258 }
259
260 return ((getIdleTimeMillis() == 0) && (getSleepTimeMillis() == 0)
Chen Xu7322e4a2019-09-07 15:51:22 -0700261 && (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 Viswanadham5c728992015-05-28 00:12:37 -0700303 }
304}