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

Commit d20cb1e3 authored by Chris Soyars's avatar Chris Soyars Committed by Steve Kondik
Browse files

Added installPackageExt and Intent on installPackage to prompt user.

parent 3e7cf540
Loading
Loading
Loading
Loading
+10 −0
Original line number Diff line number Diff line
@@ -2416,6 +2416,16 @@ class ApplicationContext extends Context {
            }
        }

        @Override
        public void installPackageExt(Uri packageURI, IPackageInstallObserver observer, int flags,
                String installerPackageName, boolean extInstall) {
            try {
                mPM.installPackageExtInstall(packageURI, observer, flags, installerPackageName);
            } catch (RemoteException e) {
                // Should never happen!
            }
        }

        @Override
        public String getInstallerPackageName(String packageName) {
            try {
+15 −0
Original line number Diff line number Diff line
@@ -148,6 +148,21 @@ interface IPackageManager {
    void installPackage(in Uri packageURI, IPackageInstallObserver observer, int flags,
            in String installerPackageName);

    /**
     * Install a package.
     *
     * @param packageURI The location of the package file to install.
     * @param observer a callback to use to notify when the package installation in finished.
     * @param flags - possible values: {@link #FORWARD_LOCK_PACKAGE},
     * {@link #REPLACE_EXISITING_PACKAGE}
     * @param installerPackageName Optional package name of the application that is performing the
     * installation. This identifies which market the package came from.
     * @param extInstall - Specify whether or not the package should be installed on the SD Card's
     * ext partition.
     */
    void installPackage(in Uri packageURI, IPackageInstallObserver observer, int flags,
            in String installerPackageName, boolean extInstall);

    /**
     * Delete a package.
     *
+9 −0
Original line number Diff line number Diff line
@@ -1517,6 +1517,15 @@ public abstract class PackageManager {
            Uri packageURI, IPackageInstallObserver observer, int flags,
            String installerPackageName);

    /**
     * @hide
     *
     * TODO: Write docs.
     */
    public abstract void installPackageExt(
            Uri packageURI, IPackageInstallObserver observer, int flags,
            String installerPackageName, boolean extInstall);

    /**
     * Attempts to delete a package.  Since this may take a little while, the result will
     * be posted back to the given observer.  A deletion will fail if the calling context
+53 −6
Original line number Diff line number Diff line
@@ -165,6 +165,9 @@ class PackageManagerService extends IPackageManager.Stub {
    // This is the object monitoring mAppInstallDir.
    final FileObserver mAppInstallObserver;

    // This is the object monitoring mSdExtInstallDir.
    final FileObserver mSdExtInstallObserver;

    // This is the object monitoring mDrmAppPrivateInstallDir.
    final FileObserver mDrmAppInstallObserver;

@@ -175,6 +178,10 @@ class PackageManagerService extends IPackageManager.Stub {
    final File mFrameworkDir;
    final File mSystemAppDir;
    final File mAppInstallDir;
    final File mSdExtInstallDir;

    // Whether or not we are installing on the EXT partition.
    boolean mExtInstall;

    // Directory containing the private parts (e.g. code and non-resource assets) of forward-locked
    // apps.
@@ -358,7 +365,9 @@ class PackageManagerService extends IPackageManager.Stub {
            mHandler = new Handler(mHandlerThread.getLooper());
            
            File dataDir = Environment.getDataDirectory();
            File sdExtDir = Environment.getSdExtDirectory();
            mAppDataDir = new File(dataDir, "data");
            mSdExtInstallDir = new File(sdExtDir, "app");
            mDrmAppPrivateInstallDir = new File(dataDir, "app-private");

            if (mInstaller == null) {
@@ -369,6 +378,7 @@ class PackageManagerService extends IPackageManager.Stub {
                miscDir.mkdirs();
                mAppDataDir.mkdirs();
                mDrmAppPrivateInstallDir.mkdirs();
                mSdExtInstallDir.mkdirs();
            }

            readPermissions();
@@ -501,6 +511,11 @@ class PackageManagerService extends IPackageManager.Stub {
            scanDirLI(mAppInstallDir, 0, scanMode);
            mAppInstallObserver.startWatching();

            mSdExtInstallObserver = new AppDirObserver(
                mSdExtInstallDir.getPath(), OBSERVER_EVENTS, false);
            scanDirLI(mSdExtInstallDir, 0, scanMode);
            mSdExtInstallObserver.startWatching();

            mDrmAppInstallObserver = new AppDirObserver(
                mDrmAppPrivateInstallDir.getPath(), OBSERVER_EVENTS, false);
            scanDirLI(mDrmAppPrivateInstallDir, 0, scanMode | SCAN_FORWARD_LOCKED);
@@ -3526,13 +3541,34 @@ class PackageManagerService extends IPackageManager.Stub {
        installPackage(packageURI, observer, flags, null);
    }
    
    /* Called when a downloaded package installation is completed (usually by the Market) */
    public void installPackage(final Uri packageURI, final IPackageInstallObserver observer, final int flags, final String installerPackageName) {
       // Here we need to throw an Intent to prompt the user to choose the install location.
       
       Intent intent = new Intent();
       intent.setData(packageURI);
       intent.putExtra("installerPackageName", installerPackageName);
       intent.putExtra("flags", flags);
       intent.setComponent(new ComponentName("com.android.packageinstaller","com.android.packageinstaller.MarketInstallerActivity"));
       intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
       mContext.startActivity(intent);
       
       return;
    }

    public void installPackageExt(final Uri packageURI, final IPackageInstallObserver observer, final int flags, final String installerPackageName, boolean extInstall) {
       installPackageFinal(packageURI, observer, flags, installerPackageName, extInstall);
    }

    /* Called when a downloaded package installation has been confirmed by the user */
    public void installPackage(
    public void installPackageFinal(
            final Uri packageURI, final IPackageInstallObserver observer, final int flags,
            final String installerPackageName) {
            final String installerPackageName, boolean extInstall) {
        mContext.enforceCallingOrSelfPermission(
                android.Manifest.permission.INSTALL_PACKAGES, null);

        mExtInstall = extInstall;
        
        // Queue up an async operation since the package installation may take a little while.
        mHandler.post(new Runnable() {
            public void run() {
@@ -4026,9 +4062,18 @@ class PackageManagerService extends IPackageManager.Stub {
            res.name = pkgName;
            //initialize some variables before installing pkg
            final String pkgFileName = pkgName + ".apk";
            final File destDir = ((pFlags&PackageManager.INSTALL_FORWARD_LOCK) != 0)
                                 ?  mDrmAppPrivateInstallDir
                                 : mAppInstallDir;

            // determine the destination directory.
            // TODO: add support for app-private on /sd-ext
            File destDir = null;
            if (mExtInstall) {
                destDir = mSdExtInstallDir;
            } else if ((pFlags&PackageManager.INSTALL_FORWARD_LOCK) != 0) {
                destDir = mDrmAppPrivateInstallDir;
            } else {
                destDir = mAppInstallDir;
            }

            final File destPackageFile = new File(destDir, pkgFileName);
            final String destFilePath = destPackageFile.getAbsolutePath();
            File destResourceFile;
@@ -4208,8 +4253,10 @@ class PackageManagerService extends IPackageManager.Stub {

    private File createTempPackageFile() {
        File tmpPackageFile;
        File dir = mAppInstallDir;
        if (mExtInstall) dir = mSdExtInstallDir;
        try {
            tmpPackageFile = File.createTempFile("vmdl", ".tmp", mAppInstallDir);
            tmpPackageFile = File.createTempFile("vmdl", ".tmp", dir);
        } catch (IOException e) {
            Log.e(TAG, "Couldn't create temp file for downloaded package file.");
            return null;
+9 −0
Original line number Diff line number Diff line
@@ -293,6 +293,15 @@ public class MockPackageManager extends PackageManager {
        throw new UnsupportedOperationException();
    }

    /**
     * @hide - to match hiding in superclass
     */
    @Override
    public void installPackageExt(Uri packageURI, IPackageInstallObserver observer,
            int flags, String installerPackageName, boolean extInstall) {
        throw new UnsupportedOperationException();
    }
    
    /**
     * @hide - to match hiding in superclass
     */