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 19764167cd0542a766cafce2f30c7aba1cf9d4ea20Kazuhiro Ondoimport android.app.AlertDialog; 209d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Projectimport android.app.Notification; 219d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Projectimport android.app.NotificationManager; 229d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Projectimport android.app.PendingIntent; 239d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Projectimport android.app.Service; 249d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Projectimport android.content.Context; 25764167cd0542a766cafce2f30c7aba1cf9d4ea20Kazuhiro Ondoimport android.content.DialogInterface; 269d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Projectimport android.content.Intent; 2750e0a1db4e558a062763ed78d9de300cb133ff82Alex Khlivnuikimport android.graphics.Bitmap; 2850e0a1db4e558a062763ed78d9de300cb133ff82Alex Khlivnuikimport android.graphics.BitmapFactory; 299d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Projectimport android.net.Uri; 309d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Projectimport android.os.Bundle; 319d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Projectimport android.os.Handler; 329d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Projectimport android.os.IBinder; 339d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Projectimport android.os.Looper; 349d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Projectimport android.os.Message; 3556469d57db5e34913ec2ad1d28440ddfad9363a0Wink Savilleimport android.telephony.TelephonyManager; 369d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Projectimport android.view.Gravity; 379d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Projectimport android.view.LayoutInflater; 389d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Projectimport android.view.View; 39764167cd0542a766cafce2f30c7aba1cf9d4ea20Kazuhiro Ondoimport android.view.Window; 40764167cd0542a766cafce2f30c7aba1cf9d4ea20Kazuhiro Ondoimport android.view.WindowManager; 419d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Projectimport android.widget.ImageView; 429d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Projectimport android.widget.RemoteViews; 439d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Projectimport android.widget.TextView; 449d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Projectimport android.widget.Toast; 459d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 46d41f1d98d7bf42e9e867819593ad79f685604796Alex Yakavenkaimport com.android.internal.telephony.cat.AppInterface; 47d41f1d98d7bf42e9e867819593ad79f685604796Alex Yakavenkaimport com.android.internal.telephony.cat.Menu; 48d41f1d98d7bf42e9e867819593ad79f685604796Alex Yakavenkaimport com.android.internal.telephony.cat.Item; 4997503264db52c3bb23b436546390aba171c8e757Pierre Fröjdimport com.android.internal.telephony.cat.Input; 50d41f1d98d7bf42e9e867819593ad79f685604796Alex Yakavenkaimport com.android.internal.telephony.cat.ResultCode; 51d41f1d98d7bf42e9e867819593ad79f685604796Alex Yakavenkaimport com.android.internal.telephony.cat.CatCmdMessage; 52d41f1d98d7bf42e9e867819593ad79f685604796Alex Yakavenkaimport com.android.internal.telephony.cat.CatCmdMessage.BrowserSettings; 53d41f1d98d7bf42e9e867819593ad79f685604796Alex Yakavenkaimport com.android.internal.telephony.cat.CatLog; 54d41f1d98d7bf42e9e867819593ad79f685604796Alex Yakavenkaimport com.android.internal.telephony.cat.CatResponseMessage; 55d41f1d98d7bf42e9e867819593ad79f685604796Alex Yakavenkaimport com.android.internal.telephony.cat.TextMessage; 569d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 579d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Projectimport java.util.LinkedList; 589d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 599d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project/** 609d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project * SIM toolkit application level service. Interacts with Telephopny messages, 619d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project * application's launch and user input from STK UI elements. 6279085fcc5b4e54cc374e8720644ce4c1dc0004beWink Saville * 639d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project */ 649d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Projectpublic class StkAppService extends Service implements Runnable { 659d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 669d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project // members 679d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project private volatile Looper mServiceLooper; 689d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project private volatile ServiceHandler mServiceHandler; 699d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project private AppInterface mStkService; 709d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project private Context mContext = null; 71d41f1d98d7bf42e9e867819593ad79f685604796Alex Yakavenka private CatCmdMessage mMainCmd = null; 72d41f1d98d7bf42e9e867819593ad79f685604796Alex Yakavenka private CatCmdMessage mCurrentCmd = null; 739d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project private Menu mCurrentMenu = null; 749d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project private String lastSelectedItem = null; 759d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project private boolean mMenuIsVisibile = false; 769d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project private boolean responseNeeded = true; 779d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project private boolean mCmdInProgress = false; 789d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project private NotificationManager mNotificationManager = null; 799d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project private LinkedList<DelayedCmd> mCmdsQ = null; 809d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project private boolean launchBrowser = false; 819d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project private BrowserSettings mBrowserSettings = null; 829d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project static StkAppService sInstance = null; 839d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 849d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project // Used for setting FLAG_ACTIVITY_NO_USER_ACTION when 859d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project // creating an intent. 869d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project private enum InitiatedByUserAction { 879d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project yes, // The action was started via a user initiated action 889d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project unknown, // Not known for sure if user initated the action 899d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 909d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 919d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project // constants 929d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project static final String OPCODE = "op"; 939d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project static final String CMD_MSG = "cmd message"; 949d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project static final String RES_ID = "response id"; 959d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project static final String MENU_SELECTION = "menu selection"; 969d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project static final String INPUT = "input"; 979d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project static final String HELP = "help"; 989d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project static final String CONFIRMATION = "confirm"; 99764167cd0542a766cafce2f30c7aba1cf9d4ea20Kazuhiro Ondo static final String CHOICE = "choice"; 1009d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 1019d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project // operations ids for different service functionality. 1029d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project static final int OP_CMD = 1; 1039d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project static final int OP_RESPONSE = 2; 1049d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project static final int OP_LAUNCH_APP = 3; 1059d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project static final int OP_END_SESSION = 4; 1069d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project static final int OP_BOOT_COMPLETED = 5; 1079d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project private static final int OP_DELAYED_MSG = 6; 1089d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 1099d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project // Response ids 1109d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project static final int RES_ID_MENU_SELECTION = 11; 1119d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project static final int RES_ID_INPUT = 12; 1129d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project static final int RES_ID_CONFIRM = 13; 1139d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project static final int RES_ID_DONE = 14; 114764167cd0542a766cafce2f30c7aba1cf9d4ea20Kazuhiro Ondo static final int RES_ID_CHOICE = 15; 1159d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 1169d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project static final int RES_ID_TIMEOUT = 20; 1179d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project static final int RES_ID_BACKWARD = 21; 1189d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project static final int RES_ID_END_SESSION = 22; 1199d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project static final int RES_ID_EXIT = 23; 1209d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 121764167cd0542a766cafce2f30c7aba1cf9d4ea20Kazuhiro Ondo static final int YES = 1; 122764167cd0542a766cafce2f30c7aba1cf9d4ea20Kazuhiro Ondo static final int NO = 0; 123764167cd0542a766cafce2f30c7aba1cf9d4ea20Kazuhiro Ondo 1249d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project private static final String PACKAGE_NAME = "com.android.stk"; 12579085fcc5b4e54cc374e8720644ce4c1dc0004beWink Saville private static final String MENU_ACTIVITY_NAME = 1269d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project PACKAGE_NAME + ".StkMenuActivity"; 12779085fcc5b4e54cc374e8720644ce4c1dc0004beWink Saville private static final String INPUT_ACTIVITY_NAME = 1289d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project PACKAGE_NAME + ".StkInputActivity"; 12979085fcc5b4e54cc374e8720644ce4c1dc0004beWink Saville 1309d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project // Notification id used to display Idle Mode text in NotificationManager. 1319d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project private static final int STK_NOTIFICATION_ID = 333; 13279085fcc5b4e54cc374e8720644ce4c1dc0004beWink Saville 13379085fcc5b4e54cc374e8720644ce4c1dc0004beWink Saville // Inner class used for queuing telephony messages (proactive commands, 1349d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project // session end) while the service is busy processing a previous message. 1359d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project private class DelayedCmd { 1369d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project // members 1379d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project int id; 138d41f1d98d7bf42e9e867819593ad79f685604796Alex Yakavenka CatCmdMessage msg; 1399d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 140d41f1d98d7bf42e9e867819593ad79f685604796Alex Yakavenka DelayedCmd(int id, CatCmdMessage msg) { 1419d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project this.id = id; 1429d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project this.msg = msg; 1439d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 1449d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 1459d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 1469d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project @Override 1479d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project public void onCreate() { 1489d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project // Initialize members 1499d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project mCmdsQ = new LinkedList<DelayedCmd>(); 1509d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project Thread serviceThread = new Thread(null, this, "Stk App Service"); 1519d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project serviceThread.start(); 1529d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project mContext = getBaseContext(); 1539d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project mNotificationManager = (NotificationManager) mContext 1549d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project .getSystemService(Context.NOTIFICATION_SERVICE); 1559d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project sInstance = this; 1569d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 1579d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 1589d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project @Override 1599d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project public void onStart(Intent intent, int startId) { 1609d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 16187cda96d48c89f3fe8606241752ec5a8810ef692Banavathu, Srinivas Naik mStkService = com.android.internal.telephony.cat.CatService 16287cda96d48c89f3fe8606241752ec5a8810ef692Banavathu, Srinivas Naik .getInstance(); 16387cda96d48c89f3fe8606241752ec5a8810ef692Banavathu, Srinivas Naik 16487cda96d48c89f3fe8606241752ec5a8810ef692Banavathu, Srinivas Naik if (mStkService == null) { 16587cda96d48c89f3fe8606241752ec5a8810ef692Banavathu, Srinivas Naik stopSelf(); 16687cda96d48c89f3fe8606241752ec5a8810ef692Banavathu, Srinivas Naik CatLog.d(this, " Unable to get Service handle"); 167ae29158d46bced241f956896cab6588a89e0478aduho.ro StkAppInstaller.unInstall(mContext); 16887cda96d48c89f3fe8606241752ec5a8810ef692Banavathu, Srinivas Naik return; 16987cda96d48c89f3fe8606241752ec5a8810ef692Banavathu, Srinivas Naik } 17087cda96d48c89f3fe8606241752ec5a8810ef692Banavathu, Srinivas Naik 17187cda96d48c89f3fe8606241752ec5a8810ef692Banavathu, Srinivas Naik waitForLooper(); 17262acae4b3214cdfe7e959d3a639abb8994918591John Wang // onStart() method can be passed a null intent 17362acae4b3214cdfe7e959d3a639abb8994918591John Wang // TODO: replace onStart() with onStartCommand() 17462acae4b3214cdfe7e959d3a639abb8994918591John Wang if (intent == null) { 17562acae4b3214cdfe7e959d3a639abb8994918591John Wang return; 17662acae4b3214cdfe7e959d3a639abb8994918591John Wang } 17762acae4b3214cdfe7e959d3a639abb8994918591John Wang 1789d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project Bundle args = intent.getExtras(); 17962acae4b3214cdfe7e959d3a639abb8994918591John Wang 1809d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project if (args == null) { 1819d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project return; 1829d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 1839d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 1849d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project Message msg = mServiceHandler.obtainMessage(); 1859d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project msg.arg1 = args.getInt(OPCODE); 1869d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project switch(msg.arg1) { 1879d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project case OP_CMD: 1889d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project msg.obj = args.getParcelable(CMD_MSG); 1899d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project break; 1909d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project case OP_RESPONSE: 1919d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project msg.obj = args; 1929d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project /* falls through */ 1939d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project case OP_LAUNCH_APP: 1949d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project case OP_END_SESSION: 1959d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project case OP_BOOT_COMPLETED: 1969d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project break; 1979d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project default: 1989d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project return; 1999d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 2009d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project mServiceHandler.sendMessage(msg); 2019d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 2029d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 2039d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project @Override 2049d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project public void onDestroy() { 2059d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project waitForLooper(); 2069d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project mServiceLooper.quit(); 2079d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 2089d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 2099d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project @Override 2109d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project public IBinder onBind(Intent intent) { 2119d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project return null; 2129d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 2139d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 2149d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project public void run() { 2159d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project Looper.prepare(); 2169d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 2179d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project mServiceLooper = Looper.myLooper(); 2189d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project mServiceHandler = new ServiceHandler(); 2199d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 2209d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project Looper.loop(); 2219d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 2229d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 2239d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project /* 2249d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project * Package api used by StkMenuActivity to indicate if its on the foreground. 2259d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project */ 2269d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project void indicateMenuVisibility(boolean visibility) { 2279d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project mMenuIsVisibile = visibility; 2289d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 2299d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 2309d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project /* 2319d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project * Package api used by StkMenuActivity to get its Menu parameter. 2329d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project */ 2339d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project Menu getMenu() { 2349d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project return mCurrentMenu; 2359d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 2369d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 2379d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project /* 2389d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project * Package api used by UI Activities and Dialogs to communicate directly 2399d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project * with the service to deliver state information and parameters. 2409d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project */ 2419d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project static StkAppService getInstance() { 2429d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project return sInstance; 2439d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 2449d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 2459d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project private void waitForLooper() { 2469d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project while (mServiceHandler == null) { 2479d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project synchronized (this) { 2489d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project try { 2499d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project wait(100); 2509d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } catch (InterruptedException e) { 2519d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 2529d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 2539d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 2549d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 2559d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 2569d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project private final class ServiceHandler extends Handler { 2579d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project @Override 2589d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project public void handleMessage(Message msg) { 2599d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project int opcode = msg.arg1; 2609d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 2619d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project switch (opcode) { 2629d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project case OP_LAUNCH_APP: 2639d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project if (mMainCmd == null) { 2649d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project // nothing todo when no SET UP MENU command didn't arrive. 2659d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project return; 2669d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 2679d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project launchMenuActivity(null); 2689d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project break; 2699d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project case OP_CMD: 270d41f1d98d7bf42e9e867819593ad79f685604796Alex Yakavenka CatCmdMessage cmdMsg = (CatCmdMessage) msg.obj; 2719d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project // There are two types of commands: 2729d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project // 1. Interactive - user's response is required. 2739d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project // 2. Informative - display a message, no interaction with the user. 2749d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project // 27579085fcc5b4e54cc374e8720644ce4c1dc0004beWink Saville // Informative commands can be handled immediately without any delay. 2769d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project // Interactive commands can't override each other. So if a command 2779d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project // is already in progress, we need to queue the next command until 2789d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project // the user has responded or a timeout expired. 2799d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project if (!isCmdInteractive(cmdMsg)) { 2809d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project handleCmd(cmdMsg); 2819d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } else { 2829d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project if (!mCmdInProgress) { 2839d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project mCmdInProgress = true; 284d41f1d98d7bf42e9e867819593ad79f685604796Alex Yakavenka handleCmd((CatCmdMessage) msg.obj); 2859d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } else { 2869d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project mCmdsQ.addLast(new DelayedCmd(OP_CMD, 287d41f1d98d7bf42e9e867819593ad79f685604796Alex Yakavenka (CatCmdMessage) msg.obj)); 2889d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 2899d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 2909d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project break; 2919d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project case OP_RESPONSE: 2929d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project if (responseNeeded) { 2939d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project handleCmdResponse((Bundle) msg.obj); 2949d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 2959d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project // call delayed commands if needed. 2969d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project if (mCmdsQ.size() != 0) { 2979d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project callDelayedMsg(); 2989d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } else { 2999d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project mCmdInProgress = false; 3009d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 3019d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project // reset response needed state var to its original value. 3029d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project responseNeeded = true; 3039d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project break; 3049d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project case OP_END_SESSION: 3059d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project if (!mCmdInProgress) { 3069d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project mCmdInProgress = true; 3079d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project handleSessionEnd(); 3089d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } else { 3099d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project mCmdsQ.addLast(new DelayedCmd(OP_END_SESSION, null)); 3109d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 3119d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project break; 3129d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project case OP_BOOT_COMPLETED: 313d41f1d98d7bf42e9e867819593ad79f685604796Alex Yakavenka CatLog.d(this, "OP_BOOT_COMPLETED"); 3149d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project if (mMainCmd == null) { 3159d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project StkAppInstaller.unInstall(mContext); 3169d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 3179d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project break; 3189d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project case OP_DELAYED_MSG: 3199d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project handleDelayedCmd(); 3209d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project break; 3219d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 3229d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 3239d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 3249d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 325d41f1d98d7bf42e9e867819593ad79f685604796Alex Yakavenka private boolean isCmdInteractive(CatCmdMessage cmd) { 3269d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project switch (cmd.getCmdType()) { 3279d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project case SEND_DTMF: 3289d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project case SEND_SMS: 3299d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project case SEND_SS: 3309d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project case SEND_USSD: 3319d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project case SET_UP_IDLE_MODE_TEXT: 3329d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project case SET_UP_MENU: 333764167cd0542a766cafce2f30c7aba1cf9d4ea20Kazuhiro Ondo case CLOSE_CHANNEL: 334764167cd0542a766cafce2f30c7aba1cf9d4ea20Kazuhiro Ondo case RECEIVE_DATA: 335764167cd0542a766cafce2f30c7aba1cf9d4ea20Kazuhiro Ondo case SEND_DATA: 3369d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project return false; 3379d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 3389d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 3399d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project return true; 3409d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 3419d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 3429d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project private void handleDelayedCmd() { 3439d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project if (mCmdsQ.size() != 0) { 3449d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project DelayedCmd cmd = mCmdsQ.poll(); 3459d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project switch (cmd.id) { 3469d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project case OP_CMD: 3479d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project handleCmd(cmd.msg); 3489d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project break; 3499d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project case OP_END_SESSION: 3509d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project handleSessionEnd(); 3519d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project break; 3529d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 3539d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 3549d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 3559d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 3569d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project private void callDelayedMsg() { 3579d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project Message msg = mServiceHandler.obtainMessage(); 3589d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project msg.arg1 = OP_DELAYED_MSG; 3599d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project mServiceHandler.sendMessage(msg); 3609d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 3619d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 3629d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project private void handleSessionEnd() { 3639d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project mCurrentCmd = mMainCmd; 3649d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project lastSelectedItem = null; 36579085fcc5b4e54cc374e8720644ce4c1dc0004beWink Saville // In case of SET UP MENU command which removed the app, don't 3669d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project // update the current menu member. 3679d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project if (mCurrentMenu != null && mMainCmd != null) { 3689d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project mCurrentMenu = mMainCmd.getMenu(); 3699d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 3709d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project if (mMenuIsVisibile) { 3719d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project launchMenuActivity(null); 3729d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 3739d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project if (mCmdsQ.size() != 0) { 3749d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project callDelayedMsg(); 3759d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } else { 3769d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project mCmdInProgress = false; 3779d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 3789d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project // In case a launch browser command was just confirmed, launch that url. 3799d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project if (launchBrowser) { 3809d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project launchBrowser = false; 3819d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project launchBrowser(mBrowserSettings); 3829d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 3839d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 3849d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 385d41f1d98d7bf42e9e867819593ad79f685604796Alex Yakavenka private void handleCmd(CatCmdMessage cmdMsg) { 3869d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project if (cmdMsg == null) { 3879d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project return; 3889d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 3899d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project // save local reference for state tracking. 3909d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project mCurrentCmd = cmdMsg; 3919d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project boolean waitForUsersResponse = true; 3929d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 393d41f1d98d7bf42e9e867819593ad79f685604796Alex Yakavenka CatLog.d(this, cmdMsg.getCmdType().name()); 3949d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project switch (cmdMsg.getCmdType()) { 3959d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project case DISPLAY_TEXT: 3969d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project TextMessage msg = cmdMsg.geTextMessage(); 3979d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project responseNeeded = msg.responseNeeded; 398854a25c27e36a2d8b9117abecb3573bec27bb535Jeevaka Badrappan waitForUsersResponse = msg.responseNeeded; 3999d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project if (lastSelectedItem != null) { 4009d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project msg.title = lastSelectedItem; 4019d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } else if (mMainCmd != null){ 4029d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project msg.title = mMainCmd.getMenu().title; 4039d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } else { 4049d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project // TODO: get the carrier name from the SIM 4059d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project msg.title = ""; 4069d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 4079d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project launchTextDialog(); 4089d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project break; 4099d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project case SELECT_ITEM: 4109d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project mCurrentMenu = cmdMsg.getMenu(); 4119d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project launchMenuActivity(cmdMsg.getMenu()); 4129d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project break; 4139d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project case SET_UP_MENU: 4149d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project mMainCmd = mCurrentCmd; 4159d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project mCurrentMenu = cmdMsg.getMenu(); 4169d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project if (removeMenu()) { 417d41f1d98d7bf42e9e867819593ad79f685604796Alex Yakavenka CatLog.d(this, "Uninstall App"); 4189d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project mCurrentMenu = null; 4199d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project StkAppInstaller.unInstall(mContext); 4209d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } else { 421d41f1d98d7bf42e9e867819593ad79f685604796Alex Yakavenka CatLog.d(this, "Install App"); 4229d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project StkAppInstaller.install(mContext); 4239d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 4249d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project if (mMenuIsVisibile) { 4259d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project launchMenuActivity(null); 4269d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 4279d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project break; 4289d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project case GET_INPUT: 4299d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project case GET_INKEY: 4309d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project launchInputActivity(); 4319d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project break; 4329d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project case SET_UP_IDLE_MODE_TEXT: 4339d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project waitForUsersResponse = false; 4349d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project launchIdleText(); 4359d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project break; 4369d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project case SEND_DTMF: 4379d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project case SEND_SMS: 4389d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project case SEND_SS: 4399d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project case SEND_USSD: 4409d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project waitForUsersResponse = false; 4419d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project launchEventMessage(); 4429d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project break; 4439d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project case LAUNCH_BROWSER: 4449d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project launchConfirmationDialog(mCurrentCmd.geTextMessage()); 4459d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project break; 4469d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project case SET_UP_CALL: 4479d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project launchConfirmationDialog(mCurrentCmd.getCallSettings().confirmMsg); 4489d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project break; 4499d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project case PLAY_TONE: 4509d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project launchToneDialog(); 4519d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project break; 452764167cd0542a766cafce2f30c7aba1cf9d4ea20Kazuhiro Ondo case OPEN_CHANNEL: 453764167cd0542a766cafce2f30c7aba1cf9d4ea20Kazuhiro Ondo launchOpenChannelDialog(); 454764167cd0542a766cafce2f30c7aba1cf9d4ea20Kazuhiro Ondo break; 455764167cd0542a766cafce2f30c7aba1cf9d4ea20Kazuhiro Ondo case CLOSE_CHANNEL: 456764167cd0542a766cafce2f30c7aba1cf9d4ea20Kazuhiro Ondo case RECEIVE_DATA: 457764167cd0542a766cafce2f30c7aba1cf9d4ea20Kazuhiro Ondo case SEND_DATA: 458764167cd0542a766cafce2f30c7aba1cf9d4ea20Kazuhiro Ondo TextMessage m = mCurrentCmd.geTextMessage(); 459764167cd0542a766cafce2f30c7aba1cf9d4ea20Kazuhiro Ondo 460764167cd0542a766cafce2f30c7aba1cf9d4ea20Kazuhiro Ondo if ((m != null) && (m.text == null)) { 461764167cd0542a766cafce2f30c7aba1cf9d4ea20Kazuhiro Ondo switch(cmdMsg.getCmdType()) { 462764167cd0542a766cafce2f30c7aba1cf9d4ea20Kazuhiro Ondo case CLOSE_CHANNEL: 463764167cd0542a766cafce2f30c7aba1cf9d4ea20Kazuhiro Ondo m.text = getResources().getString(R.string.default_close_channel_msg); 464764167cd0542a766cafce2f30c7aba1cf9d4ea20Kazuhiro Ondo break; 465764167cd0542a766cafce2f30c7aba1cf9d4ea20Kazuhiro Ondo case RECEIVE_DATA: 466764167cd0542a766cafce2f30c7aba1cf9d4ea20Kazuhiro Ondo m.text = getResources().getString(R.string.default_receive_data_msg); 467764167cd0542a766cafce2f30c7aba1cf9d4ea20Kazuhiro Ondo break; 468764167cd0542a766cafce2f30c7aba1cf9d4ea20Kazuhiro Ondo case SEND_DATA: 469764167cd0542a766cafce2f30c7aba1cf9d4ea20Kazuhiro Ondo m.text = getResources().getString(R.string.default_send_data_msg); 470764167cd0542a766cafce2f30c7aba1cf9d4ea20Kazuhiro Ondo break; 471764167cd0542a766cafce2f30c7aba1cf9d4ea20Kazuhiro Ondo } 472764167cd0542a766cafce2f30c7aba1cf9d4ea20Kazuhiro Ondo } 473cacf7b8944cb0eb03cdb38b00aba7ffaac6971d5Siddartha Pothapragada /* 474cacf7b8944cb0eb03cdb38b00aba7ffaac6971d5Siddartha Pothapragada * Display indication in the form of a toast to the user if required. 475cacf7b8944cb0eb03cdb38b00aba7ffaac6971d5Siddartha Pothapragada */ 476cacf7b8944cb0eb03cdb38b00aba7ffaac6971d5Siddartha Pothapragada launchEventMessage(); 477764167cd0542a766cafce2f30c7aba1cf9d4ea20Kazuhiro Ondo break; 4789d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 4799d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 4809d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project if (!waitForUsersResponse) { 4819d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project if (mCmdsQ.size() != 0) { 4829d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project callDelayedMsg(); 4839d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } else { 4849d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project mCmdInProgress = false; 4859d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 4869d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 4879d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 4889d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 4899d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project private void handleCmdResponse(Bundle args) { 4909d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project if (mCurrentCmd == null) { 4919d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project return; 4929d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 493d8e2ecdca2d1bc91f48cea59e96aa5b0b452e8a7Alex Yakavenka if (mStkService == null) { 494d8e2ecdca2d1bc91f48cea59e96aa5b0b452e8a7Alex Yakavenka mStkService = com.android.internal.telephony.cat.CatService.getInstance(); 495d8e2ecdca2d1bc91f48cea59e96aa5b0b452e8a7Alex Yakavenka if (mStkService == null) { 496d8e2ecdca2d1bc91f48cea59e96aa5b0b452e8a7Alex Yakavenka // This should never happen (we should be responding only to a message 497d8e2ecdca2d1bc91f48cea59e96aa5b0b452e8a7Alex Yakavenka // that arrived from StkService). It has to exist by this time 498d8e2ecdca2d1bc91f48cea59e96aa5b0b452e8a7Alex Yakavenka throw new RuntimeException("mStkService is null when we need to send response"); 499d8e2ecdca2d1bc91f48cea59e96aa5b0b452e8a7Alex Yakavenka } 500d8e2ecdca2d1bc91f48cea59e96aa5b0b452e8a7Alex Yakavenka } 501d8e2ecdca2d1bc91f48cea59e96aa5b0b452e8a7Alex Yakavenka 502d41f1d98d7bf42e9e867819593ad79f685604796Alex Yakavenka CatResponseMessage resMsg = new CatResponseMessage(mCurrentCmd); 5039d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 5049d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project // set result code 5059d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project boolean helpRequired = args.getBoolean(HELP, false); 506cacf7b8944cb0eb03cdb38b00aba7ffaac6971d5Siddartha Pothapragada boolean confirmed = false; 5079d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 5089d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project switch(args.getInt(RES_ID)) { 5099d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project case RES_ID_MENU_SELECTION: 510d41f1d98d7bf42e9e867819593ad79f685604796Alex Yakavenka CatLog.d(this, "RES_ID_MENU_SELECTION"); 5119d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project int menuSelection = args.getInt(MENU_SELECTION); 5129d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project switch(mCurrentCmd.getCmdType()) { 5139d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project case SET_UP_MENU: 5149d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project case SELECT_ITEM: 5159d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project lastSelectedItem = getItemName(menuSelection); 5169d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project if (helpRequired) { 5179d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project resMsg.setResultCode(ResultCode.HELP_INFO_REQUIRED); 5189d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } else { 5199d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project resMsg.setResultCode(ResultCode.OK); 5209d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 5219d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project resMsg.setMenuSelection(menuSelection); 5229d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project break; 5239d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 5249d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project break; 5259d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project case RES_ID_INPUT: 526d41f1d98d7bf42e9e867819593ad79f685604796Alex Yakavenka CatLog.d(this, "RES_ID_INPUT"); 5279d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project String input = args.getString(INPUT); 52897503264db52c3bb23b436546390aba171c8e757Pierre Fröjd Input cmdInput = mCurrentCmd.geInput(); 52997503264db52c3bb23b436546390aba171c8e757Pierre Fröjd if (cmdInput != null && cmdInput.yesNo) { 5309d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project boolean yesNoSelection = input 5319d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project .equals(StkInputActivity.YES_STR_RESPONSE); 5329d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project resMsg.setYesNo(yesNoSelection); 5339d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } else { 5349d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project if (helpRequired) { 5359d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project resMsg.setResultCode(ResultCode.HELP_INFO_REQUIRED); 5369d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } else { 5379d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project resMsg.setResultCode(ResultCode.OK); 5389d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project resMsg.setInput(input); 5399d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 5409d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 5419d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project break; 5429d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project case RES_ID_CONFIRM: 543d41f1d98d7bf42e9e867819593ad79f685604796Alex Yakavenka CatLog.d(this, "RES_ID_CONFIRM"); 544cacf7b8944cb0eb03cdb38b00aba7ffaac6971d5Siddartha Pothapragada confirmed = args.getBoolean(CONFIRMATION); 5459d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project switch (mCurrentCmd.getCmdType()) { 5469d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project case DISPLAY_TEXT: 5479d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project resMsg.setResultCode(confirmed ? ResultCode.OK 5489d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project : ResultCode.UICC_SESSION_TERM_BY_USER); 5499d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project break; 5509d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project case LAUNCH_BROWSER: 5519d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project resMsg.setResultCode(confirmed ? ResultCode.OK 5529d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project : ResultCode.UICC_SESSION_TERM_BY_USER); 5539d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project if (confirmed) { 5549d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project launchBrowser = true; 5559d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project mBrowserSettings = mCurrentCmd.getBrowserSettings(); 5569d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 5579d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project break; 5589d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project case SET_UP_CALL: 5599d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project resMsg.setResultCode(ResultCode.OK); 5609d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project resMsg.setConfirmation(confirmed); 5619d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project if (confirmed) { 5623aec01c0d7d831bad20289df36fec77864f4155fJohan Hellman launchEventMessage(mCurrentCmd.getCallSettings().callMsg); 5639d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 5649d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project break; 5659d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 5669d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project break; 5679d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project case RES_ID_DONE: 5689d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project resMsg.setResultCode(ResultCode.OK); 5699d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project break; 5709d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project case RES_ID_BACKWARD: 571d41f1d98d7bf42e9e867819593ad79f685604796Alex Yakavenka CatLog.d(this, "RES_ID_BACKWARD"); 5729d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project resMsg.setResultCode(ResultCode.BACKWARD_MOVE_BY_USER); 5739d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project break; 5749d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project case RES_ID_END_SESSION: 575d41f1d98d7bf42e9e867819593ad79f685604796Alex Yakavenka CatLog.d(this, "RES_ID_END_SESSION"); 5769d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project resMsg.setResultCode(ResultCode.UICC_SESSION_TERM_BY_USER); 5779d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project break; 5789d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project case RES_ID_TIMEOUT: 579d41f1d98d7bf42e9e867819593ad79f685604796Alex Yakavenka CatLog.d(this, "RES_ID_TIMEOUT"); 580d517689fb08e95c8e5a23385b5744ae5af2e4678Naveen Kalla // GCF test-case 27.22.4.1.1 Expected Sequence 1.5 (DISPLAY TEXT, 581d517689fb08e95c8e5a23385b5744ae5af2e4678Naveen Kalla // Clear message after delay, successful) expects result code OK. 582d517689fb08e95c8e5a23385b5744ae5af2e4678Naveen Kalla // If the command qualifier specifies no user response is required 583d517689fb08e95c8e5a23385b5744ae5af2e4678Naveen Kalla // then send OK instead of NO_RESPONSE_FROM_USER 584d517689fb08e95c8e5a23385b5744ae5af2e4678Naveen Kalla if ((mCurrentCmd.getCmdType().value() == AppInterface.CommandType.DISPLAY_TEXT 585d517689fb08e95c8e5a23385b5744ae5af2e4678Naveen Kalla .value()) 586d517689fb08e95c8e5a23385b5744ae5af2e4678Naveen Kalla && (mCurrentCmd.geTextMessage().userClear == false)) { 587d517689fb08e95c8e5a23385b5744ae5af2e4678Naveen Kalla resMsg.setResultCode(ResultCode.OK); 588d517689fb08e95c8e5a23385b5744ae5af2e4678Naveen Kalla } else { 589d517689fb08e95c8e5a23385b5744ae5af2e4678Naveen Kalla resMsg.setResultCode(ResultCode.NO_RESPONSE_FROM_USER); 590d517689fb08e95c8e5a23385b5744ae5af2e4678Naveen Kalla } 5919d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project break; 592764167cd0542a766cafce2f30c7aba1cf9d4ea20Kazuhiro Ondo case RES_ID_CHOICE: 593764167cd0542a766cafce2f30c7aba1cf9d4ea20Kazuhiro Ondo int choice = args.getInt(CHOICE); 594764167cd0542a766cafce2f30c7aba1cf9d4ea20Kazuhiro Ondo CatLog.d(this, "User Choice=" + choice); 595764167cd0542a766cafce2f30c7aba1cf9d4ea20Kazuhiro Ondo switch (choice) { 596764167cd0542a766cafce2f30c7aba1cf9d4ea20Kazuhiro Ondo case YES: 597764167cd0542a766cafce2f30c7aba1cf9d4ea20Kazuhiro Ondo resMsg.setResultCode(ResultCode.OK); 598cacf7b8944cb0eb03cdb38b00aba7ffaac6971d5Siddartha Pothapragada confirmed = true; 599764167cd0542a766cafce2f30c7aba1cf9d4ea20Kazuhiro Ondo break; 600764167cd0542a766cafce2f30c7aba1cf9d4ea20Kazuhiro Ondo case NO: 601764167cd0542a766cafce2f30c7aba1cf9d4ea20Kazuhiro Ondo resMsg.setResultCode(ResultCode.USER_NOT_ACCEPT); 602764167cd0542a766cafce2f30c7aba1cf9d4ea20Kazuhiro Ondo break; 603764167cd0542a766cafce2f30c7aba1cf9d4ea20Kazuhiro Ondo } 604cacf7b8944cb0eb03cdb38b00aba7ffaac6971d5Siddartha Pothapragada 605cacf7b8944cb0eb03cdb38b00aba7ffaac6971d5Siddartha Pothapragada if (mCurrentCmd.getCmdType().value() == AppInterface.CommandType.OPEN_CHANNEL 606cacf7b8944cb0eb03cdb38b00aba7ffaac6971d5Siddartha Pothapragada .value()) { 607cacf7b8944cb0eb03cdb38b00aba7ffaac6971d5Siddartha Pothapragada resMsg.setConfirmation(confirmed); 608cacf7b8944cb0eb03cdb38b00aba7ffaac6971d5Siddartha Pothapragada } 609764167cd0542a766cafce2f30c7aba1cf9d4ea20Kazuhiro Ondo break; 610cacf7b8944cb0eb03cdb38b00aba7ffaac6971d5Siddartha Pothapragada 6119d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project default: 612d41f1d98d7bf42e9e867819593ad79f685604796Alex Yakavenka CatLog.d(this, "Unknown result id"); 6139d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project return; 6149d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 6159d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project mStkService.onCmdResponse(resMsg); 6169d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 6179d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 6189d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project /** 6199d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project * Returns 0 or FLAG_ACTIVITY_NO_USER_ACTION, 0 means the user initiated the action. 6209d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project * 6219d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project * @param userAction If the userAction is yes then we always return 0 otherwise 6229d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project * mMenuIsVisible is used to determine what to return. If mMenuIsVisible is true 6239d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project * then we are the foreground app and we'll return 0 as from our perspective a 6249d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project * user action did cause. If it's false than we aren't the foreground app and 6259d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project * FLAG_ACTIVITY_NO_USER_ACTION is returned. 62679085fcc5b4e54cc374e8720644ce4c1dc0004beWink Saville * 6279d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project * @return 0 or FLAG_ACTIVITY_NO_USER_ACTION 6289d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project */ 6299d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project private int getFlagActivityNoUserAction(InitiatedByUserAction userAction) { 6309d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project return ((userAction == InitiatedByUserAction.yes) | mMenuIsVisibile) ? 6319d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 0 : Intent.FLAG_ACTIVITY_NO_USER_ACTION; 6329d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 6339d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 6349d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project private void launchMenuActivity(Menu menu) { 6359d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project Intent newIntent = new Intent(Intent.ACTION_VIEW); 6369d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project newIntent.setClassName(PACKAGE_NAME, MENU_ACTIVITY_NAME); 6379d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project int intentFlags = Intent.FLAG_ACTIVITY_NEW_TASK 6389d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project | Intent.FLAG_ACTIVITY_CLEAR_TOP; 6399d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project if (menu == null) { 6409d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project // We assume this was initiated by the user pressing the tool kit icon 6419d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project intentFlags |= getFlagActivityNoUserAction(InitiatedByUserAction.yes); 6429d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 6439d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project newIntent.putExtra("STATE", StkMenuActivity.STATE_MAIN); 6449d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } else { 6459d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project // We don't know and we'll let getFlagActivityNoUserAction decide. 6469d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project intentFlags |= getFlagActivityNoUserAction(InitiatedByUserAction.unknown); 6479d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 6489d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project newIntent.putExtra("STATE", StkMenuActivity.STATE_SECONDARY); 6499d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 6509d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project newIntent.setFlags(intentFlags); 6519d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project mContext.startActivity(newIntent); 6529d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 6539d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 6549d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project private void launchInputActivity() { 6559d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project Intent newIntent = new Intent(Intent.ACTION_VIEW); 6569d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project newIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK 6579d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project | getFlagActivityNoUserAction(InitiatedByUserAction.unknown)); 6589d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project newIntent.setClassName(PACKAGE_NAME, INPUT_ACTIVITY_NAME); 6599d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project newIntent.putExtra("INPUT", mCurrentCmd.geInput()); 6609d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project mContext.startActivity(newIntent); 6619d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 6629d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 6639d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project private void launchTextDialog() { 6649d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project Intent newIntent = new Intent(this, StkDialogActivity.class); 6659d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project newIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK 66676abd4b04564e5a7ad7e98c54cef12d5090c4eceduho.ro | Intent.FLAG_ACTIVITY_CLEAR_TOP 6679d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project | Intent.FLAG_ACTIVITY_NO_HISTORY 6689d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS 6699d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project | getFlagActivityNoUserAction(InitiatedByUserAction.unknown)); 6709d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project newIntent.putExtra("TEXT", mCurrentCmd.geTextMessage()); 6719d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project startActivity(newIntent); 6729d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 6739d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 6749d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project private void launchEventMessage() { 6753aec01c0d7d831bad20289df36fec77864f4155fJohan Hellman launchEventMessage(mCurrentCmd.geTextMessage()); 6763aec01c0d7d831bad20289df36fec77864f4155fJohan Hellman } 6773aec01c0d7d831bad20289df36fec77864f4155fJohan Hellman 6783aec01c0d7d831bad20289df36fec77864f4155fJohan Hellman private void launchEventMessage(TextMessage msg) { 679b22e7d8c245f0ed30435227cd49e57aa0b526301John Joseph if (msg == null || msg.text == null) { 6809d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project return; 6819d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 6829d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project Toast toast = new Toast(mContext.getApplicationContext()); 6839d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project LayoutInflater inflate = (LayoutInflater) mContext 6849d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 6859d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project View v = inflate.inflate(R.layout.stk_event_msg, null); 6869d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project TextView tv = (TextView) v 6879d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project .findViewById(com.android.internal.R.id.message); 6889d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project ImageView iv = (ImageView) v 6899d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project .findViewById(com.android.internal.R.id.icon); 6909d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project if (msg.icon != null) { 6919d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project iv.setImageBitmap(msg.icon); 6929d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } else { 6939d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project iv.setVisibility(View.GONE); 6949d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 6959d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project if (!msg.iconSelfExplanatory) { 6969d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project tv.setText(msg.text); 6979d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 6989d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 6999d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project toast.setView(v); 7009d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project toast.setDuration(Toast.LENGTH_LONG); 7019d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project toast.setGravity(Gravity.BOTTOM, 0, 0); 7029d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project toast.show(); 7039d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 7049d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 7059d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project private void launchConfirmationDialog(TextMessage msg) { 7069d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project msg.title = lastSelectedItem; 7079d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project Intent newIntent = new Intent(this, StkDialogActivity.class); 7089d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project newIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK 7099d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project | Intent.FLAG_ACTIVITY_NO_HISTORY 7109d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS 7119d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project | getFlagActivityNoUserAction(InitiatedByUserAction.unknown)); 7129d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project newIntent.putExtra("TEXT", msg); 7139d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project startActivity(newIntent); 7149d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 7159d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 7169d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project private void launchBrowser(BrowserSettings settings) { 7179d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project if (settings == null) { 7189d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project return; 7199d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 7209d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 721840c82f34e96d3526516c5c55c0c270355561906Abhishek Adappa Intent intent = null; 722840c82f34e96d3526516c5c55c0c270355561906Abhishek Adappa Uri data = null; 7237c03cfef65a056c490a4557606436302cb0bb385David Brown 7249d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project if (settings.url != null) { 725486c1d0da1a50afdda7264e338145a331ba172bbdujin.cha CatLog.d(this, "settings.url = " + settings.url); 7262a0eb2acdc369734e1264c8d8f9955d704508b53dujin.cha if ((settings.url.startsWith("http://") || (settings.url.startsWith("https://")))) { 727486c1d0da1a50afdda7264e338145a331ba172bbdujin.cha data = Uri.parse(settings.url); 728486c1d0da1a50afdda7264e338145a331ba172bbdujin.cha } else { 729486c1d0da1a50afdda7264e338145a331ba172bbdujin.cha String modifiedUrl = "http://" + settings.url; 730486c1d0da1a50afdda7264e338145a331ba172bbdujin.cha CatLog.d(this, "modifiedUrl = " + modifiedUrl); 731486c1d0da1a50afdda7264e338145a331ba172bbdujin.cha data = Uri.parse(modifiedUrl); 732486c1d0da1a50afdda7264e338145a331ba172bbdujin.cha } 733840c82f34e96d3526516c5c55c0c270355561906Abhishek Adappa } 734840c82f34e96d3526516c5c55c0c270355561906Abhishek Adappa if (data != null) { 735840c82f34e96d3526516c5c55c0c270355561906Abhishek Adappa intent = new Intent(Intent.ACTION_VIEW); 736840c82f34e96d3526516c5c55c0c270355561906Abhishek Adappa intent.setData(data); 7377c03cfef65a056c490a4557606436302cb0bb385David Brown } else { 738840c82f34e96d3526516c5c55c0c270355561906Abhishek Adappa // if the command did not contain a URL, 739840c82f34e96d3526516c5c55c0c270355561906Abhishek Adappa // launch the browser to the default homepage. 740840c82f34e96d3526516c5c55c0c270355561906Abhishek Adappa CatLog.d(this, "launch browser with default URL "); 741840c82f34e96d3526516c5c55c0c270355561906Abhishek Adappa intent = Intent.makeMainSelectorActivity(Intent.ACTION_MAIN, 742840c82f34e96d3526516c5c55c0c270355561906Abhishek Adappa Intent.CATEGORY_APP_BROWSER); 7439d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 7447c03cfef65a056c490a4557606436302cb0bb385David Brown 7459d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 7469d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project switch (settings.mode) { 7479d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project case USE_EXISTING_BROWSER: 7489d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 7499d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project break; 7509d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project case LAUNCH_NEW_BROWSER: 7519d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project intent.addFlags(Intent.FLAG_ACTIVITY_MULTIPLE_TASK); 7529d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project break; 7539d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project case LAUNCH_IF_NOT_ALREADY_LAUNCHED: 7549d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 7559d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project break; 7569d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 7579d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project // start browser activity 7589d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project startActivity(intent); 7599d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project // a small delay, let the browser start, before processing the next command. 76079085fcc5b4e54cc374e8720644ce4c1dc0004beWink Saville // this is good for scenarios where a related DISPLAY TEXT command is 7619d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project // followed immediately. 7629d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project try { 7639d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project Thread.sleep(10000); 7649d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } catch (InterruptedException e) {} 7659d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 7669d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 7679d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project private void launchIdleText() { 7689d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project TextMessage msg = mCurrentCmd.geTextMessage(); 7692a0eb2acdc369734e1264c8d8f9955d704508b53dujin.cha 770046db4bee9c4be21c61cc0d1b46ef46f21e315d8Wink Saville if (msg == null) { 7712a0eb2acdc369734e1264c8d8f9955d704508b53dujin.cha CatLog.d(this, "mCurrent.getTextMessage is NULL"); 7722a0eb2acdc369734e1264c8d8f9955d704508b53dujin.cha mNotificationManager.cancel(STK_NOTIFICATION_ID); 773046db4bee9c4be21c61cc0d1b46ef46f21e315d8Wink Saville return; 774046db4bee9c4be21c61cc0d1b46ef46f21e315d8Wink Saville } 7759d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project if (msg.text == null) { 7769d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project mNotificationManager.cancel(STK_NOTIFICATION_ID); 7779d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } else { 77850e0a1db4e558a062763ed78d9de300cb133ff82Alex Khlivnuik PendingIntent pendingIntent = PendingIntent.getService(mContext, 0, 77950e0a1db4e558a062763ed78d9de300cb133ff82Alex Khlivnuik new Intent(mContext, StkAppService.class), 0); 7809d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 78150e0a1db4e558a062763ed78d9de300cb133ff82Alex Khlivnuik final Notification.Builder notificationBuilder = new Notification.Builder( 78250e0a1db4e558a062763ed78d9de300cb133ff82Alex Khlivnuik StkAppService.this); 78350e0a1db4e558a062763ed78d9de300cb133ff82Alex Khlivnuik notificationBuilder.setContentTitle(""); 78450e0a1db4e558a062763ed78d9de300cb133ff82Alex Khlivnuik notificationBuilder 78550e0a1db4e558a062763ed78d9de300cb133ff82Alex Khlivnuik .setSmallIcon(com.android.internal.R.drawable.stat_notify_sim_toolkit); 78650e0a1db4e558a062763ed78d9de300cb133ff82Alex Khlivnuik notificationBuilder.setContentIntent(pendingIntent); 78750e0a1db4e558a062763ed78d9de300cb133ff82Alex Khlivnuik notificationBuilder.setOngoing(true); 7889d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project // Set text and icon for the status bar and notification body. 7899d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project if (!msg.iconSelfExplanatory) { 79050e0a1db4e558a062763ed78d9de300cb133ff82Alex Khlivnuik notificationBuilder.setContentText(msg.text); 7919d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 7929d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project if (msg.icon != null) { 79350e0a1db4e558a062763ed78d9de300cb133ff82Alex Khlivnuik notificationBuilder.setLargeIcon(msg.icon); 7949d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } else { 79550e0a1db4e558a062763ed78d9de300cb133ff82Alex Khlivnuik Bitmap bitmapIcon = BitmapFactory.decodeResource(StkAppService.this 79650e0a1db4e558a062763ed78d9de300cb133ff82Alex Khlivnuik .getResources().getSystem(), 79750e0a1db4e558a062763ed78d9de300cb133ff82Alex Khlivnuik com.android.internal.R.drawable.stat_notify_sim_toolkit); 79850e0a1db4e558a062763ed78d9de300cb133ff82Alex Khlivnuik notificationBuilder.setLargeIcon(bitmapIcon); 7999d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 8009d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 80150e0a1db4e558a062763ed78d9de300cb133ff82Alex Khlivnuik mNotificationManager.notify(STK_NOTIFICATION_ID, notificationBuilder.build()); 8029d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 8039d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 8049d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 8059d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project private void launchToneDialog() { 8069d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project Intent newIntent = new Intent(this, ToneDialog.class); 8079d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project newIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK 8089d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project | Intent.FLAG_ACTIVITY_NO_HISTORY 8099d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS 8109d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project | getFlagActivityNoUserAction(InitiatedByUserAction.unknown)); 8119d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project newIntent.putExtra("TEXT", mCurrentCmd.geTextMessage()); 8129d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project newIntent.putExtra("TONE", mCurrentCmd.getToneSettings()); 8139d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project startActivity(newIntent); 8149d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 8159d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 816764167cd0542a766cafce2f30c7aba1cf9d4ea20Kazuhiro Ondo private void launchOpenChannelDialog() { 817764167cd0542a766cafce2f30c7aba1cf9d4ea20Kazuhiro Ondo TextMessage msg = mCurrentCmd.geTextMessage(); 818764167cd0542a766cafce2f30c7aba1cf9d4ea20Kazuhiro Ondo if (msg == null) { 819764167cd0542a766cafce2f30c7aba1cf9d4ea20Kazuhiro Ondo CatLog.d(this, "msg is null, return here"); 820764167cd0542a766cafce2f30c7aba1cf9d4ea20Kazuhiro Ondo return; 821764167cd0542a766cafce2f30c7aba1cf9d4ea20Kazuhiro Ondo } 822764167cd0542a766cafce2f30c7aba1cf9d4ea20Kazuhiro Ondo 823764167cd0542a766cafce2f30c7aba1cf9d4ea20Kazuhiro Ondo msg.title = getResources().getString(R.string.stk_dialog_title); 824764167cd0542a766cafce2f30c7aba1cf9d4ea20Kazuhiro Ondo if (msg.text == null) { 825764167cd0542a766cafce2f30c7aba1cf9d4ea20Kazuhiro Ondo msg.text = getResources().getString(R.string.default_open_channel_msg); 826764167cd0542a766cafce2f30c7aba1cf9d4ea20Kazuhiro Ondo } 827764167cd0542a766cafce2f30c7aba1cf9d4ea20Kazuhiro Ondo 828764167cd0542a766cafce2f30c7aba1cf9d4ea20Kazuhiro Ondo final AlertDialog dialog = new AlertDialog.Builder(mContext) 829764167cd0542a766cafce2f30c7aba1cf9d4ea20Kazuhiro Ondo .setIconAttribute(android.R.attr.alertDialogIcon) 830764167cd0542a766cafce2f30c7aba1cf9d4ea20Kazuhiro Ondo .setTitle(msg.title) 831764167cd0542a766cafce2f30c7aba1cf9d4ea20Kazuhiro Ondo .setMessage(msg.text) 832764167cd0542a766cafce2f30c7aba1cf9d4ea20Kazuhiro Ondo .setCancelable(false) 833764167cd0542a766cafce2f30c7aba1cf9d4ea20Kazuhiro Ondo .setPositiveButton(getResources().getString(R.string.stk_dialog_accept), 834764167cd0542a766cafce2f30c7aba1cf9d4ea20Kazuhiro Ondo new DialogInterface.OnClickListener() { 835764167cd0542a766cafce2f30c7aba1cf9d4ea20Kazuhiro Ondo public void onClick(DialogInterface dialog, int which) { 836764167cd0542a766cafce2f30c7aba1cf9d4ea20Kazuhiro Ondo Bundle args = new Bundle(); 837764167cd0542a766cafce2f30c7aba1cf9d4ea20Kazuhiro Ondo args.putInt(RES_ID, RES_ID_CHOICE); 838764167cd0542a766cafce2f30c7aba1cf9d4ea20Kazuhiro Ondo args.putInt(CHOICE, YES); 839764167cd0542a766cafce2f30c7aba1cf9d4ea20Kazuhiro Ondo Message message = mServiceHandler.obtainMessage(); 840764167cd0542a766cafce2f30c7aba1cf9d4ea20Kazuhiro Ondo message.arg1 = OP_RESPONSE; 841764167cd0542a766cafce2f30c7aba1cf9d4ea20Kazuhiro Ondo message.obj = args; 842764167cd0542a766cafce2f30c7aba1cf9d4ea20Kazuhiro Ondo mServiceHandler.sendMessage(message); 843764167cd0542a766cafce2f30c7aba1cf9d4ea20Kazuhiro Ondo } 844764167cd0542a766cafce2f30c7aba1cf9d4ea20Kazuhiro Ondo }) 845764167cd0542a766cafce2f30c7aba1cf9d4ea20Kazuhiro Ondo .setNegativeButton(getResources().getString(R.string.stk_dialog_reject), 846764167cd0542a766cafce2f30c7aba1cf9d4ea20Kazuhiro Ondo new DialogInterface.OnClickListener() { 847764167cd0542a766cafce2f30c7aba1cf9d4ea20Kazuhiro Ondo public void onClick(DialogInterface dialog, int which) { 848764167cd0542a766cafce2f30c7aba1cf9d4ea20Kazuhiro Ondo Bundle args = new Bundle(); 849764167cd0542a766cafce2f30c7aba1cf9d4ea20Kazuhiro Ondo args.putInt(RES_ID, RES_ID_CHOICE); 850764167cd0542a766cafce2f30c7aba1cf9d4ea20Kazuhiro Ondo args.putInt(CHOICE, NO); 851764167cd0542a766cafce2f30c7aba1cf9d4ea20Kazuhiro Ondo Message message = mServiceHandler.obtainMessage(); 852764167cd0542a766cafce2f30c7aba1cf9d4ea20Kazuhiro Ondo message.arg1 = OP_RESPONSE; 853764167cd0542a766cafce2f30c7aba1cf9d4ea20Kazuhiro Ondo message.obj = args; 854764167cd0542a766cafce2f30c7aba1cf9d4ea20Kazuhiro Ondo mServiceHandler.sendMessage(message); 855764167cd0542a766cafce2f30c7aba1cf9d4ea20Kazuhiro Ondo } 856764167cd0542a766cafce2f30c7aba1cf9d4ea20Kazuhiro Ondo }) 857764167cd0542a766cafce2f30c7aba1cf9d4ea20Kazuhiro Ondo .create(); 858764167cd0542a766cafce2f30c7aba1cf9d4ea20Kazuhiro Ondo 859764167cd0542a766cafce2f30c7aba1cf9d4ea20Kazuhiro Ondo dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT); 860764167cd0542a766cafce2f30c7aba1cf9d4ea20Kazuhiro Ondo if (!mContext.getResources().getBoolean( 861764167cd0542a766cafce2f30c7aba1cf9d4ea20Kazuhiro Ondo com.android.internal.R.bool.config_sf_slowBlur)) { 862764167cd0542a766cafce2f30c7aba1cf9d4ea20Kazuhiro Ondo dialog.getWindow().addFlags(WindowManager.LayoutParams.FLAG_BLUR_BEHIND); 863764167cd0542a766cafce2f30c7aba1cf9d4ea20Kazuhiro Ondo } 864764167cd0542a766cafce2f30c7aba1cf9d4ea20Kazuhiro Ondo 865764167cd0542a766cafce2f30c7aba1cf9d4ea20Kazuhiro Ondo dialog.show(); 866764167cd0542a766cafce2f30c7aba1cf9d4ea20Kazuhiro Ondo } 867764167cd0542a766cafce2f30c7aba1cf9d4ea20Kazuhiro Ondo 868764167cd0542a766cafce2f30c7aba1cf9d4ea20Kazuhiro Ondo private void launchTransientEventMessage() { 869764167cd0542a766cafce2f30c7aba1cf9d4ea20Kazuhiro Ondo TextMessage msg = mCurrentCmd.geTextMessage(); 870764167cd0542a766cafce2f30c7aba1cf9d4ea20Kazuhiro Ondo if (msg == null) { 871764167cd0542a766cafce2f30c7aba1cf9d4ea20Kazuhiro Ondo CatLog.d(this, "msg is null, return here"); 872764167cd0542a766cafce2f30c7aba1cf9d4ea20Kazuhiro Ondo return; 873764167cd0542a766cafce2f30c7aba1cf9d4ea20Kazuhiro Ondo } 874764167cd0542a766cafce2f30c7aba1cf9d4ea20Kazuhiro Ondo 875764167cd0542a766cafce2f30c7aba1cf9d4ea20Kazuhiro Ondo msg.title = getResources().getString(R.string.stk_dialog_title); 876764167cd0542a766cafce2f30c7aba1cf9d4ea20Kazuhiro Ondo 877764167cd0542a766cafce2f30c7aba1cf9d4ea20Kazuhiro Ondo final AlertDialog dialog = new AlertDialog.Builder(mContext) 878764167cd0542a766cafce2f30c7aba1cf9d4ea20Kazuhiro Ondo .setIconAttribute(android.R.attr.alertDialogIcon) 879764167cd0542a766cafce2f30c7aba1cf9d4ea20Kazuhiro Ondo .setTitle(msg.title) 880764167cd0542a766cafce2f30c7aba1cf9d4ea20Kazuhiro Ondo .setMessage(msg.text) 881764167cd0542a766cafce2f30c7aba1cf9d4ea20Kazuhiro Ondo .setCancelable(false) 882764167cd0542a766cafce2f30c7aba1cf9d4ea20Kazuhiro Ondo .setPositiveButton(getResources().getString(android.R.string.ok), 883764167cd0542a766cafce2f30c7aba1cf9d4ea20Kazuhiro Ondo new DialogInterface.OnClickListener() { 884764167cd0542a766cafce2f30c7aba1cf9d4ea20Kazuhiro Ondo public void onClick(DialogInterface dialog, int which) { 885764167cd0542a766cafce2f30c7aba1cf9d4ea20Kazuhiro Ondo } 886764167cd0542a766cafce2f30c7aba1cf9d4ea20Kazuhiro Ondo }) 887764167cd0542a766cafce2f30c7aba1cf9d4ea20Kazuhiro Ondo .create(); 888764167cd0542a766cafce2f30c7aba1cf9d4ea20Kazuhiro Ondo 889764167cd0542a766cafce2f30c7aba1cf9d4ea20Kazuhiro Ondo dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT); 890764167cd0542a766cafce2f30c7aba1cf9d4ea20Kazuhiro Ondo if (!mContext.getResources().getBoolean( 891764167cd0542a766cafce2f30c7aba1cf9d4ea20Kazuhiro Ondo com.android.internal.R.bool.config_sf_slowBlur)) { 892764167cd0542a766cafce2f30c7aba1cf9d4ea20Kazuhiro Ondo dialog.getWindow().addFlags(WindowManager.LayoutParams.FLAG_BLUR_BEHIND); 893764167cd0542a766cafce2f30c7aba1cf9d4ea20Kazuhiro Ondo } 894764167cd0542a766cafce2f30c7aba1cf9d4ea20Kazuhiro Ondo 895764167cd0542a766cafce2f30c7aba1cf9d4ea20Kazuhiro Ondo dialog.show(); 896764167cd0542a766cafce2f30c7aba1cf9d4ea20Kazuhiro Ondo } 897764167cd0542a766cafce2f30c7aba1cf9d4ea20Kazuhiro Ondo 8989d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project private String getItemName(int itemId) { 8999d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project Menu menu = mCurrentCmd.getMenu(); 9009d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project if (menu == null) { 9019d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project return null; 9029d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 9039d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project for (Item item : menu.items) { 9049d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project if (item.id == itemId) { 9059d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project return item.text; 9069d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 9079d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 9089d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project return null; 9099d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 9109d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 9119d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project private boolean removeMenu() { 9129d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project try { 91379085fcc5b4e54cc374e8720644ce4c1dc0004beWink Saville if (mCurrentMenu.items.size() == 1 && 9149d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project mCurrentMenu.items.get(0) == null) { 9159d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project return true; 9169d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 9179d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } catch (NullPointerException e) { 918d41f1d98d7bf42e9e867819593ad79f685604796Alex Yakavenka CatLog.d(this, "Unable to get Menu's items size"); 9199d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project return true; 9209d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 9219d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project return false; 9229d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 9239d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project} 924