1209a9163d4e8cee0bfe162ae598ef40e6051479cChih-Chung Chang/* 2209a9163d4e8cee0bfe162ae598ef40e6051479cChih-Chung Chang * Copyright (C) 2011 The Android Open Source Project 3209a9163d4e8cee0bfe162ae598ef40e6051479cChih-Chung Chang * 4209a9163d4e8cee0bfe162ae598ef40e6051479cChih-Chung Chang * Licensed under the Apache License, Version 2.0 (the "License"); 5209a9163d4e8cee0bfe162ae598ef40e6051479cChih-Chung Chang * you may not use this file except in compliance with the License. 6209a9163d4e8cee0bfe162ae598ef40e6051479cChih-Chung Chang * You may obtain a copy of the License at 7209a9163d4e8cee0bfe162ae598ef40e6051479cChih-Chung Chang * 8209a9163d4e8cee0bfe162ae598ef40e6051479cChih-Chung Chang * http://www.apache.org/licenses/LICENSE-2.0 9209a9163d4e8cee0bfe162ae598ef40e6051479cChih-Chung Chang * 10209a9163d4e8cee0bfe162ae598ef40e6051479cChih-Chung Chang * Unless required by applicable law or agreed to in writing, software 11209a9163d4e8cee0bfe162ae598ef40e6051479cChih-Chung Chang * distributed under the License is distributed on an "AS IS" BASIS, 12209a9163d4e8cee0bfe162ae598ef40e6051479cChih-Chung Chang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13209a9163d4e8cee0bfe162ae598ef40e6051479cChih-Chung Chang * See the License for the specific language governing permissions and 14209a9163d4e8cee0bfe162ae598ef40e6051479cChih-Chung Chang * limitations under the License. 15209a9163d4e8cee0bfe162ae598ef40e6051479cChih-Chung Chang */ 16209a9163d4e8cee0bfe162ae598ef40e6051479cChih-Chung Chang 17209a9163d4e8cee0bfe162ae598ef40e6051479cChih-Chung Changpackage com.android.gallery3d.app; 18209a9163d4e8cee0bfe162ae598ef40e6051479cChih-Chung Chang 19209a9163d4e8cee0bfe162ae598ef40e6051479cChih-Chung Changimport android.content.Context; 20209a9163d4e8cee0bfe162ae598ef40e6051479cChih-Chung Changimport android.os.Handler; 21209a9163d4e8cee0bfe162ae598ef40e6051479cChih-Chung Changimport android.view.KeyEvent; 22209a9163d4e8cee0bfe162ae598ef40e6051479cChih-Chung Changimport android.view.MotionEvent; 23209a9163d4e8cee0bfe162ae598ef40e6051479cChih-Chung Changimport android.view.View; 24209a9163d4e8cee0bfe162ae598ef40e6051479cChih-Chung Changimport android.view.animation.Animation; 25209a9163d4e8cee0bfe162ae598ef40e6051479cChih-Chung Changimport android.view.animation.Animation.AnimationListener; 26209a9163d4e8cee0bfe162ae598ef40e6051479cChih-Chung Changimport android.view.animation.AnimationUtils; 272b3ee0ea07246b859a5b75d8a6102a7cce7ec838Owen Linimport com.android.gallery3d.R; 282b3ee0ea07246b859a5b75d8a6102a7cce7ec838Owen Lin 29209a9163d4e8cee0bfe162ae598ef40e6051479cChih-Chung Chang/** 30209a9163d4e8cee0bfe162ae598ef40e6051479cChih-Chung Chang * The playback controller for the Movie Player. 31209a9163d4e8cee0bfe162ae598ef40e6051479cChih-Chung Chang */ 323f1f1baf3a674927e25cd5cd885fb372796bd3a0Teng-Hui Zhupublic class MovieControllerOverlay extends CommonControllerOverlay implements 333f1f1baf3a674927e25cd5cd885fb372796bd3a0Teng-Hui Zhu AnimationListener { 347817979db0c52ffeacb951625b1e821eba303285Ahbong Chang 353f1f1baf3a674927e25cd5cd885fb372796bd3a0Teng-Hui Zhu private boolean hidden; 367817979db0c52ffeacb951625b1e821eba303285Ahbong Chang 377817979db0c52ffeacb951625b1e821eba303285Ahbong Chang private final Handler handler; 387817979db0c52ffeacb951625b1e821eba303285Ahbong Chang private final Runnable startHidingRunnable; 397817979db0c52ffeacb951625b1e821eba303285Ahbong Chang private final Animation hideAnimation; 407817979db0c52ffeacb951625b1e821eba303285Ahbong Chang 417817979db0c52ffeacb951625b1e821eba303285Ahbong Chang public MovieControllerOverlay(Context context) { 427817979db0c52ffeacb951625b1e821eba303285Ahbong Chang super(context); 437817979db0c52ffeacb951625b1e821eba303285Ahbong Chang 447817979db0c52ffeacb951625b1e821eba303285Ahbong Chang handler = new Handler(); 457817979db0c52ffeacb951625b1e821eba303285Ahbong Chang startHidingRunnable = new Runnable() { 467817979db0c52ffeacb951625b1e821eba303285Ahbong Chang @Override 477817979db0c52ffeacb951625b1e821eba303285Ahbong Chang public void run() { 487817979db0c52ffeacb951625b1e821eba303285Ahbong Chang startHiding(); 497817979db0c52ffeacb951625b1e821eba303285Ahbong Chang } 507817979db0c52ffeacb951625b1e821eba303285Ahbong Chang }; 517817979db0c52ffeacb951625b1e821eba303285Ahbong Chang 527817979db0c52ffeacb951625b1e821eba303285Ahbong Chang hideAnimation = AnimationUtils.loadAnimation(context, R.anim.player_out); 537817979db0c52ffeacb951625b1e821eba303285Ahbong Chang hideAnimation.setAnimationListener(this); 547817979db0c52ffeacb951625b1e821eba303285Ahbong Chang 557817979db0c52ffeacb951625b1e821eba303285Ahbong Chang hide(); 56209a9163d4e8cee0bfe162ae598ef40e6051479cChih-Chung Chang } 57209a9163d4e8cee0bfe162ae598ef40e6051479cChih-Chung Chang 587817979db0c52ffeacb951625b1e821eba303285Ahbong Chang @Override 593f1f1baf3a674927e25cd5cd885fb372796bd3a0Teng-Hui Zhu protected void createTimeBar(Context context) { 603f1f1baf3a674927e25cd5cd885fb372796bd3a0Teng-Hui Zhu mTimeBar = new TimeBar(context, this); 617817979db0c52ffeacb951625b1e821eba303285Ahbong Chang } 627817979db0c52ffeacb951625b1e821eba303285Ahbong Chang 637817979db0c52ffeacb951625b1e821eba303285Ahbong Chang @Override 647817979db0c52ffeacb951625b1e821eba303285Ahbong Chang public void hide() { 657817979db0c52ffeacb951625b1e821eba303285Ahbong Chang boolean wasHidden = hidden; 667817979db0c52ffeacb951625b1e821eba303285Ahbong Chang hidden = true; 673f1f1baf3a674927e25cd5cd885fb372796bd3a0Teng-Hui Zhu super.hide(); 683f1f1baf3a674927e25cd5cd885fb372796bd3a0Teng-Hui Zhu if (mListener != null && wasHidden != hidden) { 693f1f1baf3a674927e25cd5cd885fb372796bd3a0Teng-Hui Zhu mListener.onHidden(); 707817979db0c52ffeacb951625b1e821eba303285Ahbong Chang } 717817979db0c52ffeacb951625b1e821eba303285Ahbong Chang } 727817979db0c52ffeacb951625b1e821eba303285Ahbong Chang 737817979db0c52ffeacb951625b1e821eba303285Ahbong Chang 747817979db0c52ffeacb951625b1e821eba303285Ahbong Chang @Override 757817979db0c52ffeacb951625b1e821eba303285Ahbong Chang public void show() { 767817979db0c52ffeacb951625b1e821eba303285Ahbong Chang boolean wasHidden = hidden; 777817979db0c52ffeacb951625b1e821eba303285Ahbong Chang hidden = false; 783f1f1baf3a674927e25cd5cd885fb372796bd3a0Teng-Hui Zhu super.show(); 793f1f1baf3a674927e25cd5cd885fb372796bd3a0Teng-Hui Zhu if (mListener != null && wasHidden != hidden) { 803f1f1baf3a674927e25cd5cd885fb372796bd3a0Teng-Hui Zhu mListener.onShown(); 81209a9163d4e8cee0bfe162ae598ef40e6051479cChih-Chung Chang } 82209a9163d4e8cee0bfe162ae598ef40e6051479cChih-Chung Chang maybeStartHiding(); 837817979db0c52ffeacb951625b1e821eba303285Ahbong Chang } 847817979db0c52ffeacb951625b1e821eba303285Ahbong Chang 857817979db0c52ffeacb951625b1e821eba303285Ahbong Chang private void maybeStartHiding() { 867817979db0c52ffeacb951625b1e821eba303285Ahbong Chang cancelHiding(); 873f1f1baf3a674927e25cd5cd885fb372796bd3a0Teng-Hui Zhu if (mState == State.PLAYING) { 887817979db0c52ffeacb951625b1e821eba303285Ahbong Chang handler.postDelayed(startHidingRunnable, 2500); 897817979db0c52ffeacb951625b1e821eba303285Ahbong Chang } 907817979db0c52ffeacb951625b1e821eba303285Ahbong Chang } 917817979db0c52ffeacb951625b1e821eba303285Ahbong Chang 927817979db0c52ffeacb951625b1e821eba303285Ahbong Chang private void startHiding() { 933f1f1baf3a674927e25cd5cd885fb372796bd3a0Teng-Hui Zhu startHideAnimation(mBackground); 943f1f1baf3a674927e25cd5cd885fb372796bd3a0Teng-Hui Zhu startHideAnimation(mTimeBar); 953f1f1baf3a674927e25cd5cd885fb372796bd3a0Teng-Hui Zhu startHideAnimation(mPlayPauseReplayView); 967817979db0c52ffeacb951625b1e821eba303285Ahbong Chang } 977817979db0c52ffeacb951625b1e821eba303285Ahbong Chang 987817979db0c52ffeacb951625b1e821eba303285Ahbong Chang private void startHideAnimation(View view) { 997817979db0c52ffeacb951625b1e821eba303285Ahbong Chang if (view.getVisibility() == View.VISIBLE) { 1007817979db0c52ffeacb951625b1e821eba303285Ahbong Chang view.startAnimation(hideAnimation); 1017817979db0c52ffeacb951625b1e821eba303285Ahbong Chang } 1027817979db0c52ffeacb951625b1e821eba303285Ahbong Chang } 1037817979db0c52ffeacb951625b1e821eba303285Ahbong Chang 1047817979db0c52ffeacb951625b1e821eba303285Ahbong Chang private void cancelHiding() { 1057817979db0c52ffeacb951625b1e821eba303285Ahbong Chang handler.removeCallbacks(startHidingRunnable); 1063f1f1baf3a674927e25cd5cd885fb372796bd3a0Teng-Hui Zhu mBackground.setAnimation(null); 1073f1f1baf3a674927e25cd5cd885fb372796bd3a0Teng-Hui Zhu mTimeBar.setAnimation(null); 1083f1f1baf3a674927e25cd5cd885fb372796bd3a0Teng-Hui Zhu mPlayPauseReplayView.setAnimation(null); 1097817979db0c52ffeacb951625b1e821eba303285Ahbong Chang } 1107817979db0c52ffeacb951625b1e821eba303285Ahbong Chang 1117817979db0c52ffeacb951625b1e821eba303285Ahbong Chang @Override 1127817979db0c52ffeacb951625b1e821eba303285Ahbong Chang public void onAnimationStart(Animation animation) { 1137817979db0c52ffeacb951625b1e821eba303285Ahbong Chang // Do nothing. 1147817979db0c52ffeacb951625b1e821eba303285Ahbong Chang } 1157817979db0c52ffeacb951625b1e821eba303285Ahbong Chang 1167817979db0c52ffeacb951625b1e821eba303285Ahbong Chang @Override 1177817979db0c52ffeacb951625b1e821eba303285Ahbong Chang public void onAnimationRepeat(Animation animation) { 1187817979db0c52ffeacb951625b1e821eba303285Ahbong Chang // Do nothing. 1197817979db0c52ffeacb951625b1e821eba303285Ahbong Chang } 1207817979db0c52ffeacb951625b1e821eba303285Ahbong Chang 1217817979db0c52ffeacb951625b1e821eba303285Ahbong Chang @Override 1227817979db0c52ffeacb951625b1e821eba303285Ahbong Chang public void onAnimationEnd(Animation animation) { 1237817979db0c52ffeacb951625b1e821eba303285Ahbong Chang hide(); 1247817979db0c52ffeacb951625b1e821eba303285Ahbong Chang } 1257817979db0c52ffeacb951625b1e821eba303285Ahbong Chang 1267817979db0c52ffeacb951625b1e821eba303285Ahbong Chang @Override 1277817979db0c52ffeacb951625b1e821eba303285Ahbong Chang public boolean onKeyDown(int keyCode, KeyEvent event) { 1287817979db0c52ffeacb951625b1e821eba303285Ahbong Chang if (hidden) { 1297817979db0c52ffeacb951625b1e821eba303285Ahbong Chang show(); 1307817979db0c52ffeacb951625b1e821eba303285Ahbong Chang } 1317817979db0c52ffeacb951625b1e821eba303285Ahbong Chang return super.onKeyDown(keyCode, event); 1327817979db0c52ffeacb951625b1e821eba303285Ahbong Chang } 1337817979db0c52ffeacb951625b1e821eba303285Ahbong Chang 1347817979db0c52ffeacb951625b1e821eba303285Ahbong Chang @Override 1357817979db0c52ffeacb951625b1e821eba303285Ahbong Chang public boolean onTouchEvent(MotionEvent event) { 1367817979db0c52ffeacb951625b1e821eba303285Ahbong Chang if (super.onTouchEvent(event)) { 1377817979db0c52ffeacb951625b1e821eba303285Ahbong Chang return true; 1387817979db0c52ffeacb951625b1e821eba303285Ahbong Chang } 1397817979db0c52ffeacb951625b1e821eba303285Ahbong Chang 1407817979db0c52ffeacb951625b1e821eba303285Ahbong Chang if (hidden) { 1417817979db0c52ffeacb951625b1e821eba303285Ahbong Chang show(); 1427817979db0c52ffeacb951625b1e821eba303285Ahbong Chang return true; 1437817979db0c52ffeacb951625b1e821eba303285Ahbong Chang } 1447817979db0c52ffeacb951625b1e821eba303285Ahbong Chang switch (event.getAction()) { 1457817979db0c52ffeacb951625b1e821eba303285Ahbong Chang case MotionEvent.ACTION_DOWN: 1467817979db0c52ffeacb951625b1e821eba303285Ahbong Chang cancelHiding(); 1473f1f1baf3a674927e25cd5cd885fb372796bd3a0Teng-Hui Zhu if (mState == State.PLAYING || mState == State.PAUSED) { 1483f1f1baf3a674927e25cd5cd885fb372796bd3a0Teng-Hui Zhu mListener.onPlayPause(); 1497817979db0c52ffeacb951625b1e821eba303285Ahbong Chang } 1507817979db0c52ffeacb951625b1e821eba303285Ahbong Chang break; 1517817979db0c52ffeacb951625b1e821eba303285Ahbong Chang case MotionEvent.ACTION_UP: 1527817979db0c52ffeacb951625b1e821eba303285Ahbong Chang maybeStartHiding(); 1537817979db0c52ffeacb951625b1e821eba303285Ahbong Chang break; 1547817979db0c52ffeacb951625b1e821eba303285Ahbong Chang } 1557817979db0c52ffeacb951625b1e821eba303285Ahbong Chang return true; 1567817979db0c52ffeacb951625b1e821eba303285Ahbong Chang } 1577817979db0c52ffeacb951625b1e821eba303285Ahbong Chang 1587817979db0c52ffeacb951625b1e821eba303285Ahbong Chang @Override 1593f1f1baf3a674927e25cd5cd885fb372796bd3a0Teng-Hui Zhu protected void updateViews() { 1607817979db0c52ffeacb951625b1e821eba303285Ahbong Chang if (hidden) { 1617817979db0c52ffeacb951625b1e821eba303285Ahbong Chang return; 1627817979db0c52ffeacb951625b1e821eba303285Ahbong Chang } 1633f1f1baf3a674927e25cd5cd885fb372796bd3a0Teng-Hui Zhu super.updateViews(); 1647817979db0c52ffeacb951625b1e821eba303285Ahbong Chang } 1657817979db0c52ffeacb951625b1e821eba303285Ahbong Chang 1667817979db0c52ffeacb951625b1e821eba303285Ahbong Chang // TimeBar listener 1677817979db0c52ffeacb951625b1e821eba303285Ahbong Chang 1687817979db0c52ffeacb951625b1e821eba303285Ahbong Chang @Override 1697817979db0c52ffeacb951625b1e821eba303285Ahbong Chang public void onScrubbingStart() { 1707817979db0c52ffeacb951625b1e821eba303285Ahbong Chang cancelHiding(); 1713f1f1baf3a674927e25cd5cd885fb372796bd3a0Teng-Hui Zhu super.onScrubbingStart(); 1727817979db0c52ffeacb951625b1e821eba303285Ahbong Chang } 1737817979db0c52ffeacb951625b1e821eba303285Ahbong Chang 1747817979db0c52ffeacb951625b1e821eba303285Ahbong Chang @Override 1757817979db0c52ffeacb951625b1e821eba303285Ahbong Chang public void onScrubbingMove(int time) { 1767817979db0c52ffeacb951625b1e821eba303285Ahbong Chang cancelHiding(); 1773f1f1baf3a674927e25cd5cd885fb372796bd3a0Teng-Hui Zhu super.onScrubbingMove(time); 1787817979db0c52ffeacb951625b1e821eba303285Ahbong Chang } 1797817979db0c52ffeacb951625b1e821eba303285Ahbong Chang 1807817979db0c52ffeacb951625b1e821eba303285Ahbong Chang @Override 1813f1f1baf3a674927e25cd5cd885fb372796bd3a0Teng-Hui Zhu public void onScrubbingEnd(int time, int trimStartTime, int trimEndTime) { 1827817979db0c52ffeacb951625b1e821eba303285Ahbong Chang maybeStartHiding(); 1833f1f1baf3a674927e25cd5cd885fb372796bd3a0Teng-Hui Zhu super.onScrubbingEnd(time, trimStartTime, trimEndTime); 1847817979db0c52ffeacb951625b1e821eba303285Ahbong Chang } 185209a9163d4e8cee0bfe162ae598ef40e6051479cChih-Chung Chang} 186