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