Use @AutoValue for OptimizationStatus.

Bug: 233383589
Test: atest ArtServiceTests
Ignore-AOSP-First: ART Services.
Change-Id: I195c0faa07e6f3b97dce9d19f3ce1b1d5f9e34a3
diff --git a/libartservice/service/api/system-server-current.txt b/libartservice/service/api/system-server-current.txt
index d22a8c3..395925f 100644
--- a/libartservice/service/api/system-server-current.txt
+++ b/libartservice/service/api/system-server-current.txt
@@ -50,17 +50,17 @@
     method public long getFreedBytes();
   }
 
-  public class OptimizationStatus {
-    method @NonNull public java.util.List<com.android.server.art.model.OptimizationStatus.DexContainerFileOptimizationStatus> getDexContainerFileOptimizationStatuses();
+  public abstract class OptimizationStatus {
+    method @NonNull public abstract java.util.List<com.android.server.art.model.OptimizationStatus.DexContainerFileOptimizationStatus> getDexContainerFileOptimizationStatuses();
   }
 
-  public static class OptimizationStatus.DexContainerFileOptimizationStatus {
-    method @NonNull public String getAbi();
-    method @NonNull public String getCompilationReason();
-    method @NonNull public String getCompilerFilter();
-    method @NonNull public String getDexContainerFile();
-    method @NonNull public String getLocationDebugString();
-    method public boolean isPrimaryAbi();
+  public abstract static class OptimizationStatus.DexContainerFileOptimizationStatus {
+    method @NonNull public abstract String getAbi();
+    method @NonNull public abstract String getCompilationReason();
+    method @NonNull public abstract String getCompilerFilter();
+    method @NonNull public abstract String getDexContainerFile();
+    method @NonNull public abstract String getLocationDebugString();
+    method public abstract boolean isPrimaryAbi();
   }
 
   public class OptimizeParams {
diff --git a/libartservice/service/java/com/android/server/art/ArtManagerLocal.java b/libartservice/service/java/com/android/server/art/ArtManagerLocal.java
index b67fb98..2792a2d 100644
--- a/libartservice/service/java/com/android/server/art/ArtManagerLocal.java
+++ b/libartservice/service/java/com/android/server/art/ArtManagerLocal.java
@@ -207,13 +207,14 @@
                             GetOptimizationStatusResult result =
                                     mInjector.getArtd().getOptimizationStatus(dexInfo.dexPath(),
                                             abi.isa(), dexInfo.classLoaderContext());
-                            statuses.add(new DexContainerFileOptimizationStatus(dexInfo.dexPath(),
-                                    abi.isPrimaryAbi(), abi.name(), result.compilerFilter,
-                                    result.compilationReason, result.locationDebugString));
+                            statuses.add(
+                                    DexContainerFileOptimizationStatus.create(dexInfo.dexPath(),
+                                            abi.isPrimaryAbi(), abi.name(), result.compilerFilter,
+                                            result.compilationReason, result.locationDebugString));
                         } catch (ServiceSpecificException e) {
-                            statuses.add(new DexContainerFileOptimizationStatus(dexInfo.dexPath(),
-                                    abi.isPrimaryAbi(), abi.name(), "error", "error",
-                                    e.getMessage()));
+                            statuses.add(DexContainerFileOptimizationStatus.create(
+                                    dexInfo.dexPath(), abi.isPrimaryAbi(), abi.name(), "error",
+                                    "error", e.getMessage()));
                         }
                     }
                 }
@@ -225,7 +226,7 @@
                         "Getting optimization status of secondary dex'es is not implemented yet");
             }
 
-            return new OptimizationStatus(statuses);
+            return OptimizationStatus.create(statuses);
         } catch (RemoteException e) {
             throw new IllegalStateException("An error occurred when calling artd", e);
         }
