1584b2b2bc17a4ccf42952b188722de1091c101beJason Monk/*
2584b2b2bc17a4ccf42952b188722de1091c101beJason Monk * Copyright (C) 2015 The Android Open Source Project
3584b2b2bc17a4ccf42952b188722de1091c101beJason Monk *
4584b2b2bc17a4ccf42952b188722de1091c101beJason Monk * Licensed under the Apache License, Version 2.0 (the "License");
5584b2b2bc17a4ccf42952b188722de1091c101beJason Monk * you may not use this file except in compliance with the License.
6584b2b2bc17a4ccf42952b188722de1091c101beJason Monk * You may obtain a copy of the License at
7584b2b2bc17a4ccf42952b188722de1091c101beJason Monk *
8584b2b2bc17a4ccf42952b188722de1091c101beJason Monk *      http://www.apache.org/licenses/LICENSE-2.0
9584b2b2bc17a4ccf42952b188722de1091c101beJason Monk *
10584b2b2bc17a4ccf42952b188722de1091c101beJason Monk * Unless required by applicable law or agreed to in writing, software
11584b2b2bc17a4ccf42952b188722de1091c101beJason Monk * distributed under the License is distributed on an "AS IS" BASIS,
12584b2b2bc17a4ccf42952b188722de1091c101beJason Monk * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13584b2b2bc17a4ccf42952b188722de1091c101beJason Monk * See the License for the specific language governing permissions and
14584b2b2bc17a4ccf42952b188722de1091c101beJason Monk * limitations under the License.
15584b2b2bc17a4ccf42952b188722de1091c101beJason Monk */
16584b2b2bc17a4ccf42952b188722de1091c101beJason Monkpackage com.android.settings.applications;
17584b2b2bc17a4ccf42952b188722de1091c101beJason Monk
18beb5e5210b55926fa4a7302a9e9d00ef49f40314Julia Reynoldsimport android.app.Notification;
193e912e7ea537ae34234ccbe6fef9b2519a4da51bJulia Reynoldsimport android.content.Context;
20584b2b2bc17a4ccf42952b188722de1091c101beJason Monkimport android.content.pm.PackageManager;
213e912e7ea537ae34234ccbe6fef9b2519a4da51bJulia Reynoldsimport android.os.UserHandle;
22beb5e5210b55926fa4a7302a9e9d00ef49f40314Julia Reynoldsimport android.service.notification.NotificationListenerService;
23584b2b2bc17a4ccf42952b188722de1091c101beJason Monk
243e912e7ea537ae34234ccbe6fef9b2519a4da51bJulia Reynoldsimport com.android.internal.widget.LockPatternUtils;
25584b2b2bc17a4ccf42952b188722de1091c101beJason Monkimport com.android.settings.notification.NotificationBackend;
26584b2b2bc17a4ccf42952b188722de1091c101beJason Monkimport com.android.settings.notification.NotificationBackend.AppRow;
2767cd6ab93a526fe65877743e458590f4e6f187eeTony Mantlerimport com.android.settingslib.applications.ApplicationsState;
2867cd6ab93a526fe65877743e458590f4e6f187eeTony Mantlerimport com.android.settingslib.applications.ApplicationsState.AppEntry;
2967cd6ab93a526fe65877743e458590f4e6f187eeTony Mantlerimport com.android.settingslib.applications.ApplicationsState.AppFilter;
30584b2b2bc17a4ccf42952b188722de1091c101beJason Monk
31584b2b2bc17a4ccf42952b188722de1091c101beJason Monkimport java.util.ArrayList;
32584b2b2bc17a4ccf42952b188722de1091c101beJason Monk
33584b2b2bc17a4ccf42952b188722de1091c101beJason Monk/**
34584b2b2bc17a4ccf42952b188722de1091c101beJason Monk * Connects the info provided by ApplicationsState and the NotificationBackend.
35584b2b2bc17a4ccf42952b188722de1091c101beJason Monk * Also provides app filters that can use the notification data.
36584b2b2bc17a4ccf42952b188722de1091c101beJason Monk */
37d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monkpublic class AppStateNotificationBridge extends AppStateBaseBridge {
38584b2b2bc17a4ccf42952b188722de1091c101beJason Monk
39584b2b2bc17a4ccf42952b188722de1091c101beJason Monk    private final NotificationBackend mNotifBackend;
40584b2b2bc17a4ccf42952b188722de1091c101beJason Monk    private final PackageManager mPm;
413e912e7ea537ae34234ccbe6fef9b2519a4da51bJulia Reynolds    private final Context mContext;
42584b2b2bc17a4ccf42952b188722de1091c101beJason Monk
433e912e7ea537ae34234ccbe6fef9b2519a4da51bJulia Reynolds    public AppStateNotificationBridge(Context context, ApplicationsState appState,
44d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk            Callback callback, NotificationBackend notifBackend) {
45d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk        super(appState, callback);
463e912e7ea537ae34234ccbe6fef9b2519a4da51bJulia Reynolds        mContext = context;
473e912e7ea537ae34234ccbe6fef9b2519a4da51bJulia Reynolds        mPm = mContext.getPackageManager();
48584b2b2bc17a4ccf42952b188722de1091c101beJason Monk        mNotifBackend = notifBackend;
49584b2b2bc17a4ccf42952b188722de1091c101beJason Monk    }
50584b2b2bc17a4ccf42952b188722de1091c101beJason Monk
51584b2b2bc17a4ccf42952b188722de1091c101beJason Monk    @Override
52d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk    protected void loadAllExtraInfo() {
53d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk        ArrayList<AppEntry> apps = mAppSession.getAllApps();
54d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk        final int N = apps.size();
55d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk        for (int i = 0; i < N; i++) {
56d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk            AppEntry app = apps.get(i);
573e912e7ea537ae34234ccbe6fef9b2519a4da51bJulia Reynolds            app.extraInfo = mNotifBackend.loadAppRow(mContext, mPm, app.info);
58584b2b2bc17a4ccf42952b188722de1091c101beJason Monk        }
59584b2b2bc17a4ccf42952b188722de1091c101beJason Monk    }
60584b2b2bc17a4ccf42952b188722de1091c101beJason Monk
61d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk    @Override
62d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk    protected void updateExtraInfo(AppEntry app, String pkg, int uid) {
633e912e7ea537ae34234ccbe6fef9b2519a4da51bJulia Reynolds        app.extraInfo = mNotifBackend.loadAppRow(mContext, mPm, app.info);
64584b2b2bc17a4ccf42952b188722de1091c101beJason Monk    }
65584b2b2bc17a4ccf42952b188722de1091c101beJason Monk
66584b2b2bc17a4ccf42952b188722de1091c101beJason Monk    public static final AppFilter FILTER_APP_NOTIFICATION_BLOCKED = new AppFilter() {
67584b2b2bc17a4ccf42952b188722de1091c101beJason Monk        @Override
68584b2b2bc17a4ccf42952b188722de1091c101beJason Monk        public void init() {
69584b2b2bc17a4ccf42952b188722de1091c101beJason Monk        }
70584b2b2bc17a4ccf42952b188722de1091c101beJason Monk
71584b2b2bc17a4ccf42952b188722de1091c101beJason Monk        @Override
72584b2b2bc17a4ccf42952b188722de1091c101beJason Monk        public boolean filterApp(AppEntry info) {
73e89bebe96f547fc7e6badf3e2bc80eebdda7793cJulia Reynolds            if (info == null || info.extraInfo == null) {
74e89bebe96f547fc7e6badf3e2bc80eebdda7793cJulia Reynolds                return false;
75e89bebe96f547fc7e6badf3e2bc80eebdda7793cJulia Reynolds            }
76a2d47fcf59f03d091edaf5895fd3b651e1f499e1Jason Monk            if (info.extraInfo instanceof AppRow) {
77a2d47fcf59f03d091edaf5895fd3b651e1f499e1Jason Monk                AppRow row = (AppRow) info.extraInfo;
78a2d47fcf59f03d091edaf5895fd3b651e1f499e1Jason Monk                return row.banned;
79e07f385ae0acfcf8466859cb65f883e0b9830d90Julia Reynolds            }
80a2d47fcf59f03d091edaf5895fd3b651e1f499e1Jason Monk            return false;
81584b2b2bc17a4ccf42952b188722de1091c101beJason Monk        }
82584b2b2bc17a4ccf42952b188722de1091c101beJason Monk    };
83beb5e5210b55926fa4a7302a9e9d00ef49f40314Julia Reynolds
84beb5e5210b55926fa4a7302a9e9d00ef49f40314Julia Reynolds    public static final AppFilter FILTER_APP_NOTIFICATION_SILENCED = new AppFilter() {
85beb5e5210b55926fa4a7302a9e9d00ef49f40314Julia Reynolds        @Override
86beb5e5210b55926fa4a7302a9e9d00ef49f40314Julia Reynolds        public void init() {
87beb5e5210b55926fa4a7302a9e9d00ef49f40314Julia Reynolds        }
88beb5e5210b55926fa4a7302a9e9d00ef49f40314Julia Reynolds
89beb5e5210b55926fa4a7302a9e9d00ef49f40314Julia Reynolds        @Override
90beb5e5210b55926fa4a7302a9e9d00ef49f40314Julia Reynolds        public boolean filterApp(AppEntry info) {
91e89bebe96f547fc7e6badf3e2bc80eebdda7793cJulia Reynolds            if (info == null || info.extraInfo == null) {
92beb5e5210b55926fa4a7302a9e9d00ef49f40314Julia Reynolds                return false;
93beb5e5210b55926fa4a7302a9e9d00ef49f40314Julia Reynolds            }
94beb5e5210b55926fa4a7302a9e9d00ef49f40314Julia Reynolds            AppRow row = (AppRow) info.extraInfo;
95beb5e5210b55926fa4a7302a9e9d00ef49f40314Julia Reynolds            return row.appImportance > NotificationListenerService.Ranking.IMPORTANCE_NONE
96beb5e5210b55926fa4a7302a9e9d00ef49f40314Julia Reynolds                    && row.appImportance < NotificationListenerService.Ranking.IMPORTANCE_DEFAULT;
97beb5e5210b55926fa4a7302a9e9d00ef49f40314Julia Reynolds        }
98beb5e5210b55926fa4a7302a9e9d00ef49f40314Julia Reynolds    };
99beb5e5210b55926fa4a7302a9e9d00ef49f40314Julia Reynolds
100beb5e5210b55926fa4a7302a9e9d00ef49f40314Julia Reynolds    public static final AppFilter FILTER_APP_NOTIFICATION_PRIORITY = new AppFilter() {
101beb5e5210b55926fa4a7302a9e9d00ef49f40314Julia Reynolds        @Override
102beb5e5210b55926fa4a7302a9e9d00ef49f40314Julia Reynolds        public void init() {
103beb5e5210b55926fa4a7302a9e9d00ef49f40314Julia Reynolds        }
104beb5e5210b55926fa4a7302a9e9d00ef49f40314Julia Reynolds
105beb5e5210b55926fa4a7302a9e9d00ef49f40314Julia Reynolds        @Override
106beb5e5210b55926fa4a7302a9e9d00ef49f40314Julia Reynolds        public boolean filterApp(AppEntry info) {
107e89bebe96f547fc7e6badf3e2bc80eebdda7793cJulia Reynolds            if (info == null || info.extraInfo == null) {
108e89bebe96f547fc7e6badf3e2bc80eebdda7793cJulia Reynolds                return false;
109e89bebe96f547fc7e6badf3e2bc80eebdda7793cJulia Reynolds            }
110e89bebe96f547fc7e6badf3e2bc80eebdda7793cJulia Reynolds            return ((AppRow) info.extraInfo).appBypassDnd;
111beb5e5210b55926fa4a7302a9e9d00ef49f40314Julia Reynolds        }
112beb5e5210b55926fa4a7302a9e9d00ef49f40314Julia Reynolds    };
113beb5e5210b55926fa4a7302a9e9d00ef49f40314Julia Reynolds
114beb5e5210b55926fa4a7302a9e9d00ef49f40314Julia Reynolds    public static final AppFilter FILTER_APP_NOTIFICATION_HIDE_SENSITIVE = new AppFilter() {
115beb5e5210b55926fa4a7302a9e9d00ef49f40314Julia Reynolds        @Override
116beb5e5210b55926fa4a7302a9e9d00ef49f40314Julia Reynolds        public void init() {
117beb5e5210b55926fa4a7302a9e9d00ef49f40314Julia Reynolds        }
118beb5e5210b55926fa4a7302a9e9d00ef49f40314Julia Reynolds
119beb5e5210b55926fa4a7302a9e9d00ef49f40314Julia Reynolds        @Override
120beb5e5210b55926fa4a7302a9e9d00ef49f40314Julia Reynolds        public boolean filterApp(AppEntry info) {
121e89bebe96f547fc7e6badf3e2bc80eebdda7793cJulia Reynolds            if (info == null || info.extraInfo == null) {
122e89bebe96f547fc7e6badf3e2bc80eebdda7793cJulia Reynolds                return false;
123e89bebe96f547fc7e6badf3e2bc80eebdda7793cJulia Reynolds            }
124e89bebe96f547fc7e6badf3e2bc80eebdda7793cJulia Reynolds            return ((AppRow) info.extraInfo).lockScreenSecure
125beb5e5210b55926fa4a7302a9e9d00ef49f40314Julia Reynolds                    && ((AppRow) info.extraInfo).appVisOverride == Notification.VISIBILITY_PRIVATE;
126beb5e5210b55926fa4a7302a9e9d00ef49f40314Julia Reynolds        }
127beb5e5210b55926fa4a7302a9e9d00ef49f40314Julia Reynolds    };
128beb5e5210b55926fa4a7302a9e9d00ef49f40314Julia Reynolds
129beb5e5210b55926fa4a7302a9e9d00ef49f40314Julia Reynolds    public static final AppFilter FILTER_APP_NOTIFICATION_HIDE_ALL = new AppFilter() {
130beb5e5210b55926fa4a7302a9e9d00ef49f40314Julia Reynolds        @Override
131beb5e5210b55926fa4a7302a9e9d00ef49f40314Julia Reynolds        public void init() {
132beb5e5210b55926fa4a7302a9e9d00ef49f40314Julia Reynolds        }
133beb5e5210b55926fa4a7302a9e9d00ef49f40314Julia Reynolds
134beb5e5210b55926fa4a7302a9e9d00ef49f40314Julia Reynolds        @Override
135beb5e5210b55926fa4a7302a9e9d00ef49f40314Julia Reynolds        public boolean filterApp(AppEntry info) {
136e89bebe96f547fc7e6badf3e2bc80eebdda7793cJulia Reynolds            if (info == null || info.extraInfo == null) {
137e89bebe96f547fc7e6badf3e2bc80eebdda7793cJulia Reynolds                return false;
138e89bebe96f547fc7e6badf3e2bc80eebdda7793cJulia Reynolds            }
139e89bebe96f547fc7e6badf3e2bc80eebdda7793cJulia Reynolds            return ((AppRow) info.extraInfo).lockScreenSecure
140beb5e5210b55926fa4a7302a9e9d00ef49f40314Julia Reynolds                    && ((AppRow) info.extraInfo).appVisOverride == Notification.VISIBILITY_SECRET;
141beb5e5210b55926fa4a7302a9e9d00ef49f40314Julia Reynolds        }
142beb5e5210b55926fa4a7302a9e9d00ef49f40314Julia Reynolds    };
143584b2b2bc17a4ccf42952b188722de1091c101beJason Monk}
144