Always copy file before parsing it for installing

(cherry picked from commit 731ab89e06eb9a8d0b0ba8fc7e4df45c42c8741e)

Fixes: 129039920
Fixes: 140195904
Merged-In: Ib2abc1d84311dec40e2f9e78551850984cd7ab82
diff --git a/src/com/android/packageinstaller/InstallStart.java b/src/com/android/packageinstaller/InstallStart.java
index 1eb6de8..fa11853 100644
--- a/src/com/android/packageinstaller/InstallStart.java
+++ b/src/com/android/packageinstaller/InstallStart.java
@@ -21,6 +21,7 @@
 import android.app.ActivityManager;
 import android.app.AppGlobals;
 import android.app.IActivityManager;
+import android.content.ContentResolver;
 import android.content.Intent;
 import android.content.pm.ApplicationInfo;
 import android.content.pm.IPackageManager;
@@ -42,7 +43,6 @@
 public class InstallStart extends Activity {
     private static final String LOG_TAG = InstallStart.class.getSimpleName();
 
-    private static final String SCHEME_CONTENT = "content";
     private static final String DOWNLOADS_AUTHORITY = "downloads";
     private IActivityManager mIActivityManager;
     private IPackageManager mIPackageManager;
@@ -110,20 +110,20 @@
         } else {
             Uri packageUri = intent.getData();
 
-            if (packageUri == null) {
-                // if there's nothing to do, quietly slip into the ether
+            if (packageUri != null && (packageUri.getScheme().equals(ContentResolver.SCHEME_FILE)
+                    || packageUri.getScheme().equals(ContentResolver.SCHEME_CONTENT))) {
+                // Copy file to prevent it from being changed underneath this process
+                nextActivity.setClass(this, InstallStaging.class);
+            } else if (packageUri != null && packageUri.getScheme().equals(
+                    PackageInstallerActivity.SCHEME_PACKAGE)) {
+                nextActivity.setClass(this, PackageInstallerActivity.class);
+            } else {
                 Intent result = new Intent();
                 result.putExtra(Intent.EXTRA_INSTALL_RESULT,
                         PackageManager.INSTALL_FAILED_INVALID_URI);
                 setResult(RESULT_FIRST_USER, result);
 
                 nextActivity = null;
-            } else {
-                if (packageUri.getScheme().equals(SCHEME_CONTENT)) {
-                    nextActivity.setClass(this, InstallStaging.class);
-                } else {
-                    nextActivity.setClass(this, PackageInstallerActivity.class);
-                }
             }
         }
 
diff --git a/src/com/android/packageinstaller/PackageInstallerActivity.java b/src/com/android/packageinstaller/PackageInstallerActivity.java
index 0f41c98..d005c37 100644
--- a/src/com/android/packageinstaller/PackageInstallerActivity.java
+++ b/src/com/android/packageinstaller/PackageInstallerActivity.java
@@ -25,6 +25,7 @@
 import android.app.Fragment;
 import android.app.FragmentTransaction;
 import android.content.ActivityNotFoundException;
+import android.content.ContentResolver;
 import android.content.Context;
 import android.content.DialogInterface;
 import android.content.Intent;
@@ -74,8 +75,7 @@
 
     private static final int REQUEST_TRUST_EXTERNAL_SOURCE = 1;
 
-    private static final String SCHEME_FILE = "file";
-    private static final String SCHEME_PACKAGE = "package";
+    static final String SCHEME_PACKAGE = "package";
 
     static final String EXTRA_CALLING_PACKAGE = "EXTRA_CALLING_PACKAGE";
     static final String EXTRA_ORIGINAL_SOURCE_INFO = "EXTRA_ORIGINAL_SOURCE_INFO";
@@ -568,7 +568,7 @@
                         mPm.getApplicationIcon(mPkgInfo.applicationInfo));
             } break;
 
-            case SCHEME_FILE: {
+            case ContentResolver.SCHEME_FILE: {
                 File sourceFile = new File(packageUri.getPath());
                 PackageParser.Package parsed = PackageUtil.getPackageInfo(this, sourceFile);
 
@@ -586,10 +586,7 @@
             } break;
 
             default: {
-                Log.w(TAG, "Unsupported scheme " + scheme);
-                setPmResult(PackageManager.INSTALL_FAILED_INVALID_URI);
-                finish();
-                return false;
+                throw new IllegalArgumentException("Unexpected URI scheme " + packageUri);
             }
         }