1328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler/* 2328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler * Copyright (C) 2012 The Android Open Source Project 3328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler * 4328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler * Licensed under the Apache License, Version 2.0 (the "License"); 5328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler * you may not use this file except in compliance with the License. 6328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler * You may obtain a copy of the License at 7328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler * 8328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler * http://www.apache.org/licenses/LICENSE-2.0 9328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler * 10328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler * Unless required by applicable law or agreed to in writing, software 11328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler * distributed under the License is distributed on an "AS IS" BASIS, 12328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler * See the License for the specific language governing permissions and 14328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler * limitations under the License. 15328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler */ 16328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler 174a35051565b0ce6d29313c3e4ffe19e1dde78db0John Spurlockpackage com.android.settings.notification; 18328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler 197a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandlerimport android.app.*; 20328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandlerimport android.app.INotificationManager; 214a35051565b0ce6d29313c3e4ffe19e1dde78db0John Spurlockimport android.content.ComponentName; 22328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandlerimport android.content.Context; 237a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandlerimport android.content.IntentSender; 2495860491fe19b84c853fa7640be6d3c02dff2975Daniel Sandlerimport android.content.pm.ApplicationInfo; 25328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandlerimport android.content.pm.PackageManager; 26328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandlerimport android.content.res.Resources; 277a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandlerimport android.graphics.Typeface; 28328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandlerimport android.graphics.drawable.Drawable; 297a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandlerimport android.os.*; 305001834d0360ae0f50194f4d8437cae4de4543b3Chris Wrenimport android.service.notification.NotificationListenerService; 317a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandlerimport android.service.notification.NotificationListenerService.Ranking; 327a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandlerimport android.service.notification.NotificationListenerService.RankingMap; 334a35051565b0ce6d29313c3e4ffe19e1dde78db0John Spurlockimport android.service.notification.StatusBarNotification; 3439b467482d1bf256a111c757e9b7621c6f523271Jason Monkimport android.support.v7.preference.Preference; 3539b467482d1bf256a111c757e9b7621c6f523271Jason Monkimport android.support.v7.preference.PreferenceViewHolder; 3639b467482d1bf256a111c757e9b7621c6f523271Jason Monkimport android.support.v7.widget.RecyclerView; 377a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandlerimport android.text.SpannableString; 387a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandlerimport android.text.SpannableStringBuilder; 397a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandlerimport android.text.TextUtils; 407a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandlerimport android.text.style.StyleSpan; 41328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandlerimport android.util.Log; 42328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandlerimport android.view.View; 43328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandlerimport android.widget.DateTimeView; 44328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandlerimport android.widget.ImageView; 45328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandlerimport android.widget.TextView; 46328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler 479d1bfd1e8de6e46137a9571507c03526880d6a46Chris Wrenimport com.android.internal.logging.MetricsProto.MetricsEvent; 487a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandlerimport com.android.settings.CopyablePreference; 494a35051565b0ce6d29313c3e4ffe19e1dde78db0John Spurlockimport com.android.settings.R; 504a35051565b0ce6d29313c3e4ffe19e1dde78db0John Spurlockimport com.android.settings.SettingsPreferenceFragment; 519c3f11fa05ba8ab479a2d6cc64e707ac02e9a727Fabrice Di Meglioimport com.android.settings.Utils; 524a35051565b0ce6d29313c3e4ffe19e1dde78db0John Spurlock 537a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandlerimport java.lang.StringBuilder; 547a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandlerimport java.util.*; 55328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler 56328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandlerpublic class NotificationStation extends SettingsPreferenceFragment { 57328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler private static final String TAG = NotificationStation.class.getSimpleName(); 58328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler 596e10693db5277dc3ca0fda1774075e628d600a93Fabrice Di Meglio private static final boolean DEBUG = false; 607a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler private static final boolean DUMP_EXTRAS = true; 617a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler private static final boolean DUMP_PARCEL = true; 626b11a0603505fee28e24ea945bd8967f220ab244Chris Wren private Handler mHandler; 636e10693db5277dc3ca0fda1774075e628d600a93Fabrice Di Meglio 646e10693db5277dc3ca0fda1774075e628d600a93Fabrice Di Meglio private static class HistoricalNotificationInfo { 656e10693db5277dc3ca0fda1774075e628d600a93Fabrice Di Meglio public String pkg; 666e10693db5277dc3ca0fda1774075e628d600a93Fabrice Di Meglio public Drawable pkgicon; 676e10693db5277dc3ca0fda1774075e628d600a93Fabrice Di Meglio public CharSequence pkgname; 686e10693db5277dc3ca0fda1774075e628d600a93Fabrice Di Meglio public Drawable icon; 696e10693db5277dc3ca0fda1774075e628d600a93Fabrice Di Meglio public CharSequence title; 706e10693db5277dc3ca0fda1774075e628d600a93Fabrice Di Meglio public int priority; 716e10693db5277dc3ca0fda1774075e628d600a93Fabrice Di Meglio public int user; 726e10693db5277dc3ca0fda1774075e628d600a93Fabrice Di Meglio public long timestamp; 736e10693db5277dc3ca0fda1774075e628d600a93Fabrice Di Meglio public boolean active; 747a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler public CharSequence extra; 756e10693db5277dc3ca0fda1774075e628d600a93Fabrice Di Meglio } 766e10693db5277dc3ca0fda1774075e628d600a93Fabrice Di Meglio 7795860491fe19b84c853fa7640be6d3c02dff2975Daniel Sandler private PackageManager mPm; 78328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler private INotificationManager mNoMan; 797a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler private RankingMap mRanking; 80738b8715ab1ece5941a1a0ea931f697efad7fcb0Daniel Sandler 81738b8715ab1ece5941a1a0ea931f697efad7fcb0Daniel Sandler private Runnable mRefreshListRunnable = new Runnable() { 82738b8715ab1ece5941a1a0ea931f697efad7fcb0Daniel Sandler @Override 83738b8715ab1ece5941a1a0ea931f697efad7fcb0Daniel Sandler public void run() { 84738b8715ab1ece5941a1a0ea931f697efad7fcb0Daniel Sandler refreshList(); 85738b8715ab1ece5941a1a0ea931f697efad7fcb0Daniel Sandler } 86738b8715ab1ece5941a1a0ea931f697efad7fcb0Daniel Sandler }; 87738b8715ab1ece5941a1a0ea931f697efad7fcb0Daniel Sandler 888b797c2df8fa29b55a24b5a70192941c0f79f877Dan Sandler private final NotificationListenerService mListener = new NotificationListenerService() { 898fd91ae6c908b6026cebf310f6e1ff60368d14ebDaniel Sandler @Override 907a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler public void onNotificationPosted(StatusBarNotification sbn, RankingMap ranking) { 916b11a0603505fee28e24ea945bd8967f220ab244Chris Wren logd("onNotificationPosted: %s, with update for %d", sbn.getNotification(), 926b11a0603505fee28e24ea945bd8967f220ab244Chris Wren ranking == null ? 0 : ranking.getOrderedKeys().length); 937a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler mRanking = ranking; 946b11a0603505fee28e24ea945bd8967f220ab244Chris Wren scheduleRefreshList(); 958fd91ae6c908b6026cebf310f6e1ff60368d14ebDaniel Sandler } 968fd91ae6c908b6026cebf310f6e1ff60368d14ebDaniel Sandler 978fd91ae6c908b6026cebf310f6e1ff60368d14ebDaniel Sandler @Override 987a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler public void onNotificationRemoved(StatusBarNotification notification, RankingMap ranking) { 996b11a0603505fee28e24ea945bd8967f220ab244Chris Wren logd("onNotificationRankingUpdate with update for %d", 1006b11a0603505fee28e24ea945bd8967f220ab244Chris Wren ranking == null ? 0 : ranking.getOrderedKeys().length); 1017a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler mRanking = ranking; 1026b11a0603505fee28e24ea945bd8967f220ab244Chris Wren scheduleRefreshList(); 1038fd91ae6c908b6026cebf310f6e1ff60368d14ebDaniel Sandler } 1047a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler 1057a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler @Override 1067a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler public void onNotificationRankingUpdate(RankingMap ranking) { 1076b11a0603505fee28e24ea945bd8967f220ab244Chris Wren logd("onNotificationRankingUpdate with update for %d", 1086b11a0603505fee28e24ea945bd8967f220ab244Chris Wren ranking == null ? 0 : ranking.getOrderedKeys().length); 1097a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler mRanking = ranking; 1106b11a0603505fee28e24ea945bd8967f220ab244Chris Wren scheduleRefreshList(); 1117a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler } 112518b93f5652bf483b4fb2316a78f3139bdfeb538Julia Reynolds 113518b93f5652bf483b4fb2316a78f3139bdfeb538Julia Reynolds @Override 114518b93f5652bf483b4fb2316a78f3139bdfeb538Julia Reynolds public void onListenerConnected() { 115518b93f5652bf483b4fb2316a78f3139bdfeb538Julia Reynolds mRanking = getCurrentRanking(); 1166b11a0603505fee28e24ea945bd8967f220ab244Chris Wren logd("onListenerConnected with update for %d", 1176b11a0603505fee28e24ea945bd8967f220ab244Chris Wren mRanking == null ? 0 : mRanking.getOrderedKeys().length); 1186b11a0603505fee28e24ea945bd8967f220ab244Chris Wren scheduleRefreshList(); 119518b93f5652bf483b4fb2316a78f3139bdfeb538Julia Reynolds } 1208fd91ae6c908b6026cebf310f6e1ff60368d14ebDaniel Sandler }; 121328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler 1226b11a0603505fee28e24ea945bd8967f220ab244Chris Wren private void scheduleRefreshList() { 1236b11a0603505fee28e24ea945bd8967f220ab244Chris Wren if (mHandler != null) { 1246b11a0603505fee28e24ea945bd8967f220ab244Chris Wren mHandler.removeCallbacks(mRefreshListRunnable); 1256b11a0603505fee28e24ea945bd8967f220ab244Chris Wren mHandler.postDelayed(mRefreshListRunnable, 100); 1266b11a0603505fee28e24ea945bd8967f220ab244Chris Wren } 1276b11a0603505fee28e24ea945bd8967f220ab244Chris Wren } 1286b11a0603505fee28e24ea945bd8967f220ab244Chris Wren 129328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler private Context mContext; 130328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler 131738b8715ab1ece5941a1a0ea931f697efad7fcb0Daniel Sandler private final Comparator<HistoricalNotificationInfo> mNotificationSorter 132738b8715ab1ece5941a1a0ea931f697efad7fcb0Daniel Sandler = new Comparator<HistoricalNotificationInfo>() { 133738b8715ab1ece5941a1a0ea931f697efad7fcb0Daniel Sandler @Override 134738b8715ab1ece5941a1a0ea931f697efad7fcb0Daniel Sandler public int compare(HistoricalNotificationInfo lhs, 135738b8715ab1ece5941a1a0ea931f697efad7fcb0Daniel Sandler HistoricalNotificationInfo rhs) { 136738b8715ab1ece5941a1a0ea931f697efad7fcb0Daniel Sandler return (int)(rhs.timestamp - lhs.timestamp); 137738b8715ab1ece5941a1a0ea931f697efad7fcb0Daniel Sandler } 138738b8715ab1ece5941a1a0ea931f697efad7fcb0Daniel Sandler }; 139738b8715ab1ece5941a1a0ea931f697efad7fcb0Daniel Sandler 140328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler @Override 141328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler public void onAttach(Activity activity) { 142328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler logd("onAttach(%s)", activity.getClass().getSimpleName()); 143328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler super.onAttach(activity); 1446b11a0603505fee28e24ea945bd8967f220ab244Chris Wren mHandler = new Handler(activity.getMainLooper()); 145328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler mContext = activity; 14695860491fe19b84c853fa7640be6d3c02dff2975Daniel Sandler mPm = mContext.getPackageManager(); 147328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler mNoMan = INotificationManager.Stub.asInterface( 148328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler ServiceManager.getService(Context.NOTIFICATION_SERVICE)); 1495001834d0360ae0f50194f4d8437cae4de4543b3Chris Wren } 1505001834d0360ae0f50194f4d8437cae4de4543b3Chris Wren 1515001834d0360ae0f50194f4d8437cae4de4543b3Chris Wren @Override 1526b11a0603505fee28e24ea945bd8967f220ab244Chris Wren public void onDetach() { 1536b11a0603505fee28e24ea945bd8967f220ab244Chris Wren logd("onDetach()"); 1546b11a0603505fee28e24ea945bd8967f220ab244Chris Wren mHandler.removeCallbacks(mRefreshListRunnable); 1556b11a0603505fee28e24ea945bd8967f220ab244Chris Wren mHandler = null; 1566b11a0603505fee28e24ea945bd8967f220ab244Chris Wren super.onDetach(); 1576b11a0603505fee28e24ea945bd8967f220ab244Chris Wren } 1586b11a0603505fee28e24ea945bd8967f220ab244Chris Wren 1596b11a0603505fee28e24ea945bd8967f220ab244Chris Wren @Override 1608b797c2df8fa29b55a24b5a70192941c0f79f877Dan Sandler public void onPause() { 1615001834d0360ae0f50194f4d8437cae4de4543b3Chris Wren try { 1625001834d0360ae0f50194f4d8437cae4de4543b3Chris Wren mListener.unregisterAsSystemService(); 1638fd91ae6c908b6026cebf310f6e1ff60368d14ebDaniel Sandler } catch (RemoteException e) { 1646e10693db5277dc3ca0fda1774075e628d600a93Fabrice Di Meglio Log.e(TAG, "Cannot unregister listener", e); 1658fd91ae6c908b6026cebf310f6e1ff60368d14ebDaniel Sandler } 1668b797c2df8fa29b55a24b5a70192941c0f79f877Dan Sandler super.onPause(); 167328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler } 168328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler 169328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler @Override 1708a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren protected int getMetricsCategory() { 1719d1bfd1e8de6e46137a9571507c03526880d6a46Chris Wren return MetricsEvent.NOTIFICATION_STATION; 1728a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren } 1738a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren 1748a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren @Override 175328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler public void onActivityCreated(Bundle savedInstanceState) { 176328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler logd("onActivityCreated(%s)", savedInstanceState); 177328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler super.onActivityCreated(savedInstanceState); 178328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler 17939b467482d1bf256a111c757e9b7621c6f523271Jason Monk RecyclerView listView = getListView(); 1800f4a779214adb8a820d56344d06fba31332a6b5dFabrice Di Meglio Utils.forceCustomPadding(listView, false /* non additive padding */); 181328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler } 182328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler 183328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler @Override 184328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler public void onResume() { 185328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler logd("onResume()"); 186328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler super.onResume(); 1878b797c2df8fa29b55a24b5a70192941c0f79f877Dan Sandler try { 1888b797c2df8fa29b55a24b5a70192941c0f79f877Dan Sandler mListener.registerAsSystemService(mContext, new ComponentName(mContext.getPackageName(), 1898b797c2df8fa29b55a24b5a70192941c0f79f877Dan Sandler this.getClass().getCanonicalName()), ActivityManager.getCurrentUser()); 1908b797c2df8fa29b55a24b5a70192941c0f79f877Dan Sandler } catch (RemoteException e) { 1918b797c2df8fa29b55a24b5a70192941c0f79f877Dan Sandler Log.e(TAG, "Cannot register listener", e); 1928b797c2df8fa29b55a24b5a70192941c0f79f877Dan Sandler } 1938fd91ae6c908b6026cebf310f6e1ff60368d14ebDaniel Sandler refreshList(); 194328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler } 195328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler 1968fd91ae6c908b6026cebf310f6e1ff60368d14ebDaniel Sandler private void refreshList() { 197328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler List<HistoricalNotificationInfo> infos = loadNotifications(); 198328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler if (infos != null) { 19939b467482d1bf256a111c757e9b7621c6f523271Jason Monk final int N = infos.size(); 20039b467482d1bf256a111c757e9b7621c6f523271Jason Monk logd("adding %d infos", N); 20139b467482d1bf256a111c757e9b7621c6f523271Jason Monk Collections.sort(infos, mNotificationSorter); 20239b467482d1bf256a111c757e9b7621c6f523271Jason Monk if (getPreferenceScreen() == null) { 20339b467482d1bf256a111c757e9b7621c6f523271Jason Monk setPreferenceScreen(getPreferenceManager().createPreferenceScreen(getContext())); 20439b467482d1bf256a111c757e9b7621c6f523271Jason Monk } 20539b467482d1bf256a111c757e9b7621c6f523271Jason Monk getPreferenceScreen().removeAll(); 20639b467482d1bf256a111c757e9b7621c6f523271Jason Monk for (int i = 0; i < N; i++) { 20739b467482d1bf256a111c757e9b7621c6f523271Jason Monk getPreferenceScreen().addPreference( 20839b467482d1bf256a111c757e9b7621c6f523271Jason Monk new HistoricalNotificationPreference(getPrefContext(), infos.get(i))); 20939b467482d1bf256a111c757e9b7621c6f523271Jason Monk } 210328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler } 211328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler } 212328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler 213328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler private static void logd(String msg, Object... args) { 2146e10693db5277dc3ca0fda1774075e628d600a93Fabrice Di Meglio if (DEBUG) { 215328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler Log.d(TAG, args == null || args.length == 0 ? msg : String.format(msg, args)); 2166e10693db5277dc3ca0fda1774075e628d600a93Fabrice Di Meglio } 217328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler } 218328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler 2197a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler private static CharSequence bold(CharSequence cs) { 2207a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler if (cs.length() == 0) return cs; 2217a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler SpannableString ss = new SpannableString(cs); 2227a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler ss.setSpan(new StyleSpan(Typeface.BOLD), 0, cs.length(), 0); 2237a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler return ss; 2247a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler } 2257a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler 2267a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler private static String getTitleString(Notification n) { 2278b797c2df8fa29b55a24b5a70192941c0f79f877Dan Sandler CharSequence title = null; 2287a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler if (n.extras != null) { 2298b797c2df8fa29b55a24b5a70192941c0f79f877Dan Sandler title = n.extras.getCharSequence(Notification.EXTRA_TITLE); 2307a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler if (TextUtils.isEmpty(title)) { 2318b797c2df8fa29b55a24b5a70192941c0f79f877Dan Sandler title = n.extras.getCharSequence(Notification.EXTRA_TEXT); 2327a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler } 2337a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler } 2347a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler if (TextUtils.isEmpty(title) && !TextUtils.isEmpty(n.tickerText)) { 2358b797c2df8fa29b55a24b5a70192941c0f79f877Dan Sandler title = n.tickerText; 2367a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler } 2378b797c2df8fa29b55a24b5a70192941c0f79f877Dan Sandler return String.valueOf(title); 2387a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler } 2397a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler 2407a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler private static String formatPendingIntent(PendingIntent pi) { 2417a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler final StringBuilder sb = new StringBuilder(); 2427a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler final IntentSender is = pi.getIntentSender(); 2437a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler sb.append("Intent(pkg=").append(is.getCreatorPackage()); 2447a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler try { 2457a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler final boolean isActivity = 2467a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler ActivityManagerNative.getDefault().isIntentSenderAnActivity(is.getTarget()); 2477a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler if (isActivity) sb.append(" (activity)"); 2487a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler } catch (RemoteException ex) {} 2497a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler sb.append(")"); 2507a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler return sb.toString(); 2517a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler } 2527a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler 253328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler private List<HistoricalNotificationInfo> loadNotifications() { 254328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler final int currentUserId = ActivityManager.getCurrentUser(); 255328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler try { 2566e10693db5277dc3ca0fda1774075e628d600a93Fabrice Di Meglio StatusBarNotification[] active = mNoMan.getActiveNotifications( 2576e10693db5277dc3ca0fda1774075e628d600a93Fabrice Di Meglio mContext.getPackageName()); 2586e10693db5277dc3ca0fda1774075e628d600a93Fabrice Di Meglio StatusBarNotification[] dismissed = mNoMan.getHistoricalNotifications( 2596e10693db5277dc3ca0fda1774075e628d600a93Fabrice Di Meglio mContext.getPackageName(), 50); 260c97593b9fda3344828b505cd9dec69e3709f9045Daniel Sandler 261328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler List<HistoricalNotificationInfo> list 262c00e410b3536f52b8104c92eb2a4ac3d90399ce5Daniel Sandler = new ArrayList<HistoricalNotificationInfo>(active.length + dismissed.length); 263c00e410b3536f52b8104c92eb2a4ac3d90399ce5Daniel Sandler 2647a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler final Ranking rank = new Ranking(); 2657a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler 266c00e410b3536f52b8104c92eb2a4ac3d90399ce5Daniel Sandler for (StatusBarNotification[] resultset 267c00e410b3536f52b8104c92eb2a4ac3d90399ce5Daniel Sandler : new StatusBarNotification[][] { active, dismissed }) { 268c00e410b3536f52b8104c92eb2a4ac3d90399ce5Daniel Sandler for (StatusBarNotification sbn : resultset) { 2697a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler if (sbn.getUserId() != UserHandle.USER_ALL & sbn.getUserId() != currentUserId) { 2707a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler continue; 2717a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler } 2727a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler 2737a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler final Notification n = sbn.getNotification(); 274c00e410b3536f52b8104c92eb2a4ac3d90399ce5Daniel Sandler final HistoricalNotificationInfo info = new HistoricalNotificationInfo(); 275fbfddb0d67479ba8104adaf3f83ccb3534862762Daniel Sandler info.pkg = sbn.getPackageName(); 276c00e410b3536f52b8104c92eb2a4ac3d90399ce5Daniel Sandler info.user = sbn.getUserId(); 2777a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler info.icon = loadIconDrawable(info.pkg, info.user, n.icon); 278c00e410b3536f52b8104c92eb2a4ac3d90399ce5Daniel Sandler info.pkgicon = loadPackageIconDrawable(info.pkg, info.user); 27995860491fe19b84c853fa7640be6d3c02dff2975Daniel Sandler info.pkgname = loadPackageName(info.pkg); 2807a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler info.title = getTitleString(n); 2817a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler if (TextUtils.isEmpty(info.title)) { 2827a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler info.title = getString(R.string.notification_log_no_title); 283c00e410b3536f52b8104c92eb2a4ac3d90399ce5Daniel Sandler } 284fbfddb0d67479ba8104adaf3f83ccb3534862762Daniel Sandler info.timestamp = sbn.getPostTime(); 2857a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler info.priority = n.priority; 286c00e410b3536f52b8104c92eb2a4ac3d90399ce5Daniel Sandler 287c00e410b3536f52b8104c92eb2a4ac3d90399ce5Daniel Sandler info.active = (resultset == active); 288c00e410b3536f52b8104c92eb2a4ac3d90399ce5Daniel Sandler 2897a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler final SpannableStringBuilder sb = new SpannableStringBuilder(); 2907a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler final String delim = getString(R.string.notification_log_details_delimiter); 2917a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler sb.append(bold(getString(R.string.notification_log_details_package))) 2927a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler .append(delim) 2937a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler .append(info.pkg) 2947a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler .append("\n") 2957a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler .append(bold(getString(R.string.notification_log_details_key))) 2967a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler .append(delim) 2977a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler .append(sbn.getKey()); 2987a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler sb.append("\n") 2997a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler .append(bold(getString(R.string.notification_log_details_icon))) 3007a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler .append(delim) 3017a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler .append(n.getSmallIcon().toString()); 3026b11a0603505fee28e24ea945bd8967f220ab244Chris Wren if (sbn.isGroup()) { 3037a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler sb.append("\n") 3047a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler .append(bold(getString(R.string.notification_log_details_group))) 3057a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler .append(delim) 3066b11a0603505fee28e24ea945bd8967f220ab244Chris Wren .append(sbn.getGroupKey()); 3077a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler if (n.isGroupSummary()) { 3087a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler sb.append(bold( 3097a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler getString(R.string.notification_log_details_group_summary))); 3107a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler } 3117a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler } 3127a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler sb.append("\n") 3137a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler .append(bold(getString(R.string.notification_log_details_sound))) 3147a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler .append(delim); 3157a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler if (0 != (n.defaults & Notification.DEFAULT_SOUND)) { 3167a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler sb.append(getString(R.string.notification_log_details_default)); 3177a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler } else if (n.sound != null) { 3187a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler sb.append(n.sound.toString()); 3197a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler } else { 3207a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler sb.append(getString(R.string.notification_log_details_none)); 3217a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler } 3227a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler sb.append("\n") 3237a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler .append(bold(getString(R.string.notification_log_details_vibrate))) 3247a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler .append(delim); 3257a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler if (0 != (n.defaults & Notification.DEFAULT_VIBRATE)) { 3267a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler sb.append(getString(R.string.notification_log_details_default)); 3277a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler } else if (n.vibrate != null) { 3287a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler for (int vi=0;vi<n.vibrate.length;vi++) { 3297a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler if (vi > 0) sb.append(','); 3307a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler sb.append(String.valueOf(n.vibrate[vi])); 3317a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler } 3327a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler } else { 3337a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler sb.append(getString(R.string.notification_log_details_none)); 334c00e410b3536f52b8104c92eb2a4ac3d90399ce5Daniel Sandler } 3357a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler sb.append("\n") 3367a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler .append(bold(getString(R.string.notification_log_details_visibility))) 3377a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler .append(delim) 3387a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler .append(Notification.visibilityToString(n.visibility)); 3397a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler if (n.publicVersion != null) { 3407a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler sb.append("\n") 3417a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler .append(bold(getString( 3427a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler R.string.notification_log_details_public_version))) 3437a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler .append(delim) 3447a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler .append(getTitleString(n.publicVersion)); 3457a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler } 3467a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler sb.append("\n") 3477a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler .append(bold(getString(R.string.notification_log_details_priority))) 3487a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler .append(delim) 3497a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler .append(Notification.priorityToString(n.priority)); 3506b11a0603505fee28e24ea945bd8967f220ab244Chris Wren if (resultset == active) { 3516b11a0603505fee28e24ea945bd8967f220ab244Chris Wren // mRanking only applies to active notifications 3526b11a0603505fee28e24ea945bd8967f220ab244Chris Wren if (mRanking != null && mRanking.getRanking(sbn.getKey(), rank)) { 3537a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler sb.append("\n") 3547a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler .append(bold(getString( 3556b11a0603505fee28e24ea945bd8967f220ab244Chris Wren R.string.notification_log_details_importance))) 3567a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler .append(delim) 3576b11a0603505fee28e24ea945bd8967f220ab244Chris Wren .append(Ranking.importanceToString(rank.getImportance())); 3586b11a0603505fee28e24ea945bd8967f220ab244Chris Wren if (rank.getImportanceExplanation() != null) { 3596b11a0603505fee28e24ea945bd8967f220ab244Chris Wren sb.append("\n") 3606b11a0603505fee28e24ea945bd8967f220ab244Chris Wren .append(bold(getString( 3616b11a0603505fee28e24ea945bd8967f220ab244Chris Wren R.string.notification_log_details_explanation))) 3626b11a0603505fee28e24ea945bd8967f220ab244Chris Wren .append(delim) 3636b11a0603505fee28e24ea945bd8967f220ab244Chris Wren .append(rank.getImportanceExplanation()); 3646b11a0603505fee28e24ea945bd8967f220ab244Chris Wren } 3656b11a0603505fee28e24ea945bd8967f220ab244Chris Wren } else { 3666b11a0603505fee28e24ea945bd8967f220ab244Chris Wren if (mRanking == null) { 3676b11a0603505fee28e24ea945bd8967f220ab244Chris Wren sb.append("\n") 3686b11a0603505fee28e24ea945bd8967f220ab244Chris Wren .append(bold(getString( 3696b11a0603505fee28e24ea945bd8967f220ab244Chris Wren R.string.notification_log_details_ranking_null))); 3706b11a0603505fee28e24ea945bd8967f220ab244Chris Wren } else { 3716b11a0603505fee28e24ea945bd8967f220ab244Chris Wren sb.append("\n") 3726b11a0603505fee28e24ea945bd8967f220ab244Chris Wren .append(bold(getString( 3736b11a0603505fee28e24ea945bd8967f220ab244Chris Wren R.string.notification_log_details_ranking_none))); 3746b11a0603505fee28e24ea945bd8967f220ab244Chris Wren } 3757a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler } 3767a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler } 3777a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler if (n.contentIntent != null) { 3787a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler sb.append("\n") 3797a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler .append(bold(getString( 3807a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler R.string.notification_log_details_content_intent))) 3817a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler .append(delim) 3827a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler .append(formatPendingIntent(n.contentIntent)); 3837a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler } 3847a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler if (n.deleteIntent != null) { 3857a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler sb.append("\n") 3867a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler .append(bold(getString( 3877a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler R.string.notification_log_details_delete_intent))) 3887a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler .append(delim) 3897a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler .append(formatPendingIntent(n.deleteIntent)); 3907a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler } 3917a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler if (n.fullScreenIntent != null) { 3927a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler sb.append("\n") 3937a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler .append(bold(getString( 3947a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler R.string.notification_log_details_full_screen_intent))) 3957a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler .append(delim) 3967a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler .append(formatPendingIntent(n.fullScreenIntent)); 3977a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler } 3987a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler if (n.actions != null && n.actions.length > 0) { 3997a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler sb.append("\n") 4007a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler .append(bold(getString(R.string.notification_log_details_actions))); 4017a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler for (int ai=0; ai<n.actions.length; ai++) { 4027a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler final Notification.Action action = n.actions[ai]; 4037a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler sb.append("\n ").append(String.valueOf(ai)).append(' ') 4047a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler .append(bold(getString( 4057a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler R.string.notification_log_details_title))) 4067a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler .append(delim) 4079bcc04c5db8fcec3a0a70ee01fe86dccfece5bfcJulia Reynolds .append(action.title); 4089bcc04c5db8fcec3a0a70ee01fe86dccfece5bfcJulia Reynolds if (action.actionIntent != null) { 4099bcc04c5db8fcec3a0a70ee01fe86dccfece5bfcJulia Reynolds sb.append("\n ") 4109bcc04c5db8fcec3a0a70ee01fe86dccfece5bfcJulia Reynolds .append(bold(getString( 4119bcc04c5db8fcec3a0a70ee01fe86dccfece5bfcJulia Reynolds R.string.notification_log_details_content_intent))) 4129bcc04c5db8fcec3a0a70ee01fe86dccfece5bfcJulia Reynolds .append(delim) 4139bcc04c5db8fcec3a0a70ee01fe86dccfece5bfcJulia Reynolds .append(formatPendingIntent(action.actionIntent)); 4149bcc04c5db8fcec3a0a70ee01fe86dccfece5bfcJulia Reynolds } 4157a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler if (action.getRemoteInputs() != null) { 4169bcc04c5db8fcec3a0a70ee01fe86dccfece5bfcJulia Reynolds sb.append("\n ") 4177a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler .append(bold(getString( 4187a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler R.string.notification_log_details_remoteinput))) 4197a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler .append(delim) 4207a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler .append(String.valueOf(action.getRemoteInputs().length)); 4217a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler } 4227a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler } 4237a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler } 4247a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler if (n.contentView != null) { 4257a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler sb.append("\n") 4267a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler .append(bold(getString( 4277a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler R.string.notification_log_details_content_view))) 4287a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler .append(delim) 4297a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler .append(n.contentView.toString()); 4307a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler } 4317a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler 4327a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler if (DUMP_EXTRAS) { 4337a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler if (n.extras != null && n.extras.size() > 0) { 4347a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler sb.append("\n") 4357a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler .append(bold(getString( 4367a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler R.string.notification_log_details_extras))); 4377a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler for (String extraKey : n.extras.keySet()) { 4387a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler String val = String.valueOf(n.extras.get(extraKey)); 4397a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler if (val.length() > 100) val = val.substring(0, 100) + "..."; 4407a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler sb.append("\n ").append(extraKey).append(delim).append(val); 4417a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler } 4427a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler } 4437a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler } 4447a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler if (DUMP_PARCEL) { 4457a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler final Parcel p = Parcel.obtain(); 4467a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler n.writeToParcel(p, 0); 4477a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler sb.append("\n") 4487a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler .append(bold(getString(R.string.notification_log_details_parcel))) 4497a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler .append(delim) 4507a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler .append(String.valueOf(p.dataPosition())) 4517a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler .append(' ') 4527a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler .append(bold(getString(R.string.notification_log_details_ashmem))) 4537a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler .append(delim) 4547a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler .append(String.valueOf(p.getBlobAshmemSize())) 4557a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler .append("\n"); 4567a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler } 4577a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler 4587a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler info.extra = sb; 4597a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler 4607a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler logd(" [%d] %s: %s", info.timestamp, info.pkg, info.title); 4617a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler list.add(info); 462328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler } 463328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler } 464328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler 465328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler return list; 466328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler } catch (RemoteException e) { 4676e10693db5277dc3ca0fda1774075e628d600a93Fabrice Di Meglio Log.e(TAG, "Cannot load Notifications: ", e); 468328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler } 469328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler return null; 470328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler } 471328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler 472328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler private Resources getResourcesForUserPackage(String pkg, int userId) { 473328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler Resources r = null; 474328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler 475328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler if (pkg != null) { 476328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler try { 477328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler if (userId == UserHandle.USER_ALL) { 4786f03829e746aa3f505d71723001a7f84a806452fXiaohui Chen userId = UserHandle.USER_SYSTEM; 479328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler } 48095860491fe19b84c853fa7640be6d3c02dff2975Daniel Sandler r = mPm.getResourcesForApplicationAsUser(pkg, userId); 481328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler } catch (PackageManager.NameNotFoundException ex) { 4826e10693db5277dc3ca0fda1774075e628d600a93Fabrice Di Meglio Log.e(TAG, "Icon package not found: " + pkg, ex); 483328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler return null; 484328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler } 485328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler } else { 486328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler r = mContext.getResources(); 487328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler } 488328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler return r; 489328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler } 490328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler 491328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler private Drawable loadPackageIconDrawable(String pkg, int userId) { 492328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler Drawable icon = null; 493328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler try { 49495860491fe19b84c853fa7640be6d3c02dff2975Daniel Sandler icon = mPm.getApplicationIcon(pkg); 495328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler } catch (PackageManager.NameNotFoundException e) { 4966e10693db5277dc3ca0fda1774075e628d600a93Fabrice Di Meglio Log.e(TAG, "Cannot get application icon", e); 497328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler } 498328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler 499328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler return icon; 500328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler } 501328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler 50295860491fe19b84c853fa7640be6d3c02dff2975Daniel Sandler private CharSequence loadPackageName(String pkg) { 50395860491fe19b84c853fa7640be6d3c02dff2975Daniel Sandler try { 50495860491fe19b84c853fa7640be6d3c02dff2975Daniel Sandler ApplicationInfo info = mPm.getApplicationInfo(pkg, 50595860491fe19b84c853fa7640be6d3c02dff2975Daniel Sandler PackageManager.GET_UNINSTALLED_PACKAGES); 50695860491fe19b84c853fa7640be6d3c02dff2975Daniel Sandler if (info != null) return mPm.getApplicationLabel(info); 50795860491fe19b84c853fa7640be6d3c02dff2975Daniel Sandler } catch (PackageManager.NameNotFoundException e) { 5086e10693db5277dc3ca0fda1774075e628d600a93Fabrice Di Meglio Log.e(TAG, "Cannot load package name", e); 50995860491fe19b84c853fa7640be6d3c02dff2975Daniel Sandler } 51095860491fe19b84c853fa7640be6d3c02dff2975Daniel Sandler return pkg; 51195860491fe19b84c853fa7640be6d3c02dff2975Daniel Sandler } 51295860491fe19b84c853fa7640be6d3c02dff2975Daniel Sandler 513328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler private Drawable loadIconDrawable(String pkg, int userId, int resId) { 514328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler Resources r = getResourcesForUserPackage(pkg, userId); 515328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler 516328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler if (resId == 0) { 517328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler return null; 518328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler } 519328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler 520328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler try { 5210ba89bd54c4b44b3803342da10b0c08b0bf76ad4Alan Viverette return r.getDrawable(resId, null); 522328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler } catch (RuntimeException e) { 523328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler Log.w(TAG, "Icon not found in " 524328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler + (pkg != null ? resId : "<system>") 5256e10693db5277dc3ca0fda1774075e628d600a93Fabrice Di Meglio + ": " + Integer.toHexString(resId), e); 526328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler } 527328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler 528328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler return null; 529328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler } 530328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler 5317a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler private static class HistoricalNotificationPreference extends CopyablePreference { 53239b467482d1bf256a111c757e9b7621c6f523271Jason Monk private final HistoricalNotificationInfo mInfo; 533328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler 53439b467482d1bf256a111c757e9b7621c6f523271Jason Monk public HistoricalNotificationPreference(Context context, HistoricalNotificationInfo info) { 53539b467482d1bf256a111c757e9b7621c6f523271Jason Monk super(context); 53639b467482d1bf256a111c757e9b7621c6f523271Jason Monk setLayoutResource(R.layout.notification_log_row); 53739b467482d1bf256a111c757e9b7621c6f523271Jason Monk mInfo = info; 538328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler } 539328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler 540328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler @Override 54139b467482d1bf256a111c757e9b7621c6f523271Jason Monk public void onBindViewHolder(PreferenceViewHolder row) { 5427a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler super.onBindViewHolder(row); 5437a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler 54439b467482d1bf256a111c757e9b7621c6f523271Jason Monk if (mInfo.icon != null) { 5457a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler ((ImageView) row.findViewById(R.id.icon)).setImageDrawable(mInfo.icon); 546328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler } 54739b467482d1bf256a111c757e9b7621c6f523271Jason Monk if (mInfo.pkgicon != null) { 54839b467482d1bf256a111c757e9b7621c6f523271Jason Monk ((ImageView) row.findViewById(R.id.pkgicon)).setImageDrawable(mInfo.pkgicon); 549328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler } 550328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler 55139b467482d1bf256a111c757e9b7621c6f523271Jason Monk ((DateTimeView) row.findViewById(R.id.timestamp)).setTime(mInfo.timestamp); 5527a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler ((TextView) row.findViewById(R.id.title)).setText(mInfo.title); 55339b467482d1bf256a111c757e9b7621c6f523271Jason Monk ((TextView) row.findViewById(R.id.pkgname)).setText(mInfo.pkgname); 55495860491fe19b84c853fa7640be6d3c02dff2975Daniel Sandler 5557a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler final TextView extra = (TextView) row.findViewById(R.id.extra); 5567a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler extra.setText(mInfo.extra); 5577a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler extra.setVisibility(View.GONE); 5587a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler 5597a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler row.itemView.setOnClickListener( 5607a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler new View.OnClickListener() { 5617a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler @Override 5627a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler public void onClick(View view) { 5637a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler extra.setVisibility(extra.getVisibility() == View.VISIBLE 5647a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler ? View.GONE : View.VISIBLE); 5657a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler } 5667a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler }); 5677a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler 56839b467482d1bf256a111c757e9b7621c6f523271Jason Monk row.itemView.setAlpha(mInfo.active ? 1.0f : 0.5f); 569328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler } 570328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler 57139b467482d1bf256a111c757e9b7621c6f523271Jason Monk @Override 5727a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler public CharSequence getCopyableText() { 5737a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler return new SpannableStringBuilder(mInfo.title) 5747a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler .append(" [").append(new Date(mInfo.timestamp).toString()) 5757a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler .append("]\n").append(mInfo.pkgname) 5767a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler .append("\n").append(mInfo.extra); 5777a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler } 5787a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler 5797a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler @Override 58039b467482d1bf256a111c757e9b7621c6f523271Jason Monk public void performClick() { 5817a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler// Intent intent = new Intent(android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS, 5827a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler// Uri.fromParts("package", mInfo.pkg, null)); 5837a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler// intent.setComponent(intent.resolveActivity(getContext().getPackageManager())); 5847a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler// getContext().startActivity(intent); 585328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler } 586328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler } 587328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler} 588