blob: f9b8700c1d46908a9b0f38acf1187184b44d2b66 [file] [log] [blame]
/*
* Copyright (C) 2016 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.systemui.recents.tv.views;
import android.animation.Animator;
import android.animation.AnimatorSet;
import android.content.Context;
import android.support.v17.leanback.widget.HorizontalGridView;
import android.util.AttributeSet;
import android.view.View;
import com.android.systemui.R;
import com.android.systemui.recents.RecentsActivity;
import com.android.systemui.recents.events.EventBus;
import com.android.systemui.recents.events.ui.AllTaskViewsDismissedEvent;
import com.android.systemui.recents.model.Task;
import com.android.systemui.recents.model.TaskStack;
import com.android.systemui.recents.model.TaskStack.TaskStackCallbacks;
import com.android.systemui.recents.views.AnimationProps;
/**
* Horizontal Grid View Implementation to show the Task Stack for TV.
*/
public class TaskStackHorizontalGridView extends HorizontalGridView implements TaskStackCallbacks {
private static final int ANIMATION_DELAY_MS = 50;
private static final int MSG_START_RECENT_ROW_FOCUS_ANIMATION = 100;
private TaskStack mStack;
private Task mFocusedTask;
private AnimatorSet mRecentsRowFocusAnimation;
public TaskStackHorizontalGridView(Context context) {
this(context, null);
}
public TaskStackHorizontalGridView(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
protected void onAttachedToWindow() {
EventBus.getDefault().register(this, RecentsActivity.EVENT_BUS_PRIORITY + 1);
setWindowAlignment(WINDOW_ALIGN_NO_EDGE);
setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_YES);
super.onAttachedToWindow();
}
@Override
protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
EventBus.getDefault().unregister(this);
}
/**
* Initializes the grid view.
* @param stack
*/
public void init(TaskStack stack) {
// Set new stack
mStack = stack;
if (mStack != null) {
mStack.setCallbacks(this);
}
}
/**
* @return Returns the task stack.
*/
public TaskStack getStack() {
return mStack;
}
/**
* @return - The focused task.
*/
public Task getFocusedTask() {
if (findFocus() != null) {
mFocusedTask = ((TaskCardView)findFocus()).getTask();
}
return mFocusedTask;
}
/**
* @param task
* @return Child view for given task
*/
public TaskCardView getChildViewForTask(Task task) {
for (int i = 0; i < getChildCount(); i++) {
TaskCardView tv = (TaskCardView) getChildAt(i);
if (tv.getTask() == task) {
return tv;
}
}
return null;
}
/**
* Starts the Recents row's focus gain animation.
*/
public void startFocusGainAnimation() {
for (int i = 0; i < getChildCount(); i++) {
TaskCardView v = (TaskCardView) getChildAt(i);
if (v.hasFocus()) {
v.getViewFocusAnimator().changeSize(true);
}
v.getRecentsRowFocusAnimationHolder().startFocusGainAnimation();
}
}
/**
* Starts the Recents row's focus loss animation.
*/
public void startFocusLossAnimation() {
for (int i = 0; i < getChildCount(); i++) {
TaskCardView v = (TaskCardView) getChildAt(i);
if (v.hasFocus()) {
v.getViewFocusAnimator().changeSize(false);
}
v.getRecentsRowFocusAnimationHolder().startFocusLossAnimation();
}
}
@Override
public void onStackTaskAdded(TaskStack stack, Task newTask) {
((TaskStackHorizontalViewAdapter) getAdapter()).addTaskAt(newTask,
stack.indexOfStackTask(newTask));
}
@Override
public void onStackTaskRemoved(TaskStack stack, Task removedTask, Task newFrontMostTask,
AnimationProps animation, boolean fromDockGesture) {
((TaskStackHorizontalViewAdapter) getAdapter()).removeTask(removedTask);
if (mFocusedTask == removedTask) {
mFocusedTask = null;
}
// If there are no remaining tasks, then just close recents
if (mStack.getStackTaskCount() == 0) {
boolean shouldFinishActivity = (mStack.getStackTaskCount() == 0);
if (shouldFinishActivity) {
EventBus.getDefault().send(new AllTaskViewsDismissedEvent(fromDockGesture
? R.string.recents_empty_message
: R.string.recents_empty_message_dismissed_all));
}
}
}
@Override
public void onStackTasksRemoved(TaskStack stack) {
// Do nothing
}
@Override
public void onStackTasksUpdated(TaskStack stack) {
// Do nothing
}
}