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