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