1503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato/*
2503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato * Copyright (C) 2008 The Android Open Source Project
3503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato *
4503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato * Licensed under the Apache License, Version 2.0 (the "License");
5503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato * you may not use this file except in compliance with the License.
6503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato * You may obtain a copy of the License at
7503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato *
8503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato *      http://www.apache.org/licenses/LICENSE-2.0
9503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato *
10503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato * Unless required by applicable law or agreed to in writing, software
11503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato * distributed under the License is distributed on an "AS IS" BASIS,
12503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato * See the License for the specific language governing permissions and
14503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato * limitations under the License.
15503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato */
16503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato
1779de0c550037a5328bbc7f4fddaf02f192a5c283Joe Onoratopackage com.android.systemui.statusbar;
18503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato
1937fe69322517809d38c1934239a6e117c39d40e7Christoph Studerimport android.app.Notification;
20d9228f1135e51d9380bad990d7178490ec474dbdJulia Reynoldsimport android.content.Context;
21b18a20f13cc5fc36b84f19bb89a9e479bb1fb4eaSelim Cinekimport android.os.SystemClock;
223ad4e3a45bbe44129b14c4d391431e44f1e04f0cChris Wrenimport android.service.notification.NotificationListenerService;
2337fe69322517809d38c1934239a6e117c39d40e7Christoph Studerimport android.service.notification.NotificationListenerService.Ranking;
24d0694b6735a9d91794e6096961231e07364ba3faChristoph Studerimport android.service.notification.NotificationListenerService.RankingMap;
25de84f0e77ea2bf713d15c290264059a413c2486aJohn Spurlockimport android.service.notification.StatusBarNotification;
26c8db24bc32034accf1eb614c8d68bb80b41ae73fChristoph Studerimport android.util.ArrayMap;
27e345fff2f80947b0a821f6674c197a02b7bff08eJoe Onoratoimport android.view.View;
28d9228f1135e51d9380bad990d7178490ec474dbdJulia Reynoldsimport android.widget.RemoteViews;
29503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato
3025fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinekimport com.android.systemui.statusbar.phone.NotificationGroupManager;
31fbe9a44a15addf9d94cd40da56835501241b8d3eSelim Cinekimport com.android.systemui.statusbar.policy.HeadsUpManager;
3225fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek
33c8db24bc32034accf1eb614c8d68bb80b41ae73fChristoph Studerimport java.io.PrintWriter;
34e345fff2f80947b0a821f6674c197a02b7bff08eJoe Onoratoimport java.util.ArrayList;
3537fe69322517809d38c1934239a6e117c39d40e7Christoph Studerimport java.util.Collections;
36de84f0e77ea2bf713d15c290264059a413c2486aJohn Spurlockimport java.util.Comparator;
37e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynoldsimport java.util.Map;
38247fa0193196c9d190770b641cfc28e862525012Selim Cinekimport java.util.Objects;
39e345fff2f80947b0a821f6674c197a02b7bff08eJoe Onorato
40e345fff2f80947b0a821f6674c197a02b7bff08eJoe Onorato/**
41e345fff2f80947b0a821f6674c197a02b7bff08eJoe Onorato * The list of currently displaying notifications.
42e345fff2f80947b0a821f6674c197a02b7bff08eJoe Onorato */
43503007dd023668b1e45de948d3673e594d7f5a82Joe Onoratopublic class NotificationData {
44c8db24bc32034accf1eb614c8d68bb80b41ae73fChristoph Studer
45c8db24bc32034accf1eb614c8d68bb80b41ae73fChristoph Studer    private final Environment mEnvironment;
46fbe9a44a15addf9d94cd40da56835501241b8d3eSelim Cinek    private HeadsUpManager mHeadsUpManager;
47c8db24bc32034accf1eb614c8d68bb80b41ae73fChristoph Studer
48e345fff2f80947b0a821f6674c197a02b7bff08eJoe Onorato    public static final class Entry {
49b18a20f13cc5fc36b84f19bb89a9e479bb1fb4eaSelim Cinek        private static final long LAUNCH_COOLDOWN = 2000;
50b18a20f13cc5fc36b84f19bb89a9e479bb1fb4eaSelim Cinek        private static final long NOT_LAUNCHED_YET = -LAUNCH_COOLDOWN;
5171f18fd1b64071e486bafff237b1f87a56d4aeadChristoph Studer        public String key;
52e345fff2f80947b0a821f6674c197a02b7bff08eJoe Onorato        public StatusBarNotification notification;
5366b4c5bb36f57a9d83bb7f34288235b82f9be407Joe Onorato        public StatusBarIconView icon;
5451c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren        public ExpandableNotificationRow row; // the outer expanded view
55f0048ce66fa7b4859b44badc8e58ea8b27e2356bChris Wren        private boolean interruption;
5636b15237a633ca906029e6ccdc4c55fa6309afe8Jorim Jaggi        public boolean autoRedacted; // whether the redacted notification was generated by us
5736b15237a633ca906029e6ccdc4c55fa6309afe8Jorim Jaggi        public boolean legacy; // whether the notification has a legacy, dark background
58a1eeadee63cad1d6405804f0e7e88c8b9a4ba2b1Jorim Jaggi        public int targetSdk;
59b18a20f13cc5fc36b84f19bb89a9e479bb1fb4eaSelim Cinek        private long lastFullScreenIntentLaunchTime = NOT_LAUNCHED_YET;
60d9228f1135e51d9380bad990d7178490ec474dbdJulia Reynolds        public RemoteViews cachedContentView;
61d9228f1135e51d9380bad990d7178490ec474dbdJulia Reynolds        public RemoteViews cachedBigContentView;
62d9228f1135e51d9380bad990d7178490ec474dbdJulia Reynolds        public RemoteViews cachedHeadsUpContentView;
63d9228f1135e51d9380bad990d7178490ec474dbdJulia Reynolds        public RemoteViews cachedPublicContentView;
64777ef5688f188a5717b74d604bb7213b1b66386dAdrian Roos        public CharSequence remoteInputText;
6536b15237a633ca906029e6ccdc4c55fa6309afe8Jorim Jaggi
6671f18fd1b64071e486bafff237b1f87a56d4aeadChristoph Studer        public Entry(StatusBarNotification n, StatusBarIconView ic) {
6771f18fd1b64071e486bafff237b1f87a56d4aeadChristoph Studer            this.key = n.getKey();
683eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler            this.notification = n;
693eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler            this.icon = ic;
703eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler        }
71f0048ce66fa7b4859b44badc8e58ea8b27e2356bChris Wren
72f0048ce66fa7b4859b44badc8e58ea8b27e2356bChris Wren        public void setInterruption() {
73f0048ce66fa7b4859b44badc8e58ea8b27e2356bChris Wren            interruption = true;
74f0048ce66fa7b4859b44badc8e58ea8b27e2356bChris Wren        }
75d04f6cee5f6d98a60c0092a217a15ea5c2d3a106Chris Wren
76d04f6cee5f6d98a60c0092a217a15ea5c2d3a106Chris Wren        public boolean hasInterrupted() {
77d04f6cee5f6d98a60c0092a217a15ea5c2d3a106Chris Wren            return interruption;
78d04f6cee5f6d98a60c0092a217a15ea5c2d3a106Chris Wren        }
7922f2ee567dd1b1a42432251229bcb2f05c1c4700Christoph Studer
8022f2ee567dd1b1a42432251229bcb2f05c1c4700Christoph Studer        /**
8122f2ee567dd1b1a42432251229bcb2f05c1c4700Christoph Studer         * Resets the notification entry to be re-used.
8222f2ee567dd1b1a42432251229bcb2f05c1c4700Christoph Studer         */
8322f2ee567dd1b1a42432251229bcb2f05c1c4700Christoph Studer        public void reset() {
8422f2ee567dd1b1a42432251229bcb2f05c1c4700Christoph Studer            // NOTE: Icon needs to be preserved for now.
8522f2ee567dd1b1a42432251229bcb2f05c1c4700Christoph Studer            // We should fix this at some point.
8622f2ee567dd1b1a42432251229bcb2f05c1c4700Christoph Studer            autoRedacted = false;
8722f2ee567dd1b1a42432251229bcb2f05c1c4700Christoph Studer            legacy = false;
88b18a20f13cc5fc36b84f19bb89a9e479bb1fb4eaSelim Cinek            lastFullScreenIntentLaunchTime = NOT_LAUNCHED_YET;
8922f2ee567dd1b1a42432251229bcb2f05c1c4700Christoph Studer            if (row != null) {
9022f2ee567dd1b1a42432251229bcb2f05c1c4700Christoph Studer                row.reset();
9122f2ee567dd1b1a42432251229bcb2f05c1c4700Christoph Studer            }
9222f2ee567dd1b1a42432251229bcb2f05c1c4700Christoph Studer        }
93684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek
94684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek        public View getContentView() {
95684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek            return row.getPrivateLayout().getContractedChild();
96684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek        }
97684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek
98684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek        public View getExpandedContentView() {
99684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek            return row.getPrivateLayout().getExpandedChild();
100684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek        }
101684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek
102684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek        public View getHeadsUpContentView() {
103684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek            return row.getPrivateLayout().getHeadsUpChild();
104684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek        }
105684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek
106684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek        public View getPublicContentView() {
107684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek            return row.getPublicLayout().getContractedChild();
108684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek        }
109b18a20f13cc5fc36b84f19bb89a9e479bb1fb4eaSelim Cinek
110d9228f1135e51d9380bad990d7178490ec474dbdJulia Reynolds        public boolean cacheContentViews(Context ctx, Notification updatedNotification) {
1116b53135736c597dfbadcb5127de61be4f9b19ce5Julia Reynolds            boolean applyInPlace = false;
112d9228f1135e51d9380bad990d7178490ec474dbdJulia Reynolds            if (updatedNotification != null) {
113d9228f1135e51d9380bad990d7178490ec474dbdJulia Reynolds                final Notification.Builder updatedNotificationBuilder
114d9228f1135e51d9380bad990d7178490ec474dbdJulia Reynolds                        = Notification.Builder.recoverBuilder(ctx, updatedNotification);
1153b84812271cda2386557979503c29f3c530b7f90Julia Reynolds                final RemoteViews newContentView = updatedNotificationBuilder.createContentView();
116d9228f1135e51d9380bad990d7178490ec474dbdJulia Reynolds                final RemoteViews newBigContentView =
1173b84812271cda2386557979503c29f3c530b7f90Julia Reynolds                        updatedNotificationBuilder.createBigContentView();
118d9228f1135e51d9380bad990d7178490ec474dbdJulia Reynolds                final RemoteViews newHeadsUpContentView =
1193b84812271cda2386557979503c29f3c530b7f90Julia Reynolds                        updatedNotificationBuilder.createHeadsUpContentView();
120624c02db7f1d24ec1e307530ff32d4fd5859feaeSelim Cinek                final RemoteViews newPublicNotification
121624c02db7f1d24ec1e307530ff32d4fd5859feaeSelim Cinek                        = updatedNotificationBuilder.makePublicContentView();
1226b53135736c597dfbadcb5127de61be4f9b19ce5Julia Reynolds
123247fa0193196c9d190770b641cfc28e862525012Selim Cinek                boolean sameCustomView = Objects.equals(
124247fa0193196c9d190770b641cfc28e862525012Selim Cinek                        notification.getNotification().extras.getBoolean(
125247fa0193196c9d190770b641cfc28e862525012Selim Cinek                                Notification.EXTRA_CONTAINS_CUSTOM_VIEW),
126247fa0193196c9d190770b641cfc28e862525012Selim Cinek                        updatedNotification.extras.getBoolean(
127247fa0193196c9d190770b641cfc28e862525012Selim Cinek                                Notification.EXTRA_CONTAINS_CUSTOM_VIEW));
1286b53135736c597dfbadcb5127de61be4f9b19ce5Julia Reynolds                applyInPlace = compareRemoteViews(cachedContentView, newContentView)
1296b53135736c597dfbadcb5127de61be4f9b19ce5Julia Reynolds                        && compareRemoteViews(cachedBigContentView, newBigContentView)
1306b53135736c597dfbadcb5127de61be4f9b19ce5Julia Reynolds                        && compareRemoteViews(cachedHeadsUpContentView, newHeadsUpContentView)
131247fa0193196c9d190770b641cfc28e862525012Selim Cinek                        && compareRemoteViews(cachedPublicContentView, newPublicNotification)
132247fa0193196c9d190770b641cfc28e862525012Selim Cinek                        && sameCustomView;
133624c02db7f1d24ec1e307530ff32d4fd5859feaeSelim Cinek                cachedPublicContentView = newPublicNotification;
1346b53135736c597dfbadcb5127de61be4f9b19ce5Julia Reynolds                cachedHeadsUpContentView = newHeadsUpContentView;
1356b53135736c597dfbadcb5127de61be4f9b19ce5Julia Reynolds                cachedBigContentView = newBigContentView;
1366b53135736c597dfbadcb5127de61be4f9b19ce5Julia Reynolds                cachedContentView = newContentView;
137d9228f1135e51d9380bad990d7178490ec474dbdJulia Reynolds            } else {
138d9228f1135e51d9380bad990d7178490ec474dbdJulia Reynolds                final Notification.Builder builder
139d9228f1135e51d9380bad990d7178490ec474dbdJulia Reynolds                        = Notification.Builder.recoverBuilder(ctx, notification.getNotification());
140d9228f1135e51d9380bad990d7178490ec474dbdJulia Reynolds
1413b84812271cda2386557979503c29f3c530b7f90Julia Reynolds                cachedContentView = builder.createContentView();
1423b84812271cda2386557979503c29f3c530b7f90Julia Reynolds                cachedBigContentView = builder.createBigContentView();
1433b84812271cda2386557979503c29f3c530b7f90Julia Reynolds                cachedHeadsUpContentView = builder.createHeadsUpContentView();
144624c02db7f1d24ec1e307530ff32d4fd5859feaeSelim Cinek                cachedPublicContentView = builder.makePublicContentView();
145d9228f1135e51d9380bad990d7178490ec474dbdJulia Reynolds
1466b53135736c597dfbadcb5127de61be4f9b19ce5Julia Reynolds                applyInPlace = false;
147d9228f1135e51d9380bad990d7178490ec474dbdJulia Reynolds            }
1486b53135736c597dfbadcb5127de61be4f9b19ce5Julia Reynolds            return applyInPlace;
149d9228f1135e51d9380bad990d7178490ec474dbdJulia Reynolds        }
150d9228f1135e51d9380bad990d7178490ec474dbdJulia Reynolds
151d9228f1135e51d9380bad990d7178490ec474dbdJulia Reynolds        // Returns true if the RemoteViews are the same.
152d9228f1135e51d9380bad990d7178490ec474dbdJulia Reynolds        private boolean compareRemoteViews(final RemoteViews a, final RemoteViews b) {
153d9228f1135e51d9380bad990d7178490ec474dbdJulia Reynolds            return (a == null && b == null) ||
154d9228f1135e51d9380bad990d7178490ec474dbdJulia Reynolds                    (a != null && b != null
155d9228f1135e51d9380bad990d7178490ec474dbdJulia Reynolds                    && b.getPackage() != null
156d9228f1135e51d9380bad990d7178490ec474dbdJulia Reynolds                    && a.getPackage() != null
157d9228f1135e51d9380bad990d7178490ec474dbdJulia Reynolds                    && a.getPackage().equals(b.getPackage())
158d9228f1135e51d9380bad990d7178490ec474dbdJulia Reynolds                    && a.getLayoutId() == b.getLayoutId());
159d9228f1135e51d9380bad990d7178490ec474dbdJulia Reynolds        }
160d9228f1135e51d9380bad990d7178490ec474dbdJulia Reynolds
161b18a20f13cc5fc36b84f19bb89a9e479bb1fb4eaSelim Cinek        public void notifyFullScreenIntentLaunched() {
162b18a20f13cc5fc36b84f19bb89a9e479bb1fb4eaSelim Cinek            lastFullScreenIntentLaunchTime = SystemClock.elapsedRealtime();
163b18a20f13cc5fc36b84f19bb89a9e479bb1fb4eaSelim Cinek        }
164b18a20f13cc5fc36b84f19bb89a9e479bb1fb4eaSelim Cinek
165b18a20f13cc5fc36b84f19bb89a9e479bb1fb4eaSelim Cinek        public boolean hasJustLaunchedFullScreenIntent() {
166b18a20f13cc5fc36b84f19bb89a9e479bb1fb4eaSelim Cinek            return SystemClock.elapsedRealtime() < lastFullScreenIntentLaunchTime + LAUNCH_COOLDOWN;
167b18a20f13cc5fc36b84f19bb89a9e479bb1fb4eaSelim Cinek        }
168e345fff2f80947b0a821f6674c197a02b7bff08eJoe Onorato    }
16971f18fd1b64071e486bafff237b1f87a56d4aeadChristoph Studer
170c8db24bc32034accf1eb614c8d68bb80b41ae73fChristoph Studer    private final ArrayMap<String, Entry> mEntries = new ArrayMap<>();
171c8db24bc32034accf1eb614c8d68bb80b41ae73fChristoph Studer    private final ArrayList<Entry> mSortedAndFiltered = new ArrayList<>();
17225fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek
17325fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek    private NotificationGroupManager mGroupManager;
174c8db24bc32034accf1eb614c8d68bb80b41ae73fChristoph Studer
1751d599da8424cef8d07cb4c533bd212d992d8f676Christoph Studer    private RankingMap mRankingMap;
1761d599da8424cef8d07cb4c533bd212d992d8f676Christoph Studer    private final Ranking mTmpRanking = new Ranking();
17725fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek
178fbe9a44a15addf9d94cd40da56835501241b8d3eSelim Cinek    public void setHeadsUpManager(HeadsUpManager headsUpManager) {
179fbe9a44a15addf9d94cd40da56835501241b8d3eSelim Cinek        mHeadsUpManager = headsUpManager;
180fbe9a44a15addf9d94cd40da56835501241b8d3eSelim Cinek    }
181fbe9a44a15addf9d94cd40da56835501241b8d3eSelim Cinek
18237fe69322517809d38c1934239a6e117c39d40e7Christoph Studer    private final Comparator<Entry> mRankingComparator = new Comparator<Entry>() {
1831d599da8424cef8d07cb4c533bd212d992d8f676Christoph Studer        private final Ranking mRankingA = new Ranking();
1841d599da8424cef8d07cb4c533bd212d992d8f676Christoph Studer        private final Ranking mRankingB = new Ranking();
1851d599da8424cef8d07cb4c533bd212d992d8f676Christoph Studer
18637fe69322517809d38c1934239a6e117c39d40e7Christoph Studer        @Override
187379020aec619c66d3e040de01f0726687fd2ad85Daniel Sandler        public int compare(Entry a, Entry b) {
1881492116a1cf44941ee2c8be68f6df6c14cfd39c5Christoph Studer            final StatusBarNotification na = a.notification;
1891492116a1cf44941ee2c8be68f6df6c14cfd39c5Christoph Studer            final StatusBarNotification nb = b.notification;
190bdf3376616c276ed18a51185351b44fd16eeae29Chris Wren            int aImportance = Ranking.IMPORTANCE_DEFAULT;
191bdf3376616c276ed18a51185351b44fd16eeae29Chris Wren            int bImportance = Ranking.IMPORTANCE_DEFAULT;
192bdf3376616c276ed18a51185351b44fd16eeae29Chris Wren            int aRank = 0;
193bdf3376616c276ed18a51185351b44fd16eeae29Chris Wren            int bRank = 0;
194bdf3376616c276ed18a51185351b44fd16eeae29Chris Wren
195bdf3376616c276ed18a51185351b44fd16eeae29Chris Wren            if (mRankingMap != null) {
196bdf3376616c276ed18a51185351b44fd16eeae29Chris Wren                // RankingMap as received from NoMan
197bdf3376616c276ed18a51185351b44fd16eeae29Chris Wren                mRankingMap.getRanking(a.key, mRankingA);
198bdf3376616c276ed18a51185351b44fd16eeae29Chris Wren                mRankingMap.getRanking(b.key, mRankingB);
199bdf3376616c276ed18a51185351b44fd16eeae29Chris Wren                aImportance = mRankingA.getImportance();
200bdf3376616c276ed18a51185351b44fd16eeae29Chris Wren                bImportance = mRankingB.getImportance();
201bdf3376616c276ed18a51185351b44fd16eeae29Chris Wren                aRank = mRankingA.getRank();
202bdf3376616c276ed18a51185351b44fd16eeae29Chris Wren                bRank = mRankingB.getRank();
203bdf3376616c276ed18a51185351b44fd16eeae29Chris Wren            }
2044e78706f439d318ae7a78927d98f734351a89f64Dan Sandler
2054e78706f439d318ae7a78927d98f734351a89f64Dan Sandler            String mediaNotification = mEnvironment.getCurrentMediaNotificationKey();
2064e78706f439d318ae7a78927d98f734351a89f64Dan Sandler
207f0f629ffe44716b8d900929135142f0ebb9325f4Julia Reynolds            // IMPORTANCE_MIN media streams are allowed to drift to the bottom
2084e78706f439d318ae7a78927d98f734351a89f64Dan Sandler            final boolean aMedia = a.key.equals(mediaNotification)
209f0f629ffe44716b8d900929135142f0ebb9325f4Julia Reynolds                    && aImportance > Ranking.IMPORTANCE_MIN;
2104e78706f439d318ae7a78927d98f734351a89f64Dan Sandler            final boolean bMedia = b.key.equals(mediaNotification)
211f0f629ffe44716b8d900929135142f0ebb9325f4Julia Reynolds                    && bImportance > Ranking.IMPORTANCE_MIN;
2121492116a1cf44941ee2c8be68f6df6c14cfd39c5Christoph Studer
213bdf3376616c276ed18a51185351b44fd16eeae29Chris Wren            boolean aSystemMax = aImportance >= Ranking.IMPORTANCE_MAX &&
2141492116a1cf44941ee2c8be68f6df6c14cfd39c5Christoph Studer                    isSystemNotification(na);
215bdf3376616c276ed18a51185351b44fd16eeae29Chris Wren            boolean bSystemMax = bImportance >= Ranking.IMPORTANCE_MAX &&
2161492116a1cf44941ee2c8be68f6df6c14cfd39c5Christoph Studer                    isSystemNotification(nb);
2171492116a1cf44941ee2c8be68f6df6c14cfd39c5Christoph Studer
218fbe9a44a15addf9d94cd40da56835501241b8d3eSelim Cinek            boolean isHeadsUp = a.row.isHeadsUp();
219fbe9a44a15addf9d94cd40da56835501241b8d3eSelim Cinek            if (isHeadsUp != b.row.isHeadsUp()) {
220fbe9a44a15addf9d94cd40da56835501241b8d3eSelim Cinek                return isHeadsUp ? -1 : 1;
221fbe9a44a15addf9d94cd40da56835501241b8d3eSelim Cinek            } else if (isHeadsUp) {
222fbe9a44a15addf9d94cd40da56835501241b8d3eSelim Cinek                // Provide consistent ranking with headsUpManager
223fbe9a44a15addf9d94cd40da56835501241b8d3eSelim Cinek                return mHeadsUpManager.compare(a, b);
224fbe9a44a15addf9d94cd40da56835501241b8d3eSelim Cinek            } else if (aMedia != bMedia) {
225fbe9a44a15addf9d94cd40da56835501241b8d3eSelim Cinek                // Upsort current media notification.
226fbe9a44a15addf9d94cd40da56835501241b8d3eSelim Cinek                return aMedia ? -1 : 1;
227fbe9a44a15addf9d94cd40da56835501241b8d3eSelim Cinek            } else if (aSystemMax != bSystemMax) {
228fbe9a44a15addf9d94cd40da56835501241b8d3eSelim Cinek                // Upsort PRIORITY_MAX system notifications
229fbe9a44a15addf9d94cd40da56835501241b8d3eSelim Cinek                return aSystemMax ? -1 : 1;
230bdf3376616c276ed18a51185351b44fd16eeae29Chris Wren            } else if (aRank != bRank) {
231bdf3376616c276ed18a51185351b44fd16eeae29Chris Wren                return aRank - bRank;
232f0048ce66fa7b4859b44badc8e58ea8b27e2356bChris Wren            } else {
23337fe69322517809d38c1934239a6e117c39d40e7Christoph Studer                return (int) (nb.getNotification().when - na.getNotification().when);
234f0048ce66fa7b4859b44badc8e58ea8b27e2356bChris Wren            }
235379020aec619c66d3e040de01f0726687fd2ad85Daniel Sandler        }
236379020aec619c66d3e040de01f0726687fd2ad85Daniel Sandler    };
237e345fff2f80947b0a821f6674c197a02b7bff08eJoe Onorato
238c8db24bc32034accf1eb614c8d68bb80b41ae73fChristoph Studer    public NotificationData(Environment environment) {
239c8db24bc32034accf1eb614c8d68bb80b41ae73fChristoph Studer        mEnvironment = environment;
24025fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek        mGroupManager = environment.getGroupManager();
241e345fff2f80947b0a821f6674c197a02b7bff08eJoe Onorato    }
242e345fff2f80947b0a821f6674c197a02b7bff08eJoe Onorato
243c8db24bc32034accf1eb614c8d68bb80b41ae73fChristoph Studer    /**
244c8db24bc32034accf1eb614c8d68bb80b41ae73fChristoph Studer     * Returns the sorted list of active notifications (depending on {@link Environment}
245c8db24bc32034accf1eb614c8d68bb80b41ae73fChristoph Studer     *
246c8db24bc32034accf1eb614c8d68bb80b41ae73fChristoph Studer     * <p>
247c8db24bc32034accf1eb614c8d68bb80b41ae73fChristoph Studer     * This call doesn't update the list of active notifications. Call {@link #filterAndSort()}
248c8db24bc32034accf1eb614c8d68bb80b41ae73fChristoph Studer     * when the environment changes.
249c8db24bc32034accf1eb614c8d68bb80b41ae73fChristoph Studer     * <p>
250c8db24bc32034accf1eb614c8d68bb80b41ae73fChristoph Studer     * Don't hold on to or modify the returned list.
251c8db24bc32034accf1eb614c8d68bb80b41ae73fChristoph Studer     */
252c8db24bc32034accf1eb614c8d68bb80b41ae73fChristoph Studer    public ArrayList<Entry> getActiveNotifications() {
253c8db24bc32034accf1eb614c8d68bb80b41ae73fChristoph Studer        return mSortedAndFiltered;
2540f0b11c8719495ce559b93366fe9cd79782d791cDaniel Sandler    }
2550f0b11c8719495ce559b93366fe9cd79782d791cDaniel Sandler
256c8db24bc32034accf1eb614c8d68bb80b41ae73fChristoph Studer    public Entry get(String key) {
257c8db24bc32034accf1eb614c8d68bb80b41ae73fChristoph Studer        return mEntries.get(key);
2580e26dffd6cfcb09b08a94a857b891fdef7fe2b1eJoe Onorato    }
2590e26dffd6cfcb09b08a94a857b891fdef7fe2b1eJoe Onorato
260d0694b6735a9d91794e6096961231e07364ba3faChristoph Studer    public void add(Entry entry, RankingMap ranking) {
261e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynolds        synchronized (mEntries) {
262e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynolds            mEntries.put(entry.notification.getKey(), entry);
263e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynolds        }
26425fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek        mGroupManager.onEntryAdded(entry);
265e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynolds        updateRankingAndSort(ranking);
2663eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler    }
2673eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler
268d0694b6735a9d91794e6096961231e07364ba3faChristoph Studer    public Entry remove(String key, RankingMap ranking) {
269e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynolds        Entry removed = null;
270e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynolds        synchronized (mEntries) {
271e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynolds            removed = mEntries.remove(key);
272e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynolds        }
273c8db24bc32034accf1eb614c8d68bb80b41ae73fChristoph Studer        if (removed == null) return null;
27425fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek        mGroupManager.onEntryRemoved(removed);
275e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynolds        updateRankingAndSort(ranking);
276c8db24bc32034accf1eb614c8d68bb80b41ae73fChristoph Studer        return removed;
277503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato    }
27820da8f8ac9cfc8b845231c6b93f5b64a764ab39aJoe Onorato
279d0694b6735a9d91794e6096961231e07364ba3faChristoph Studer    public void updateRanking(RankingMap ranking) {
28037fe69322517809d38c1934239a6e117c39d40e7Christoph Studer        updateRankingAndSort(ranking);
28137fe69322517809d38c1934239a6e117c39d40e7Christoph Studer    }
28237fe69322517809d38c1934239a6e117c39d40e7Christoph Studer
28337fe69322517809d38c1934239a6e117c39d40e7Christoph Studer    public boolean isAmbient(String key) {
284f079fc52f3c8e07cc2b5cc07a4518e0638c64b69John Spurlock        if (mRankingMap != null) {
285f079fc52f3c8e07cc2b5cc07a4518e0638c64b69John Spurlock            mRankingMap.getRanking(key, mTmpRanking);
286f079fc52f3c8e07cc2b5cc07a4518e0638c64b69John Spurlock            return mTmpRanking.isAmbient();
287f079fc52f3c8e07cc2b5cc07a4518e0638c64b69John Spurlock        }
288f079fc52f3c8e07cc2b5cc07a4518e0638c64b69John Spurlock        return false;
28937fe69322517809d38c1934239a6e117c39d40e7Christoph Studer    }
29037fe69322517809d38c1934239a6e117c39d40e7Christoph Studer
2913ad4e3a45bbe44129b14c4d391431e44f1e04f0cChris Wren    public int getVisibilityOverride(String key) {
2923ad4e3a45bbe44129b14c4d391431e44f1e04f0cChris Wren        if (mRankingMap != null) {
2933ad4e3a45bbe44129b14c4d391431e44f1e04f0cChris Wren            mRankingMap.getRanking(key, mTmpRanking);
2943ad4e3a45bbe44129b14c4d391431e44f1e04f0cChris Wren            return mTmpRanking.getVisibilityOverride();
2953ad4e3a45bbe44129b14c4d391431e44f1e04f0cChris Wren        }
296ead00aac154f76abfc9739d76b100597b3e42d96Julia Reynolds        return Ranking.VISIBILITY_NO_OVERRIDE;
2973ad4e3a45bbe44129b14c4d391431e44f1e04f0cChris Wren    }
2983ad4e3a45bbe44129b14c4d391431e44f1e04f0cChris Wren
299d560729ce3a6f3d51c03d39768815b4c49f7a8f4Julia Reynolds    public boolean shouldSuppressScreenOff(String key) {
300f612869ae1190e0885b58a3c33b23d36d7732f06Julia Reynolds        if (mRankingMap != null) {
301f612869ae1190e0885b58a3c33b23d36d7732f06Julia Reynolds            mRankingMap.getRanking(key, mTmpRanking);
302f612869ae1190e0885b58a3c33b23d36d7732f06Julia Reynolds            return (mTmpRanking.getSuppressedVisualEffects()
303d560729ce3a6f3d51c03d39768815b4c49f7a8f4Julia Reynolds                    & NotificationListenerService.SUPPRESSED_EFFECT_SCREEN_OFF) != 0;
304f612869ae1190e0885b58a3c33b23d36d7732f06Julia Reynolds        }
305f612869ae1190e0885b58a3c33b23d36d7732f06Julia Reynolds        return false;
306f612869ae1190e0885b58a3c33b23d36d7732f06Julia Reynolds    }
307f612869ae1190e0885b58a3c33b23d36d7732f06Julia Reynolds
308617215874db9c208a74dc97f4133e6b6fc96271cJulia Reynolds    public boolean shouldSuppressScreenOn(String key) {
309617215874db9c208a74dc97f4133e6b6fc96271cJulia Reynolds        if (mRankingMap != null) {
310617215874db9c208a74dc97f4133e6b6fc96271cJulia Reynolds            mRankingMap.getRanking(key, mTmpRanking);
311617215874db9c208a74dc97f4133e6b6fc96271cJulia Reynolds            return (mTmpRanking.getSuppressedVisualEffects()
312617215874db9c208a74dc97f4133e6b6fc96271cJulia Reynolds                    & NotificationListenerService.SUPPRESSED_EFFECT_SCREEN_ON) != 0;
313617215874db9c208a74dc97f4133e6b6fc96271cJulia Reynolds        }
314617215874db9c208a74dc97f4133e6b6fc96271cJulia Reynolds        return false;
315617215874db9c208a74dc97f4133e6b6fc96271cJulia Reynolds    }
316617215874db9c208a74dc97f4133e6b6fc96271cJulia Reynolds
317bdf3376616c276ed18a51185351b44fd16eeae29Chris Wren    public int getImportance(String key) {
318bdf3376616c276ed18a51185351b44fd16eeae29Chris Wren        if (mRankingMap != null) {
319bdf3376616c276ed18a51185351b44fd16eeae29Chris Wren            mRankingMap.getRanking(key, mTmpRanking);
320bdf3376616c276ed18a51185351b44fd16eeae29Chris Wren            return mTmpRanking.getImportance();
321bdf3376616c276ed18a51185351b44fd16eeae29Chris Wren        }
322bdf3376616c276ed18a51185351b44fd16eeae29Chris Wren        return Ranking.IMPORTANCE_UNSPECIFIED;
323bdf3376616c276ed18a51185351b44fd16eeae29Chris Wren    }
324bdf3376616c276ed18a51185351b44fd16eeae29Chris Wren
325e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynolds    public String getOverrideGroupKey(String key) {
326e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynolds        if (mRankingMap != null) {
327e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynolds            mRankingMap.getRanking(key, mTmpRanking);
328e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynolds            return mTmpRanking.getOverrideGroupKey();
329e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynolds        }
330e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynolds         return null;
331e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynolds    }
332e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynolds
333d0694b6735a9d91794e6096961231e07364ba3faChristoph Studer    private void updateRankingAndSort(RankingMap ranking) {
33437fe69322517809d38c1934239a6e117c39d40e7Christoph Studer        if (ranking != null) {
3351d599da8424cef8d07cb4c533bd212d992d8f676Christoph Studer            mRankingMap = ranking;
336e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynolds            synchronized (mEntries) {
337e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynolds                final int N = mEntries.size();
338e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynolds                for (int i = 0; i < N; i++) {
339e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynolds                    Entry entry = mEntries.valueAt(i);
340e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynolds                    final StatusBarNotification oldSbn = entry.notification.clone();
341e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynolds                    final String overrideGroupKey = getOverrideGroupKey(entry.key);
342e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynolds                    if (!Objects.equals(oldSbn.getOverrideGroupKey(), overrideGroupKey)) {
343e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynolds                        entry.notification.setOverrideGroupKey(overrideGroupKey);
344e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynolds                        mGroupManager.onEntryUpdated(entry, oldSbn);
345e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynolds                    }
346e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynolds                    //mGroupManager.onEntryBundlingUpdated(entry, getOverrideGroupKey(entry.key));
347e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynolds                }
348e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynolds            }
34937fe69322517809d38c1934239a6e117c39d40e7Christoph Studer        }
350c8db24bc32034accf1eb614c8d68bb80b41ae73fChristoph Studer        filterAndSort();
35137fe69322517809d38c1934239a6e117c39d40e7Christoph Studer    }
35237fe69322517809d38c1934239a6e117c39d40e7Christoph Studer
353c8db24bc32034accf1eb614c8d68bb80b41ae73fChristoph Studer    // TODO: This should not be public. Instead the Environment should notify this class when
354c8db24bc32034accf1eb614c8d68bb80b41ae73fChristoph Studer    // anything changed, and this class should call back the UI so it updates itself.
355c8db24bc32034accf1eb614c8d68bb80b41ae73fChristoph Studer    public void filterAndSort() {
356c8db24bc32034accf1eb614c8d68bb80b41ae73fChristoph Studer        mSortedAndFiltered.clear();
357c8db24bc32034accf1eb614c8d68bb80b41ae73fChristoph Studer
358e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynolds        synchronized (mEntries) {
359e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynolds            final int N = mEntries.size();
360e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynolds            for (int i = 0; i < N; i++) {
361e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynolds                Entry entry = mEntries.valueAt(i);
362e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynolds                StatusBarNotification sbn = entry.notification;
363c8db24bc32034accf1eb614c8d68bb80b41ae73fChristoph Studer
364e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynolds                if (shouldFilterOut(sbn)) {
365e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynolds                    continue;
366e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynolds                }
367c8db24bc32034accf1eb614c8d68bb80b41ae73fChristoph Studer
368e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynolds                mSortedAndFiltered.add(entry);
369e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynolds            }
370c8db24bc32034accf1eb614c8d68bb80b41ae73fChristoph Studer        }
371c8db24bc32034accf1eb614c8d68bb80b41ae73fChristoph Studer
372c8db24bc32034accf1eb614c8d68bb80b41ae73fChristoph Studer        Collections.sort(mSortedAndFiltered, mRankingComparator);
373c8db24bc32034accf1eb614c8d68bb80b41ae73fChristoph Studer    }
374c8db24bc32034accf1eb614c8d68bb80b41ae73fChristoph Studer
3752f9dbbaee7d9add7656614d8cff387561ba859baChristoph Studer    boolean shouldFilterOut(StatusBarNotification sbn) {
376c8db24bc32034accf1eb614c8d68bb80b41ae73fChristoph Studer        if (!(mEnvironment.isDeviceProvisioned() ||
377c8db24bc32034accf1eb614c8d68bb80b41ae73fChristoph Studer                showNotificationEvenIfUnprovisioned(sbn))) {
378c8db24bc32034accf1eb614c8d68bb80b41ae73fChristoph Studer            return true;
379c8db24bc32034accf1eb614c8d68bb80b41ae73fChristoph Studer        }
380c8db24bc32034accf1eb614c8d68bb80b41ae73fChristoph Studer
381c8db24bc32034accf1eb614c8d68bb80b41ae73fChristoph Studer        if (!mEnvironment.isNotificationForCurrentProfiles(sbn)) {
382c8db24bc32034accf1eb614c8d68bb80b41ae73fChristoph Studer            return true;
383c8db24bc32034accf1eb614c8d68bb80b41ae73fChristoph Studer        }
384c8db24bc32034accf1eb614c8d68bb80b41ae73fChristoph Studer
38526fa8a54b671719a34290df97d61b60514b0d0eeJulia Reynolds        if (mEnvironment.onSecureLockScreen() &&
38626fa8a54b671719a34290df97d61b60514b0d0eeJulia Reynolds                (sbn.getNotification().visibility == Notification.VISIBILITY_SECRET
38726fa8a54b671719a34290df97d61b60514b0d0eeJulia Reynolds                        || mEnvironment.shouldHideNotifications(sbn.getUserId())
38826fa8a54b671719a34290df97d61b60514b0d0eeJulia Reynolds                        || mEnvironment.shouldHideNotifications(sbn.getKey()))) {
389c8db24bc32034accf1eb614c8d68bb80b41ae73fChristoph Studer            return true;
390c8db24bc32034accf1eb614c8d68bb80b41ae73fChristoph Studer        }
39125fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek
392b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek        if (!BaseStatusBar.ENABLE_CHILD_NOTIFICATIONS
393b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek                && mGroupManager.isChildInGroupWithSummary(sbn)) {
39425fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek            return true;
39525fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek        }
3969c1d823465fa0bd782b2ea4afc518835b4bfecceJoe Onorato        return false;
39720da8f8ac9cfc8b845231c6b93f5b64a764ab39aJoe Onorato    }
39820da8f8ac9cfc8b845231c6b93f5b64a764ab39aJoe Onorato
39920da8f8ac9cfc8b845231c6b93f5b64a764ab39aJoe Onorato    /**
400c8db24bc32034accf1eb614c8d68bb80b41ae73fChristoph Studer     * Return whether there are any clearable notifications (that aren't errors).
40120da8f8ac9cfc8b845231c6b93f5b64a764ab39aJoe Onorato     */
402c8db24bc32034accf1eb614c8d68bb80b41ae73fChristoph Studer    public boolean hasActiveClearableNotifications() {
403c8db24bc32034accf1eb614c8d68bb80b41ae73fChristoph Studer        for (Entry e : mSortedAndFiltered) {
404684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek            if (e.getContentView() != null) { // the view successfully inflated
4055dd1169ae95162383acf00d1e9a1886e0ac99a70Joe Onorato                if (e.notification.isClearable()) {
4069c1d823465fa0bd782b2ea4afc518835b4bfecceJoe Onorato                    return true;
4079c1d823465fa0bd782b2ea4afc518835b4bfecceJoe Onorato                }
40820da8f8ac9cfc8b845231c6b93f5b64a764ab39aJoe Onorato            }
40920da8f8ac9cfc8b845231c6b93f5b64a764ab39aJoe Onorato        }
41020da8f8ac9cfc8b845231c6b93f5b64a764ab39aJoe Onorato        return false;
41120da8f8ac9cfc8b845231c6b93f5b64a764ab39aJoe Onorato    }
412c8db24bc32034accf1eb614c8d68bb80b41ae73fChristoph Studer
413c8db24bc32034accf1eb614c8d68bb80b41ae73fChristoph Studer    // Q: What kinds of notifications should show during setup?
414c8db24bc32034accf1eb614c8d68bb80b41ae73fChristoph Studer    // A: Almost none! Only things coming from the system (package is "android") that also
415c8db24bc32034accf1eb614c8d68bb80b41ae73fChristoph Studer    // have special "kind" tags marking them as relevant for setup (see below).
416c8db24bc32034accf1eb614c8d68bb80b41ae73fChristoph Studer    public static boolean showNotificationEvenIfUnprovisioned(StatusBarNotification sbn) {
417c8db24bc32034accf1eb614c8d68bb80b41ae73fChristoph Studer        return "android".equals(sbn.getPackageName())
418c8db24bc32034accf1eb614c8d68bb80b41ae73fChristoph Studer                && sbn.getNotification().extras.getBoolean(Notification.EXTRA_ALLOW_DURING_SETUP);
419c8db24bc32034accf1eb614c8d68bb80b41ae73fChristoph Studer    }
420c8db24bc32034accf1eb614c8d68bb80b41ae73fChristoph Studer
421c8db24bc32034accf1eb614c8d68bb80b41ae73fChristoph Studer    public void dump(PrintWriter pw, String indent) {
422c8db24bc32034accf1eb614c8d68bb80b41ae73fChristoph Studer        int N = mSortedAndFiltered.size();
423c8db24bc32034accf1eb614c8d68bb80b41ae73fChristoph Studer        pw.print(indent);
424c8db24bc32034accf1eb614c8d68bb80b41ae73fChristoph Studer        pw.println("active notifications: " + N);
42511840cdca9b5f63f61bcdc2ab143995e9a901c53Christoph Studer        int active;
42611840cdca9b5f63f61bcdc2ab143995e9a901c53Christoph Studer        for (active = 0; active < N; active++) {
42711840cdca9b5f63f61bcdc2ab143995e9a901c53Christoph Studer            NotificationData.Entry e = mSortedAndFiltered.get(active);
42811840cdca9b5f63f61bcdc2ab143995e9a901c53Christoph Studer            dumpEntry(pw, indent, active, e);
429c8db24bc32034accf1eb614c8d68bb80b41ae73fChristoph Studer        }
430e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynolds        synchronized (mEntries) {
431e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynolds            int M = mEntries.size();
432e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynolds            pw.print(indent);
433e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynolds            pw.println("inactive notifications: " + (M - active));
434e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynolds            int inactiveCount = 0;
435e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynolds            for (int i = 0; i < M; i++) {
436e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynolds                Entry entry = mEntries.valueAt(i);
437e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynolds                if (!mSortedAndFiltered.contains(entry)) {
438e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynolds                    dumpEntry(pw, indent, inactiveCount, entry);
439e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynolds                    inactiveCount++;
440e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynolds                }
441c8db24bc32034accf1eb614c8d68bb80b41ae73fChristoph Studer            }
442c8db24bc32034accf1eb614c8d68bb80b41ae73fChristoph Studer        }
443c8db24bc32034accf1eb614c8d68bb80b41ae73fChristoph Studer    }
444c8db24bc32034accf1eb614c8d68bb80b41ae73fChristoph Studer
445c8db24bc32034accf1eb614c8d68bb80b41ae73fChristoph Studer    private void dumpEntry(PrintWriter pw, String indent, int i, Entry e) {
446bdf3376616c276ed18a51185351b44fd16eeae29Chris Wren        mRankingMap.getRanking(e.key, mTmpRanking);
447c8db24bc32034accf1eb614c8d68bb80b41ae73fChristoph Studer        pw.print(indent);
448c8db24bc32034accf1eb614c8d68bb80b41ae73fChristoph Studer        pw.println("  [" + i + "] key=" + e.key + " icon=" + e.icon);
449c8db24bc32034accf1eb614c8d68bb80b41ae73fChristoph Studer        StatusBarNotification n = e.notification;
450c8db24bc32034accf1eb614c8d68bb80b41ae73fChristoph Studer        pw.print(indent);
451bdf3376616c276ed18a51185351b44fd16eeae29Chris Wren        pw.println("      pkg=" + n.getPackageName() + " id=" + n.getId() + " importance=" +
452bdf3376616c276ed18a51185351b44fd16eeae29Chris Wren                mTmpRanking.getImportance());
453c8db24bc32034accf1eb614c8d68bb80b41ae73fChristoph Studer        pw.print(indent);
454c8db24bc32034accf1eb614c8d68bb80b41ae73fChristoph Studer        pw.println("      notification=" + n.getNotification());
455c8db24bc32034accf1eb614c8d68bb80b41ae73fChristoph Studer        pw.print(indent);
456c8db24bc32034accf1eb614c8d68bb80b41ae73fChristoph Studer        pw.println("      tickerText=\"" + n.getNotification().tickerText + "\"");
457c8db24bc32034accf1eb614c8d68bb80b41ae73fChristoph Studer    }
458c8db24bc32034accf1eb614c8d68bb80b41ae73fChristoph Studer
4591492116a1cf44941ee2c8be68f6df6c14cfd39c5Christoph Studer    private static boolean isSystemNotification(StatusBarNotification sbn) {
4601492116a1cf44941ee2c8be68f6df6c14cfd39c5Christoph Studer        String sbnPackage = sbn.getPackageName();
4611492116a1cf44941ee2c8be68f6df6c14cfd39c5Christoph Studer        return "android".equals(sbnPackage) || "com.android.systemui".equals(sbnPackage);
4621492116a1cf44941ee2c8be68f6df6c14cfd39c5Christoph Studer    }
4631492116a1cf44941ee2c8be68f6df6c14cfd39c5Christoph Studer
464c8db24bc32034accf1eb614c8d68bb80b41ae73fChristoph Studer    /**
465c8db24bc32034accf1eb614c8d68bb80b41ae73fChristoph Studer     * Provides access to keyguard state and user settings dependent data.
466c8db24bc32034accf1eb614c8d68bb80b41ae73fChristoph Studer     */
467c8db24bc32034accf1eb614c8d68bb80b41ae73fChristoph Studer    public interface Environment {
46826fa8a54b671719a34290df97d61b60514b0d0eeJulia Reynolds        public boolean onSecureLockScreen();
46926fa8a54b671719a34290df97d61b60514b0d0eeJulia Reynolds        public boolean shouldHideNotifications(int userid);
47026fa8a54b671719a34290df97d61b60514b0d0eeJulia Reynolds        public boolean shouldHideNotifications(String key);
471c8db24bc32034accf1eb614c8d68bb80b41ae73fChristoph Studer        public boolean isDeviceProvisioned();
472c8db24bc32034accf1eb614c8d68bb80b41ae73fChristoph Studer        public boolean isNotificationForCurrentProfiles(StatusBarNotification sbn);
4732e731b5d90b956a91390051f803fa928c5fd9deeChristoph Studer        public String getCurrentMediaNotificationKey();
47425fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek        public NotificationGroupManager getGroupManager();
475c8db24bc32034accf1eb614c8d68bb80b41ae73fChristoph Studer    }
476503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato}
477