1818
1919import android .content .Context ;
2020import android .content .Intent ;
21+ import android .content .pm .PackageManager ;
22+ import android .content .pm .ResolveInfo ;
2123import android .os .AsyncResult ;
2224import android .os .Handler ;
2325import android .os .HandlerThread ;
3234
3335
3436import java .io .ByteArrayOutputStream ;
37+ import java .util .List ;
3538import java .util .Locale ;
3639
3740class RilMessage {
@@ -72,6 +75,7 @@ public class CatService extends Handler implements AppInterface {
7275 private CatCmdMessage mMenuCmd = null ;
7376
7477 private RilMessageDecoder mMsgDecoder = null ;
78+ private boolean mStkAppInstalled = false ;
7579
7680 // Service constants.
7781 static final int MSG_ID_SESSION_END = 1 ;
@@ -123,7 +127,10 @@ private CatService(CommandsInterface ci, IccRecords ir, Context context,
123127 ic .registerForReady (this , MSG_ID_SIM_READY , null );
124128 mIccRecords .registerForRecordsLoaded (this , MSG_ID_ICC_RECORDS_LOADED , null );
125129
126- CatLog .d (this , "Is running" );
130+ // Check if STK application is availalbe
131+ mStkAppInstalled = isStkAppInstalled ();
132+
133+ CatLog .d (this , "Running CAT service. STK app installed:" + mStkAppInstalled );
127134 }
128135
129136 public void dispose () {
@@ -152,7 +159,7 @@ private void handleRilMsg(RilMessage rilMsg) {
152159 if (rilMsg .mResCode == ResultCode .OK ) {
153160 cmdParams = (CommandParams ) rilMsg .mData ;
154161 if (cmdParams != null ) {
155- handleProactiveCommand (cmdParams );
162+ handleCommand (cmdParams , false );
156163 }
157164 }
158165 break ;
@@ -168,7 +175,7 @@ private void handleRilMsg(RilMessage rilMsg) {
168175 }
169176 if (cmdParams != null ) {
170177 if (rilMsg .mResCode == ResultCode .OK ) {
171- handleProactiveCommand (cmdParams );
178+ handleCommand (cmdParams , true );
172179 } else {
173180 // for proactive commands that couldn't be decoded
174181 // successfully respond with the code generated by the
@@ -181,7 +188,7 @@ private void handleRilMsg(RilMessage rilMsg) {
181188 case MSG_ID_REFRESH :
182189 cmdParams = (CommandParams ) rilMsg .mData ;
183190 if (cmdParams != null ) {
184- handleProactiveCommand (cmdParams );
191+ handleCommand (cmdParams , false );
185192 }
186193 break ;
187194 case MSG_ID_SESSION_END :
@@ -195,11 +202,13 @@ private void handleRilMsg(RilMessage rilMsg) {
195202 }
196203
197204 /**
198- * Handles RIL_UNSOL_STK_PROACTIVE_COMMAND unsolicited command from RIL.
205+ * Handles RIL_UNSOL_STK_EVENT_NOTIFY or RIL_UNSOL_STK_PROACTIVE_COMMAND command
206+ * from RIL.
199207 * Sends valid proactive command data to the application using intents.
200- *
208+ * RIL_REQUEST_STK_SEND_TERMINAL_RESPONSE will be send back if the command is
209+ * from RIL_UNSOL_STK_PROACTIVE_COMMAND.
201210 */
202- private void handleProactiveCommand (CommandParams cmdParams ) {
211+ private void handleCommand (CommandParams cmdParams , boolean isProactiveCmd ) {
203212 CatLog .d (this , cmdParams .getCommandType ().name ());
204213
205214 CharSequence message ;
@@ -233,15 +242,16 @@ private void handleProactiveCommand(CommandParams cmdParams) {
233242 case CommandParamsFactory .DTTZ_SETTING :
234243 resp = new DTTZResponseData (null );
235244 sendTerminalResponse (cmdParams .cmdDet , ResultCode .OK , false , 0 , resp );
236- return ;
245+ break ;
237246 case CommandParamsFactory .LANGUAGE_SETTING :
238247 resp = new LanguageResponseData (Locale .getDefault ().getLanguage ());
239248 sendTerminalResponse (cmdParams .cmdDet , ResultCode .OK , false , 0 , resp );
240- return ;
249+ break ;
241250 default :
242251 sendTerminalResponse (cmdParams .cmdDet , ResultCode .OK , false , 0 , null );
243- return ;
244252 }
253+ // No need to start STK app here.
254+ return ;
245255 case LAUNCH_BROWSER :
246256 if ((((LaunchBrowserParams ) cmdParams ).confirmMsg .text != null )
247257 && (((LaunchBrowserParams ) cmdParams ).confirmMsg .text .equals (STK_DEFAULT ))) {
@@ -272,6 +282,42 @@ private void handleProactiveCommand(CommandParams cmdParams) {
272282 ((CallSetupParams ) cmdParams ).confirmMsg .text = message .toString ();
273283 }
274284 break ;
285+ case OPEN_CHANNEL :
286+ case CLOSE_CHANNEL :
287+ case RECEIVE_DATA :
288+ case SEND_DATA :
289+ BIPClientParams cmd = (BIPClientParams ) cmdParams ;
290+ if (cmd .bHasAlphaId && (cmd .textMsg .text == null )) {
291+ CatLog .d (this , "cmd " + cmdParams .getCommandType () + " with null alpha id" );
292+ // If alpha length is zero, we just respond with OK.
293+ if (isProactiveCmd ) {
294+ sendTerminalResponse (cmdParams .cmdDet , ResultCode .OK , false , 0 , null );
295+ }
296+ return ;
297+ }
298+ // Respond with permanent failure to avoid retry if STK app is not present.
299+ if (!mStkAppInstalled ) {
300+ CatLog .d (this , "No STK application found." );
301+ if (isProactiveCmd ) {
302+ sendTerminalResponse (cmdParams .cmdDet ,
303+ ResultCode .BEYOND_TERMINAL_CAPABILITY ,
304+ false , 0 , null );
305+ return ;
306+ }
307+ }
308+ /*
309+ * CLOSE_CHANNEL, RECEIVE_DATA and SEND_DATA can be delivered by
310+ * either PROACTIVE_COMMAND or EVENT_NOTIFY.
311+ * If PROACTIVE_COMMAND is used for those commands, send terminal
312+ * response here.
313+ */
314+ if (isProactiveCmd &&
315+ ((cmdParams .getCommandType () == CommandType .CLOSE_CHANNEL ) ||
316+ (cmdParams .getCommandType () == CommandType .RECEIVE_DATA ) ||
317+ (cmdParams .getCommandType () == CommandType .SEND_DATA ))) {
318+ sendTerminalResponse (cmdParams .cmdDet , ResultCode .OK , false , 0 , null );
319+ }
320+ break ;
275321 default :
276322 CatLog .d (this , "Unsupported command" );
277323 return ;
@@ -682,6 +728,7 @@ private void handleCmdResponse(CatResponseMessage resMsg) {
682728 case NO_RESPONSE_FROM_USER :
683729 case UICC_SESSION_TERM_BY_USER :
684730 case BACKWARD_MOVE_BY_USER :
731+ case USER_NOT_ACCEPT :
685732 resp = null ;
686733 break ;
687734 default :
@@ -690,4 +737,14 @@ private void handleCmdResponse(CatResponseMessage resMsg) {
690737 sendTerminalResponse (cmdDet , resMsg .resCode , false , 0 , resp );
691738 mCurrntCmd = null ;
692739 }
740+
741+ private boolean isStkAppInstalled () {
742+ Intent intent = new Intent (AppInterface .CAT_CMD_ACTION );
743+ PackageManager pm = mContext .getPackageManager ();
744+ List <ResolveInfo > broadcastReceivers =
745+ pm .queryBroadcastReceivers (intent , PackageManager .GET_META_DATA );
746+ int numReceiver = broadcastReceivers == null ? 0 : broadcastReceivers .size ();
747+
748+ return (numReceiver > 0 );
749+ }
693750}
0 commit comments