• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2 **
3 ** Copyright 2007, The Android Open Source Project
4 **
5 ** Licensed under the Apache License, Version 2.0 (the "License");
6 ** you may not use this file except in compliance with the License.
7 ** You may obtain a copy of the License at
8 **
9 **     http://www.apache.org/licenses/LICENSE-2.0
10 **
11 ** Unless required by applicable law or agreed to in writing, software
12 ** distributed under the License is distributed on an "AS IS" BASIS,
13 ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 ** See the License for the specific language governing permissions and
15 ** limitations under the License.
16 */
17 
18 package com.android.packageinstaller;
19 
20 import android.app.Activity;
21 import android.content.pm.ApplicationInfo;
22 import android.content.pm.PackageInfo;
23 import android.content.pm.PackageManager;
24 import android.content.pm.PackageParser;
25 import android.content.res.AssetManager;
26 import android.content.res.Resources;
27 import android.graphics.drawable.Drawable;
28 import android.util.DisplayMetrics;
29 import android.view.View;
30 import android.widget.ImageView;
31 import android.widget.TextView;
32 
33 import java.io.File;
34 import java.util.List;
35 
36 /**
37  * This is a utility class for defining some utility methods and constants
38  * used in the package installer application.
39  */
40 public class PackageUtil {
41     public static final String PREFIX="com.android.packageinstaller.";
42     public static final String INTENT_ATTR_INSTALL_STATUS = PREFIX+"installStatus";
43     public static final String INTENT_ATTR_APPLICATION_INFO=PREFIX+"applicationInfo";
44     public static final String INTENT_ATTR_PERMISSIONS_LIST=PREFIX+"PermissionsList";
45     //intent attribute strings related to uninstall
46     public static final String INTENT_ATTR_PACKAGE_NAME=PREFIX+"PackageName";
47 
48     /**
49      * Utility method to get application information for a given {@link File}
50      */
getApplicationInfo(File sourcePath)51     public static ApplicationInfo getApplicationInfo(File sourcePath) {
52         final String archiveFilePath = sourcePath.getAbsolutePath();
53         PackageParser packageParser = new PackageParser(archiveFilePath);
54         File sourceFile = new File(archiveFilePath);
55         DisplayMetrics metrics = new DisplayMetrics();
56         metrics.setToDefaults();
57         PackageParser.Package pkg = packageParser.parsePackage(
58                 sourceFile, archiveFilePath, metrics, 0);
59         if (pkg == null) {
60             return null;
61         }
62         return pkg.applicationInfo;
63     }
64 
65     /**
66      * Utility method to get package information for a given {@link File}
67      */
getPackageInfo(File sourceFile)68     public static PackageParser.Package getPackageInfo(File sourceFile) {
69         final String archiveFilePath = sourceFile.getAbsolutePath();
70         PackageParser packageParser = new PackageParser(archiveFilePath);
71         DisplayMetrics metrics = new DisplayMetrics();
72         metrics.setToDefaults();
73         PackageParser.Package pkg =  packageParser.parsePackage(sourceFile,
74                 archiveFilePath, metrics, 0);
75         if (pkg == null) {
76             return null;
77         }
78         if (!packageParser.collectManifestDigest(pkg)) {
79             return null;
80         }
81         return pkg;
82     }
83 
initSnippet(View snippetView, CharSequence label, Drawable icon)84     public static View initSnippet(View snippetView, CharSequence label, Drawable icon) {
85         ((ImageView)snippetView.findViewById(R.id.app_icon)).setImageDrawable(icon);
86         ((TextView)snippetView.findViewById(R.id.app_name)).setText(label);
87         return snippetView;
88     }
89 
90     /**
91      * Utility method to display a snippet of an installed application.
92      * The content view should have been set on context before invoking this method.
93      * appSnippet view should include R.id.app_icon and R.id.app_name
94      * defined on it.
95      *
96      * @param pContext context of package that can load the resources
97      * @param componentInfo ComponentInfo object whose resources are to be loaded
98      * @param snippetView the snippet view
99      */
initSnippetForInstalledApp(Activity pContext, ApplicationInfo appInfo, View snippetView)100     public static View initSnippetForInstalledApp(Activity pContext,
101             ApplicationInfo appInfo, View snippetView) {
102         final PackageManager pm = pContext.getPackageManager();
103         return initSnippet(
104                 snippetView,
105                 appInfo.loadLabel(pm),
106                 appInfo.loadIcon(pm));
107     }
108 
109     /**
110      * Utility method to display application snippet of a new package.
111      * The content view should have been set on context before invoking this method.
112      * appSnippet view should include R.id.app_icon and R.id.app_name
113      * defined on it.
114      *
115      * @param pContext context of package that can load the resources
116      * @param appInfo ApplicationInfo object of package whose resources are to be loaded
117      * @param snippetId view id of app snippet view
118      */
initSnippetForNewApp(Activity pContext, AppSnippet as, int snippetId)119     public static View initSnippetForNewApp(Activity pContext, AppSnippet as,
120             int snippetId) {
121         View appSnippet = pContext.findViewById(snippetId);
122         ((ImageView)appSnippet.findViewById(R.id.app_icon)).setImageDrawable(as.icon);
123         ((TextView)appSnippet.findViewById(R.id.app_name)).setText(as.label);
124         return appSnippet;
125     }
126 
isPackageAlreadyInstalled(Activity context, String pkgName)127     public static boolean isPackageAlreadyInstalled(Activity context, String pkgName) {
128         List<PackageInfo> installedList = context.getPackageManager().getInstalledPackages(
129                 PackageManager.GET_UNINSTALLED_PACKAGES);
130         int installedListSize = installedList.size();
131         for(int i = 0; i < installedListSize; i++) {
132             PackageInfo tmp = installedList.get(i);
133             if(pkgName.equalsIgnoreCase(tmp.packageName)) {
134                 return true;
135             }
136         }
137         return false;
138     }
139 
140     static public class AppSnippet {
141         CharSequence label;
142         Drawable icon;
AppSnippet(CharSequence label, Drawable icon)143         public AppSnippet(CharSequence label, Drawable icon) {
144             this.label = label;
145             this.icon = icon;
146         }
147     }
148 
149     /**
150      * Utility method to load application label
151      *
152      * @param pContext context of package that can load the resources
153      * @param appInfo ApplicationInfo object of package whose resources are to be loaded
154      * @param snippetId view id of app snippet view
155      */
getAppSnippet( Activity pContext, ApplicationInfo appInfo, File sourceFile)156     public static AppSnippet getAppSnippet(
157             Activity pContext, ApplicationInfo appInfo, File sourceFile) {
158         final String archiveFilePath = sourceFile.getAbsolutePath();
159         Resources pRes = pContext.getResources();
160         AssetManager assmgr = new AssetManager();
161         assmgr.addAssetPath(archiveFilePath);
162         Resources res = new Resources(assmgr, pRes.getDisplayMetrics(), pRes.getConfiguration());
163         CharSequence label = null;
164         // Try to load the label from the package's resources. If an app has not explicitly
165         // specified any label, just use the package name.
166         if (appInfo.labelRes != 0) {
167             try {
168                 label = res.getText(appInfo.labelRes);
169             } catch (Resources.NotFoundException e) {
170             }
171         }
172         if (label == null) {
173             label = (appInfo.nonLocalizedLabel != null) ?
174                     appInfo.nonLocalizedLabel : appInfo.packageName;
175         }
176         Drawable icon = null;
177         // Try to load the icon from the package's resources. If an app has not explicitly
178         // specified any resource, just use the default icon for now.
179         if (appInfo.icon != 0) {
180             try {
181                 icon = res.getDrawable(appInfo.icon);
182             } catch (Resources.NotFoundException e) {
183             }
184         }
185         if (icon == null) {
186             icon = pContext.getPackageManager().getDefaultActivityIcon();
187         }
188         return new PackageUtil.AppSnippet(label, icon);
189     }
190 }
191