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
17325dc23624160689e59fbac708cf6f222b20d025Daniel Sandlerpackage com.android.launcher3;
189c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato
199c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onoratoimport android.content.ComponentName;
209c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onoratoimport android.content.Context;
21aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chungimport android.content.Intent;
229c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onoratoimport android.content.pm.ActivityInfo;
239c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onoratoimport android.content.pm.PackageManager;
249c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onoratoimport android.content.pm.ResolveInfo;
259c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato
26ed13187a745866483139e2878037e1f8427ce567Kenny Guyimport com.android.launcher3.compat.LauncherActivityInfoCompat;
27ed13187a745866483139e2878037e1f8427ce567Kenny Guyimport com.android.launcher3.compat.LauncherAppsCompat;
28ed13187a745866483139e2878037e1f8427ce567Kenny Guyimport com.android.launcher3.compat.UserHandleCompat;
29ed13187a745866483139e2878037e1f8427ce567Kenny Guy
3034c2e6cf7af328aba25c98158161dbad15ae986dMichael Jurkaimport java.util.ArrayList;
3134c2e6cf7af328aba25c98158161dbad15ae986dMichael Jurkaimport java.util.List;
3234c2e6cf7af328aba25c98158161dbad15ae986dMichael Jurka
339c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato
349c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato/**
359c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato * Stores the list of all applications for the all apps view.
369c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato */
379c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onoratoclass AllAppsList {
389c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato    public static final int DEFAULT_APPLICATIONS_NUMBER = 42;
396d0dde01f307051ee1849481c989d9e87774b894Chris Wren
409c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato    /** The list off all apps. */
41eadbfc564d84aaf1d800da3d0d6edf6312f89648Michael Jurka    public ArrayList<AppInfo> data =
42eadbfc564d84aaf1d800da3d0d6edf6312f89648Michael Jurka            new ArrayList<AppInfo>(DEFAULT_APPLICATIONS_NUMBER);
439c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato    /** The list of apps that have been added since the last notify() call. */
44eadbfc564d84aaf1d800da3d0d6edf6312f89648Michael Jurka    public ArrayList<AppInfo> added =
45eadbfc564d84aaf1d800da3d0d6edf6312f89648Michael Jurka            new ArrayList<AppInfo>(DEFAULT_APPLICATIONS_NUMBER);
469c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato    /** The list of apps that have been removed since the last notify() call. */
47eadbfc564d84aaf1d800da3d0d6edf6312f89648Michael Jurka    public ArrayList<AppInfo> removed = new ArrayList<AppInfo>();
489c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato    /** The list of apps that have been modified since the last notify() call. */
49eadbfc564d84aaf1d800da3d0d6edf6312f89648Michael Jurka    public ArrayList<AppInfo> modified = new ArrayList<AppInfo>();
509c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato
510589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato    private IconCache mIconCache;
520589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato
531307f63f8a93541bf6e2d29c11fab69778a25e42Bjorn Bringert    private AppFilter mAppFilter;
541307f63f8a93541bf6e2d29c11fab69778a25e42Bjorn Bringert
559c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato    /**
569c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato     * Boring constructor.
579c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato     */
581307f63f8a93541bf6e2d29c11fab69778a25e42Bjorn Bringert    public AllAppsList(IconCache iconCache, AppFilter appFilter) {
590589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato        mIconCache = iconCache;
601307f63f8a93541bf6e2d29c11fab69778a25e42Bjorn Bringert        mAppFilter = appFilter;
619c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato    }
629c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato
639c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato    /**
649c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato     * Add the supplied ApplicationInfo objects to the list, and enqueue it into the
659c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato     * list to broadcast when notify() is called.
66d65d08e709ec0916446100bae0a7276d0800382fJoe Onorato     *
67d65d08e709ec0916446100bae0a7276d0800382fJoe Onorato     * If the app is already in the list, doesn't add it.
689c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato     */
69eadbfc564d84aaf1d800da3d0d6edf6312f89648Michael Jurka    public void add(AppInfo info) {
701307f63f8a93541bf6e2d29c11fab69778a25e42Bjorn Bringert        if (mAppFilter != null && !mAppFilter.shouldShowApp(info.componentName)) {
711307f63f8a93541bf6e2d29c11fab69778a25e42Bjorn Bringert            return;
721307f63f8a93541bf6e2d29c11fab69778a25e42Bjorn Bringert        }
73ed13187a745866483139e2878037e1f8427ce567Kenny Guy        if (findActivity(data, info.componentName, info.user)) {
74d65d08e709ec0916446100bae0a7276d0800382fJoe Onorato            return;
75d65d08e709ec0916446100bae0a7276d0800382fJoe Onorato        }
76054019dbeafd33de4e39601e0f305926c15bad15Daniel Sandler        data.add(info);
77054019dbeafd33de4e39601e0f305926c15bad15Daniel Sandler        added.add(info);
789c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato    }
791307f63f8a93541bf6e2d29c11fab69778a25e42Bjorn Bringert
809c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato    public void clear() {
819c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato        data.clear();
829c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato        // TODO: do we clear these too?
839c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato        added.clear();
849c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato        removed.clear();
859c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato        modified.clear();
869c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato    }
879c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato
889c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato    public int size() {
899c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato        return data.size();
909c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato    }
919c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato
92eadbfc564d84aaf1d800da3d0d6edf6312f89648Michael Jurka    public AppInfo get(int index) {
939c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato        return data.get(index);
949c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato    }
959c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato
969c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato    /**
979c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato     * Add the icons for the supplied apk called packageName.
989c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato     */
99ed13187a745866483139e2878037e1f8427ce567Kenny Guy    public void addPackage(Context context, String packageName, UserHandleCompat user) {
100ed13187a745866483139e2878037e1f8427ce567Kenny Guy        final LauncherAppsCompat launcherApps = LauncherAppsCompat.getInstance(context);
101ed13187a745866483139e2878037e1f8427ce567Kenny Guy        final List<LauncherActivityInfoCompat> matches = launcherApps.getActivityList(packageName,
102ed13187a745866483139e2878037e1f8427ce567Kenny Guy                user);
1039c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato
1049c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato        if (matches.size() > 0) {
105ed13187a745866483139e2878037e1f8427ce567Kenny Guy            for (LauncherActivityInfoCompat info : matches) {
106ed13187a745866483139e2878037e1f8427ce567Kenny Guy                add(new AppInfo(context, info, user, mIconCache, null));
1079c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato            }
1089c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato        }
1099c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato    }
1109c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato
1119c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato    /**
1129c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato     * Remove the apps for the given apk identified by packageName.
1139c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato     */
114ed13187a745866483139e2878037e1f8427ce567Kenny Guy    public void removePackage(String packageName, UserHandleCompat user) {
115eadbfc564d84aaf1d800da3d0d6edf6312f89648Michael Jurka        final List<AppInfo> data = this.data;
1165c16f3ecd6b47bff3abbe40deb3d39c66a3b0012Romain Guy        for (int i = data.size() - 1; i >= 0; i--) {
117eadbfc564d84aaf1d800da3d0d6edf6312f89648Michael Jurka            AppInfo info = data.get(i);
1189c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato            final ComponentName component = info.intent.getComponent();
119ed13187a745866483139e2878037e1f8427ce567Kenny Guy            if (info.user.equals(user) && packageName.equals(component.getPackageName())) {
1209c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato                removed.add(info);
1219c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato                data.remove(i);
1229c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato            }
1239c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato        }
124ed13187a745866483139e2878037e1f8427ce567Kenny Guy        mIconCache.remove(packageName, user);
1259c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato    }
1260589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato
1279c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato    /**
1289c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato     * Add and remove icons for this package which has been updated.
1299c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato     */
130ed13187a745866483139e2878037e1f8427ce567Kenny Guy    public void updatePackage(Context context, String packageName, UserHandleCompat user) {
131ed13187a745866483139e2878037e1f8427ce567Kenny Guy        final LauncherAppsCompat launcherApps = LauncherAppsCompat.getInstance(context);
132ed13187a745866483139e2878037e1f8427ce567Kenny Guy        final List<LauncherActivityInfoCompat> matches = launcherApps.getActivityList(packageName,
133ed13187a745866483139e2878037e1f8427ce567Kenny Guy                user);
1349c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato        if (matches.size() > 0) {
1359c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato            // Find disabled/removed activities and remove them from data and add them
1369c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato            // to the removed list.
1375c16f3ecd6b47bff3abbe40deb3d39c66a3b0012Romain Guy            for (int i = data.size() - 1; i >= 0; i--) {
138eadbfc564d84aaf1d800da3d0d6edf6312f89648Michael Jurka                final AppInfo applicationInfo = data.get(i);
1399c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato                final ComponentName component = applicationInfo.intent.getComponent();
140ed13187a745866483139e2878037e1f8427ce567Kenny Guy                if (user.equals(applicationInfo.user)
141ed13187a745866483139e2878037e1f8427ce567Kenny Guy                        && packageName.equals(component.getPackageName())) {
1429c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato                    if (!findActivity(matches, component)) {
1439c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato                        removed.add(applicationInfo);
144ed13187a745866483139e2878037e1f8427ce567Kenny Guy                        mIconCache.remove(component, user);
1459c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato                        data.remove(i);
1469c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato                    }
1479c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato                }
1489c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato            }
1499c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato
1509c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato            // Find enabled activities and add them to the adapter
1519c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato            // Also updates existing activities with new labels/icons
1529c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato            int count = matches.size();
1535c16f3ecd6b47bff3abbe40deb3d39c66a3b0012Romain Guy            for (int i = 0; i < count; i++) {
154ed13187a745866483139e2878037e1f8427ce567Kenny Guy                final LauncherActivityInfoCompat info = matches.get(i);
155eadbfc564d84aaf1d800da3d0d6edf6312f89648Michael Jurka                AppInfo applicationInfo = findApplicationInfoLocked(
156ed13187a745866483139e2878037e1f8427ce567Kenny Guy                        info.getComponentName().getPackageName(), user,
15752a2841f6b364d6a002d33bcea5816b1bce2e30dAdam Cohen                        info.getComponentName().getClassName());
1589c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato                if (applicationInfo == null) {
159ed13187a745866483139e2878037e1f8427ce567Kenny Guy                    add(new AppInfo(context, info, user, mIconCache, null));
1609c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato                } else {
161ed13187a745866483139e2878037e1f8427ce567Kenny Guy                    mIconCache.remove(applicationInfo.componentName, user);
162c3eecff9043759926df124483b45fe8f4436ae7cWinson Chung                    mIconCache.getTitleAndIcon(applicationInfo, info, null);
1639c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato                    modified.add(applicationInfo);
1649c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato                }
1659c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato            }
1662d86dfec5797bfd4fba78562032c14bd9b6cfa7aDianne Hackborn        } else {
1672d86dfec5797bfd4fba78562032c14bd9b6cfa7aDianne Hackborn            // Remove all data for this package.
1682d86dfec5797bfd4fba78562032c14bd9b6cfa7aDianne Hackborn            for (int i = data.size() - 1; i >= 0; i--) {
169eadbfc564d84aaf1d800da3d0d6edf6312f89648Michael Jurka                final AppInfo applicationInfo = data.get(i);
1702d86dfec5797bfd4fba78562032c14bd9b6cfa7aDianne Hackborn                final ComponentName component = applicationInfo.intent.getComponent();
171ed13187a745866483139e2878037e1f8427ce567Kenny Guy                if (user.equals(applicationInfo.user)
172ed13187a745866483139e2878037e1f8427ce567Kenny Guy                        && packageName.equals(component.getPackageName())) {
1732d86dfec5797bfd4fba78562032c14bd9b6cfa7aDianne Hackborn                    removed.add(applicationInfo);
174ed13187a745866483139e2878037e1f8427ce567Kenny Guy                    mIconCache.remove(component, user);
1752d86dfec5797bfd4fba78562032c14bd9b6cfa7aDianne Hackborn                    data.remove(i);
1762d86dfec5797bfd4fba78562032c14bd9b6cfa7aDianne Hackborn                }
1772d86dfec5797bfd4fba78562032c14bd9b6cfa7aDianne Hackborn            }
1789c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato        }
1799c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato    }
1809c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato
1819c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato
1829c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato    /**
1839c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato     * Returns whether <em>apps</em> contains <em>component</em>.
1849c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato     */
185ed13187a745866483139e2878037e1f8427ce567Kenny Guy    private static boolean findActivity(List<LauncherActivityInfoCompat> apps,
186ed13187a745866483139e2878037e1f8427ce567Kenny Guy            ComponentName component) {
187ed13187a745866483139e2878037e1f8427ce567Kenny Guy        for (LauncherActivityInfoCompat info : apps) {
188ed13187a745866483139e2878037e1f8427ce567Kenny Guy            if (info.getComponentName().equals(component)) {
1899c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato                return true;
1909c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato            }
1919c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato        }
1929c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato        return false;
1939c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato    }
1949c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato
1959c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato    /**
196ed13187a745866483139e2878037e1f8427ce567Kenny Guy     * Query the launcher apps service for whether the supplied package has
197ed13187a745866483139e2878037e1f8427ce567Kenny Guy     * MAIN/LAUNCHER activities in the supplied package.
198ed13187a745866483139e2878037e1f8427ce567Kenny Guy     */
199ed13187a745866483139e2878037e1f8427ce567Kenny Guy    static boolean packageHasActivities(Context context, String packageName,
200ed13187a745866483139e2878037e1f8427ce567Kenny Guy            UserHandleCompat user) {
201ed13187a745866483139e2878037e1f8427ce567Kenny Guy        final LauncherAppsCompat launcherApps = LauncherAppsCompat.getInstance(context);
202ed13187a745866483139e2878037e1f8427ce567Kenny Guy        return launcherApps.getActivityList(packageName, user).size() > 0;
203ed13187a745866483139e2878037e1f8427ce567Kenny Guy    }
204ed13187a745866483139e2878037e1f8427ce567Kenny Guy
205ed13187a745866483139e2878037e1f8427ce567Kenny Guy    /**
206d65d08e709ec0916446100bae0a7276d0800382fJoe Onorato     * Returns whether <em>apps</em> contains <em>component</em>.
207d65d08e709ec0916446100bae0a7276d0800382fJoe Onorato     */
208ed13187a745866483139e2878037e1f8427ce567Kenny Guy    private static boolean findActivity(ArrayList<AppInfo> apps, ComponentName component,
209ed13187a745866483139e2878037e1f8427ce567Kenny Guy            UserHandleCompat user) {
210d65d08e709ec0916446100bae0a7276d0800382fJoe Onorato        final int N = apps.size();
211ed13187a745866483139e2878037e1f8427ce567Kenny Guy        for (int i = 0; i < N; i++) {
212eadbfc564d84aaf1d800da3d0d6edf6312f89648Michael Jurka            final AppInfo info = apps.get(i);
213ed13187a745866483139e2878037e1f8427ce567Kenny Guy            if (info.user.equals(user) && info.componentName.equals(component)) {
214d65d08e709ec0916446100bae0a7276d0800382fJoe Onorato                return true;
215d65d08e709ec0916446100bae0a7276d0800382fJoe Onorato            }
216d65d08e709ec0916446100bae0a7276d0800382fJoe Onorato        }
217d65d08e709ec0916446100bae0a7276d0800382fJoe Onorato        return false;
218d65d08e709ec0916446100bae0a7276d0800382fJoe Onorato    }
219d65d08e709ec0916446100bae0a7276d0800382fJoe Onorato
220d65d08e709ec0916446100bae0a7276d0800382fJoe Onorato    /**
2219c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato     * Find an ApplicationInfo object for the given packageName and className.
2229c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato     */
223ed13187a745866483139e2878037e1f8427ce567Kenny Guy    private AppInfo findApplicationInfoLocked(String packageName, UserHandleCompat user,
224ed13187a745866483139e2878037e1f8427ce567Kenny Guy            String className) {
225eadbfc564d84aaf1d800da3d0d6edf6312f89648Michael Jurka        for (AppInfo info: data) {
2269c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato            final ComponentName component = info.intent.getComponent();
227ed13187a745866483139e2878037e1f8427ce567Kenny Guy            if (user.equals(info.user) && packageName.equals(component.getPackageName())
2289c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato                    && className.equals(component.getClassName())) {
2299c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato                return info;
2309c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato            }
2319c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato        }
2329c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato        return null;
2339c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato    }
2349c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato}
235