1 /* 2 * Copyright (C) 2007 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 com.android.internal.telephony.cat; 18 19 import android.compat.annotation.UnsupportedAppUsage; 20 import android.os.Build; 21 import android.os.Parcel; 22 import android.os.Parcelable; 23 24 /** 25 * Class used to pass CAT messages from telephony to application. Application 26 * should call getXXX() to get commands's specific values. 27 * 28 */ 29 public class CatCmdMessage implements Parcelable { 30 // members 31 @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553) 32 CommandDetails mCmdDet; 33 @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553) 34 private TextMessage mTextMsg; 35 @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553) 36 private Menu mMenu; 37 @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553) 38 private Input mInput; 39 private BrowserSettings mBrowserSettings = null; 40 private ToneSettings mToneSettings = null; 41 @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553) 42 private CallSettings mCallSettings = null; 43 private SMSSettings mSMSSettings = null; 44 private SetupEventListSettings mSetupEventListSettings = null; 45 private boolean mLoadIconFailed = false; 46 47 /* 48 * Container for Launch Browser command settings. 49 */ 50 public class BrowserSettings { 51 public String url; 52 public LaunchBrowserMode mode; 53 } 54 55 /* 56 * Container for Call Setup command settings. 57 */ 58 public class CallSettings { 59 @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553) 60 public TextMessage confirmMsg; 61 @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553) 62 public TextMessage callMsg; 63 } 64 65 /** 66 * Container for SEND SMS command settings. 67 */ 68 public class SMSSettings { 69 public TextMessage smsText; 70 public TextMessage destAddr; 71 } 72 73 public class SetupEventListSettings { 74 @UnsupportedAppUsage 75 public int[] eventList; 76 } 77 78 public final class SetupEventListConstants { 79 // Event values in SETUP_EVENT_LIST Proactive Command as per ETSI 102.223 80 public static final int USER_ACTIVITY_EVENT = 0x04; 81 public static final int IDLE_SCREEN_AVAILABLE_EVENT = 0x05; 82 public static final int LANGUAGE_SELECTION_EVENT = 0x07; 83 public static final int BROWSER_TERMINATION_EVENT = 0x08; 84 public static final int BROWSING_STATUS_EVENT = 0x0F; 85 } 86 87 public final class BrowserTerminationCauses { 88 public static final int USER_TERMINATION = 0x00; 89 public static final int ERROR_TERMINATION = 0x01; 90 } 91 CatCmdMessage(CommandParams cmdParams)92 CatCmdMessage(CommandParams cmdParams) { 93 mCmdDet = cmdParams.mCmdDet; 94 mLoadIconFailed = cmdParams.mLoadIconFailed; 95 switch(getCmdType()) { 96 case SET_UP_MENU: 97 case SELECT_ITEM: 98 mMenu = ((SelectItemParams) cmdParams).mMenu; 99 break; 100 case SEND_SMS: 101 /* If cmdParams is an instanceof SendSMSParams , then it means config value 102 * config_stk_sms_send_support is true and the SMS should be sent by framework 103 */ 104 if (cmdParams instanceof SendSMSParams) { 105 mSMSSettings = new SMSSettings(); 106 mSMSSettings.smsText = ((SendSMSParams) cmdParams).mTextSmsMsg; 107 mSMSSettings.destAddr = ((SendSMSParams) cmdParams).mDestAddress; 108 mTextMsg = ((SendSMSParams) cmdParams).mDisplayText.mTextMsg; 109 } else { 110 mTextMsg = ((DisplayTextParams) cmdParams).mTextMsg; 111 } 112 break; 113 case DISPLAY_TEXT: 114 case SET_UP_IDLE_MODE_TEXT: 115 case SEND_DTMF: 116 case REFRESH: 117 case RUN_AT: 118 case SEND_SS: 119 case SEND_USSD: 120 mTextMsg = ((DisplayTextParams) cmdParams).mTextMsg; 121 break; 122 case GET_INPUT: 123 case GET_INKEY: 124 mInput = ((GetInputParams) cmdParams).mInput; 125 break; 126 case LAUNCH_BROWSER: 127 mTextMsg = ((LaunchBrowserParams) cmdParams).mConfirmMsg; 128 mBrowserSettings = new BrowserSettings(); 129 mBrowserSettings.url = ((LaunchBrowserParams) cmdParams).mUrl; 130 mBrowserSettings.mode = ((LaunchBrowserParams) cmdParams).mMode; 131 break; 132 case PLAY_TONE: 133 PlayToneParams params = (PlayToneParams) cmdParams; 134 mToneSettings = params.mSettings; 135 mTextMsg = params.mTextMsg; 136 break; 137 case GET_CHANNEL_STATUS: 138 mTextMsg = ((CallSetupParams) cmdParams).mConfirmMsg; 139 break; 140 case SET_UP_CALL: 141 mCallSettings = new CallSettings(); 142 mCallSettings.confirmMsg = ((CallSetupParams) cmdParams).mConfirmMsg; 143 mCallSettings.callMsg = ((CallSetupParams) cmdParams).mCallMsg; 144 break; 145 case OPEN_CHANNEL: 146 case CLOSE_CHANNEL: 147 case RECEIVE_DATA: 148 case SEND_DATA: 149 BIPClientParams param = (BIPClientParams) cmdParams; 150 mTextMsg = param.mTextMsg; 151 break; 152 case SET_UP_EVENT_LIST: 153 mSetupEventListSettings = new SetupEventListSettings(); 154 mSetupEventListSettings.eventList = ((SetEventListParams) cmdParams).mEventInfo; 155 break; 156 case PROVIDE_LOCAL_INFORMATION: 157 default: 158 break; 159 } 160 } 161 CatCmdMessage(Parcel in)162 public CatCmdMessage(Parcel in) { 163 mCmdDet = in.readParcelable(CommandDetails.class.getClassLoader()); 164 mTextMsg = in.readParcelable(TextMessage.class.getClassLoader()); 165 mMenu = in.readParcelable(Menu.class.getClassLoader()); 166 mInput = in.readParcelable(Input.class.getClassLoader()); 167 mLoadIconFailed = (in.readByte() == 1); 168 switch (getCmdType()) { 169 case LAUNCH_BROWSER: 170 mBrowserSettings = new BrowserSettings(); 171 mBrowserSettings.url = in.readString(); 172 mBrowserSettings.mode = LaunchBrowserMode.values()[in.readInt()]; 173 break; 174 case PLAY_TONE: 175 mToneSettings = in.readParcelable(ToneSettings.class.getClassLoader()); 176 break; 177 case SET_UP_CALL: 178 mCallSettings = new CallSettings(); 179 mCallSettings.confirmMsg = in.readParcelable(TextMessage.class.getClassLoader()); 180 mCallSettings.callMsg = in.readParcelable(TextMessage.class.getClassLoader()); 181 break; 182 case SET_UP_EVENT_LIST: 183 mSetupEventListSettings = new SetupEventListSettings(); 184 int length = in.readInt(); 185 mSetupEventListSettings.eventList = new int[length]; 186 for (int i = 0; i < length; i++) { 187 mSetupEventListSettings.eventList[i] = in.readInt(); 188 } 189 break; 190 case SEND_SMS: 191 mSMSSettings = new SMSSettings(); 192 mSMSSettings.smsText = in.readParcelable(SendSMSParams.class.getClassLoader()); 193 mSMSSettings.destAddr = in.readParcelable(SendSMSParams.class.getClassLoader()); 194 break; 195 default: 196 break; 197 } 198 } 199 200 @Override writeToParcel(Parcel dest, int flags)201 public void writeToParcel(Parcel dest, int flags) { 202 dest.writeParcelable(mCmdDet, 0); 203 dest.writeParcelable(mTextMsg, 0); 204 dest.writeParcelable(mMenu, 0); 205 dest.writeParcelable(mInput, 0); 206 dest.writeByte((byte) (mLoadIconFailed ? 1 : 0)); 207 switch (getCmdType()) { 208 case LAUNCH_BROWSER: 209 dest.writeString(mBrowserSettings.url); 210 dest.writeInt(mBrowserSettings.mode.ordinal()); 211 break; 212 case PLAY_TONE: 213 dest.writeParcelable(mToneSettings, 0); 214 break; 215 case SET_UP_CALL: 216 dest.writeParcelable(mCallSettings.confirmMsg, 0); 217 dest.writeParcelable(mCallSettings.callMsg, 0); 218 break; 219 case SET_UP_EVENT_LIST: 220 dest.writeIntArray(mSetupEventListSettings.eventList); 221 break; 222 case SEND_SMS: 223 if (mSMSSettings != null) { 224 dest.writeParcelable(mSMSSettings.smsText, 0); 225 dest.writeParcelable(mSMSSettings.destAddr, 0); 226 } 227 break; 228 default: 229 break; 230 } 231 } 232 233 public static final Parcelable.Creator<CatCmdMessage> CREATOR = new Parcelable.Creator<CatCmdMessage>() { 234 @Override 235 public CatCmdMessage createFromParcel(Parcel in) { 236 return new CatCmdMessage(in); 237 } 238 239 @Override 240 public CatCmdMessage[] newArray(int size) { 241 return new CatCmdMessage[size]; 242 } 243 }; 244 245 @Override describeContents()246 public int describeContents() { 247 return 0; 248 } 249 250 /* external API to be used by application */ 251 @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553) getCmdType()252 public AppInterface.CommandType getCmdType() { 253 return AppInterface.CommandType.fromInt(mCmdDet.typeOfCommand); 254 } 255 getMenu()256 public Menu getMenu() { 257 return mMenu; 258 } 259 geInput()260 public Input geInput() { 261 return mInput; 262 } 263 264 @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553) geTextMessage()265 public TextMessage geTextMessage() { 266 return mTextMsg; 267 } 268 getBrowserSettings()269 public BrowserSettings getBrowserSettings() { 270 return mBrowserSettings; 271 } 272 getToneSettings()273 public ToneSettings getToneSettings() { 274 return mToneSettings; 275 } 276 277 @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553) getCallSettings()278 public CallSettings getCallSettings() { 279 return mCallSettings; 280 } 281 282 @UnsupportedAppUsage getSetEventList()283 public SetupEventListSettings getSetEventList() { 284 return mSetupEventListSettings; 285 } 286 287 /** 288 * API to be used by application to check if loading optional icon 289 * has failed 290 */ 291 @UnsupportedAppUsage hasIconLoadFailed()292 public boolean hasIconLoadFailed() { 293 return mLoadIconFailed; 294 } 295 } 296