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
This commit is contained in:
@@ -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"
|
||||
|
@@ -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);
|
||||
}
|
||||
};
|
||||
|
@@ -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<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
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
@@ -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
|
||||
|
@@ -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);
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user