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