Determine OptimizeFlags based on the reason.

Bug: 260419279
Test: adb shell pm art optimize-package -m speed-profile -f \
  com.google.android.gms
Test: adb shell pm art optimize-package -m speed-profile -f \
  --primary-dex com.google.android.gms
Test: adb shell pm art optimize-package -m speed-profile -f \
  --split \"\" com.google.android.gms
Ignore-AOSP-First: ART Services.
Change-Id: I36d76ff03e01996c34dd86f993d04ab897acb2fb
diff --git a/libartservice/service/api/system-server-current.txt b/libartservice/service/api/system-server-current.txt
index f3dfb38..992c08c 100644
--- a/libartservice/service/api/system-server-current.txt
+++ b/libartservice/service/api/system-server-current.txt
@@ -71,7 +71,6 @@
   public class ArtFlags {
     method public static int defaultDeleteFlags();
     method public static int defaultGetStatusFlags();
-    method public static int defaultOptimizeFlags();
     field public static final int FLAG_FORCE = 16; // 0x10
     field public static final int FLAG_FOR_PRIMARY_DEX = 1; // 0x1
     field public static final int FLAG_FOR_SECONDARY_DEX = 2; // 0x2
diff --git a/libartservice/service/java/com/android/server/art/ArtShellCommand.java b/libartservice/service/java/com/android/server/art/ArtShellCommand.java
index 7feea28..727803f 100644
--- a/libartservice/service/java/com/android/server/art/ArtShellCommand.java
+++ b/libartservice/service/java/com/android/server/art/ArtShellCommand.java
@@ -103,6 +103,8 @@
                 case "optimize-package": {
                     var paramsBuilder = new OptimizeParams.Builder("cmdline");
                     String opt;
+                    @OptimizeFlags int scopeFlags = 0;
+                    boolean forSingleSplit = false;
                     while ((opt = getNextOption()) != null) {
                         switch (opt) {
                             case "-m":
@@ -111,17 +113,18 @@
                             case "-f":
                                 paramsBuilder.setFlags(ArtFlags.FLAG_FORCE, ArtFlags.FLAG_FORCE);
                                 break;
+                            case "--primary-dex":
+                                scopeFlags |= ArtFlags.FLAG_FOR_PRIMARY_DEX;
+                                break;
                             case "--secondary-dex":
-                                paramsBuilder.setFlags(ArtFlags.FLAG_FOR_SECONDARY_DEX,
-                                        ArtFlags.FLAG_FOR_PRIMARY_DEX
-                                                | ArtFlags.FLAG_FOR_SECONDARY_DEX);
+                                scopeFlags |= ArtFlags.FLAG_FOR_SECONDARY_DEX;
                                 break;
                             case "--include-dependencies":
-                                paramsBuilder.setFlags(ArtFlags.FLAG_SHOULD_INCLUDE_DEPENDENCIES,
-                                        ArtFlags.FLAG_SHOULD_INCLUDE_DEPENDENCIES);
+                                scopeFlags |= ArtFlags.FLAG_SHOULD_INCLUDE_DEPENDENCIES;
                                 break;
                             case "--split":
                                 String splitName = getNextArgRequired();
+                                forSingleSplit = true;
                                 paramsBuilder
                                         .setFlags(ArtFlags.FLAG_FOR_SINGLE_SPLIT,
                                                 ArtFlags.FLAG_FOR_SINGLE_SPLIT)
@@ -132,6 +135,20 @@
                                 return 1;
                         }
                     }
+                    if (forSingleSplit) {
+                        if (scopeFlags != 0) {
+                            pw.println("'--primary-dex', '--secondary-dex', and "
+                                    + "'--include-dependencies' must not be set when '--split' is "
+                                    + "set.");
+                            return 1;
+                        }
+                        scopeFlags = ArtFlags.FLAG_FOR_PRIMARY_DEX;
+                    }
+                    if (scopeFlags != 0) {
+                        paramsBuilder.setFlags(scopeFlags,
+                                ArtFlags.FLAG_FOR_PRIMARY_DEX | ArtFlags.FLAG_FOR_SECONDARY_DEX
+                                        | ArtFlags.FLAG_SHOULD_INCLUDE_DEPENDENCIES);
+                    }
 
                     OptimizeResult result;
                     try (var signal = new WithCancellationSignal(pw)) {
@@ -301,19 +318,24 @@
         pw.println("    Print the optimization status of a package.");
         pw.println("    By default, the command only prints the optimization status of primary "
                 + "dex'es.");
-        pw.println("  optimize-package [-m COMPILER_FILTER] [-f] [--secondary-dex] ");
-        pw.println("      [--include-dependencies] [--split SPLIT_NAME] PACKAGE_NAME");
+        pw.println("  optimize-package [-m COMPILER_FILTER] [-f] [--primary-dex]");
+        pw.println("      [--secondary-dex] [--include-dependencies] [--split SPLIT_NAME]");
+        pw.println("      PACKAGE_NAME");
         pw.println("    Optimize a package.");
-        pw.println("    By default, the command only optimizes primary dex'es.");
-        pw.println("    The command prints a job ID, which can be used to cancel the job using the"
-                + "'cancel' command.");
+        pw.println("    If none of '--primary-dex', '--secondary-dex', and");
+        pw.println("    '--include-dependencies' is set, the command optimizes all of them.");
+        pw.println("    The command prints a job ID, which can be used to cancel the job using");
+        pw.println("    the 'cancel' command.");
         pw.println("    Options:");
         pw.println("      -m Set the compiler filter.");
         pw.println("      -f Force compilation.");
-        pw.println("      --secondary-dex Only optimize secondary dex.");
+        pw.println("      --primary-dex Optimize primary dex.");
+        pw.println("      --secondary-dex Optimize secondary dex.");
         pw.println("      --include-dependencies Include dependencies.");
         pw.println("      --split SPLIT_NAME Only optimize the given split. If SPLIT_NAME is an");
-        pw.println("        empty string, only optimize the base APK.");
+        pw.println("        empty string, only optimize the base APK. When this option is set,");
+        pw.println("        '--primary-dex', '--secondary-dex', and '--include-dependencies' must");
+        pw.println("        not be set.");
         pw.println("  optimize-packages REASON");
         pw.println("    Run batch optimization for the given reason.");
         pw.println("    The command prints a job ID, which can be used to cancel the job using the"
diff --git a/libartservice/service/java/com/android/server/art/model/ArtFlags.java b/libartservice/service/java/com/android/server/art/model/ArtFlags.java
index c35b2c2..cb5921d 100644
--- a/libartservice/service/java/com/android/server/art/model/ArtFlags.java
+++ b/libartservice/service/java/com/android/server/art/model/ArtFlags.java
@@ -17,11 +17,13 @@
 package com.android.server.art.model;
 
 import android.annotation.IntDef;
+import android.annotation.NonNull;
 import android.annotation.SystemApi;
 import android.app.job.JobScheduler;
 
 import com.android.server.art.ArtManagerLocal;
 import com.android.server.art.PriorityClass;
+import com.android.server.art.ReasonMapping;
 import com.android.server.pm.PackageManagerLocal;
 
 import java.lang.annotation.Retention;
@@ -136,10 +138,29 @@
     /**
      * Default flags that are used when
      * {@link OptimizeParams.Builder#Builder(String)} is called.
-     * Value: {@link #FLAG_FOR_PRIMARY_DEX}.
+     *
+     * @hide
      */
-    public static @OptimizeFlags int defaultOptimizeFlags() {
-        return FLAG_FOR_PRIMARY_DEX;
+    public static @OptimizeFlags int defaultOptimizeFlags(@NonNull String reason) {
+        switch (reason) {
+            case ReasonMapping.REASON_INSTALL:
+            case ReasonMapping.REASON_INSTALL_FAST:
+            case ReasonMapping.REASON_INSTALL_BULK:
+            case ReasonMapping.REASON_INSTALL_BULK_SECONDARY:
+            case ReasonMapping.REASON_INSTALL_BULK_DOWNGRADED:
+            case ReasonMapping.REASON_INSTALL_BULK_SECONDARY_DOWNGRADED:
+                return FLAG_FOR_PRIMARY_DEX;
+            case ReasonMapping.REASON_INACTIVE:
+                return FLAG_FOR_PRIMARY_DEX | FLAG_FOR_SECONDARY_DEX | FLAG_SHOULD_DOWNGRADE;
+            case ReasonMapping.REASON_FIRST_BOOT:
+            case ReasonMapping.REASON_BOOT_AFTER_OTA:
+                return FLAG_FOR_PRIMARY_DEX | FLAG_SHOULD_INCLUDE_DEPENDENCIES;
+            case ReasonMapping.REASON_BG_DEXOPT:
+            case ReasonMapping.REASON_CMDLINE:
+            default:
+                return FLAG_FOR_PRIMARY_DEX | FLAG_FOR_SECONDARY_DEX
+                        | FLAG_SHOULD_INCLUDE_DEPENDENCIES;
+        }
     }
 
     // Keep in sync with `PriorityClass` except for `PRIORITY_NONE`.
diff --git a/libartservice/service/java/com/android/server/art/model/OptimizeParams.java b/libartservice/service/java/com/android/server/art/model/OptimizeParams.java
index 175d900..0c22337 100644
--- a/libartservice/service/java/com/android/server/art/model/OptimizeParams.java
+++ b/libartservice/service/java/com/android/server/art/model/OptimizeParams.java
@@ -46,7 +46,7 @@
          *         compiler filter must be explicitly set.
          */
         public Builder(@NonNull String reason) {
-            this(reason, ArtFlags.defaultOptimizeFlags());
+            this(reason, ArtFlags.defaultOptimizeFlags(reason));
         }
 
         /**