1/*
2 * Copyright (C) 2016 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16package com.android.systemui.recents.tv.views;
17
18import android.animation.Animator;
19import android.support.v7.widget.RecyclerView;
20import android.util.Log;
21import android.view.LayoutInflater;
22import android.view.View;
23import android.view.ViewGroup;
24
25import com.android.systemui.R;
26import com.android.systemui.recents.Recents;
27import com.android.systemui.recents.events.EventBus;
28import com.android.systemui.recents.events.activity.LaunchTvTaskEvent;
29import com.android.systemui.recents.events.ui.DeleteTaskDataEvent;
30import com.android.systemui.recents.model.RecentsTaskLoader;
31import com.android.systemui.recents.model.Task;
32import com.android.systemui.recents.views.AnimationProps;
33
34import java.util.ArrayList;
35import java.util.List;
36
37import static android.app.ActivityManager.StackId.INVALID_STACK_ID;
38
39public class TaskStackHorizontalViewAdapter extends
40        RecyclerView.Adapter<TaskStackHorizontalViewAdapter.ViewHolder> {
41
42    //Full class name is 30 characters
43    private static final String TAG = "TaskStackViewAdapter";
44    private List<Task> mTaskList;
45    private TaskStackHorizontalGridView mGridView;
46
47    public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{
48        private TaskCardView mTaskCardView;
49        private Task mTask;
50        public ViewHolder(View v) {
51            super(v);
52            mTaskCardView = (TaskCardView) v;
53        }
54
55        public void init(Task task) {
56            mTaskCardView.init(task);
57            mTask = task;
58            mTaskCardView.setOnClickListener(this);
59        }
60
61        @Override
62        public void onClick(View v) {
63            try {
64                if (mTaskCardView.isInDismissState()) {
65                    mTaskCardView.startDismissTaskAnimation(
66                            getRemoveAtListener(getAdapterPosition(), mTaskCardView.getTask()));
67                } else {
68                    EventBus.getDefault().send(new LaunchTvTaskEvent(mTaskCardView, mTask,
69                            null, INVALID_STACK_ID));
70                }
71            } catch (Exception e) {
72                Log.e(TAG, v.getContext()
73                        .getString(R.string.recents_launch_error_message, mTask.title), e);
74            }
75
76        }
77
78        private Animator.AnimatorListener getRemoveAtListener(final int position,
79                                                              final Task task) {
80            return new Animator.AnimatorListener() {
81
82                @Override
83                public void onAnimationStart(Animator animation) { }
84
85                @Override
86                public void onAnimationEnd(Animator animation) {
87                    removeTask(task);
88                    EventBus.getDefault().send(new DeleteTaskDataEvent(task));
89                }
90
91                @Override
92                public void onAnimationCancel(Animator animation) { }
93
94                @Override
95                public void onAnimationRepeat(Animator animation) { }
96            };
97
98        }
99    }
100
101    public TaskStackHorizontalViewAdapter(List tasks) {
102        mTaskList = new ArrayList<Task>(tasks);
103    }
104
105    public void setNewStackTasks(List tasks) {
106        mTaskList.clear();
107        mTaskList.addAll(tasks);
108        notifyDataSetChanged();
109    }
110
111    @Override
112    public TaskStackHorizontalViewAdapter.ViewHolder onCreateViewHolder(ViewGroup parent,
113            int viewType) {
114        LayoutInflater inflater = LayoutInflater.from(parent.getContext());
115        ViewHolder viewHolder = new ViewHolder(
116                        inflater.inflate(R.layout.recents_tv_task_card_view, parent, false));
117        return viewHolder;
118    }
119
120    @Override
121    public void onBindViewHolder(ViewHolder holder, int position) {
122        Task task = mTaskList.get(position);
123        // Retrives from caches, loading only if necessary
124        Recents.getTaskLoader().loadTaskData(task);
125        holder.init(task);
126    }
127
128    @Override
129    public int getItemCount() {
130        return mTaskList.size();
131    }
132
133    public void removeTask(Task task) {
134        int position = mTaskList.indexOf(task);
135        if (position >= 0) {
136            mTaskList.remove(position);
137            notifyItemRemoved(position);
138            if (mGridView != null) {
139                mGridView.getStack().removeTask(task, AnimationProps.IMMEDIATE,
140                        false);
141            }
142        }
143    }
144
145    public int getPositionOfTask(Task task) {
146        int position = mTaskList.indexOf(task);
147        return (position >= 0) ? position : 0;
148    }
149
150
151    public void setTaskStackHorizontalGridView(TaskStackHorizontalGridView gridView) {
152        mGridView = gridView;
153    }
154
155    public void addTaskAt(Task task, int position) {
156        mTaskList.add(position, task);
157        notifyItemInserted(position);
158    }
159}
160