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