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 ;
@@ -125,7 +129,10 @@ private CatService(CommandsInterface ci, IccRecords ir, Context context,
125129 mCmdIf .registerForNVReady (this , MSG_ID_SIM_READY , null );
126130 mIccRecords .registerForRecordsLoaded (this , MSG_ID_ICC_RECORDS_LOADED , null );
127131
128- CatLog .d (this , "Is running" );
132+ // Check if STK application is availalbe
133+ mStkAppInstalled = isStkAppInstalled ();
134+
135+ CatLog .d (this , "Running CAT service. STK app installed:" + mStkAppInstalled );
129136 }
130137
131138 public void dispose () {
@@ -154,7 +161,7 @@ private void handleRilMsg(RilMessage rilMsg) {
154161 if (rilMsg .mResCode == ResultCode .OK ) {
155162 cmdParams = (CommandParams ) rilMsg .mData ;
156163 if (cmdParams != null ) {
157- handleProactiveCommand (cmdParams );
164+ handleCommand (cmdParams , false );
158165 }
159166 }
160167 break ;
@@ -170,7 +177,7 @@ private void handleRilMsg(RilMessage rilMsg) {
170177 }
171178 if (cmdParams != null ) {
172179 if (rilMsg .mResCode == ResultCode .OK ) {
173- handleProactiveCommand (cmdParams );
180+ handleCommand (cmdParams , true );
174181 } else {
175182 // for proactive commands that couldn't be decoded
176183 // successfully respond with the code generated by the
@@ -183,7 +190,7 @@ private void handleRilMsg(RilMessage rilMsg) {
183190 case MSG_ID_REFRESH :
184191 cmdParams = (CommandParams ) rilMsg .mData ;
185192 if (cmdParams != null ) {
186- handleProactiveCommand (cmdParams );
193+ handleCommand (cmdParams , false );
187194 }
188195 break ;
189196 case MSG_ID_SESSION_END :
@@ -197,11 +204,13 @@ private void handleRilMsg(RilMessage rilMsg) {
197204 }
198205
199206 /**
200- * Handles RIL_UNSOL_STK_PROACTIVE_COMMAND unsolicited command from RIL.
207+ * Handles RIL_UNSOL_STK_EVENT_NOTIFY or RIL_UNSOL_STK_PROACTIVE_COMMAND command
208+ * from RIL.
201209 * Sends valid proactive command data to the application using intents.
202- *
210+ * RIL_REQUEST_STK_SEND_TERMINAL_RESPONSE will be send back if the command is
211+ * from RIL_UNSOL_STK_PROACTIVE_COMMAND.
203212 */
204- private void handleProactiveCommand (CommandParams cmdParams ) {
213+ private void handleCommand (CommandParams cmdParams , boolean isProactiveCmd ) {
205214 CatLog .d (this , cmdParams .getCommandType ().name ());
206215
207216 CharSequence message ;
@@ -235,15 +244,16 @@ private void handleProactiveCommand(CommandParams cmdParams) {
235244 case CommandParamsFactory .DTTZ_SETTING :
236245 resp = new DTTZResponseData (null );
237246 sendTerminalResponse (cmdParams .cmdDet , ResultCode .OK , false , 0 , resp );
238- return ;
247+ break ;
239248 case CommandParamsFactory .LANGUAGE_SETTING :
240249 resp = new LanguageResponseData (Locale .getDefault ().getLanguage ());
241250 sendTerminalResponse (cmdParams .cmdDet , ResultCode .OK , false , 0 , resp );
242- return ;
251+ break ;
243252 default :
244253 sendTerminalResponse (cmdParams .cmdDet , ResultCode .OK , false , 0 , null );
245- return ;
246254 }
255+ // No need to start STK app here.
256+ return ;
247257 case LAUNCH_BROWSER :
248258 if ((((LaunchBrowserParams ) cmdParams ).confirmMsg .text != null )
249259 && (((LaunchBrowserParams ) cmdParams ).confirmMsg .text .equals (STK_DEFAULT ))) {
@@ -274,6 +284,42 @@ private void handleProactiveCommand(CommandParams cmdParams) {
274284 ((CallSetupParams ) cmdParams ).confirmMsg .text = message .toString ();
275285 }
276286 break ;
287+ case OPEN_CHANNEL :
288+ case CLOSE_CHANNEL :
289+ case RECEIVE_DATA :
290+ case SEND_DATA :
291+ BIPClientParams cmd = (BIPClientParams ) cmdParams ;
292+ if (cmd .bHasAlphaId && (cmd .textMsg .text == null )) {
293+ CatLog .d (this , "cmd " + cmdParams .getCommandType () + " with null alpha id" );
294+ // If alpha length is zero, we just respond with OK.
295+ if (isProactiveCmd ) {
296+ sendTerminalResponse (cmdParams .cmdDet , ResultCode .OK , false , 0 , null );
297+ }
298+ return ;
299+ }
300+ // Respond with permanent failure to avoid retry if STK app is not present.
301+ if (!mStkAppInstalled ) {
302+ CatLog .d (this , "No STK application found." );
303+ if (isProactiveCmd ) {
304+ sendTerminalResponse (cmdParams .cmdDet ,
305+ ResultCode .BEYOND_TERMINAL_CAPABILITY ,
306+ false , 0 , null );
307+ return ;
308+ }
309+ }
310+ /*
311+ * CLOSE_CHANNEL, RECEIVE_DATA and SEND_DATA can be delivered by
312+ * either PROACTIVE_COMMAND or EVENT_NOTIFY.
313+ * If PROACTIVE_COMMAND is used for those commands, send terminal
314+ * response here.
315+ */
316+ if (isProactiveCmd &&
317+ ((cmdParams .getCommandType () == CommandType .CLOSE_CHANNEL ) ||
318+ (cmdParams .getCommandType () == CommandType .RECEIVE_DATA ) ||
319+ (cmdParams .getCommandType () == CommandType .SEND_DATA ))) {
320+ sendTerminalResponse (cmdParams .cmdDet , ResultCode .OK , false , 0 , null );
321+ }
322+ break ;
277323 default :
278324 CatLog .d (this , "Unsupported command" );
279325 return ;
@@ -684,6 +730,7 @@ private void handleCmdResponse(CatResponseMessage resMsg) {
684730 case NO_RESPONSE_FROM_USER :
685731 case UICC_SESSION_TERM_BY_USER :
686732 case BACKWARD_MOVE_BY_USER :
733+ case USER_NOT_ACCEPT :
687734 resp = null ;
688735 break ;
689736 default :
@@ -692,4 +739,14 @@ private void handleCmdResponse(CatResponseMessage resMsg) {
692739 sendTerminalResponse (cmdDet , resMsg .resCode , false , 0 , resp );
693740 mCurrntCmd = null ;
694741 }
742+
743+ private boolean isStkAppInstalled () {
744+ Intent intent = new Intent (AppInterface .CAT_CMD_ACTION );
745+ PackageManager pm = mContext .getPackageManager ();
746+ List <ResolveInfo > broadcastReceivers =
747+ pm .queryBroadcastReceivers (intent , PackageManager .GET_META_DATA );
748+ int numReceiver = broadcastReceivers == null ? 0 : broadcastReceivers .size ();
749+
750+ return (numReceiver > 0 );
751+ }
695752}
0 commit comments