summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAmith Yamasani <yamasani@google.com>2014-10-28 09:35:46 -0700
committerAmith Yamasani <yamasani@google.com>2014-10-28 10:08:18 -0700
commitaedb646edc37a5b2feea1fe28894fe4b06d94c55 (patch)
tree2ea3bf9a9814b446781c7b929db6c14721512cc1
parent83bdda7668a587fbf4913a1e55892991022b4456 (diff)
downloadandroid_packages_apps_PackageInstaller-aedb646edc37a5b2feea1fe28894fe4b06d94c55.tar.gz
android_packages_apps_PackageInstaller-aedb646edc37a5b2feea1fe28894fe4b06d94c55.tar.bz2
android_packages_apps_PackageInstaller-aedb646edc37a5b2feea1fe28894fe4b06d94c55.zip
Display correct message based on reason
There can be two reasons for not allowing installation of apps from unknown sources. 1. The user setting is off, in which case allow the user to go to Settings and change it. 2. The device administrator (or corp profile) has prohibited. In this case, user can't really change it, so show a different message and have just an OK button. Bug: 17656403 Change-Id: I0d90ba95d7a9250021366b76d570c0ef7b55c143
-rw-r--r--res/values/strings.xml3
-rw-r--r--src/com/android/packageinstaller/PackageInstallerActivity.java89
2 files changed, 63 insertions, 29 deletions
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 23211cdd..a01e5657 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -89,6 +89,9 @@
<string name="unknown_apps_dlg_text" product="tablet">For security, your tablet is set to block installation of apps obtained from unknown sources.</string>
<!-- Message presented in a dialog box when a package is requested to be installed, but the "Allow unknown applications" checkbox is not enabled. [CHAR LIMIT=100] -->
<string name="unknown_apps_dlg_text" product="default">For security, your phone is set to block installation of apps obtained from unknown sources.</string>
+ <!-- Message presented in a dialog box when the device administrator restricts the installation of apps from unknown sources. [CHAR LIMIT=none] -->
+ <string name="unknown_apps_admin_dlg_text">Your administrator doesn\'t allow installation of apps obtained from unknown sources.</string>
+
<string name="ok">OK</string>
<string name="settings">Settings</string>
<!-- Title of dialog asking user if they would allow an application to be an install source. -->
diff --git a/src/com/android/packageinstaller/PackageInstallerActivity.java b/src/com/android/packageinstaller/PackageInstallerActivity.java
index ec1fe6b8..997ed1ed 100644
--- a/src/com/android/packageinstaller/PackageInstallerActivity.java
+++ b/src/com/android/packageinstaller/PackageInstallerActivity.java
@@ -59,7 +59,7 @@ import java.util.List;
* The package is first parsed and the user is notified of parse errors via a dialog.
* If the package is successfully parsed, the user is notified to turn on the install unknown
* applications setting. A memory check is made at this point and the user is notified of out
- * of memory conditions if any. If the package is already existing on the device,
+ * of memory conditions if any. If the package is already existing on the device,
* a confirmation dialog (to replace the existing package) is presented to the user.
* Based on the user response the package is then installed by launching InstallAppConfirm
* sub activity. All state transitions are handled in this activity
@@ -68,7 +68,7 @@ public class PackageInstallerActivity extends Activity implements OnCancelListen
private static final String TAG = "PackageInstaller";
private int mSessionId = -1;
- private Uri mPackageURI;
+ private Uri mPackageURI;
private Uri mOriginatingURI;
private Uri mReferrerURI;
private int mOriginatingUid = VerificationParams.NO_UID;
@@ -76,6 +76,7 @@ public class PackageInstallerActivity extends Activity implements OnCancelListen
private boolean localLOGV = false;
PackageManager mPm;
+ UserManager mUserManager;
PackageInstaller mInstaller;
PackageInfo mPkgInfo;
ApplicationInfo mSourceInfo;
@@ -102,11 +103,12 @@ public class PackageInstallerActivity extends Activity implements OnCancelListen
// Dialog identifiers used in showDialog
private static final int DLG_BASE = 0;
- private static final int DLG_UNKNOWN_APPS = DLG_BASE + 1;
+ private static final int DLG_UNKNOWN_SOURCES = DLG_BASE + 1;
private static final int DLG_PACKAGE_ERROR = DLG_BASE + 2;
private static final int DLG_OUT_OF_SPACE = DLG_BASE + 3;
private static final int DLG_INSTALL_ERROR = DLG_BASE + 4;
private static final int DLG_ALLOW_SOURCE = DLG_BASE + 5;
+ private static final int DLG_ADMIN_RESTRICTS_UNKNOWN_SOURCES = DLG_BASE + 6;
private void startInstallConfirm() {
TabHost tabHost = (TabHost)findViewById(android.R.id.tabhost);
@@ -234,7 +236,7 @@ public class PackageInstallerActivity extends Activity implements OnCancelListen
@Override
public Dialog onCreateDialog(int id, Bundle bundle) {
switch (id) {
- case DLG_UNKNOWN_APPS:
+ case DLG_UNKNOWN_SOURCES:
return new AlertDialog.Builder(this)
.setTitle(R.string.unknown_apps_dlg_title)
.setMessage(R.string.unknown_apps_dlg_text)
@@ -250,7 +252,18 @@ public class PackageInstallerActivity extends Activity implements OnCancelListen
}
})
.setOnCancelListener(this)
- .create();
+ .create();
+ case DLG_ADMIN_RESTRICTS_UNKNOWN_SOURCES:
+ return new AlertDialog.Builder(this)
+ .setTitle(R.string.unknown_apps_dlg_title)
+ .setMessage(R.string.unknown_apps_admin_dlg_text)
+ .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
+ public void onClick(DialogInterface dialog, int which) {
+ finish();
+ }
+ })
+ .setOnCancelListener(this)
+ .create();
case DLG_PACKAGE_ERROR :
return new AlertDialog.Builder(this)
.setTitle(R.string.Parse_error_dlg_title)
@@ -265,7 +278,7 @@ public class PackageInstallerActivity extends Activity implements OnCancelListen
case DLG_OUT_OF_SPACE:
// Guaranteed not to be null. will default to package name if not set by app
CharSequence appTitle = mPm.getApplicationLabel(mPkgInfo.applicationInfo);
- String dlgText = getString(R.string.out_of_space_dlg_text,
+ String dlgText = getString(R.string.out_of_space_dlg_text,
appTitle.toString());
return new AlertDialog.Builder(this)
.setTitle(R.string.out_of_space_dlg_title)
@@ -275,7 +288,7 @@ public class PackageInstallerActivity extends Activity implements OnCancelListen
//launch manage applications
Intent intent = new Intent("android.intent.action.MANAGE_PACKAGE_STORAGE");
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- startActivity(intent);
+ startActivity(intent);
finish();
}
})
@@ -336,17 +349,6 @@ public class PackageInstallerActivity extends Activity implements OnCancelListen
finish();
}
- private boolean isInstallingUnknownAppsAllowed() {
- UserManager um = (UserManager) getSystemService(USER_SERVICE);
-
- boolean disallowedByUserManager = um.getUserRestrictions()
- .getBoolean(UserManager.DISALLOW_INSTALL_UNKNOWN_SOURCES, false);
- boolean allowedBySecureSettings = Settings.Secure.getInt(getContentResolver(),
- Settings.Secure.INSTALL_NON_MARKET_APPS, 0) > 0;
-
- return (allowedBySecureSettings && (!disallowedByUserManager));
- }
-
private boolean isInstallRequestFromUnknownSource(Intent intent) {
String callerPackage = getCallingPackage();
if (callerPackage != null && intent.getBooleanExtra(
@@ -367,8 +369,7 @@ public class PackageInstallerActivity extends Activity implements OnCancelListen
}
private boolean isVerifyAppsEnabled() {
- UserManager um = (UserManager) getSystemService(USER_SERVICE);
- if (um.hasUserRestriction(UserManager.ENSURE_VERIFY_APPS)) {
+ if (mUserManager.hasUserRestriction(UserManager.ENSURE_VERIFY_APPS)) {
return true;
}
return Settings.Global.getInt(getContentResolver(),
@@ -384,6 +385,21 @@ public class PackageInstallerActivity extends Activity implements OnCancelListen
return (receivers.size() > 0) ? true : false;
}
+ /**
+ * @return whether unknown sources is enabled by user in Settings
+ */
+ private boolean isUnknownSourcesEnabled() {
+ return Settings.Secure.getInt(getContentResolver(),
+ Settings.Secure.INSTALL_NON_MARKET_APPS, 0) > 0;
+ }
+
+ /**
+ * @return whether the device admin restricts installation from unknown sources
+ */
+ private boolean isUnknownSourcesAllowedByAdmin() {
+ return !mUserManager.hasUserRestriction(UserManager.DISALLOW_INSTALL_UNKNOWN_SOURCES);
+ }
+
private void initiateInstall() {
String pkgName = mPkgInfo.packageName;
// Check if there is already a package on the device with this name
@@ -428,6 +444,7 @@ public class PackageInstallerActivity extends Activity implements OnCancelListen
mPm = getPackageManager();
mInstaller = mPm.getPackageInstaller();
+ mUserManager = (UserManager) getSystemService(Context.USER_SERVICE);
final Intent intent = getIntent();
if (PackageInstaller.ACTION_CONFIRM_PERMISSIONS.equals(intent.getAction())) {
@@ -450,12 +467,15 @@ public class PackageInstallerActivity extends Activity implements OnCancelListen
mReferrerURI = intent.getParcelableExtra(Intent.EXTRA_REFERRER);
}
+ final boolean unknownSourcesAllowedByAdmin = isUnknownSourcesAllowedByAdmin();
+ final boolean unknownSourcesAllowedByUser = isUnknownSourcesEnabled();
+
boolean requestFromUnknownSource = isInstallRequestFromUnknownSource(intent);
mInstallFlowAnalytics = new InstallFlowAnalytics();
mInstallFlowAnalytics.setContext(this);
mInstallFlowAnalytics.setStartTimestampMillis(SystemClock.elapsedRealtime());
- mInstallFlowAnalytics.setInstallsFromUnknownSourcesPermitted(
- isInstallingUnknownAppsAllowed());
+ mInstallFlowAnalytics.setInstallsFromUnknownSourcesPermitted(unknownSourcesAllowedByAdmin
+ && unknownSourcesAllowedByUser);
mInstallFlowAnalytics.setInstallRequestFromUnknownSource(requestFromUnknownSource);
mInstallFlowAnalytics.setVerifyAppsEnabled(isVerifyAppsEnabled());
mInstallFlowAnalytics.setAppVerifierInstalled(isAppVerifierInstalled());
@@ -513,7 +533,7 @@ public class PackageInstallerActivity extends Activity implements OnCancelListen
as = PackageUtil.getAppSnippet(this, mPkgInfo.applicationInfo, sourceFile);
}
mInstallFlowAnalytics.setPackageInfoObtained();
-
+
//set view
setContentView(R.layout.install_start);
mInstallConfirm = findViewById(R.id.install_confirm_panel);
@@ -523,14 +543,25 @@ public class PackageInstallerActivity extends Activity implements OnCancelListen
mOriginatingUid = getOriginatingUid(intent);
// Block the install attempt on the Unknown Sources setting if necessary.
- if ((requestFromUnknownSource) && (!isInstallingUnknownAppsAllowed())) {
- //ask user to enable setting first
- showDialogInner(DLG_UNKNOWN_APPS);
+ if (!requestFromUnknownSource) {
+ initiateInstall();
+ return;
+ }
+
+ // If the admin prohibits it, or we're running in a managed profile, just show error
+ // and exit. Otherwise show an option to take the user to Settings to change the setting.
+ final boolean isManagedProfile = mUserManager.isManagedProfile();
+ if (!unknownSourcesAllowedByAdmin
+ || (!unknownSourcesAllowedByUser && isManagedProfile)) {
+ showDialogInner(DLG_ADMIN_RESTRICTS_UNKNOWN_SOURCES);
+ mInstallFlowAnalytics.setFlowFinished(
+ InstallFlowAnalytics.RESULT_BLOCKED_BY_UNKNOWN_SOURCES_SETTING);
+ } else if (!unknownSourcesAllowedByUser) {
+ // Ask user to enable setting first
+ showDialogInner(DLG_UNKNOWN_SOURCES);
mInstallFlowAnalytics.setFlowFinished(
InstallFlowAnalytics.RESULT_BLOCKED_BY_UNKNOWN_SOURCES_SETTING);
- return;
}
- initiateInstall();
}
/** Get the ApplicationInfo for the calling package, if available */
@@ -620,7 +651,7 @@ public class PackageInstallerActivity extends Activity implements OnCancelListen
}
public void onClick(View v) {
- if(v == mOk) {
+ if (v == mOk) {
if (mOkCanInstall || mScrollView == null) {
mInstallFlowAnalytics.setInstallButtonClicked();
if (mSessionId != -1) {