19d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project/* 29d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project 39d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project * 49d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project * you may not use this file except in compliance with the License. 69d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project * You may obtain a copy of the License at 79d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project * 89d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project * 109d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project * See the License for the specific language governing permissions and 149d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project * limitations under the License. 159d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project */ 169d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 179d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Projectpackage com.android.stk; 189d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 199d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Projectimport android.app.Activity; 209d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Projectimport android.content.Intent; 219d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Projectimport android.os.Bundle; 229d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Projectimport android.os.Handler; 239d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Projectimport android.os.Message; 249d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Projectimport android.os.Vibrator; 259d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Projectimport android.view.KeyEvent; 269d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Projectimport android.view.View; 279d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Projectimport android.widget.ImageView; 289d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Projectimport android.widget.TextView; 299d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 30d41f1d98d7bf42e9e867819593ad79f685604796Alex Yakavenkaimport com.android.internal.telephony.cat.TextMessage; 31d41f1d98d7bf42e9e867819593ad79f685604796Alex Yakavenkaimport com.android.internal.telephony.cat.ToneSettings; 329d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 339d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project/** 349d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project * Activity used for PLAY TONE command. 3579085fcc5b4e54cc374e8720644ce4c1dc0004beWink Saville * 369d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project */ 379d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Projectpublic class ToneDialog extends Activity { 389d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project TextMessage toneMsg = null; 399d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project ToneSettings settings = null; 409d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project TonePlayer player = null; 4199fccc1c113d9b7a030dc7c945d0750748cc4af9Pierre Fröjd boolean mIsResponseSent = false; 429d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 439d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project /** 449d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project * Handler used to stop tones from playing when the duration ends. 459d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project */ 469d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project Handler mToneStopper = new Handler() { 479d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project @Override 489d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project public void handleMessage(Message msg) { 499d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project switch (msg.what) { 509d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project case MSG_ID_STOP_TONE: 519d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project sendResponse(StkAppService.RES_ID_DONE); 529d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project finish(); 539d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project break; 549d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 559d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 569d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project }; 579d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 58a8e4f50aead658df817e0c0434fc5fb261701208Wink Saville Vibrator mVibrator; 599d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 609d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project // Message id to signal tone duration timeout. 619d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project private static final int MSG_ID_STOP_TONE = 0xda; 629d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 639d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project @Override 649d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project protected void onCreate(Bundle icicle) { 659d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project super.onCreate(icicle); 669d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 67a8e4f50aead658df817e0c0434fc5fb261701208Wink Saville mVibrator = (Vibrator)getSystemService(VIBRATOR_SERVICE); 68a8e4f50aead658df817e0c0434fc5fb261701208Wink Saville 69a8e4f50aead658df817e0c0434fc5fb261701208Wink Saville initFromIntent(getIntent()); 709d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 719d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project // remove window title 729d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project View title = findViewById(com.android.internal.R.id.title); 739d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project title.setVisibility(View.GONE); 749d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project // set customized content view 759d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project setContentView(R.layout.stk_tone_dialog); 769d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 779d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project TextView tv = (TextView) findViewById(R.id.message); 789d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project ImageView iv = (ImageView) findViewById(R.id.icon); 799d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 809d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project // set text and icon 819d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project tv.setText(toneMsg.text); 829d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project if (toneMsg.icon == null) { 839d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project iv.setImageResource(com.android.internal.R.drawable.ic_volume); 849d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } else { 859d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project iv.setImageBitmap(toneMsg.icon); 869d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 879d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 889d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project // Start playing tone and vibration 899d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project player = new TonePlayer(); 909d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project player.play(settings.tone); 919d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project int timeout = StkApp.calculateDurationInMilis(settings.duration); 929d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project if (timeout == 0) { 939d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project timeout = StkApp.TONE_DFEAULT_TIMEOUT; 949d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 959d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project mToneStopper.sendEmptyMessageDelayed(MSG_ID_STOP_TONE, timeout); 969d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project if (settings.vibrate) { 979d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project mVibrator.vibrate(timeout); 989d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 999d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 1009d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 1019d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project @Override 1029d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project protected void onDestroy() { 1039d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project super.onDestroy(); 10499fccc1c113d9b7a030dc7c945d0750748cc4af9Pierre Fröjd if (mIsResponseSent) { 10599fccc1c113d9b7a030dc7c945d0750748cc4af9Pierre Fröjd mToneStopper.removeMessages(MSG_ID_STOP_TONE); 10699fccc1c113d9b7a030dc7c945d0750748cc4af9Pierre Fröjd } 1079d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project player.stop(); 1089d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project player.release(); 1099d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project mVibrator.cancel(); 1109d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 11179085fcc5b4e54cc374e8720644ce4c1dc0004beWink Saville 1129d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project @Override 1139d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project public boolean onKeyDown(int keyCode, KeyEvent event) { 1149d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project switch (keyCode) { 1159d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project case KeyEvent.KEYCODE_BACK: 1169d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project sendResponse(StkAppService.RES_ID_END_SESSION); 1179d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project finish(); 1189d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project break; 1199d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 1209d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project return false; 1219d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 1229d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 1239d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project private void initFromIntent(Intent intent) { 1249d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project if (intent == null) { 1259d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project finish(); 1269d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 1279d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project toneMsg = intent.getParcelableExtra("TEXT"); 1289d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project settings = intent.getParcelableExtra("TONE"); 1299d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 1309d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 1319d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project private void sendResponse(int resId) { 1329d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project Bundle args = new Bundle(); 1339d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project args.putInt(StkAppService.OPCODE, StkAppService.OP_RESPONSE); 1349d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project args.putInt(StkAppService.RES_ID, resId); 1359d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project startService(new Intent(this, StkAppService.class).putExtras(args)); 13699fccc1c113d9b7a030dc7c945d0750748cc4af9Pierre Fröjd mIsResponseSent = true; 1379d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 1389d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project} 139