Do not allow downgrades of embedded microapps

- flag is passed in from https://critique.corp.google.com/#review/126666577

Bug: 29641183

Change-Id: I1becbb446d824331430eb37d99bdbc7a36dd13db
diff --git a/src/com/android/packageinstaller/wear/WearPackageArgs.java b/src/com/android/packageinstaller/wear/WearPackageArgs.java
index da49192..2c289b2 100644
--- a/src/com/android/packageinstaller/wear/WearPackageArgs.java
+++ b/src/com/android/packageinstaller/wear/WearPackageArgs.java
@@ -45,6 +45,8 @@
             "com.google.android.clockwork.EXTRA_KEY_COMPANION_DEVICE_VERSION";
     private static final String KEY_SHOULD_CHECK_GMS_DEPENDENCY =
             "com.google.android.clockwork.EXTRA_KEY_SHOULD_CHECK_GMS_DEPENDENCY";
+    private static final String KEY_SKIP_IF_LOWER_VERSION =
+            "com.google.android.clockwork.EXTRA_SKIP_IF_LOWER_VERSION";
 
     public static String getPackageName(Bundle b) {
         return b.getString(KEY_PACKAGE_NAME);
@@ -87,6 +89,10 @@
         return b.getInt(KEY_START_ID);
     }
 
+    public static boolean skipIfLowerVersion(Bundle b) {
+        return b.getBoolean(KEY_SKIP_IF_LOWER_VERSION, false);
+    }
+
     public static Bundle setStartId(Bundle b, int startId) {
         b.putInt(KEY_START_ID, startId);
         return b;
diff --git a/src/com/android/packageinstaller/wear/WearPackageInstallerService.java b/src/com/android/packageinstaller/wear/WearPackageInstallerService.java
index 22e8fc6..2d4744c 100644
--- a/src/com/android/packageinstaller/wear/WearPackageInstallerService.java
+++ b/src/com/android/packageinstaller/wear/WearPackageInstallerService.java
@@ -195,13 +195,15 @@
         int companionSdkVersion = WearPackageArgs.getCompanionSdkVersion(argsBundle);
         int companionDeviceVersion = WearPackageArgs.getCompanionDeviceVersion(argsBundle);
         String compressionAlg = WearPackageArgs.getCompressionAlg(argsBundle);
+        boolean skipIfLowerVersion = WearPackageArgs.skipIfLowerVersion(argsBundle);
 
         if (Log.isLoggable(TAG, Log.DEBUG)) {
             Log.d(TAG, "Installing package: " + packageName + ", assetUri: " + assetUri +
                     ",permUri: " + permUri + ", startId: " + startId + ", checkPerms: " +
                     checkPerms + ", skipIfSameVersion: " + skipIfSameVersion +
                     ", compressionAlg: " + compressionAlg + ", companionSdkVersion: " +
-                    companionSdkVersion + ", companionDeviceVersion: " + companionDeviceVersion);
+                    companionSdkVersion + ", companionDeviceVersion: " + companionDeviceVersion +
+                    ", skipIfLowerVersion: " + skipIfLowerVersion);
         }
         final PackageManager pm = getPackageManager();
         File tempFile = null;
@@ -266,9 +268,17 @@
                                 ") is equal to existing app for " + packageName);
                     }
                 } else if (existingPkgInfo.versionCode > pkg.mVersionCode) {
-                    Log.w(TAG, "Version number of new app (" + pkg.mVersionCode +
-                            ") is lower than existing app ( " + existingPkgInfo.versionCode +
-                            ") for " + packageName);
+                    if (skipIfLowerVersion) {
+                        // Starting in Feldspar, we are not going to allow downgrades of any app.
+                        Log.w(TAG, "Version number of new app (" + pkg.mVersionCode +
+                                ") is lower than existing app ( " + existingPkgInfo.versionCode +
+                                ") for " + packageName + "; not installing due to versionCheck");
+                        return;
+                    } else {
+                        Log.w(TAG, "Version number of new app (" + pkg.mVersionCode +
+                                ") is lower than existing app ( " + existingPkgInfo.versionCode +
+                                ") for " + packageName);
+                    }
                 }
 
                 // Following the Android Phone model, we should only check for permissions for any