Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit eabc1904 authored by Julia Reynolds's avatar Julia Reynolds
Browse files

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
parent 4eb43058
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -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"
+6 −8
Original line number Diff line number Diff line
@@ -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);
        }
    };
+26 −12
Original line number Diff line number Diff line
@@ -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);
    }
}
+7 −3
Original line number Diff line number Diff line
@@ -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
+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