blob: be437470d7fe282be0208174ea8bac28366f3bc9 [file] [log] [blame]
The Android Open Source Project9d9730a2009-03-03 19:32:37 -08001/*
2 * Copyright (C) 2007 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.android.stk;
18
Christopher Posselwhitecfe4d7f2013-09-04 09:01:50 +020019import com.android.internal.telephony.cat.CatLog;
Alex Yakavenkad41f1d92010-07-12 14:13:13 -070020import com.android.internal.telephony.cat.TextMessage;
The Android Open Source Project9d9730a2009-03-03 19:32:37 -080021
22import android.app.Activity;
w302348bf95af2015-01-09 10:54:41 -080023import android.app.AlarmManager;
Sanket Padawe7b70fb42017-04-05 15:35:34 -070024import android.app.AlertDialog;
w302348bf95af2015-01-09 10:54:41 -080025import android.app.PendingIntent;
The Android Open Source Project9d9730a2009-03-03 19:32:37 -080026import android.content.Intent;
w302348bf95af2015-01-09 10:54:41 -080027import android.content.IntentFilter;
28import android.content.BroadcastReceiver;
29import android.content.Context;
Sanket Padawe7b70fb42017-04-05 15:35:34 -070030import android.content.DialogInterface;
Sanket Padawe7b70fb42017-04-05 15:35:34 -070031
Yoshiaki Naka25273c92017-10-31 20:00:33 +090032import android.os.Build;
The Android Open Source Project9d9730a2009-03-03 19:32:37 -080033import android.os.Bundle;
w302348bf95af2015-01-09 10:54:41 -080034import android.os.SystemClock;
Yoshiaki Naka90183132017-08-31 19:25:33 +090035import android.telephony.SubscriptionManager;
Takanori Nakano9ecdba72017-07-21 15:27:49 +090036import android.text.TextUtils;
37import android.view.LayoutInflater;
38import android.view.View;
39import android.widget.ImageView;
40import android.widget.TextView;
The Android Open Source Project9d9730a2009-03-03 19:32:37 -080041
42/**
w302348bf95af2015-01-09 10:54:41 -080043 * AlertDialog used for DISPLAY TEXT commands.
Wink Saville79085fc2009-06-09 10:27:23 -070044 *
The Android Open Source Project9d9730a2009-03-03 19:32:37 -080045 */
Sanket Padawe7b70fb42017-04-05 15:35:34 -070046public class StkDialogActivity extends Activity {
The Android Open Source Project9d9730a2009-03-03 19:32:37 -080047 // members
Wink Savillee68857d2014-10-17 15:23:05 -070048 private static final String className = new Object(){}.getClass().getEnclosingClass().getName();
49 private static final String LOG_TAG = className.substring(className.lastIndexOf('.') + 1);
50 TextMessage mTextMsg = null;
51 private int mSlotId = -1;
52 private StkAppService appService = StkAppService.getInstance();
w302348bf95af2015-01-09 10:54:41 -080053 // Determines whether Terminal Response (TR) has been sent
Johannes Carlssonef243a22011-10-25 10:37:24 +020054 private boolean mIsResponseSent = false;
w302348bf95af2015-01-09 10:54:41 -080055 private Context mContext;
56 // Utilize AlarmManager for real-time countdown
57 private PendingIntent mTimeoutIntent;
58 private AlarmManager mAlarmManager;
59 private final static String ALARM_TIMEOUT = "com.android.stk.DIALOG_ALARM_TIMEOUT";
The Android Open Source Project9d9730a2009-03-03 19:32:37 -080060
Takanori Nakano1d3f3c12016-08-30 10:34:24 +090061 // Keys for saving the state of the dialog in the bundle
62 private static final String TEXT_KEY = "text";
63 private static final String TIMEOUT_INTENT_KEY = "timeout";
64 private static final String SLOT_ID_KEY = "slotid";
The Android Open Source Project9d9730a2009-03-03 19:32:37 -080065
Takanori Nakanocbe32d32017-07-20 17:10:46 +090066 private AlertDialog mAlertDialog;
The Android Open Source Project9d9730a2009-03-03 19:32:37 -080067
68 @Override
Takanori Nakano1d3f3c12016-08-30 10:34:24 +090069 protected void onCreate(Bundle savedInstanceState) {
70 super.onCreate(savedInstanceState);
The Android Open Source Project9d9730a2009-03-03 19:32:37 -080071
w302348bf95af2015-01-09 10:54:41 -080072 CatLog.d(LOG_TAG, "onCreate, sim id: " + mSlotId);
Ryuto Sawadaba9b86b2016-10-03 14:03:16 +090073
74 // appService can be null if this activity is automatically recreated by the system
75 // with the saved instance state right after the phone process is killed.
76 if (appService == null) {
77 CatLog.d(LOG_TAG, "onCreate - appService is null");
78 finish();
79 return;
80 }
81
w302348bf95af2015-01-09 10:54:41 -080082 // New Dialog is created - set to no response sent
83 mIsResponseSent = false;
84
Takanori Nakanocbe32d32017-07-20 17:10:46 +090085 AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this);
The Android Open Source Project9d9730a2009-03-03 19:32:37 -080086
Sanket Padawe7b70fb42017-04-05 15:35:34 -070087 alertDialogBuilder.setPositiveButton(R.string.button_ok, new
88 DialogInterface.OnClickListener() {
89 @Override
90 public void onClick(DialogInterface dialog, int id) {
91 CatLog.d(LOG_TAG, "OK Clicked!, mSlotId: " + mSlotId);
92 cancelTimeOut();
93 sendResponse(StkAppService.RES_ID_CONFIRM, true);
94 finish();
95 }
96 });
The Android Open Source Project9d9730a2009-03-03 19:32:37 -080097
Sanket Padawe7b70fb42017-04-05 15:35:34 -070098 alertDialogBuilder.setNegativeButton(R.string.button_cancel, new
99 DialogInterface.OnClickListener() {
100 @Override
101 public void onClick(DialogInterface dialog,int id) {
102 CatLog.d(LOG_TAG, "Cancel Clicked!, mSlotId: " + mSlotId);
103 cancelTimeOut();
104 sendResponse(StkAppService.RES_ID_CONFIRM, false);
105 finish();
106 }
107 });
Takuro Nishief00cb12017-07-04 11:46:28 +0900108
109 alertDialogBuilder.setOnCancelListener(new DialogInterface.OnCancelListener() {
110 @Override
111 public void onCancel(DialogInterface dialog) {
112 CatLog.d(LOG_TAG, "Moving backward!, mSlotId: " + mSlotId);
113 cancelTimeOut();
114 sendResponse(StkAppService.RES_ID_BACKWARD);
115 finish();
116 }
117 });
118
Sanket Padawe7b70fb42017-04-05 15:35:34 -0700119 alertDialogBuilder.create();
w302348bf95af2015-01-09 10:54:41 -0800120
Takanori Nakanocbe32d32017-07-20 17:10:46 +0900121 initFromIntent(getIntent());
122 if (mTextMsg == null) {
123 finish();
124 return;
125 }
126
127 if (!mTextMsg.responseNeeded) {
128 alertDialogBuilder.setNegativeButton(null, null);
Yoshiaki Naka90183132017-08-31 19:25:33 +0900129 // Register the instance of this activity because the dialog displayed for DISPLAY TEXT
130 // command with an immediate response object should disappear when the terminal receives
131 // a subsequent proactive command containing display data.
132 appService.getStkContext(mSlotId).setImmediateDialogInstance(this);
Takanori Nakanocbe32d32017-07-20 17:10:46 +0900133 }
134
135 alertDialogBuilder.setTitle(mTextMsg.title);
136
Takanori Nakano9ecdba72017-07-21 15:27:49 +0900137 LayoutInflater inflater = this.getLayoutInflater();
138 View dialogView = inflater.inflate(R.layout.stk_msg_dialog, null);
139 alertDialogBuilder.setView(dialogView);
140 TextView tv = (TextView) dialogView.findViewById(R.id.message);
141 ImageView iv = (ImageView) dialogView.findViewById(R.id.icon);
142
143 if (mTextMsg.icon != null) {
144 iv.setImageBitmap(mTextMsg.icon);
145 } else {
146 iv.setVisibility(View.GONE);
147 }
148
149 // Per spec, only set text if the icon is not provided or not self-explanatory
150 if ((mTextMsg.icon == null || !mTextMsg.iconSelfExplanatory)
151 && !TextUtils.isEmpty(mTextMsg.text)) {
152 tv.setText(mTextMsg.text);
153 } else {
154 tv.setVisibility(View.GONE);
Takanori Nakanocbe32d32017-07-20 17:10:46 +0900155 }
156
157 mAlertDialog = alertDialogBuilder.create();
158 mAlertDialog.setCanceledOnTouchOutside(false);
159 mAlertDialog.show();
160
w302348bf95af2015-01-09 10:54:41 -0800161 mContext = getBaseContext();
162 IntentFilter intentFilter = new IntentFilter();
163 intentFilter.addAction(ALARM_TIMEOUT);
164 mContext.registerReceiver(mBroadcastReceiver, intentFilter);
165 mAlarmManager =(AlarmManager)mContext.getSystemService(Context.ALARM_SERVICE);
The Android Open Source Project9d9730a2009-03-03 19:32:37 -0800166 }
167
168 @Override
169 public void onResume() {
170 super.onResume();
Wink Savillee68857d2014-10-17 15:23:05 -0700171 CatLog.d(LOG_TAG, "onResume - mIsResponseSent[" + mIsResponseSent +
172 "], sim id: " + mSlotId);
Preeti Ahuja414bc412013-06-25 19:31:49 -0700173
Christopher Posselwhitecfe4d7f2013-09-04 09:01:50 +0200174 /*
Preeti Ahuja414bc412013-06-25 19:31:49 -0700175 * If the userClear flag is set and dialogduration is set to 0, the display Text
176 * should be displayed to user forever until some high priority event occurs
177 * (incoming call, MMI code execution etc as mentioned under section
178 * ETSI 102.223, 6.4.1)
Christopher Posselwhitecfe4d7f2013-09-04 09:01:50 +0200179 */
Preeti Ahuja414bc412013-06-25 19:31:49 -0700180 if (StkApp.calculateDurationInMilis(mTextMsg.duration) == 0 &&
Sanket Padawe7b70fb42017-04-05 15:35:34 -0700181 !mTextMsg.responseNeeded && mTextMsg.userClear) {
w302348bf95af2015-01-09 10:54:41 -0800182 CatLog.d(LOG_TAG, "User should clear text..showing message forever");
Christopher Posselwhitecfe4d7f2013-09-04 09:01:50 +0200183 return;
184 }
185
Preeti Ahuja95919342013-10-01 18:18:55 -0700186 appService.setDisplayTextDlgVisibility(true, mSlotId);
w302348bf95af2015-01-09 10:54:41 -0800187
188 /*
189 * When another activity takes the foreground, we do not want the Terminal
190 * Response timer to be restarted when our activity resumes. Hence we will
191 * check if there is an existing timer, and resume it. In this way we will
Sanket Padawe7b70fb42017-04-05 15:35:34 -0700192 * inform the SIM in correct time when there is no response from the User
w302348bf95af2015-01-09 10:54:41 -0800193 * to a dialog.
194 */
195 if (mTimeoutIntent != null) {
196 CatLog.d(LOG_TAG, "Pending Alarm! Let it finish counting down...");
197 }
198 else {
199 CatLog.d(LOG_TAG, "No Pending Alarm! OK to start timer...");
200 startTimeOut(mTextMsg.userClear);
201 }
The Android Open Source Project9d9730a2009-03-03 19:32:37 -0800202 }
203
204 @Override
205 public void onPause() {
206 super.onPause();
Wink Savillee68857d2014-10-17 15:23:05 -0700207 CatLog.d(LOG_TAG, "onPause, sim id: " + mSlotId);
Preeti Ahuja95919342013-10-01 18:18:55 -0700208 appService.setDisplayTextDlgVisibility(false, mSlotId);
Preeti Ahuja03be6672012-08-30 19:21:25 +0530209
210 /*
211 * do not cancel the timer here cancelTimeOut(). If any higher/lower
212 * priority events such as incoming call, new sms, screen off intent,
213 * notification alerts, user actions such as 'User moving to another activtiy'
214 * etc.. occur during Display Text ongoing session,
215 * this activity would receive 'onPause()' event resulting in
216 * cancellation of the timer. As a result no terminal response is
217 * sent to the card.
218 */
The Android Open Source Project9d9730a2009-03-03 19:32:37 -0800219 }
220
221 @Override
Johannes Carlssonef243a22011-10-25 10:37:24 +0200222 protected void onStart() {
w302348bf95af2015-01-09 10:54:41 -0800223 CatLog.d(LOG_TAG, "onStart, sim id: " + mSlotId);
Johannes Carlssonef243a22011-10-25 10:37:24 +0200224 super.onStart();
Johannes Carlssonef243a22011-10-25 10:37:24 +0200225 }
226
227 @Override
228 public void onStop() {
229 super.onStop();
Wink Savillee68857d2014-10-17 15:23:05 -0700230 CatLog.d(LOG_TAG, "onStop - before Send CONFIRM false mIsResponseSent[" +
231 mIsResponseSent + "], sim id: " + mSlotId);
Takanori Nakano1d3f3c12016-08-30 10:34:24 +0900232
233 // Avoid calling finish() or setPendingDialogInstance()
234 // if the activity is being restarted now.
235 if (isChangingConfigurations()) {
236 return;
237 }
238
Tsukasa Gotou2aa64562016-02-09 18:52:33 +0900239 if (!mTextMsg.responseNeeded) {
240 return;
241 }
Johannes Carlssonef243a22011-10-25 10:37:24 +0200242 if (!mIsResponseSent) {
Wink Savillee68857d2014-10-17 15:23:05 -0700243 appService.getStkContext(mSlotId).setPendingDialogInstance(this);
244 } else {
245 CatLog.d(LOG_TAG, "finish.");
246 appService.getStkContext(mSlotId).setPendingDialogInstance(null);
247 cancelTimeOut();
248 finish();
Johannes Carlssonef243a22011-10-25 10:37:24 +0200249 }
250 }
251
252 @Override
Wink Savillee68857d2014-10-17 15:23:05 -0700253 public void onDestroy() {
254 super.onDestroy();
255 CatLog.d(LOG_TAG, "onDestroy - mIsResponseSent[" + mIsResponseSent +
256 "], sim id: " + mSlotId);
Takanori Nakanocbe32d32017-07-20 17:10:46 +0900257
258 if (mAlertDialog != null && mAlertDialog.isShowing()) {
259 mAlertDialog.dismiss();
260 mAlertDialog = null;
261 }
262
Ryuto Sawadaba9b86b2016-10-03 14:03:16 +0900263 if (appService == null) {
264 return;
265 }
Wink Savillee68857d2014-10-17 15:23:05 -0700266 // if dialog activity is finished by stkappservice
267 // when receiving OP_LAUNCH_APP from the other SIM, we can not send TR here
268 // , since the dialog cmd is waiting user to process.
Takanori Nakano1d3f3c12016-08-30 10:34:24 +0900269 if (!isChangingConfigurations()) {
270 if (!mIsResponseSent && appService != null && !appService.isDialogPending(mSlotId)) {
271 sendResponse(StkAppService.RES_ID_CONFIRM, false);
272 }
273 cancelTimeOut();
Wink Savillee68857d2014-10-17 15:23:05 -0700274 }
w302348bf95af2015-01-09 10:54:41 -0800275 // Cleanup broadcast receivers to avoid leaks
276 if (mBroadcastReceiver != null) {
277 unregisterReceiver(mBroadcastReceiver);
278 }
Wink Savillee68857d2014-10-17 15:23:05 -0700279 }
280
281 @Override
The Android Open Source Project9d9730a2009-03-03 19:32:37 -0800282 public void onSaveInstanceState(Bundle outState) {
Wink Savillee68857d2014-10-17 15:23:05 -0700283 CatLog.d(LOG_TAG, "onSaveInstanceState");
284
The Android Open Source Project9d9730a2009-03-03 19:32:37 -0800285 super.onSaveInstanceState(outState);
286
Takanori Nakano1d3f3c12016-08-30 10:34:24 +0900287 outState.putParcelable(TEXT_KEY, mTextMsg);
288 outState.putParcelable(TIMEOUT_INTENT_KEY, mTimeoutIntent);
289 outState.putInt(SLOT_ID_KEY, mSlotId);
The Android Open Source Project9d9730a2009-03-03 19:32:37 -0800290 }
291
292 @Override
293 public void onRestoreInstanceState(Bundle savedInstanceState) {
294 super.onRestoreInstanceState(savedInstanceState);
Wink Saville79085fc2009-06-09 10:27:23 -0700295
Takanori Nakano1d3f3c12016-08-30 10:34:24 +0900296 mTextMsg = savedInstanceState.getParcelable(TEXT_KEY);
297 mTimeoutIntent = savedInstanceState.getParcelable(TIMEOUT_INTENT_KEY);
298 mSlotId = savedInstanceState.getInt(SLOT_ID_KEY);
299 appService.getStkContext(mSlotId).setPendingDialogInstance(this);
Wink Savillee68857d2014-10-17 15:23:05 -0700300 CatLog.d(LOG_TAG, "onRestoreInstanceState - [" + mTextMsg + "]");
The Android Open Source Project9d9730a2009-03-03 19:32:37 -0800301 }
302
Preeti Ahuja414bc412013-06-25 19:31:49 -0700303 @Override
304 protected void onNewIntent(Intent intent) {
w302348bf95af2015-01-09 10:54:41 -0800305 CatLog.d(LOG_TAG, "onNewIntent - updating the same Dialog box");
Preeti Ahuja414bc412013-06-25 19:31:49 -0700306 setIntent(intent);
307 }
308
Yoshiaki Naka90183132017-08-31 19:25:33 +0900309 @Override
310 public void finish() {
311 super.finish();
312 // Unregister the instance for DISPLAY TEXT command with an immediate response object
313 // as it is unnecessary to ask the service to finish this anymore.
314 if ((appService != null) && (mTextMsg != null) && !mTextMsg.responseNeeded) {
315 if (SubscriptionManager.isValidSlotIndex(mSlotId)) {
316 appService.getStkContext(mSlotId).setImmediateDialogInstance(null);
317 }
318 }
319 }
320
The Android Open Source Project9d9730a2009-03-03 19:32:37 -0800321 private void sendResponse(int resId, boolean confirmed) {
Wink Savillee68857d2014-10-17 15:23:05 -0700322 if (mSlotId == -1) {
323 CatLog.d(LOG_TAG, "sim id is invalid");
324 return;
325 }
326
327 if (StkAppService.getInstance() == null) {
328 CatLog.d(LOG_TAG, "Ignore response: id is " + resId);
329 return;
330 }
331
332 CatLog.d(LOG_TAG, "sendResponse resID[" + resId + "] confirmed[" + confirmed + "]");
333
Preeti Ahuja414bc412013-06-25 19:31:49 -0700334 if (mTextMsg.responseNeeded) {
335 Bundle args = new Bundle();
336 args.putInt(StkAppService.OPCODE, StkAppService.OP_RESPONSE);
337 args.putInt(StkAppService.SLOT_ID, mSlotId);
338 args.putInt(StkAppService.RES_ID, resId);
339 args.putBoolean(StkAppService.CONFIRMATION, confirmed);
340 startService(new Intent(this, StkAppService.class).putExtras(args));
341 mIsResponseSent = true;
342 }
The Android Open Source Project9d9730a2009-03-03 19:32:37 -0800343 }
344
345 private void sendResponse(int resId) {
346 sendResponse(resId, true);
347 }
348
349 private void initFromIntent(Intent intent) {
350
351 if (intent != null) {
352 mTextMsg = intent.getParcelableExtra("TEXT");
Wink Savillee68857d2014-10-17 15:23:05 -0700353 mSlotId = intent.getIntExtra(StkAppService.SLOT_ID, -1);
The Android Open Source Project9d9730a2009-03-03 19:32:37 -0800354 } else {
355 finish();
356 }
Wink Savillee68857d2014-10-17 15:23:05 -0700357
Yoshiaki Naka25273c92017-10-31 20:00:33 +0900358 CatLog.d(LOG_TAG, "initFromIntent - [" + (Build.IS_DEBUGGABLE ? mTextMsg : "********")
359 + "], slot id: " + mSlotId);
The Android Open Source Project9d9730a2009-03-03 19:32:37 -0800360 }
361
362 private void cancelTimeOut() {
Wink Savillee68857d2014-10-17 15:23:05 -0700363 CatLog.d(LOG_TAG, "cancelTimeOut: " + mSlotId);
w302348bf95af2015-01-09 10:54:41 -0800364 if (mTimeoutIntent != null) {
365 mAlarmManager.cancel(mTimeoutIntent);
366 mTimeoutIntent = null;
367 }
The Android Open Source Project9d9730a2009-03-03 19:32:37 -0800368 }
369
Christopher.Posselwhite1772c042012-11-22 12:15:54 +0100370 private void startTimeOut(boolean waitForUserToClear) {
Preeti Ahuja414bc412013-06-25 19:31:49 -0700371
The Android Open Source Project9d9730a2009-03-03 19:32:37 -0800372 // Reset timeout.
373 cancelTimeOut();
374 int dialogDuration = StkApp.calculateDurationInMilis(mTextMsg.duration);
Christopher.Posselwhite1772c042012-11-22 12:15:54 +0100375 // If duration is specified, this has priority. If not, set timeout
376 // according to condition given by the card.
Wink Savillee68857d2014-10-17 15:23:05 -0700377 if (mTextMsg.userClear == true && mTextMsg.responseNeeded == false) {
378 return;
379 } else {
w302348bf95af2015-01-09 10:54:41 -0800380 // userClear = false. will disappear after a while.
Wink Savillee68857d2014-10-17 15:23:05 -0700381 if (dialogDuration == 0) {
382 if (waitForUserToClear) {
383 dialogDuration = StkApp.DISP_TEXT_WAIT_FOR_USER_TIMEOUT;
384 } else {
385 dialogDuration = StkApp.DISP_TEXT_CLEAR_AFTER_DELAY_TIMEOUT;
386 }
Christopher.Posselwhite1772c042012-11-22 12:15:54 +0100387 }
Wink Savillee68857d2014-10-17 15:23:05 -0700388 CatLog.d(LOG_TAG, "startTimeOut: " + mSlotId);
w302348bf95af2015-01-09 10:54:41 -0800389 Intent mAlarmIntent = new Intent(ALARM_TIMEOUT);
390 mAlarmIntent.putExtra(StkAppService.SLOT_ID, mSlotId);
391 mTimeoutIntent = PendingIntent.getBroadcast(mContext, 0, mAlarmIntent, PendingIntent.FLAG_CANCEL_CURRENT);
392
393 // Try to use a more stringent timer not affected by system sleep.
394 if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT) {
395 mAlarmManager.setExact(AlarmManager.ELAPSED_REALTIME_WAKEUP,
Sanket Padawe7b70fb42017-04-05 15:35:34 -0700396 SystemClock.elapsedRealtime() + dialogDuration, mTimeoutIntent);
w302348bf95af2015-01-09 10:54:41 -0800397 }
398 else {
399 mAlarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP,
Sanket Padawe7b70fb42017-04-05 15:35:34 -0700400 SystemClock.elapsedRealtime() + dialogDuration, mTimeoutIntent);
w302348bf95af2015-01-09 10:54:41 -0800401 }
Wink Savillee68857d2014-10-17 15:23:05 -0700402 }
The Android Open Source Project9d9730a2009-03-03 19:32:37 -0800403 }
w302348bf95af2015-01-09 10:54:41 -0800404
405 private final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
406 @Override public void onReceive(Context context, Intent intent) {
407 String action = intent.getAction();
408 int slotID = intent.getIntExtra(StkAppService.SLOT_ID, 0);
409
410 if (action == null || slotID != mSlotId) return;
411 CatLog.d(LOG_TAG, "onReceive, action=" + action + ", sim id: " + slotID);
412 if (action.equals(ALARM_TIMEOUT)) {
413 CatLog.d(LOG_TAG, "ALARM_TIMEOUT rcvd");
414 mTimeoutIntent = null;
415 sendResponse(StkAppService.RES_ID_TIMEOUT);
416 finish();
417 }
418 }
419 };
The Android Open Source Project9d9730a2009-03-03 19:32:37 -0800420}