13f1f1baf3a674927e25cd5cd885fb372796bd3a0Teng-Hui Zhu/* 23f1f1baf3a674927e25cd5cd885fb372796bd3a0Teng-Hui Zhu * Copyright (C) 2012 The Android Open Source Project 33f1f1baf3a674927e25cd5cd885fb372796bd3a0Teng-Hui Zhu * 43f1f1baf3a674927e25cd5cd885fb372796bd3a0Teng-Hui Zhu * Licensed under the Apache License, Version 2.0 (the "License"); 53f1f1baf3a674927e25cd5cd885fb372796bd3a0Teng-Hui Zhu * you may not use this file except in compliance with the License. 63f1f1baf3a674927e25cd5cd885fb372796bd3a0Teng-Hui Zhu * You may obtain a copy of the License at 73f1f1baf3a674927e25cd5cd885fb372796bd3a0Teng-Hui Zhu * 83f1f1baf3a674927e25cd5cd885fb372796bd3a0Teng-Hui Zhu * http://www.apache.org/licenses/LICENSE-2.0 93f1f1baf3a674927e25cd5cd885fb372796bd3a0Teng-Hui Zhu * 103f1f1baf3a674927e25cd5cd885fb372796bd3a0Teng-Hui Zhu * Unless required by applicable law or agreed to in writing, software 113f1f1baf3a674927e25cd5cd885fb372796bd3a0Teng-Hui Zhu * distributed under the License is distributed on an "AS IS" BASIS, 123f1f1baf3a674927e25cd5cd885fb372796bd3a0Teng-Hui Zhu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 133f1f1baf3a674927e25cd5cd885fb372796bd3a0Teng-Hui Zhu * See the License for the specific language governing permissions and 143f1f1baf3a674927e25cd5cd885fb372796bd3a0Teng-Hui Zhu * limitations under the License. 153f1f1baf3a674927e25cd5cd885fb372796bd3a0Teng-Hui Zhu */ 163f1f1baf3a674927e25cd5cd885fb372796bd3a0Teng-Hui Zhu 173f1f1baf3a674927e25cd5cd885fb372796bd3a0Teng-Hui Zhupackage com.android.gallery3d.app; 183f1f1baf3a674927e25cd5cd885fb372796bd3a0Teng-Hui Zhu 193f1f1baf3a674927e25cd5cd885fb372796bd3a0Teng-Hui Zhuimport android.animation.Animator; 203f1f1baf3a674927e25cd5cd885fb372796bd3a0Teng-Hui Zhuimport android.animation.Animator.AnimatorListener; 213f1f1baf3a674927e25cd5cd885fb372796bd3a0Teng-Hui Zhuimport android.animation.ObjectAnimator; 223f1f1baf3a674927e25cd5cd885fb372796bd3a0Teng-Hui Zhuimport android.content.Context; 233f1f1baf3a674927e25cd5cd885fb372796bd3a0Teng-Hui Zhuimport android.view.MotionEvent; 243f1f1baf3a674927e25cd5cd885fb372796bd3a0Teng-Hui Zhuimport android.view.View; 253f1f1baf3a674927e25cd5cd885fb372796bd3a0Teng-Hui Zhu 26b5f374c30d06dc0409891f85a4bd5e1e3ddf8700Teng-Hui Zhuimport com.android.gallery3d.common.ApiHelper; 27b5f374c30d06dc0409891f85a4bd5e1e3ddf8700Teng-Hui Zhu 283f1f1baf3a674927e25cd5cd885fb372796bd3a0Teng-Hui Zhu/** 293f1f1baf3a674927e25cd5cd885fb372796bd3a0Teng-Hui Zhu * The controller for the Trimming Video. 303f1f1baf3a674927e25cd5cd885fb372796bd3a0Teng-Hui Zhu */ 313f1f1baf3a674927e25cd5cd885fb372796bd3a0Teng-Hui Zhupublic class TrimControllerOverlay extends CommonControllerOverlay { 323f1f1baf3a674927e25cd5cd885fb372796bd3a0Teng-Hui Zhu 333f1f1baf3a674927e25cd5cd885fb372796bd3a0Teng-Hui Zhu public TrimControllerOverlay(Context context) { 343f1f1baf3a674927e25cd5cd885fb372796bd3a0Teng-Hui Zhu super(context); 353f1f1baf3a674927e25cd5cd885fb372796bd3a0Teng-Hui Zhu } 363f1f1baf3a674927e25cd5cd885fb372796bd3a0Teng-Hui Zhu 373f1f1baf3a674927e25cd5cd885fb372796bd3a0Teng-Hui Zhu @Override 383f1f1baf3a674927e25cd5cd885fb372796bd3a0Teng-Hui Zhu protected void createTimeBar(Context context) { 393f1f1baf3a674927e25cd5cd885fb372796bd3a0Teng-Hui Zhu mTimeBar = new TrimTimeBar(context, this); 403f1f1baf3a674927e25cd5cd885fb372796bd3a0Teng-Hui Zhu } 413f1f1baf3a674927e25cd5cd885fb372796bd3a0Teng-Hui Zhu 423f1f1baf3a674927e25cd5cd885fb372796bd3a0Teng-Hui Zhu private void hidePlayButtonIfPlaying() { 433f1f1baf3a674927e25cd5cd885fb372796bd3a0Teng-Hui Zhu if (mState == State.PLAYING) { 443f1f1baf3a674927e25cd5cd885fb372796bd3a0Teng-Hui Zhu mPlayPauseReplayView.setVisibility(View.INVISIBLE); 453f1f1baf3a674927e25cd5cd885fb372796bd3a0Teng-Hui Zhu } 46b5f374c30d06dc0409891f85a4bd5e1e3ddf8700Teng-Hui Zhu if (ApiHelper.HAS_OBJECT_ANIMATION) { 47b5f374c30d06dc0409891f85a4bd5e1e3ddf8700Teng-Hui Zhu mPlayPauseReplayView.setAlpha(1f); 48b5f374c30d06dc0409891f85a4bd5e1e3ddf8700Teng-Hui Zhu } 493f1f1baf3a674927e25cd5cd885fb372796bd3a0Teng-Hui Zhu } 503f1f1baf3a674927e25cd5cd885fb372796bd3a0Teng-Hui Zhu 513f1f1baf3a674927e25cd5cd885fb372796bd3a0Teng-Hui Zhu @Override 523f1f1baf3a674927e25cd5cd885fb372796bd3a0Teng-Hui Zhu public void showPlaying() { 533f1f1baf3a674927e25cd5cd885fb372796bd3a0Teng-Hui Zhu super.showPlaying(); 54b5f374c30d06dc0409891f85a4bd5e1e3ddf8700Teng-Hui Zhu if (ApiHelper.HAS_OBJECT_ANIMATION) { 55b5f374c30d06dc0409891f85a4bd5e1e3ddf8700Teng-Hui Zhu // Add animation to hide the play button while playing. 56b5f374c30d06dc0409891f85a4bd5e1e3ddf8700Teng-Hui Zhu ObjectAnimator anim = ObjectAnimator.ofFloat(mPlayPauseReplayView, "alpha", 1f, 0f); 57b5f374c30d06dc0409891f85a4bd5e1e3ddf8700Teng-Hui Zhu anim.setDuration(200); 58b5f374c30d06dc0409891f85a4bd5e1e3ddf8700Teng-Hui Zhu anim.start(); 59b5f374c30d06dc0409891f85a4bd5e1e3ddf8700Teng-Hui Zhu anim.addListener(new AnimatorListener() { 60b5f374c30d06dc0409891f85a4bd5e1e3ddf8700Teng-Hui Zhu @Override 61b5f374c30d06dc0409891f85a4bd5e1e3ddf8700Teng-Hui Zhu public void onAnimationStart(Animator animation) { 62b5f374c30d06dc0409891f85a4bd5e1e3ddf8700Teng-Hui Zhu } 633f1f1baf3a674927e25cd5cd885fb372796bd3a0Teng-Hui Zhu 64b5f374c30d06dc0409891f85a4bd5e1e3ddf8700Teng-Hui Zhu @Override 65b5f374c30d06dc0409891f85a4bd5e1e3ddf8700Teng-Hui Zhu public void onAnimationEnd(Animator animation) { 66b5f374c30d06dc0409891f85a4bd5e1e3ddf8700Teng-Hui Zhu hidePlayButtonIfPlaying(); 67b5f374c30d06dc0409891f85a4bd5e1e3ddf8700Teng-Hui Zhu } 683f1f1baf3a674927e25cd5cd885fb372796bd3a0Teng-Hui Zhu 69b5f374c30d06dc0409891f85a4bd5e1e3ddf8700Teng-Hui Zhu @Override 70b5f374c30d06dc0409891f85a4bd5e1e3ddf8700Teng-Hui Zhu public void onAnimationCancel(Animator animation) { 71b5f374c30d06dc0409891f85a4bd5e1e3ddf8700Teng-Hui Zhu hidePlayButtonIfPlaying(); 72b5f374c30d06dc0409891f85a4bd5e1e3ddf8700Teng-Hui Zhu } 733f1f1baf3a674927e25cd5cd885fb372796bd3a0Teng-Hui Zhu 74b5f374c30d06dc0409891f85a4bd5e1e3ddf8700Teng-Hui Zhu @Override 75b5f374c30d06dc0409891f85a4bd5e1e3ddf8700Teng-Hui Zhu public void onAnimationRepeat(Animator animation) { 76b5f374c30d06dc0409891f85a4bd5e1e3ddf8700Teng-Hui Zhu } 77b5f374c30d06dc0409891f85a4bd5e1e3ddf8700Teng-Hui Zhu }); 78b5f374c30d06dc0409891f85a4bd5e1e3ddf8700Teng-Hui Zhu } else { 79b5f374c30d06dc0409891f85a4bd5e1e3ddf8700Teng-Hui Zhu hidePlayButtonIfPlaying(); 80b5f374c30d06dc0409891f85a4bd5e1e3ddf8700Teng-Hui Zhu } 813f1f1baf3a674927e25cd5cd885fb372796bd3a0Teng-Hui Zhu } 823f1f1baf3a674927e25cd5cd885fb372796bd3a0Teng-Hui Zhu 833f1f1baf3a674927e25cd5cd885fb372796bd3a0Teng-Hui Zhu @Override 843f1f1baf3a674927e25cd5cd885fb372796bd3a0Teng-Hui Zhu public void setTimes(int currentTime, int totalTime, int trimStartTime, int trimEndTime) { 853f1f1baf3a674927e25cd5cd885fb372796bd3a0Teng-Hui Zhu mTimeBar.setTime(currentTime, totalTime, trimStartTime, trimEndTime); 863f1f1baf3a674927e25cd5cd885fb372796bd3a0Teng-Hui Zhu } 873f1f1baf3a674927e25cd5cd885fb372796bd3a0Teng-Hui Zhu 883f1f1baf3a674927e25cd5cd885fb372796bd3a0Teng-Hui Zhu @Override 893f1f1baf3a674927e25cd5cd885fb372796bd3a0Teng-Hui Zhu public boolean onTouchEvent(MotionEvent event) { 903f1f1baf3a674927e25cd5cd885fb372796bd3a0Teng-Hui Zhu if (super.onTouchEvent(event)) { 913f1f1baf3a674927e25cd5cd885fb372796bd3a0Teng-Hui Zhu return true; 923f1f1baf3a674927e25cd5cd885fb372796bd3a0Teng-Hui Zhu } 933f1f1baf3a674927e25cd5cd885fb372796bd3a0Teng-Hui Zhu 943f1f1baf3a674927e25cd5cd885fb372796bd3a0Teng-Hui Zhu // The special thing here is that the State.ENDED include both cases of 953f1f1baf3a674927e25cd5cd885fb372796bd3a0Teng-Hui Zhu // the video completed and current == trimEnd. Both request a replay. 963f1f1baf3a674927e25cd5cd885fb372796bd3a0Teng-Hui Zhu switch (event.getAction()) { 973f1f1baf3a674927e25cd5cd885fb372796bd3a0Teng-Hui Zhu case MotionEvent.ACTION_DOWN: 983f1f1baf3a674927e25cd5cd885fb372796bd3a0Teng-Hui Zhu if (mState == State.PLAYING || mState == State.PAUSED) { 993f1f1baf3a674927e25cd5cd885fb372796bd3a0Teng-Hui Zhu mListener.onPlayPause(); 1003f1f1baf3a674927e25cd5cd885fb372796bd3a0Teng-Hui Zhu } else if (mState == State.ENDED) { 1013f1f1baf3a674927e25cd5cd885fb372796bd3a0Teng-Hui Zhu if (mCanReplay) { 1023f1f1baf3a674927e25cd5cd885fb372796bd3a0Teng-Hui Zhu mListener.onReplay(); 1033f1f1baf3a674927e25cd5cd885fb372796bd3a0Teng-Hui Zhu } 1043f1f1baf3a674927e25cd5cd885fb372796bd3a0Teng-Hui Zhu } 1053f1f1baf3a674927e25cd5cd885fb372796bd3a0Teng-Hui Zhu break; 1063f1f1baf3a674927e25cd5cd885fb372796bd3a0Teng-Hui Zhu case MotionEvent.ACTION_UP: 1073f1f1baf3a674927e25cd5cd885fb372796bd3a0Teng-Hui Zhu break; 1083f1f1baf3a674927e25cd5cd885fb372796bd3a0Teng-Hui Zhu } 1093f1f1baf3a674927e25cd5cd885fb372796bd3a0Teng-Hui Zhu return true; 1103f1f1baf3a674927e25cd5cd885fb372796bd3a0Teng-Hui Zhu } 1113f1f1baf3a674927e25cd5cd885fb372796bd3a0Teng-Hui Zhu} 112