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

Commit d37be36a authored by Philip P. Moltmann's avatar Philip P. Moltmann
Browse files

Make print failure notifications important

Before failures and progress was similar important. Both were not shown.
Now both are shown and the failures alert.

Removed the notification grouping as autogrouping is good enough.

Test: Created failed and running print jobs
Change-Id: I6dfca583d69aa9713d45a2bc52d05e95f06b376f
parent 399dba4a
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -149,6 +149,12 @@
    <!-- Description of printer info icon. [CHAR LIMIT=50] -->
    <string name="printer_info_desc">More information about this printer</string>

    <!-- Label for the notification channel that contains print jobs without problems. [CHAR LIMIT=40] -->
    <string name="notification_channel_progress">Running print jobs</string>

    <!-- Label for the notification channel that contains print jobs with problems. [CHAR LIMIT=40] -->
    <string name="notification_channel_failure">Failed print jobs</string>

    <!-- Notification that we could not create a file name for the printed PDF. [CHAR LIMIT=50] -->
    <string name="could_not_create_file">Could not create file</string>

+32 −52
Original line number Diff line number Diff line
@@ -20,13 +20,12 @@ import android.annotation.NonNull;
import android.annotation.Nullable;
import android.app.Notification;
import android.app.Notification.Action;
import android.app.Notification.InboxStyle;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Icon;
import android.net.Uri;
import android.os.AsyncTask;
@@ -57,14 +56,14 @@ final class NotificationController {

    public static final String LOG_TAG = "NotificationController";

    private static final String NOTIFICATION_CHANNEL_PROGRESS = "PRINT_PROGRESS";
    private static final String NOTIFICATION_CHANNEL_FAILURES = "PRINT_FAILURES";

    private static final String INTENT_ACTION_CANCEL_PRINTJOB = "INTENT_ACTION_CANCEL_PRINTJOB";
    private static final String INTENT_ACTION_RESTART_PRINTJOB = "INTENT_ACTION_RESTART_PRINTJOB";

    private static final String EXTRA_PRINT_JOB_ID = "EXTRA_PRINT_JOB_ID";

    private static final String PRINT_JOB_NOTIFICATION_GROUP_KEY = "PRINT_JOB_NOTIFICATIONS";
    private static final String PRINT_JOB_NOTIFICATION_SUMMARY = "PRINT_JOB_NOTIFICATIONS_SUMMARY";

    private final Context mContext;
    private final NotificationManager mNotificationManager;

@@ -78,6 +77,15 @@ final class NotificationController {
        mNotificationManager = (NotificationManager)
                mContext.getSystemService(Context.NOTIFICATION_SERVICE);
        mNotifications = new ArraySet<>(0);

        mNotificationManager.createNotificationChannel(
                new NotificationChannel(NOTIFICATION_CHANNEL_PROGRESS,
                        context.getString(R.string.notification_channel_progress),
                        NotificationManager.IMPORTANCE_LOW));
        mNotificationManager.createNotificationChannel(
                new NotificationChannel(NOTIFICATION_CHANNEL_FAILURES,
                        context.getString(R.string.notification_channel_failure),
                        NotificationManager.IMPORTANCE_DEFAULT));
    }

    public void onUpdateNotifications(List<PrintJobInfo> printJobs) {
@@ -104,13 +112,6 @@ final class NotificationController {

        final int numPrintJobs = printJobs.size();

        // Create summary notification
        if (numPrintJobs > 1) {
            createStackedNotification(printJobs);
        } else {
            mNotificationManager.cancel(PRINT_JOB_NOTIFICATION_SUMMARY, 0);
        }

        // Create per print job notification
        for (int i = 0; i < numPrintJobs; i++) {
            PrintJobInfo printJob = printJobs.get(i);
@@ -178,16 +179,16 @@ final class NotificationController {
     */
    private void createNotification(@NonNull PrintJobInfo printJob, @Nullable Action firstAction,
            @Nullable Action secondAction) {
        Notification.Builder builder = new Notification.Builder(mContext)
        Notification.Builder builder = new Notification.Builder(mContext, computeChannel(printJob))
                .setContentIntent(createContentIntent(printJob.getId()))
                .setSmallIcon(computeNotificationIcon(printJob))
                .setContentTitle(computeNotificationTitle(printJob))
                .setWhen(System.currentTimeMillis())
                .setOngoing(true)
                .setShowWhen(true)
                .setOnlyAlertOnce(true)
                .setColor(mContext.getColor(
                        com.android.internal.R.color.system_notification_accent_color))
                .setGroup(PRINT_JOB_NOTIFICATION_GROUP_KEY);
                        com.android.internal.R.color.system_notification_accent_color));

        if (firstAction != null) {
            builder.addAction(firstAction);
@@ -238,43 +239,6 @@ final class NotificationController {
        createNotification(printJob, null, null);
    }

    private void createStackedNotification(List<PrintJobInfo> printJobs) {
        Notification.Builder builder = new Notification.Builder(mContext)
                .setContentIntent(createContentIntent(null))
                .setWhen(System.currentTimeMillis())
                .setOngoing(true)
                .setShowWhen(true)
                .setGroup(PRINT_JOB_NOTIFICATION_GROUP_KEY)
                .setGroupSummary(true);

        final int printJobCount = printJobs.size();

        InboxStyle inboxStyle = new InboxStyle();

        int icon = com.android.internal.R.drawable.ic_print;
        for (int i = printJobCount - 1; i>= 0; i--) {
            PrintJobInfo printJob = printJobs.get(i);

            inboxStyle.addLine(computeNotificationTitle(printJob));

            // if any print job is in an error state show an error icon for the summary
            if (printJob.getState() == PrintJobInfo.STATE_FAILED
                    || printJob.getState() == PrintJobInfo.STATE_BLOCKED) {
                icon = com.android.internal.R.drawable.ic_print_error;
            }
        }

        builder.setSmallIcon(icon);
        builder.setLargeIcon(
                ((BitmapDrawable) mContext.getResources().getDrawable(icon, null)).getBitmap());
        builder.setNumber(printJobCount);
        builder.setStyle(inboxStyle);
        builder.setColor(mContext.getColor(
                com.android.internal.R.color.system_notification_accent_color));

        mNotificationManager.notify(PRINT_JOB_NOTIFICATION_SUMMARY, 0, builder.build());
    }

    private String computeNotificationTitle(PrintJobInfo printJob) {
        switch (printJob.getState()) {
            case PrintJobInfo.STATE_FAILED: {
@@ -359,6 +323,22 @@ final class NotificationController {
        }
    }

    private static String computeChannel(PrintJobInfo printJob) {
        if (printJob.isCancelling()) {
            return NOTIFICATION_CHANNEL_PROGRESS;
        }

        switch (printJob.getState()) {
            case PrintJobInfo.STATE_FAILED:
            case PrintJobInfo.STATE_BLOCKED: {
                return NOTIFICATION_CHANNEL_FAILURES;
            }
            default: {
                return NOTIFICATION_CHANNEL_PROGRESS;
            }
        }
    }

    public static final class NotificationBroadcastReceiver extends BroadcastReceiver {
        @SuppressWarnings("hiding")
        private static final String LOG_TAG = "NotificationBroadcastReceiver";