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