Loading res/layout/notification_history_app_layout.xml +1 −1 Original line number Diff line number Diff line Loading @@ -79,7 +79,7 @@ android:layout_width="match_parent" android:clipChildren="true" android:layout_height="wrap_content"> <androidx.recyclerview.widget.RecyclerView <com.android.settings.notification.history.NotificationHistoryRecyclerView android:id="@+id/notification_list" android:layout_width="match_parent" android:layout_height="wrap_content" Loading src/com/android/settings/notification/history/NotificationHistoryActivity.java +6 −8 Original line number Diff line number Diff line Loading @@ -101,14 +101,12 @@ public class NotificationHistoryActivity extends Activity { count.setText(getResources().getQuantityString(R.plurals.notification_history_count, nhp.notifications.size(), nhp.notifications.size())); RecyclerView rv = viewForPackage.findViewById(R.id.notification_list); LinearLayoutManager lm = new LinearLayoutManager(this); rv.setLayoutManager(lm); rv.setAdapter(new NotificationHistoryAdapter()); DividerItemDecoration dividerItemDecoration = new DividerItemDecoration( rv.getContext(), lm.getOrientation()); rv.addItemDecoration(dividerItemDecoration); ((NotificationHistoryAdapter) rv.getAdapter()).onRebuildComplete(nhp.notifications); NotificationHistoryRecyclerView rv = viewForPackage.findViewById(R.id.notification_list); rv.setAdapter(new NotificationHistoryAdapter(mNm, rv)); ((NotificationHistoryAdapter) rv.getAdapter()).onRebuildComplete( new ArrayList<>(nhp.notifications)); mTodayView.addView(viewForPackage); } }; Loading src/com/android/settings/notification/history/NotificationHistoryAdapter.java +26 −12 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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<NotificationHistoryViewHolder> { RecyclerView.Adapter<NotificationHistoryViewHolder> implements NotificationHistoryRecyclerView.OnItemSwipeDeleteListener { private static String TAG = "NotiHistoryAdapter"; private INotificationManager mNm; private List<HistoricalNotification> mValues; public NotificationHistoryAdapter() { public NotificationHistoryAdapter(INotificationManager nm, NotificationHistoryRecyclerView listView) { mValues = new ArrayList<>(); setHasStableIds(true); listView.setOnItemSwipeDeleteListener(this); mNm = nm; } @Override Loading Loading @@ -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); } } src/com/android/settings/notification/history/NotificationHistoryPackage.java +7 −3 Original line number Diff line number Diff line Loading @@ -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<NotificationHistory.HistoricalNotification> notifications; TreeSet<NotificationHistory.HistoricalNotification> 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 Loading src/com/android/settings/notification/history/NotificationHistoryRecyclerView.java 0 → 100644 +66 −0 Original line number Diff line number Diff line 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 Loading
res/layout/notification_history_app_layout.xml +1 −1 Original line number Diff line number Diff line Loading @@ -79,7 +79,7 @@ android:layout_width="match_parent" android:clipChildren="true" android:layout_height="wrap_content"> <androidx.recyclerview.widget.RecyclerView <com.android.settings.notification.history.NotificationHistoryRecyclerView android:id="@+id/notification_list" android:layout_width="match_parent" android:layout_height="wrap_content" Loading
src/com/android/settings/notification/history/NotificationHistoryActivity.java +6 −8 Original line number Diff line number Diff line Loading @@ -101,14 +101,12 @@ public class NotificationHistoryActivity extends Activity { count.setText(getResources().getQuantityString(R.plurals.notification_history_count, nhp.notifications.size(), nhp.notifications.size())); RecyclerView rv = viewForPackage.findViewById(R.id.notification_list); LinearLayoutManager lm = new LinearLayoutManager(this); rv.setLayoutManager(lm); rv.setAdapter(new NotificationHistoryAdapter()); DividerItemDecoration dividerItemDecoration = new DividerItemDecoration( rv.getContext(), lm.getOrientation()); rv.addItemDecoration(dividerItemDecoration); ((NotificationHistoryAdapter) rv.getAdapter()).onRebuildComplete(nhp.notifications); NotificationHistoryRecyclerView rv = viewForPackage.findViewById(R.id.notification_list); rv.setAdapter(new NotificationHistoryAdapter(mNm, rv)); ((NotificationHistoryAdapter) rv.getAdapter()).onRebuildComplete( new ArrayList<>(nhp.notifications)); mTodayView.addView(viewForPackage); } }; Loading
src/com/android/settings/notification/history/NotificationHistoryAdapter.java +26 −12 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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<NotificationHistoryViewHolder> { RecyclerView.Adapter<NotificationHistoryViewHolder> implements NotificationHistoryRecyclerView.OnItemSwipeDeleteListener { private static String TAG = "NotiHistoryAdapter"; private INotificationManager mNm; private List<HistoricalNotification> mValues; public NotificationHistoryAdapter() { public NotificationHistoryAdapter(INotificationManager nm, NotificationHistoryRecyclerView listView) { mValues = new ArrayList<>(); setHasStableIds(true); listView.setOnItemSwipeDeleteListener(this); mNm = nm; } @Override Loading Loading @@ -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); } }
src/com/android/settings/notification/history/NotificationHistoryPackage.java +7 −3 Original line number Diff line number Diff line Loading @@ -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<NotificationHistory.HistoricalNotification> notifications; TreeSet<NotificationHistory.HistoricalNotification> 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 Loading
src/com/android/settings/notification/history/NotificationHistoryRecyclerView.java 0 → 100644 +66 −0 Original line number Diff line number Diff line 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