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