| /* |
| * Copyright (C) 2012 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| package com.android.camera.ui; |
| |
| import java.util.Locale; |
| |
| import android.content.Context; |
| import android.media.AudioManager; |
| import android.media.SoundPool; |
| import android.os.Handler; |
| import android.os.Message; |
| import android.util.AttributeSet; |
| import android.util.Log; |
| import android.view.View; |
| import android.view.animation.Animation; |
| import android.view.animation.AnimationUtils; |
| import android.widget.FrameLayout; |
| import android.widget.TextView; |
| |
| import com.android.gallery3d.R; |
| |
| public class CountDownView extends FrameLayout { |
| |
| private static final String TAG = "CAM_CountDownView"; |
| private static final int SET_TIMER_TEXT = 1; |
| private TextView mRemainingSecondsView; |
| private int mRemainingSecs = 0; |
| private OnCountDownFinishedListener mListener; |
| private Animation mCountDownAnim; |
| private SoundPool mSoundPool; |
| private int mBeepTwice; |
| private int mBeepOnce; |
| private boolean mPlaySound; |
| private final Handler mHandler = new MainHandler(); |
| |
| public CountDownView(Context context, AttributeSet attrs) { |
| super(context, attrs); |
| mCountDownAnim = AnimationUtils.loadAnimation(context, R.anim.count_down_exit); |
| // Load the beeps |
| mSoundPool = new SoundPool(1, AudioManager.STREAM_NOTIFICATION, 0); |
| mBeepOnce = mSoundPool.load(context, R.raw.beep_once, 1); |
| mBeepTwice = mSoundPool.load(context, R.raw.beep_twice, 1); |
| } |
| |
| public boolean isCountingDown() { |
| return mRemainingSecs > 0; |
| }; |
| |
| public interface OnCountDownFinishedListener { |
| public void onCountDownFinished(); |
| } |
| |
| private void remainingSecondsChanged(int newVal) { |
| mRemainingSecs = newVal; |
| if (newVal == 0) { |
| // Countdown has finished |
| setVisibility(View.INVISIBLE); |
| mListener.onCountDownFinished(); |
| } else { |
| Locale locale = getResources().getConfiguration().locale; |
| String localizedValue = String.format(locale, "%d", newVal); |
| mRemainingSecondsView.setText(localizedValue); |
| // Fade-out animation |
| mCountDownAnim.reset(); |
| mRemainingSecondsView.clearAnimation(); |
| mRemainingSecondsView.startAnimation(mCountDownAnim); |
| |
| // Play sound effect for the last 3 seconds of the countdown |
| if (mPlaySound) { |
| if (newVal == 1) { |
| mSoundPool.play(mBeepTwice, 1.0f, 1.0f, 0, 0, 1.0f); |
| } else if (newVal <= 3) { |
| mSoundPool.play(mBeepOnce, 1.0f, 1.0f, 0, 0, 1.0f); |
| } |
| } |
| // Schedule the next remainingSecondsChanged() call in 1 second |
| mHandler.sendEmptyMessageDelayed(SET_TIMER_TEXT, 1000); |
| } |
| } |
| |
| @Override |
| protected void onFinishInflate() { |
| super.onFinishInflate(); |
| mRemainingSecondsView = (TextView) findViewById(R.id.remaining_seconds); |
| } |
| |
| public void setCountDownFinishedListener(OnCountDownFinishedListener listener) { |
| mListener = listener; |
| } |
| |
| public void startCountDown(int sec, boolean playSound) { |
| if (sec <= 0) { |
| Log.w(TAG, "Invalid input for countdown timer: " + sec + " seconds"); |
| return; |
| } |
| setVisibility(View.VISIBLE); |
| mPlaySound = playSound; |
| remainingSecondsChanged(sec); |
| } |
| |
| public void cancelCountDown() { |
| if (mRemainingSecs > 0) { |
| mRemainingSecs = 0; |
| mHandler.removeMessages(SET_TIMER_TEXT); |
| setVisibility(View.INVISIBLE); |
| } |
| } |
| |
| private class MainHandler extends Handler { |
| @Override |
| public void handleMessage(Message message) { |
| if (message.what == SET_TIMER_TEXT) { |
| remainingSecondsChanged(mRemainingSecs -1); |
| } |
| } |
| } |
| } |