191ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project/* 291ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project** 391ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project** Copyright 2007, The Android Open Source Project 491ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project** 591ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project** Licensed under the Apache License, Version 2.0 (the "License"); 691ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project** you may not use this file except in compliance with the License. 791ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project** You may obtain a copy of the License at 891ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project** 991ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project** http://www.apache.org/licenses/LICENSE-2.0 1091ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project** 1191ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project** Unless required by applicable law or agreed to in writing, software 1291ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project** distributed under the License is distributed on an "AS IS" BASIS, 1391ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1491ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project** See the License for the specific language governing permissions and 1591ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project** limitations under the License. 1691ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project*/ 1791ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Projectpackage com.android.packageinstaller; 1891ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project 1991ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Projectimport android.app.Activity; 20362660b35aec989137b205ce8cb8eb945c19c1a3Patrick Dubroyimport android.content.pm.ActivityInfo; 2191ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Projectimport android.content.pm.ApplicationInfo; 2291ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Projectimport android.content.pm.PackageInfo; 2391ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Projectimport android.content.pm.PackageManager; 2491ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Projectimport android.content.pm.PackageParser; 25ff8693ab50a9ed78ee816361c628969752127e9dSuchi Amalapurapuimport android.content.res.AssetManager; 26ff8693ab50a9ed78ee816361c628969752127e9dSuchi Amalapurapuimport android.content.res.Resources; 2791ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Projectimport android.graphics.drawable.Drawable; 2891ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Projectimport android.net.Uri; 2991ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Projectimport android.util.DisplayMetrics; 3091ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Projectimport android.view.View; 3191ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Projectimport android.widget.ImageView; 3291ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Projectimport android.widget.TextView; 3391ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project 34362660b35aec989137b205ce8cb8eb945c19c1a3Patrick Dubroyimport java.io.File; 35362660b35aec989137b205ce8cb8eb945c19c1a3Patrick Dubroyimport java.util.List; 36362660b35aec989137b205ce8cb8eb945c19c1a3Patrick Dubroy 3791ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project/** 3891ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project * This is a utility class for defining some utility methods and constants 3991ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project * used in the package installer application. 4091ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project */ 4191ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Projectpublic class PackageUtil { 4291ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project public static final String PREFIX="com.android.packageinstaller."; 4391ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project public static final String INTENT_ATTR_INSTALL_STATUS = PREFIX+"installStatus"; 4491ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project public static final String INTENT_ATTR_APPLICATION_INFO=PREFIX+"applicationInfo"; 4591ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project public static final String INTENT_ATTR_PERMISSIONS_LIST=PREFIX+"PermissionsList"; 4691ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project //intent attribute strings related to uninstall 4791ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project public static final String INTENT_ATTR_PACKAGE_NAME=PREFIX+"PackageName"; 4891ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project 4991ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project /* 5091ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project * Utility method to get application information for a given packageURI 5191ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project */ 5291ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project public static ApplicationInfo getApplicationInfo(Uri packageURI) { 5391ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project final String archiveFilePath = packageURI.getPath(); 5491ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project PackageParser packageParser = new PackageParser(archiveFilePath); 5591ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project File sourceFile = new File(archiveFilePath); 5691ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project DisplayMetrics metrics = new DisplayMetrics(); 5791ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project metrics.setToDefaults(); 5891ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project PackageParser.Package pkg = packageParser.parsePackage(sourceFile, archiveFilePath, metrics, 0); 5991ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project if (pkg == null) { 6091ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project return null; 6191ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project } 6291ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project return pkg.applicationInfo; 6391ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project } 6491ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project 6591ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project /* 6691ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project * Utility method to get package information for a given packageURI 6791ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project */ 6891ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project public static PackageParser.Package getPackageInfo(Uri packageURI) { 6991ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project final String archiveFilePath = packageURI.getPath(); 7091ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project PackageParser packageParser = new PackageParser(archiveFilePath); 7191ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project File sourceFile = new File(archiveFilePath); 7291ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project DisplayMetrics metrics = new DisplayMetrics(); 7391ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project metrics.setToDefaults(); 743d07f28761d467664ea97a7be7cbedf92762f14cSuchi Amalapurapu PackageParser.Package pkg = packageParser.parsePackage(sourceFile, 753d07f28761d467664ea97a7be7cbedf92762f14cSuchi Amalapurapu archiveFilePath, metrics, 0); 763d07f28761d467664ea97a7be7cbedf92762f14cSuchi Amalapurapu // Nuke the parser reference. 773d07f28761d467664ea97a7be7cbedf92762f14cSuchi Amalapurapu packageParser = null; 783d07f28761d467664ea97a7be7cbedf92762f14cSuchi Amalapurapu return pkg; 7991ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project } 80ff8693ab50a9ed78ee816361c628969752127e9dSuchi Amalapurapu 81362660b35aec989137b205ce8cb8eb945c19c1a3Patrick Dubroy public static View initSnippet(View snippetView, CharSequence label, Drawable icon) { 82362660b35aec989137b205ce8cb8eb945c19c1a3Patrick Dubroy ((ImageView)snippetView.findViewById(R.id.app_icon)).setImageDrawable(icon); 83362660b35aec989137b205ce8cb8eb945c19c1a3Patrick Dubroy ((TextView)snippetView.findViewById(R.id.app_name)).setText(label); 84362660b35aec989137b205ce8cb8eb945c19c1a3Patrick Dubroy return snippetView; 85362660b35aec989137b205ce8cb8eb945c19c1a3Patrick Dubroy } 86362660b35aec989137b205ce8cb8eb945c19c1a3Patrick Dubroy 8791ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project /* 88362660b35aec989137b205ce8cb8eb945c19c1a3Patrick Dubroy * Utility method to display a snippet of an installed application. 89ff8693ab50a9ed78ee816361c628969752127e9dSuchi Amalapurapu * The content view should have been set on context before invoking this method. 90ff8693ab50a9ed78ee816361c628969752127e9dSuchi Amalapurapu * appSnippet view should include R.id.app_icon and R.id.app_name 91ff8693ab50a9ed78ee816361c628969752127e9dSuchi Amalapurapu * defined on it. 92ff8693ab50a9ed78ee816361c628969752127e9dSuchi Amalapurapu * 93ff8693ab50a9ed78ee816361c628969752127e9dSuchi Amalapurapu * @param pContext context of package that can load the resources 94362660b35aec989137b205ce8cb8eb945c19c1a3Patrick Dubroy * @param componentInfo ComponentInfo object whose resources are to be loaded 95362660b35aec989137b205ce8cb8eb945c19c1a3Patrick Dubroy * @param snippetView the snippet view 9691ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project */ 97ff8693ab50a9ed78ee816361c628969752127e9dSuchi Amalapurapu public static View initSnippetForInstalledApp(Activity pContext, 98362660b35aec989137b205ce8cb8eb945c19c1a3Patrick Dubroy ApplicationInfo appInfo, View snippetView) { 99362660b35aec989137b205ce8cb8eb945c19c1a3Patrick Dubroy final PackageManager pm = pContext.getPackageManager(); 100362660b35aec989137b205ce8cb8eb945c19c1a3Patrick Dubroy return initSnippet( 101362660b35aec989137b205ce8cb8eb945c19c1a3Patrick Dubroy snippetView, 102362660b35aec989137b205ce8cb8eb945c19c1a3Patrick Dubroy appInfo.loadLabel(pm), 103362660b35aec989137b205ce8cb8eb945c19c1a3Patrick Dubroy appInfo.loadIcon(pm)); 10491ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project } 105ff8693ab50a9ed78ee816361c628969752127e9dSuchi Amalapurapu 10691ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project /* 107ff8693ab50a9ed78ee816361c628969752127e9dSuchi Amalapurapu * Utility method to display application snippet of a new package. 108ff8693ab50a9ed78ee816361c628969752127e9dSuchi Amalapurapu * The content view should have been set on context before invoking this method. 109ff8693ab50a9ed78ee816361c628969752127e9dSuchi Amalapurapu * appSnippet view should include R.id.app_icon and R.id.app_name 110ff8693ab50a9ed78ee816361c628969752127e9dSuchi Amalapurapu * defined on it. 111ff8693ab50a9ed78ee816361c628969752127e9dSuchi Amalapurapu * 112ff8693ab50a9ed78ee816361c628969752127e9dSuchi Amalapurapu * @param pContext context of package that can load the resources 113ff8693ab50a9ed78ee816361c628969752127e9dSuchi Amalapurapu * @param appInfo ApplicationInfo object of package whose resources are to be loaded 114ff8693ab50a9ed78ee816361c628969752127e9dSuchi Amalapurapu * @param snippetId view id of app snippet view 11591ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project */ 1169ab50f3655afed4f9266402a03d3235d94220397Suchi Amalapurapu public static View initSnippetForNewApp(Activity pContext, AppSnippet as, 1179ab50f3655afed4f9266402a03d3235d94220397Suchi Amalapurapu int snippetId) { 118ff8693ab50a9ed78ee816361c628969752127e9dSuchi Amalapurapu View appSnippet = pContext.findViewById(snippetId); 1199ab50f3655afed4f9266402a03d3235d94220397Suchi Amalapurapu ((ImageView)appSnippet.findViewById(R.id.app_icon)).setImageDrawable(as.icon); 1209ab50f3655afed4f9266402a03d3235d94220397Suchi Amalapurapu ((TextView)appSnippet.findViewById(R.id.app_name)).setText(as.label); 1219ab50f3655afed4f9266402a03d3235d94220397Suchi Amalapurapu return appSnippet; 1229ab50f3655afed4f9266402a03d3235d94220397Suchi Amalapurapu } 1239ab50f3655afed4f9266402a03d3235d94220397Suchi Amalapurapu 1249ab50f3655afed4f9266402a03d3235d94220397Suchi Amalapurapu public static boolean isPackageAlreadyInstalled(Activity context, String pkgName) { 1259ab50f3655afed4f9266402a03d3235d94220397Suchi Amalapurapu List<PackageInfo> installedList = context.getPackageManager().getInstalledPackages( 1269ab50f3655afed4f9266402a03d3235d94220397Suchi Amalapurapu PackageManager.GET_UNINSTALLED_PACKAGES); 1279ab50f3655afed4f9266402a03d3235d94220397Suchi Amalapurapu int installedListSize = installedList.size(); 1289ab50f3655afed4f9266402a03d3235d94220397Suchi Amalapurapu for(int i = 0; i < installedListSize; i++) { 1299ab50f3655afed4f9266402a03d3235d94220397Suchi Amalapurapu PackageInfo tmp = installedList.get(i); 1309ab50f3655afed4f9266402a03d3235d94220397Suchi Amalapurapu if(pkgName.equalsIgnoreCase(tmp.packageName)) { 1319ab50f3655afed4f9266402a03d3235d94220397Suchi Amalapurapu return true; 1329ab50f3655afed4f9266402a03d3235d94220397Suchi Amalapurapu } 1339ab50f3655afed4f9266402a03d3235d94220397Suchi Amalapurapu } 1349ab50f3655afed4f9266402a03d3235d94220397Suchi Amalapurapu return false; 1359ab50f3655afed4f9266402a03d3235d94220397Suchi Amalapurapu } 1369ab50f3655afed4f9266402a03d3235d94220397Suchi Amalapurapu 1379ab50f3655afed4f9266402a03d3235d94220397Suchi Amalapurapu static public class AppSnippet { 1389ab50f3655afed4f9266402a03d3235d94220397Suchi Amalapurapu CharSequence label; 1399ab50f3655afed4f9266402a03d3235d94220397Suchi Amalapurapu Drawable icon; 1409ab50f3655afed4f9266402a03d3235d94220397Suchi Amalapurapu public AppSnippet(CharSequence label, Drawable icon) { 1419ab50f3655afed4f9266402a03d3235d94220397Suchi Amalapurapu this.label = label; 1429ab50f3655afed4f9266402a03d3235d94220397Suchi Amalapurapu this.icon = icon; 1439ab50f3655afed4f9266402a03d3235d94220397Suchi Amalapurapu } 1449ab50f3655afed4f9266402a03d3235d94220397Suchi Amalapurapu } 1459ab50f3655afed4f9266402a03d3235d94220397Suchi Amalapurapu /* 1469ab50f3655afed4f9266402a03d3235d94220397Suchi Amalapurapu * Utility method to load application label 1479ab50f3655afed4f9266402a03d3235d94220397Suchi Amalapurapu * 1489ab50f3655afed4f9266402a03d3235d94220397Suchi Amalapurapu * @param pContext context of package that can load the resources 1499ab50f3655afed4f9266402a03d3235d94220397Suchi Amalapurapu * @param appInfo ApplicationInfo object of package whose resources are to be loaded 1509ab50f3655afed4f9266402a03d3235d94220397Suchi Amalapurapu * @param snippetId view id of app snippet view 1519ab50f3655afed4f9266402a03d3235d94220397Suchi Amalapurapu */ 1529ab50f3655afed4f9266402a03d3235d94220397Suchi Amalapurapu public static AppSnippet getAppSnippet(Activity pContext, ApplicationInfo appInfo, 1539ab50f3655afed4f9266402a03d3235d94220397Suchi Amalapurapu Uri packageURI) { 154ff8693ab50a9ed78ee816361c628969752127e9dSuchi Amalapurapu final String archiveFilePath = packageURI.getPath(); 155ccb4dda8b1525c90323fa9dd7b96b9eeb78b7082Suchi Amalapurapu Resources pRes = pContext.getResources(); 156ff8693ab50a9ed78ee816361c628969752127e9dSuchi Amalapurapu AssetManager assmgr = new AssetManager(); 157ff8693ab50a9ed78ee816361c628969752127e9dSuchi Amalapurapu assmgr.addAssetPath(archiveFilePath); 158ccb4dda8b1525c90323fa9dd7b96b9eeb78b7082Suchi Amalapurapu Resources res = new Resources(assmgr, pRes.getDisplayMetrics(), pRes.getConfiguration()); 159ff8693ab50a9ed78ee816361c628969752127e9dSuchi Amalapurapu CharSequence label = null; 160ff8693ab50a9ed78ee816361c628969752127e9dSuchi Amalapurapu // Try to load the label from the package's resources. If an app has not explicitly 161ff8693ab50a9ed78ee816361c628969752127e9dSuchi Amalapurapu // specified any label, just use the package name. 162f075068817434dbb5e861d00f5ed23d6405ab4d9Suchi Amalapurapu if (appInfo.labelRes != 0) { 163f075068817434dbb5e861d00f5ed23d6405ab4d9Suchi Amalapurapu try { 164f075068817434dbb5e861d00f5ed23d6405ab4d9Suchi Amalapurapu label = res.getText(appInfo.labelRes); 165f075068817434dbb5e861d00f5ed23d6405ab4d9Suchi Amalapurapu } catch (Resources.NotFoundException e) { 166f075068817434dbb5e861d00f5ed23d6405ab4d9Suchi Amalapurapu } 167f075068817434dbb5e861d00f5ed23d6405ab4d9Suchi Amalapurapu } 168ccb4dda8b1525c90323fa9dd7b96b9eeb78b7082Suchi Amalapurapu if (label == null) { 169ccb4dda8b1525c90323fa9dd7b96b9eeb78b7082Suchi Amalapurapu label = (appInfo.nonLocalizedLabel != null) ? 170ccb4dda8b1525c90323fa9dd7b96b9eeb78b7082Suchi Amalapurapu appInfo.nonLocalizedLabel : appInfo.packageName; 171ff8693ab50a9ed78ee816361c628969752127e9dSuchi Amalapurapu } 172ff8693ab50a9ed78ee816361c628969752127e9dSuchi Amalapurapu Drawable icon = null; 173ff8693ab50a9ed78ee816361c628969752127e9dSuchi Amalapurapu // Try to load the icon from the package's resources. If an app has not explicitly 174ff8693ab50a9ed78ee816361c628969752127e9dSuchi Amalapurapu // specified any resource, just use the default icon for now. 175f075068817434dbb5e861d00f5ed23d6405ab4d9Suchi Amalapurapu if (appInfo.icon != 0) { 176f075068817434dbb5e861d00f5ed23d6405ab4d9Suchi Amalapurapu try { 177f075068817434dbb5e861d00f5ed23d6405ab4d9Suchi Amalapurapu icon = res.getDrawable(appInfo.icon); 178f075068817434dbb5e861d00f5ed23d6405ab4d9Suchi Amalapurapu } catch (Resources.NotFoundException e) { 179f075068817434dbb5e861d00f5ed23d6405ab4d9Suchi Amalapurapu } 180f075068817434dbb5e861d00f5ed23d6405ab4d9Suchi Amalapurapu } 181f075068817434dbb5e861d00f5ed23d6405ab4d9Suchi Amalapurapu if (icon == null) { 182ff8693ab50a9ed78ee816361c628969752127e9dSuchi Amalapurapu icon = pContext.getPackageManager().getDefaultActivityIcon(); 183ff8693ab50a9ed78ee816361c628969752127e9dSuchi Amalapurapu } 1849ab50f3655afed4f9266402a03d3235d94220397Suchi Amalapurapu return new PackageUtil.AppSnippet(label, icon); 18591ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project } 18691ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project} 187