From eabc1904a7414bd6a1ca5aaeb06b2c512bc9736d Mon Sep 17 00:00:00 2001 From: Julia Reynolds Date: Fri, 27 Mar 2020 15:56:41 -0400 Subject: [PATCH] Remove items from the 'last 24 hours' history on swipe And make it resiliant to duplicate data from the backend. Test: manual Fixes: 148956400 Change-Id: I650c89242c257df1ec34b2879f544d9a5211019a --- .../notification_history_app_layout.xml | 2 +- .../history/NotificationHistoryActivity.java | 14 ++-- .../history/NotificationHistoryAdapter.java | 38 +++++++---- .../history/NotificationHistoryPackage.java | 10 ++- .../NotificationHistoryRecyclerView.java | 66 +++++++++++++++++++ 5 files changed, 106 insertions(+), 24 deletions(-) create mode 100644 src/com/android/settings/notification/history/NotificationHistoryRecyclerView.java diff --git a/res/layout/notification_history_app_layout.xml b/res/layout/notification_history_app_layout.xml index 5d8ff3fb0df..7d1f2d73270 100644 --- a/res/layout/notification_history_app_layout.xml +++ b/res/layout/notification_history_app_layout.xml @@ -79,7 +79,7 @@ android:layout_width="match_parent" android:clipChildren="true" android:layout_height="wrap_content"> - (nhp.notifications)); + mTodayView.addView(viewForPackage); } }; diff --git a/src/com/android/settings/notification/history/NotificationHistoryAdapter.java b/src/com/android/settings/notification/history/NotificationHistoryAdapter.java index 4448dee3f6c..a06939ac4d1 100644 --- a/src/com/android/settings/notification/history/NotificationHistoryAdapter.java +++ b/src/com/android/settings/notification/history/NotificationHistoryAdapter.java @@ -16,11 +16,10 @@ package com.android.settings.notification.history; -import android.app.NotificationHistory; +import android.app.INotificationManager; import android.app.NotificationHistory.HistoricalNotification; -import android.content.Context; -import android.graphics.drawable.Drawable; -import android.os.UserHandle; +import android.os.RemoteException; +import android.util.Slog; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -29,24 +28,25 @@ import androidx.annotation.NonNull; import androidx.recyclerview.widget.RecyclerView; import com.android.settings.R; -import com.android.settings.notification.NotificationBackend; -import com.android.settingslib.utils.ThreadUtils; import java.util.ArrayList; -import java.util.Comparator; -import java.util.HashMap; import java.util.List; -import java.util.Map; -import java.util.TreeMap; public class NotificationHistoryAdapter extends - RecyclerView.Adapter { + RecyclerView.Adapter implements + NotificationHistoryRecyclerView.OnItemSwipeDeleteListener { + private static String TAG = "NotiHistoryAdapter"; + + private INotificationManager mNm; private List mValues; - public NotificationHistoryAdapter() { + public NotificationHistoryAdapter(INotificationManager nm, + NotificationHistoryRecyclerView listView) { mValues = new ArrayList<>(); setHasStableIds(true); + listView.setOnItemSwipeDeleteListener(this); + mNm = nm; } @Override @@ -77,4 +77,18 @@ public class NotificationHistoryAdapter extends mValues.sort((o1, o2) -> Long.compare(o2.getPostedTimeMs(), o1.getPostedTimeMs())); notifyDataSetChanged(); } + + @Override + public void onItemSwipeDeleted(int position) { + HistoricalNotification hn = mValues.remove(position); + if (hn != null) { + try { + mNm.deleteNotificationHistoryItem( + hn.getPackage(), hn.getUid(), hn.getPostedTimeMs()); + } catch (RemoteException e) { + Slog.e(TAG, "Failed to delete item", e); + } + } + notifyItemRemoved(position); + } } diff --git a/src/com/android/settings/notification/history/NotificationHistoryPackage.java b/src/com/android/settings/notification/history/NotificationHistoryPackage.java index 5170b75d7fd..92920442d9b 100644 --- a/src/com/android/settings/notification/history/NotificationHistoryPackage.java +++ b/src/com/android/settings/notification/history/NotificationHistoryPackage.java @@ -20,27 +20,31 @@ import android.app.NotificationHistory; import android.graphics.drawable.Drawable; import java.util.ArrayList; +import java.util.Comparator; import java.util.List; import java.util.Objects; +import java.util.Set; +import java.util.TreeSet; public class NotificationHistoryPackage { String pkgName; int uid; - List notifications; + TreeSet notifications; CharSequence label; Drawable icon; public NotificationHistoryPackage(String pkgName, int uid) { this.pkgName = pkgName; this.uid = uid; - notifications = new ArrayList<>(); + notifications = new TreeSet<>( + (o1, o2) -> Long.compare(o2.getPostedTimeMs(), o1.getPostedTimeMs())); } public long getMostRecent() { if (notifications.isEmpty()) { return 0; } - return notifications.get(0).getPostedTimeMs(); + return notifications.first().getPostedTimeMs(); } @Override diff --git a/src/com/android/settings/notification/history/NotificationHistoryRecyclerView.java b/src/com/android/settings/notification/history/NotificationHistoryRecyclerView.java new file mode 100644 index 00000000000..eaaa7c99edf --- /dev/null +++ b/src/com/android/settings/notification/history/NotificationHistoryRecyclerView.java @@ -0,0 +1,66 @@ +package com.android.settings.notification.history; + +import android.annotation.Nullable; +import android.content.Context; +import android.graphics.Canvas; +import android.graphics.Rect; +import android.util.AttributeSet; +import android.view.View; + +import androidx.recyclerview.widget.DividerItemDecoration; +import androidx.recyclerview.widget.ItemTouchHelper; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +public class NotificationHistoryRecyclerView extends RecyclerView { + + private static final String TAG = "HistoryRecyclerView"; + + private OnItemSwipeDeleteListener listener; + + public NotificationHistoryRecyclerView(Context context) { + this(context, null); + } + + public NotificationHistoryRecyclerView(Context context, @Nullable AttributeSet attrs) { + this(context, attrs, 0); + } + + public NotificationHistoryRecyclerView(Context context, @Nullable AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + + setLayoutManager(new LinearLayoutManager(getContext())); + addItemDecoration(new DividerItemDecoration(getContext(), LinearLayoutManager.VERTICAL)); + ItemTouchHelper touchHelper = new ItemTouchHelper( + new DismissTouchHelper(0, ItemTouchHelper.START | ItemTouchHelper.END)); + touchHelper.attachToRecyclerView(this); + } + + public void setOnItemSwipeDeleteListener(OnItemSwipeDeleteListener listener) { + this.listener = listener; + } + + private class DismissTouchHelper extends ItemTouchHelper.SimpleCallback { + + public DismissTouchHelper(int dragDirs, int swipeDirs) { + super(dragDirs, swipeDirs); + } + + @Override + public boolean onMove(RecyclerView recyclerView, ViewHolder viewHolder, ViewHolder target) { + // Do nothing. + return false; + } + + @Override + public void onSwiped(ViewHolder viewHolder, int direction) { + if (listener != null) { + listener.onItemSwipeDeleted(viewHolder.getAdapterPosition()); + } + } + } + + public interface OnItemSwipeDeleteListener { + void onItemSwipeDeleted(int position); + } +} \ No newline at end of file