blob: a899a084ce93db23bfb80caf1674e91da3b0428d [file] [log] [blame]
Brad Stenning9a8b2c82018-08-03 14:14:26 -07001/*
2 * Copyright (C) 2018 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.android.server.notification;
18
19import android.app.Notification;
20import android.content.Context;
21import android.content.pm.PackageManager;
22import android.util.Slog;
23
24/**
25 * Sets the criticality of a notification record. This is used to allow a bypass to all other
26 * ranking signals. It is required in the automotive use case to facilitate placing emergency and
27 * warning notifications above all others. It does not process notifications unless the system
28 * has the automotive feature flag set.
29 * <p>
30 * Note: it is up to the notification ranking system to determine the effect of criticality values
31 * on a notification record
32 *
33 */
34public class CriticalNotificationExtractor implements NotificationSignalExtractor {
35
36 private static final String TAG = "CriticalNotificationExt";
37 private static final boolean DBG = false;
38 private boolean mSupportsCriticalNotifications = false;
39 /**
40 * Intended to bypass all other ranking, notification should be placed above all others.
41 * In the automotive case, the notification would be used to tell a driver to pull over
42 * immediately
43 */
44 static final int CRITICAL = 0;
45 /**
46 * Indicates a notification should be place above all notifications except those marked as
47 * critical. In the automotive case this is a check engine light.
48 */
49 static final int CRITICAL_LOW = 1;
50 /** Normal notification. */
51 static final int NORMAL = 2;
52
53 @Override
54 public void initialize(Context context, NotificationUsageStats usageStats) {
55 if (DBG) Slog.d(TAG, "Initializing " + getClass().getSimpleName() + ".");
56 mSupportsCriticalNotifications = supportsCriticalNotifications(context);
57 }
58
59 private boolean supportsCriticalNotifications(Context context) {
60 return context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE, 0);
61 }
62
63 @Override
64 public RankingReconsideration process(NotificationRecord record) {
65 if (!mSupportsCriticalNotifications) {
66 if (DBG) Slog.d(TAG, "skipping since system does not support critical notification");
67 return null;
68 }
69 if (record == null || record.getNotification() == null) {
70 if (DBG) Slog.d(TAG, "skipping empty notification");
71 return null;
72 }
73 // Note: The use of both CATEGORY_CAR_EMERGENCY and CATEGORY_CAR_WARNING is restricted to
74 // System apps
75 if (record.isCategory(Notification.CATEGORY_CAR_EMERGENCY)) {
76 record.setCriticality(CRITICAL);
77 } else if (record.isCategory(Notification.CATEGORY_CAR_WARNING)) {
78 record.setCriticality(CRITICAL_LOW);
79 } else {
80 record.setCriticality(NORMAL);
81 }
82 return null;
83 }
84
85 @Override
86 public void setConfig(RankingConfig config) {
87 }
88
89 @Override
90 public void setZenHelper(ZenModeHelper helper) {
91 }
92
93}