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 19cfe4d7f06d8e023ddc153cd042682957dfd85de2Christopher Posselwhiteimport com.android.internal.telephony.cat.CatLog; 20d41f1d98d7bf42e9e867819593ad79f685604796Alex Yakavenkaimport com.android.internal.telephony.cat.TextMessage; 219d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 229d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Projectimport android.app.Activity; 238bf95af0202e8a9b475ab1a75fd7f7a13cd0262bwimport android.app.AlarmManager; 24b10cfa33eac35d12f705a84454deb314930a6607Sanket Padaweimport android.app.AlertDialog; 258bf95af0202e8a9b475ab1a75fd7f7a13cd0262bwimport android.app.PendingIntent; 269d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Projectimport android.content.Intent; 278bf95af0202e8a9b475ab1a75fd7f7a13cd0262bwimport android.content.IntentFilter; 288bf95af0202e8a9b475ab1a75fd7f7a13cd0262bwimport android.content.BroadcastReceiver; 298bf95af0202e8a9b475ab1a75fd7f7a13cd0262bwimport android.content.Context; 30b10cfa33eac35d12f705a84454deb314930a6607Sanket Padaweimport android.content.DialogInterface; 31b10cfa33eac35d12f705a84454deb314930a6607Sanket Padaweimport android.view.KeyEvent; 32b10cfa33eac35d12f705a84454deb314930a6607Sanket Padawe 339d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Projectimport android.os.Bundle; 348bf95af0202e8a9b475ab1a75fd7f7a13cd0262bwimport android.os.SystemClock; 359d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 369d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project/** 378bf95af0202e8a9b475ab1a75fd7f7a13cd0262bw * AlertDialog used for DISPLAY TEXT commands. 3879085fcc5b4e54cc374e8720644ce4c1dc0004beWink Saville * 399d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project */ 40b10cfa33eac35d12f705a84454deb314930a6607Sanket Padawepublic class StkDialogActivity extends Activity { 419d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project // members 42e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville private static final String className = new Object(){}.getClass().getEnclosingClass().getName(); 43e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville private static final String LOG_TAG = className.substring(className.lastIndexOf('.') + 1); 44e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville TextMessage mTextMsg = null; 45e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville private int mSlotId = -1; 46e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville private StkAppService appService = StkAppService.getInstance(); 478bf95af0202e8a9b475ab1a75fd7f7a13cd0262bw // Determines whether Terminal Response (TR) has been sent 48ef243a24eb9b919a6c315bffb53fcb557195489aJohannes Carlsson private boolean mIsResponseSent = false; 498bf95af0202e8a9b475ab1a75fd7f7a13cd0262bw private Context mContext; 508bf95af0202e8a9b475ab1a75fd7f7a13cd0262bw // Utilize AlarmManager for real-time countdown 518bf95af0202e8a9b475ab1a75fd7f7a13cd0262bw private PendingIntent mTimeoutIntent; 528bf95af0202e8a9b475ab1a75fd7f7a13cd0262bw private AlarmManager mAlarmManager; 538bf95af0202e8a9b475ab1a75fd7f7a13cd0262bw private final static String ALARM_TIMEOUT = "com.android.stk.DIALOG_ALARM_TIMEOUT"; 549d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 559d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project //keys) for saving the state of the dialog in the icicle 569d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project private static final String TEXT = "text"; 579d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 58b10cfa33eac35d12f705a84454deb314930a6607Sanket Padawe private AlertDialog.Builder alertDialogBuilder; 599d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 609d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project @Override 619d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project protected void onCreate(Bundle icicle) { 629d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project super.onCreate(icicle); 639d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 648bf95af0202e8a9b475ab1a75fd7f7a13cd0262bw CatLog.d(LOG_TAG, "onCreate, sim id: " + mSlotId); 65ba9b86b6257d98d3c1312ff188b22e0f6b785cadRyuto Sawada 66ba9b86b6257d98d3c1312ff188b22e0f6b785cadRyuto Sawada // appService can be null if this activity is automatically recreated by the system 67ba9b86b6257d98d3c1312ff188b22e0f6b785cadRyuto Sawada // with the saved instance state right after the phone process is killed. 68ba9b86b6257d98d3c1312ff188b22e0f6b785cadRyuto Sawada if (appService == null) { 69ba9b86b6257d98d3c1312ff188b22e0f6b785cadRyuto Sawada CatLog.d(LOG_TAG, "onCreate - appService is null"); 70ba9b86b6257d98d3c1312ff188b22e0f6b785cadRyuto Sawada finish(); 71ba9b86b6257d98d3c1312ff188b22e0f6b785cadRyuto Sawada return; 72ba9b86b6257d98d3c1312ff188b22e0f6b785cadRyuto Sawada } 73ba9b86b6257d98d3c1312ff188b22e0f6b785cadRyuto Sawada 748bf95af0202e8a9b475ab1a75fd7f7a13cd0262bw // New Dialog is created - set to no response sent 758bf95af0202e8a9b475ab1a75fd7f7a13cd0262bw mIsResponseSent = false; 768bf95af0202e8a9b475ab1a75fd7f7a13cd0262bw 77b10cfa33eac35d12f705a84454deb314930a6607Sanket Padawe alertDialogBuilder = new AlertDialog.Builder(this); 78b10cfa33eac35d12f705a84454deb314930a6607Sanket Padawe 79b10cfa33eac35d12f705a84454deb314930a6607Sanket Padawe alertDialogBuilder.setPositiveButton(R.string.button_ok, new 80b10cfa33eac35d12f705a84454deb314930a6607Sanket Padawe DialogInterface.OnClickListener() { 81b10cfa33eac35d12f705a84454deb314930a6607Sanket Padawe @Override 82b10cfa33eac35d12f705a84454deb314930a6607Sanket Padawe public void onClick(DialogInterface dialog, int id) { 83b10cfa33eac35d12f705a84454deb314930a6607Sanket Padawe CatLog.d(LOG_TAG, "OK Clicked!, mSlotId: " + mSlotId); 84b10cfa33eac35d12f705a84454deb314930a6607Sanket Padawe cancelTimeOut(); 85b10cfa33eac35d12f705a84454deb314930a6607Sanket Padawe sendResponse(StkAppService.RES_ID_CONFIRM, true); 86b10cfa33eac35d12f705a84454deb314930a6607Sanket Padawe finish(); 87b10cfa33eac35d12f705a84454deb314930a6607Sanket Padawe } 88b10cfa33eac35d12f705a84454deb314930a6607Sanket Padawe }); 89b10cfa33eac35d12f705a84454deb314930a6607Sanket Padawe 90b10cfa33eac35d12f705a84454deb314930a6607Sanket Padawe alertDialogBuilder.setNegativeButton(R.string.button_cancel, new 91b10cfa33eac35d12f705a84454deb314930a6607Sanket Padawe DialogInterface.OnClickListener() { 92b10cfa33eac35d12f705a84454deb314930a6607Sanket Padawe @Override 93b10cfa33eac35d12f705a84454deb314930a6607Sanket Padawe public void onClick(DialogInterface dialog,int id) { 94b10cfa33eac35d12f705a84454deb314930a6607Sanket Padawe CatLog.d(LOG_TAG, "Cancel Clicked!, mSlotId: " + mSlotId); 95b10cfa33eac35d12f705a84454deb314930a6607Sanket Padawe cancelTimeOut(); 96b10cfa33eac35d12f705a84454deb314930a6607Sanket Padawe sendResponse(StkAppService.RES_ID_CONFIRM, false); 97b10cfa33eac35d12f705a84454deb314930a6607Sanket Padawe finish(); 98b10cfa33eac35d12f705a84454deb314930a6607Sanket Padawe } 99b10cfa33eac35d12f705a84454deb314930a6607Sanket Padawe }); 100b10cfa33eac35d12f705a84454deb314930a6607Sanket Padawe alertDialogBuilder.create(); 1018bf95af0202e8a9b475ab1a75fd7f7a13cd0262bw 1028bf95af0202e8a9b475ab1a75fd7f7a13cd0262bw mContext = getBaseContext(); 1038bf95af0202e8a9b475ab1a75fd7f7a13cd0262bw IntentFilter intentFilter = new IntentFilter(); 1048bf95af0202e8a9b475ab1a75fd7f7a13cd0262bw intentFilter.addAction(ALARM_TIMEOUT); 1058bf95af0202e8a9b475ab1a75fd7f7a13cd0262bw mContext.registerReceiver(mBroadcastReceiver, intentFilter); 1068bf95af0202e8a9b475ab1a75fd7f7a13cd0262bw mAlarmManager =(AlarmManager)mContext.getSystemService(Context.ALARM_SERVICE); 1078bf95af0202e8a9b475ab1a75fd7f7a13cd0262bw 1088b7e05130ca26bec834bdf4651c4dc562fc6fcbcRyuto Sawada setFinishOnTouchOutside(false); 1099d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 1109d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 1119d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project @Override 1129d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project public boolean onKeyDown(int keyCode, KeyEvent event) { 1139d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project switch (keyCode) { 114b10cfa33eac35d12f705a84454deb314930a6607Sanket Padawe case KeyEvent.KEYCODE_BACK: 115b10cfa33eac35d12f705a84454deb314930a6607Sanket Padawe CatLog.d(LOG_TAG, "onKeyDown - KEYCODE_BACK"); 116b10cfa33eac35d12f705a84454deb314930a6607Sanket Padawe cancelTimeOut(); 117b10cfa33eac35d12f705a84454deb314930a6607Sanket Padawe sendResponse(StkAppService.RES_ID_BACKWARD); 118b10cfa33eac35d12f705a84454deb314930a6607Sanket Padawe finish(); 119b10cfa33eac35d12f705a84454deb314930a6607Sanket Padawe break; 1209d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 1219d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project return false; 1229d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 1239d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 1249d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project @Override 1259d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project public void onResume() { 1269d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project super.onResume(); 127e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville CatLog.d(LOG_TAG, "onResume - mIsResponseSent[" + mIsResponseSent + 128e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville "], sim id: " + mSlotId); 129414bc414dba1ef9605a0ab6185700af9748e2187Preeti Ahuja 130414bc414dba1ef9605a0ab6185700af9748e2187Preeti Ahuja initFromIntent(getIntent()); 131414bc414dba1ef9605a0ab6185700af9748e2187Preeti Ahuja if (mTextMsg == null) { 132414bc414dba1ef9605a0ab6185700af9748e2187Preeti Ahuja finish(); 133414bc414dba1ef9605a0ab6185700af9748e2187Preeti Ahuja return; 134414bc414dba1ef9605a0ab6185700af9748e2187Preeti Ahuja } 135414bc414dba1ef9605a0ab6185700af9748e2187Preeti Ahuja 136b10cfa33eac35d12f705a84454deb314930a6607Sanket Padawe alertDialogBuilder.setTitle(mTextMsg.title); 137414bc414dba1ef9605a0ab6185700af9748e2187Preeti Ahuja 138414bc414dba1ef9605a0ab6185700af9748e2187Preeti Ahuja if (!(mTextMsg.iconSelfExplanatory && mTextMsg.icon != null)) { 139b10cfa33eac35d12f705a84454deb314930a6607Sanket Padawe alertDialogBuilder.setMessage(mTextMsg.text); 140414bc414dba1ef9605a0ab6185700af9748e2187Preeti Ahuja } 141b10cfa33eac35d12f705a84454deb314930a6607Sanket Padawe alertDialogBuilder.show(); 142414bc414dba1ef9605a0ab6185700af9748e2187Preeti Ahuja 143cfe4d7f06d8e023ddc153cd042682957dfd85de2Christopher Posselwhite /* 144414bc414dba1ef9605a0ab6185700af9748e2187Preeti Ahuja * If the userClear flag is set and dialogduration is set to 0, the display Text 145414bc414dba1ef9605a0ab6185700af9748e2187Preeti Ahuja * should be displayed to user forever until some high priority event occurs 146414bc414dba1ef9605a0ab6185700af9748e2187Preeti Ahuja * (incoming call, MMI code execution etc as mentioned under section 147414bc414dba1ef9605a0ab6185700af9748e2187Preeti Ahuja * ETSI 102.223, 6.4.1) 148cfe4d7f06d8e023ddc153cd042682957dfd85de2Christopher Posselwhite */ 149414bc414dba1ef9605a0ab6185700af9748e2187Preeti Ahuja if (StkApp.calculateDurationInMilis(mTextMsg.duration) == 0 && 150b10cfa33eac35d12f705a84454deb314930a6607Sanket Padawe !mTextMsg.responseNeeded && mTextMsg.userClear) { 1518bf95af0202e8a9b475ab1a75fd7f7a13cd0262bw CatLog.d(LOG_TAG, "User should clear text..showing message forever"); 152cfe4d7f06d8e023ddc153cd042682957dfd85de2Christopher Posselwhite return; 153cfe4d7f06d8e023ddc153cd042682957dfd85de2Christopher Posselwhite } 154cfe4d7f06d8e023ddc153cd042682957dfd85de2Christopher Posselwhite 1559591934f86a8e10c1f9c4612883f8b6164ea427fPreeti Ahuja appService.setDisplayTextDlgVisibility(true, mSlotId); 1568bf95af0202e8a9b475ab1a75fd7f7a13cd0262bw 1578bf95af0202e8a9b475ab1a75fd7f7a13cd0262bw /* 1588bf95af0202e8a9b475ab1a75fd7f7a13cd0262bw * When another activity takes the foreground, we do not want the Terminal 1598bf95af0202e8a9b475ab1a75fd7f7a13cd0262bw * Response timer to be restarted when our activity resumes. Hence we will 1608bf95af0202e8a9b475ab1a75fd7f7a13cd0262bw * check if there is an existing timer, and resume it. In this way we will 161b10cfa33eac35d12f705a84454deb314930a6607Sanket Padawe * inform the SIM in correct time when there is no response from the User 1628bf95af0202e8a9b475ab1a75fd7f7a13cd0262bw * to a dialog. 1638bf95af0202e8a9b475ab1a75fd7f7a13cd0262bw */ 1648bf95af0202e8a9b475ab1a75fd7f7a13cd0262bw if (mTimeoutIntent != null) { 1658bf95af0202e8a9b475ab1a75fd7f7a13cd0262bw CatLog.d(LOG_TAG, "Pending Alarm! Let it finish counting down..."); 1668bf95af0202e8a9b475ab1a75fd7f7a13cd0262bw } 1678bf95af0202e8a9b475ab1a75fd7f7a13cd0262bw else { 1688bf95af0202e8a9b475ab1a75fd7f7a13cd0262bw CatLog.d(LOG_TAG, "No Pending Alarm! OK to start timer..."); 1698bf95af0202e8a9b475ab1a75fd7f7a13cd0262bw startTimeOut(mTextMsg.userClear); 1708bf95af0202e8a9b475ab1a75fd7f7a13cd0262bw } 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(); 176e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville CatLog.d(LOG_TAG, "onPause, sim id: " + mSlotId); 1779591934f86a8e10c1f9c4612883f8b6164ea427fPreeti Ahuja appService.setDisplayTextDlgVisibility(false, mSlotId); 17803be6676b5797d70ad30374c16589300f63438c0Preeti Ahuja 17903be6676b5797d70ad30374c16589300f63438c0Preeti Ahuja /* 18003be6676b5797d70ad30374c16589300f63438c0Preeti Ahuja * do not cancel the timer here cancelTimeOut(). If any higher/lower 18103be6676b5797d70ad30374c16589300f63438c0Preeti Ahuja * priority events such as incoming call, new sms, screen off intent, 18203be6676b5797d70ad30374c16589300f63438c0Preeti Ahuja * notification alerts, user actions such as 'User moving to another activtiy' 18303be6676b5797d70ad30374c16589300f63438c0Preeti Ahuja * etc.. occur during Display Text ongoing session, 18403be6676b5797d70ad30374c16589300f63438c0Preeti Ahuja * this activity would receive 'onPause()' event resulting in 18503be6676b5797d70ad30374c16589300f63438c0Preeti Ahuja * cancellation of the timer. As a result no terminal response is 18603be6676b5797d70ad30374c16589300f63438c0Preeti Ahuja * sent to the card. 18703be6676b5797d70ad30374c16589300f63438c0Preeti Ahuja */ 1889d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 1899d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 1909d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project @Override 191ef243a24eb9b919a6c315bffb53fcb557195489aJohannes Carlsson protected void onStart() { 1928bf95af0202e8a9b475ab1a75fd7f7a13cd0262bw CatLog.d(LOG_TAG, "onStart, sim id: " + mSlotId); 193ef243a24eb9b919a6c315bffb53fcb557195489aJohannes Carlsson super.onStart(); 194ef243a24eb9b919a6c315bffb53fcb557195489aJohannes Carlsson } 195ef243a24eb9b919a6c315bffb53fcb557195489aJohannes Carlsson 196ef243a24eb9b919a6c315bffb53fcb557195489aJohannes Carlsson @Override 197ef243a24eb9b919a6c315bffb53fcb557195489aJohannes Carlsson public void onStop() { 198ef243a24eb9b919a6c315bffb53fcb557195489aJohannes Carlsson super.onStop(); 199e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville CatLog.d(LOG_TAG, "onStop - before Send CONFIRM false mIsResponseSent[" + 200e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville mIsResponseSent + "], sim id: " + mSlotId); 2012aa6456a624c66680a70b29b192ff9173295d9adTsukasa Gotou if (!mTextMsg.responseNeeded) { 2022aa6456a624c66680a70b29b192ff9173295d9adTsukasa Gotou return; 2032aa6456a624c66680a70b29b192ff9173295d9adTsukasa Gotou } 204ef243a24eb9b919a6c315bffb53fcb557195489aJohannes Carlsson if (!mIsResponseSent) { 205e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville appService.getStkContext(mSlotId).setPendingDialogInstance(this); 206e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville } else { 207e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville CatLog.d(LOG_TAG, "finish."); 208e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville appService.getStkContext(mSlotId).setPendingDialogInstance(null); 209e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville cancelTimeOut(); 210e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville finish(); 211ef243a24eb9b919a6c315bffb53fcb557195489aJohannes Carlsson } 212ef243a24eb9b919a6c315bffb53fcb557195489aJohannes Carlsson } 213ef243a24eb9b919a6c315bffb53fcb557195489aJohannes Carlsson 214ef243a24eb9b919a6c315bffb53fcb557195489aJohannes Carlsson @Override 215e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville public void onDestroy() { 216e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville super.onDestroy(); 217e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville CatLog.d(LOG_TAG, "onDestroy - mIsResponseSent[" + mIsResponseSent + 218e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville "], sim id: " + mSlotId); 219ba9b86b6257d98d3c1312ff188b22e0f6b785cadRyuto Sawada if (appService == null) { 220ba9b86b6257d98d3c1312ff188b22e0f6b785cadRyuto Sawada return; 221ba9b86b6257d98d3c1312ff188b22e0f6b785cadRyuto Sawada } 222e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville // if dialog activity is finished by stkappservice 223e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville // when receiving OP_LAUNCH_APP from the other SIM, we can not send TR here 224e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville // , since the dialog cmd is waiting user to process. 225e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville if (!mIsResponseSent && !appService.isDialogPending(mSlotId)) { 226e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville sendResponse(StkAppService.RES_ID_CONFIRM, false); 227e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville } 228e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville cancelTimeOut(); 2298bf95af0202e8a9b475ab1a75fd7f7a13cd0262bw // Cleanup broadcast receivers to avoid leaks 2308bf95af0202e8a9b475ab1a75fd7f7a13cd0262bw if (mBroadcastReceiver != null) { 2318bf95af0202e8a9b475ab1a75fd7f7a13cd0262bw unregisterReceiver(mBroadcastReceiver); 2328bf95af0202e8a9b475ab1a75fd7f7a13cd0262bw } 233e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville } 234e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville 235e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville @Override 2369d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project public void onSaveInstanceState(Bundle outState) { 237e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville CatLog.d(LOG_TAG, "onSaveInstanceState"); 238e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville 2399d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project super.onSaveInstanceState(outState); 2409d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 2419d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project outState.putParcelable(TEXT, mTextMsg); 2429d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 2439d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 2449d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project @Override 2459d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project public void onRestoreInstanceState(Bundle savedInstanceState) { 2469d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project super.onRestoreInstanceState(savedInstanceState); 24779085fcc5b4e54cc374e8720644ce4c1dc0004beWink Saville 2489d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project mTextMsg = savedInstanceState.getParcelable(TEXT); 249e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville CatLog.d(LOG_TAG, "onRestoreInstanceState - [" + mTextMsg + "]"); 2509d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 2519d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 252414bc414dba1ef9605a0ab6185700af9748e2187Preeti Ahuja @Override 253414bc414dba1ef9605a0ab6185700af9748e2187Preeti Ahuja protected void onNewIntent(Intent intent) { 2548bf95af0202e8a9b475ab1a75fd7f7a13cd0262bw CatLog.d(LOG_TAG, "onNewIntent - updating the same Dialog box"); 255414bc414dba1ef9605a0ab6185700af9748e2187Preeti Ahuja setIntent(intent); 256414bc414dba1ef9605a0ab6185700af9748e2187Preeti Ahuja } 257414bc414dba1ef9605a0ab6185700af9748e2187Preeti Ahuja 2589d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project private void sendResponse(int resId, boolean confirmed) { 259e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville if (mSlotId == -1) { 260e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville CatLog.d(LOG_TAG, "sim id is invalid"); 261e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville return; 262e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville } 263e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville 264e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville if (StkAppService.getInstance() == null) { 265e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville CatLog.d(LOG_TAG, "Ignore response: id is " + resId); 266e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville return; 267e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville } 268e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville 269e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville CatLog.d(LOG_TAG, "sendResponse resID[" + resId + "] confirmed[" + confirmed + "]"); 270e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville 271414bc414dba1ef9605a0ab6185700af9748e2187Preeti Ahuja if (mTextMsg.responseNeeded) { 272414bc414dba1ef9605a0ab6185700af9748e2187Preeti Ahuja Bundle args = new Bundle(); 273414bc414dba1ef9605a0ab6185700af9748e2187Preeti Ahuja args.putInt(StkAppService.OPCODE, StkAppService.OP_RESPONSE); 274414bc414dba1ef9605a0ab6185700af9748e2187Preeti Ahuja args.putInt(StkAppService.SLOT_ID, mSlotId); 275414bc414dba1ef9605a0ab6185700af9748e2187Preeti Ahuja args.putInt(StkAppService.RES_ID, resId); 276414bc414dba1ef9605a0ab6185700af9748e2187Preeti Ahuja args.putBoolean(StkAppService.CONFIRMATION, confirmed); 277414bc414dba1ef9605a0ab6185700af9748e2187Preeti Ahuja startService(new Intent(this, StkAppService.class).putExtras(args)); 278414bc414dba1ef9605a0ab6185700af9748e2187Preeti Ahuja mIsResponseSent = true; 279414bc414dba1ef9605a0ab6185700af9748e2187Preeti Ahuja } 2809d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 2819d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 2829d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project private void sendResponse(int resId) { 2839d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project sendResponse(resId, true); 2849d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 2859d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 2869d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project private void initFromIntent(Intent intent) { 2879d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 2889d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project if (intent != null) { 2899d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project mTextMsg = intent.getParcelableExtra("TEXT"); 290e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville mSlotId = intent.getIntExtra(StkAppService.SLOT_ID, -1); 2919d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } else { 2929d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project finish(); 2939d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 294e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville 295e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville CatLog.d(LOG_TAG, "initFromIntent - [" + mTextMsg + "], sim id: " + mSlotId); 2969d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 2979d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 2989d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project private void cancelTimeOut() { 299e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville CatLog.d(LOG_TAG, "cancelTimeOut: " + mSlotId); 3008bf95af0202e8a9b475ab1a75fd7f7a13cd0262bw if (mTimeoutIntent != null) { 3018bf95af0202e8a9b475ab1a75fd7f7a13cd0262bw mAlarmManager.cancel(mTimeoutIntent); 3028bf95af0202e8a9b475ab1a75fd7f7a13cd0262bw mTimeoutIntent = null; 3038bf95af0202e8a9b475ab1a75fd7f7a13cd0262bw } 3049d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 3059d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 3061772c049facb06de0ca5d3b5cce870848c008804Christopher.Posselwhite private void startTimeOut(boolean waitForUserToClear) { 307414bc414dba1ef9605a0ab6185700af9748e2187Preeti Ahuja 3089d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project // Reset timeout. 3099d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project cancelTimeOut(); 3109d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project int dialogDuration = StkApp.calculateDurationInMilis(mTextMsg.duration); 3111772c049facb06de0ca5d3b5cce870848c008804Christopher.Posselwhite // If duration is specified, this has priority. If not, set timeout 3121772c049facb06de0ca5d3b5cce870848c008804Christopher.Posselwhite // according to condition given by the card. 313e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville if (mTextMsg.userClear == true && mTextMsg.responseNeeded == false) { 314e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville return; 315e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville } else { 3168bf95af0202e8a9b475ab1a75fd7f7a13cd0262bw // userClear = false. will disappear after a while. 317e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville if (dialogDuration == 0) { 318e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville if (waitForUserToClear) { 319e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville dialogDuration = StkApp.DISP_TEXT_WAIT_FOR_USER_TIMEOUT; 320e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville } else { 321e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville dialogDuration = StkApp.DISP_TEXT_CLEAR_AFTER_DELAY_TIMEOUT; 322e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville } 3231772c049facb06de0ca5d3b5cce870848c008804Christopher.Posselwhite } 324e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville CatLog.d(LOG_TAG, "startTimeOut: " + mSlotId); 3258bf95af0202e8a9b475ab1a75fd7f7a13cd0262bw Intent mAlarmIntent = new Intent(ALARM_TIMEOUT); 3268bf95af0202e8a9b475ab1a75fd7f7a13cd0262bw mAlarmIntent.putExtra(StkAppService.SLOT_ID, mSlotId); 3278bf95af0202e8a9b475ab1a75fd7f7a13cd0262bw mTimeoutIntent = PendingIntent.getBroadcast(mContext, 0, mAlarmIntent, PendingIntent.FLAG_CANCEL_CURRENT); 3288bf95af0202e8a9b475ab1a75fd7f7a13cd0262bw 3298bf95af0202e8a9b475ab1a75fd7f7a13cd0262bw // Try to use a more stringent timer not affected by system sleep. 3308bf95af0202e8a9b475ab1a75fd7f7a13cd0262bw if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT) { 3318bf95af0202e8a9b475ab1a75fd7f7a13cd0262bw mAlarmManager.setExact(AlarmManager.ELAPSED_REALTIME_WAKEUP, 332b10cfa33eac35d12f705a84454deb314930a6607Sanket Padawe SystemClock.elapsedRealtime() + dialogDuration, mTimeoutIntent); 3338bf95af0202e8a9b475ab1a75fd7f7a13cd0262bw } 3348bf95af0202e8a9b475ab1a75fd7f7a13cd0262bw else { 3358bf95af0202e8a9b475ab1a75fd7f7a13cd0262bw mAlarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, 336b10cfa33eac35d12f705a84454deb314930a6607Sanket Padawe SystemClock.elapsedRealtime() + dialogDuration, mTimeoutIntent); 3378bf95af0202e8a9b475ab1a75fd7f7a13cd0262bw } 338e68857da85f6fb0964da9d58a7cbfcc0348065c6Wink Saville } 3399d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 3408bf95af0202e8a9b475ab1a75fd7f7a13cd0262bw 3418bf95af0202e8a9b475ab1a75fd7f7a13cd0262bw private final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() { 3428bf95af0202e8a9b475ab1a75fd7f7a13cd0262bw @Override public void onReceive(Context context, Intent intent) { 3438bf95af0202e8a9b475ab1a75fd7f7a13cd0262bw String action = intent.getAction(); 3448bf95af0202e8a9b475ab1a75fd7f7a13cd0262bw int slotID = intent.getIntExtra(StkAppService.SLOT_ID, 0); 3458bf95af0202e8a9b475ab1a75fd7f7a13cd0262bw 3468bf95af0202e8a9b475ab1a75fd7f7a13cd0262bw if (action == null || slotID != mSlotId) return; 3478bf95af0202e8a9b475ab1a75fd7f7a13cd0262bw CatLog.d(LOG_TAG, "onReceive, action=" + action + ", sim id: " + slotID); 3488bf95af0202e8a9b475ab1a75fd7f7a13cd0262bw if (action.equals(ALARM_TIMEOUT)) { 3498bf95af0202e8a9b475ab1a75fd7f7a13cd0262bw CatLog.d(LOG_TAG, "ALARM_TIMEOUT rcvd"); 3508bf95af0202e8a9b475ab1a75fd7f7a13cd0262bw mTimeoutIntent = null; 3518bf95af0202e8a9b475ab1a75fd7f7a13cd0262bw sendResponse(StkAppService.RES_ID_TIMEOUT); 3528bf95af0202e8a9b475ab1a75fd7f7a13cd0262bw finish(); 3538bf95af0202e8a9b475ab1a75fd7f7a13cd0262bw } 3548bf95af0202e8a9b475ab1a75fd7f7a13cd0262bw } 3558bf95af0202e8a9b475ab1a75fd7f7a13cd0262bw }; 3569d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project} 357