From 4e5fb2f4e1ed4eb119a201541ad89aafac8c53fe Mon Sep 17 00:00:00 2001 From: Winson Chung Date: Tue, 15 Dec 2015 14:46:23 -0500 Subject: [PATCH] Allowing tasks to be swiped away in the history view. Change-Id: Ide26856c291bcdd1b4ab5e15ae9eb876a9af719b --- .../android/systemui/recents/Constants.java | 1 + .../systemui/recents/RecentsActivity.java | 3 +- .../recents/events/ui/DismissTaskEvent.java | 33 +++++ .../history/RecentsHistoryAdapter.java | 114 ++++++++++++++---- .../RecentsHistoryItemTouchCallbacks.java | 76 ++++++++++++ .../recents/history/RecentsHistoryView.java | 14 +-- .../systemui/recents/model/TaskStack.java | 9 +- .../systemui/recents/views/TaskStackView.java | 2 + 8 files changed, 216 insertions(+), 36 deletions(-) create mode 100644 packages/SystemUI/src/com/android/systemui/recents/events/ui/DismissTaskEvent.java create mode 100644 packages/SystemUI/src/com/android/systemui/recents/history/RecentsHistoryItemTouchCallbacks.java diff --git a/packages/SystemUI/src/com/android/systemui/recents/Constants.java b/packages/SystemUI/src/com/android/systemui/recents/Constants.java index c08fb0522b9bc..070b39594d340 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/Constants.java +++ b/packages/SystemUI/src/com/android/systemui/recents/Constants.java @@ -27,6 +27,7 @@ public class Constants { public static final int DismissSourceKeyboard = 0; public static final int DismissSourceSwipeGesture = 1; public static final int DismissSourceHeaderButton = 2; + public static final int DismissSourceHistorySwipeGesture = 3; } } diff --git a/packages/SystemUI/src/com/android/systemui/recents/RecentsActivity.java b/packages/SystemUI/src/com/android/systemui/recents/RecentsActivity.java index ec963da3c1fdf..b3ce4a6e0d230 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/RecentsActivity.java +++ b/packages/SystemUI/src/com/android/systemui/recents/RecentsActivity.java @@ -56,6 +56,7 @@ import com.android.systemui.recents.events.activity.ToggleRecentsEvent; import com.android.systemui.recents.events.component.RecentsVisibilityChangedEvent; import com.android.systemui.recents.events.component.ScreenPinningRequestEvent; import com.android.systemui.recents.events.ui.AllTaskViewsDismissedEvent; +import com.android.systemui.recents.events.ui.DismissTaskEvent; import com.android.systemui.recents.events.ui.DismissTaskViewEvent; import com.android.systemui.recents.events.ui.ShowApplicationInfoEvent; import com.android.systemui.recents.events.ui.StackViewScrolledEvent; @@ -726,7 +727,7 @@ public class RecentsActivity extends Activity implements ViewTreeObserver.OnPreD MetricsLogger.count(this, "overview_app_info", 1); } - public final void onBusEvent(DismissTaskViewEvent event) { + public final void onBusEvent(DismissTaskEvent event) { // Remove any stored data from the loader RecentsTaskLoader loader = Recents.getTaskLoader(); loader.deleteTaskData(event.task, false); diff --git a/packages/SystemUI/src/com/android/systemui/recents/events/ui/DismissTaskEvent.java b/packages/SystemUI/src/com/android/systemui/recents/events/ui/DismissTaskEvent.java new file mode 100644 index 0000000000000..bcbbde84a1602 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/recents/events/ui/DismissTaskEvent.java @@ -0,0 +1,33 @@ +/* + * Copyright (C) 2015 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.events.ui; + +import com.android.systemui.recents.events.EventBus; +import com.android.systemui.recents.model.Task; +import com.android.systemui.recents.views.TaskView; + +/** + * This is sent when a {@link Task} has been dismissed. + */ +public class DismissTaskEvent extends EventBus.Event { + + public final Task task; + + public DismissTaskEvent(Task task) { + this.task = task; + } +} diff --git a/packages/SystemUI/src/com/android/systemui/recents/history/RecentsHistoryAdapter.java b/packages/SystemUI/src/com/android/systemui/recents/history/RecentsHistoryAdapter.java index abe3c01f836f0..76439c0f6a67c 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/history/RecentsHistoryAdapter.java +++ b/packages/SystemUI/src/com/android/systemui/recents/history/RecentsHistoryAdapter.java @@ -20,6 +20,7 @@ import android.app.ActivityOptions; import android.content.Context; import android.support.v7.widget.RecyclerView; import android.text.format.DateFormat; +import android.util.SparseIntArray; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -27,9 +28,14 @@ import android.widget.ImageView; import android.widget.TextView; import com.android.systemui.R; import com.android.systemui.recents.Recents; +import com.android.systemui.recents.events.EventBus; +import com.android.systemui.recents.events.activity.HideHistoryButtonEvent; +import com.android.systemui.recents.events.activity.HideHistoryEvent; +import com.android.systemui.recents.misc.ReferenceCountedTrigger; import com.android.systemui.recents.misc.SystemServicesProxy; import com.android.systemui.recents.model.RecentsTaskLoader; import com.android.systemui.recents.model.Task; +import com.android.systemui.recents.model.TaskStack; import java.util.ArrayList; import java.util.Calendar; @@ -51,7 +57,7 @@ public class RecentsHistoryAdapter extends RecyclerView.Adapter mTasks = new ArrayList<>(); private final List mRows = new ArrayList<>(); + private final SparseIntArray mTaskRowCount = new SparseIntArray(); + private TaskStack mStack; public RecentsHistoryAdapter(Context context) { mLayoutInflater = LayoutInflater.from(context); @@ -142,17 +152,17 @@ public class RecentsHistoryAdapter extends RecyclerView.Adapter tasks) { + public void updateTasks(Context context, TaskStack stack) { mContext = context; - mTasks.clear(); - mTasks.addAll(tasks); + mStack = stack; final Locale l = context.getResources().getConfiguration().locale; final String dateFormatStr = DateFormat.getBestDateTimePattern(l, "EEEEMMMMd"); - final List tasksMostRecent = new ArrayList<>(tasks); + final List tasksMostRecent = new ArrayList<>(stack.getHistoricalTasks()); Collections.reverse(tasksMostRecent); - int prevDayKey = -1; + int prevDateKey = -1; mRows.clear(); + mTaskRowCount.clear(); for (Task task : tasksMostRecent) { if (task.isFreeformTask()) { continue; @@ -160,34 +170,46 @@ public class RecentsHistoryAdapter extends RecyclerView.Adapter= 0; i--) { - Task task = mTasks.get(i); - String taskPackage = task.key.getComponent().getPackageName(); - if (task.key.userId == userId && taskPackage.equals(packageName)) { - mTasks.remove(i); - packagesRemoved = true; + for (int i = mRows.size() - 1; i >= 0; i--) { + Row row = mRows.get(i); + if (row.getViewType() == TASK_ROW_VIEW_TYPE) { + TaskRow taskRow = (TaskRow) row; + Task task = taskRow.task; + String taskPackage = task.key.getComponent().getPackageName(); + if (task.key.userId == userId && taskPackage.equals(packageName)) { + i = removeTaskRow(i); + } } } - if (packagesRemoved) { - updateTasks(mContext, new ArrayList(mTasks)); + if (mRows.isEmpty()) { + dismissHistory(); } } + /** + * Returns the row at the given {@param position}. + */ + public Row getRow(int position) { + return mRows.get(position); + } + @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { switch (viewType) { @@ -242,6 +264,16 @@ public class RecentsHistoryAdapter extends RecyclerView.Adapter