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;
20d58f150060e9300038ff86eeeffc86c2440303c8Ben Gruverimport android.app.ActivityManagerNative;
2191ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Projectimport android.app.AlertDialog;
2291ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Projectimport android.app.Dialog;
239e9721266feafdf16786b94f6fac4c06220cd422Dianne Hackbornimport android.content.Context;
2491ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Projectimport android.content.DialogInterface;
2591ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Projectimport android.content.DialogInterface.OnCancelListener;
261f45fa5f219a6577265c480a81af77450985d532Gilles Debunneimport android.content.Intent;
279e9721266feafdf16786b94f6fac4c06220cd422Dianne Hackbornimport android.content.SharedPreferences;
2891ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Projectimport android.content.pm.ApplicationInfo;
292b3202c3ff18469b294629bf1416118f12492173Kenny Rootimport android.content.pm.ManifestDigest;
30aba0bed7a4f6301c6e3067fc799d8ef47aaca0b2Dianne Hackbornimport android.content.pm.PackageInfo;
318538fde237709464ec899a402fee29c0169f6bfaJeff Sharkeyimport android.content.pm.PackageInstaller;
3291ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Projectimport android.content.pm.PackageManager;
3391ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Projectimport android.content.pm.PackageManager.NameNotFoundException;
341f45fa5f219a6577265c480a81af77450985d532Gilles Debunneimport android.content.pm.PackageParser;
352055eecd55b944643111c4987e507f4a650f95e4Nick Kralevichimport android.content.pm.PackageUserState;
367b30bc34492a0c53b02cec2fee7d0993da407fc4Alex Klyubinimport android.content.pm.ResolveInfo;
37d58f150060e9300038ff86eeeffc86c2440303c8Ben Gruverimport android.content.pm.VerificationParams;
3891ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Projectimport android.net.Uri;
3991ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Projectimport android.os.Bundle;
407b30bc34492a0c53b02cec2fee7d0993da407fc4Alex Klyubinimport android.os.SystemClock;
4195fb7ee253cdb00a2d9ccf6955afc63e6b399ffaSander Alewijnseimport android.os.UserManager;
4291ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Projectimport android.provider.Settings;
4337df032e580ab6bed29eb40b72df1f49cefd2af1Dianne Hackbornimport android.support.v4.view.ViewPager;
4491ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Projectimport android.util.Log;
459762658939747166e3c40d817971aa5b17231ee7Dianne Hackbornimport android.view.LayoutInflater;
46d9b773b7041894e37c1b6f62d6b221dd3c8e4c43Suchi Amalapurapuimport android.view.View;
47d9b773b7041894e37c1b6f62d6b221dd3c8e4c43Suchi Amalapurapuimport android.view.View.OnClickListener;
48ee21cab0e684710a77df85577ff16d1f00edaf4dAdam Powellimport android.view.ViewGroup;
49d9b773b7041894e37c1b6f62d6b221dd3c8e4c43Suchi Amalapurapuimport android.widget.AppSecurityPermissions;
50d9b773b7041894e37c1b6f62d6b221dd3c8e4c43Suchi Amalapurapuimport android.widget.Button;
519762658939747166e3c40d817971aa5b17231ee7Dianne Hackbornimport android.widget.TabHost;
529762658939747166e3c40d817971aa5b17231ee7Dianne Hackbornimport android.widget.TextView;
5391ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project
5479da2eaa800f889be5e5f5bd91121c2ecb55ce14Jeff Sharkeyimport java.io.File;
557b30bc34492a0c53b02cec2fee7d0993da407fc4Alex Klyubinimport java.util.List;
5679da2eaa800f889be5e5f5bd91121c2ecb55ce14Jeff Sharkey
5791ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project/*
5891ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project * This activity is launched when a new application is installed via side loading
5991ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project * The package is first parsed and the user is notified of parse errors via a dialog.
6091ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project * If the package is successfully parsed, the user is notified to turn on the install unknown
6191ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project * applications setting. A memory check is made at this point and the user is notified of out
6291ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project * of memory conditions if any. If the package is already existing on the device,
6391ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project * a confirmation dialog (to replace the existing package) is presented to the user.
6491ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project * Based on the user response the package is then installed by launching InstallAppConfirm
6591ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project * sub activity. All state transitions are handled in this activity
6691ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project */
67d9b773b7041894e37c1b6f62d6b221dd3c8e4c43Suchi Amalapurapupublic class PackageInstallerActivity extends Activity implements OnCancelListener, OnClickListener {
6891ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project    private static final String TAG = "PackageInstaller";
698538fde237709464ec899a402fee29c0169f6bfaJeff Sharkey
708538fde237709464ec899a402fee29c0169f6bfaJeff Sharkey    private int mSessionId = -1;
71319efc1c099a0c0c516d3a0d3d110c8608c9eee9Rich Cannings    private Uri mPackageURI;
72916ad007619e025218665298ef9793c152ced070rich cannings    private Uri mOriginatingURI;
73916ad007619e025218665298ef9793c152ced070rich cannings    private Uri mReferrerURI;
74d58f150060e9300038ff86eeeffc86c2440303c8Ben Gruver    private int mOriginatingUid = VerificationParams.NO_UID;
752b3202c3ff18469b294629bf1416118f12492173Kenny Root    private ManifestDigest mPkgDigest;
76d58f150060e9300038ff86eeeffc86c2440303c8Ben Gruver
7791ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project    private boolean localLOGV = false;
7891ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project    PackageManager mPm;
798538fde237709464ec899a402fee29c0169f6bfaJeff Sharkey    PackageInstaller mInstaller;
80aba0bed7a4f6301c6e3067fc799d8ef47aaca0b2Dianne Hackborn    PackageInfo mPkgInfo;
819e9721266feafdf16786b94f6fac4c06220cd422Dianne Hackborn    ApplicationInfo mSourceInfo;
8291ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project
8391ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project    // ApplicationInfo object primarily used for already existing applications
8491ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project    private ApplicationInfo mAppInfo = null;
8591ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project
867b30bc34492a0c53b02cec2fee7d0993da407fc4Alex Klyubin    private InstallFlowAnalytics mInstallFlowAnalytics;
877b30bc34492a0c53b02cec2fee7d0993da407fc4Alex Klyubin
88d9b773b7041894e37c1b6f62d6b221dd3c8e4c43Suchi Amalapurapu    // View for install progress
89d9b773b7041894e37c1b6f62d6b221dd3c8e4c43Suchi Amalapurapu    View mInstallConfirm;
90d9b773b7041894e37c1b6f62d6b221dd3c8e4c43Suchi Amalapurapu    // Buttons to indicate user acceptance
91d9b773b7041894e37c1b6f62d6b221dd3c8e4c43Suchi Amalapurapu    private Button mOk;
92d9b773b7041894e37c1b6f62d6b221dd3c8e4c43Suchi Amalapurapu    private Button mCancel;
938ec226e8c778a3d1b4268edc33cd7c515d88ab31Dianne Hackborn    CaffeinatedScrollView mScrollView = null;
948ec226e8c778a3d1b4268edc33cd7c515d88ab31Dianne Hackborn    private boolean mOkCanInstall = false;
95d9b773b7041894e37c1b6f62d6b221dd3c8e4c43Suchi Amalapurapu
969e9721266feafdf16786b94f6fac4c06220cd422Dianne Hackborn    static final String PREFS_ALLOWED_SOURCES = "allowed_sources";
979e9721266feafdf16786b94f6fac4c06220cd422Dianne Hackborn
987b30bc34492a0c53b02cec2fee7d0993da407fc4Alex Klyubin    private static final String PACKAGE_MIME_TYPE = "application/vnd.android.package-archive";
997b30bc34492a0c53b02cec2fee7d0993da407fc4Alex Klyubin
1007b30bc34492a0c53b02cec2fee7d0993da407fc4Alex Klyubin    private static final String TAB_ID_ALL = "all";
1017b30bc34492a0c53b02cec2fee7d0993da407fc4Alex Klyubin    private static final String TAB_ID_NEW = "new";
1027b30bc34492a0c53b02cec2fee7d0993da407fc4Alex Klyubin
10391ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project    // Dialog identifiers used in showDialog
10491ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project    private static final int DLG_BASE = 0;
10537df032e580ab6bed29eb40b72df1f49cefd2af1Dianne Hackborn    private static final int DLG_UNKNOWN_APPS = DLG_BASE + 1;
10637df032e580ab6bed29eb40b72df1f49cefd2af1Dianne Hackborn    private static final int DLG_PACKAGE_ERROR = DLG_BASE + 2;
10737df032e580ab6bed29eb40b72df1f49cefd2af1Dianne Hackborn    private static final int DLG_OUT_OF_SPACE = DLG_BASE + 3;
10837df032e580ab6bed29eb40b72df1f49cefd2af1Dianne Hackborn    private static final int DLG_INSTALL_ERROR = DLG_BASE + 4;
10937df032e580ab6bed29eb40b72df1f49cefd2af1Dianne Hackborn    private static final int DLG_ALLOW_SOURCE = DLG_BASE + 5;
11037df032e580ab6bed29eb40b72df1f49cefd2af1Dianne Hackborn
111d9b773b7041894e37c1b6f62d6b221dd3c8e4c43Suchi Amalapurapu    private void startInstallConfirm() {
11237df032e580ab6bed29eb40b72df1f49cefd2af1Dianne Hackborn        TabHost tabHost = (TabHost)findViewById(android.R.id.tabhost);
11337df032e580ab6bed29eb40b72df1f49cefd2af1Dianne Hackborn        tabHost.setup();
11437df032e580ab6bed29eb40b72df1f49cefd2af1Dianne Hackborn        ViewPager viewPager = (ViewPager)findViewById(R.id.pager);
11537df032e580ab6bed29eb40b72df1f49cefd2af1Dianne Hackborn        TabsAdapter adapter = new TabsAdapter(this, tabHost, viewPager);
1167b30bc34492a0c53b02cec2fee7d0993da407fc4Alex Klyubin        adapter.setOnTabChangedListener(new TabHost.OnTabChangeListener() {
1177b30bc34492a0c53b02cec2fee7d0993da407fc4Alex Klyubin            @Override
1187b30bc34492a0c53b02cec2fee7d0993da407fc4Alex Klyubin            public void onTabChanged(String tabId) {
1197b30bc34492a0c53b02cec2fee7d0993da407fc4Alex Klyubin                if (TAB_ID_ALL.equals(tabId)) {
1207b30bc34492a0c53b02cec2fee7d0993da407fc4Alex Klyubin                    mInstallFlowAnalytics.setAllPermissionsDisplayed(true);
1217b30bc34492a0c53b02cec2fee7d0993da407fc4Alex Klyubin                } else if (TAB_ID_NEW.equals(tabId)) {
1227b30bc34492a0c53b02cec2fee7d0993da407fc4Alex Klyubin                    mInstallFlowAnalytics.setNewPermissionsDisplayed(true);
1237b30bc34492a0c53b02cec2fee7d0993da407fc4Alex Klyubin                }
1247b30bc34492a0c53b02cec2fee7d0993da407fc4Alex Klyubin            }
1257b30bc34492a0c53b02cec2fee7d0993da407fc4Alex Klyubin        });
12637df032e580ab6bed29eb40b72df1f49cefd2af1Dianne Hackborn
127d9b773b7041894e37c1b6f62d6b221dd3c8e4c43Suchi Amalapurapu        boolean permVisible = false;
1288ec226e8c778a3d1b4268edc33cd7c515d88ab31Dianne Hackborn        mScrollView = null;
1298ec226e8c778a3d1b4268edc33cd7c515d88ab31Dianne Hackborn        mOkCanInstall = false;
13037df032e580ab6bed29eb40b72df1f49cefd2af1Dianne Hackborn        int msg = 0;
13137df032e580ab6bed29eb40b72df1f49cefd2af1Dianne Hackborn        if (mPkgInfo != null) {
13237df032e580ab6bed29eb40b72df1f49cefd2af1Dianne Hackborn            AppSecurityPermissions perms = new AppSecurityPermissions(this, mPkgInfo);
1338ec226e8c778a3d1b4268edc33cd7c515d88ab31Dianne Hackborn            final int NP = perms.getPermissionCount(AppSecurityPermissions.WHICH_PERSONAL);
1348ec226e8c778a3d1b4268edc33cd7c515d88ab31Dianne Hackborn            final int ND = perms.getPermissionCount(AppSecurityPermissions.WHICH_DEVICE);
13537df032e580ab6bed29eb40b72df1f49cefd2af1Dianne Hackborn            if (mAppInfo != null) {
13637df032e580ab6bed29eb40b72df1f49cefd2af1Dianne Hackborn                msg = (mAppInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0
13737df032e580ab6bed29eb40b72df1f49cefd2af1Dianne Hackborn                        ? R.string.install_confirm_question_update_system
13837df032e580ab6bed29eb40b72df1f49cefd2af1Dianne Hackborn                        : R.string.install_confirm_question_update;
1398ec226e8c778a3d1b4268edc33cd7c515d88ab31Dianne Hackborn                mScrollView = new CaffeinatedScrollView(this);
1408ec226e8c778a3d1b4268edc33cd7c515d88ab31Dianne Hackborn                mScrollView.setFillViewport(true);
1417b30bc34492a0c53b02cec2fee7d0993da407fc4Alex Klyubin                boolean newPermissionsFound =
1427b30bc34492a0c53b02cec2fee7d0993da407fc4Alex Klyubin                        (perms.getPermissionCount(AppSecurityPermissions.WHICH_NEW) > 0);
1437b30bc34492a0c53b02cec2fee7d0993da407fc4Alex Klyubin                mInstallFlowAnalytics.setNewPermissionsFound(newPermissionsFound);
1447b30bc34492a0c53b02cec2fee7d0993da407fc4Alex Klyubin                if (newPermissionsFound) {
1458ec226e8c778a3d1b4268edc33cd7c515d88ab31Dianne Hackborn                    permVisible = true;
1468ec226e8c778a3d1b4268edc33cd7c515d88ab31Dianne Hackborn                    mScrollView.addView(perms.getPermissionsView(
1478ec226e8c778a3d1b4268edc33cd7c515d88ab31Dianne Hackborn                            AppSecurityPermissions.WHICH_NEW));
14837df032e580ab6bed29eb40b72df1f49cefd2af1Dianne Hackborn                } else {
14937df032e580ab6bed29eb40b72df1f49cefd2af1Dianne Hackborn                    LayoutInflater inflater = (LayoutInflater)getSystemService(
15037df032e580ab6bed29eb40b72df1f49cefd2af1Dianne Hackborn                            Context.LAYOUT_INFLATER_SERVICE);
15137df032e580ab6bed29eb40b72df1f49cefd2af1Dianne Hackborn                    TextView label = (TextView)inflater.inflate(R.layout.label, null);
15237df032e580ab6bed29eb40b72df1f49cefd2af1Dianne Hackborn                    label.setText(R.string.no_new_perms);
1538ec226e8c778a3d1b4268edc33cd7c515d88ab31Dianne Hackborn                    mScrollView.addView(label);
15437df032e580ab6bed29eb40b72df1f49cefd2af1Dianne Hackborn                }
1557b30bc34492a0c53b02cec2fee7d0993da407fc4Alex Klyubin                adapter.addTab(tabHost.newTabSpec(TAB_ID_NEW).setIndicator(
1568ec226e8c778a3d1b4268edc33cd7c515d88ab31Dianne Hackborn                        getText(R.string.newPerms)), mScrollView);
1578ec226e8c778a3d1b4268edc33cd7c515d88ab31Dianne Hackborn            } else  {
1588ec226e8c778a3d1b4268edc33cd7c515d88ab31Dianne Hackborn                findViewById(R.id.tabscontainer).setVisibility(View.GONE);
159860959202df6e79636a68cc94ea94268fcbdc305Dianne Hackborn                findViewById(R.id.divider).setVisibility(View.VISIBLE);
16037df032e580ab6bed29eb40b72df1f49cefd2af1Dianne Hackborn            }
1618ec226e8c778a3d1b4268edc33cd7c515d88ab31Dianne Hackborn            if (NP > 0 || ND > 0) {
16237df032e580ab6bed29eb40b72df1f49cefd2af1Dianne Hackborn                permVisible = true;
1638ec226e8c778a3d1b4268edc33cd7c515d88ab31Dianne Hackborn                LayoutInflater inflater = (LayoutInflater)getSystemService(
1648ec226e8c778a3d1b4268edc33cd7c515d88ab31Dianne Hackborn                        Context.LAYOUT_INFLATER_SERVICE);
1658ec226e8c778a3d1b4268edc33cd7c515d88ab31Dianne Hackborn                View root = inflater.inflate(R.layout.permissions_list, null);
1668ec226e8c778a3d1b4268edc33cd7c515d88ab31Dianne Hackborn                if (mScrollView == null) {
1678ec226e8c778a3d1b4268edc33cd7c515d88ab31Dianne Hackborn                    mScrollView = (CaffeinatedScrollView)root.findViewById(R.id.scrollview);
1688ec226e8c778a3d1b4268edc33cd7c515d88ab31Dianne Hackborn                }
1698ec226e8c778a3d1b4268edc33cd7c515d88ab31Dianne Hackborn                if (NP > 0) {
1708ec226e8c778a3d1b4268edc33cd7c515d88ab31Dianne Hackborn                    ((ViewGroup)root.findViewById(R.id.privacylist)).addView(
1718ec226e8c778a3d1b4268edc33cd7c515d88ab31Dianne Hackborn                            perms.getPermissionsView(AppSecurityPermissions.WHICH_PERSONAL));
1728ec226e8c778a3d1b4268edc33cd7c515d88ab31Dianne Hackborn                } else {
1738ec226e8c778a3d1b4268edc33cd7c515d88ab31Dianne Hackborn                    root.findViewById(R.id.privacylist).setVisibility(View.GONE);
1748ec226e8c778a3d1b4268edc33cd7c515d88ab31Dianne Hackborn                }
1758ec226e8c778a3d1b4268edc33cd7c515d88ab31Dianne Hackborn                if (ND > 0) {
1768ec226e8c778a3d1b4268edc33cd7c515d88ab31Dianne Hackborn                    ((ViewGroup)root.findViewById(R.id.devicelist)).addView(
1778ec226e8c778a3d1b4268edc33cd7c515d88ab31Dianne Hackborn                            perms.getPermissionsView(AppSecurityPermissions.WHICH_DEVICE));
1788ec226e8c778a3d1b4268edc33cd7c515d88ab31Dianne Hackborn                } else {
1798ec226e8c778a3d1b4268edc33cd7c515d88ab31Dianne Hackborn                    root.findViewById(R.id.devicelist).setVisibility(View.GONE);
1808ec226e8c778a3d1b4268edc33cd7c515d88ab31Dianne Hackborn                }
1817b30bc34492a0c53b02cec2fee7d0993da407fc4Alex Klyubin                adapter.addTab(tabHost.newTabSpec(TAB_ID_ALL).setIndicator(
1828ec226e8c778a3d1b4268edc33cd7c515d88ab31Dianne Hackborn                        getText(R.string.allPerms)), root);
183d9b773b7041894e37c1b6f62d6b221dd3c8e4c43Suchi Amalapurapu            }
184fe069ea729efec01a8b6f16f9e76a2db4988404aJacek Surazski        }
1857b30bc34492a0c53b02cec2fee7d0993da407fc4Alex Klyubin        mInstallFlowAnalytics.setPermissionsDisplayed(permVisible);
18637df032e580ab6bed29eb40b72df1f49cefd2af1Dianne Hackborn        if (!permVisible) {
18703347bac6c91b8a8371b05783f6b23ef883b8c9aDianne Hackborn            if (mAppInfo != null) {
18803347bac6c91b8a8371b05783f6b23ef883b8c9aDianne Hackborn                // This is an update to an application, but there are no
18903347bac6c91b8a8371b05783f6b23ef883b8c9aDianne Hackborn                // permissions at all.
19003347bac6c91b8a8371b05783f6b23ef883b8c9aDianne Hackborn                msg = (mAppInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0
19103347bac6c91b8a8371b05783f6b23ef883b8c9aDianne Hackborn                        ? R.string.install_confirm_question_update_system_no_perms
19203347bac6c91b8a8371b05783f6b23ef883b8c9aDianne Hackborn                        : R.string.install_confirm_question_update_no_perms;
19303347bac6c91b8a8371b05783f6b23ef883b8c9aDianne Hackborn            } else {
19403347bac6c91b8a8371b05783f6b23ef883b8c9aDianne Hackborn                // This is a new application with no permissions.
19503347bac6c91b8a8371b05783f6b23ef883b8c9aDianne Hackborn                msg = R.string.install_confirm_question_no_perms;
19637df032e580ab6bed29eb40b72df1f49cefd2af1Dianne Hackborn            }
197860959202df6e79636a68cc94ea94268fcbdc305Dianne Hackborn            tabHost.setVisibility(View.GONE);
1987b30bc34492a0c53b02cec2fee7d0993da407fc4Alex Klyubin            mInstallFlowAnalytics.setAllPermissionsDisplayed(false);
1997b30bc34492a0c53b02cec2fee7d0993da407fc4Alex Klyubin            mInstallFlowAnalytics.setNewPermissionsDisplayed(false);
20003347bac6c91b8a8371b05783f6b23ef883b8c9aDianne Hackborn            findViewById(R.id.filler).setVisibility(View.VISIBLE);
20103347bac6c91b8a8371b05783f6b23ef883b8c9aDianne Hackborn            findViewById(R.id.divider).setVisibility(View.GONE);
20203347bac6c91b8a8371b05783f6b23ef883b8c9aDianne Hackborn            mScrollView = null;
20337df032e580ab6bed29eb40b72df1f49cefd2af1Dianne Hackborn        }
20437df032e580ab6bed29eb40b72df1f49cefd2af1Dianne Hackborn        if (msg != 0) {
20537df032e580ab6bed29eb40b72df1f49cefd2af1Dianne Hackborn            ((TextView)findViewById(R.id.install_confirm_question)).setText(msg);
206d9b773b7041894e37c1b6f62d6b221dd3c8e4c43Suchi Amalapurapu        }
207d9b773b7041894e37c1b6f62d6b221dd3c8e4c43Suchi Amalapurapu        mInstallConfirm.setVisibility(View.VISIBLE);
208d9b773b7041894e37c1b6f62d6b221dd3c8e4c43Suchi Amalapurapu        mOk = (Button)findViewById(R.id.ok_button);
209d9b773b7041894e37c1b6f62d6b221dd3c8e4c43Suchi Amalapurapu        mCancel = (Button)findViewById(R.id.cancel_button);
210d9b773b7041894e37c1b6f62d6b221dd3c8e4c43Suchi Amalapurapu        mOk.setOnClickListener(this);
211d9b773b7041894e37c1b6f62d6b221dd3c8e4c43Suchi Amalapurapu        mCancel.setOnClickListener(this);
2128ec226e8c778a3d1b4268edc33cd7c515d88ab31Dianne Hackborn        if (mScrollView == null) {
2138ec226e8c778a3d1b4268edc33cd7c515d88ab31Dianne Hackborn            // There is nothing to scroll view, so the ok button is immediately
2148ec226e8c778a3d1b4268edc33cd7c515d88ab31Dianne Hackborn            // set to install.
2158ec226e8c778a3d1b4268edc33cd7c515d88ab31Dianne Hackborn            mOk.setText(R.string.install);
2168ec226e8c778a3d1b4268edc33cd7c515d88ab31Dianne Hackborn            mOkCanInstall = true;
2178ec226e8c778a3d1b4268edc33cd7c515d88ab31Dianne Hackborn        } else {
2188ec226e8c778a3d1b4268edc33cd7c515d88ab31Dianne Hackborn            mScrollView.setFullScrollAction(new Runnable() {
2198ec226e8c778a3d1b4268edc33cd7c515d88ab31Dianne Hackborn                @Override
2208ec226e8c778a3d1b4268edc33cd7c515d88ab31Dianne Hackborn                public void run() {
2218ec226e8c778a3d1b4268edc33cd7c515d88ab31Dianne Hackborn                    mOk.setText(R.string.install);
2228ec226e8c778a3d1b4268edc33cd7c515d88ab31Dianne Hackborn                    mOkCanInstall = true;
2238ec226e8c778a3d1b4268edc33cd7c515d88ab31Dianne Hackborn                }
2248ec226e8c778a3d1b4268edc33cd7c515d88ab31Dianne Hackborn            });
2258ec226e8c778a3d1b4268edc33cd7c515d88ab31Dianne Hackborn        }
22691ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project    }
22791ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project
22891ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project    private void showDialogInner(int id) {
22991ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project        // TODO better fix for this? Remove dialog so that it gets created again
23091ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project        removeDialog(id);
23191ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project        showDialog(id);
23291ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project    }
23391ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project
23491ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project    @Override
2359ab50f3655afed4f9266402a03d3235d94220397Suchi Amalapurapu    public Dialog onCreateDialog(int id, Bundle bundle) {
23691ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project        switch (id) {
23791ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project        case DLG_UNKNOWN_APPS:
23891ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project            return new AlertDialog.Builder(this)
23991ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project                    .setTitle(R.string.unknown_apps_dlg_title)
24091ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project                    .setMessage(R.string.unknown_apps_dlg_text)
24191ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project                    .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
24291ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project                        public void onClick(DialogInterface dialog, int which) {
24391ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project                            Log.i(TAG, "Finishing off activity so that user can navigate to settings manually");
24491ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project                            finish();
24591ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project                        }})
24691ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project                    .setPositiveButton(R.string.settings, new DialogInterface.OnClickListener() {
24791ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project                        public void onClick(DialogInterface dialog, int which) {
24891ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project                            Log.i(TAG, "Launching settings");
24991ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project                            launchSettingsAppAndFinish();
25091ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project                        }
25191ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project                    })
25291ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project                    .setOnCancelListener(this)
25391ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project                    .create();
25491ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project        case DLG_PACKAGE_ERROR :
25591ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project            return new AlertDialog.Builder(this)
25691ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project                    .setTitle(R.string.Parse_error_dlg_title)
25791ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project                    .setMessage(R.string.Parse_error_dlg_text)
25891ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project                    .setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
25991ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project                        public void onClick(DialogInterface dialog, int which) {
26091ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project                            finish();
26191ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project                        }
26291ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project                    })
26391ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project                    .setOnCancelListener(this)
26491ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project                    .create();
26591ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project        case DLG_OUT_OF_SPACE:
26691ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project            // Guaranteed not to be null. will default to package name if not set by app
26791ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project            CharSequence appTitle = mPm.getApplicationLabel(mPkgInfo.applicationInfo);
26891ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project            String dlgText = getString(R.string.out_of_space_dlg_text,
26991ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project                    appTitle.toString());
27091ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project            return new AlertDialog.Builder(this)
27191ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project                    .setTitle(R.string.out_of_space_dlg_title)
27291ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project                    .setMessage(dlgText)
27391ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project                    .setPositiveButton(R.string.manage_applications, new DialogInterface.OnClickListener() {
27491ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project                        public void onClick(DialogInterface dialog, int which) {
27591ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project                            //launch manage applications
27691ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project                            Intent intent = new Intent("android.intent.action.MANAGE_PACKAGE_STORAGE");
27738199c5efdb4e650b0ffbe873d8cf27c35f51db6Kenny Root                            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
27891ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project                            startActivity(intent);
27991ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project                            finish();
28091ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project                        }
28191ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project                    })
28291ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project                    .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
28391ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project                        public void onClick(DialogInterface dialog, int which) {
28491ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project                            Log.i(TAG, "Canceling installation");
28591ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project                            finish();
28691ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project                        }
28791ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project                  })
28891ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project                  .setOnCancelListener(this)
28991ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project                  .create();
29091ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project        case DLG_INSTALL_ERROR :
29191ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project            // Guaranteed not to be null. will default to package name if not set by app
29291ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project            CharSequence appTitle1 = mPm.getApplicationLabel(mPkgInfo.applicationInfo);
29391ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project            String dlgText1 = getString(R.string.install_failed_msg,
29491ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project                    appTitle1.toString());
29591ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project            return new AlertDialog.Builder(this)
29691ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project                    .setTitle(R.string.install_failed)
29791ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project                    .setNeutralButton(R.string.ok, new DialogInterface.OnClickListener() {
29891ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project                        public void onClick(DialogInterface dialog, int which) {
29991ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project                            finish();
30091ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project                        }
30191ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project                    })
30291ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project                    .setMessage(dlgText1)
30391ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project                    .setOnCancelListener(this)
30491ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project                    .create();
3059e9721266feafdf16786b94f6fac4c06220cd422Dianne Hackborn        case DLG_ALLOW_SOURCE:
3069e9721266feafdf16786b94f6fac4c06220cd422Dianne Hackborn            CharSequence appTitle2 = mPm.getApplicationLabel(mSourceInfo);
3079e9721266feafdf16786b94f6fac4c06220cd422Dianne Hackborn            String dlgText2 = getString(R.string.allow_source_dlg_text,
3089e9721266feafdf16786b94f6fac4c06220cd422Dianne Hackborn                    appTitle2.toString());
3099e9721266feafdf16786b94f6fac4c06220cd422Dianne Hackborn            return new AlertDialog.Builder(this)
3109e9721266feafdf16786b94f6fac4c06220cd422Dianne Hackborn                    .setTitle(R.string.allow_source_dlg_title)
3119e9721266feafdf16786b94f6fac4c06220cd422Dianne Hackborn                    .setMessage(dlgText2)
3129e9721266feafdf16786b94f6fac4c06220cd422Dianne Hackborn                    .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
3139e9721266feafdf16786b94f6fac4c06220cd422Dianne Hackborn                        public void onClick(DialogInterface dialog, int which) {
3149e9721266feafdf16786b94f6fac4c06220cd422Dianne Hackborn                            setResult(RESULT_CANCELED);
3159e9721266feafdf16786b94f6fac4c06220cd422Dianne Hackborn                            finish();
3169e9721266feafdf16786b94f6fac4c06220cd422Dianne Hackborn                        }})
3179e9721266feafdf16786b94f6fac4c06220cd422Dianne Hackborn                    .setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
3189e9721266feafdf16786b94f6fac4c06220cd422Dianne Hackborn                        public void onClick(DialogInterface dialog, int which) {
3199e9721266feafdf16786b94f6fac4c06220cd422Dianne Hackborn                            SharedPreferences prefs = getSharedPreferences(PREFS_ALLOWED_SOURCES,
3209e9721266feafdf16786b94f6fac4c06220cd422Dianne Hackborn                                    Context.MODE_PRIVATE);
3219e9721266feafdf16786b94f6fac4c06220cd422Dianne Hackborn                            prefs.edit().putBoolean(mSourceInfo.packageName, true).apply();
3229e9721266feafdf16786b94f6fac4c06220cd422Dianne Hackborn                            startInstallConfirm();
3239e9721266feafdf16786b94f6fac4c06220cd422Dianne Hackborn                        }
3249e9721266feafdf16786b94f6fac4c06220cd422Dianne Hackborn                    })
3259e9721266feafdf16786b94f6fac4c06220cd422Dianne Hackborn                    .setOnCancelListener(this)
3269e9721266feafdf16786b94f6fac4c06220cd422Dianne Hackborn                    .create();
32791ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project       }
32891ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project       return null;
32991ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project   }
33091ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project
33191ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project    private void launchSettingsAppAndFinish() {
3321f45fa5f219a6577265c480a81af77450985d532Gilles Debunne        // Create an intent to launch SettingsTwo activity
3331f45fa5f219a6577265c480a81af77450985d532Gilles Debunne        Intent launchSettingsIntent = new Intent(Settings.ACTION_SECURITY_SETTINGS);
33438199c5efdb4e650b0ffbe873d8cf27c35f51db6Kenny Root        launchSettingsIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
33591ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project        startActivity(launchSettingsIntent);
33691ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project        finish();
33791ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project    }
33895fb7ee253cdb00a2d9ccf6955afc63e6b399ffaSander Alewijnse
33991ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project    private boolean isInstallingUnknownAppsAllowed() {
34095fb7ee253cdb00a2d9ccf6955afc63e6b399ffaSander Alewijnse        UserManager um = (UserManager) getSystemService(USER_SERVICE);
34195fb7ee253cdb00a2d9ccf6955afc63e6b399ffaSander Alewijnse
34295fb7ee253cdb00a2d9ccf6955afc63e6b399ffaSander Alewijnse        boolean disallowedByUserManager = um.getUserRestrictions()
34395fb7ee253cdb00a2d9ccf6955afc63e6b399ffaSander Alewijnse                .getBoolean(UserManager.DISALLOW_INSTALL_UNKNOWN_SOURCES, false);
34495fb7ee253cdb00a2d9ccf6955afc63e6b399ffaSander Alewijnse        boolean allowedBySecureSettings = Settings.Secure.getInt(getContentResolver(),
34595fb7ee253cdb00a2d9ccf6955afc63e6b399ffaSander Alewijnse            Settings.Secure.INSTALL_NON_MARKET_APPS, 0) > 0;
34695fb7ee253cdb00a2d9ccf6955afc63e6b399ffaSander Alewijnse
34795fb7ee253cdb00a2d9ccf6955afc63e6b399ffaSander Alewijnse        return (allowedBySecureSettings && (!disallowedByUserManager));
34891ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project    }
34995fb7ee253cdb00a2d9ccf6955afc63e6b399ffaSander Alewijnse
3507b30bc34492a0c53b02cec2fee7d0993da407fc4Alex Klyubin    private boolean isInstallRequestFromUnknownSource(Intent intent) {
3517b30bc34492a0c53b02cec2fee7d0993da407fc4Alex Klyubin        String callerPackage = getCallingPackage();
3527b30bc34492a0c53b02cec2fee7d0993da407fc4Alex Klyubin        if (callerPackage != null && intent.getBooleanExtra(
3537b30bc34492a0c53b02cec2fee7d0993da407fc4Alex Klyubin                Intent.EXTRA_NOT_UNKNOWN_SOURCE, false)) {
3547b30bc34492a0c53b02cec2fee7d0993da407fc4Alex Klyubin            try {
3557b30bc34492a0c53b02cec2fee7d0993da407fc4Alex Klyubin                mSourceInfo = mPm.getApplicationInfo(callerPackage, 0);
3567b30bc34492a0c53b02cec2fee7d0993da407fc4Alex Klyubin                if (mSourceInfo != null) {
3577b30bc34492a0c53b02cec2fee7d0993da407fc4Alex Klyubin                    if ((mSourceInfo.flags & ApplicationInfo.FLAG_PRIVILEGED) != 0) {
3587b30bc34492a0c53b02cec2fee7d0993da407fc4Alex Klyubin                        // Privileged apps are not considered an unknown source.
3597b30bc34492a0c53b02cec2fee7d0993da407fc4Alex Klyubin                        return false;
3607b30bc34492a0c53b02cec2fee7d0993da407fc4Alex Klyubin                    }
3617b30bc34492a0c53b02cec2fee7d0993da407fc4Alex Klyubin                }
3627b30bc34492a0c53b02cec2fee7d0993da407fc4Alex Klyubin            } catch (NameNotFoundException e) {
3637b30bc34492a0c53b02cec2fee7d0993da407fc4Alex Klyubin            }
3647b30bc34492a0c53b02cec2fee7d0993da407fc4Alex Klyubin        }
3657b30bc34492a0c53b02cec2fee7d0993da407fc4Alex Klyubin
3667b30bc34492a0c53b02cec2fee7d0993da407fc4Alex Klyubin        return true;
3677b30bc34492a0c53b02cec2fee7d0993da407fc4Alex Klyubin    }
3687b30bc34492a0c53b02cec2fee7d0993da407fc4Alex Klyubin
3697b30bc34492a0c53b02cec2fee7d0993da407fc4Alex Klyubin    private boolean isVerifyAppsEnabled() {
37090baa2562e62c3d726427767ac3535081d5f5218Julia Reynolds        UserManager um = (UserManager) getSystemService(USER_SERVICE);
37190baa2562e62c3d726427767ac3535081d5f5218Julia Reynolds        if (um.hasUserRestriction(UserManager.ENSURE_VERIFY_APPS)) {
37290baa2562e62c3d726427767ac3535081d5f5218Julia Reynolds            return true;
37390baa2562e62c3d726427767ac3535081d5f5218Julia Reynolds        }
3747b30bc34492a0c53b02cec2fee7d0993da407fc4Alex Klyubin        return Settings.Global.getInt(getContentResolver(),
3757b30bc34492a0c53b02cec2fee7d0993da407fc4Alex Klyubin                Settings.Global.PACKAGE_VERIFIER_ENABLE, 1) > 0;
3767b30bc34492a0c53b02cec2fee7d0993da407fc4Alex Klyubin    }
3777b30bc34492a0c53b02cec2fee7d0993da407fc4Alex Klyubin
3787b30bc34492a0c53b02cec2fee7d0993da407fc4Alex Klyubin    private boolean isAppVerifierInstalled() {
3797b30bc34492a0c53b02cec2fee7d0993da407fc4Alex Klyubin        final PackageManager pm = getPackageManager();
3807b30bc34492a0c53b02cec2fee7d0993da407fc4Alex Klyubin        final Intent verification = new Intent(Intent.ACTION_PACKAGE_NEEDS_VERIFICATION);
3817b30bc34492a0c53b02cec2fee7d0993da407fc4Alex Klyubin        verification.setType(PACKAGE_MIME_TYPE);
3827b30bc34492a0c53b02cec2fee7d0993da407fc4Alex Klyubin        verification.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
3837b30bc34492a0c53b02cec2fee7d0993da407fc4Alex Klyubin        final List<ResolveInfo> receivers = pm.queryBroadcastReceivers(verification, 0);
3847b30bc34492a0c53b02cec2fee7d0993da407fc4Alex Klyubin        return (receivers.size() > 0) ? true : false;
3857b30bc34492a0c53b02cec2fee7d0993da407fc4Alex Klyubin    }
3867b30bc34492a0c53b02cec2fee7d0993da407fc4Alex Klyubin
3873d07f28761d467664ea97a7be7cbedf92762f14cSuchi Amalapurapu    private void initiateInstall() {
3880d4ff37341fc970195d9a737a8ab166c550aa2b3Dianne Hackborn        String pkgName = mPkgInfo.packageName;
3890d4ff37341fc970195d9a737a8ab166c550aa2b3Dianne Hackborn        // Check if there is already a package on the device with this name
3900d4ff37341fc970195d9a737a8ab166c550aa2b3Dianne Hackborn        // but it has been renamed to something else.
3910d4ff37341fc970195d9a737a8ab166c550aa2b3Dianne Hackborn        String[] oldName = mPm.canonicalToCurrentPackageNames(new String[] { pkgName });
3920d4ff37341fc970195d9a737a8ab166c550aa2b3Dianne Hackborn        if (oldName != null && oldName.length > 0 && oldName[0] != null) {
3930d4ff37341fc970195d9a737a8ab166c550aa2b3Dianne Hackborn            pkgName = oldName[0];
394aba0bed7a4f6301c6e3067fc799d8ef47aaca0b2Dianne Hackborn            mPkgInfo.packageName = pkgName;
395aba0bed7a4f6301c6e3067fc799d8ef47aaca0b2Dianne Hackborn            mPkgInfo.applicationInfo.packageName = pkgName;
3960d4ff37341fc970195d9a737a8ab166c550aa2b3Dianne Hackborn        }
39791ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project        // Check if package is already installed. display confirmation dialog if replacing pkg
39891ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project        try {
399aba0bed7a4f6301c6e3067fc799d8ef47aaca0b2Dianne Hackborn            // This is a little convoluted because we want to get all uninstalled
400aba0bed7a4f6301c6e3067fc799d8ef47aaca0b2Dianne Hackborn            // apps, but this may include apps with just data, and if it is just
401aba0bed7a4f6301c6e3067fc799d8ef47aaca0b2Dianne Hackborn            // data we still want to count it as "installed".
4020d4ff37341fc970195d9a737a8ab166c550aa2b3Dianne Hackborn            mAppInfo = mPm.getApplicationInfo(pkgName,
40391ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project                    PackageManager.GET_UNINSTALLED_PACKAGES);
404aba0bed7a4f6301c6e3067fc799d8ef47aaca0b2Dianne Hackborn            if ((mAppInfo.flags&ApplicationInfo.FLAG_INSTALLED) == 0) {
405aba0bed7a4f6301c6e3067fc799d8ef47aaca0b2Dianne Hackborn                mAppInfo = null;
406aba0bed7a4f6301c6e3067fc799d8ef47aaca0b2Dianne Hackborn            }
40791ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project        } catch (NameNotFoundException e) {
40891ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project            mAppInfo = null;
40991ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project        }
4107b30bc34492a0c53b02cec2fee7d0993da407fc4Alex Klyubin
4117b30bc34492a0c53b02cec2fee7d0993da407fc4Alex Klyubin        mInstallFlowAnalytics.setReplace(mAppInfo != null);
4127b30bc34492a0c53b02cec2fee7d0993da407fc4Alex Klyubin        mInstallFlowAnalytics.setSystemApp(
4137b30bc34492a0c53b02cec2fee7d0993da407fc4Alex Klyubin                (mAppInfo != null) && ((mAppInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0));
4147b30bc34492a0c53b02cec2fee7d0993da407fc4Alex Klyubin
41537df032e580ab6bed29eb40b72df1f49cefd2af1Dianne Hackborn        startInstallConfirm();
41691ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project    }
4179e9721266feafdf16786b94f6fac4c06220cd422Dianne Hackborn
4189e9721266feafdf16786b94f6fac4c06220cd422Dianne Hackborn    void setPmResult(int pmResult) {
4199e9721266feafdf16786b94f6fac4c06220cd422Dianne Hackborn        Intent result = new Intent();
4209e9721266feafdf16786b94f6fac4c06220cd422Dianne Hackborn        result.putExtra(Intent.EXTRA_INSTALL_RESULT, pmResult);
4219e9721266feafdf16786b94f6fac4c06220cd422Dianne Hackborn        setResult(pmResult == PackageManager.INSTALL_SUCCEEDED
4229e9721266feafdf16786b94f6fac4c06220cd422Dianne Hackborn                ? RESULT_OK : RESULT_FIRST_USER, result);
4239e9721266feafdf16786b94f6fac4c06220cd422Dianne Hackborn    }
4249e9721266feafdf16786b94f6fac4c06220cd422Dianne Hackborn
42591ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project    @Override
426d9b773b7041894e37c1b6f62d6b221dd3c8e4c43Suchi Amalapurapu    protected void onCreate(Bundle icicle) {
42791ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project        super.onCreate(icicle);
42879da2eaa800f889be5e5f5bd91121c2ecb55ce14Jeff Sharkey
42991ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project        mPm = getPackageManager();
4308538fde237709464ec899a402fee29c0169f6bfaJeff Sharkey        mInstaller = mPm.getPackageInstaller();
4318538fde237709464ec899a402fee29c0169f6bfaJeff Sharkey
4328538fde237709464ec899a402fee29c0169f6bfaJeff Sharkey        final Intent intent = getIntent();
4338538fde237709464ec899a402fee29c0169f6bfaJeff Sharkey        if (PackageInstaller.ACTION_CONFIRM_PERMISSIONS.equals(intent.getAction())) {
4348538fde237709464ec899a402fee29c0169f6bfaJeff Sharkey            final int sessionId = intent.getIntExtra(PackageInstaller.EXTRA_SESSION_ID, -1);
4350156e7b2e28048ad0914b7c4b3896d749d5a75f3Jeff Sharkey            final PackageInstaller.SessionInfo info = mInstaller.getSessionInfo(sessionId);
4368538fde237709464ec899a402fee29c0169f6bfaJeff Sharkey            if (info == null || !info.sealed || info.resolvedBaseCodePath == null) {
4378538fde237709464ec899a402fee29c0169f6bfaJeff Sharkey                Log.w(TAG, "Session " + mSessionId + " in funky state; ignoring");
4388538fde237709464ec899a402fee29c0169f6bfaJeff Sharkey                finish();
4398538fde237709464ec899a402fee29c0169f6bfaJeff Sharkey                return;
4408538fde237709464ec899a402fee29c0169f6bfaJeff Sharkey            }
4418538fde237709464ec899a402fee29c0169f6bfaJeff Sharkey
4428538fde237709464ec899a402fee29c0169f6bfaJeff Sharkey            mSessionId = sessionId;
4438538fde237709464ec899a402fee29c0169f6bfaJeff Sharkey            mPackageURI = Uri.fromFile(new File(info.resolvedBaseCodePath));
4448538fde237709464ec899a402fee29c0169f6bfaJeff Sharkey            mOriginatingURI = null;
4458538fde237709464ec899a402fee29c0169f6bfaJeff Sharkey            mReferrerURI = null;
4468538fde237709464ec899a402fee29c0169f6bfaJeff Sharkey        } else {
4478538fde237709464ec899a402fee29c0169f6bfaJeff Sharkey            mSessionId = -1;
4488538fde237709464ec899a402fee29c0169f6bfaJeff Sharkey            mPackageURI = intent.getData();
4498538fde237709464ec899a402fee29c0169f6bfaJeff Sharkey            mOriginatingURI = intent.getParcelableExtra(Intent.EXTRA_ORIGINATING_URI);
4508538fde237709464ec899a402fee29c0169f6bfaJeff Sharkey            mReferrerURI = intent.getParcelableExtra(Intent.EXTRA_REFERRER);
4518538fde237709464ec899a402fee29c0169f6bfaJeff Sharkey        }
45279da2eaa800f889be5e5f5bd91121c2ecb55ce14Jeff Sharkey
4537b30bc34492a0c53b02cec2fee7d0993da407fc4Alex Klyubin        boolean requestFromUnknownSource = isInstallRequestFromUnknownSource(intent);
4547b30bc34492a0c53b02cec2fee7d0993da407fc4Alex Klyubin        mInstallFlowAnalytics = new InstallFlowAnalytics();
4558fca480bee00578c1529b1f32ab30af096db82ddAlex Klyubin        mInstallFlowAnalytics.setContext(this);
4567b30bc34492a0c53b02cec2fee7d0993da407fc4Alex Klyubin        mInstallFlowAnalytics.setStartTimestampMillis(SystemClock.elapsedRealtime());
4577b30bc34492a0c53b02cec2fee7d0993da407fc4Alex Klyubin        mInstallFlowAnalytics.setInstallsFromUnknownSourcesPermitted(
4587b30bc34492a0c53b02cec2fee7d0993da407fc4Alex Klyubin                isInstallingUnknownAppsAllowed());
4597b30bc34492a0c53b02cec2fee7d0993da407fc4Alex Klyubin        mInstallFlowAnalytics.setInstallRequestFromUnknownSource(requestFromUnknownSource);
4607b30bc34492a0c53b02cec2fee7d0993da407fc4Alex Klyubin        mInstallFlowAnalytics.setVerifyAppsEnabled(isVerifyAppsEnabled());
4617b30bc34492a0c53b02cec2fee7d0993da407fc4Alex Klyubin        mInstallFlowAnalytics.setAppVerifierInstalled(isAppVerifierInstalled());
4628fca480bee00578c1529b1f32ab30af096db82ddAlex Klyubin        mInstallFlowAnalytics.setPackageUri(mPackageURI.toString());
4637b30bc34492a0c53b02cec2fee7d0993da407fc4Alex Klyubin
46479da2eaa800f889be5e5f5bd91121c2ecb55ce14Jeff Sharkey        final String scheme = mPackageURI.getScheme();
465aba0bed7a4f6301c6e3067fc799d8ef47aaca0b2Dianne Hackborn        if (scheme != null && !"file".equals(scheme) && !"package".equals(scheme)) {
466aba0bed7a4f6301c6e3067fc799d8ef47aaca0b2Dianne Hackborn            Log.w(TAG, "Unsupported scheme " + scheme);
467aba0bed7a4f6301c6e3067fc799d8ef47aaca0b2Dianne Hackborn            setPmResult(PackageManager.INSTALL_FAILED_INVALID_URI);
4687b30bc34492a0c53b02cec2fee7d0993da407fc4Alex Klyubin            mInstallFlowAnalytics.setFlowFinished(
4697b30bc34492a0c53b02cec2fee7d0993da407fc4Alex Klyubin                    InstallFlowAnalytics.RESULT_FAILED_UNSUPPORTED_SCHEME);
4707b30bc34492a0c53b02cec2fee7d0993da407fc4Alex Klyubin            finish();
471aba0bed7a4f6301c6e3067fc799d8ef47aaca0b2Dianne Hackborn            return;
47279da2eaa800f889be5e5f5bd91121c2ecb55ce14Jeff Sharkey        }
47379da2eaa800f889be5e5f5bd91121c2ecb55ce14Jeff Sharkey
474aba0bed7a4f6301c6e3067fc799d8ef47aaca0b2Dianne Hackborn        final PackageUtil.AppSnippet as;
475aba0bed7a4f6301c6e3067fc799d8ef47aaca0b2Dianne Hackborn        if ("package".equals(mPackageURI.getScheme())) {
4767b30bc34492a0c53b02cec2fee7d0993da407fc4Alex Klyubin            mInstallFlowAnalytics.setFileUri(false);
477aba0bed7a4f6301c6e3067fc799d8ef47aaca0b2Dianne Hackborn            try {
478aba0bed7a4f6301c6e3067fc799d8ef47aaca0b2Dianne Hackborn                mPkgInfo = mPm.getPackageInfo(mPackageURI.getSchemeSpecificPart(),
479aba0bed7a4f6301c6e3067fc799d8ef47aaca0b2Dianne Hackborn                        PackageManager.GET_PERMISSIONS | PackageManager.GET_UNINSTALLED_PACKAGES);
480aba0bed7a4f6301c6e3067fc799d8ef47aaca0b2Dianne Hackborn            } catch (NameNotFoundException e) {
481aba0bed7a4f6301c6e3067fc799d8ef47aaca0b2Dianne Hackborn            }
482aba0bed7a4f6301c6e3067fc799d8ef47aaca0b2Dianne Hackborn            if (mPkgInfo == null) {
483aba0bed7a4f6301c6e3067fc799d8ef47aaca0b2Dianne Hackborn                Log.w(TAG, "Requested package " + mPackageURI.getScheme()
484aba0bed7a4f6301c6e3067fc799d8ef47aaca0b2Dianne Hackborn                        + " not available. Discontinuing installation");
485aba0bed7a4f6301c6e3067fc799d8ef47aaca0b2Dianne Hackborn                showDialogInner(DLG_PACKAGE_ERROR);
486aba0bed7a4f6301c6e3067fc799d8ef47aaca0b2Dianne Hackborn                setPmResult(PackageManager.INSTALL_FAILED_INVALID_APK);
4877b30bc34492a0c53b02cec2fee7d0993da407fc4Alex Klyubin                mInstallFlowAnalytics.setPackageInfoObtained();
4887b30bc34492a0c53b02cec2fee7d0993da407fc4Alex Klyubin                mInstallFlowAnalytics.setFlowFinished(
4897b30bc34492a0c53b02cec2fee7d0993da407fc4Alex Klyubin                        InstallFlowAnalytics.RESULT_FAILED_PACKAGE_MISSING);
490aba0bed7a4f6301c6e3067fc799d8ef47aaca0b2Dianne Hackborn                return;
491aba0bed7a4f6301c6e3067fc799d8ef47aaca0b2Dianne Hackborn            }
492aba0bed7a4f6301c6e3067fc799d8ef47aaca0b2Dianne Hackborn            as = new PackageUtil.AppSnippet(mPm.getApplicationLabel(mPkgInfo.applicationInfo),
493aba0bed7a4f6301c6e3067fc799d8ef47aaca0b2Dianne Hackborn                    mPm.getApplicationIcon(mPkgInfo.applicationInfo));
494aba0bed7a4f6301c6e3067fc799d8ef47aaca0b2Dianne Hackborn        } else {
4957b30bc34492a0c53b02cec2fee7d0993da407fc4Alex Klyubin            mInstallFlowAnalytics.setFileUri(true);
496aba0bed7a4f6301c6e3067fc799d8ef47aaca0b2Dianne Hackborn            final File sourceFile = new File(mPackageURI.getPath());
497aba0bed7a4f6301c6e3067fc799d8ef47aaca0b2Dianne Hackborn            PackageParser.Package parsed = PackageUtil.getPackageInfo(sourceFile);
498aba0bed7a4f6301c6e3067fc799d8ef47aaca0b2Dianne Hackborn
499aba0bed7a4f6301c6e3067fc799d8ef47aaca0b2Dianne Hackborn            // Check for parse errors
500aba0bed7a4f6301c6e3067fc799d8ef47aaca0b2Dianne Hackborn            if (parsed == null) {
501aba0bed7a4f6301c6e3067fc799d8ef47aaca0b2Dianne Hackborn                Log.w(TAG, "Parse error when parsing manifest. Discontinuing installation");
502aba0bed7a4f6301c6e3067fc799d8ef47aaca0b2Dianne Hackborn                showDialogInner(DLG_PACKAGE_ERROR);
503aba0bed7a4f6301c6e3067fc799d8ef47aaca0b2Dianne Hackborn                setPmResult(PackageManager.INSTALL_FAILED_INVALID_APK);
5047b30bc34492a0c53b02cec2fee7d0993da407fc4Alex Klyubin                mInstallFlowAnalytics.setPackageInfoObtained();
5057b30bc34492a0c53b02cec2fee7d0993da407fc4Alex Klyubin                mInstallFlowAnalytics.setFlowFinished(
5067b30bc34492a0c53b02cec2fee7d0993da407fc4Alex Klyubin                        InstallFlowAnalytics.RESULT_FAILED_TO_GET_PACKAGE_INFO);
507aba0bed7a4f6301c6e3067fc799d8ef47aaca0b2Dianne Hackborn                return;
508aba0bed7a4f6301c6e3067fc799d8ef47aaca0b2Dianne Hackborn            }
509aba0bed7a4f6301c6e3067fc799d8ef47aaca0b2Dianne Hackborn            mPkgInfo = PackageParser.generatePackageInfo(parsed, null,
510aba0bed7a4f6301c6e3067fc799d8ef47aaca0b2Dianne Hackborn                    PackageManager.GET_PERMISSIONS, 0, 0, null,
511aba0bed7a4f6301c6e3067fc799d8ef47aaca0b2Dianne Hackborn                    new PackageUserState());
5122b3202c3ff18469b294629bf1416118f12492173Kenny Root            mPkgDigest = parsed.manifestDigest;
513aba0bed7a4f6301c6e3067fc799d8ef47aaca0b2Dianne Hackborn            as = PackageUtil.getAppSnippet(this, mPkgInfo.applicationInfo, sourceFile);
51491ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project        }
5157b30bc34492a0c53b02cec2fee7d0993da407fc4Alex Klyubin        mInstallFlowAnalytics.setPackageInfoObtained();
51691ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project
51791ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project        //set view
51891ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project        setContentView(R.layout.install_start);
519d9b773b7041894e37c1b6f62d6b221dd3c8e4c43Suchi Amalapurapu        mInstallConfirm = findViewById(R.id.install_confirm_panel);
520d9b773b7041894e37c1b6f62d6b221dd3c8e4c43Suchi Amalapurapu        mInstallConfirm.setVisibility(View.INVISIBLE);
5219ab50f3655afed4f9266402a03d3235d94220397Suchi Amalapurapu        PackageUtil.initSnippetForNewApp(this, as, R.id.app_snippet);
5229e9721266feafdf16786b94f6fac4c06220cd422Dianne Hackborn
523d58f150060e9300038ff86eeeffc86c2440303c8Ben Gruver        mOriginatingUid = getOriginatingUid(intent);
524d58f150060e9300038ff86eeeffc86c2440303c8Ben Gruver
5257b30bc34492a0c53b02cec2fee7d0993da407fc4Alex Klyubin        // Block the install attempt on the Unknown Sources setting if necessary.
5267b30bc34492a0c53b02cec2fee7d0993da407fc4Alex Klyubin        if ((requestFromUnknownSource) && (!isInstallingUnknownAppsAllowed())) {
52791ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project            //ask user to enable setting first
52891ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project            showDialogInner(DLG_UNKNOWN_APPS);
5297b30bc34492a0c53b02cec2fee7d0993da407fc4Alex Klyubin            mInstallFlowAnalytics.setFlowFinished(
5307b30bc34492a0c53b02cec2fee7d0993da407fc4Alex Klyubin                    InstallFlowAnalytics.RESULT_BLOCKED_BY_UNKNOWN_SOURCES_SETTING);
53191ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project            return;
53291ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project        }
5339ab50f3655afed4f9266402a03d3235d94220397Suchi Amalapurapu        initiateInstall();
53491ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project    }
535d58f150060e9300038ff86eeeffc86c2440303c8Ben Gruver
536d58f150060e9300038ff86eeeffc86c2440303c8Ben Gruver    /** Get the ApplicationInfo for the calling package, if available */
537d58f150060e9300038ff86eeeffc86c2440303c8Ben Gruver    private ApplicationInfo getSourceInfo() {
538d58f150060e9300038ff86eeeffc86c2440303c8Ben Gruver        String callingPackage = getCallingPackage();
539d58f150060e9300038ff86eeeffc86c2440303c8Ben Gruver        if (callingPackage != null) {
540d58f150060e9300038ff86eeeffc86c2440303c8Ben Gruver            try {
541d58f150060e9300038ff86eeeffc86c2440303c8Ben Gruver                return mPm.getApplicationInfo(callingPackage, 0);
542d58f150060e9300038ff86eeeffc86c2440303c8Ben Gruver            } catch (NameNotFoundException ex) {
543d58f150060e9300038ff86eeeffc86c2440303c8Ben Gruver                // ignore
544d58f150060e9300038ff86eeeffc86c2440303c8Ben Gruver            }
545d58f150060e9300038ff86eeeffc86c2440303c8Ben Gruver        }
546d58f150060e9300038ff86eeeffc86c2440303c8Ben Gruver        return null;
547d58f150060e9300038ff86eeeffc86c2440303c8Ben Gruver    }
548d58f150060e9300038ff86eeeffc86c2440303c8Ben Gruver
549d58f150060e9300038ff86eeeffc86c2440303c8Ben Gruver
550d58f150060e9300038ff86eeeffc86c2440303c8Ben Gruver    /** Get the originating uid if possible, or VerificationParams.NO_UID if not available */
551d58f150060e9300038ff86eeeffc86c2440303c8Ben Gruver    private int getOriginatingUid(Intent intent) {
552d58f150060e9300038ff86eeeffc86c2440303c8Ben Gruver        // The originating uid from the intent. We only trust/use this if it comes from a
553d58f150060e9300038ff86eeeffc86c2440303c8Ben Gruver        // system application
554d58f150060e9300038ff86eeeffc86c2440303c8Ben Gruver        int uidFromIntent = intent.getIntExtra(Intent.EXTRA_ORIGINATING_UID,
555d58f150060e9300038ff86eeeffc86c2440303c8Ben Gruver                VerificationParams.NO_UID);
556d58f150060e9300038ff86eeeffc86c2440303c8Ben Gruver
557d58f150060e9300038ff86eeeffc86c2440303c8Ben Gruver        // Get the source info from the calling package, if available. This will be the
558d58f150060e9300038ff86eeeffc86c2440303c8Ben Gruver        // definitive calling package, but it only works if the intent was started using
559d58f150060e9300038ff86eeeffc86c2440303c8Ben Gruver        // startActivityForResult,
560d58f150060e9300038ff86eeeffc86c2440303c8Ben Gruver        ApplicationInfo sourceInfo = getSourceInfo();
561d58f150060e9300038ff86eeeffc86c2440303c8Ben Gruver        if (sourceInfo != null) {
562d58f150060e9300038ff86eeeffc86c2440303c8Ben Gruver            if (uidFromIntent != VerificationParams.NO_UID &&
563320bbe71d34e40f89862b41c53a8a393834f5de7Christopher Tate                    (mSourceInfo.flags & ApplicationInfo.FLAG_PRIVILEGED) != 0) {
564d58f150060e9300038ff86eeeffc86c2440303c8Ben Gruver                return uidFromIntent;
565d58f150060e9300038ff86eeeffc86c2440303c8Ben Gruver
566d58f150060e9300038ff86eeeffc86c2440303c8Ben Gruver            }
567d58f150060e9300038ff86eeeffc86c2440303c8Ben Gruver            // We either didn't get a uid in the intent, or we don't trust it. Use the
568d58f150060e9300038ff86eeeffc86c2440303c8Ben Gruver            // uid of the calling package instead.
569d58f150060e9300038ff86eeeffc86c2440303c8Ben Gruver            return sourceInfo.uid;
570d58f150060e9300038ff86eeeffc86c2440303c8Ben Gruver        }
571d58f150060e9300038ff86eeeffc86c2440303c8Ben Gruver
572d58f150060e9300038ff86eeeffc86c2440303c8Ben Gruver        // We couldn't get the specific calling package. Let's get the uid instead
573d58f150060e9300038ff86eeeffc86c2440303c8Ben Gruver        int callingUid;
574d58f150060e9300038ff86eeeffc86c2440303c8Ben Gruver        try {
575d58f150060e9300038ff86eeeffc86c2440303c8Ben Gruver            callingUid = ActivityManagerNative.getDefault()
576d58f150060e9300038ff86eeeffc86c2440303c8Ben Gruver                    .getLaunchedFromUid(getActivityToken());
577d58f150060e9300038ff86eeeffc86c2440303c8Ben Gruver        } catch (android.os.RemoteException ex) {
578d58f150060e9300038ff86eeeffc86c2440303c8Ben Gruver            Log.w(TAG, "Could not determine the launching uid.");
579d58f150060e9300038ff86eeeffc86c2440303c8Ben Gruver            // nothing else we can do
580d58f150060e9300038ff86eeeffc86c2440303c8Ben Gruver            return VerificationParams.NO_UID;
581d58f150060e9300038ff86eeeffc86c2440303c8Ben Gruver        }
582d58f150060e9300038ff86eeeffc86c2440303c8Ben Gruver
583d58f150060e9300038ff86eeeffc86c2440303c8Ben Gruver        // If we got a uid from the intent, we need to verify that the caller is a
584320bbe71d34e40f89862b41c53a8a393834f5de7Christopher Tate        // privileged system package before we use it
585d58f150060e9300038ff86eeeffc86c2440303c8Ben Gruver        if (uidFromIntent != VerificationParams.NO_UID) {
586d58f150060e9300038ff86eeeffc86c2440303c8Ben Gruver            String[] callingPackages = mPm.getPackagesForUid(callingUid);
587d58f150060e9300038ff86eeeffc86c2440303c8Ben Gruver            if (callingPackages != null) {
588d58f150060e9300038ff86eeeffc86c2440303c8Ben Gruver                for (String packageName: callingPackages) {
589d58f150060e9300038ff86eeeffc86c2440303c8Ben Gruver                    try {
590d58f150060e9300038ff86eeeffc86c2440303c8Ben Gruver                        ApplicationInfo applicationInfo =
591d58f150060e9300038ff86eeeffc86c2440303c8Ben Gruver                                mPm.getApplicationInfo(packageName, 0);
592d58f150060e9300038ff86eeeffc86c2440303c8Ben Gruver
593320bbe71d34e40f89862b41c53a8a393834f5de7Christopher Tate                        if ((applicationInfo.flags & ApplicationInfo.FLAG_PRIVILEGED) != 0) {
594d58f150060e9300038ff86eeeffc86c2440303c8Ben Gruver                            return uidFromIntent;
595d58f150060e9300038ff86eeeffc86c2440303c8Ben Gruver                        }
596d58f150060e9300038ff86eeeffc86c2440303c8Ben Gruver                    } catch (NameNotFoundException ex) {
597d58f150060e9300038ff86eeeffc86c2440303c8Ben Gruver                        // ignore it, and try the next package
598d58f150060e9300038ff86eeeffc86c2440303c8Ben Gruver                    }
599d58f150060e9300038ff86eeeffc86c2440303c8Ben Gruver                }
600d58f150060e9300038ff86eeeffc86c2440303c8Ben Gruver            }
601d58f150060e9300038ff86eeeffc86c2440303c8Ben Gruver        }
602d58f150060e9300038ff86eeeffc86c2440303c8Ben Gruver        // We either didn't get a uid from the intent, or we don't trust it. Use the
603d58f150060e9300038ff86eeeffc86c2440303c8Ben Gruver        // calling uid instead.
604d58f150060e9300038ff86eeeffc86c2440303c8Ben Gruver        return callingUid;
605d58f150060e9300038ff86eeeffc86c2440303c8Ben Gruver    }
606d58f150060e9300038ff86eeeffc86c2440303c8Ben Gruver
6077b30bc34492a0c53b02cec2fee7d0993da407fc4Alex Klyubin    @Override
6087b30bc34492a0c53b02cec2fee7d0993da407fc4Alex Klyubin    public void onBackPressed() {
6098538fde237709464ec899a402fee29c0169f6bfaJeff Sharkey        if (mSessionId != -1) {
6108538fde237709464ec899a402fee29c0169f6bfaJeff Sharkey            mInstaller.setPermissionsResult(mSessionId, false);
6118538fde237709464ec899a402fee29c0169f6bfaJeff Sharkey        }
6127b30bc34492a0c53b02cec2fee7d0993da407fc4Alex Klyubin        mInstallFlowAnalytics.setFlowFinished(
6137b30bc34492a0c53b02cec2fee7d0993da407fc4Alex Klyubin                InstallFlowAnalytics.RESULT_CANCELLED_BY_USER);
6147b30bc34492a0c53b02cec2fee7d0993da407fc4Alex Klyubin        super.onBackPressed();
6157b30bc34492a0c53b02cec2fee7d0993da407fc4Alex Klyubin    }
6167b30bc34492a0c53b02cec2fee7d0993da407fc4Alex Klyubin
61791ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project    // Generic handling when pressing back key
61891ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project    public void onCancel(DialogInterface dialog) {
61991ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project        finish();
62091ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project    }
621d9b773b7041894e37c1b6f62d6b221dd3c8e4c43Suchi Amalapurapu
622d9b773b7041894e37c1b6f62d6b221dd3c8e4c43Suchi Amalapurapu    public void onClick(View v) {
623d9b773b7041894e37c1b6f62d6b221dd3c8e4c43Suchi Amalapurapu        if(v == mOk) {
6248ec226e8c778a3d1b4268edc33cd7c515d88ab31Dianne Hackborn            if (mOkCanInstall || mScrollView == null) {
6257b30bc34492a0c53b02cec2fee7d0993da407fc4Alex Klyubin                mInstallFlowAnalytics.setInstallButtonClicked();
6268538fde237709464ec899a402fee29c0169f6bfaJeff Sharkey                if (mSessionId != -1) {
6278538fde237709464ec899a402fee29c0169f6bfaJeff Sharkey                    mInstaller.setPermissionsResult(mSessionId, true);
6288538fde237709464ec899a402fee29c0169f6bfaJeff Sharkey
6298538fde237709464ec899a402fee29c0169f6bfaJeff Sharkey                    // We're only confirming permissions, so we don't really know how the
6308538fde237709464ec899a402fee29c0169f6bfaJeff Sharkey                    // story ends; assume success.
6318538fde237709464ec899a402fee29c0169f6bfaJeff Sharkey                    mInstallFlowAnalytics.setFlowFinishedWithPackageManagerResult(
6328538fde237709464ec899a402fee29c0169f6bfaJeff Sharkey                            PackageManager.INSTALL_SUCCEEDED);
6338538fde237709464ec899a402fee29c0169f6bfaJeff Sharkey                } else {
6348538fde237709464ec899a402fee29c0169f6bfaJeff Sharkey                    // Start subactivity to actually install the application
6358538fde237709464ec899a402fee29c0169f6bfaJeff Sharkey                    Intent newIntent = new Intent();
6368538fde237709464ec899a402fee29c0169f6bfaJeff Sharkey                    newIntent.putExtra(PackageUtil.INTENT_ATTR_APPLICATION_INFO,
6378538fde237709464ec899a402fee29c0169f6bfaJeff Sharkey                            mPkgInfo.applicationInfo);
6388538fde237709464ec899a402fee29c0169f6bfaJeff Sharkey                    newIntent.setData(mPackageURI);
6398538fde237709464ec899a402fee29c0169f6bfaJeff Sharkey                    newIntent.setClass(this, InstallAppProgress.class);
6408538fde237709464ec899a402fee29c0169f6bfaJeff Sharkey                    newIntent.putExtra(InstallAppProgress.EXTRA_MANIFEST_DIGEST, mPkgDigest);
6418538fde237709464ec899a402fee29c0169f6bfaJeff Sharkey                    newIntent.putExtra(
6428538fde237709464ec899a402fee29c0169f6bfaJeff Sharkey                            InstallAppProgress.EXTRA_INSTALL_FLOW_ANALYTICS, mInstallFlowAnalytics);
6438538fde237709464ec899a402fee29c0169f6bfaJeff Sharkey                    String installerPackageName = getIntent().getStringExtra(
6448538fde237709464ec899a402fee29c0169f6bfaJeff Sharkey                            Intent.EXTRA_INSTALLER_PACKAGE_NAME);
6458538fde237709464ec899a402fee29c0169f6bfaJeff Sharkey                    if (mOriginatingURI != null) {
6468538fde237709464ec899a402fee29c0169f6bfaJeff Sharkey                        newIntent.putExtra(Intent.EXTRA_ORIGINATING_URI, mOriginatingURI);
6478538fde237709464ec899a402fee29c0169f6bfaJeff Sharkey                    }
6488538fde237709464ec899a402fee29c0169f6bfaJeff Sharkey                    if (mReferrerURI != null) {
6498538fde237709464ec899a402fee29c0169f6bfaJeff Sharkey                        newIntent.putExtra(Intent.EXTRA_REFERRER, mReferrerURI);
6508538fde237709464ec899a402fee29c0169f6bfaJeff Sharkey                    }
6518538fde237709464ec899a402fee29c0169f6bfaJeff Sharkey                    if (mOriginatingUid != VerificationParams.NO_UID) {
6528538fde237709464ec899a402fee29c0169f6bfaJeff Sharkey                        newIntent.putExtra(Intent.EXTRA_ORIGINATING_UID, mOriginatingUid);
6538538fde237709464ec899a402fee29c0169f6bfaJeff Sharkey                    }
6548538fde237709464ec899a402fee29c0169f6bfaJeff Sharkey                    if (installerPackageName != null) {
6558538fde237709464ec899a402fee29c0169f6bfaJeff Sharkey                        newIntent.putExtra(Intent.EXTRA_INSTALLER_PACKAGE_NAME,
6568538fde237709464ec899a402fee29c0169f6bfaJeff Sharkey                                installerPackageName);
6578538fde237709464ec899a402fee29c0169f6bfaJeff Sharkey                    }
6588538fde237709464ec899a402fee29c0169f6bfaJeff Sharkey                    if (getIntent().getBooleanExtra(Intent.EXTRA_RETURN_RESULT, false)) {
6598538fde237709464ec899a402fee29c0169f6bfaJeff Sharkey                        newIntent.putExtra(Intent.EXTRA_RETURN_RESULT, true);
6608538fde237709464ec899a402fee29c0169f6bfaJeff Sharkey                        newIntent.addFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT);
6618538fde237709464ec899a402fee29c0169f6bfaJeff Sharkey                    }
6628538fde237709464ec899a402fee29c0169f6bfaJeff Sharkey                    if(localLOGV) Log.i(TAG, "downloaded app uri="+mPackageURI);
6638538fde237709464ec899a402fee29c0169f6bfaJeff Sharkey                    startActivity(newIntent);
6648ec226e8c778a3d1b4268edc33cd7c515d88ab31Dianne Hackborn                }
6658ec226e8c778a3d1b4268edc33cd7c515d88ab31Dianne Hackborn                finish();
6668ec226e8c778a3d1b4268edc33cd7c515d88ab31Dianne Hackborn            } else {
6678ec226e8c778a3d1b4268edc33cd7c515d88ab31Dianne Hackborn                mScrollView.pageScroll(View.FOCUS_DOWN);
6689e9721266feafdf16786b94f6fac4c06220cd422Dianne Hackborn            }
669d9b773b7041894e37c1b6f62d6b221dd3c8e4c43Suchi Amalapurapu        } else if(v == mCancel) {
670d9b773b7041894e37c1b6f62d6b221dd3c8e4c43Suchi Amalapurapu            // Cancel and finish
6719e9721266feafdf16786b94f6fac4c06220cd422Dianne Hackborn            setResult(RESULT_CANCELED);
6728538fde237709464ec899a402fee29c0169f6bfaJeff Sharkey            if (mSessionId != -1) {
6738538fde237709464ec899a402fee29c0169f6bfaJeff Sharkey                mInstaller.setPermissionsResult(mSessionId, false);
6748538fde237709464ec899a402fee29c0169f6bfaJeff Sharkey            }
6757b30bc34492a0c53b02cec2fee7d0993da407fc4Alex Klyubin            mInstallFlowAnalytics.setFlowFinished(
6767b30bc34492a0c53b02cec2fee7d0993da407fc4Alex Klyubin                    InstallFlowAnalytics.RESULT_CANCELLED_BY_USER);
677d9b773b7041894e37c1b6f62d6b221dd3c8e4c43Suchi Amalapurapu            finish();
678d9b773b7041894e37c1b6f62d6b221dd3c8e4c43Suchi Amalapurapu        }
679d9b773b7041894e37c1b6f62d6b221dd3c8e4c43Suchi Amalapurapu    }
68091ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project}
681