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; 26075340e9d224c3e6aa57cc50ccc5adfeb1cdfe45Li Qiangimport android.view.MotionEvent; 279d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Projectimport android.view.View; 289d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Projectimport android.widget.ImageView; 299d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Projectimport android.widget.TextView; 309d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 31d41f1d98d7bf42e9e867819593ad79f685604796Alex Yakavenkaimport com.android.internal.telephony.cat.TextMessage; 32d41f1d98d7bf42e9e867819593ad79f685604796Alex Yakavenkaimport com.android.internal.telephony.cat.ToneSettings; 339d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 349d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project/** 359d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project * Activity used for PLAY TONE command. 3679085fcc5b4e54cc374e8720644ce4c1dc0004beWink Saville * 379d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project */ 389d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Projectpublic class ToneDialog extends Activity { 399d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project TextMessage toneMsg = null; 409d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project ToneSettings settings = null; 419d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project TonePlayer player = null; 4299fccc1c113d9b7a030dc7c945d0750748cc4af9Pierre Fröjd boolean mIsResponseSent = false; 439d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 449d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project /** 459d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project * Handler used to stop tones from playing when the duration ends. 469d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project */ 479d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project Handler mToneStopper = new Handler() { 489d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project @Override 499d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project public void handleMessage(Message msg) { 509d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project switch (msg.what) { 519d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project case MSG_ID_STOP_TONE: 529d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project sendResponse(StkAppService.RES_ID_DONE); 539d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project finish(); 549d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project break; 559d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 569d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 579d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project }; 589d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 59a8e4f50aead658df817e0c0434fc5fb261701208Wink Saville Vibrator mVibrator; 609d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 619d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project // Message id to signal tone duration timeout. 629d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project private static final int MSG_ID_STOP_TONE = 0xda; 639d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 649d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project @Override 659d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project protected void onCreate(Bundle icicle) { 669d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project super.onCreate(icicle); 679d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 68a8e4f50aead658df817e0c0434fc5fb261701208Wink Saville mVibrator = (Vibrator)getSystemService(VIBRATOR_SERVICE); 69a8e4f50aead658df817e0c0434fc5fb261701208Wink Saville 70a8e4f50aead658df817e0c0434fc5fb261701208Wink Saville initFromIntent(getIntent()); 719d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 729d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project // remove window title 739d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project View title = findViewById(com.android.internal.R.id.title); 749d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project title.setVisibility(View.GONE); 759d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project // set customized content view 769d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project setContentView(R.layout.stk_tone_dialog); 779d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 789d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project TextView tv = (TextView) findViewById(R.id.message); 799d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project ImageView iv = (ImageView) findViewById(R.id.icon); 809d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 819d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project // set text and icon 829d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project tv.setText(toneMsg.text); 839d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project if (toneMsg.icon == null) { 849d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project iv.setImageResource(com.android.internal.R.drawable.ic_volume); 859d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } else { 869d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project iv.setImageBitmap(toneMsg.icon); 879d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 889d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 899d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project // Start playing tone and vibration 909d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project player = new TonePlayer(); 919d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project player.play(settings.tone); 929d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project int timeout = StkApp.calculateDurationInMilis(settings.duration); 939d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project if (timeout == 0) { 949d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project timeout = StkApp.TONE_DFEAULT_TIMEOUT; 959d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 969d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project mToneStopper.sendEmptyMessageDelayed(MSG_ID_STOP_TONE, timeout); 979d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project if (settings.vibrate) { 989d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project mVibrator.vibrate(timeout); 999d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 1009d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 1019d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 1029d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project @Override 1039d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project protected void onDestroy() { 1049d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project super.onDestroy(); 10599fccc1c113d9b7a030dc7c945d0750748cc4af9Pierre Fröjd if (mIsResponseSent) { 10699fccc1c113d9b7a030dc7c945d0750748cc4af9Pierre Fröjd mToneStopper.removeMessages(MSG_ID_STOP_TONE); 10799fccc1c113d9b7a030dc7c945d0750748cc4af9Pierre Fröjd } 1089d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project player.stop(); 1099d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project player.release(); 1109d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project mVibrator.cancel(); 1119d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 11279085fcc5b4e54cc374e8720644ce4c1dc0004beWink Saville 1139d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project @Override 1149d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project public boolean onKeyDown(int keyCode, KeyEvent event) { 1159d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project switch (keyCode) { 1169d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project case KeyEvent.KEYCODE_BACK: 1179d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project sendResponse(StkAppService.RES_ID_END_SESSION); 1189d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project finish(); 1199d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project break; 1209d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 1219d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project return false; 1229d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 1239d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 124075340e9d224c3e6aa57cc50ccc5adfeb1cdfe45Li Qiang @Override 125075340e9d224c3e6aa57cc50ccc5adfeb1cdfe45Li Qiang public boolean onTouchEvent(MotionEvent event) { 126075340e9d224c3e6aa57cc50ccc5adfeb1cdfe45Li Qiang switch (event.getAction()) { 127075340e9d224c3e6aa57cc50ccc5adfeb1cdfe45Li Qiang case MotionEvent.ACTION_DOWN: 128075340e9d224c3e6aa57cc50ccc5adfeb1cdfe45Li Qiang sendResponse(StkAppService.RES_ID_END_SESSION); 129075340e9d224c3e6aa57cc50ccc5adfeb1cdfe45Li Qiang finish(); 130075340e9d224c3e6aa57cc50ccc5adfeb1cdfe45Li Qiang return true; 131075340e9d224c3e6aa57cc50ccc5adfeb1cdfe45Li Qiang } 132075340e9d224c3e6aa57cc50ccc5adfeb1cdfe45Li Qiang return super.onTouchEvent(event); 133075340e9d224c3e6aa57cc50ccc5adfeb1cdfe45Li Qiang } 134075340e9d224c3e6aa57cc50ccc5adfeb1cdfe45Li Qiang 1359d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project private void initFromIntent(Intent intent) { 1369d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project if (intent == null) { 1379d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project finish(); 1389d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 1399d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project toneMsg = intent.getParcelableExtra("TEXT"); 1409d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project settings = intent.getParcelableExtra("TONE"); 1419d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 1429d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project 1439d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project private void sendResponse(int resId) { 1449d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project Bundle args = new Bundle(); 1459d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project args.putInt(StkAppService.OPCODE, StkAppService.OP_RESPONSE); 1469d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project args.putInt(StkAppService.RES_ID, resId); 1479d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project startService(new Intent(this, StkAppService.class).putExtras(args)); 14899fccc1c113d9b7a030dc7c945d0750748cc4af9Pierre Fröjd mIsResponseSent = true; 1499d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project } 1509d9730aecb72e830ef12d66ce6e084d8ae0928f2The Android Open Source Project} 151