blob: b15e8df32f103db426cbe5a64992d240f1e8a88b [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;
23import android.content.Intent;
24import android.graphics.drawable.BitmapDrawable;
25import android.os.Bundle;
26import android.os.Handler;
27import android.os.Message;
28import android.view.KeyEvent;
29import android.view.View;
30import android.view.Window;
31import android.widget.Button;
32import android.widget.TextView;
33
34/**
35 * AlretDialog used for DISPLAY TEXT commands.
Wink Saville79085fc2009-06-09 10:27:23 -070036 *
The Android Open Source Project9d9730a2009-03-03 19:32:37 -080037 */
38public class StkDialogActivity extends Activity implements View.OnClickListener {
39 // members
40 TextMessage mTextMsg;
41
42 Handler mTimeoutHandler = new Handler() {
43 @Override
44 public void handleMessage(Message msg) {
45 switch(msg.what) {
46 case MSG_ID_TIMEOUT:
47 sendResponse(StkAppService.RES_ID_TIMEOUT);
48 finish();
49 break;
50 }
51 }
52 };
53
54 //keys) for saving the state of the dialog in the icicle
55 private static final String TEXT = "text";
56
Wink Saville79085fc2009-06-09 10:27:23 -070057 // message id for time out
The Android Open Source Project9d9730a2009-03-03 19:32:37 -080058 private static final int MSG_ID_TIMEOUT = 1;
59
60 // buttons id
61 public static final int OK_BUTTON = R.id.button_ok;
62 public static final int CANCEL_BUTTON = R.id.button_cancel;
63
64 @Override
65 protected void onCreate(Bundle icicle) {
66 super.onCreate(icicle);
67
68 initFromIntent(getIntent());
69 if (mTextMsg == null) {
70 finish();
71 return;
72 }
73
74 requestWindowFeature(Window.FEATURE_LEFT_ICON);
75 Window window = getWindow();
76
77 setContentView(R.layout.stk_msg_dialog);
78 TextView mMessageView = (TextView) window
79 .findViewById(R.id.dialog_message);
80
81 Button okButton = (Button) findViewById(R.id.button_ok);
82 Button cancelButton = (Button) findViewById(R.id.button_cancel);
83
84 okButton.setOnClickListener(this);
85 cancelButton.setOnClickListener(this);
86
87 setTitle(mTextMsg.title);
88 if (!(mTextMsg.iconSelfExplanatory && mTextMsg.icon != null)) {
Wink Saville79085fc2009-06-09 10:27:23 -070089 mMessageView.setText(mTextMsg.text);
The Android Open Source Project9d9730a2009-03-03 19:32:37 -080090 }
91
92 if (mTextMsg.icon == null) {
93 window.setFeatureDrawableResource(Window.FEATURE_LEFT_ICON,
94 com.android.internal.R.drawable.stat_notify_sim_toolkit);
95 } else {
96 window.setFeatureDrawable(Window.FEATURE_LEFT_ICON,
97 new BitmapDrawable(mTextMsg.icon));
98 }
99 }
100
101 public void onClick(View v) {
102 String input = null;
103
104 switch (v.getId()) {
105 case OK_BUTTON:
106 sendResponse(StkAppService.RES_ID_CONFIRM, true);
107 finish();
108 break;
109 case CANCEL_BUTTON:
110 sendResponse(StkAppService.RES_ID_CONFIRM, false);
111 finish();
112 break;
113 }
114 }
115
116 @Override
117 public boolean onKeyDown(int keyCode, KeyEvent event) {
118 switch (keyCode) {
119 case KeyEvent.KEYCODE_BACK:
120 sendResponse(StkAppService.RES_ID_BACKWARD);
121 finish();
122 break;
123 }
124 return false;
125 }
126
127 @Override
128 public void onResume() {
129 super.onResume();
Christopher Posselwhitecfe4d7f2013-09-04 09:01:50 +0200130
131 /*
132 * The user should be shown the message forever or until some high
133 * priority event occurs (such as incoming call, MMI code execution
134 * etc as mentioned in ETSI 102.223, 6.4.1).
135 *
136 * Since mTextMsg.responseNeeded is false (because the response has
137 * already been sent) and duration of the dialog is zero and userClear
138 * is true, don't set the timeout.
139 */
140 if (!mTextMsg.responseNeeded &&
141 StkApp.calculateDurationInMilis(mTextMsg.duration) == 0 &&
142 mTextMsg.userClear) {
143 CatLog.d(this, "User should clear text..show message forever");
144 return;
145 }
146
Christopher.Posselwhite1772c042012-11-22 12:15:54 +0100147 startTimeOut(mTextMsg.userClear);
The Android Open Source Project9d9730a2009-03-03 19:32:37 -0800148 }
149
150 @Override
151 public void onPause() {
152 super.onPause();
153
154 cancelTimeOut();
155 }
156
157 @Override
158 public void onSaveInstanceState(Bundle outState) {
159 super.onSaveInstanceState(outState);
160
161 outState.putParcelable(TEXT, mTextMsg);
162 }
163
164 @Override
165 public void onRestoreInstanceState(Bundle savedInstanceState) {
166 super.onRestoreInstanceState(savedInstanceState);
Wink Saville79085fc2009-06-09 10:27:23 -0700167
The Android Open Source Project9d9730a2009-03-03 19:32:37 -0800168 mTextMsg = savedInstanceState.getParcelable(TEXT);
169 }
170
171 private void sendResponse(int resId, boolean confirmed) {
172 Bundle args = new Bundle();
173 args.putInt(StkAppService.OPCODE, StkAppService.OP_RESPONSE);
174 args.putInt(StkAppService.RES_ID, resId);
175 args.putBoolean(StkAppService.CONFIRMATION, confirmed);
176 startService(new Intent(this, StkAppService.class).putExtras(args));
177 }
178
179 private void sendResponse(int resId) {
180 sendResponse(resId, true);
181 }
182
183 private void initFromIntent(Intent intent) {
184
185 if (intent != null) {
186 mTextMsg = intent.getParcelableExtra("TEXT");
187 } else {
188 finish();
189 }
190 }
191
192 private void cancelTimeOut() {
193 mTimeoutHandler.removeMessages(MSG_ID_TIMEOUT);
194 }
195
Christopher.Posselwhite1772c042012-11-22 12:15:54 +0100196 private void startTimeOut(boolean waitForUserToClear) {
The Android Open Source Project9d9730a2009-03-03 19:32:37 -0800197 // Reset timeout.
198 cancelTimeOut();
199 int dialogDuration = StkApp.calculateDurationInMilis(mTextMsg.duration);
Christopher.Posselwhite1772c042012-11-22 12:15:54 +0100200 // If duration is specified, this has priority. If not, set timeout
201 // according to condition given by the card.
The Android Open Source Project9d9730a2009-03-03 19:32:37 -0800202 if (dialogDuration == 0) {
Christopher.Posselwhite1772c042012-11-22 12:15:54 +0100203 if (waitForUserToClear) {
204 dialogDuration = StkApp.DISP_TEXT_WAIT_FOR_USER_TIMEOUT;
205 } else {
206 dialogDuration = StkApp.DISP_TEXT_CLEAR_AFTER_DELAY_TIMEOUT;
207 }
The Android Open Source Project9d9730a2009-03-03 19:32:37 -0800208 }
209 mTimeoutHandler.sendMessageDelayed(mTimeoutHandler
210 .obtainMessage(MSG_ID_TIMEOUT), dialogDuration);
211 }
212}