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 Chalkoimport com.android.tv.MainActivity;
30816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport com.android.tv.R;
31816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport com.android.tv.dialog.FullscreenDialogFragment;
32816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
33816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkopublic class FullscreenDialogView extends FrameLayout
34816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        implements FullscreenDialogFragment.DialogView {
3507b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko    private static final String TAG = "FullscreenDialogView";
3607b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko    private static final boolean DEBUG = false;
3707b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko
38816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    private static final int FADE_IN_DURATION_MS = 400;
3907b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko    private static final int FADE_OUT_DURATION_MS = 250;
40816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    private static final int TRANSITION_INTERVAL_MS = 300;
41816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
42816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    private MainActivity mActivity;
43816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    private Dialog mDialog;
44816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    private boolean mSkipEnterAlphaAnimation;
45816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    private boolean mSkipExitAlphaAnimation;
46816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
47816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    private final TimeInterpolator mLinearOutSlowIn;
48816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    private final TimeInterpolator mFastOutLinearIn;
49816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
50816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    public FullscreenDialogView(Context context) {
51816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        this(context, null, 0);
52816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    }
53816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
54816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    public FullscreenDialogView(Context context, AttributeSet attrs) {
55816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        this(context, attrs, 0);
56816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    }
57816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
58816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    public FullscreenDialogView(Context context, AttributeSet attrs, int defStyle) {
59816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        super(context, attrs, defStyle);
6095961816a768da387f0b5523cf4363ace2044089Nick Chalko        mLinearOutSlowIn =
6195961816a768da387f0b5523cf4363ace2044089Nick Chalko                AnimationUtils.loadInterpolator(context, android.R.interpolator.linear_out_slow_in);
6295961816a768da387f0b5523cf4363ace2044089Nick Chalko        mFastOutLinearIn =
6395961816a768da387f0b5523cf4363ace2044089Nick Chalko                AnimationUtils.loadInterpolator(context, android.R.interpolator.fast_out_linear_in);
6495961816a768da387f0b5523cf4363ace2044089Nick Chalko        getViewTreeObserver()
6595961816a768da387f0b5523cf4363ace2044089Nick Chalko                .addOnGlobalLayoutListener(
6695961816a768da387f0b5523cf4363ace2044089Nick Chalko                        new ViewTreeObserver.OnGlobalLayoutListener() {
6795961816a768da387f0b5523cf4363ace2044089Nick Chalko                            @Override
6895961816a768da387f0b5523cf4363ace2044089Nick Chalko                            public void onGlobalLayout() {
6995961816a768da387f0b5523cf4363ace2044089Nick Chalko                                getViewTreeObserver().removeOnGlobalLayoutListener(this);
7095961816a768da387f0b5523cf4363ace2044089Nick Chalko                                startEnterAnimation();
7195961816a768da387f0b5523cf4363ace2044089Nick Chalko                            }
7295961816a768da387f0b5523cf4363ace2044089Nick Chalko                        });
73816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    }
74816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
75816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    protected MainActivity getActivity() {
76816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        return mActivity;
77816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    }
78816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
7995961816a768da387f0b5523cf4363ace2044089Nick Chalko    /** Gets the host {@link Dialog}. */
80816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    protected Dialog getDialog() {
81816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        return mDialog;
82816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    }
83816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
8495961816a768da387f0b5523cf4363ace2044089Nick Chalko    /** Dismisses the host {@link Dialog}. */
85816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    protected void dismiss() {
8695961816a768da387f0b5523cf4363ace2044089Nick Chalko        startExitAnimation(
8795961816a768da387f0b5523cf4363ace2044089Nick Chalko                new Runnable() {
8895961816a768da387f0b5523cf4363ace2044089Nick Chalko                    @Override
8995961816a768da387f0b5523cf4363ace2044089Nick Chalko                    public void run() {
9095961816a768da387f0b5523cf4363ace2044089Nick Chalko                        mDialog.dismiss();
9195961816a768da387f0b5523cf4363ace2044089Nick Chalko                    }
9295961816a768da387f0b5523cf4363ace2044089Nick Chalko                });
93816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    }
94816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
95816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    @Override
96816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    public void initialize(MainActivity activity, Dialog dialog) {
97816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        mActivity = activity;
98816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        mDialog = dialog;
99816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    }
100816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
101816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    @Override
10295961816a768da387f0b5523cf4363ace2044089Nick Chalko    public void onBackPressed() {}
103816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
104816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    @Override
10595961816a768da387f0b5523cf4363ace2044089Nick Chalko    public void onDestroy() {}
106816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
10795961816a768da387f0b5523cf4363ace2044089Nick Chalko    /** Transitions to another view inside the host {@link Dialog}. */
108816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    public void transitionTo(final FullscreenDialogView v) {
109816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        mSkipExitAlphaAnimation = true;
110816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        v.mSkipEnterAlphaAnimation = true;
111816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        v.initialize(mActivity, mDialog);
11295961816a768da387f0b5523cf4363ace2044089Nick Chalko        startExitAnimation(
11395961816a768da387f0b5523cf4363ace2044089Nick Chalko                new Runnable() {
114816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                    @Override
115816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                    public void run() {
11695961816a768da387f0b5523cf4363ace2044089Nick Chalko                        new Handler()
11795961816a768da387f0b5523cf4363ace2044089Nick Chalko                                .postDelayed(
11895961816a768da387f0b5523cf4363ace2044089Nick Chalko                                        new Runnable() {
11995961816a768da387f0b5523cf4363ace2044089Nick Chalko                                            @Override
12095961816a768da387f0b5523cf4363ace2044089Nick Chalko                                            public void run() {
12195961816a768da387f0b5523cf4363ace2044089Nick Chalko                                                v.initialize(getActivity(), getDialog());
12295961816a768da387f0b5523cf4363ace2044089Nick Chalko                                                getDialog().setContentView(v);
12395961816a768da387f0b5523cf4363ace2044089Nick Chalko                                            }
12495961816a768da387f0b5523cf4363ace2044089Nick Chalko                                        },
12595961816a768da387f0b5523cf4363ace2044089Nick Chalko                                        TRANSITION_INTERVAL_MS);
126816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                    }
12795961816a768da387f0b5523cf4363ace2044089Nick Chalko                });
128816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    }
129816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
13095961816a768da387f0b5523cf4363ace2044089Nick Chalko    /** Called when an enter animation starts. Sub-view specific animation can be implemented. */
13195961816a768da387f0b5523cf4363ace2044089Nick Chalko    protected void onStartEnterAnimation(TimeInterpolator interpolator, long duration) {}
13207b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko
13395961816a768da387f0b5523cf4363ace2044089Nick Chalko    /** Called when an exit animation starts. Sub-view specific animation can be implemented. */
13495961816a768da387f0b5523cf4363ace2044089Nick Chalko    protected void onStartExitAnimation(
13595961816a768da387f0b5523cf4363ace2044089Nick Chalko            TimeInterpolator interpolator, long duration, Runnable onAnimationEnded) {}
13607b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko
137816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    private void startEnterAnimation() {
13807b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko        if (DEBUG) Log.d(TAG, "start an enter animation");
13907b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko        View backgroundView = findViewById(R.id.background);
140816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        if (!mSkipEnterAlphaAnimation) {
14107b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko            backgroundView.setAlpha(0);
14295961816a768da387f0b5523cf4363ace2044089Nick Chalko            backgroundView
14395961816a768da387f0b5523cf4363ace2044089Nick Chalko                    .animate()
144816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                    .alpha(1.0f)
145816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                    .setInterpolator(mLinearOutSlowIn)
146816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                    .setDuration(FADE_IN_DURATION_MS)
14707b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko                    .withLayer()
148816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                    .start();
149816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        }
15007b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko        onStartEnterAnimation(mLinearOutSlowIn, FADE_IN_DURATION_MS);
151816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    }
152816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
153816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    private void startExitAnimation(final Runnable onAnimationEnded) {
15407b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko        if (DEBUG) Log.d(TAG, "start an exit animation");
15507b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko        View backgroundView = findViewById(R.id.background);
156816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        if (!mSkipExitAlphaAnimation) {
15795961816a768da387f0b5523cf4363ace2044089Nick Chalko            backgroundView
15895961816a768da387f0b5523cf4363ace2044089Nick Chalko                    .animate()
159816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                    .alpha(0.0f)
160816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                    .setInterpolator(mFastOutLinearIn)
161816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                    .setDuration(FADE_OUT_DURATION_MS)
16207b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko                    .withLayer()
163816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                    .start();
164816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        }
16507b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko        onStartExitAnimation(mFastOutLinearIn, FADE_OUT_DURATION_MS, onAnimationEnded);
166816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    }
167816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko}
168