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