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