Loading core/java/android/app/ApplicationContext.java +10 −0 Original line number Diff line number Diff line Loading @@ -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 { Loading core/java/android/content/pm/IPackageManager.aidl +15 −0 Original line number Diff line number Diff line Loading @@ -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. * Loading core/java/android/content/pm/PackageManager.java +9 −0 Original line number Diff line number Diff line Loading @@ -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 Loading services/java/com/android/server/PackageManagerService.java +53 −6 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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. Loading Loading @@ -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) { Loading @@ -369,6 +378,7 @@ class PackageManagerService extends IPackageManager.Stub { miscDir.mkdirs(); mAppDataDir.mkdirs(); mDrmAppPrivateInstallDir.mkdirs(); mSdExtInstallDir.mkdirs(); } readPermissions(); Loading Loading @@ -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); Loading Loading @@ -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() { Loading Loading @@ -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; Loading Loading @@ -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; Loading test-runner/android/test/mock/MockPackageManager.java +9 −0 Original line number Diff line number Diff line Loading @@ -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 */ Loading Loading
core/java/android/app/ApplicationContext.java +10 −0 Original line number Diff line number Diff line Loading @@ -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 { Loading
core/java/android/content/pm/IPackageManager.aidl +15 −0 Original line number Diff line number Diff line Loading @@ -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. * Loading
core/java/android/content/pm/PackageManager.java +9 −0 Original line number Diff line number Diff line Loading @@ -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 Loading
services/java/com/android/server/PackageManagerService.java +53 −6 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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. Loading Loading @@ -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) { Loading @@ -369,6 +378,7 @@ class PackageManagerService extends IPackageManager.Stub { miscDir.mkdirs(); mAppDataDir.mkdirs(); mDrmAppPrivateInstallDir.mkdirs(); mSdExtInstallDir.mkdirs(); } readPermissions(); Loading Loading @@ -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); Loading Loading @@ -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() { Loading Loading @@ -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; Loading Loading @@ -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; Loading
test-runner/android/test/mock/MockPackageManager.java +9 −0 Original line number Diff line number Diff line Loading @@ -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 */ Loading