1816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko/*
2816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * Copyright (C) 2015 The Android Open Source Project
3816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko *
4816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * Licensed under the Apache License, Version 2.0 (the "License");
5816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * you may not use this file except in compliance with the License.
6816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * You may obtain a copy of the License at
7816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko *
8816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko *      http://www.apache.org/licenses/LICENSE-2.0
9816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko *
10816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * Unless required by applicable law or agreed to in writing, software
11816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * distributed under the License is distributed on an "AS IS" BASIS,
12816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * See the License for the specific language governing permissions and
14816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * limitations under the License.
15816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko */
16816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
17816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkopackage com.android.tv.ui;
18816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
19816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport android.animation.TimeInterpolator;
20816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport android.app.Dialog;
21816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport android.content.Context;
22816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport android.os.Handler;
23816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport android.util.AttributeSet;
2407b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalkoimport android.util.Log;
25816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport android.view.View;
2607b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalkoimport android.view.ViewTreeObserver;
27816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport android.view.animation.AnimationUtils;
28816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport android.widget.FrameLayout;
29816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
30816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport com.android.tv.MainActivity;
31816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport com.android.tv.R;
32816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport com.android.tv.dialog.FullscreenDialogFragment;
33816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
34816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkopublic class FullscreenDialogView extends FrameLayout
35816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        implements FullscreenDialogFragment.DialogView {
3607b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko    private static final String TAG = "FullscreenDialogView";
3707b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko    private static final boolean DEBUG = false;
3807b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko
39816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    private static final int FADE_IN_DURATION_MS = 400;
4007b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko    private static final int FADE_OUT_DURATION_MS = 250;
41816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    private static final int TRANSITION_INTERVAL_MS = 300;
42816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
43816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    private MainActivity mActivity;
44816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    private Dialog mDialog;
45816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    private boolean mSkipEnterAlphaAnimation;
46816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    private boolean mSkipExitAlphaAnimation;
47816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
48816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    private final TimeInterpolator mLinearOutSlowIn;
49816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    private final TimeInterpolator mFastOutLinearIn;
50816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
51816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    public FullscreenDialogView(Context context) {
52816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        this(context, null, 0);
53816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    }
54816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
55816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    public FullscreenDialogView(Context context, AttributeSet attrs) {
56816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        this(context, attrs, 0);
57816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    }
58816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
59816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    public FullscreenDialogView(Context context, AttributeSet attrs, int defStyle) {
60816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        super(context, attrs, defStyle);
61816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        mLinearOutSlowIn = AnimationUtils.loadInterpolator(context,
62816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                android.R.interpolator.linear_out_slow_in);
63816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        mFastOutLinearIn = AnimationUtils.loadInterpolator(context,
64816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                android.R.interpolator.fast_out_linear_in);
6507b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko        getViewTreeObserver().addOnGlobalLayoutListener(
6607b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko                new ViewTreeObserver.OnGlobalLayoutListener() {
6707b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko                    @Override
6807b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko                    public void onGlobalLayout() {
6907b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko                        getViewTreeObserver().removeOnGlobalLayoutListener(this);
7007b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko                        startEnterAnimation();
7107b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko                    }
7207b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko                });
73816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    }
74816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
75816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    protected MainActivity getActivity() {
76816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        return mActivity;
77816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    }
78816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
79816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    /**
80816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko     * Gets the host {@link Dialog}.
81816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko     */
82816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    protected Dialog getDialog() {
83816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        return mDialog;
84816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    }
85816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
86816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    /**
87816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko     * Dismisses the host {@link Dialog}.
88816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko     */
89816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    protected void dismiss() {
90816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        startExitAnimation(new Runnable() {
91816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko            @Override
92816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko            public void run() {
93816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                mDialog.dismiss();
94816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko            }
95816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        });
96816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    }
97816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
98816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    @Override
99816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    public void initialize(MainActivity activity, Dialog dialog) {
100816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        mActivity = activity;
101816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        mDialog = dialog;
102816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    }
103816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
104816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    @Override
105816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    public void onBackPressed() { }
106816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
107816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    @Override
108816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    public void onDestroy() { }
109816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
110816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    /**
111816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko     * Transitions to another view inside the host {@link Dialog}.
112816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko     */
113816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    public void transitionTo(final FullscreenDialogView v) {
114816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        mSkipExitAlphaAnimation = true;
115816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        v.mSkipEnterAlphaAnimation = true;
116816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        v.initialize(mActivity, mDialog);
117816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        startExitAnimation(new Runnable() {
118816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko            @Override
119816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko            public void run() {
120816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                new Handler().postDelayed(new Runnable() {
121816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                    @Override
122816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                    public void run() {
123816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                        v.initialize(getActivity(), getDialog());
124816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                        getDialog().setContentView(v);
125816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                    }
126816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                }, TRANSITION_INTERVAL_MS);
127816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko            }
128816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        });
129816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    }
130816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
13107b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko    /**
13207b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko     * Called when an enter animation starts. Sub-view specific animation can be implemented.
13307b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko     */
13407b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko    protected void onStartEnterAnimation(TimeInterpolator interpolator, long duration) {
13507b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko    }
13607b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko
13707b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko    /**
13807b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko     * Called when an exit animation starts. Sub-view specific animation can be implemented.
13907b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko     */
14007b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko    protected void onStartExitAnimation(TimeInterpolator interpolator, long duration,
14107b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko            Runnable onAnimationEnded) {
14207b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko    }
14307b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko
144816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    private void startEnterAnimation() {
14507b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko        if (DEBUG) Log.d(TAG, "start an enter animation");
14607b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko        View backgroundView = findViewById(R.id.background);
147816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        if (!mSkipEnterAlphaAnimation) {
14807b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko            backgroundView.setAlpha(0);
14907b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko            backgroundView.animate()
150816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                    .alpha(1.0f)
151816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                    .setInterpolator(mLinearOutSlowIn)
152816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                    .setDuration(FADE_IN_DURATION_MS)
15307b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko                    .withLayer()
154816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                    .start();
155816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        }
15607b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko        onStartEnterAnimation(mLinearOutSlowIn, FADE_IN_DURATION_MS);
157816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    }
158816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
159816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    private void startExitAnimation(final Runnable onAnimationEnded) {
16007b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko        if (DEBUG) Log.d(TAG, "start an exit animation");
16107b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko        View backgroundView = findViewById(R.id.background);
162816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        if (!mSkipExitAlphaAnimation) {
16307b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko            backgroundView.animate()
164816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                    .alpha(0.0f)
165816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                    .setInterpolator(mFastOutLinearIn)
166816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                    .setDuration(FADE_OUT_DURATION_MS)
16707b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko                    .withLayer()
168816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                    .start();
169816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        }
17007b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko        onStartExitAnimation(mFastOutLinearIn, FADE_OUT_DURATION_MS, onAnimationEnded);
171816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    }
172816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko}
173