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 184bdb6879bd5f1b7e93e7e9ac236a073921862075Sid Soundararajanimport android.animation.Animator; 19c0d7058b14c24cd07912f5629c26b39b7b4673d5Winsonimport android.support.v7.widget.RecyclerView; 20b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajanimport android.util.Log; 21b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajanimport android.view.LayoutInflater; 22b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajanimport android.view.View; 23b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajanimport android.view.ViewGroup; 24c0d7058b14c24cd07912f5629c26b39b7b4673d5Winson 25b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajanimport com.android.systemui.R; 264332dda9a76191b0f055dedbea8d509a20d5c455Sid Soundararajanimport com.android.systemui.recents.Recents; 271008cc25863be3d86e01c15eeabe9dfedb963224Sid Soundararajanimport com.android.systemui.recents.events.EventBus; 281008cc25863be3d86e01c15eeabe9dfedb963224Sid Soundararajanimport com.android.systemui.recents.events.activity.LaunchTvTaskEvent; 294bdb6879bd5f1b7e93e7e9ac236a073921862075Sid Soundararajanimport com.android.systemui.recents.events.ui.DeleteTaskDataEvent; 304332dda9a76191b0f055dedbea8d509a20d5c455Sid Soundararajanimport com.android.systemui.recents.model.RecentsTaskLoader; 31b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajanimport com.android.systemui.recents.model.Task; 3285b0a0f1eccc0c32a2032385f2f199c76c50a917Sid Soundararajanimport com.android.systemui.recents.views.AnimationProps; 33b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan 34b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajanimport java.util.ArrayList; 35b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajanimport java.util.List; 36b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan 371008cc25863be3d86e01c15eeabe9dfedb963224Sid Soundararajanimport static android.app.ActivityManager.StackId.INVALID_STACK_ID; 381008cc25863be3d86e01c15eeabe9dfedb963224Sid Soundararajan 39b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajanpublic class TaskStackHorizontalViewAdapter extends 40b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan RecyclerView.Adapter<TaskStackHorizontalViewAdapter.ViewHolder> { 41b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan 421008cc25863be3d86e01c15eeabe9dfedb963224Sid Soundararajan //Full class name is 30 characters 431008cc25863be3d86e01c15eeabe9dfedb963224Sid Soundararajan private static final String TAG = "TaskStackViewAdapter"; 44b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan private List<Task> mTaskList; 4585b0a0f1eccc0c32a2032385f2f199c76c50a917Sid Soundararajan private TaskStackHorizontalGridView mGridView; 46b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan 474bdb6879bd5f1b7e93e7e9ac236a073921862075Sid Soundararajan public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{ 48b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan private TaskCardView mTaskCardView; 49b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan private Task mTask; 50b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan public ViewHolder(View v) { 51b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan super(v); 52a9e0621f33233c43f29e876b6c1055cf1dc855fcJaewan Kim mTaskCardView = (TaskCardView) v; 53b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan } 54b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan 55b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan public void init(Task task) { 56b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan mTaskCardView.init(task); 57b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan mTask = task; 58b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan mTaskCardView.setOnClickListener(this); 59b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan } 60b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan 61b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan @Override 62b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan public void onClick(View v) { 63b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan try { 644bdb6879bd5f1b7e93e7e9ac236a073921862075Sid Soundararajan if (mTaskCardView.isInDismissState()) { 654bdb6879bd5f1b7e93e7e9ac236a073921862075Sid Soundararajan mTaskCardView.startDismissTaskAnimation( 6685b0a0f1eccc0c32a2032385f2f199c76c50a917Sid Soundararajan getRemoveAtListener(getAdapterPosition(), mTaskCardView.getTask())); 674bdb6879bd5f1b7e93e7e9ac236a073921862075Sid Soundararajan } else { 684bdb6879bd5f1b7e93e7e9ac236a073921862075Sid Soundararajan EventBus.getDefault().send(new LaunchTvTaskEvent(mTaskCardView, mTask, 694bdb6879bd5f1b7e93e7e9ac236a073921862075Sid Soundararajan null, INVALID_STACK_ID)); 704bdb6879bd5f1b7e93e7e9ac236a073921862075Sid Soundararajan } 71b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan } catch (Exception e) { 72b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan Log.e(TAG, v.getContext() 73b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan .getString(R.string.recents_launch_error_message, mTask.title), e); 74b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan } 75b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan 76b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan } 7785b0a0f1eccc0c32a2032385f2f199c76c50a917Sid Soundararajan 7885b0a0f1eccc0c32a2032385f2f199c76c50a917Sid Soundararajan private Animator.AnimatorListener getRemoveAtListener(final int position, 7985b0a0f1eccc0c32a2032385f2f199c76c50a917Sid Soundararajan final Task task) { 8085b0a0f1eccc0c32a2032385f2f199c76c50a917Sid Soundararajan return new Animator.AnimatorListener() { 8185b0a0f1eccc0c32a2032385f2f199c76c50a917Sid Soundararajan 8285b0a0f1eccc0c32a2032385f2f199c76c50a917Sid Soundararajan @Override 8385b0a0f1eccc0c32a2032385f2f199c76c50a917Sid Soundararajan public void onAnimationStart(Animator animation) { } 8485b0a0f1eccc0c32a2032385f2f199c76c50a917Sid Soundararajan 8585b0a0f1eccc0c32a2032385f2f199c76c50a917Sid Soundararajan @Override 8685b0a0f1eccc0c32a2032385f2f199c76c50a917Sid Soundararajan public void onAnimationEnd(Animator animation) { 87060fcd3f86e87e5829c673686e8e32f3b947b071Sid Soundararajan removeTask(task); 8885b0a0f1eccc0c32a2032385f2f199c76c50a917Sid Soundararajan EventBus.getDefault().send(new DeleteTaskDataEvent(task)); 8985b0a0f1eccc0c32a2032385f2f199c76c50a917Sid Soundararajan } 9085b0a0f1eccc0c32a2032385f2f199c76c50a917Sid Soundararajan 9185b0a0f1eccc0c32a2032385f2f199c76c50a917Sid Soundararajan @Override 9285b0a0f1eccc0c32a2032385f2f199c76c50a917Sid Soundararajan public void onAnimationCancel(Animator animation) { } 9385b0a0f1eccc0c32a2032385f2f199c76c50a917Sid Soundararajan 9485b0a0f1eccc0c32a2032385f2f199c76c50a917Sid Soundararajan @Override 9585b0a0f1eccc0c32a2032385f2f199c76c50a917Sid Soundararajan public void onAnimationRepeat(Animator animation) { } 9685b0a0f1eccc0c32a2032385f2f199c76c50a917Sid Soundararajan }; 9785b0a0f1eccc0c32a2032385f2f199c76c50a917Sid Soundararajan 9885b0a0f1eccc0c32a2032385f2f199c76c50a917Sid Soundararajan } 99b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan } 100b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan 101b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan public TaskStackHorizontalViewAdapter(List tasks) { 1023f351a4fa00ccce3eb3427f839553b3b78be0825Neil Fuller mTaskList = new ArrayList<Task>(tasks); 103b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan } 104b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan 105b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan public void setNewStackTasks(List tasks) { 106b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan mTaskList.clear(); 107b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan mTaskList.addAll(tasks); 108b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan notifyDataSetChanged(); 109b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan } 1101008cc25863be3d86e01c15eeabe9dfedb963224Sid Soundararajan 111b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan @Override 112b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan public TaskStackHorizontalViewAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, 113b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan int viewType) { 114bda1b17d45267c7e6efd9b03a5ec2b5356aa5eb7Sid Soundararajan LayoutInflater inflater = LayoutInflater.from(parent.getContext()); 115bda1b17d45267c7e6efd9b03a5ec2b5356aa5eb7Sid Soundararajan ViewHolder viewHolder = new ViewHolder( 116bda1b17d45267c7e6efd9b03a5ec2b5356aa5eb7Sid Soundararajan inflater.inflate(R.layout.recents_tv_task_card_view, parent, false)); 117b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan return viewHolder; 118b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan } 119b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan 120b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan @Override 121b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan public void onBindViewHolder(ViewHolder holder, int position) { 1224332dda9a76191b0f055dedbea8d509a20d5c455Sid Soundararajan Task task = mTaskList.get(position); 1234332dda9a76191b0f055dedbea8d509a20d5c455Sid Soundararajan // Retrives from caches, loading only if necessary 1244332dda9a76191b0f055dedbea8d509a20d5c455Sid Soundararajan Recents.getTaskLoader().loadTaskData(task); 1254332dda9a76191b0f055dedbea8d509a20d5c455Sid Soundararajan holder.init(task); 126b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan } 127b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan 128b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan @Override 12985b0a0f1eccc0c32a2032385f2f199c76c50a917Sid Soundararajan public int getItemCount() { 13085b0a0f1eccc0c32a2032385f2f199c76c50a917Sid Soundararajan return mTaskList.size(); 1314bdb6879bd5f1b7e93e7e9ac236a073921862075Sid Soundararajan } 1324bdb6879bd5f1b7e93e7e9ac236a073921862075Sid Soundararajan 13385b0a0f1eccc0c32a2032385f2f199c76c50a917Sid Soundararajan public void removeTask(Task task) { 13485b0a0f1eccc0c32a2032385f2f199c76c50a917Sid Soundararajan int position = mTaskList.indexOf(task); 13585b0a0f1eccc0c32a2032385f2f199c76c50a917Sid Soundararajan if (position >= 0) { 13685b0a0f1eccc0c32a2032385f2f199c76c50a917Sid Soundararajan mTaskList.remove(position); 13785b0a0f1eccc0c32a2032385f2f199c76c50a917Sid Soundararajan notifyItemRemoved(position); 138060fcd3f86e87e5829c673686e8e32f3b947b071Sid Soundararajan if (mGridView != null) { 139060fcd3f86e87e5829c673686e8e32f3b947b071Sid Soundararajan mGridView.getStack().removeTask(task, AnimationProps.IMMEDIATE, 140060fcd3f86e87e5829c673686e8e32f3b947b071Sid Soundararajan false); 141060fcd3f86e87e5829c673686e8e32f3b947b071Sid Soundararajan } 14285b0a0f1eccc0c32a2032385f2f199c76c50a917Sid Soundararajan } 14385b0a0f1eccc0c32a2032385f2f199c76c50a917Sid Soundararajan } 14485b0a0f1eccc0c32a2032385f2f199c76c50a917Sid Soundararajan 145c81082b7ee925aeeb7edddbb181dc365a4600be1Sid Soundararajan public int getPositionOfTask(Task task) { 146c81082b7ee925aeeb7edddbb181dc365a4600be1Sid Soundararajan int position = mTaskList.indexOf(task); 147c81082b7ee925aeeb7edddbb181dc365a4600be1Sid Soundararajan return (position >= 0) ? position : 0; 148c81082b7ee925aeeb7edddbb181dc365a4600be1Sid Soundararajan } 14985b0a0f1eccc0c32a2032385f2f199c76c50a917Sid Soundararajan 150bda1b17d45267c7e6efd9b03a5ec2b5356aa5eb7Sid Soundararajan 15185b0a0f1eccc0c32a2032385f2f199c76c50a917Sid Soundararajan public void setTaskStackHorizontalGridView(TaskStackHorizontalGridView gridView) { 15285b0a0f1eccc0c32a2032385f2f199c76c50a917Sid Soundararajan mGridView = gridView; 15385b0a0f1eccc0c32a2032385f2f199c76c50a917Sid Soundararajan } 15485b0a0f1eccc0c32a2032385f2f199c76c50a917Sid Soundararajan 15585b0a0f1eccc0c32a2032385f2f199c76c50a917Sid Soundararajan public void addTaskAt(Task task, int position) { 15685b0a0f1eccc0c32a2032385f2f199c76c50a917Sid Soundararajan mTaskList.add(position, task); 15785b0a0f1eccc0c32a2032385f2f199c76c50a917Sid Soundararajan notifyItemInserted(position); 15885b0a0f1eccc0c32a2032385f2f199c76c50a917Sid Soundararajan } 159b58c46acec2e270f24ca587a64298f06cefb09cbSid Soundararajan} 160