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.RecyclerView; 22b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajanimport android.util.AttributeSet; 23c81082b7ee925aeeb7edddbb181dc365a4600be1Sid Soundararajanimport android.util.Log; 24b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajanimport android.view.LayoutInflater; 25b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajanimport android.view.View; 26b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajanimport android.view.WindowInsets; 27b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajanimport android.widget.FrameLayout; 28c0d7058b14c24cd07912f5629c26b39b7b4673d5Winson 29b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajanimport com.android.systemui.R; 30b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajanimport com.android.systemui.recents.Recents; 31b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajanimport com.android.systemui.recents.RecentsActivity; 32b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajanimport com.android.systemui.recents.RecentsActivityLaunchState; 33b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajanimport com.android.systemui.recents.RecentsConfiguration; 34b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajanimport com.android.systemui.recents.events.EventBus; 35b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajanimport com.android.systemui.recents.events.activity.CancelEnterRecentsWindowAnimationEvent; 36b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajanimport com.android.systemui.recents.events.activity.DismissRecentsToHomeAnimationStarted; 371008cc25863be3d86e01c15eeabe9dfedb963224Sid Soundararajanimport com.android.systemui.recents.events.activity.LaunchTvTaskEvent; 38b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajanimport com.android.systemui.recents.events.component.RecentsVisibilityChangedEvent; 39b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajanimport com.android.systemui.recents.misc.SystemServicesProxy; 40b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajanimport com.android.systemui.recents.model.Task; 41b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajanimport com.android.systemui.recents.model.TaskStack; 4204cbe870ae6c8721d6322c248d40bb94a9cb5a09Jaewan Kimimport com.android.systemui.recents.tv.animations.RecentsRowFocusAnimationHolder; 43c81082b7ee925aeeb7edddbb181dc365a4600be1Sid Soundararajanimport android.support.v7.widget.RecyclerView.OnScrollListener; 44c81082b7ee925aeeb7edddbb181dc365a4600be1Sid Soundararajanimport static android.app.ActivityManager.StackId.INVALID_STACK_ID; 45b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan 46b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan/** 47b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan * Top level layout of recents for TV. This will show the TaskStacks using a HorizontalGridView. 48b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan */ 49b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajanpublic class RecentsTvView extends FrameLayout { 50b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan 51b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan private static final String TAG = "RecentsTvView"; 52b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan private static final boolean DEBUG = false; 53b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan 54b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan private TaskStack mStack; 55b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan private TaskStackHorizontalGridView mTaskStackHorizontalView; 56b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan private View mEmptyView; 5717d29b6d70a23d56c55a50cce00ffa66ed58ac63Sid Soundararajan private View mDismissPlaceholder; 5804cbe870ae6c8721d6322c248d40bb94a9cb5a09Jaewan Kim private RecentsRowFocusAnimationHolder mEmptyViewFocusAnimationHolder; 59b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan private boolean mAwaitingFirstLayout = true; 60b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan private Rect mSystemInsets = new Rect(); 611008cc25863be3d86e01c15eeabe9dfedb963224Sid Soundararajan private RecentsTvTransitionHelper mTransitionHelper; 62a9e0621f33233c43f29e876b6c1055cf1dc855fcJaewan Kim private final Handler mHandler = new Handler(); 63c81082b7ee925aeeb7edddbb181dc365a4600be1Sid Soundararajan private OnScrollListener mScrollListener; 64b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan public RecentsTvView(Context context) { 65b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan this(context, null); 66b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan } 67b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan 68b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan public RecentsTvView(Context context, AttributeSet attrs) { 69b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan this(context, attrs, 0); 70b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan } 71b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan 72b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan public RecentsTvView(Context context, AttributeSet attrs, int defStyleAttr) { 73b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan this(context, attrs, defStyleAttr, 0); 74b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan } 75b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan 76b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan public RecentsTvView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { 77b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan super(context, attrs, defStyleAttr, defStyleRes); 78b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan 79b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan setWillNotDraw(false); 80b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan 81b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan LayoutInflater inflater = LayoutInflater.from(context); 82724971bac79770c538fb53e399f3b3b14328f126Sid Soundararajan mEmptyView = inflater.inflate(R.layout.recents_tv_empty, this, false); 83b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan addView(mEmptyView); 8404cbe870ae6c8721d6322c248d40bb94a9cb5a09Jaewan Kim 851008cc25863be3d86e01c15eeabe9dfedb963224Sid Soundararajan mTransitionHelper = new RecentsTvTransitionHelper(mContext, mHandler); 86b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan } 87b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan 8817d29b6d70a23d56c55a50cce00ffa66ed58ac63Sid Soundararajan @Override 8917d29b6d70a23d56c55a50cce00ffa66ed58ac63Sid Soundararajan protected void onFinishInflate() { 9017d29b6d70a23d56c55a50cce00ffa66ed58ac63Sid Soundararajan super.onFinishInflate(); 9117d29b6d70a23d56c55a50cce00ffa66ed58ac63Sid Soundararajan mDismissPlaceholder = findViewById(R.id.dismiss_placeholder); 92a9e0621f33233c43f29e876b6c1055cf1dc855fcJaewan Kim mTaskStackHorizontalView = (TaskStackHorizontalGridView) findViewById(R.id.task_list); 9317d29b6d70a23d56c55a50cce00ffa66ed58ac63Sid Soundararajan } 9417d29b6d70a23d56c55a50cce00ffa66ed58ac63Sid Soundararajan 95a9e0621f33233c43f29e876b6c1055cf1dc855fcJaewan Kim /** 96a9e0621f33233c43f29e876b6c1055cf1dc855fcJaewan Kim * Initialize the view. 97a9e0621f33233c43f29e876b6c1055cf1dc855fcJaewan Kim */ 98a9e0621f33233c43f29e876b6c1055cf1dc855fcJaewan Kim public void init(TaskStack stack) { 99b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan RecentsConfiguration config = Recents.getConfiguration(); 100b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan RecentsActivityLaunchState launchState = config.getLaunchState(); 101b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan mStack = stack; 102b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan 103a9e0621f33233c43f29e876b6c1055cf1dc855fcJaewan Kim mTaskStackHorizontalView.init(stack); 104b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan 105b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan if (stack.getStackTaskCount() > 0) { 106b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan hideEmptyView(); 107b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan } else { 108b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan showEmptyView(); 109b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan } 110b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan 111a9e0621f33233c43f29e876b6c1055cf1dc855fcJaewan Kim // Layout with the new stack 112b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan requestLayout(); 113b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan } 114b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan 115b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan public boolean launchFocusedTask() { 116b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan if (mTaskStackHorizontalView != null) { 117b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan Task task = mTaskStackHorizontalView.getFocusedTask(); 118b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan if (task != null) { 119419c89533a148d0037e98b801068bb81f8a2cd2aJaewan Kim launchTaskFomRecents(task, true); 120b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan return true; 121b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan } 122b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan } 123b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan return false; 124b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan } 125b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan 126b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan /** Launches the task that recents was launched from if possible */ 127419c89533a148d0037e98b801068bb81f8a2cd2aJaewan Kim public boolean launchPreviousTask(boolean animate) { 128b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan if (mTaskStackHorizontalView != null) { 129b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan TaskStack stack = mTaskStackHorizontalView.getStack(); 130b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan Task task = stack.getLaunchTarget(); 131b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan if (task != null) { 132419c89533a148d0037e98b801068bb81f8a2cd2aJaewan Kim launchTaskFomRecents(task, animate); 133b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan return true; 134b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan } 135b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan } 136b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan return false; 137b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan } 138b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan 139c81082b7ee925aeeb7edddbb181dc365a4600be1Sid Soundararajan /** 140c81082b7ee925aeeb7edddbb181dc365a4600be1Sid Soundararajan * Launch the given task from recents with animation. If the task is not focused, this will 141c81082b7ee925aeeb7edddbb181dc365a4600be1Sid Soundararajan * attempt to scroll to focus the task before launching. 142c81082b7ee925aeeb7edddbb181dc365a4600be1Sid Soundararajan * @param task 143c81082b7ee925aeeb7edddbb181dc365a4600be1Sid Soundararajan */ 144419c89533a148d0037e98b801068bb81f8a2cd2aJaewan Kim private void launchTaskFomRecents(final Task task, boolean animate) { 145419c89533a148d0037e98b801068bb81f8a2cd2aJaewan Kim if (!animate) { 146419c89533a148d0037e98b801068bb81f8a2cd2aJaewan Kim SystemServicesProxy ssp = Recents.getSystemServices(); 147419c89533a148d0037e98b801068bb81f8a2cd2aJaewan Kim ssp.startActivityFromRecents(getContext(), task.key, task.title, null); 148419c89533a148d0037e98b801068bb81f8a2cd2aJaewan Kim return; 149419c89533a148d0037e98b801068bb81f8a2cd2aJaewan Kim } 150419c89533a148d0037e98b801068bb81f8a2cd2aJaewan Kim mTaskStackHorizontalView.requestFocus(); 151419c89533a148d0037e98b801068bb81f8a2cd2aJaewan Kim Task focusedTask = mTaskStackHorizontalView.getFocusedTask(); 152419c89533a148d0037e98b801068bb81f8a2cd2aJaewan Kim if (focusedTask != null && task != focusedTask) { 153419c89533a148d0037e98b801068bb81f8a2cd2aJaewan Kim if (mScrollListener != null) { 154c81082b7ee925aeeb7edddbb181dc365a4600be1Sid Soundararajan mTaskStackHorizontalView.removeOnScrollListener(mScrollListener); 155b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan } 156c81082b7ee925aeeb7edddbb181dc365a4600be1Sid Soundararajan mScrollListener = new OnScrollListener() { 157c81082b7ee925aeeb7edddbb181dc365a4600be1Sid Soundararajan @Override 158c81082b7ee925aeeb7edddbb181dc365a4600be1Sid Soundararajan public void onScrollStateChanged(RecyclerView recyclerView, int newState) { 159c81082b7ee925aeeb7edddbb181dc365a4600be1Sid Soundararajan super.onScrollStateChanged(recyclerView, newState); 160419c89533a148d0037e98b801068bb81f8a2cd2aJaewan Kim if (newState == RecyclerView.SCROLL_STATE_IDLE) { 161c81082b7ee925aeeb7edddbb181dc365a4600be1Sid Soundararajan TaskCardView cardView = mTaskStackHorizontalView.getChildViewForTask(task); 162419c89533a148d0037e98b801068bb81f8a2cd2aJaewan Kim if (cardView != null) { 163c81082b7ee925aeeb7edddbb181dc365a4600be1Sid Soundararajan mTransitionHelper.launchTaskFromRecents(mStack, task, 164c81082b7ee925aeeb7edddbb181dc365a4600be1Sid Soundararajan mTaskStackHorizontalView, cardView, null, INVALID_STACK_ID); 165c81082b7ee925aeeb7edddbb181dc365a4600be1Sid Soundararajan } else { 166c81082b7ee925aeeb7edddbb181dc365a4600be1Sid Soundararajan // This should not happen normally. If this happens then the data in 167c81082b7ee925aeeb7edddbb181dc365a4600be1Sid Soundararajan // the grid view was altered during the scroll. Log error and launch 168c81082b7ee925aeeb7edddbb181dc365a4600be1Sid Soundararajan // task with no animation. 169c81082b7ee925aeeb7edddbb181dc365a4600be1Sid Soundararajan Log.e(TAG, "Card view for task : " + task + ", returned null."); 170c81082b7ee925aeeb7edddbb181dc365a4600be1Sid Soundararajan SystemServicesProxy ssp = Recents.getSystemServices(); 171c81082b7ee925aeeb7edddbb181dc365a4600be1Sid Soundararajan ssp.startActivityFromRecents(getContext(), task.key, task.title, null); 172c81082b7ee925aeeb7edddbb181dc365a4600be1Sid Soundararajan } 173c81082b7ee925aeeb7edddbb181dc365a4600be1Sid Soundararajan mTaskStackHorizontalView.removeOnScrollListener(mScrollListener); 174c81082b7ee925aeeb7edddbb181dc365a4600be1Sid Soundararajan } 175c81082b7ee925aeeb7edddbb181dc365a4600be1Sid Soundararajan } 176c81082b7ee925aeeb7edddbb181dc365a4600be1Sid Soundararajan }; 177c81082b7ee925aeeb7edddbb181dc365a4600be1Sid Soundararajan mTaskStackHorizontalView.addOnScrollListener(mScrollListener); 178c81082b7ee925aeeb7edddbb181dc365a4600be1Sid Soundararajan mTaskStackHorizontalView.setSelectedPositionSmooth( 179c81082b7ee925aeeb7edddbb181dc365a4600be1Sid Soundararajan ((TaskStackHorizontalViewAdapter) mTaskStackHorizontalView.getAdapter()) 180c81082b7ee925aeeb7edddbb181dc365a4600be1Sid Soundararajan .getPositionOfTask(task)); 181c81082b7ee925aeeb7edddbb181dc365a4600be1Sid Soundararajan } else { 182c81082b7ee925aeeb7edddbb181dc365a4600be1Sid Soundararajan mTransitionHelper.launchTaskFromRecents(mStack, task, mTaskStackHorizontalView, 183c81082b7ee925aeeb7edddbb181dc365a4600be1Sid Soundararajan mTaskStackHorizontalView.getChildViewForTask(task), null, 184c81082b7ee925aeeb7edddbb181dc365a4600be1Sid Soundararajan INVALID_STACK_ID); 185b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan } 186b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan } 187b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan 188b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan /** 189b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan * Hides the task stack and shows the empty view. 190b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan */ 191b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan public void showEmptyView() { 192b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan mEmptyView.setVisibility(View.VISIBLE); 19304cbe870ae6c8721d6322c248d40bb94a9cb5a09Jaewan Kim mTaskStackHorizontalView.setVisibility(View.GONE); 19417d29b6d70a23d56c55a50cce00ffa66ed58ac63Sid Soundararajan if (Recents.getSystemServices().isTouchExplorationEnabled()) { 19517d29b6d70a23d56c55a50cce00ffa66ed58ac63Sid Soundararajan mDismissPlaceholder.setVisibility(View.GONE); 19617d29b6d70a23d56c55a50cce00ffa66ed58ac63Sid Soundararajan } 197b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan } 198b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan 199b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan /** 200b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan * Shows the task stack and hides the empty view. 201b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan */ 202b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan public void hideEmptyView() { 20304cbe870ae6c8721d6322c248d40bb94a9cb5a09Jaewan Kim mEmptyView.setVisibility(View.GONE); 20404cbe870ae6c8721d6322c248d40bb94a9cb5a09Jaewan Kim mTaskStackHorizontalView.setVisibility(View.VISIBLE); 20517d29b6d70a23d56c55a50cce00ffa66ed58ac63Sid Soundararajan if (Recents.getSystemServices().isTouchExplorationEnabled()) { 20617d29b6d70a23d56c55a50cce00ffa66ed58ac63Sid Soundararajan mDismissPlaceholder.setVisibility(View.VISIBLE); 20717d29b6d70a23d56c55a50cce00ffa66ed58ac63Sid Soundararajan } 208b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan } 209b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan 210b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan /** 211b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan * Returns the last known system insets. 212b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan */ 213b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan public Rect getSystemInsets() { 214b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan return mSystemInsets; 215b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan } 216b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan 217b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan @Override 218b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan protected void onAttachedToWindow() { 219b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan EventBus.getDefault().register(this, RecentsActivity.EVENT_BUS_PRIORITY + 1); 220b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan super.onAttachedToWindow(); 221b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan } 222b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan 223b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan @Override 224b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan protected void onDetachedFromWindow() { 225b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan super.onDetachedFromWindow(); 226b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan EventBus.getDefault().unregister(this); 227b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan } 228b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan 229b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan @Override 230b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan public WindowInsets onApplyWindowInsets(WindowInsets insets) { 231b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan mSystemInsets.set(insets.getSystemWindowInsets()); 232b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan requestLayout(); 233b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan return insets; 234b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan } 235b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan 236b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan /**** EventBus Events ****/ 237b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan 2381008cc25863be3d86e01c15eeabe9dfedb963224Sid Soundararajan public final void onBusEvent(LaunchTvTaskEvent event) { 2391008cc25863be3d86e01c15eeabe9dfedb963224Sid Soundararajan mTransitionHelper.launchTaskFromRecents(mStack, event.task, mTaskStackHorizontalView, 2401008cc25863be3d86e01c15eeabe9dfedb963224Sid Soundararajan event.taskView, event.targetTaskBounds, event.targetTaskStack); 2411008cc25863be3d86e01c15eeabe9dfedb963224Sid Soundararajan } 2421008cc25863be3d86e01c15eeabe9dfedb963224Sid Soundararajan 243b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan public final void onBusEvent(DismissRecentsToHomeAnimationStarted event) { 244b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan // If we are going home, cancel the previous task's window transition 245b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan EventBus.getDefault().send(new CancelEnterRecentsWindowAnimationEvent(null)); 246b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan } 247b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan 248b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan public final void onBusEvent(RecentsVisibilityChangedEvent event) { 249b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan if (!event.visible) { 250b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan // Reset the view state 251b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan mAwaitingFirstLayout = true; 252b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan } 253b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan } 254b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan 25567ed54a724df258738062e60d7f702f396502b49Sid Soundararajan public TaskStackHorizontalGridView setTaskStackViewAdapter( 25667ed54a724df258738062e60d7f702f396502b49Sid Soundararajan TaskStackHorizontalViewAdapter taskStackViewAdapter) { 25785b0a0f1eccc0c32a2032385f2f199c76c50a917Sid Soundararajan if (mTaskStackHorizontalView != null) { 258b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan mTaskStackHorizontalView.setAdapter(taskStackViewAdapter); 25985b0a0f1eccc0c32a2032385f2f199c76c50a917Sid Soundararajan taskStackViewAdapter.setTaskStackHorizontalGridView(mTaskStackHorizontalView); 260b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan } 26167ed54a724df258738062e60d7f702f396502b49Sid Soundararajan return mTaskStackHorizontalView; 26267ed54a724df258738062e60d7f702f396502b49Sid Soundararajan } 26367ed54a724df258738062e60d7f702f396502b49Sid Soundararajan 26467ed54a724df258738062e60d7f702f396502b49Sid Soundararajan public TaskStackHorizontalGridView getGridView() { 26567ed54a724df258738062e60d7f702f396502b49Sid Soundararajan return mTaskStackHorizontalView; 266b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan } 267b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan} 268