Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit aedb646e authored by Amith Yamasani's avatar Amith Yamasani
Browse files

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
parent 83bdda76
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -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. -->
+60 −29
Original line number Diff line number Diff line
@@ -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)
@@ -251,6 +253,17 @@ public class PackageInstallerActivity extends Activity implements OnCancelListen
                    })
                    .setOnCancelListener(this)
                    .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)
@@ -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());
@@ -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 */