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