NotificationStation.java revision 7a038ebb1cebcf60c54ff588770d882775abb4df
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; 23328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandlerimport android.content.Intent; 247a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandlerimport android.content.IntentSender; 2595860491fe19b84c853fa7640be6d3c02dff2975Daniel Sandlerimport android.content.pm.ApplicationInfo; 26328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandlerimport android.content.pm.PackageManager; 27328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandlerimport android.content.res.Resources; 287a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandlerimport android.graphics.Typeface; 29328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandlerimport android.graphics.drawable.Drawable; 30328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandlerimport android.net.Uri; 317a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandlerimport android.os.*; 325001834d0360ae0f50194f4d8437cae4de4543b3Chris Wrenimport android.service.notification.NotificationListenerService; 337a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandlerimport android.service.notification.NotificationListenerService.Ranking; 347a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandlerimport android.service.notification.NotificationListenerService.RankingMap; 354a35051565b0ce6d29313c3e4ffe19e1dde78db0John Spurlockimport android.service.notification.StatusBarNotification; 3639b467482d1bf256a111c757e9b7621c6f523271Jason Monkimport android.support.v7.preference.Preference; 3739b467482d1bf256a111c757e9b7621c6f523271Jason Monkimport android.support.v7.preference.PreferenceViewHolder; 3839b467482d1bf256a111c757e9b7621c6f523271Jason Monkimport android.support.v7.widget.RecyclerView; 397a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandlerimport android.text.Spannable; 407a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandlerimport android.text.SpannableString; 417a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandlerimport android.text.SpannableStringBuilder; 427a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandlerimport android.text.TextUtils; 437a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandlerimport android.text.style.StyleSpan; 44328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandlerimport android.util.Log; 45328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandlerimport android.view.View; 46328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandlerimport android.widget.DateTimeView; 47328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandlerimport android.widget.ImageView; 48328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandlerimport android.widget.TextView; 49328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler 509d1bfd1e8de6e46137a9571507c03526880d6a46Chris Wrenimport com.android.internal.logging.MetricsProto.MetricsEvent; 517a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandlerimport com.android.settings.CopyablePreference; 524a35051565b0ce6d29313c3e4ffe19e1dde78db0John Spurlockimport com.android.settings.R; 534a35051565b0ce6d29313c3e4ffe19e1dde78db0John Spurlockimport com.android.settings.SettingsPreferenceFragment; 549c3f11fa05ba8ab479a2d6cc64e707ac02e9a727Fabrice Di Meglioimport com.android.settings.Utils; 554a35051565b0ce6d29313c3e4ffe19e1dde78db0John Spurlock 567a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandlerimport java.lang.StringBuilder; 577a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandlerimport java.util.*; 58328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler 59328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandlerpublic class NotificationStation extends SettingsPreferenceFragment { 60328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler private static final String TAG = NotificationStation.class.getSimpleName(); 61328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler 626e10693db5277dc3ca0fda1774075e628d600a93Fabrice Di Meglio private static final boolean DEBUG = false; 637a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler private static final boolean DUMP_EXTRAS = true; 647a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler private static final boolean DUMP_PARCEL = true; 656e10693db5277dc3ca0fda1774075e628d600a93Fabrice Di Meglio 666e10693db5277dc3ca0fda1774075e628d600a93Fabrice Di Meglio private static class HistoricalNotificationInfo { 676e10693db5277dc3ca0fda1774075e628d600a93Fabrice Di Meglio public String pkg; 686e10693db5277dc3ca0fda1774075e628d600a93Fabrice Di Meglio public Drawable pkgicon; 696e10693db5277dc3ca0fda1774075e628d600a93Fabrice Di Meglio public CharSequence pkgname; 706e10693db5277dc3ca0fda1774075e628d600a93Fabrice Di Meglio public Drawable icon; 716e10693db5277dc3ca0fda1774075e628d600a93Fabrice Di Meglio public CharSequence title; 726e10693db5277dc3ca0fda1774075e628d600a93Fabrice Di Meglio public int priority; 736e10693db5277dc3ca0fda1774075e628d600a93Fabrice Di Meglio public int user; 746e10693db5277dc3ca0fda1774075e628d600a93Fabrice Di Meglio public long timestamp; 756e10693db5277dc3ca0fda1774075e628d600a93Fabrice Di Meglio public boolean active; 767a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler public CharSequence extra; 776e10693db5277dc3ca0fda1774075e628d600a93Fabrice Di Meglio } 786e10693db5277dc3ca0fda1774075e628d600a93Fabrice Di Meglio 7995860491fe19b84c853fa7640be6d3c02dff2975Daniel Sandler private PackageManager mPm; 80328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler private INotificationManager mNoMan; 817a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler private RankingMap mRanking; 82738b8715ab1ece5941a1a0ea931f697efad7fcb0Daniel Sandler 83738b8715ab1ece5941a1a0ea931f697efad7fcb0Daniel Sandler private Runnable mRefreshListRunnable = new Runnable() { 84738b8715ab1ece5941a1a0ea931f697efad7fcb0Daniel Sandler @Override 85738b8715ab1ece5941a1a0ea931f697efad7fcb0Daniel Sandler public void run() { 86738b8715ab1ece5941a1a0ea931f697efad7fcb0Daniel Sandler refreshList(); 87738b8715ab1ece5941a1a0ea931f697efad7fcb0Daniel Sandler } 88738b8715ab1ece5941a1a0ea931f697efad7fcb0Daniel Sandler }; 89738b8715ab1ece5941a1a0ea931f697efad7fcb0Daniel Sandler 905001834d0360ae0f50194f4d8437cae4de4543b3Chris Wren private NotificationListenerService mListener = new NotificationListenerService() { 918fd91ae6c908b6026cebf310f6e1ff60368d14ebDaniel Sandler @Override 927a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler public void onNotificationPosted(StatusBarNotification sbn, RankingMap ranking) { 937a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler logd("onNotificationPosted: %s", sbn.getNotification()); 94738b8715ab1ece5941a1a0ea931f697efad7fcb0Daniel Sandler final Handler h = getListView().getHandler(); 957a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler mRanking = ranking; 96738b8715ab1ece5941a1a0ea931f697efad7fcb0Daniel Sandler h.removeCallbacks(mRefreshListRunnable); 97738b8715ab1ece5941a1a0ea931f697efad7fcb0Daniel Sandler h.postDelayed(mRefreshListRunnable, 100); 988fd91ae6c908b6026cebf310f6e1ff60368d14ebDaniel Sandler } 998fd91ae6c908b6026cebf310f6e1ff60368d14ebDaniel Sandler 1008fd91ae6c908b6026cebf310f6e1ff60368d14ebDaniel Sandler @Override 1017a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler public void onNotificationRemoved(StatusBarNotification notification, RankingMap ranking) { 102738b8715ab1ece5941a1a0ea931f697efad7fcb0Daniel Sandler final Handler h = getListView().getHandler(); 1037a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler mRanking = ranking; 104738b8715ab1ece5941a1a0ea931f697efad7fcb0Daniel Sandler h.removeCallbacks(mRefreshListRunnable); 105738b8715ab1ece5941a1a0ea931f697efad7fcb0Daniel Sandler h.postDelayed(mRefreshListRunnable, 100); 1068fd91ae6c908b6026cebf310f6e1ff60368d14ebDaniel Sandler } 1077a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler 1087a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler @Override 1097a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler public void onNotificationRankingUpdate(RankingMap ranking) { 1107a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler mRanking = ranking; 1117a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler } 1128fd91ae6c908b6026cebf310f6e1ff60368d14ebDaniel Sandler }; 113328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler 114328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler private Context mContext; 115328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler 116738b8715ab1ece5941a1a0ea931f697efad7fcb0Daniel Sandler private final Comparator<HistoricalNotificationInfo> mNotificationSorter 117738b8715ab1ece5941a1a0ea931f697efad7fcb0Daniel Sandler = new Comparator<HistoricalNotificationInfo>() { 118738b8715ab1ece5941a1a0ea931f697efad7fcb0Daniel Sandler @Override 119738b8715ab1ece5941a1a0ea931f697efad7fcb0Daniel Sandler public int compare(HistoricalNotificationInfo lhs, 120738b8715ab1ece5941a1a0ea931f697efad7fcb0Daniel Sandler HistoricalNotificationInfo rhs) { 121738b8715ab1ece5941a1a0ea931f697efad7fcb0Daniel Sandler return (int)(rhs.timestamp - lhs.timestamp); 122738b8715ab1ece5941a1a0ea931f697efad7fcb0Daniel Sandler } 123738b8715ab1ece5941a1a0ea931f697efad7fcb0Daniel Sandler }; 124738b8715ab1ece5941a1a0ea931f697efad7fcb0Daniel Sandler 125328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler @Override 126328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler public void onAttach(Activity activity) { 127328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler logd("onAttach(%s)", activity.getClass().getSimpleName()); 128328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler super.onAttach(activity); 129328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler mContext = activity; 13095860491fe19b84c853fa7640be6d3c02dff2975Daniel Sandler mPm = mContext.getPackageManager(); 131328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler mNoMan = INotificationManager.Stub.asInterface( 132328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler ServiceManager.getService(Context.NOTIFICATION_SERVICE)); 1338fd91ae6c908b6026cebf310f6e1ff60368d14ebDaniel Sandler try { 134fe1b8950bc02d96f2675505ee0aa95146831465bChristoph Studer mListener.registerAsSystemService(mContext, new ComponentName(mContext.getPackageName(), 1355001834d0360ae0f50194f4d8437cae4de4543b3Chris Wren this.getClass().getCanonicalName()), ActivityManager.getCurrentUser()); 1365001834d0360ae0f50194f4d8437cae4de4543b3Chris Wren } catch (RemoteException e) { 1376e10693db5277dc3ca0fda1774075e628d600a93Fabrice Di Meglio Log.e(TAG, "Cannot register listener", e); 1385001834d0360ae0f50194f4d8437cae4de4543b3Chris Wren } 1395001834d0360ae0f50194f4d8437cae4de4543b3Chris Wren } 1405001834d0360ae0f50194f4d8437cae4de4543b3Chris Wren 1415001834d0360ae0f50194f4d8437cae4de4543b3Chris Wren @Override 1425001834d0360ae0f50194f4d8437cae4de4543b3Chris Wren public void onDetach() { 1435001834d0360ae0f50194f4d8437cae4de4543b3Chris Wren try { 1445001834d0360ae0f50194f4d8437cae4de4543b3Chris Wren mListener.unregisterAsSystemService(); 1458fd91ae6c908b6026cebf310f6e1ff60368d14ebDaniel Sandler } catch (RemoteException e) { 1466e10693db5277dc3ca0fda1774075e628d600a93Fabrice Di Meglio Log.e(TAG, "Cannot unregister listener", e); 1478fd91ae6c908b6026cebf310f6e1ff60368d14ebDaniel Sandler } 1485001834d0360ae0f50194f4d8437cae4de4543b3Chris Wren super.onDetach(); 149328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler } 150328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler 151328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler @Override 1528a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren protected int getMetricsCategory() { 1539d1bfd1e8de6e46137a9571507c03526880d6a46Chris Wren return MetricsEvent.NOTIFICATION_STATION; 1548a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren } 1558a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren 1568a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren @Override 157328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler public void onActivityCreated(Bundle savedInstanceState) { 158328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler logd("onActivityCreated(%s)", savedInstanceState); 159328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler super.onActivityCreated(savedInstanceState); 160328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler 16139b467482d1bf256a111c757e9b7621c6f523271Jason Monk RecyclerView listView = getListView(); 1620f4a779214adb8a820d56344d06fba31332a6b5dFabrice Di Meglio Utils.forceCustomPadding(listView, false /* non additive padding */); 163328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler } 164328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler 165328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler @Override 166328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler public void onResume() { 167328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler logd("onResume()"); 168328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler super.onResume(); 1698fd91ae6c908b6026cebf310f6e1ff60368d14ebDaniel Sandler refreshList(); 170328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler } 171328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler 1728fd91ae6c908b6026cebf310f6e1ff60368d14ebDaniel Sandler private void refreshList() { 173328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler List<HistoricalNotificationInfo> infos = loadNotifications(); 174328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler if (infos != null) { 17539b467482d1bf256a111c757e9b7621c6f523271Jason Monk final int N = infos.size(); 17639b467482d1bf256a111c757e9b7621c6f523271Jason Monk logd("adding %d infos", N); 17739b467482d1bf256a111c757e9b7621c6f523271Jason Monk Collections.sort(infos, mNotificationSorter); 17839b467482d1bf256a111c757e9b7621c6f523271Jason Monk if (getPreferenceScreen() == null) { 17939b467482d1bf256a111c757e9b7621c6f523271Jason Monk setPreferenceScreen(getPreferenceManager().createPreferenceScreen(getContext())); 18039b467482d1bf256a111c757e9b7621c6f523271Jason Monk } 18139b467482d1bf256a111c757e9b7621c6f523271Jason Monk getPreferenceScreen().removeAll(); 18239b467482d1bf256a111c757e9b7621c6f523271Jason Monk for (int i = 0; i < N; i++) { 18339b467482d1bf256a111c757e9b7621c6f523271Jason Monk getPreferenceScreen().addPreference( 18439b467482d1bf256a111c757e9b7621c6f523271Jason Monk new HistoricalNotificationPreference(getPrefContext(), infos.get(i))); 18539b467482d1bf256a111c757e9b7621c6f523271Jason Monk } 186328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler } 187328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler } 188328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler 189328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler private static void logd(String msg, Object... args) { 1906e10693db5277dc3ca0fda1774075e628d600a93Fabrice Di Meglio if (DEBUG) { 191328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler Log.d(TAG, args == null || args.length == 0 ? msg : String.format(msg, args)); 1926e10693db5277dc3ca0fda1774075e628d600a93Fabrice Di Meglio } 193328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler } 194328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler 1957a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler private static CharSequence bold(CharSequence cs) { 1967a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler if (cs.length() == 0) return cs; 1977a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler SpannableString ss = new SpannableString(cs); 1987a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler ss.setSpan(new StyleSpan(Typeface.BOLD), 0, cs.length(), 0); 1997a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler return ss; 2007a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler } 2017a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler 2027a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler private static String getTitleString(Notification n) { 2037a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler String title = null; 2047a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler if (n.extras != null) { 2057a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler title = n.extras.getString(Notification.EXTRA_TITLE); 2067a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler if (TextUtils.isEmpty(title)) { 2077a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler title = n.extras.getString(Notification.EXTRA_TEXT); 2087a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler } 2097a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler } 2107a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler if (TextUtils.isEmpty(title) && !TextUtils.isEmpty(n.tickerText)) { 2117a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler title = n.tickerText.toString(); 2127a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler } 2137a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler return title; 2147a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler } 2157a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler 2167a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler private static String formatPendingIntent(PendingIntent pi) { 2177a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler final StringBuilder sb = new StringBuilder(); 2187a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler final IntentSender is = pi.getIntentSender(); 2197a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler sb.append("Intent(pkg=").append(is.getCreatorPackage()); 2207a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler try { 2217a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler final boolean isActivity = 2227a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler ActivityManagerNative.getDefault().isIntentSenderAnActivity(is.getTarget()); 2237a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler if (isActivity) sb.append(" (activity)"); 2247a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler } catch (RemoteException ex) {} 2257a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler sb.append(")"); 2267a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler return sb.toString(); 2277a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler } 2287a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler 229328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler private List<HistoricalNotificationInfo> loadNotifications() { 230328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler final int currentUserId = ActivityManager.getCurrentUser(); 231328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler try { 2326e10693db5277dc3ca0fda1774075e628d600a93Fabrice Di Meglio StatusBarNotification[] active = mNoMan.getActiveNotifications( 2336e10693db5277dc3ca0fda1774075e628d600a93Fabrice Di Meglio mContext.getPackageName()); 2346e10693db5277dc3ca0fda1774075e628d600a93Fabrice Di Meglio StatusBarNotification[] dismissed = mNoMan.getHistoricalNotifications( 2356e10693db5277dc3ca0fda1774075e628d600a93Fabrice Di Meglio mContext.getPackageName(), 50); 236c97593b9fda3344828b505cd9dec69e3709f9045Daniel Sandler 237328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler List<HistoricalNotificationInfo> list 238c00e410b3536f52b8104c92eb2a4ac3d90399ce5Daniel Sandler = new ArrayList<HistoricalNotificationInfo>(active.length + dismissed.length); 239c00e410b3536f52b8104c92eb2a4ac3d90399ce5Daniel Sandler 2407a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler final Ranking rank = new Ranking(); 2417a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler 242c00e410b3536f52b8104c92eb2a4ac3d90399ce5Daniel Sandler for (StatusBarNotification[] resultset 243c00e410b3536f52b8104c92eb2a4ac3d90399ce5Daniel Sandler : new StatusBarNotification[][] { active, dismissed }) { 244c00e410b3536f52b8104c92eb2a4ac3d90399ce5Daniel Sandler for (StatusBarNotification sbn : resultset) { 2457a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler if (sbn.getUserId() != UserHandle.USER_ALL & sbn.getUserId() != currentUserId) { 2467a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler continue; 2477a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler } 2487a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler 2497a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler final Notification n = sbn.getNotification(); 250c00e410b3536f52b8104c92eb2a4ac3d90399ce5Daniel Sandler final HistoricalNotificationInfo info = new HistoricalNotificationInfo(); 251fbfddb0d67479ba8104adaf3f83ccb3534862762Daniel Sandler info.pkg = sbn.getPackageName(); 252c00e410b3536f52b8104c92eb2a4ac3d90399ce5Daniel Sandler info.user = sbn.getUserId(); 2537a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler info.icon = loadIconDrawable(info.pkg, info.user, n.icon); 254c00e410b3536f52b8104c92eb2a4ac3d90399ce5Daniel Sandler info.pkgicon = loadPackageIconDrawable(info.pkg, info.user); 25595860491fe19b84c853fa7640be6d3c02dff2975Daniel Sandler info.pkgname = loadPackageName(info.pkg); 2567a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler info.title = getTitleString(n); 2577a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler if (TextUtils.isEmpty(info.title)) { 2587a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler info.title = getString(R.string.notification_log_no_title); 259c00e410b3536f52b8104c92eb2a4ac3d90399ce5Daniel Sandler } 260fbfddb0d67479ba8104adaf3f83ccb3534862762Daniel Sandler info.timestamp = sbn.getPostTime(); 2617a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler info.priority = n.priority; 262c00e410b3536f52b8104c92eb2a4ac3d90399ce5Daniel Sandler 263c00e410b3536f52b8104c92eb2a4ac3d90399ce5Daniel Sandler info.active = (resultset == active); 264c00e410b3536f52b8104c92eb2a4ac3d90399ce5Daniel Sandler 2657a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler final SpannableStringBuilder sb = new SpannableStringBuilder(); 2667a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler final String delim = getString(R.string.notification_log_details_delimiter); 2677a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler sb.append(bold(getString(R.string.notification_log_details_package))) 2687a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler .append(delim) 2697a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler .append(info.pkg) 2707a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler .append("\n") 2717a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler .append(bold(getString(R.string.notification_log_details_key))) 2727a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler .append(delim) 2737a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler .append(sbn.getKey()); 2747a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler sb.append("\n") 2757a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler .append(bold(getString(R.string.notification_log_details_icon))) 2767a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler .append(delim) 2777a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler .append(n.getSmallIcon().toString()); 2787a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler if (!TextUtils.isEmpty(n.getGroup())) { 2797a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler sb.append("\n") 2807a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler .append(bold(getString(R.string.notification_log_details_group))) 2817a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler .append(delim) 2827a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler .append(n.getGroup()); 2837a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler if (n.isGroupSummary()) { 2847a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler sb.append(bold( 2857a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler getString(R.string.notification_log_details_group_summary))); 2867a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler } 2877a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler } 2887a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler sb.append("\n") 2897a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler .append(bold(getString(R.string.notification_log_details_sound))) 2907a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler .append(delim); 2917a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler if (0 != (n.defaults & Notification.DEFAULT_SOUND)) { 2927a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler sb.append(getString(R.string.notification_log_details_default)); 2937a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler } else if (n.sound != null) { 2947a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler sb.append(n.sound.toString()); 2957a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler } else { 2967a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler sb.append(getString(R.string.notification_log_details_none)); 2977a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler } 2987a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler sb.append("\n") 2997a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler .append(bold(getString(R.string.notification_log_details_vibrate))) 3007a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler .append(delim); 3017a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler if (0 != (n.defaults & Notification.DEFAULT_VIBRATE)) { 3027a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler sb.append(getString(R.string.notification_log_details_default)); 3037a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler } else if (n.vibrate != null) { 3047a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler for (int vi=0;vi<n.vibrate.length;vi++) { 3057a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler if (vi > 0) sb.append(','); 3067a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler sb.append(String.valueOf(n.vibrate[vi])); 3077a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler } 3087a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler } else { 3097a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler sb.append(getString(R.string.notification_log_details_none)); 310c00e410b3536f52b8104c92eb2a4ac3d90399ce5Daniel Sandler } 3117a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler sb.append("\n") 3127a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler .append(bold(getString(R.string.notification_log_details_visibility))) 3137a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler .append(delim) 3147a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler .append(Notification.visibilityToString(n.visibility)); 3157a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler if (n.publicVersion != null) { 3167a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler sb.append("\n") 3177a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler .append(bold(getString( 3187a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler R.string.notification_log_details_public_version))) 3197a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler .append(delim) 3207a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler .append(getTitleString(n.publicVersion)); 3217a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler } 3227a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler sb.append("\n") 3237a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler .append(bold(getString(R.string.notification_log_details_priority))) 3247a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler .append(delim) 3257a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler .append(Notification.priorityToString(n.priority)); 3267a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler if (mRanking != null && mRanking.getRanking(sbn.getKey(), rank)) { 3277a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler sb.append("\n") 3287a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler .append(bold(getString( 3297a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler R.string.notification_log_details_importance))) 3307a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler .append(delim) 3317a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler .append(Ranking.importanceToString(rank.getImportance())); 3327a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler if (rank.getImportanceExplanation() != null) { 3337a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler sb.append("\n") 3347a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler .append(bold(getString( 3357a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler R.string.notification_log_details_explanation))) 3367a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler .append(delim) 3377a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler .append(rank.getImportanceExplanation()); 3387a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler } 3397a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler } 3407a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler if (n.contentIntent != null) { 3417a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler sb.append("\n") 3427a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler .append(bold(getString( 3437a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler R.string.notification_log_details_content_intent))) 3447a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler .append(delim) 3457a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler .append(formatPendingIntent(n.contentIntent)); 3467a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler } 3477a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler if (n.deleteIntent != null) { 3487a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler sb.append("\n") 3497a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler .append(bold(getString( 3507a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler R.string.notification_log_details_delete_intent))) 3517a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler .append(delim) 3527a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler .append(formatPendingIntent(n.deleteIntent)); 3537a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler } 3547a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler if (n.fullScreenIntent != null) { 3557a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler sb.append("\n") 3567a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler .append(bold(getString( 3577a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler R.string.notification_log_details_full_screen_intent))) 3587a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler .append(delim) 3597a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler .append(formatPendingIntent(n.fullScreenIntent)); 3607a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler } 3617a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler if (n.actions != null && n.actions.length > 0) { 3627a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler sb.append("\n") 3637a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler .append(bold(getString(R.string.notification_log_details_actions))); 3647a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler for (int ai=0; ai<n.actions.length; ai++) { 3657a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler final Notification.Action action = n.actions[ai]; 3667a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler sb.append("\n ").append(String.valueOf(ai)).append(' ') 3677a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler .append(bold(getString( 3687a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler R.string.notification_log_details_title))) 3697a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler .append(delim) 3707a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler .append(action.title) 3717a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler .append("\n ") 3727a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler .append(bold(getString( 3737a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler R.string.notification_log_details_content_intent))) 3747a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler .append(delim) 3757a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler .append(formatPendingIntent(action.actionIntent)); 3767a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler if (action.getRemoteInputs() != null) { 3777a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler sb.append(' ') 3787a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler .append(bold(getString( 3797a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler R.string.notification_log_details_remoteinput))) 3807a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler .append(delim) 3817a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler .append(String.valueOf(action.getRemoteInputs().length)); 3827a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler } 3837a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler } 3847a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler } 3857a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler if (n.contentView != null) { 3867a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler sb.append("\n") 3877a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler .append(bold(getString( 3887a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler R.string.notification_log_details_content_view))) 3897a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler .append(delim) 3907a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler .append(n.contentView.toString()); 3917a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler } 3927a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler 3937a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler if (DUMP_EXTRAS) { 3947a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler if (n.extras != null && n.extras.size() > 0) { 3957a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler sb.append("\n") 3967a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler .append(bold(getString( 3977a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler R.string.notification_log_details_extras))); 3987a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler for (String extraKey : n.extras.keySet()) { 3997a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler String val = String.valueOf(n.extras.get(extraKey)); 4007a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler if (val.length() > 100) val = val.substring(0, 100) + "..."; 4017a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler sb.append("\n ").append(extraKey).append(delim).append(val); 4027a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler } 4037a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler } 4047a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler } 4057a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler if (DUMP_PARCEL) { 4067a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler final Parcel p = Parcel.obtain(); 4077a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler n.writeToParcel(p, 0); 4087a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler sb.append("\n") 4097a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler .append(bold(getString(R.string.notification_log_details_parcel))) 4107a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler .append(delim) 4117a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler .append(String.valueOf(p.dataPosition())) 4127a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler .append(' ') 4137a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler .append(bold(getString(R.string.notification_log_details_ashmem))) 4147a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler .append(delim) 4157a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler .append(String.valueOf(p.getBlobAshmemSize())) 4167a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler .append("\n"); 4177a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler } 4187a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler 4197a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler info.extra = sb; 4207a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler 4217a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler logd(" [%d] %s: %s", info.timestamp, info.pkg, info.title); 4227a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler list.add(info); 423328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler } 424328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler } 425328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler 426328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler return list; 427328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler } catch (RemoteException e) { 4286e10693db5277dc3ca0fda1774075e628d600a93Fabrice Di Meglio Log.e(TAG, "Cannot load Notifications: ", e); 429328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler } 430328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler return null; 431328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler } 432328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler 433328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler private Resources getResourcesForUserPackage(String pkg, int userId) { 434328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler Resources r = null; 435328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler 436328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler if (pkg != null) { 437328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler try { 438328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler if (userId == UserHandle.USER_ALL) { 4396f03829e746aa3f505d71723001a7f84a806452fXiaohui Chen userId = UserHandle.USER_SYSTEM; 440328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler } 44195860491fe19b84c853fa7640be6d3c02dff2975Daniel Sandler r = mPm.getResourcesForApplicationAsUser(pkg, userId); 442328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler } catch (PackageManager.NameNotFoundException ex) { 4436e10693db5277dc3ca0fda1774075e628d600a93Fabrice Di Meglio Log.e(TAG, "Icon package not found: " + pkg, ex); 444328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler return null; 445328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler } 446328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler } else { 447328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler r = mContext.getResources(); 448328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler } 449328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler return r; 450328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler } 451328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler 452328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler private Drawable loadPackageIconDrawable(String pkg, int userId) { 453328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler Drawable icon = null; 454328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler try { 45595860491fe19b84c853fa7640be6d3c02dff2975Daniel Sandler icon = mPm.getApplicationIcon(pkg); 456328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler } catch (PackageManager.NameNotFoundException e) { 4576e10693db5277dc3ca0fda1774075e628d600a93Fabrice Di Meglio Log.e(TAG, "Cannot get application icon", e); 458328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler } 459328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler 460328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler return icon; 461328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler } 462328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler 46395860491fe19b84c853fa7640be6d3c02dff2975Daniel Sandler private CharSequence loadPackageName(String pkg) { 46495860491fe19b84c853fa7640be6d3c02dff2975Daniel Sandler try { 46595860491fe19b84c853fa7640be6d3c02dff2975Daniel Sandler ApplicationInfo info = mPm.getApplicationInfo(pkg, 46695860491fe19b84c853fa7640be6d3c02dff2975Daniel Sandler PackageManager.GET_UNINSTALLED_PACKAGES); 46795860491fe19b84c853fa7640be6d3c02dff2975Daniel Sandler if (info != null) return mPm.getApplicationLabel(info); 46895860491fe19b84c853fa7640be6d3c02dff2975Daniel Sandler } catch (PackageManager.NameNotFoundException e) { 4696e10693db5277dc3ca0fda1774075e628d600a93Fabrice Di Meglio Log.e(TAG, "Cannot load package name", e); 47095860491fe19b84c853fa7640be6d3c02dff2975Daniel Sandler } 47195860491fe19b84c853fa7640be6d3c02dff2975Daniel Sandler return pkg; 47295860491fe19b84c853fa7640be6d3c02dff2975Daniel Sandler } 47395860491fe19b84c853fa7640be6d3c02dff2975Daniel Sandler 474328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler private Drawable loadIconDrawable(String pkg, int userId, int resId) { 475328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler Resources r = getResourcesForUserPackage(pkg, userId); 476328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler 477328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler if (resId == 0) { 478328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler return null; 479328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler } 480328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler 481328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler try { 4820ba89bd54c4b44b3803342da10b0c08b0bf76ad4Alan Viverette return r.getDrawable(resId, null); 483328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler } catch (RuntimeException e) { 484328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler Log.w(TAG, "Icon not found in " 485328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler + (pkg != null ? resId : "<system>") 4866e10693db5277dc3ca0fda1774075e628d600a93Fabrice Di Meglio + ": " + Integer.toHexString(resId), e); 487328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler } 488328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler 489328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler return null; 490328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler } 491328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler 4927a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler private static class HistoricalNotificationPreference extends CopyablePreference { 49339b467482d1bf256a111c757e9b7621c6f523271Jason Monk private final HistoricalNotificationInfo mInfo; 494328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler 49539b467482d1bf256a111c757e9b7621c6f523271Jason Monk public HistoricalNotificationPreference(Context context, HistoricalNotificationInfo info) { 49639b467482d1bf256a111c757e9b7621c6f523271Jason Monk super(context); 49739b467482d1bf256a111c757e9b7621c6f523271Jason Monk setLayoutResource(R.layout.notification_log_row); 49839b467482d1bf256a111c757e9b7621c6f523271Jason Monk mInfo = info; 499328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler } 500328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler 501328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler @Override 50239b467482d1bf256a111c757e9b7621c6f523271Jason Monk public void onBindViewHolder(PreferenceViewHolder row) { 5037a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler super.onBindViewHolder(row); 5047a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler 50539b467482d1bf256a111c757e9b7621c6f523271Jason Monk if (mInfo.icon != null) { 5067a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler ((ImageView) row.findViewById(R.id.icon)).setImageDrawable(mInfo.icon); 507328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler } 50839b467482d1bf256a111c757e9b7621c6f523271Jason Monk if (mInfo.pkgicon != null) { 50939b467482d1bf256a111c757e9b7621c6f523271Jason Monk ((ImageView) row.findViewById(R.id.pkgicon)).setImageDrawable(mInfo.pkgicon); 510328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler } 511328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler 51239b467482d1bf256a111c757e9b7621c6f523271Jason Monk ((DateTimeView) row.findViewById(R.id.timestamp)).setTime(mInfo.timestamp); 5137a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler ((TextView) row.findViewById(R.id.title)).setText(mInfo.title); 51439b467482d1bf256a111c757e9b7621c6f523271Jason Monk ((TextView) row.findViewById(R.id.pkgname)).setText(mInfo.pkgname); 51595860491fe19b84c853fa7640be6d3c02dff2975Daniel Sandler 5167a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler final TextView extra = (TextView) row.findViewById(R.id.extra); 5177a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler extra.setText(mInfo.extra); 5187a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler extra.setVisibility(View.GONE); 5197a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler 5207a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler row.itemView.setOnClickListener( 5217a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler new View.OnClickListener() { 5227a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler @Override 5237a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler public void onClick(View view) { 5247a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler extra.setVisibility(extra.getVisibility() == View.VISIBLE 5257a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler ? View.GONE : View.VISIBLE); 5267a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler } 5277a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler }); 5287a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler 52939b467482d1bf256a111c757e9b7621c6f523271Jason Monk row.itemView.setAlpha(mInfo.active ? 1.0f : 0.5f); 530328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler } 531328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler 53239b467482d1bf256a111c757e9b7621c6f523271Jason Monk @Override 5337a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler public CharSequence getCopyableText() { 5347a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler return new SpannableStringBuilder(mInfo.title) 5357a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler .append(" [").append(new Date(mInfo.timestamp).toString()) 5367a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler .append("]\n").append(mInfo.pkgname) 5377a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler .append("\n").append(mInfo.extra); 5387a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler } 5397a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler 5407a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler @Override 54139b467482d1bf256a111c757e9b7621c6f523271Jason Monk public void performClick() { 5427a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler// Intent intent = new Intent(android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS, 5437a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler// Uri.fromParts("package", mInfo.pkg, null)); 5447a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler// intent.setComponent(intent.resolveActivity(getContext().getPackageManager())); 5457a038ebb1cebcf60c54ff588770d882775abb4dfDan Sandler// getContext().startActivity(intent); 546328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler } 547328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler } 548328e2d26663be87b7f6f03deb933d0fa21503511Daniel Sandler} 549