blob: 91ad9c3e1f515a19ab1e4a35d5be1fab607f5556 [file] [log] [blame]
Aurimas Liutikas93554f22022-04-19 16:51:35 -07001/*
2 * Copyright (C) 2020 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 */
16package android.telephony;
17
18import android.annotation.IntDef;
19import android.annotation.NonNull;
20import android.annotation.Nullable;
21import android.annotation.SystemApi;
22import android.os.Parcel;
23import android.os.Parcelable;
24
25import java.lang.annotation.Retention;
26import java.lang.annotation.RetentionPolicy;
27
28
29/**
30 * Class stores information related to the type of data throttling request to be sent to {@link
31 * TelephonyManager#sendThermalMitigationRequest(ThermalMitigationResult)}.
32 * @hide
33 */
34@SystemApi
35public final class ThermalMitigationRequest implements Parcelable {
36 /**
37 * Sent as a thermal mititgation action to {@link
38 * TelephonyManager#sendThermalMitigationRequest(ThermalMitigationResult)} to start data
39 * throttling. {@link TelephonyManager#InvalidThermalMitigationRequestException} will be thrown
40 * if dataThrottlingRequest is {@code null} or if completion duration is < 0.
41 *
42 * @hide
43 */
44 @SystemApi
45 public static final int THERMAL_MITIGATION_ACTION_DATA_THROTTLING = 0;
46
47 /**
48 * Sent as a thermal mititgation action to {@link
49 * TelephonyManager#sendThermalMitigationRequest(ThermalMitigationResult)} to allow only voice
50 * calls and internet data will not be available. This attempts to enable radio if currently
51 * disabled for thermal mitigation with no guarantee of it actually turning on.
52 * dataThrottlingRequest must be {@code null} or {@link
53 * TelephonyManager#InvalidThermalMitigationRequestException} will be thrown.
54 *
55 * @hide
56 */
57 @SystemApi
58 public static final int THERMAL_MITIGATION_ACTION_VOICE_ONLY = 1;
59
60 /**
61 * Sent as a thermal mititgation action to {@link'
62 * TelephonyManager#sendThermalMitigationRequest(ThermalMitigationResult)} to turn radio off. If
63 * radio is not able to be powered off because of an ongoing voice call, pending emergency call,
64 * or any other state that wouldn't allow radio off, {@link
65 * TelephonyManager#THERMAL_MITIGATION_RESULT_INVALID_STATE}.
66 * dataThrottlingRequest must be {@code null} or
67 * {@link TelephonyManager#InvalidThermalMitigationRequestException} will be returned.
68 *
69 * @hide
70 */
71 @SystemApi
72 public static final int THERMAL_MITIGATION_ACTION_RADIO_OFF = 2;
73
74 /**
75 * Type of thermal mitigation action.
76 * @hide
77 */
78 @Retention(RetentionPolicy.SOURCE)
79 @IntDef(prefix = { "THERMAL_MITIGATION_ACTION_" }, value = {
80 THERMAL_MITIGATION_ACTION_DATA_THROTTLING,
81 THERMAL_MITIGATION_ACTION_VOICE_ONLY,
82 THERMAL_MITIGATION_ACTION_RADIO_OFF})
83 public @interface ThermalMitigationAction {}
84
85 private @ThermalMitigationAction int mThermalMitigationAction;
86 private DataThrottlingRequest mDataThrottlingRequest;
87
88 /**
89 * @param thermalMitigationAction thermal mitigation action.
90 * @param dataThrottlingRequest is the parameters for more fine-controlled data throttling. This
91 * is only applicable if thermalMitigationAction is
92 * {@link #THERMAL_MITIGATION_ACTION_DATA_THROTTLING}. Otherwise, it must be set to
93 * {@code null}. See {@link DataThrottlingRequest} for more details.
94 */
95 private ThermalMitigationRequest(@ThermalMitigationAction int thermalMitigationAction,
96 @Nullable DataThrottlingRequest dataThrottlingRequest) {
97 mThermalMitigationAction = thermalMitigationAction;
98 mDataThrottlingRequest = dataThrottlingRequest;
99 }
100
101 private ThermalMitigationRequest(Parcel in) {
102 mThermalMitigationAction = in.readInt();
103 mDataThrottlingRequest = in.readParcelable(DataThrottlingRequest.class.getClassLoader());
104 }
105
106 /**
107 * Implement the Parcelable interface
108 */
109 @Override
110 public void writeToParcel(@NonNull Parcel dest, int flags) {
111 dest.writeInt(mThermalMitigationAction);
112 dest.writeParcelable(mDataThrottlingRequest, 0);
113 }
114
115 @Override
116 public int describeContents() {
117 return 0;
118 }
119
120 @Override
121 public String toString() {
122 return "[ThermalMitigationRequest "
123 + ", thermalMitigationAction=" + mThermalMitigationAction
124 + ", dataThrottlingRequest=" + mDataThrottlingRequest
125 + "]";
126 }
127
128 /**
129 * @return the thermal mitigation action.
130 */
131 public @ThermalMitigationAction int getThermalMitigationAction() {
132 return mThermalMitigationAction;
133 }
134
135 /**
136 * @return the data throttling request.
137 */
138 @Nullable
139 public DataThrottlingRequest getDataThrottlingRequest() {
140 return mDataThrottlingRequest;
141 }
142
143 public static final @NonNull Parcelable.Creator<ThermalMitigationRequest> CREATOR =
144 new Parcelable.Creator<ThermalMitigationRequest>() {
145
146 @Override
147 public ThermalMitigationRequest createFromParcel(Parcel in) {
148 return new ThermalMitigationRequest(in);
149 }
150
151 @Override
152 public ThermalMitigationRequest[] newArray(int size) {
153 return new ThermalMitigationRequest[size];
154 }
155 };
156
157 /**
158 * Provides a convenient way to set the fields of a {@link ThermalMitigationRequest} when
159 * creating a new instance.
160 *
161 * <p>The example below shows how you might create a new {@code ThermalMitigationRequest}:
162 *
163 * <pre><code>
164 *
165 * ThermalMitigationRequest dp = new ThermalMitigationRequest.Builder()
166 * .setThermalMitigationAction(
167 * ThermalMitigationRequest.THERMAL_MITIGATION_ACTION_DATA_THROTTLING)
168 * .setDataThrottlingRequest(new DataThrottlingRequest.Builder()
169 * .setDataThrottlingAction(
170 * DataThrottlingRequest.DATA_THROTTLING_ACTION_THROTTLE_SECONDARY_CARRIER)
171 * .setCompletionDurationMillis(10000L)
172 * .build())
173 * .build();
174 * </code></pre>
175 *
176 * @hide
177 */
178 @SystemApi
179 public static final class Builder {
180 private @ThermalMitigationAction int mThermalMitigationAction = -1;
181 private DataThrottlingRequest mDataThrottlingRequest;
182
183 /**
184 * Default constructor for Builder.
185 */
186 public Builder() {}
187
188 /**
189 * Set the thermal mitigation action.
190 *
191 * @param thermalMitigationAction thermal mitigation action. See {@link
192 * #THERMAL_MITIGATION_ACTION_DATA_THROTTLING}, {@link
193 * #THERMAL_MITIGATION_ACTION_VOICE_ONLY}, and {@link
194 * #THERMAL_MITIGATION_ACTION_RADIO_OFF} for more details.
195 *
196 * @return The same instance of the builder.
197 */
198 public @NonNull Builder setThermalMitigationAction(
199 @ThermalMitigationAction int thermalMitigationAction) {
200 mThermalMitigationAction = thermalMitigationAction;
201 return this;
202 }
203
204 /**
205 * Set the data throttling request.
206 *
207 * @param dataThrottlingRequest is the parameters for more fine-controlled data throttling.
208 * This is only applicable if thermalMitigationAction is {@link
209 * #THERMAL_MITIGATION_ACTION_DATA_THROTTLING}. Otherwise, it should not be set and
210 * will throw an IllegalArgumentException if it is. See {@link DataThrottlingRequest}
211 * for more details.
212 *
213 * @return The same instance of the builder.
214 */
215 public @NonNull Builder setDataThrottlingRequest(
216 @NonNull DataThrottlingRequest dataThrottlingRequest) {
217 mDataThrottlingRequest = dataThrottlingRequest;
218 return this;
219 }
220
221 /**
222 * Build the ThermalMitigationRequest.
223 *
224 * @return the ThermalMitigationRequest object.
225 */
226 public @NonNull ThermalMitigationRequest build() {
227 if (mThermalMitigationAction < 0) {
228 throw new IllegalArgumentException("thermalMitigationAction was "
229 + " not set");
230 }
231
232 if (mThermalMitigationAction == THERMAL_MITIGATION_ACTION_DATA_THROTTLING) {
233 if (mDataThrottlingRequest == null) {
234 throw new IllegalArgumentException("dataThrottlingRequest cannot be null for "
235 + "THERMAL_MITIGATION_ACTION_DATA_THROTTLING");
236 }
237
238
239 } else if (mDataThrottlingRequest != null) {
240 throw new IllegalArgumentException("dataThrottlingRequest must be null for "
241 + "THERMAL_MITIGATION_ACTION_VOICE_ONLY and "
242 + "THERMAL_MITIGATION_ACTION_RADIO_OFF");
243 }
244
245 return new ThermalMitigationRequest(mThermalMitigationAction, mDataThrottlingRequest);
246 }
247 }
248}