package org.orange.familylink; import java.io.IOException; import org.orange.familylink.ContactDetailActivity.Contact; import org.orange.familylink.data.Message.Code; import org.orange.familylink.data.UrgentMessageBody; import org.orange.familylink.fragment.dialog.NoContactInformationDialogFragment; import org.orange.familylink.location.LocationTracker; import org.orange.familylink.sms.SmsMessage; import org.orange.familylink.util.AudioFocusHelper; import android.animation.Animator.AnimatorListener; import android.animation.ObjectAnimator; import android.animation.ValueAnimator; import android.animation.ValueAnimator.AnimatorUpdateListener; import android.app.Activity; import android.media.MediaPlayer; import android.os.Bundle; import android.view.MotionEvent; import android.widget.TextView; import android.widget.Toast; import de.passsy.holocircularprogressbar.HoloCircularProgressBar; public class AlarmCountdownActivity extends Activity { private long mExitTime; private ObjectAnimator objectAnimator; //获取ObjectAnimator对象的一个引用 private static final int NUM_SHOW_TIME = 20000; //倒计时的时间 private static final float[] POSTION_TIME = {1f, 0f}; //动画的起止点,从0开始,绕一圈结束 private HoloCircularProgressBar progress; private TextView mTextView; private LocationTracker mLocationTracker; private AudioFocusHelper mAudioFocusHelper; private MediaPlayer mMediaPlayer; @Override protected void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_alarm_countdown); getActionBar().setTitle(getString(R.string.fall_down_alarm) + " (" + getString(R.string.counting_down) + ")"); mTextView = (TextView) super.findViewById(R.id.holoTimeText); //Animation实例化 progress = (HoloCircularProgressBar) findViewById(R.id.holoCircularProgressBar1); animate(progress, null); mAudioFocusHelper = new AudioFocusHelper(this) { @Override public void onAudioFocusChange(int focusChange) { } }; mMediaPlayer = MediaPlayer.create(this, R.raw.alarm); mMediaPlayer.setLooping(true); } @Override protected void onStart() { super.onStart(); mLocationTracker = new LocationTracker(this); } @Override protected void onStop() { super.onStop(); mLocationTracker.stopUsingGPS(); mLocationTracker = null; } @Override protected void onDestroy() { super.onDestroy(); if(mMediaPlayer != null) { stopAlarm(); mMediaPlayer.release(); mMediaPlayer = null; } } /** * Animate. * @param progressBar the progress bar * @param listener the listener */ private void animate(final HoloCircularProgressBar progressBar, final AnimatorListener listener) { //设置animation的起,止点位置 final float[] progresses = POSTION_TIME ; final float markerProgress = 1f; final ObjectAnimator progressBarAnimator = ObjectAnimator.ofFloat(progressBar, "progress", progresses); setObjectAnimation(progressBarAnimator); //set ObjectAnimation对象 progressBarAnimator.setDuration(NUM_SHOW_TIME); //设置Animation的时间 if(listener != null) progressBarAnimator.addListener(listener); //当animation更新时回调 progressBarAnimator.addUpdateListener(new AnimatorUpdateListener() { /** * 上次更新倒计时器的时间。单位:秒 */ private int mLastPlayTimeSecond = -1; @Override public void onAnimationUpdate(final ValueAnimator animation) { progressBar.setProgress((Float) animation.getAnimatedValue()); // 每过一秒,更新一次倒计时器 int currentPlayTimeSecond = (int) (animation.getCurrentPlayTime() / 1000); if(currentPlayTimeSecond != mLastPlayTimeSecond) { mLastPlayTimeSecond = currentPlayTimeSecond; int countDownTime = NUM_SHOW_TIME / 1000 - currentPlayTimeSecond; mTextView.setText(String.valueOf(countDownTime)); if(countDownTime == NUM_SHOW_TIME / 2000) { startAlarm(); } else if(countDownTime == 0) { getActionBar().setTitle(R.string.fall_down_alarm); sendAlarmMessage(); } } } }); progressBar.setMarkerProgress(markerProgress); progressBarAnimator.start(); } /** * 开始播放警报声 * @return 成功时,返回true;失败时,返回false */ private boolean startAlarm() { if(mAudioFocusHelper.requestFocus()) { try{ mMediaPlayer.prepare(); } catch(IllegalStateException e) { // may be Prepared, do nothing } catch (IOException e) { e.printStackTrace(); return false; } mMediaPlayer.start(); return true; } else return false; } /** * 停止播放警报声 */ private void stopAlarm() { try{ mMediaPlayer.stop(); } catch(IllegalStateException e) { // do nothing } mAudioFocusHelper.abandonFocus(); } /** * 设置和取得ObjectAnimator的引用 */ private ObjectAnimator getObjectAnimation(){ return this.objectAnimator; } private void setObjectAnimation(ObjectAnimator obj){ this.objectAnimator = obj; } /** * 覆写onTouchEvent, 要在两秒内点击两次屏幕才退出警报 */ @Override public boolean onTouchEvent(MotionEvent event) { if(event.getAction() == MotionEvent.ACTION_UP) { //如果两次点击屏幕的时间大于两秒 if ((System.currentTimeMillis() - mExitTime) > 2000) { Toast.makeText(this, R.string.touch_again_to_cancel, Toast.LENGTH_SHORT).show(); mExitTime = System.currentTimeMillis(); } else { //获得ObjectAnimation的引用,取消Animation getObjectAnimation().cancel(); //关闭Activity this.finish(); } return true; } return super.onTouchEvent(event); } private void sendAlarmMessage() { // 构造消息 final SmsMessage message = new SmsMessage(); message.setCode(Code.INFORM | Code.Extra.Inform.URGENT); UrgentMessageBody messageBody = new UrgentMessageBody(); messageBody.setType(UrgentMessageBody.Type.FALL_DOWN_ALARM); if(mLocationTracker != null && mLocationTracker.canGetLocation()) messageBody.setPosition(mLocationTracker.getLatitude(), mLocationTracker.getLongitude()); message.setBody(messageBody.toJson()); // 发送消息 final Contact contact = ContactDetailActivity.getDefaultContact(this); if(contact.phone != null && !contact.phone.isEmpty()) new Thread() { @Override public void run() { message.sendAndSave(AlarmCountdownActivity.this, contact.id, contact.phone); } }.start(); else new NoContactInformationDialogFragment().show(getFragmentManager(), "no_contact_info"); } }