RecentsTvView.java revision c81082b7ee925aeeb7edddbb181dc365a4600be1
1b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan/* 2b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan * Copyright (C) 2016 The Android Open Source Project 3b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan * 4b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan * Licensed under the Apache License, Version 2.0 (the "License"); 5b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan * you may not use this file except in compliance with the License. 6b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan * You may obtain a copy of the License at 7b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan * 8b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan * http://www.apache.org/licenses/LICENSE-2.0 9b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan * 10b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan * Unless required by applicable law or agreed to in writing, software 11b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan * distributed under the License is distributed on an "AS IS" BASIS, 12b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan * See the License for the specific language governing permissions and 14b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan * limitations under the License. 15b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan */ 16b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajanpackage com.android.systemui.recents.tv.views; 17b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan 18b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajanimport android.content.Context; 19b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajanimport android.graphics.Rect; 201008cc25863be3d86e01c15eeabe9dfedb963224Sid Soundararajanimport android.os.Handler; 21c81082b7ee925aeeb7edddbb181dc365a4600be1Sid Soundararajanimport android.support.v7.widget.DefaultItemAnimator; 22c81082b7ee925aeeb7edddbb181dc365a4600be1Sid Soundararajanimport android.support.v7.widget.RecyclerView; 23b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajanimport android.util.AttributeSet; 24c81082b7ee925aeeb7edddbb181dc365a4600be1Sid Soundararajanimport android.util.Log; 25b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajanimport android.view.LayoutInflater; 26b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajanimport android.view.View; 27b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajanimport android.view.WindowInsets; 28b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajanimport android.widget.FrameLayout; 29c0d7058b14c24cd07912f5629c26b39b7b4673d5Winson 30b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajanimport com.android.systemui.R; 31b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajanimport com.android.systemui.recents.Recents; 32b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajanimport com.android.systemui.recents.RecentsActivity; 33b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajanimport com.android.systemui.recents.RecentsActivityLaunchState; 34b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajanimport com.android.systemui.recents.RecentsConfiguration; 35b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajanimport com.android.systemui.recents.events.EventBus; 36b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajanimport com.android.systemui.recents.events.activity.CancelEnterRecentsWindowAnimationEvent; 37b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajanimport com.android.systemui.recents.events.activity.DismissRecentsToHomeAnimationStarted; 38c81082b7ee925aeeb7edddbb181dc365a4600be1Sid Soundararajanimport com.android.systemui.recents.events.activity.ExitRecentsWindowFirstAnimationFrameEvent; 391008cc25863be3d86e01c15eeabe9dfedb963224Sid Soundararajanimport com.android.systemui.recents.events.activity.LaunchTvTaskEvent; 40b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajanimport com.android.systemui.recents.events.component.RecentsVisibilityChangedEvent; 41b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajanimport com.android.systemui.recents.misc.SystemServicesProxy; 42b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajanimport com.android.systemui.recents.model.Task; 43b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajanimport com.android.systemui.recents.model.TaskStack; 4404cbe870ae6c8721d6322c248d40bb94a9cb5a09Jaewan Kimimport com.android.systemui.recents.tv.animations.RecentsRowFocusAnimationHolder; 45c81082b7ee925aeeb7edddbb181dc365a4600be1Sid Soundararajanimport android.support.v7.widget.RecyclerView.OnScrollListener; 46c81082b7ee925aeeb7edddbb181dc365a4600be1Sid Soundararajanimport static android.app.ActivityManager.StackId.INVALID_STACK_ID; 47b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan 48b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan/** 49b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan * Top level layout of recents for TV. This will show the TaskStacks using a HorizontalGridView. 50b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan */ 51b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajanpublic class RecentsTvView extends FrameLayout { 52b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan 53b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan private static final String TAG = "RecentsTvView"; 54b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan private static final boolean DEBUG = false; 55b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan 56b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan private TaskStack mStack; 57b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan private TaskStackHorizontalGridView mTaskStackHorizontalView; 58b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan private View mEmptyView; 5904cbe870ae6c8721d6322c248d40bb94a9cb5a09Jaewan Kim private RecentsRowFocusAnimationHolder mEmptyViewFocusAnimationHolder; 60b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan private boolean mAwaitingFirstLayout = true; 61b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan private Rect mSystemInsets = new Rect(); 621008cc25863be3d86e01c15eeabe9dfedb963224Sid Soundararajan private RecentsTvTransitionHelper mTransitionHelper; 631008cc25863be3d86e01c15eeabe9dfedb963224Sid Soundararajan private Handler mHandler; 64c81082b7ee925aeeb7edddbb181dc365a4600be1Sid Soundararajan private OnScrollListener mScrollListener; 65b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan public RecentsTvView(Context context) { 66b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan this(context, null); 67b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan } 68b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan 69b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan public RecentsTvView(Context context, AttributeSet attrs) { 70b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan this(context, attrs, 0); 71b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan } 72b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan 73b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan public RecentsTvView(Context context, AttributeSet attrs, int defStyleAttr) { 74b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan this(context, attrs, defStyleAttr, 0); 75b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan } 76b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan 77b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan public RecentsTvView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { 78b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan super(context, attrs, defStyleAttr, defStyleRes); 79b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan 80b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan setWillNotDraw(false); 81b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan 82b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan LayoutInflater inflater = LayoutInflater.from(context); 83b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan mEmptyView = inflater.inflate(R.layout.recents_empty, this, false); 84b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan addView(mEmptyView); 8504cbe870ae6c8721d6322c248d40bb94a9cb5a09Jaewan Kim mEmptyViewFocusAnimationHolder = new RecentsRowFocusAnimationHolder(mEmptyView, null); 8604cbe870ae6c8721d6322c248d40bb94a9cb5a09Jaewan Kim 871008cc25863be3d86e01c15eeabe9dfedb963224Sid Soundararajan mHandler = new Handler(); 881008cc25863be3d86e01c15eeabe9dfedb963224Sid Soundararajan mTransitionHelper = new RecentsTvTransitionHelper(mContext, mHandler); 89b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan } 90b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan 91b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan public void setTaskStack(TaskStack stack) { 92b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan RecentsConfiguration config = Recents.getConfiguration(); 93b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan RecentsActivityLaunchState launchState = config.getLaunchState(); 94b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan mStack = stack; 95b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan 96b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan if (mTaskStackHorizontalView != null) { 97b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan mTaskStackHorizontalView.reset(); 98b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan mTaskStackHorizontalView.setStack(stack); 99b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan } else { 100b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan mTaskStackHorizontalView = (TaskStackHorizontalGridView) findViewById(R.id.task_list); 101b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan mTaskStackHorizontalView.setStack(stack); 102b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan } 103b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan 104b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan if (stack.getStackTaskCount() > 0) { 105b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan hideEmptyView(); 106b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan } else { 107b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan showEmptyView(); 108b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan } 109b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan 110b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan requestLayout(); 111b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan } 112b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan 113b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan public boolean launchFocusedTask() { 114b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan if (mTaskStackHorizontalView != null) { 115b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan Task task = mTaskStackHorizontalView.getFocusedTask(); 116b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan if (task != null) { 117c81082b7ee925aeeb7edddbb181dc365a4600be1Sid Soundararajan launchTaskFomRecents(task); 118b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan return true; 119b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan } 120b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan } 121b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan return false; 122b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan } 123b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan 124b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan /** Launches the task that recents was launched from if possible */ 125b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan public boolean launchPreviousTask() { 126b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan if (mTaskStackHorizontalView != null) { 127b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan TaskStack stack = mTaskStackHorizontalView.getStack(); 128b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan Task task = stack.getLaunchTarget(); 129b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan if (task != null) { 130c81082b7ee925aeeb7edddbb181dc365a4600be1Sid Soundararajan launchTaskFomRecents(task); 131b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan return true; 132b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan } 133b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan } 134b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan return false; 135b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan } 136b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan 137c81082b7ee925aeeb7edddbb181dc365a4600be1Sid Soundararajan /** 138c81082b7ee925aeeb7edddbb181dc365a4600be1Sid Soundararajan * Launch the given task from recents with animation. If the task is not focused, this will 139c81082b7ee925aeeb7edddbb181dc365a4600be1Sid Soundararajan * attempt to scroll to focus the task before launching. 140c81082b7ee925aeeb7edddbb181dc365a4600be1Sid Soundararajan * @param task 141c81082b7ee925aeeb7edddbb181dc365a4600be1Sid Soundararajan */ 142c81082b7ee925aeeb7edddbb181dc365a4600be1Sid Soundararajan private void launchTaskFomRecents(final Task task) { 143c81082b7ee925aeeb7edddbb181dc365a4600be1Sid Soundararajan if(task != mTaskStackHorizontalView.getFocusedTask()) { 144c81082b7ee925aeeb7edddbb181dc365a4600be1Sid Soundararajan if(mScrollListener != null) { 145c81082b7ee925aeeb7edddbb181dc365a4600be1Sid Soundararajan mTaskStackHorizontalView.removeOnScrollListener(mScrollListener); 146b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan } 147c81082b7ee925aeeb7edddbb181dc365a4600be1Sid Soundararajan mScrollListener = new OnScrollListener() { 148c81082b7ee925aeeb7edddbb181dc365a4600be1Sid Soundararajan @Override 149c81082b7ee925aeeb7edddbb181dc365a4600be1Sid Soundararajan public void onScrollStateChanged(RecyclerView recyclerView, int newState) { 150c81082b7ee925aeeb7edddbb181dc365a4600be1Sid Soundararajan super.onScrollStateChanged(recyclerView, newState); 151c81082b7ee925aeeb7edddbb181dc365a4600be1Sid Soundararajan if(newState == RecyclerView.SCROLL_STATE_IDLE) { 152c81082b7ee925aeeb7edddbb181dc365a4600be1Sid Soundararajan TaskCardView cardView = mTaskStackHorizontalView.getChildViewForTask(task); 153c81082b7ee925aeeb7edddbb181dc365a4600be1Sid Soundararajan if(cardView != null) { 154c81082b7ee925aeeb7edddbb181dc365a4600be1Sid Soundararajan mTransitionHelper.launchTaskFromRecents(mStack, task, 155c81082b7ee925aeeb7edddbb181dc365a4600be1Sid Soundararajan mTaskStackHorizontalView, cardView, null, INVALID_STACK_ID); 156c81082b7ee925aeeb7edddbb181dc365a4600be1Sid Soundararajan } else { 157c81082b7ee925aeeb7edddbb181dc365a4600be1Sid Soundararajan // This should not happen normally. If this happens then the data in 158c81082b7ee925aeeb7edddbb181dc365a4600be1Sid Soundararajan // the grid view was altered during the scroll. Log error and launch 159c81082b7ee925aeeb7edddbb181dc365a4600be1Sid Soundararajan // task with no animation. 160c81082b7ee925aeeb7edddbb181dc365a4600be1Sid Soundararajan Log.e(TAG, "Card view for task : " + task + ", returned null."); 161c81082b7ee925aeeb7edddbb181dc365a4600be1Sid Soundararajan SystemServicesProxy ssp = Recents.getSystemServices(); 162c81082b7ee925aeeb7edddbb181dc365a4600be1Sid Soundararajan ssp.startActivityFromRecents(getContext(), task.key, task.title, null); 163c81082b7ee925aeeb7edddbb181dc365a4600be1Sid Soundararajan } 164c81082b7ee925aeeb7edddbb181dc365a4600be1Sid Soundararajan mTaskStackHorizontalView.removeOnScrollListener(mScrollListener); 165c81082b7ee925aeeb7edddbb181dc365a4600be1Sid Soundararajan } 166c81082b7ee925aeeb7edddbb181dc365a4600be1Sid Soundararajan } 167c81082b7ee925aeeb7edddbb181dc365a4600be1Sid Soundararajan }; 168c81082b7ee925aeeb7edddbb181dc365a4600be1Sid Soundararajan mTaskStackHorizontalView.addOnScrollListener(mScrollListener); 169c81082b7ee925aeeb7edddbb181dc365a4600be1Sid Soundararajan mTaskStackHorizontalView.setSelectedPositionSmooth( 170c81082b7ee925aeeb7edddbb181dc365a4600be1Sid Soundararajan ((TaskStackHorizontalViewAdapter) mTaskStackHorizontalView.getAdapter()) 171c81082b7ee925aeeb7edddbb181dc365a4600be1Sid Soundararajan .getPositionOfTask(task)); 172c81082b7ee925aeeb7edddbb181dc365a4600be1Sid Soundararajan } else { 173c81082b7ee925aeeb7edddbb181dc365a4600be1Sid Soundararajan mTransitionHelper.launchTaskFromRecents(mStack, task, mTaskStackHorizontalView, 174c81082b7ee925aeeb7edddbb181dc365a4600be1Sid Soundararajan mTaskStackHorizontalView.getChildViewForTask(task), null, 175c81082b7ee925aeeb7edddbb181dc365a4600be1Sid Soundararajan INVALID_STACK_ID); 176b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan } 177b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan } 178b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan 179b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan /** 18004cbe870ae6c8721d6322c248d40bb94a9cb5a09Jaewan Kim * Starts the focus change animation. 18104cbe870ae6c8721d6322c248d40bb94a9cb5a09Jaewan Kim */ 18204cbe870ae6c8721d6322c248d40bb94a9cb5a09Jaewan Kim public void startRecentsRowFocusAnimation(boolean hasFocus) { 18304cbe870ae6c8721d6322c248d40bb94a9cb5a09Jaewan Kim if (mEmptyView.getVisibility() == View.VISIBLE) { 18404cbe870ae6c8721d6322c248d40bb94a9cb5a09Jaewan Kim mEmptyViewFocusAnimationHolder.getFocusChangeAnimator(hasFocus).start(); 18504cbe870ae6c8721d6322c248d40bb94a9cb5a09Jaewan Kim } else { 18604cbe870ae6c8721d6322c248d40bb94a9cb5a09Jaewan Kim mTaskStackHorizontalView.startRecentsRowFocusAnimation(hasFocus); 18704cbe870ae6c8721d6322c248d40bb94a9cb5a09Jaewan Kim } 18804cbe870ae6c8721d6322c248d40bb94a9cb5a09Jaewan Kim } 18904cbe870ae6c8721d6322c248d40bb94a9cb5a09Jaewan Kim 19004cbe870ae6c8721d6322c248d40bb94a9cb5a09Jaewan Kim /** 191b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan * Hides the task stack and shows the empty view. 192b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan */ 193b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan public void showEmptyView() { 194b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan mEmptyView.setVisibility(View.VISIBLE); 19504cbe870ae6c8721d6322c248d40bb94a9cb5a09Jaewan Kim mTaskStackHorizontalView.setVisibility(View.GONE); 196b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan } 197b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan 198b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan /** 199b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan * Shows the task stack and hides the empty view. 200b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan */ 201b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan public void hideEmptyView() { 20204cbe870ae6c8721d6322c248d40bb94a9cb5a09Jaewan Kim mEmptyView.setVisibility(View.GONE); 20304cbe870ae6c8721d6322c248d40bb94a9cb5a09Jaewan Kim mTaskStackHorizontalView.setVisibility(View.VISIBLE); 204b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan } 205b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan 206b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan /** 207b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan * Returns the last known system insets. 208b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan */ 209b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan public Rect getSystemInsets() { 210b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan return mSystemInsets; 211b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan } 212b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan 213b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan @Override 214b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan protected void onAttachedToWindow() { 215b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan EventBus.getDefault().register(this, RecentsActivity.EVENT_BUS_PRIORITY + 1); 216b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan super.onAttachedToWindow(); 217b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan } 218b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan 219b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan @Override 220b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan protected void onDetachedFromWindow() { 221b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan super.onDetachedFromWindow(); 222b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan EventBus.getDefault().unregister(this); 223b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan } 224b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan 225b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan @Override 226b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan public WindowInsets onApplyWindowInsets(WindowInsets insets) { 227b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan mSystemInsets.set(insets.getSystemWindowInsets()); 228b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan requestLayout(); 229b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan return insets; 230b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan } 231b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan 232b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan /**** EventBus Events ****/ 233b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan 2341008cc25863be3d86e01c15eeabe9dfedb963224Sid Soundararajan public final void onBusEvent(LaunchTvTaskEvent event) { 2351008cc25863be3d86e01c15eeabe9dfedb963224Sid Soundararajan mTransitionHelper.launchTaskFromRecents(mStack, event.task, mTaskStackHorizontalView, 2361008cc25863be3d86e01c15eeabe9dfedb963224Sid Soundararajan event.taskView, event.targetTaskBounds, event.targetTaskStack); 2371008cc25863be3d86e01c15eeabe9dfedb963224Sid Soundararajan } 2381008cc25863be3d86e01c15eeabe9dfedb963224Sid Soundararajan 239b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan public final void onBusEvent(DismissRecentsToHomeAnimationStarted event) { 240b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan // If we are going home, cancel the previous task's window transition 241b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan EventBus.getDefault().send(new CancelEnterRecentsWindowAnimationEvent(null)); 242b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan } 243b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan 244b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan public final void onBusEvent(RecentsVisibilityChangedEvent event) { 245b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan if (!event.visible) { 246b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan // Reset the view state 247b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan mAwaitingFirstLayout = true; 248b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan } 249b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan } 250b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan 251b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan public void setTaskStackViewAdapter(TaskStackHorizontalViewAdapter taskStackViewAdapter) { 252b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan if(mTaskStackHorizontalView != null) { 253b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan mTaskStackHorizontalView.setAdapter(taskStackViewAdapter); 254b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan } 255b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan } 256b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan} 257