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