19d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project/*
29d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project
39d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project *
49d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project * you may not use this file except in compliance with the License.
69d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project * You may obtain a copy of the License at
79d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project *
89d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project *
109d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project * See the License for the specific language governing permissions and
149d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project * limitations under the License.
159d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project */
169d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project
179d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Projectpackage com.android.stk;
189d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project
199d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Projectimport android.app.ListActivity;
2048544354fe63697f909a76feae6544d1454e9ab9Takanori Nakanoimport android.app.ActionBar;
21e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Savilleimport android.app.Activity;
229d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Projectimport android.content.Context;
239d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Projectimport android.content.Intent;
249d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Projectimport android.os.Bundle;
259d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Projectimport android.os.Handler;
269d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Projectimport android.os.Message;
2782d3e797c0199237755ec3f8c427e34925c59c6dGuillaume Lucasimport android.view.ContextMenu;
2882d3e797c0199237755ec3f8c427e34925c59c6dGuillaume Lucasimport android.view.ContextMenu.ContextMenuInfo;
299d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Projectimport android.view.KeyEvent;
309d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Projectimport android.view.MenuItem;
319d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Projectimport android.view.View;
329d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Projectimport android.view.Window;
3382d3e797c0199237755ec3f8c427e34925c59c6dGuillaume Lucasimport android.widget.AdapterView;
349d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Projectimport android.widget.ImageView;
359d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Projectimport android.widget.ListView;
369d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Projectimport android.widget.ProgressBar;
379d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Projectimport android.widget.TextView;
389d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project
39d41f1d98d7bf42e9e867819593ad79f685604796Alex Yakavenkaimport com.android.internal.telephony.cat.Item;
40d41f1d98d7bf42e9e867819593ad79f685604796Alex Yakavenkaimport com.android.internal.telephony.cat.Menu;
41d41f1d98d7bf42e9e867819593ad79f685604796Alex Yakavenkaimport com.android.internal.telephony.cat.CatLog;
42e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Savilleimport android.telephony.TelephonyManager;
439d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project
449d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project/**
4579085fcc5b4e54cc374e8720644ce4c1dc0004beWink Saville * ListActivity used for displaying STK menus. These can be SET UP MENU and
4679085fcc5b4e54cc374e8720644ce4c1dc0004beWink Saville * SELECT ITEM menus. This activity is started multiple times with different
479d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project * menu content.
489d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project *
499d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project */
5082d3e797c0199237755ec3f8c427e34925c59c6dGuillaume Lucaspublic class StkMenuActivity extends ListActivity implements View.OnCreateContextMenuListener {
519d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project    private Context mContext;
529d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project    private Menu mStkMenu = null;
539d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project    private int mState = STATE_MAIN;
549d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project    private boolean mAcceptUsersInput = true;
55e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville    private int mSlotId = -1;
56e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville    private boolean mIsResponseSent = false;
57e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville    Activity mInstance = null;
589d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project
599d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project    private TextView mTitleTextView = null;
609d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project    private ImageView mTitleIconView = null;
619d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project    private ProgressBar mProgressView = null;
62e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville    private static final String className = new Object(){}.getClass().getEnclosingClass().getName();
63e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville    private static final String LOG_TAG = className.substring(className.lastIndexOf('.') + 1);
649d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project
65e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville    private StkAppService appService = StkAppService.getInstance();
669d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project
679d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project    // Internal state values
68e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville    static final int STATE_INIT = 0;
699d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project    static final int STATE_MAIN = 1;
709d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project    static final int STATE_SECONDARY = 2;
719d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project
72e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville    // Finish result
73e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville    static final int FINISH_CAUSE_NORMAL = 1;
74e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville    static final int FINISH_CAUSE_NULL_SERVICE = 2;
75e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville    static final int FINISH_CAUSE_NULL_MENU = 3;
76e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville
7779085fcc5b4e54cc374e8720644ce4c1dc0004beWink Saville    // message id for time out
789d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project    private static final int MSG_ID_TIMEOUT = 1;
7982d3e797c0199237755ec3f8c427e34925c59c6dGuillaume Lucas    private static final int CONTEXT_MENU_HELP = 0;
809d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project
819d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project    Handler mTimeoutHandler = new Handler() {
829d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project        @Override
839d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project        public void handleMessage(Message msg) {
849d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project            switch(msg.what) {
859d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project            case MSG_ID_TIMEOUT:
86e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville                CatLog.d(LOG_TAG, "MSG_ID_TIMEOUT mState: " + mState);
879d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project                mAcceptUsersInput = false;
88e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville                if (mState == STATE_SECONDARY) {
89e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville                    appService.getStkContext(mSlotId).setPendingActivityInstance(mInstance);
90e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville                }
919d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project                sendResponse(StkAppService.RES_ID_TIMEOUT);
92e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville                //finish();//We wait the following commands to trigger onStop of this activity.
939d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project                break;
949d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project            }
959d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project        }
969d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project    };
979d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project
989d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project    @Override
999d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project    public void onCreate(Bundle icicle) {
1009d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project        super.onCreate(icicle);
1019d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project
102e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville        CatLog.d(LOG_TAG, "onCreate");
10348544354fe63697f909a76feae6544d1454e9ab9Takanori Nakano
10448544354fe63697f909a76feae6544d1454e9ab9Takanori Nakano        ActionBar actionBar = getActionBar();
10548544354fe63697f909a76feae6544d1454e9ab9Takanori Nakano        actionBar.setCustomView(R.layout.stk_title);
10648544354fe63697f909a76feae6544d1454e9ab9Takanori Nakano        actionBar.setDisplayShowCustomEnabled(true);
10748544354fe63697f909a76feae6544d1454e9ab9Takanori Nakano
1089d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project        // Set the layout for this activity.
1099d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project        setContentView(R.layout.stk_menu_list);
110e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville        mInstance = this;
1119d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project        mTitleTextView = (TextView) findViewById(R.id.title_text);
1129d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project        mTitleIconView = (ImageView) findViewById(R.id.title_icon);
1139d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project        mProgressView = (ProgressBar) findViewById(R.id.progress_bar);
1149d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project        mContext = getBaseContext();
1159d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project        mAcceptUsersInput = true;
11682d3e797c0199237755ec3f8c427e34925c59c6dGuillaume Lucas        getListView().setOnCreateContextMenuListener(this);
117ba9b86b6257d98d3c1312ff188b22e0f6b785cadRyuto Sawada
118ba9b86b6257d98d3c1312ff188b22e0f6b785cadRyuto Sawada        // appService can be null if this activity is automatically recreated by the system
119ba9b86b6257d98d3c1312ff188b22e0f6b785cadRyuto Sawada        // with the saved instance state right after the phone process is killed.
120ba9b86b6257d98d3c1312ff188b22e0f6b785cadRyuto Sawada        if (appService == null) {
121ba9b86b6257d98d3c1312ff188b22e0f6b785cadRyuto Sawada            CatLog.d(LOG_TAG, "onCreate - appService is null");
122ba9b86b6257d98d3c1312ff188b22e0f6b785cadRyuto Sawada            finish();
123ba9b86b6257d98d3c1312ff188b22e0f6b785cadRyuto Sawada            return;
124ba9b86b6257d98d3c1312ff188b22e0f6b785cadRyuto Sawada        }
125ba9b86b6257d98d3c1312ff188b22e0f6b785cadRyuto Sawada
126e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville        initFromIntent(getIntent());
1279d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project    }
1289d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project
1299d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project    @Override
1309d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project    protected void onListItemClick(ListView l, View v, int position, long id) {
1319d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project        super.onListItemClick(l, v, position, id);
13279085fcc5b4e54cc374e8720644ce4c1dc0004beWink Saville
1339d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project        if (!mAcceptUsersInput) {
134e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville            CatLog.d(LOG_TAG, "mAcceptUsersInput:false");
1359d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project            return;
1369d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project        }
1379d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project
1389d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project        Item item = getSelectedItem(position);
1399d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project        if (item == null) {
140e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville            CatLog.d(LOG_TAG, "Item is null");
1419d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project            return;
1429d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project        }
14303be6676b5797d70ad30374c16589300f63438c0Preeti Ahuja
144e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville        CatLog.d(LOG_TAG, "onListItemClick Id: " + item.id + ", mState: " + mState);
145e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville        // ONLY set SECONDARY menu. It will be finished when the following command is comming.
146e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville        if (mState == STATE_SECONDARY) {
147e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville            appService.getStkContext(mSlotId).setPendingActivityInstance(this);
148e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville        }
14903be6676b5797d70ad30374c16589300f63438c0Preeti Ahuja        cancelTimeOut();
1509d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project        sendResponse(StkAppService.RES_ID_MENU_SELECTION, item.id, false);
1519d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project        mAcceptUsersInput = false;
1529d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project        mProgressView.setVisibility(View.VISIBLE);
1539d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project        mProgressView.setIndeterminate(true);
15448544354fe63697f909a76feae6544d1454e9ab9Takanori Nakano
15548544354fe63697f909a76feae6544d1454e9ab9Takanori Nakano        invalidateOptionsMenu();
1569d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project    }
1579d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project
1589d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project    @Override
1599d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project    public boolean onKeyDown(int keyCode, KeyEvent event) {
160e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville        CatLog.d(LOG_TAG, "mAcceptUsersInput: " + mAcceptUsersInput);
1619d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project        if (!mAcceptUsersInput) {
1629d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project            return true;
1639d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project        }
1649d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project
1659d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project        switch (keyCode) {
1669d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project        case KeyEvent.KEYCODE_BACK:
167e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville            CatLog.d(LOG_TAG, "KEYCODE_BACK - mState[" + mState + "]");
1689d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project            switch (mState) {
1699d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project            case STATE_SECONDARY:
170e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville                CatLog.d(LOG_TAG, "STATE_SECONDARY");
1719d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project                cancelTimeOut();
1729d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project                mAcceptUsersInput = false;
173e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville                appService.getStkContext(mSlotId).setPendingActivityInstance(this);
1749d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project                sendResponse(StkAppService.RES_ID_BACKWARD);
1759d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project                return true;
1769d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project            case STATE_MAIN:
177e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville                CatLog.d(LOG_TAG, "STATE_MAIN");
178e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville                appService.getStkContext(mSlotId).setMainActivityInstance(null);
179e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville                cancelTimeOut();
180e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville                finish();
181e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville                return true;
1829d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project            }
1839d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project            break;
1849d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project        }
1859d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project        return super.onKeyDown(keyCode, event);
1869d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project    }
1879d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project
1889d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project    @Override
189e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville    public void onRestart() {
190e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville        super.onRestart();
191e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville        CatLog.d(LOG_TAG, "onRestart, slot id: " + mSlotId);
192e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville    }
193e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville
194e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville    @Override
1959d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project    public void onResume() {
1969d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project        super.onResume();
1979d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project
198e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville        CatLog.d(LOG_TAG, "onResume, slot id: " + mSlotId + "," + mState);
199e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville        appService.indicateMenuVisibility(true, mSlotId);
200e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville        if (mState == STATE_MAIN) {
201e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville            mStkMenu = appService.getMainMenu(mSlotId);
202e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville        } else {
203e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville            mStkMenu = appService.getMenu(mSlotId);
204e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville        }
2059d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project        if (mStkMenu == null) {
206e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville            CatLog.d(LOG_TAG, "menu is null");
207e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville            cancelTimeOut();
2089d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project            finish();
2099d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project            return;
2109d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project        }
211e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville        //Set main menu instance here for clean up stack by other SIMs
212e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville        //when receiving OP_LAUNCH_APP.
213e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville        if (mState == STATE_MAIN) {
214e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville            CatLog.d(LOG_TAG, "set main menu instance.");
215e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville            appService.getStkContext(mSlotId).setMainActivityInstance(this);
216e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville        }
2179d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project        displayMenu();
2189d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project        startTimeOut();
2199d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project        // whenever this activity is resumed after a sub activity was invoked
22079085fcc5b4e54cc374e8720644ce4c1dc0004beWink Saville        // (Browser, In call screen) switch back to main state and enable
2219d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project        // user's input;
2229d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project        if (!mAcceptUsersInput) {
223e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville            //Remove set mState to STATE_MAIN. This is for single instance flow.
2249d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project            mAcceptUsersInput = true;
2259d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project        }
22664ec38ec889df7bf757861b02e918c05464cc545w        invalidateOptionsMenu();
227e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville
2289d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project        // make sure the progress bar is not shown.
2299d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project        mProgressView.setIndeterminate(false);
2309d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project        mProgressView.setVisibility(View.GONE);
2319d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project    }
2329d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project
2339d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project    @Override
2349d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project    public void onPause() {
2359d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project        super.onPause();
236e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville        CatLog.d(LOG_TAG, "onPause, slot id: " + mSlotId + "," + mState);
237e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville        //If activity is finished in onResume and it reaults from null appService.
238e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville        if (appService != null) {
239e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville            appService.indicateMenuVisibility(false, mSlotId);
240e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville        } else {
241e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville            CatLog.d(LOG_TAG, "onPause: null appService.");
242e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville        }
24303be6676b5797d70ad30374c16589300f63438c0Preeti Ahuja
24403be6676b5797d70ad30374c16589300f63438c0Preeti Ahuja        /*
24503be6676b5797d70ad30374c16589300f63438c0Preeti Ahuja         * do not cancel the timer here cancelTimeOut(). If any higher/lower
24603be6676b5797d70ad30374c16589300f63438c0Preeti Ahuja         * priority events such as incoming call, new sms, screen off intent,
24703be6676b5797d70ad30374c16589300f63438c0Preeti Ahuja         * notification alerts, user actions such as 'User moving to another activtiy'
24803be6676b5797d70ad30374c16589300f63438c0Preeti Ahuja         * etc.. occur during SELECT ITEM ongoing session,
24903be6676b5797d70ad30374c16589300f63438c0Preeti Ahuja         * this activity would receive 'onPause()' event resulting in
25003be6676b5797d70ad30374c16589300f63438c0Preeti Ahuja         * cancellation of the timer. As a result no terminal response is
25103be6676b5797d70ad30374c16589300f63438c0Preeti Ahuja         * sent to the card.
25203be6676b5797d70ad30374c16589300f63438c0Preeti Ahuja         */
25303be6676b5797d70ad30374c16589300f63438c0Preeti Ahuja
2549d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project    }
2559d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project
2569d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project    @Override
257e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville    public void onStop() {
258e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville        super.onStop();
259e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville        CatLog.d(LOG_TAG, "onStop, slot id: " + mSlotId + "," + mIsResponseSent + "," + mState);
260e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville        //The menu should stay in background, if
261e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville        //1. the dialog is pop up in the screen, but the user does not response to the dialog.
262e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville        //2. the menu activity enters Stop state (e.g pressing HOME key) but mIsResponseSent is false.
263e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville        if (mIsResponseSent) {
264e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville            // ONLY finish SECONDARY menu. MAIN menu should always stay in the root of stack.
265e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville            if (mState == STATE_SECONDARY) {
266e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville                if (!appService.isStkDialogActivated(mContext)) {
267e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville                    CatLog.d(LOG_TAG, "STATE_SECONDARY finish.");
268e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville                    cancelTimeOut();//To avoid the timer time out and send TR again.
269e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville                    finish();
270e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville                } else {
271e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville                     if (appService != null) {
272e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville                         appService.getStkContext(mSlotId).setPendingActivityInstance(this);
273e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville                     }
274e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville                }
275e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville            }
276e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville        } else {
277e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville            if (appService != null) {
27844cdef58c69e43c21014df7902156235bd0618f7Ryuto Sawada                if (mState == STATE_SECONDARY) {
27944cdef58c69e43c21014df7902156235bd0618f7Ryuto Sawada                    appService.getStkContext(mSlotId).setPendingActivityInstance(this);
28044cdef58c69e43c21014df7902156235bd0618f7Ryuto Sawada                }
281e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville            } else {
282e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville                CatLog.d(LOG_TAG, "onStop: null appService.");
283e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville            }
284e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville        }
285e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville    }
286e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville
287e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville    @Override
2889d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project    public void onDestroy() {
28982d3e797c0199237755ec3f8c427e34925c59c6dGuillaume Lucas        getListView().setOnCreateContextMenuListener(null);
2909d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project        super.onDestroy();
291e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville        CatLog.d(LOG_TAG, "onDestroy" + "," + mState);
292ba9b86b6257d98d3c1312ff188b22e0f6b785cadRyuto Sawada        if (appService == null) {
293ba9b86b6257d98d3c1312ff188b22e0f6b785cadRyuto Sawada            return;
294ba9b86b6257d98d3c1312ff188b22e0f6b785cadRyuto Sawada        }
295e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville        //isMenuPending: if input act is finish by stkappservice when OP_LAUNCH_APP again,
296e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville        //we can not send TR here, since the input cmd is waiting user to process.
29746f29b5b154386880996c62bacb08142bea932c6Tsukasa Gotou        if (mState == STATE_SECONDARY && !mIsResponseSent && !appService.isMenuPending(mSlotId)) {
298e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville            CatLog.d(LOG_TAG, "handleDestroy - Send End Session");
299e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville            sendResponse(StkAppService.RES_ID_END_SESSION);
300e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville        }
301e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville        if (mState == STATE_MAIN) {
302e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville            if (appService != null) {
303e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville                appService.getStkContext(mSlotId).setMainActivityInstance(null);
304e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville            } else {
305e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville                CatLog.d(LOG_TAG, "onDestroy: null appService.");
306e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville            }
307e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville        }
3089d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project    }
3099d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project
3109d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project    @Override
3119d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project    public boolean onCreateOptionsMenu(android.view.Menu menu) {
3129d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project        super.onCreateOptionsMenu(menu);
3139d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project        menu.add(0, StkApp.MENU_ID_END_SESSION, 1, R.string.menu_end_session);
3149d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project        return true;
3159d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project    }
3169d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project
3179d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project    @Override
3189d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project    public boolean onPrepareOptionsMenu(android.view.Menu menu) {
3199d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project        super.onPrepareOptionsMenu(menu);
3209d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project        boolean mainVisible = false;
3219d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project
32248544354fe63697f909a76feae6544d1454e9ab9Takanori Nakano        if (mState == STATE_SECONDARY && mAcceptUsersInput) {
3239d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project            mainVisible = true;
3249d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project        }
3259d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project
3269d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project        menu.findItem(StkApp.MENU_ID_END_SESSION).setVisible(mainVisible);
3279d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project
3289d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project        return true;
3299d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project    }
3309d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project
3319d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project    @Override
3329d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project    public boolean onOptionsItemSelected(MenuItem item) {
3339d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project        if (!mAcceptUsersInput) {
3349d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project            return true;
3359d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project        }
3369d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project        switch (item.getItemId()) {
3379d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project        case StkApp.MENU_ID_END_SESSION:
3389d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project            cancelTimeOut();
3399d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project            mAcceptUsersInput = false;
3409d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project            // send session end response.
3419d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project            sendResponse(StkAppService.RES_ID_END_SESSION);
342e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville            cancelTimeOut();
343e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville            finish();
3449d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project            return true;
34548544354fe63697f909a76feae6544d1454e9ab9Takanori Nakano        default:
34648544354fe63697f909a76feae6544d1454e9ab9Takanori Nakano            break;
3479d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project        }
3489d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project        return super.onOptionsItemSelected(item);
3499d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project    }
3509d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project
3519d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project    @Override
35282d3e797c0199237755ec3f8c427e34925c59c6dGuillaume Lucas    public void onCreateContextMenu(ContextMenu menu, View v,
35382d3e797c0199237755ec3f8c427e34925c59c6dGuillaume Lucas            ContextMenuInfo menuInfo) {
35482d3e797c0199237755ec3f8c427e34925c59c6dGuillaume Lucas        CatLog.d(this, "onCreateContextMenu");
35582d3e797c0199237755ec3f8c427e34925c59c6dGuillaume Lucas        boolean helpVisible = false;
35682d3e797c0199237755ec3f8c427e34925c59c6dGuillaume Lucas        if (mStkMenu != null) {
35782d3e797c0199237755ec3f8c427e34925c59c6dGuillaume Lucas            helpVisible = mStkMenu.helpAvailable;
35882d3e797c0199237755ec3f8c427e34925c59c6dGuillaume Lucas        }
35982d3e797c0199237755ec3f8c427e34925c59c6dGuillaume Lucas        if (helpVisible) {
36082d3e797c0199237755ec3f8c427e34925c59c6dGuillaume Lucas            CatLog.d(this, "add menu");
36182d3e797c0199237755ec3f8c427e34925c59c6dGuillaume Lucas            menu.add(0, CONTEXT_MENU_HELP, 0, R.string.help);
36282d3e797c0199237755ec3f8c427e34925c59c6dGuillaume Lucas        }
36382d3e797c0199237755ec3f8c427e34925c59c6dGuillaume Lucas    }
36482d3e797c0199237755ec3f8c427e34925c59c6dGuillaume Lucas
36582d3e797c0199237755ec3f8c427e34925c59c6dGuillaume Lucas    @Override
36682d3e797c0199237755ec3f8c427e34925c59c6dGuillaume Lucas    public boolean onContextItemSelected(MenuItem item) {
36782d3e797c0199237755ec3f8c427e34925c59c6dGuillaume Lucas        AdapterView.AdapterContextMenuInfo info;
36882d3e797c0199237755ec3f8c427e34925c59c6dGuillaume Lucas        try {
36982d3e797c0199237755ec3f8c427e34925c59c6dGuillaume Lucas            info = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
37082d3e797c0199237755ec3f8c427e34925c59c6dGuillaume Lucas        } catch (ClassCastException e) {
37182d3e797c0199237755ec3f8c427e34925c59c6dGuillaume Lucas            return false;
37282d3e797c0199237755ec3f8c427e34925c59c6dGuillaume Lucas        }
37382d3e797c0199237755ec3f8c427e34925c59c6dGuillaume Lucas        switch (item.getItemId()) {
37482d3e797c0199237755ec3f8c427e34925c59c6dGuillaume Lucas            case CONTEXT_MENU_HELP:
37582d3e797c0199237755ec3f8c427e34925c59c6dGuillaume Lucas                cancelTimeOut();
37682d3e797c0199237755ec3f8c427e34925c59c6dGuillaume Lucas                mAcceptUsersInput = false;
37782d3e797c0199237755ec3f8c427e34925c59c6dGuillaume Lucas                int position = info.position;
37882d3e797c0199237755ec3f8c427e34925c59c6dGuillaume Lucas                CatLog.d(this, "Position:" + position);
37982d3e797c0199237755ec3f8c427e34925c59c6dGuillaume Lucas                Item stkItem = getSelectedItem(position);
38082d3e797c0199237755ec3f8c427e34925c59c6dGuillaume Lucas                if (stkItem != null) {
38182d3e797c0199237755ec3f8c427e34925c59c6dGuillaume Lucas                    CatLog.d(this, "item id:" + stkItem.id);
38282d3e797c0199237755ec3f8c427e34925c59c6dGuillaume Lucas                    sendResponse(StkAppService.RES_ID_MENU_SELECTION, stkItem.id, true);
38382d3e797c0199237755ec3f8c427e34925c59c6dGuillaume Lucas                }
38482d3e797c0199237755ec3f8c427e34925c59c6dGuillaume Lucas                return true;
38582d3e797c0199237755ec3f8c427e34925c59c6dGuillaume Lucas
38682d3e797c0199237755ec3f8c427e34925c59c6dGuillaume Lucas            default:
38782d3e797c0199237755ec3f8c427e34925c59c6dGuillaume Lucas                return super.onContextItemSelected(item);
38882d3e797c0199237755ec3f8c427e34925c59c6dGuillaume Lucas        }
38982d3e797c0199237755ec3f8c427e34925c59c6dGuillaume Lucas    }
39082d3e797c0199237755ec3f8c427e34925c59c6dGuillaume Lucas
39182d3e797c0199237755ec3f8c427e34925c59c6dGuillaume Lucas    @Override
3929d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project    protected void onSaveInstanceState(Bundle outState) {
393e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville        CatLog.d(LOG_TAG, "onSaveInstanceState: " + mSlotId);
3949d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project        outState.putInt("STATE", mState);
3959d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project        outState.putParcelable("MENU", mStkMenu);
396e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville        outState.putBoolean("ACCEPT_USERS_INPUT", mAcceptUsersInput);
3979d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project    }
3989d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project
3999d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project    @Override
4009d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project    protected void onRestoreInstanceState(Bundle savedInstanceState) {
401e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville        CatLog.d(LOG_TAG, "onRestoreInstanceState: " + mSlotId);
4029d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project        mState = savedInstanceState.getInt("STATE");
4039d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project        mStkMenu = savedInstanceState.getParcelable("MENU");
404e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville        mAcceptUsersInput = savedInstanceState.getBoolean("ACCEPT_USERS_INPUT");
4059d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project    }
40679085fcc5b4e54cc374e8720644ce4c1dc0004beWink Saville
4079d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project    private void cancelTimeOut() {
408e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville        CatLog.d(LOG_TAG, "cancelTimeOut: " + mSlotId);
4099d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project        mTimeoutHandler.removeMessages(MSG_ID_TIMEOUT);
4109d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project    }
4119d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project
4129d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project    private void startTimeOut() {
4139d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project        if (mState == STATE_SECONDARY) {
4149d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project            // Reset timeout.
4159d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project            cancelTimeOut();
416e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville            CatLog.d(LOG_TAG, "startTimeOut: " + mSlotId);
4179d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project            mTimeoutHandler.sendMessageDelayed(mTimeoutHandler
4189d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project                    .obtainMessage(MSG_ID_TIMEOUT), StkApp.UI_TIMEOUT);
4199d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project        }
4209d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project    }
42179085fcc5b4e54cc374e8720644ce4c1dc0004beWink Saville
4229d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project    // Bind list adapter to the items list.
4239d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project    private void displayMenu() {
4249d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project
4259d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project        if (mStkMenu != null) {
4263e34a8ad0ff494f6e5abc618acecdcc075d0be83Pierre Fröjd            String title = mStkMenu.title == null ? getString(R.string.app_name) : mStkMenu.title;
4279d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project            // Display title & title icon
4289d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project            if (mStkMenu.titleIcon != null) {
4299d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project                mTitleIconView.setImageBitmap(mStkMenu.titleIcon);
4309d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project                mTitleIconView.setVisibility(View.VISIBLE);
4313e34a8ad0ff494f6e5abc618acecdcc075d0be83Pierre Fröjd                mTitleTextView.setVisibility(View.INVISIBLE);
4323e34a8ad0ff494f6e5abc618acecdcc075d0be83Pierre Fröjd                if (!mStkMenu.titleIconSelfExplanatory) {
4333e34a8ad0ff494f6e5abc618acecdcc075d0be83Pierre Fröjd                    mTitleTextView.setText(title);
4343e34a8ad0ff494f6e5abc618acecdcc075d0be83Pierre Fröjd                    mTitleTextView.setVisibility(View.VISIBLE);
4353e34a8ad0ff494f6e5abc618acecdcc075d0be83Pierre Fröjd                }
4369d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project            } else {
4379d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project                mTitleIconView.setVisibility(View.GONE);
4389d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project                mTitleTextView.setVisibility(View.VISIBLE);
4393e34a8ad0ff494f6e5abc618acecdcc075d0be83Pierre Fröjd                mTitleTextView.setText(title);
4409d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project            }
4419d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project            // create an array adapter for the menu list
4429d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project            StkMenuAdapter adapter = new StkMenuAdapter(this,
4439d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project                    mStkMenu.items, mStkMenu.itemsIconSelfExplanatory);
4449d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project            // Bind menu list to the new adapter.
4459d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project            setListAdapter(adapter);
4469d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project            // Set default item
4479d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project            setSelection(mStkMenu.defaultItem);
4489d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project        }
4499d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project    }
4509d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project
4519d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project    private void initFromIntent(Intent intent) {
4529d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project
4539d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project        if (intent != null) {
4549d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project            mState = intent.getIntExtra("STATE", STATE_MAIN);
455e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville            mSlotId = intent.getIntExtra(StkAppService.SLOT_ID, -1);
456e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville            CatLog.d(LOG_TAG, "slot id: " + mSlotId + ", state: " + mState);
4579d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project        } else {
458e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville            CatLog.d(LOG_TAG, "finish!");
4599d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project            finish();
4609d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project        }
4619d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project    }
4629d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project
4639d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project    private Item getSelectedItem(int position) {
4649d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project        Item item = null;
4659d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project        if (mStkMenu != null) {
4669d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project            try {
4679d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project                item = mStkMenu.items.get(position);
4689d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project            } catch (IndexOutOfBoundsException e) {
4699d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project                if (StkApp.DBG) {
470e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville                    CatLog.d(LOG_TAG, "IOOBE Invalid menu");
4719d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project                }
4729d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project            } catch (NullPointerException e) {
4739d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project                if (StkApp.DBG) {
474e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville                    CatLog.d(LOG_TAG, "NPE Invalid menu");
4759d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project                }
4769d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project            }
4779d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project        }
4789d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project        return item;
4799d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project    }
4809d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project
4819d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project    private void sendResponse(int resId) {
4829d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project        sendResponse(resId, 0, false);
4839d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project    }
4849d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project
4859d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project    private void sendResponse(int resId, int itemId, boolean help) {
486e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville        CatLog.d(LOG_TAG, "sendResponse resID[" + resId + "] itemId[" + itemId +
487e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville            "] help[" + help + "]");
488e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville        mIsResponseSent = true;
4899d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project        Bundle args = new Bundle();
4909d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project        args.putInt(StkAppService.OPCODE, StkAppService.OP_RESPONSE);
491e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville        args.putInt(StkAppService.SLOT_ID, mSlotId);
4929d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project        args.putInt(StkAppService.RES_ID, resId);
4939d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project        args.putInt(StkAppService.MENU_SELECTION, itemId);
4949d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project        args.putBoolean(StkAppService.HELP, help);
4959d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project        mContext.startService(new Intent(mContext, StkAppService.class)
4969d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project                .putExtras(args));
4979d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project    }
4989d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project}
499