19c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato/*
29c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato * Copyright (C) 2008 The Android Open Source Project
39c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato *
49c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato * Licensed under the Apache License, Version 2.0 (the "License");
59c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato * you may not use this file except in compliance with the License.
69c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato * You may obtain a copy of the License at
79c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato *
89c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato *      http://www.apache.org/licenses/LICENSE-2.0
99c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato *
109c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato * Unless required by applicable law or agreed to in writing, software
119c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato * distributed under the License is distributed on an "AS IS" BASIS,
129c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato * See the License for the specific language governing permissions and
149c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato * limitations under the License.
159c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato */
169c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato
179c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onoratopackage com.android.launcher2;
189c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato
19aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chungimport java.util.ArrayList;
20aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chungimport java.util.List;
21aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung
229c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onoratoimport android.content.ComponentName;
239c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onoratoimport android.content.Context;
24374753cabf05cde1ad669d07bde47e34fdcbe499Amith Yamasaniimport android.content.pm.LauncherActivityInfo;
25374753cabf05cde1ad669d07bde47e34fdcbe499Amith Yamasaniimport android.content.pm.LauncherApps;
26374753cabf05cde1ad669d07bde47e34fdcbe499Amith Yamasaniimport android.os.UserHandle;
279c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato
289c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato/**
299c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato * Stores the list of all applications for the all apps view.
309c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato */
319c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onoratoclass AllAppsList {
329c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato    public static final int DEFAULT_APPLICATIONS_NUMBER = 42;
339c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato
349c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato    /** The list off all apps. */
355c16f3ecd6b47bff3abbe40deb3d39c66a3b0012Romain Guy    public ArrayList<ApplicationInfo> data =
365c16f3ecd6b47bff3abbe40deb3d39c66a3b0012Romain Guy            new ArrayList<ApplicationInfo>(DEFAULT_APPLICATIONS_NUMBER);
379c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato    /** The list of apps that have been added since the last notify() call. */
385c16f3ecd6b47bff3abbe40deb3d39c66a3b0012Romain Guy    public ArrayList<ApplicationInfo> added =
395c16f3ecd6b47bff3abbe40deb3d39c66a3b0012Romain Guy            new ArrayList<ApplicationInfo>(DEFAULT_APPLICATIONS_NUMBER);
409c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato    /** The list of apps that have been removed since the last notify() call. */
415c16f3ecd6b47bff3abbe40deb3d39c66a3b0012Romain Guy    public ArrayList<ApplicationInfo> removed = new ArrayList<ApplicationInfo>();
429c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato    /** The list of apps that have been modified since the last notify() call. */
435c16f3ecd6b47bff3abbe40deb3d39c66a3b0012Romain Guy    public ArrayList<ApplicationInfo> modified = new ArrayList<ApplicationInfo>();
449c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato
450589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato    private IconCache mIconCache;
460589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato
479c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato    /**
489c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato     * Boring constructor.
499c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato     */
500589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato    public AllAppsList(IconCache iconCache) {
510589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato        mIconCache = iconCache;
529c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato    }
539c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato
549c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato    /**
559c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato     * Add the supplied ApplicationInfo objects to the list, and enqueue it into the
569c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato     * list to broadcast when notify() is called.
57d65d08e709ec0916446100bae0a7276d0800382fJoe Onorato     *
58d65d08e709ec0916446100bae0a7276d0800382fJoe Onorato     * If the app is already in the list, doesn't add it.
599c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato     */
609c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato    public void add(ApplicationInfo info) {
61374753cabf05cde1ad669d07bde47e34fdcbe499Amith Yamasani        if (findActivity(data, info.componentName, info.user)) {
62d65d08e709ec0916446100bae0a7276d0800382fJoe Onorato            return;
63d65d08e709ec0916446100bae0a7276d0800382fJoe Onorato        }
64054019dbeafd33de4e39601e0f305926c15bad15Daniel Sandler        data.add(info);
65054019dbeafd33de4e39601e0f305926c15bad15Daniel Sandler        added.add(info);
669c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato    }
679c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato
689c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato    public void clear() {
699c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato        data.clear();
709c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato        // TODO: do we clear these too?
719c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato        added.clear();
729c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato        removed.clear();
739c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato        modified.clear();
749c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato    }
759c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato
769c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato    public int size() {
779c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato        return data.size();
789c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato    }
799c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato
809c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato    public ApplicationInfo get(int index) {
819c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato        return data.get(index);
829c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato    }
839c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato
849c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato    /**
859c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato     * Add the icons for the supplied apk called packageName.
869c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato     */
87374753cabf05cde1ad669d07bde47e34fdcbe499Amith Yamasani    public void addPackage(Context context, String packageName, UserHandle user) {
88374753cabf05cde1ad669d07bde47e34fdcbe499Amith Yamasani        LauncherApps launcherApps = (LauncherApps)
89374753cabf05cde1ad669d07bde47e34fdcbe499Amith Yamasani                context.getSystemService(Context.LAUNCHER_APPS_SERVICE);
90374753cabf05cde1ad669d07bde47e34fdcbe499Amith Yamasani        final List<LauncherActivityInfo> matches = launcherApps.getActivityList(packageName,
91374753cabf05cde1ad669d07bde47e34fdcbe499Amith Yamasani                user);
92374753cabf05cde1ad669d07bde47e34fdcbe499Amith Yamasani
93374753cabf05cde1ad669d07bde47e34fdcbe499Amith Yamasani        for (LauncherActivityInfo info : matches) {
94374753cabf05cde1ad669d07bde47e34fdcbe499Amith Yamasani            add(new ApplicationInfo(info, user, mIconCache, null));
959c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato        }
969c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato    }
979c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato
989c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato    /**
999c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato     * Remove the apps for the given apk identified by packageName.
1009c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato     */
101374753cabf05cde1ad669d07bde47e34fdcbe499Amith Yamasani    public void removePackage(String packageName, UserHandle user) {
1029c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato        final List<ApplicationInfo> data = this.data;
1035c16f3ecd6b47bff3abbe40deb3d39c66a3b0012Romain Guy        for (int i = data.size() - 1; i >= 0; i--) {
1049c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato            ApplicationInfo info = data.get(i);
1059c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato            final ComponentName component = info.intent.getComponent();
106374753cabf05cde1ad669d07bde47e34fdcbe499Amith Yamasani            if (info.user.equals(user) && packageName.equals(component.getPackageName())) {
1079c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato                removed.add(info);
1089c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato                data.remove(i);
1099c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato            }
1109c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato        }
1119c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato        // This is more aggressive than it needs to be.
1120589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato        mIconCache.flush();
1139c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato    }
1140589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato
1159c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato    /**
1169c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato     * Add and remove icons for this package which has been updated.
1179c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato     */
118374753cabf05cde1ad669d07bde47e34fdcbe499Amith Yamasani    public void updatePackage(Context context, String packageName, UserHandle user) {
119374753cabf05cde1ad669d07bde47e34fdcbe499Amith Yamasani        LauncherApps launcherApps = (LauncherApps)
120374753cabf05cde1ad669d07bde47e34fdcbe499Amith Yamasani                context.getSystemService(Context.LAUNCHER_APPS_SERVICE);
121374753cabf05cde1ad669d07bde47e34fdcbe499Amith Yamasani        final List<LauncherActivityInfo> matches = launcherApps.getActivityList(packageName,
122374753cabf05cde1ad669d07bde47e34fdcbe499Amith Yamasani                user);
1239c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato        if (matches.size() > 0) {
1249c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato            // Find disabled/removed activities and remove them from data and add them
1259c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato            // to the removed list.
1265c16f3ecd6b47bff3abbe40deb3d39c66a3b0012Romain Guy            for (int i = data.size() - 1; i >= 0; i--) {
1279c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato                final ApplicationInfo applicationInfo = data.get(i);
1289c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato                final ComponentName component = applicationInfo.intent.getComponent();
129374753cabf05cde1ad669d07bde47e34fdcbe499Amith Yamasani                if (user.equals(applicationInfo.user)
130374753cabf05cde1ad669d07bde47e34fdcbe499Amith Yamasani                        && packageName.equals(component.getPackageName())) {
131374753cabf05cde1ad669d07bde47e34fdcbe499Amith Yamasani                    if (!findActivity(matches, component, user)) {
1329c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato                        removed.add(applicationInfo);
13353f6b7b340534e043fc98dc6a49fd9839d01c12aWinson                        mIconCache.remove(component, user);
1349c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato                        data.remove(i);
1359c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato                    }
1369c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato                }
1379c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato            }
1389c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato
1399c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato            // Find enabled activities and add them to the adapter
1409c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato            // Also updates existing activities with new labels/icons
1419c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato            int count = matches.size();
1425c16f3ecd6b47bff3abbe40deb3d39c66a3b0012Romain Guy            for (int i = 0; i < count; i++) {
143374753cabf05cde1ad669d07bde47e34fdcbe499Amith Yamasani                final LauncherActivityInfo info = matches.get(i);
1449c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato                ApplicationInfo applicationInfo = findApplicationInfoLocked(
145374753cabf05cde1ad669d07bde47e34fdcbe499Amith Yamasani                        info.getComponentName().getPackageName(),
146c6c62707c1c81b41d2592b61d23db5ba6b729122Adam Cohen                        info.getComponentName().getClassName(),
147374753cabf05cde1ad669d07bde47e34fdcbe499Amith Yamasani                        user);
1489c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato                if (applicationInfo == null) {
149374753cabf05cde1ad669d07bde47e34fdcbe499Amith Yamasani                    add(new ApplicationInfo(info, user,
150374753cabf05cde1ad669d07bde47e34fdcbe499Amith Yamasani                            mIconCache, null));
1519c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato                } else {
15253f6b7b340534e043fc98dc6a49fd9839d01c12aWinson                    mIconCache.remove(applicationInfo.componentName, user);
153c3eecff9043759926df124483b45fe8f4436ae7cWinson Chung                    mIconCache.getTitleAndIcon(applicationInfo, info, null);
1549c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato                    modified.add(applicationInfo);
1559c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato                }
1569c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato            }
1572d86dfec5797bfd4fba78562032c14bd9b6cfa7aDianne Hackborn        } else {
1582d86dfec5797bfd4fba78562032c14bd9b6cfa7aDianne Hackborn            // Remove all data for this package.
1592d86dfec5797bfd4fba78562032c14bd9b6cfa7aDianne Hackborn            for (int i = data.size() - 1; i >= 0; i--) {
1602d86dfec5797bfd4fba78562032c14bd9b6cfa7aDianne Hackborn                final ApplicationInfo applicationInfo = data.get(i);
1612d86dfec5797bfd4fba78562032c14bd9b6cfa7aDianne Hackborn                final ComponentName component = applicationInfo.intent.getComponent();
162374753cabf05cde1ad669d07bde47e34fdcbe499Amith Yamasani                if (user.equals(applicationInfo.user)
163374753cabf05cde1ad669d07bde47e34fdcbe499Amith Yamasani                        && packageName.equals(component.getPackageName())) {
1642d86dfec5797bfd4fba78562032c14bd9b6cfa7aDianne Hackborn                    removed.add(applicationInfo);
16553f6b7b340534e043fc98dc6a49fd9839d01c12aWinson                    mIconCache.remove(component, user);
1662d86dfec5797bfd4fba78562032c14bd9b6cfa7aDianne Hackborn                    data.remove(i);
1672d86dfec5797bfd4fba78562032c14bd9b6cfa7aDianne Hackborn                }
1682d86dfec5797bfd4fba78562032c14bd9b6cfa7aDianne Hackborn            }
1699c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato        }
1709c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato    }
1719c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato
1729c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato    /**
173374753cabf05cde1ad669d07bde47e34fdcbe499Amith Yamasani     * Returns whether <em>apps</em> contains <em>component</em> for a specific
174374753cabf05cde1ad669d07bde47e34fdcbe499Amith Yamasani     * user profile.
1759c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato     */
176374753cabf05cde1ad669d07bde47e34fdcbe499Amith Yamasani    private static boolean findActivity(List<LauncherActivityInfo> apps, ComponentName component,
177374753cabf05cde1ad669d07bde47e34fdcbe499Amith Yamasani            UserHandle user) {
178374753cabf05cde1ad669d07bde47e34fdcbe499Amith Yamasani        for (LauncherActivityInfo info : apps) {
179374753cabf05cde1ad669d07bde47e34fdcbe499Amith Yamasani            if (info.getUser().equals(user)
180374753cabf05cde1ad669d07bde47e34fdcbe499Amith Yamasani                    && info.getComponentName().equals(component)) {
1819c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato                return true;
1829c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato            }
1839c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato        }
1849c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato        return false;
1859c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato    }
1869c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato
1879c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato    /**
188374753cabf05cde1ad669d07bde47e34fdcbe499Amith Yamasani     * Returns whether <em>apps</em> contains <em>component</em> for a specific
189374753cabf05cde1ad669d07bde47e34fdcbe499Amith Yamasani     * user profile.
190d65d08e709ec0916446100bae0a7276d0800382fJoe Onorato     */
191374753cabf05cde1ad669d07bde47e34fdcbe499Amith Yamasani    private static boolean findActivity(ArrayList<ApplicationInfo> apps, ComponentName component,
192374753cabf05cde1ad669d07bde47e34fdcbe499Amith Yamasani            UserHandle user) {
193d65d08e709ec0916446100bae0a7276d0800382fJoe Onorato        final int N = apps.size();
194374753cabf05cde1ad669d07bde47e34fdcbe499Amith Yamasani        for (int i = 0; i < N; i++) {
195d65d08e709ec0916446100bae0a7276d0800382fJoe Onorato            final ApplicationInfo info = apps.get(i);
196374753cabf05cde1ad669d07bde47e34fdcbe499Amith Yamasani            if (info.user.equals(user) && info.componentName.equals(component)) {
197d65d08e709ec0916446100bae0a7276d0800382fJoe Onorato                return true;
198d65d08e709ec0916446100bae0a7276d0800382fJoe Onorato            }
199d65d08e709ec0916446100bae0a7276d0800382fJoe Onorato        }
200d65d08e709ec0916446100bae0a7276d0800382fJoe Onorato        return false;
201d65d08e709ec0916446100bae0a7276d0800382fJoe Onorato    }
202d65d08e709ec0916446100bae0a7276d0800382fJoe Onorato
203d65d08e709ec0916446100bae0a7276d0800382fJoe Onorato    /**
204374753cabf05cde1ad669d07bde47e34fdcbe499Amith Yamasani     * Find an ApplicationInfo object for the given packageName, className and
205374753cabf05cde1ad669d07bde47e34fdcbe499Amith Yamasani     * user profile.
2069c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato     */
207374753cabf05cde1ad669d07bde47e34fdcbe499Amith Yamasani    private ApplicationInfo findApplicationInfoLocked(String packageName, String className,
208374753cabf05cde1ad669d07bde47e34fdcbe499Amith Yamasani            UserHandle user) {
2099c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato        for (ApplicationInfo info: data) {
2109c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato            final ComponentName component = info.intent.getComponent();
211374753cabf05cde1ad669d07bde47e34fdcbe499Amith Yamasani            if (user.equals(info.user) && packageName.equals(component.getPackageName())
2129c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato                    && className.equals(component.getClassName())) {
2139c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato                return info;
2149c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato            }
2159c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato        }
2169c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato        return null;
2179c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato    }
2189c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato}
219