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

Commit 5e62e3aa authored by Daniel Sandler's avatar Daniel Sandler
Browse files

Further reduce memory usage of notification archive.

- Max 250 notifications preserved (was 1000)
- Known heavyweight extras are removed
- print some of 'em out in dumpstate, while we're at it

Bug: 8280039
Bug: 8537938
Change-Id: I9239128c32a1d9f5ef4e0dc62dc2d23e190871e9
parent f45564ee
Loading
Loading
Loading
Loading
+28 −1
Original line number Diff line number Diff line
@@ -49,6 +49,7 @@ import android.media.IAudioService;
import android.media.IRingtonePlayer;
import android.net.Uri;
import android.os.Binder;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
@@ -266,18 +267,32 @@ public class NotificationManagerService extends INotificationManager.Stub
    }

    private static class Archive {
        static final int BUFFER_SIZE = 1000;
        static final int BUFFER_SIZE = 250;
        ArrayDeque<StatusBarNotification> mBuffer = new ArrayDeque<StatusBarNotification>(BUFFER_SIZE);

        public Archive() {
        }

        public String toString() {
            final StringBuilder sb = new StringBuilder();
            final int N = mBuffer.size();
            sb.append("Archive (");
            sb.append(N);
            sb.append(" notification");
            sb.append((N==1)?")":"s)");
            return sb.toString();
        }

        public void record(StatusBarNotification nr) {
            // Nuke heavy parts of notification before storing in archive
            nr.notification.tickerView = null;
            nr.notification.contentView = null;
            nr.notification.bigContentView = null;
            nr.notification.largeIcon = null;
            final Bundle extras = nr.notification.extras;
            extras.remove(Notification.EXTRA_LARGE_ICON);
            extras.remove(Notification.EXTRA_LARGE_ICON_BIG);
            extras.remove(Notification.EXTRA_PICTURE);

            if (mBuffer.size() == BUFFER_SIZE) {
                mBuffer.removeFirst();
@@ -285,6 +300,7 @@ public class NotificationManagerService extends INotificationManager.Stub
            mBuffer.addLast(nr);
        }


        public void clear() {
            mBuffer.clear();
        }
@@ -2131,6 +2147,17 @@ public class NotificationManagerService extends INotificationManager.Stub
            pw.println("  mVibrateNotification=" + mVibrateNotification);
            pw.println("  mDisabledNotifications=0x" + Integer.toHexString(mDisabledNotifications));
            pw.println("  mSystemReady=" + mSystemReady);
            pw.println("  mArchive=" + mArchive.toString());
            Iterator<StatusBarNotification> iter = mArchive.descendingIterator();
            int i=0;
            while (iter.hasNext()) {
                pw.println("    " + iter.next());
                if (++i >= 5) {
                    if (iter.hasNext()) pw.println("    ...");
                    break;
                }
            }

        }
    }
}