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