diff --git a/libartservice/service/java/com/android/server/art/ArtShellCommand.java b/libartservice/service/java/com/android/server/art/ArtShellCommand.java
index 5f6d6d4..0532dfd 100644
--- a/libartservice/service/java/com/android/server/art/ArtShellCommand.java
+++ b/libartservice/service/java/com/android/server/art/ArtShellCommand.java
@@ -75,15 +75,7 @@
             case "get-optimization-status": {
                 OptimizationStatus optimizationStatus = mArtManagerLocal.getOptimizationStatus(
                         snapshot, getNextArgRequired(), ArtFlags.defaultGetStatusFlags());
-                for (DexContainerFileOptimizationStatus status :
-                        optimizationStatus.getDexContainerFileOptimizationStatuses()) {
-                    pw.printf("dexContainerFile = %s, isPrimaryAbi = %b, abi = %s, "
-                                    + "compilerFilter = %s, compilationReason = %s, "
-                                    + "locationDebugString = %s\n",
-                            status.getDexContainerFile(), status.isPrimaryAbi(), status.getAbi(),
-                            status.getCompilerFilter(), status.getCompilationReason(),
-                            status.getLocationDebugString());
-                }
+                pw.println(optimizationStatus);
                 return 0;
             }
             case "optimize-package": {
diff --git a/libartservice/service/java/com/android/server/art/model/OptimizationStatus.java b/libartservice/service/java/com/android/server/art/model/OptimizationStatus.java
index f156e97..c4c817c 100644
--- a/libartservice/service/java/com/android/server/art/model/OptimizationStatus.java
+++ b/libartservice/service/java/com/android/server/art/model/OptimizationStatus.java
@@ -21,6 +21,8 @@
 
 import com.android.internal.annotations.Immutable;
 
+import com.google.auto.value.AutoValue;
+
 import java.util.ArrayList;
 import java.util.List;
 
@@ -31,68 +33,57 @@
  */
 @SystemApi(client = SystemApi.Client.SYSTEM_SERVER)
 @Immutable
-public class OptimizationStatus {
-    private final
-            @NonNull List<DexContainerFileOptimizationStatus> mDexContainerFileOptimizationStatuses;
+@AutoValue
+public abstract class OptimizationStatus {
+    /** @hide */
+    protected OptimizationStatus() {}
 
     /** @hide */
-    public OptimizationStatus(@NonNull List<DexContainerFileOptimizationStatus>
-                    dexContainerFileOptimizationStatuses) {
-        mDexContainerFileOptimizationStatuses = dexContainerFileOptimizationStatuses;
+    public static @NonNull OptimizationStatus
+    create(@NonNull List<DexContainerFileOptimizationStatus> dexContainerFileOptimizationStatuses) {
+        return new AutoValue_OptimizationStatus(dexContainerFileOptimizationStatuses);
     }
 
     /**
-     * The statuses of the dex container file optimizations. Note that there can be
-     * multiple entries for the same dex container file, but for different ABIs.
+     * The statuses of the dex container file optimizations. Note that there can be multiple entries
+     * for the same dex container file, but for different ABIs.
      */
     @NonNull
-    public List<DexContainerFileOptimizationStatus> getDexContainerFileOptimizationStatuses() {
-        return mDexContainerFileOptimizationStatuses;
-    }
+    public abstract List<DexContainerFileOptimizationStatus>
+    getDexContainerFileOptimizationStatuses();
 
     /** Describes the optimization status of a dex container file. */
     @Immutable
-    public static class DexContainerFileOptimizationStatus {
-        private final @NonNull String mDexContainerFile;
-        private final @NonNull boolean mIsPrimaryAbi;
-        private final @NonNull String mAbi;
-        private final @NonNull String mCompilerFilter;
-        private final @NonNull String mCompilationReason;
-        private final @NonNull String mLocationDebugString;
+    @AutoValue
+    public abstract static class DexContainerFileOptimizationStatus {
+        /** @hide */
+        protected DexContainerFileOptimizationStatus() {}
 
         /** @hide */
-        public DexContainerFileOptimizationStatus(@NonNull String dexContainerFile,
-                boolean isPrimaryAbi, @NonNull String abi, @NonNull String compilerFilter,
-                @NonNull String compilationReason, @NonNull String locationDebugString) {
-            mDexContainerFile = dexContainerFile;
-            mIsPrimaryAbi = isPrimaryAbi;
-            mAbi = abi;
-            mCompilerFilter = compilerFilter;
-            mCompilationReason = compilationReason;
-            mLocationDebugString = locationDebugString;
+        public static @NonNull DexContainerFileOptimizationStatus create(
+                @NonNull String dexContainerFile, boolean isPrimaryAbi, @NonNull String abi,
+                @NonNull String compilerFilter, @NonNull String compilationReason,
+                @NonNull String locationDebugString) {
+            return new AutoValue_OptimizationStatus_DexContainerFileOptimizationStatus(
+                    dexContainerFile, isPrimaryAbi, abi, compilerFilter, compilationReason,
+                    locationDebugString);
         }
 
         /** The absolute path to the dex container file. */
-        public @NonNull String getDexContainerFile() {
-            return mDexContainerFile;
-        }
+        public abstract @NonNull String getDexContainerFile();
 
         /**
          * If true, the optimization is for the primary ABI of the package (the ABI that the
          * application is launched with). Otherwise, the optimization is for an ABI that other
          * applications might be launched with when using this application's code.
          */
-        public boolean isPrimaryAbi() {
-            return mIsPrimaryAbi;
-        }
+        public abstract boolean isPrimaryAbi();
 
         /**
          * Returns the ABI that the optimization is for. Possible values are documented at
          * https://developer.android.com/ndk/guides/abis#sa.
          */
-        public @NonNull String getAbi() {
-            return mAbi;
-        }
+        public abstract @NonNull String getAbi();
 
         /**
          * A human-readable string that describes the compiler filter.
@@ -108,9 +99,7 @@
          *   <li>{@code "error"}, if an unexpected error occurs.
          * </ul>
          */
-        public @NonNull String getCompilerFilter() {
-            return mCompilerFilter;
-        }
+        public abstract @NonNull String getCompilerFilter();
 
         /**
          * A string that describes the compilation reason.
@@ -122,9 +111,7 @@
          *   <li>{@code "error"}: if an unexpected error occurs.
          * </ul>
          */
-        public @NonNull String getCompilationReason() {
-            return mCompilationReason;
-        }
+        public abstract @NonNull String getCompilationReason();
 
         /**
          * A human-readable string that describes the location of the optimized artifacts.
@@ -132,8 +119,6 @@
          * Note that this string is for debugging purposes only. There is no stability guarantees
          * for the format of the string. DO NOT use it programmatically.
          */
-        public @NonNull String getLocationDebugString() {
-            return mLocationDebugString;
-        }
+        public abstract @NonNull String getLocationDebugString();
     }
 }