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