19d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project/* 29d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project 39d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project * 49d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project * you may not use this file except in compliance with the License. 69d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project * You may obtain a copy of the License at 79d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project * 89d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project * 109d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project * See the License for the specific language governing permissions and 149d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project * limitations under the License. 159d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project */ 169d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 179d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Projectpackage com.android.stk; 189d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 199d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Projectimport android.app.Notification; 209d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Projectimport android.app.NotificationManager; 219d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Projectimport android.app.PendingIntent; 229d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Projectimport android.app.Service; 239d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Projectimport android.content.Context; 249d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Projectimport android.content.Intent; 259d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Projectimport android.net.Uri; 269d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Projectimport android.os.Bundle; 279d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Projectimport android.os.Handler; 289d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Projectimport android.os.IBinder; 299d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Projectimport android.os.Looper; 309d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Projectimport android.os.Message; 3156469d57db5e34913ec2ad1d28440ddfad9363a0Wink Savilleimport android.telephony.TelephonyManager; 329d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Projectimport android.view.Gravity; 339d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Projectimport android.view.LayoutInflater; 349d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Projectimport android.view.View; 359d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Projectimport android.widget.ImageView; 369d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Projectimport android.widget.RemoteViews; 379d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Projectimport android.widget.TextView; 389d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Projectimport android.widget.Toast; 399d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 409d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Projectimport com.android.internal.telephony.gsm.stk.AppInterface; 419d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Projectimport com.android.internal.telephony.gsm.stk.Menu; 429d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Projectimport com.android.internal.telephony.gsm.stk.Item; 439d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Projectimport com.android.internal.telephony.gsm.stk.ResultCode; 449d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Projectimport com.android.internal.telephony.gsm.stk.StkCmdMessage; 459d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Projectimport com.android.internal.telephony.gsm.stk.StkCmdMessage.BrowserSettings; 469d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Projectimport com.android.internal.telephony.gsm.stk.StkLog; 479d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Projectimport com.android.internal.telephony.gsm.stk.StkResponseMessage; 489d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Projectimport com.android.internal.telephony.gsm.stk.TextMessage; 499d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 509d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Projectimport java.util.LinkedList; 519d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 529d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project/** 539d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project * SIM toolkit application level service. Interacts with Telephopny messages, 549d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project * application's launch and user input from STK UI elements. 5579085fcc5b4e54cc374e8720644ce4c1dc0004beWink Saville * 569d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project */ 579d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Projectpublic class StkAppService extends Service implements Runnable { 589d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 599d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project // members 609d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project private volatile Looper mServiceLooper; 619d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project private volatile ServiceHandler mServiceHandler; 629d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project private AppInterface mStkService; 639d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project private Context mContext = null; 649d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project private StkCmdMessage mMainCmd = null; 659d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project private StkCmdMessage mCurrentCmd = null; 669d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project private Menu mCurrentMenu = null; 679d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project private String lastSelectedItem = null; 689d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project private boolean mMenuIsVisibile = false; 699d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project private boolean responseNeeded = true; 709d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project private boolean mCmdInProgress = false; 719d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project private NotificationManager mNotificationManager = null; 729d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project private LinkedList<DelayedCmd> mCmdsQ = null; 739d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project private boolean launchBrowser = false; 749d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project private BrowserSettings mBrowserSettings = null; 759d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project static StkAppService sInstance = null; 769d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 779d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project // Used for setting FLAG_ACTIVITY_NO_USER_ACTION when 789d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project // creating an intent. 799d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project private enum InitiatedByUserAction { 809d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project yes, // The action was started via a user initiated action 819d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project unknown, // Not known for sure if user initated the action 829d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 839d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 849d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project // constants 859d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project static final String OPCODE = "op"; 869d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project static final String CMD_MSG = "cmd message"; 879d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project static final String RES_ID = "response id"; 889d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project static final String MENU_SELECTION = "menu selection"; 899d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project static final String INPUT = "input"; 909d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project static final String HELP = "help"; 919d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project static final String CONFIRMATION = "confirm"; 929d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 939d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project // operations ids for different service functionality. 949d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project static final int OP_CMD = 1; 959d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project static final int OP_RESPONSE = 2; 969d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project static final int OP_LAUNCH_APP = 3; 979d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project static final int OP_END_SESSION = 4; 989d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project static final int OP_BOOT_COMPLETED = 5; 999d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project private static final int OP_DELAYED_MSG = 6; 1009d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 1019d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project // Response ids 1029d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project static final int RES_ID_MENU_SELECTION = 11; 1039d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project static final int RES_ID_INPUT = 12; 1049d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project static final int RES_ID_CONFIRM = 13; 1059d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project static final int RES_ID_DONE = 14; 1069d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 1079d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project static final int RES_ID_TIMEOUT = 20; 1089d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project static final int RES_ID_BACKWARD = 21; 1099d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project static final int RES_ID_END_SESSION = 22; 1109d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project static final int RES_ID_EXIT = 23; 1119d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 1129d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project private static final String PACKAGE_NAME = "com.android.stk"; 11379085fcc5b4e54cc374e8720644ce4c1dc0004beWink Saville private static final String MENU_ACTIVITY_NAME = 1149d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project PACKAGE_NAME + ".StkMenuActivity"; 11579085fcc5b4e54cc374e8720644ce4c1dc0004beWink Saville private static final String INPUT_ACTIVITY_NAME = 1169d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project PACKAGE_NAME + ".StkInputActivity"; 11779085fcc5b4e54cc374e8720644ce4c1dc0004beWink Saville 1189d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project // Notification id used to display Idle Mode text in NotificationManager. 1199d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project private static final int STK_NOTIFICATION_ID = 333; 12079085fcc5b4e54cc374e8720644ce4c1dc0004beWink Saville 12179085fcc5b4e54cc374e8720644ce4c1dc0004beWink Saville // Inner class used for queuing telephony messages (proactive commands, 1229d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project // session end) while the service is busy processing a previous message. 1239d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project private class DelayedCmd { 1249d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project // members 1259d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project int id; 1269d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project StkCmdMessage msg; 1279d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 1289d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project DelayedCmd(int id, StkCmdMessage msg) { 1299d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project this.id = id; 1309d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project this.msg = msg; 1319d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 1329d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 1339d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 1349d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project @Override 1359d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project public void onCreate() { 1369d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project // Initialize members 1379d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project mStkService = com.android.internal.telephony.gsm.stk.StkService 1389d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project .getInstance(); 13936eddd5bfa9047a6b9de2be4a5d6636b81634f97Wink Saville 14036eddd5bfa9047a6b9de2be4a5d6636b81634f97Wink Saville // NOTE mStkService is a singleton and continues to exist even if the GSMPhone is disposed 14136eddd5bfa9047a6b9de2be4a5d6636b81634f97Wink Saville // after the radio technology change from GSM to CDMA so the PHONE_TYPE_CDMA check is 14236eddd5bfa9047a6b9de2be4a5d6636b81634f97Wink Saville // needed. In case of switching back from CDMA to GSM the GSMPhone constructor updates 14336eddd5bfa9047a6b9de2be4a5d6636b81634f97Wink Saville // the instance. (TODO: test). 14456469d57db5e34913ec2ad1d28440ddfad9363a0Wink Saville if ((mStkService == null) 14556469d57db5e34913ec2ad1d28440ddfad9363a0Wink Saville && (TelephonyManager.getDefault().getPhoneType() 14656469d57db5e34913ec2ad1d28440ddfad9363a0Wink Saville != TelephonyManager.PHONE_TYPE_CDMA)) { 1479d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project StkLog.d(this, " Unable to get Service handle"); 1489d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project return; 1499d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 1509d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 1519d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project mCmdsQ = new LinkedList<DelayedCmd>(); 1529d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project Thread serviceThread = new Thread(null, this, "Stk App Service"); 1539d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project serviceThread.start(); 1549d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project mContext = getBaseContext(); 1559d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project mNotificationManager = (NotificationManager) mContext 1569d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project .getSystemService(Context.NOTIFICATION_SERVICE); 1579d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project sInstance = this; 1589d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 1599d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 1609d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project @Override 1619d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project public void onStart(Intent intent, int startId) { 1629d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project waitForLooper(); 1639d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 16462acae4b3214cdfe7e959d3a639abb8994918591John Wang // onStart() method can be passed a null intent 16562acae4b3214cdfe7e959d3a639abb8994918591John Wang // TODO: replace onStart() with onStartCommand() 16662acae4b3214cdfe7e959d3a639abb8994918591John Wang if (intent == null) { 16762acae4b3214cdfe7e959d3a639abb8994918591John Wang return; 16862acae4b3214cdfe7e959d3a639abb8994918591John Wang } 16962acae4b3214cdfe7e959d3a639abb8994918591John Wang 1709d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project Bundle args = intent.getExtras(); 17162acae4b3214cdfe7e959d3a639abb8994918591John Wang 1729d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project if (args == null) { 1739d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project return; 1749d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 1759d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 1769d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project Message msg = mServiceHandler.obtainMessage(); 1779d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project msg.arg1 = args.getInt(OPCODE); 1789d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project switch(msg.arg1) { 1799d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project case OP_CMD: 1809d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project msg.obj = args.getParcelable(CMD_MSG); 1819d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project break; 1829d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project case OP_RESPONSE: 1839d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project msg.obj = args; 1849d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project /* falls through */ 1859d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project case OP_LAUNCH_APP: 1869d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project case OP_END_SESSION: 1879d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project case OP_BOOT_COMPLETED: 1889d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project break; 1899d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project default: 1909d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project return; 1919d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 1929d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project mServiceHandler.sendMessage(msg); 1939d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 1949d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 1959d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project @Override 1969d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project public void onDestroy() { 1979d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project waitForLooper(); 1989d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project mServiceLooper.quit(); 1999d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 2009d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 2019d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project @Override 2029d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project public IBinder onBind(Intent intent) { 2039d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project return null; 2049d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 2059d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 2069d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project public void run() { 2079d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project Looper.prepare(); 2089d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 2099d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project mServiceLooper = Looper.myLooper(); 2109d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project mServiceHandler = new ServiceHandler(); 2119d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 2129d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project Looper.loop(); 2139d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 2149d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 2159d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project /* 2169d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project * Package api used by StkMenuActivity to indicate if its on the foreground. 2179d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project */ 2189d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project void indicateMenuVisibility(boolean visibility) { 2199d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project mMenuIsVisibile = visibility; 2209d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 2219d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 2229d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project /* 2239d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project * Package api used by StkMenuActivity to get its Menu parameter. 2249d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project */ 2259d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project Menu getMenu() { 2269d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project return mCurrentMenu; 2279d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 2289d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 2299d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project /* 2309d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project * Package api used by UI Activities and Dialogs to communicate directly 2319d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project * with the service to deliver state information and parameters. 2329d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project */ 2339d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project static StkAppService getInstance() { 2349d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project return sInstance; 2359d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 2369d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 2379d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project private void waitForLooper() { 2389d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project while (mServiceHandler == null) { 2399d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project synchronized (this) { 2409d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project try { 2419d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project wait(100); 2429d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } catch (InterruptedException e) { 2439d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 2449d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 2459d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 2469d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 2479d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 2489d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project private final class ServiceHandler extends Handler { 2499d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project @Override 2509d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project public void handleMessage(Message msg) { 2519d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project int opcode = msg.arg1; 2529d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 2539d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project switch (opcode) { 2549d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project case OP_LAUNCH_APP: 2559d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project if (mMainCmd == null) { 2569d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project // nothing todo when no SET UP MENU command didn't arrive. 2579d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project return; 2589d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 2599d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project launchMenuActivity(null); 2609d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project break; 2619d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project case OP_CMD: 2629d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project StkCmdMessage cmdMsg = (StkCmdMessage) msg.obj; 2639d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project // There are two types of commands: 2649d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project // 1. Interactive - user's response is required. 2659d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project // 2. Informative - display a message, no interaction with the user. 2669d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project // 26779085fcc5b4e54cc374e8720644ce4c1dc0004beWink Saville // Informative commands can be handled immediately without any delay. 2689d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project // Interactive commands can't override each other. So if a command 2699d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project // is already in progress, we need to queue the next command until 2709d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project // the user has responded or a timeout expired. 2719d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project if (!isCmdInteractive(cmdMsg)) { 2729d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project handleCmd(cmdMsg); 2739d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } else { 2749d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project if (!mCmdInProgress) { 2759d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project mCmdInProgress = true; 2769d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project handleCmd((StkCmdMessage) msg.obj); 2779d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } else { 2789d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project mCmdsQ.addLast(new DelayedCmd(OP_CMD, 2799d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project (StkCmdMessage) msg.obj)); 2809d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 2819d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 2829d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project break; 2839d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project case OP_RESPONSE: 2849d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project if (responseNeeded) { 2859d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project handleCmdResponse((Bundle) msg.obj); 2869d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 2879d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project // call delayed commands if needed. 2889d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project if (mCmdsQ.size() != 0) { 2899d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project callDelayedMsg(); 2909d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } else { 2919d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project mCmdInProgress = false; 2929d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 2939d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project // reset response needed state var to its original value. 2949d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project responseNeeded = true; 2959d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project break; 2969d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project case OP_END_SESSION: 2979d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project if (!mCmdInProgress) { 2989d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project mCmdInProgress = true; 2999d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project handleSessionEnd(); 3009d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } else { 3019d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project mCmdsQ.addLast(new DelayedCmd(OP_END_SESSION, null)); 3029d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 3039d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project break; 3049d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project case OP_BOOT_COMPLETED: 3059d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project StkLog.d(this, "OP_BOOT_COMPLETED"); 3069d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project if (mMainCmd == null) { 3079d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project StkAppInstaller.unInstall(mContext); 3089d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 3099d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project break; 3109d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project case OP_DELAYED_MSG: 3119d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project handleDelayedCmd(); 3129d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project break; 3139d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 3149d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 3159d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 3169d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 3179d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project private boolean isCmdInteractive(StkCmdMessage cmd) { 3189d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project switch (cmd.getCmdType()) { 3199d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project case SEND_DTMF: 3209d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project case SEND_SMS: 3219d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project case SEND_SS: 3229d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project case SEND_USSD: 3239d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project case SET_UP_IDLE_MODE_TEXT: 3249d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project case SET_UP_MENU: 3259d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project return false; 3269d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 3279d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 3289d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project return true; 3299d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 3309d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 3319d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project private void handleDelayedCmd() { 3329d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project if (mCmdsQ.size() != 0) { 3339d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project DelayedCmd cmd = mCmdsQ.poll(); 3349d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project switch (cmd.id) { 3359d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project case OP_CMD: 3369d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project handleCmd(cmd.msg); 3379d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project break; 3389d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project case OP_END_SESSION: 3399d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project handleSessionEnd(); 3409d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project break; 3419d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 3429d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 3439d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 3449d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 3459d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project private void callDelayedMsg() { 3469d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project Message msg = mServiceHandler.obtainMessage(); 3479d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project msg.arg1 = OP_DELAYED_MSG; 3489d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project mServiceHandler.sendMessage(msg); 3499d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 3509d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 3519d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project private void handleSessionEnd() { 3529d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project mCurrentCmd = mMainCmd; 3539d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project lastSelectedItem = null; 35479085fcc5b4e54cc374e8720644ce4c1dc0004beWink Saville // In case of SET UP MENU command which removed the app, don't 3559d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project // update the current menu member. 3569d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project if (mCurrentMenu != null && mMainCmd != null) { 3579d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project mCurrentMenu = mMainCmd.getMenu(); 3589d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 3599d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project if (mMenuIsVisibile) { 3609d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project launchMenuActivity(null); 3619d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 3629d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project if (mCmdsQ.size() != 0) { 3639d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project callDelayedMsg(); 3649d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } else { 3659d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project mCmdInProgress = false; 3669d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 3679d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project // In case a launch browser command was just confirmed, launch that url. 3689d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project if (launchBrowser) { 3699d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project launchBrowser = false; 3709d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project launchBrowser(mBrowserSettings); 3719d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 3729d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 3739d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 3749d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project private void handleCmd(StkCmdMessage cmdMsg) { 3759d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project if (cmdMsg == null) { 3769d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project return; 3779d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 3789d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project // save local reference for state tracking. 3799d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project mCurrentCmd = cmdMsg; 3809d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project boolean waitForUsersResponse = true; 3819d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 3829d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project StkLog.d(this, cmdMsg.getCmdType().name()); 3839d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project switch (cmdMsg.getCmdType()) { 3849d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project case DISPLAY_TEXT: 3859d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project TextMessage msg = cmdMsg.geTextMessage(); 3869d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project responseNeeded = msg.responseNeeded; 3879d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project if (lastSelectedItem != null) { 3889d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project msg.title = lastSelectedItem; 3899d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } else if (mMainCmd != null){ 3909d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project msg.title = mMainCmd.getMenu().title; 3919d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } else { 3929d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project // TODO: get the carrier name from the SIM 3939d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project msg.title = ""; 3949d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 3959d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project launchTextDialog(); 3969d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project break; 3979d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project case SELECT_ITEM: 3989d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project mCurrentMenu = cmdMsg.getMenu(); 3999d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project launchMenuActivity(cmdMsg.getMenu()); 4009d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project break; 4019d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project case SET_UP_MENU: 4029d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project mMainCmd = mCurrentCmd; 4039d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project mCurrentMenu = cmdMsg.getMenu(); 4049d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project if (removeMenu()) { 4059d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project StkLog.d(this, "Uninstall App"); 4069d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project mCurrentMenu = null; 4079d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project StkAppInstaller.unInstall(mContext); 4089d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } else { 4099d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project StkLog.d(this, "Install App"); 4109d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project StkAppInstaller.install(mContext); 4119d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 4129d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project if (mMenuIsVisibile) { 4139d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project launchMenuActivity(null); 4149d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 4159d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project break; 4169d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project case GET_INPUT: 4179d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project case GET_INKEY: 4189d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project launchInputActivity(); 4199d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project break; 4209d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project case SET_UP_IDLE_MODE_TEXT: 4219d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project waitForUsersResponse = false; 4229d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project launchIdleText(); 4239d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project break; 4249d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project case SEND_DTMF: 4259d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project case SEND_SMS: 4269d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project case SEND_SS: 4279d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project case SEND_USSD: 4289d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project waitForUsersResponse = false; 4299d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project launchEventMessage(); 4309d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project break; 4319d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project case LAUNCH_BROWSER: 4329d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project launchConfirmationDialog(mCurrentCmd.geTextMessage()); 4339d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project break; 4349d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project case SET_UP_CALL: 4359d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project launchConfirmationDialog(mCurrentCmd.getCallSettings().confirmMsg); 4369d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project break; 4379d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project case PLAY_TONE: 4389d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project launchToneDialog(); 4399d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project break; 4409d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 4419d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 4429d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project if (!waitForUsersResponse) { 4439d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project if (mCmdsQ.size() != 0) { 4449d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project callDelayedMsg(); 4459d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } else { 4469d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project mCmdInProgress = false; 4479d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 4489d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 4499d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 4509d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 4519d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project private void handleCmdResponse(Bundle args) { 4529d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project if (mCurrentCmd == null) { 4539d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project return; 4549d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 4559d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project StkResponseMessage resMsg = new StkResponseMessage(mCurrentCmd); 4569d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 4579d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project // set result code 4589d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project boolean helpRequired = args.getBoolean(HELP, false); 4599d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 4609d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project switch(args.getInt(RES_ID)) { 4619d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project case RES_ID_MENU_SELECTION: 4629d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project StkLog.d(this, "RES_ID_MENU_SELECTION"); 4639d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project int menuSelection = args.getInt(MENU_SELECTION); 4649d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project switch(mCurrentCmd.getCmdType()) { 4659d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project case SET_UP_MENU: 4669d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project case SELECT_ITEM: 4679d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project lastSelectedItem = getItemName(menuSelection); 4689d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project if (helpRequired) { 4699d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project resMsg.setResultCode(ResultCode.HELP_INFO_REQUIRED); 4709d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } else { 4719d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project resMsg.setResultCode(ResultCode.OK); 4729d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 4739d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project resMsg.setMenuSelection(menuSelection); 4749d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project break; 4759d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 4769d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project break; 4779d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project case RES_ID_INPUT: 4789d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project StkLog.d(this, "RES_ID_INPUT"); 4799d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project String input = args.getString(INPUT); 4809d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project if (mCurrentCmd.geInput().yesNo) { 4819d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project boolean yesNoSelection = input 4829d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project .equals(StkInputActivity.YES_STR_RESPONSE); 4839d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project resMsg.setYesNo(yesNoSelection); 4849d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } else { 4859d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project if (helpRequired) { 4869d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project resMsg.setResultCode(ResultCode.HELP_INFO_REQUIRED); 4879d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } else { 4889d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project resMsg.setResultCode(ResultCode.OK); 4899d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project resMsg.setInput(input); 4909d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 4919d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 4929d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project break; 4939d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project case RES_ID_CONFIRM: 4949d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project StkLog.d(this, "RES_ID_CONFIRM"); 4959d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project boolean confirmed = args.getBoolean(CONFIRMATION); 4969d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project switch (mCurrentCmd.getCmdType()) { 4979d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project case DISPLAY_TEXT: 4989d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project resMsg.setResultCode(confirmed ? ResultCode.OK 4999d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project : ResultCode.UICC_SESSION_TERM_BY_USER); 5009d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project break; 5019d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project case LAUNCH_BROWSER: 5029d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project resMsg.setResultCode(confirmed ? ResultCode.OK 5039d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project : ResultCode.UICC_SESSION_TERM_BY_USER); 5049d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project if (confirmed) { 5059d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project launchBrowser = true; 5069d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project mBrowserSettings = mCurrentCmd.getBrowserSettings(); 5079d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 5089d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project break; 5099d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project case SET_UP_CALL: 5109d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project resMsg.setResultCode(ResultCode.OK); 5119d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project resMsg.setConfirmation(confirmed); 5129d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project if (confirmed) { 5139d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project launchCallMsg(); 5149d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 5159d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project break; 5169d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 5179d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project break; 5189d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project case RES_ID_DONE: 5199d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project resMsg.setResultCode(ResultCode.OK); 5209d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project break; 5219d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project case RES_ID_BACKWARD: 5229d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project StkLog.d(this, "RES_ID_BACKWARD"); 5239d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project resMsg.setResultCode(ResultCode.BACKWARD_MOVE_BY_USER); 5249d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project break; 5259d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project case RES_ID_END_SESSION: 5269d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project StkLog.d(this, "RES_ID_END_SESSION"); 5279d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project resMsg.setResultCode(ResultCode.UICC_SESSION_TERM_BY_USER); 5289d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project break; 5299d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project case RES_ID_TIMEOUT: 5309d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project StkLog.d(this, "RES_ID_TIMEOUT"); 531d517689fb08e95c8e5a23385b5744ae5af2e4678Naveen Kalla // GCF test-case 27.22.4.1.1 Expected Sequence 1.5 (DISPLAY TEXT, 532d517689fb08e95c8e5a23385b5744ae5af2e4678Naveen Kalla // Clear message after delay, successful) expects result code OK. 533d517689fb08e95c8e5a23385b5744ae5af2e4678Naveen Kalla // If the command qualifier specifies no user response is required 534d517689fb08e95c8e5a23385b5744ae5af2e4678Naveen Kalla // then send OK instead of NO_RESPONSE_FROM_USER 535d517689fb08e95c8e5a23385b5744ae5af2e4678Naveen Kalla if ((mCurrentCmd.getCmdType().value() == AppInterface.CommandType.DISPLAY_TEXT 536d517689fb08e95c8e5a23385b5744ae5af2e4678Naveen Kalla .value()) 537d517689fb08e95c8e5a23385b5744ae5af2e4678Naveen Kalla && (mCurrentCmd.geTextMessage().userClear == false)) { 538d517689fb08e95c8e5a23385b5744ae5af2e4678Naveen Kalla resMsg.setResultCode(ResultCode.OK); 539d517689fb08e95c8e5a23385b5744ae5af2e4678Naveen Kalla } else { 540d517689fb08e95c8e5a23385b5744ae5af2e4678Naveen Kalla resMsg.setResultCode(ResultCode.NO_RESPONSE_FROM_USER); 541d517689fb08e95c8e5a23385b5744ae5af2e4678Naveen Kalla } 5429d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project break; 5439d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project default: 5449d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project StkLog.d(this, "Unknown result id"); 5459d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project return; 5469d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 5479d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project mStkService.onCmdResponse(resMsg); 5489d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 5499d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 5509d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project /** 5519d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project * Returns 0 or FLAG_ACTIVITY_NO_USER_ACTION, 0 means the user initiated the action. 5529d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project * 5539d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project * @param userAction If the userAction is yes then we always return 0 otherwise 5549d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project * mMenuIsVisible is used to determine what to return. If mMenuIsVisible is true 5559d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project * then we are the foreground app and we'll return 0 as from our perspective a 5569d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project * user action did cause. If it's false than we aren't the foreground app and 5579d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project * FLAG_ACTIVITY_NO_USER_ACTION is returned. 55879085fcc5b4e54cc374e8720644ce4c1dc0004beWink Saville * 5599d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project * @return 0 or FLAG_ACTIVITY_NO_USER_ACTION 5609d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project */ 5619d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project private int getFlagActivityNoUserAction(InitiatedByUserAction userAction) { 5629d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project return ((userAction == InitiatedByUserAction.yes) | mMenuIsVisibile) ? 5639d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 0 : Intent.FLAG_ACTIVITY_NO_USER_ACTION; 5649d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 5659d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 5669d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project private void launchMenuActivity(Menu menu) { 5679d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project Intent newIntent = new Intent(Intent.ACTION_VIEW); 5689d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project newIntent.setClassName(PACKAGE_NAME, MENU_ACTIVITY_NAME); 5699d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project int intentFlags = Intent.FLAG_ACTIVITY_NEW_TASK 5709d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project | Intent.FLAG_ACTIVITY_CLEAR_TOP; 5719d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project if (menu == null) { 5729d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project // We assume this was initiated by the user pressing the tool kit icon 5739d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project intentFlags |= getFlagActivityNoUserAction(InitiatedByUserAction.yes); 5749d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 5759d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project newIntent.putExtra("STATE", StkMenuActivity.STATE_MAIN); 5769d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } else { 5779d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project // We don't know and we'll let getFlagActivityNoUserAction decide. 5789d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project intentFlags |= getFlagActivityNoUserAction(InitiatedByUserAction.unknown); 5799d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 5809d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project newIntent.putExtra("STATE", StkMenuActivity.STATE_SECONDARY); 5819d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 5829d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project newIntent.setFlags(intentFlags); 5839d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project mContext.startActivity(newIntent); 5849d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 5859d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 5869d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project private void launchInputActivity() { 5879d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project Intent newIntent = new Intent(Intent.ACTION_VIEW); 5889d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project newIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK 5899d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project | getFlagActivityNoUserAction(InitiatedByUserAction.unknown)); 5909d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project newIntent.setClassName(PACKAGE_NAME, INPUT_ACTIVITY_NAME); 5919d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project newIntent.putExtra("INPUT", mCurrentCmd.geInput()); 5929d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project mContext.startActivity(newIntent); 5939d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 5949d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 5959d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project private void launchTextDialog() { 5969d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project Intent newIntent = new Intent(this, StkDialogActivity.class); 5979d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project newIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK 5989d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project | Intent.FLAG_ACTIVITY_MULTIPLE_TASK 5999d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project | Intent.FLAG_ACTIVITY_NO_HISTORY 6009d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS 6019d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project | getFlagActivityNoUserAction(InitiatedByUserAction.unknown)); 6029d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project newIntent.putExtra("TEXT", mCurrentCmd.geTextMessage()); 6039d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project startActivity(newIntent); 6049d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 6059d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 6069d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project private void launchEventMessage() { 6079d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project TextMessage msg = mCurrentCmd.geTextMessage(); 608b22e7d8c245f0ed30435227cd49e57aa0b526301John Joseph if (msg == null || msg.text == null) { 6099d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project return; 6109d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 6119d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project Toast toast = new Toast(mContext.getApplicationContext()); 6129d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project LayoutInflater inflate = (LayoutInflater) mContext 6139d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 6149d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project View v = inflate.inflate(R.layout.stk_event_msg, null); 6159d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project TextView tv = (TextView) v 6169d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project .findViewById(com.android.internal.R.id.message); 6179d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project ImageView iv = (ImageView) v 6189d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project .findViewById(com.android.internal.R.id.icon); 6199d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project if (msg.icon != null) { 6209d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project iv.setImageBitmap(msg.icon); 6219d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } else { 6229d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project iv.setVisibility(View.GONE); 6239d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 6249d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project if (!msg.iconSelfExplanatory) { 6259d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project tv.setText(msg.text); 6269d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 6279d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 6289d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project toast.setView(v); 6299d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project toast.setDuration(Toast.LENGTH_LONG); 6309d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project toast.setGravity(Gravity.BOTTOM, 0, 0); 6319d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project toast.show(); 6329d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 6339d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 6349d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project private void launchConfirmationDialog(TextMessage msg) { 6359d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project msg.title = lastSelectedItem; 6369d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project Intent newIntent = new Intent(this, StkDialogActivity.class); 6379d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project newIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK 6389d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project | Intent.FLAG_ACTIVITY_NO_HISTORY 6399d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS 6409d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project | getFlagActivityNoUserAction(InitiatedByUserAction.unknown)); 6419d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project newIntent.putExtra("TEXT", msg); 6429d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project startActivity(newIntent); 6439d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 6449d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 6459d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project private void launchBrowser(BrowserSettings settings) { 6469d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project if (settings == null) { 6479d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project return; 6489d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 6499d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project // Set browser launch mode 6509d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project Intent intent = new Intent(); 6519d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project intent.setClassName("com.android.browser", 6529d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project "com.android.browser.BrowserActivity"); 6539d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 65479085fcc5b4e54cc374e8720644ce4c1dc0004beWink Saville // to launch home page, make sure that data Uri is null. 6559d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project Uri data = null; 6569d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project if (settings.url != null) { 6579d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project data = Uri.parse(settings.url); 6589d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 6599d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project intent.setData(data); 6609d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 6619d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project switch (settings.mode) { 6629d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project case USE_EXISTING_BROWSER: 6639d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project intent.setAction(Intent.ACTION_VIEW); 6649d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 6659d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project break; 6669d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project case LAUNCH_NEW_BROWSER: 6679d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project intent.setAction(Intent.ACTION_VIEW); 6689d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project intent.addFlags(Intent.FLAG_ACTIVITY_MULTIPLE_TASK); 6699d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project break; 6709d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project case LAUNCH_IF_NOT_ALREADY_LAUNCHED: 6719d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 6729d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project break; 6739d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 6749d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project // start browser activity 6759d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project startActivity(intent); 6769d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project // a small delay, let the browser start, before processing the next command. 67779085fcc5b4e54cc374e8720644ce4c1dc0004beWink Saville // this is good for scenarios where a related DISPLAY TEXT command is 6789d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project // followed immediately. 6799d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project try { 6809d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project Thread.sleep(10000); 6819d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } catch (InterruptedException e) {} 6829d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 6839d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 6849d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project private void launchCallMsg() { 6859d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project TextMessage msg = mCurrentCmd.getCallSettings().callMsg; 6869d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project if (msg.text == null || msg.text.length() == 0) { 6879d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project return; 6889d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 6899d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project msg.title = lastSelectedItem; 6909d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 6919d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project Toast toast = Toast.makeText(mContext.getApplicationContext(), msg.text, 6929d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project Toast.LENGTH_LONG); 6939d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project toast.setGravity(Gravity.BOTTOM, 0, 0); 6949d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project toast.show(); 6959d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 6969d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 6979d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project private void launchIdleText() { 6989d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project TextMessage msg = mCurrentCmd.geTextMessage(); 6999d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project if (msg.text == null) { 7009d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project mNotificationManager.cancel(STK_NOTIFICATION_ID); 7019d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } else { 7029d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project Notification notification = new Notification(); 7039d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project RemoteViews contentView = new RemoteViews( 7049d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project PACKAGE_NAME, 7059d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project com.android.internal.R.layout.status_bar_latest_event_content); 7069d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 7079d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project notification.flags |= Notification.FLAG_NO_CLEAR; 7089d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project notification.icon = com.android.internal.R.drawable.stat_notify_sim_toolkit; 7099d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project // Set text and icon for the status bar and notification body. 7109d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project if (!msg.iconSelfExplanatory) { 7119d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project notification.tickerText = msg.text; 7129d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project contentView.setTextViewText(com.android.internal.R.id.text, 7139d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project msg.text); 7149d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 7159d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project if (msg.icon != null) { 7169d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project contentView.setImageViewBitmap(com.android.internal.R.id.icon, 7179d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project msg.icon); 7189d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } else { 7199d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project contentView 7209d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project .setImageViewResource( 7219d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project com.android.internal.R.id.icon, 7229d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project com.android.internal.R.drawable.stat_notify_sim_toolkit); 7239d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 7249d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project notification.contentView = contentView; 7259d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project notification.contentIntent = PendingIntent.getService(mContext, 0, 7269d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project new Intent(mContext, StkAppService.class), 0); 7279d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 7289d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project mNotificationManager.notify(STK_NOTIFICATION_ID, notification); 7299d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 7309d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 7319d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 7329d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project private void launchToneDialog() { 7339d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project Intent newIntent = new Intent(this, ToneDialog.class); 7349d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project newIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK 7359d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project | Intent.FLAG_ACTIVITY_NO_HISTORY 7369d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS 7379d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project | getFlagActivityNoUserAction(InitiatedByUserAction.unknown)); 7389d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project newIntent.putExtra("TEXT", mCurrentCmd.geTextMessage()); 7399d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project newIntent.putExtra("TONE", mCurrentCmd.getToneSettings()); 7409d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project startActivity(newIntent); 7419d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 7429d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 7439d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project private String getItemName(int itemId) { 7449d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project Menu menu = mCurrentCmd.getMenu(); 7459d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project if (menu == null) { 7469d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project return null; 7479d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 7489d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project for (Item item : menu.items) { 7499d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project if (item.id == itemId) { 7509d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project return item.text; 7519d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 7529d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 7539d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project return null; 7549d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 7559d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 7569d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project private boolean removeMenu() { 7579d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project try { 75879085fcc5b4e54cc374e8720644ce4c1dc0004beWink Saville if (mCurrentMenu.items.size() == 1 && 7599d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project mCurrentMenu.items.get(0) == null) { 7609d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project return true; 7619d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 7629d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } catch (NullPointerException e) { 7639d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project StkLog.d(this, "Unable to get Menu's items size"); 7649d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project return true; 7659d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 7669d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project return false; 7679d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 7689d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project} 769