StkMenuActivity.java revision 64ec38ec889df7bf757861b02e918c05464cc545
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; 209d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Projectimport android.content.Context; 219d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Projectimport android.content.Intent; 229d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Projectimport android.os.Bundle; 239d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Projectimport android.os.Handler; 249d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Projectimport android.os.Message; 2582d3e797c0199237755ec3f8c427e34925c59c6dGuillaume Lucasimport android.view.ContextMenu; 2682d3e797c0199237755ec3f8c427e34925c59c6dGuillaume Lucasimport android.view.ContextMenu.ContextMenuInfo; 279d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Projectimport android.view.KeyEvent; 289d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Projectimport android.view.MenuItem; 299d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Projectimport android.view.View; 309d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Projectimport android.view.Window; 3182d3e797c0199237755ec3f8c427e34925c59c6dGuillaume Lucasimport android.widget.AdapterView; 329d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Projectimport android.widget.ImageView; 339d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Projectimport android.widget.ListView; 349d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Projectimport android.widget.ProgressBar; 359d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Projectimport android.widget.TextView; 369d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 37d41f1d98d7bf42e9e867819593ad79f685604796Alex Yakavenkaimport com.android.internal.telephony.cat.Item; 38d41f1d98d7bf42e9e867819593ad79f685604796Alex Yakavenkaimport com.android.internal.telephony.cat.Menu; 39d41f1d98d7bf42e9e867819593ad79f685604796Alex Yakavenkaimport com.android.internal.telephony.cat.CatLog; 409d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 419d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project/** 4279085fcc5b4e54cc374e8720644ce4c1dc0004beWink Saville * ListActivity used for displaying STK menus. These can be SET UP MENU and 4379085fcc5b4e54cc374e8720644ce4c1dc0004beWink Saville * SELECT ITEM menus. This activity is started multiple times with different 449d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project * menu content. 459d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project * 469d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project */ 4782d3e797c0199237755ec3f8c427e34925c59c6dGuillaume Lucaspublic class StkMenuActivity extends ListActivity implements View.OnCreateContextMenuListener { 489d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project private Context mContext; 499d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project private Menu mStkMenu = null; 509d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project private int mState = STATE_MAIN; 519d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project private boolean mAcceptUsersInput = true; 529d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 539d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project private TextView mTitleTextView = null; 549d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project private ImageView mTitleIconView = null; 559d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project private ProgressBar mProgressView = null; 569d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 579d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project StkAppService appService = StkAppService.getInstance(); 589d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 599d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project // Internal state values 609d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project static final int STATE_MAIN = 1; 619d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project static final int STATE_SECONDARY = 2; 629d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 6379085fcc5b4e54cc374e8720644ce4c1dc0004beWink Saville // message id for time out 649d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project private static final int MSG_ID_TIMEOUT = 1; 6582d3e797c0199237755ec3f8c427e34925c59c6dGuillaume Lucas private static final int CONTEXT_MENU_HELP = 0; 669d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 679d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project Handler mTimeoutHandler = new Handler() { 689d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project @Override 699d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project public void handleMessage(Message msg) { 709d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project switch(msg.what) { 719d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project case MSG_ID_TIMEOUT: 729d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project mAcceptUsersInput = false; 739d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project sendResponse(StkAppService.RES_ID_TIMEOUT); 749d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project break; 759d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 769d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 779d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project }; 789d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 799d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project @Override 809d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project public void onCreate(Bundle icicle) { 819d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project super.onCreate(icicle); 829d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 83d41f1d98d7bf42e9e867819593ad79f685604796Alex Yakavenka CatLog.d(this, "onCreate"); 849d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project // Set the layout for this activity. 859d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project setContentView(R.layout.stk_menu_list); 869d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 879d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project mTitleTextView = (TextView) findViewById(R.id.title_text); 889d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project mTitleIconView = (ImageView) findViewById(R.id.title_icon); 899d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project mProgressView = (ProgressBar) findViewById(R.id.progress_bar); 909d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project mContext = getBaseContext(); 919d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 929d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project initFromIntent(getIntent()); 939d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project mAcceptUsersInput = true; 9482d3e797c0199237755ec3f8c427e34925c59c6dGuillaume Lucas 9582d3e797c0199237755ec3f8c427e34925c59c6dGuillaume Lucas getListView().setOnCreateContextMenuListener(this); 969d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 979d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 989d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project @Override 999d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project protected void onNewIntent(Intent intent) { 1009d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project super.onNewIntent(intent); 1019d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 102d41f1d98d7bf42e9e867819593ad79f685604796Alex Yakavenka CatLog.d(this, "onNewIntent"); 1039d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project initFromIntent(intent); 1049d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project mAcceptUsersInput = true; 1059d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 1069d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 1079d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project @Override 1089d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project protected void onListItemClick(ListView l, View v, int position, long id) { 1099d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project super.onListItemClick(l, v, position, id); 11079085fcc5b4e54cc374e8720644ce4c1dc0004beWink Saville 1119d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project if (!mAcceptUsersInput) { 1129d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project return; 1139d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 1149d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 1159d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project Item item = getSelectedItem(position); 1169d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project if (item == null) { 1179d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project return; 1189d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 1199d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project sendResponse(StkAppService.RES_ID_MENU_SELECTION, item.id, false); 1209d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project mAcceptUsersInput = false; 1219d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project mProgressView.setVisibility(View.VISIBLE); 1229d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project mProgressView.setIndeterminate(true); 1239d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 1249d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 1259d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project @Override 1269d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project public boolean onKeyDown(int keyCode, KeyEvent event) { 1279d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 1289d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project if (!mAcceptUsersInput) { 1299d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project return true; 1309d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 1319d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 1329d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project switch (keyCode) { 1339d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project case KeyEvent.KEYCODE_BACK: 1349d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project switch (mState) { 1359d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project case STATE_SECONDARY: 1369d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project cancelTimeOut(); 1379d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project mAcceptUsersInput = false; 1389d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project sendResponse(StkAppService.RES_ID_BACKWARD); 1399d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project return true; 1409d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project case STATE_MAIN: 1419d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project break; 1429d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 1439d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project break; 1449d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 1459d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project return super.onKeyDown(keyCode, event); 1469d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 1479d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 1489d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project @Override 1499d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project public void onResume() { 1509d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project super.onResume(); 1519d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 1529d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project appService.indicateMenuVisibility(true); 1539d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project mStkMenu = appService.getMenu(); 1549d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project if (mStkMenu == null) { 1559d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project finish(); 1569d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project return; 1579d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 1589d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project displayMenu(); 1599d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project startTimeOut(); 1609d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project // whenever this activity is resumed after a sub activity was invoked 16179085fcc5b4e54cc374e8720644ce4c1dc0004beWink Saville // (Browser, In call screen) switch back to main state and enable 1629d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project // user's input; 1639d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project if (!mAcceptUsersInput) { 1649d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project mState = STATE_MAIN; 1659d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project mAcceptUsersInput = true; 1669d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 16764ec38ec889df7bf757861b02e918c05464cc545w invalidateOptionsMenu(); 1689d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project // make sure the progress bar is not shown. 1699d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project mProgressView.setIndeterminate(false); 1709d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project mProgressView.setVisibility(View.GONE); 1719d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 1729d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 1739d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project @Override 1749d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project public void onPause() { 1759d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project super.onPause(); 1769d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 1779d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project appService.indicateMenuVisibility(false); 1789d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project cancelTimeOut(); 1799d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 1809d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 1819d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project @Override 1829d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project public void onDestroy() { 18382d3e797c0199237755ec3f8c427e34925c59c6dGuillaume Lucas getListView().setOnCreateContextMenuListener(null); 1849d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project super.onDestroy(); 1859d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 186d41f1d98d7bf42e9e867819593ad79f685604796Alex Yakavenka CatLog.d(this, "onDestroy"); 1879d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 1889d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 1899d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project @Override 1909d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project public boolean onCreateOptionsMenu(android.view.Menu menu) { 1919d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project super.onCreateOptionsMenu(menu); 1929d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project menu.add(0, StkApp.MENU_ID_END_SESSION, 1, R.string.menu_end_session); 1939d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project menu.add(0, StkApp.MENU_ID_HELP, 2, R.string.help); 1949d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project return true; 1959d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 1969d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 1979d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project @Override 1989d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project public boolean onPrepareOptionsMenu(android.view.Menu menu) { 1999d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project super.onPrepareOptionsMenu(menu); 2009d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project boolean helpVisible = false; 2019d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project boolean mainVisible = false; 2029d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 2039d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project if (mState == STATE_SECONDARY) { 2049d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project mainVisible = true; 2059d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 2069d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project if (mStkMenu != null) { 2079d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project helpVisible = mStkMenu.helpAvailable; 2089d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 2099d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 2109d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project menu.findItem(StkApp.MENU_ID_END_SESSION).setVisible(mainVisible); 2119d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project menu.findItem(StkApp.MENU_ID_HELP).setVisible(helpVisible); 2129d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 2139d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project return true; 2149d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 2159d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 2169d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project @Override 2179d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project public boolean onOptionsItemSelected(MenuItem item) { 2189d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project if (!mAcceptUsersInput) { 2199d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project return true; 2209d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 2219d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project switch (item.getItemId()) { 2229d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project case StkApp.MENU_ID_END_SESSION: 2239d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project cancelTimeOut(); 2249d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project mAcceptUsersInput = false; 2259d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project // send session end response. 2269d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project sendResponse(StkAppService.RES_ID_END_SESSION); 2279d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project return true; 2289d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project case StkApp.MENU_ID_HELP: 2299d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project cancelTimeOut(); 2309d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project mAcceptUsersInput = false; 2319d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project int position = getSelectedItemPosition(); 2329d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project Item stkItem = getSelectedItem(position); 2339d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project if (stkItem == null) { 2349d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project break; 2359d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 2369d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project // send help needed response. 2379d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project sendResponse(StkAppService.RES_ID_MENU_SELECTION, stkItem.id, true); 2389d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project return true; 2399d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 2409d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project return super.onOptionsItemSelected(item); 2419d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 2429d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 2439d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project @Override 24482d3e797c0199237755ec3f8c427e34925c59c6dGuillaume Lucas public void onCreateContextMenu(ContextMenu menu, View v, 24582d3e797c0199237755ec3f8c427e34925c59c6dGuillaume Lucas ContextMenuInfo menuInfo) { 24682d3e797c0199237755ec3f8c427e34925c59c6dGuillaume Lucas CatLog.d(this, "onCreateContextMenu"); 24782d3e797c0199237755ec3f8c427e34925c59c6dGuillaume Lucas boolean helpVisible = false; 24882d3e797c0199237755ec3f8c427e34925c59c6dGuillaume Lucas if (mStkMenu != null) { 24982d3e797c0199237755ec3f8c427e34925c59c6dGuillaume Lucas helpVisible = mStkMenu.helpAvailable; 25082d3e797c0199237755ec3f8c427e34925c59c6dGuillaume Lucas } 25182d3e797c0199237755ec3f8c427e34925c59c6dGuillaume Lucas if (helpVisible) { 25282d3e797c0199237755ec3f8c427e34925c59c6dGuillaume Lucas CatLog.d(this, "add menu"); 25382d3e797c0199237755ec3f8c427e34925c59c6dGuillaume Lucas menu.add(0, CONTEXT_MENU_HELP, 0, R.string.help); 25482d3e797c0199237755ec3f8c427e34925c59c6dGuillaume Lucas } 25582d3e797c0199237755ec3f8c427e34925c59c6dGuillaume Lucas } 25682d3e797c0199237755ec3f8c427e34925c59c6dGuillaume Lucas 25782d3e797c0199237755ec3f8c427e34925c59c6dGuillaume Lucas @Override 25882d3e797c0199237755ec3f8c427e34925c59c6dGuillaume Lucas public boolean onContextItemSelected(MenuItem item) { 25982d3e797c0199237755ec3f8c427e34925c59c6dGuillaume Lucas AdapterView.AdapterContextMenuInfo info; 26082d3e797c0199237755ec3f8c427e34925c59c6dGuillaume Lucas try { 26182d3e797c0199237755ec3f8c427e34925c59c6dGuillaume Lucas info = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo(); 26282d3e797c0199237755ec3f8c427e34925c59c6dGuillaume Lucas } catch (ClassCastException e) { 26382d3e797c0199237755ec3f8c427e34925c59c6dGuillaume Lucas return false; 26482d3e797c0199237755ec3f8c427e34925c59c6dGuillaume Lucas } 26582d3e797c0199237755ec3f8c427e34925c59c6dGuillaume Lucas switch (item.getItemId()) { 26682d3e797c0199237755ec3f8c427e34925c59c6dGuillaume Lucas case CONTEXT_MENU_HELP: 26782d3e797c0199237755ec3f8c427e34925c59c6dGuillaume Lucas cancelTimeOut(); 26882d3e797c0199237755ec3f8c427e34925c59c6dGuillaume Lucas mAcceptUsersInput = false; 26982d3e797c0199237755ec3f8c427e34925c59c6dGuillaume Lucas int position = info.position; 27082d3e797c0199237755ec3f8c427e34925c59c6dGuillaume Lucas CatLog.d(this, "Position:" + position); 27182d3e797c0199237755ec3f8c427e34925c59c6dGuillaume Lucas Item stkItem = getSelectedItem(position); 27282d3e797c0199237755ec3f8c427e34925c59c6dGuillaume Lucas if (stkItem != null) { 27382d3e797c0199237755ec3f8c427e34925c59c6dGuillaume Lucas CatLog.d(this, "item id:" + stkItem.id); 27482d3e797c0199237755ec3f8c427e34925c59c6dGuillaume Lucas sendResponse(StkAppService.RES_ID_MENU_SELECTION, stkItem.id, true); 27582d3e797c0199237755ec3f8c427e34925c59c6dGuillaume Lucas } 27682d3e797c0199237755ec3f8c427e34925c59c6dGuillaume Lucas return true; 27782d3e797c0199237755ec3f8c427e34925c59c6dGuillaume Lucas 27882d3e797c0199237755ec3f8c427e34925c59c6dGuillaume Lucas default: 27982d3e797c0199237755ec3f8c427e34925c59c6dGuillaume Lucas return super.onContextItemSelected(item); 28082d3e797c0199237755ec3f8c427e34925c59c6dGuillaume Lucas } 28182d3e797c0199237755ec3f8c427e34925c59c6dGuillaume Lucas } 28282d3e797c0199237755ec3f8c427e34925c59c6dGuillaume Lucas 28382d3e797c0199237755ec3f8c427e34925c59c6dGuillaume Lucas @Override 2849d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project protected void onSaveInstanceState(Bundle outState) { 2859d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project outState.putInt("STATE", mState); 2869d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project outState.putParcelable("MENU", mStkMenu); 2879d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 2889d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 2899d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project @Override 2909d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project protected void onRestoreInstanceState(Bundle savedInstanceState) { 2919d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project mState = savedInstanceState.getInt("STATE"); 2929d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project mStkMenu = savedInstanceState.getParcelable("MENU"); 2939d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 29479085fcc5b4e54cc374e8720644ce4c1dc0004beWink Saville 2959d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project private void cancelTimeOut() { 2969d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project mTimeoutHandler.removeMessages(MSG_ID_TIMEOUT); 2979d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 2989d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 2999d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project private void startTimeOut() { 3009d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project if (mState == STATE_SECONDARY) { 3019d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project // Reset timeout. 3029d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project cancelTimeOut(); 3039d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project mTimeoutHandler.sendMessageDelayed(mTimeoutHandler 3049d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project .obtainMessage(MSG_ID_TIMEOUT), StkApp.UI_TIMEOUT); 3059d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 3069d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 30779085fcc5b4e54cc374e8720644ce4c1dc0004beWink Saville 3089d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project // Bind list adapter to the items list. 3099d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project private void displayMenu() { 3109d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 3119d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project if (mStkMenu != null) { 3123e34a8ad0ff494f6e5abc618acecdcc075d0be83Pierre Fröjd String title = mStkMenu.title == null ? getString(R.string.app_name) : mStkMenu.title; 3139d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project // Display title & title icon 3149d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project if (mStkMenu.titleIcon != null) { 3159d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project mTitleIconView.setImageBitmap(mStkMenu.titleIcon); 3169d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project mTitleIconView.setVisibility(View.VISIBLE); 3173e34a8ad0ff494f6e5abc618acecdcc075d0be83Pierre Fröjd mTitleTextView.setVisibility(View.INVISIBLE); 3183e34a8ad0ff494f6e5abc618acecdcc075d0be83Pierre Fröjd if (!mStkMenu.titleIconSelfExplanatory) { 3193e34a8ad0ff494f6e5abc618acecdcc075d0be83Pierre Fröjd mTitleTextView.setText(title); 3203e34a8ad0ff494f6e5abc618acecdcc075d0be83Pierre Fröjd mTitleTextView.setVisibility(View.VISIBLE); 3213e34a8ad0ff494f6e5abc618acecdcc075d0be83Pierre Fröjd } 3229d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } else { 3239d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project mTitleIconView.setVisibility(View.GONE); 3249d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project mTitleTextView.setVisibility(View.VISIBLE); 3253e34a8ad0ff494f6e5abc618acecdcc075d0be83Pierre Fröjd mTitleTextView.setText(title); 3269d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 3279d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project // create an array adapter for the menu list 3289d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project StkMenuAdapter adapter = new StkMenuAdapter(this, 3299d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project mStkMenu.items, mStkMenu.itemsIconSelfExplanatory); 3309d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project // Bind menu list to the new adapter. 3319d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project setListAdapter(adapter); 3329d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project // Set default item 3339d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project setSelection(mStkMenu.defaultItem); 3349d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 3359d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 3369d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 3379d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project private void initFromIntent(Intent intent) { 3389d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 3399d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project if (intent != null) { 3409d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project mState = intent.getIntExtra("STATE", STATE_MAIN); 3419d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } else { 3429d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project finish(); 3439d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 3449d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 3459d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 3469d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project private Item getSelectedItem(int position) { 3479d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project Item item = null; 3489d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project if (mStkMenu != null) { 3499d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project try { 3509d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project item = mStkMenu.items.get(position); 3519d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } catch (IndexOutOfBoundsException e) { 3529d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project if (StkApp.DBG) { 353d41f1d98d7bf42e9e867819593ad79f685604796Alex Yakavenka CatLog.d(this, "Invalid menu"); 3549d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 3559d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } catch (NullPointerException e) { 3569d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project if (StkApp.DBG) { 357d41f1d98d7bf42e9e867819593ad79f685604796Alex Yakavenka CatLog.d(this, "Invalid menu"); 3589d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 3599d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 3609d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 3619d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project return item; 3629d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 3639d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 3649d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project private void sendResponse(int resId) { 3659d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project sendResponse(resId, 0, false); 3669d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 3679d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 3689d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project private void sendResponse(int resId, int itemId, boolean help) { 3699d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project Bundle args = new Bundle(); 3709d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project args.putInt(StkAppService.OPCODE, StkAppService.OP_RESPONSE); 3719d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project args.putInt(StkAppService.RES_ID, resId); 3729d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project args.putInt(StkAppService.MENU_SELECTION, itemId); 3739d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project args.putBoolean(StkAppService.HELP, help); 3749d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project mContext.startService(new Intent(mContext, StkAppService.class) 3759d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project .putExtras(args)); 3769d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 3779d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project} 378