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