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