Merge "Added check for user info is not null"
diff --git a/Android.bp b/Android.bp
index aad023d..928386c 100644
--- a/Android.bp
+++ b/Android.bp
@@ -365,6 +365,15 @@
     name: "framework-minus-apex-intdefs",
     defaults: ["framework-minus-apex-defaults"],
     plugins: ["intdef-annotation-processor"],
+
+    // Errorprone and android lint will already run on framework-minus-apex, don't rerun them on
+    // the intdefs version in order to speed up the build.
+    errorprone: {
+        enabled: false,
+    },
+    lint: {
+        enabled: false,
+    },
 }
 
 // This "framework" module is NOT installed to the device. It's
diff --git a/apct-tests/perftests/OWNERS b/apct-tests/perftests/OWNERS
index 7e7feaf..4c57e64 100644
--- a/apct-tests/perftests/OWNERS
+++ b/apct-tests/perftests/OWNERS
@@ -4,6 +4,7 @@
 dualli@google.com
 edgararriaga@google.com
 jpakaravoor@google.com
+jreck@google.com #{LAST_RESORT_SUGGESTION}
 kevinjeon@google.com
 philipcuadra@google.com
 shombert@google.com
diff --git a/apct-tests/perftests/blobstore/src/com/android/perftests/blob/BlobStorePerfTests.java b/apct-tests/perftests/blobstore/src/com/android/perftests/blob/BlobStorePerfTests.java
index 3781b6d..03e5468 100644
--- a/apct-tests/perftests/blobstore/src/com/android/perftests/blob/BlobStorePerfTests.java
+++ b/apct-tests/perftests/blobstore/src/com/android/perftests/blob/BlobStorePerfTests.java
@@ -257,7 +257,7 @@
         runShellCommand(String.format(
                 "cmd blob_store delete-blob --algo %s --digest %s --label %s --expiry %d --tag %s",
                 blobHandle.algorithm,
-                Base64.getEncoder().encode(blobHandle.digest),
+                Base64.getEncoder().encodeToString(blobHandle.digest),
                 blobHandle.label,
                 blobHandle.expiryTimeMillis,
                 blobHandle.tag));
diff --git a/apct-tests/perftests/core/OWNERS b/apct-tests/perftests/core/OWNERS
index 2b3564e..8fb057d 100644
--- a/apct-tests/perftests/core/OWNERS
+++ b/apct-tests/perftests/core/OWNERS
@@ -1,3 +1,4 @@
+include /graphics/java/android/graphics/OWNERS
 include /graphics/java/android/graphics/fonts/OWNERS
 
 # Bug component: 568761
diff --git a/cmds/abx/Android.bp b/cmds/abx/Android.bp
index 50a0b75..a832dea 100644
--- a/cmds/abx/Android.bp
+++ b/cmds/abx/Android.bp
@@ -1,4 +1,3 @@
-
 package {
     default_applicable_licenses: ["frameworks_base_cmds_abx_license"],
 }
@@ -18,7 +17,7 @@
 
 java_binary {
     name: "abx",
-    wrapper: "abx",
+    wrapper: "abx.sh",
     srcs: ["**/*.java"],
     required: [
         "abx2xml",
@@ -28,10 +27,10 @@
 
 sh_binary {
     name: "abx2xml",
-    src: "abx2xml",
+    src: "abx2xml.sh",
 }
 
 sh_binary {
     name: "xml2abx",
-    src: "xml2abx",
+    src: "xml2abx.sh",
 }
diff --git a/cmds/abx/abx b/cmds/abx/abx.sh
similarity index 100%
rename from cmds/abx/abx
rename to cmds/abx/abx.sh
diff --git a/cmds/abx/abx2xml b/cmds/abx/abx2xml
deleted file mode 100755
index 0a9362d..0000000
--- a/cmds/abx/abx2xml
+++ /dev/null
@@ -1,3 +0,0 @@
-#!/system/bin/sh
-export CLASSPATH=/system/framework/abx.jar
-exec app_process /system/bin com.android.commands.abx.Abx "$0" "$@"
diff --git a/cmds/abx/abx b/cmds/abx/abx2xml.sh
similarity index 100%
copy from cmds/abx/abx
copy to cmds/abx/abx2xml.sh
diff --git a/cmds/abx/xml2abx b/cmds/abx/xml2abx
deleted file mode 100755
index 0a9362d..0000000
--- a/cmds/abx/xml2abx
+++ /dev/null
@@ -1,3 +0,0 @@
-#!/system/bin/sh
-export CLASSPATH=/system/framework/abx.jar
-exec app_process /system/bin com.android.commands.abx.Abx "$0" "$@"
diff --git a/cmds/abx/abx b/cmds/abx/xml2abx.sh
similarity index 100%
copy from cmds/abx/abx
copy to cmds/abx/xml2abx.sh
diff --git a/cmds/app_process/app_main.cpp b/cmds/app_process/app_main.cpp
index 12083b6..28db61f 100644
--- a/cmds/app_process/app_main.cpp
+++ b/cmds/app_process/app_main.cpp
@@ -334,7 +334,7 @@
 
     if (zygote) {
         runtime.start("com.android.internal.os.ZygoteInit", args, zygote);
-    } else if (className) {
+    } else if (!className.isEmpty()) {
         runtime.start("com.android.internal.os.RuntimeInit", args, zygote);
     } else {
         fprintf(stderr, "Error: no class name or --zygote supplied.\n");
diff --git a/cmds/bmgr/Android.bp b/cmds/bmgr/Android.bp
index 14beb55..a85669a 100644
--- a/cmds/bmgr/Android.bp
+++ b/cmds/bmgr/Android.bp
@@ -20,6 +20,6 @@
 
 java_binary {
     name: "bmgr",
-    wrapper: "bmgr",
+    wrapper: "bmgr.sh",
     srcs: ["**/*.java"],
 }
diff --git a/cmds/bmgr/bmgr b/cmds/bmgr/bmgr.sh
similarity index 100%
rename from cmds/bmgr/bmgr
rename to cmds/bmgr/bmgr.sh
diff --git a/cmds/bu/Android.bp b/cmds/bu/Android.bp
index 5b4ec31..b61a7a6 100644
--- a/cmds/bu/Android.bp
+++ b/cmds/bu/Android.bp
@@ -20,6 +20,6 @@
 
 java_binary {
     name: "bu",
-    wrapper: "bu",
+    wrapper: "bu.sh",
     srcs: ["**/*.java"],
 }
diff --git a/cmds/bu/bu b/cmds/bu/bu.sh
similarity index 100%
rename from cmds/bu/bu
rename to cmds/bu/bu.sh
diff --git a/cmds/content/Android.bp b/cmds/content/Android.bp
index c70d01e..0dd0f03 100644
--- a/cmds/content/Android.bp
+++ b/cmds/content/Android.bp
@@ -19,6 +19,6 @@
 
 java_binary {
     name: "content",
-    wrapper: "content",
+    wrapper: "content.sh",
     srcs: ["**/*.java"],
 }
diff --git a/cmds/content/content b/cmds/content/content.sh
similarity index 100%
rename from cmds/content/content
rename to cmds/content/content.sh
diff --git a/cmds/device_config/Android.bp b/cmds/device_config/Android.bp
index 69572d8..83b2730 100644
--- a/cmds/device_config/Android.bp
+++ b/cmds/device_config/Android.bp
@@ -14,5 +14,5 @@
 
 sh_binary {
     name: "device_config",
-    src: "device_config",
+    src: "device_config.sh",
 }
diff --git a/cmds/device_config/device_config b/cmds/device_config/device_config.sh
similarity index 100%
rename from cmds/device_config/device_config
rename to cmds/device_config/device_config.sh
diff --git a/cmds/dpm/Android.bp b/cmds/dpm/Android.bp
index 6819d09..29bee49 100644
--- a/cmds/dpm/Android.bp
+++ b/cmds/dpm/Android.bp
@@ -20,5 +20,5 @@
 
 sh_binary {
     name: "dpm",
-    src: "dpm",
+    src: "dpm.sh",
 }
diff --git a/cmds/dpm/dpm b/cmds/dpm/dpm.sh
similarity index 100%
rename from cmds/dpm/dpm
rename to cmds/dpm/dpm.sh
diff --git a/cmds/hid/Android.bp b/cmds/hid/Android.bp
index 295c71c..a6e2769 100644
--- a/cmds/hid/Android.bp
+++ b/cmds/hid/Android.bp
@@ -20,7 +20,7 @@
 
 java_binary {
     name: "hid",
-    wrapper: "hid",
+    wrapper: "hid.sh",
     srcs: ["**/*.java"],
     required: ["libhidcommand_jni"],
 }
diff --git a/cmds/hid/hid b/cmds/hid/hid.sh
similarity index 100%
rename from cmds/hid/hid
rename to cmds/hid/hid.sh
diff --git a/cmds/idmap2/include/idmap2/SysTrace.h b/cmds/idmap2/include/idmap2/SysTrace.h
index 19b4353..fcadf96 100644
--- a/cmds/idmap2/include/idmap2/SysTrace.h
+++ b/cmds/idmap2/include/idmap2/SysTrace.h
@@ -17,8 +17,6 @@
 #ifndef IDMAP2_INCLUDE_IDMAP2_SYSTRACE_H_
 #define IDMAP2_INCLUDE_IDMAP2_SYSTRACE_H_
 
-#define ATRACE_TAG ATRACE_TAG_RRO
-
 #include <sstream>
 #include <vector>
 
@@ -29,16 +27,12 @@
 
 class ScopedTraceNoStart {
  public:
-  ~ScopedTraceNoStart() {
-    ATRACE_END();
-  }
+  ~ScopedTraceNoStart();
 };
 
 class ScopedTraceMessageHelper {
  public:
-  ~ScopedTraceMessageHelper() {
-    ATRACE_BEGIN(buffer_.str().c_str());
-  }
+  ~ScopedTraceMessageHelper();
 
   std::ostream& stream() {
     return buffer_;
@@ -48,9 +42,12 @@
   std::ostringstream buffer_;
 };
 
+bool atrace_enabled();
+
 #define SYSTRACE                                               \
   android::idmap2::utils::ScopedTraceNoStart _trace##__LINE__; \
-  (ATRACE_ENABLED()) && android::idmap2::utils::ScopedTraceMessageHelper().stream()
+  android::idmap2::utils::atrace_enabled() \
+  && android::idmap2::utils::ScopedTraceMessageHelper().stream()
 
 #else
 
diff --git a/cmds/idmap2/libidmap2/CommandLineOptions.cpp b/cmds/idmap2/libidmap2/CommandLineOptions.cpp
index 5b0ae92..8129d99 100644
--- a/cmds/idmap2/libidmap2/CommandLineOptions.cpp
+++ b/cmds/idmap2/libidmap2/CommandLineOptions.cpp
@@ -17,6 +17,7 @@
 #include "idmap2/CommandLineOptions.h"
 
 #include <algorithm>
+#include <cassert>
 #include <iomanip>
 #include <iostream>
 #include <memory>
diff --git a/cmds/idmap2/libidmap2/Idmap.cpp b/cmds/idmap2/libidmap2/Idmap.cpp
index 6515d55..06650f6 100644
--- a/cmds/idmap2/libidmap2/Idmap.cpp
+++ b/cmds/idmap2/libidmap2/Idmap.cpp
@@ -17,6 +17,7 @@
 #include "idmap2/Idmap.h"
 
 #include <algorithm>
+#include <cassert>
 #include <iostream>
 #include <iterator>
 #include <limits>
diff --git a/cmds/idmap2/libidmap2/SysTrace.cpp b/cmds/idmap2/libidmap2/SysTrace.cpp
new file mode 100644
index 0000000..55d45b7
--- /dev/null
+++ b/cmds/idmap2/libidmap2/SysTrace.cpp
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define ATRACE_TAG ATRACE_TAG_RRO
+
+#include "idmap2/SysTrace.h"
+
+#ifdef __ANDROID__
+namespace android::idmap2::utils {
+
+ScopedTraceNoStart::~ScopedTraceNoStart() {
+    ATRACE_END();
+};
+
+ScopedTraceMessageHelper::~ScopedTraceMessageHelper() {
+    ATRACE_BEGIN(buffer_.str().c_str());
+}
+
+bool atrace_enabled() {
+    return ATRACE_ENABLED();
+}
+}  // namespace android::idmap2::utils
+#endif
diff --git a/cmds/ime/Android.bp b/cmds/ime/Android.bp
index 6dd3ba1..5f54ffa 100644
--- a/cmds/ime/Android.bp
+++ b/cmds/ime/Android.bp
@@ -20,5 +20,5 @@
 
 sh_binary {
     name: "ime",
-    src: "ime",
+    src: "ime.sh",
 }
diff --git a/cmds/ime/ime b/cmds/ime/ime.sh
similarity index 100%
rename from cmds/ime/ime
rename to cmds/ime/ime.sh
diff --git a/cmds/input/Android.bp b/cmds/input/Android.bp
index 2e30176..8f44f3e 100644
--- a/cmds/input/Android.bp
+++ b/cmds/input/Android.bp
@@ -20,5 +20,5 @@
 
 sh_binary {
     name: "input",
-    src: "input",
+    src: "input.sh",
 }
diff --git a/cmds/input/input b/cmds/input/input.sh
similarity index 100%
rename from cmds/input/input
rename to cmds/input/input.sh
diff --git a/cmds/locksettings/Android.bp b/cmds/locksettings/Android.bp
index 3869c8f..5ee5824 100644
--- a/cmds/locksettings/Android.bp
+++ b/cmds/locksettings/Android.bp
@@ -23,6 +23,6 @@
 
 java_binary {
     name: "locksettings",
-    wrapper: "locksettings",
+    wrapper: "locksettings.sh",
     srcs: ["**/*.java"],
 }
diff --git a/cmds/locksettings/locksettings b/cmds/locksettings/locksettings.sh
similarity index 100%
rename from cmds/locksettings/locksettings
rename to cmds/locksettings/locksettings.sh
diff --git a/cmds/pm/Android.bp b/cmds/pm/Android.bp
index 847dbab..0e61a9e 100644
--- a/cmds/pm/Android.bp
+++ b/cmds/pm/Android.bp
@@ -20,5 +20,5 @@
 
 sh_binary {
     name: "pm",
-    src: "pm",
+    src: "pm.sh",
 }
diff --git a/cmds/pm/pm b/cmds/pm/pm.sh
similarity index 100%
rename from cmds/pm/pm
rename to cmds/pm/pm.sh
diff --git a/cmds/requestsync/Android.bp b/cmds/requestsync/Android.bp
index 57e8dd3..8718f79 100644
--- a/cmds/requestsync/Android.bp
+++ b/cmds/requestsync/Android.bp
@@ -20,6 +20,6 @@
 
 java_binary {
     name: "requestsync",
-    wrapper: "requestsync",
+    wrapper: "requestsync.sh",
     srcs: ["**/*.java"],
 }
diff --git a/cmds/requestsync/requestsync b/cmds/requestsync/requestsync.sh
similarity index 100%
rename from cmds/requestsync/requestsync
rename to cmds/requestsync/requestsync.sh
diff --git a/cmds/screencap/OWNERS b/cmds/screencap/OWNERS
new file mode 100644
index 0000000..89f1177
--- /dev/null
+++ b/cmds/screencap/OWNERS
@@ -0,0 +1,2 @@
+include /graphics/java/android/graphics/OWNERS
+include /services/core/java/com/android/server/wm/OWNERS
diff --git a/cmds/settings/Android.bp b/cmds/settings/Android.bp
index cc73006..8180fd6 100644
--- a/cmds/settings/Android.bp
+++ b/cmds/settings/Android.bp
@@ -14,5 +14,5 @@
 
 sh_binary {
     name: "settings",
-    src: "settings",
+    src: "settings.sh",
 }
diff --git a/cmds/settings/settings b/cmds/settings/settings.sh
similarity index 100%
rename from cmds/settings/settings
rename to cmds/settings/settings.sh
diff --git a/cmds/sm/Android.bp b/cmds/sm/Android.bp
index ecfacae..403022a 100644
--- a/cmds/sm/Android.bp
+++ b/cmds/sm/Android.bp
@@ -20,6 +20,6 @@
 
 java_binary {
     name: "sm",
-    wrapper: "sm",
+    wrapper: "sm.sh",
     srcs: ["**/*.java"],
 }
diff --git a/cmds/sm/sm b/cmds/sm/sm.sh
similarity index 100%
rename from cmds/sm/sm
rename to cmds/sm/sm.sh
diff --git a/cmds/svc/Android.bp b/cmds/svc/Android.bp
index 41a3ebd..a246087 100644
--- a/cmds/svc/Android.bp
+++ b/cmds/svc/Android.bp
@@ -20,6 +20,6 @@
 
 java_binary {
     name: "svc",
-    wrapper: "svc",
+    wrapper: "svc.sh",
     srcs: ["**/*.java"],
 }
diff --git a/cmds/svc/svc b/cmds/svc/svc.sh
similarity index 100%
rename from cmds/svc/svc
rename to cmds/svc/svc.sh
diff --git a/cmds/telecom/Android.bp b/cmds/telecom/Android.bp
index 4da79c5..be02710 100644
--- a/cmds/telecom/Android.bp
+++ b/cmds/telecom/Android.bp
@@ -20,6 +20,6 @@
 
 java_binary {
     name: "telecom",
-    wrapper: "telecom",
+    wrapper: "telecom.sh",
     srcs: ["**/*.java"],
 }
diff --git a/cmds/telecom/telecom b/cmds/telecom/telecom.sh
similarity index 100%
rename from cmds/telecom/telecom
rename to cmds/telecom/telecom.sh
diff --git a/cmds/uiautomator/cmds/uiautomator/Android.bp b/cmds/uiautomator/cmds/uiautomator/Android.bp
index 56e2e70..5132386 100644
--- a/cmds/uiautomator/cmds/uiautomator/Android.bp
+++ b/cmds/uiautomator/cmds/uiautomator/Android.bp
@@ -25,7 +25,7 @@
 
 java_binary {
     name: "uiautomator",
-    wrapper: "uiautomator",
+    wrapper: "uiautomator.sh",
     srcs: ["src/**/*.java"],
     static_libs: ["uiautomator.core"],
 }
diff --git a/cmds/uiautomator/cmds/uiautomator/uiautomator b/cmds/uiautomator/cmds/uiautomator/uiautomator.sh
similarity index 100%
rename from cmds/uiautomator/cmds/uiautomator/uiautomator
rename to cmds/uiautomator/cmds/uiautomator/uiautomator.sh
diff --git a/cmds/uinput/Android.bp b/cmds/uinput/Android.bp
index 260cfc7..4b08d96 100644
--- a/cmds/uinput/Android.bp
+++ b/cmds/uinput/Android.bp
@@ -20,9 +20,10 @@
 
 java_binary {
     name: "uinput",
-    wrapper: "uinput",
-    srcs: ["**/*.java",
-           ":uinputcommand_aidl"
+    wrapper: "uinput.sh",
+    srcs: [
+        "**/*.java",
+        ":uinputcommand_aidl",
     ],
     required: ["libuinputcommand_jni"],
 }
diff --git a/cmds/uinput/uinput b/cmds/uinput/uinput.sh
similarity index 100%
rename from cmds/uinput/uinput
rename to cmds/uinput/uinput.sh
diff --git a/cmds/vr/Android.bp b/cmds/vr/Android.bp
index 8936491..61795b4c 100644
--- a/cmds/vr/Android.bp
+++ b/cmds/vr/Android.bp
@@ -20,6 +20,6 @@
 
 java_binary {
     name: "vr",
-    wrapper: "vr",
+    wrapper: "vr.sh",
     srcs: ["**/*.java"],
 }
diff --git a/cmds/vr/vr b/cmds/vr/vr.sh
similarity index 100%
rename from cmds/vr/vr
rename to cmds/vr/vr.sh
diff --git a/cmds/wm/Android.bp b/cmds/wm/Android.bp
index cf6b019..4d00f17 100644
--- a/cmds/wm/Android.bp
+++ b/cmds/wm/Android.bp
@@ -20,5 +20,5 @@
 
 sh_binary {
     name: "wm",
-    src: "wm",
+    src: "wm.sh",
 }
diff --git a/cmds/wm/wm b/cmds/wm/wm.sh
similarity index 100%
rename from cmds/wm/wm
rename to cmds/wm/wm.sh
diff --git a/core/api/current.txt b/core/api/current.txt
index 584c67f..644a194 100644
--- a/core/api/current.txt
+++ b/core/api/current.txt
@@ -32083,6 +32083,7 @@
     method @NonNull public android.os.StrictMode.ThreadPolicy.Builder detectCustomSlowCalls();
     method @NonNull public android.os.StrictMode.ThreadPolicy.Builder detectDiskReads();
     method @NonNull public android.os.StrictMode.ThreadPolicy.Builder detectDiskWrites();
+    method @NonNull public android.os.StrictMode.ThreadPolicy.Builder detectExplicitGc();
     method @NonNull public android.os.StrictMode.ThreadPolicy.Builder detectNetwork();
     method @NonNull public android.os.StrictMode.ThreadPolicy.Builder detectResourceMismatches();
     method @NonNull public android.os.StrictMode.ThreadPolicy.Builder detectUnbufferedIo();
@@ -32097,6 +32098,7 @@
     method @NonNull public android.os.StrictMode.ThreadPolicy.Builder permitCustomSlowCalls();
     method @NonNull public android.os.StrictMode.ThreadPolicy.Builder permitDiskReads();
     method @NonNull public android.os.StrictMode.ThreadPolicy.Builder permitDiskWrites();
+    method @NonNull public android.os.StrictMode.ThreadPolicy.Builder permitExplicitGc();
     method @NonNull public android.os.StrictMode.ThreadPolicy.Builder permitNetwork();
     method @NonNull public android.os.StrictMode.ThreadPolicy.Builder permitResourceMismatches();
     method @NonNull public android.os.StrictMode.ThreadPolicy.Builder permitUnbufferedIo();
@@ -32650,6 +32652,9 @@
   public final class DiskWriteViolation extends android.os.strictmode.Violation {
   }
 
+  public final class ExplicitGcViolation extends android.os.strictmode.Violation {
+  }
+
   public final class FileUriExposedViolation extends android.os.strictmode.Violation {
   }
 
@@ -42192,6 +42197,7 @@
     field public static final int IRAT_HANDOVER_FAILED = 2194; // 0x892
     field public static final int IS707B_MAX_ACCESS_PROBES = 2089; // 0x829
     field public static final int IWLAN_AUTHORIZATION_REJECTED = 9003; // 0x232b
+    field public static final int IWLAN_CONGESTION = 15500; // 0x3c8c
     field public static final int IWLAN_DNS_RESOLUTION_NAME_FAILURE = 16388; // 0x4004
     field public static final int IWLAN_DNS_RESOLUTION_TIMEOUT = 16389; // 0x4005
     field public static final int IWLAN_IKEV2_AUTH_FAILURE = 16385; // 0x4001
diff --git a/core/api/test-current.txt b/core/api/test-current.txt
index 9253228..03818a5 100644
--- a/core/api/test-current.txt
+++ b/core/api/test-current.txt
@@ -1815,10 +1815,6 @@
     method public static void setViolationLogger(android.os.StrictMode.ViolationLogger);
   }
 
-  public static final class StrictMode.ThreadPolicy.Builder {
-    method @NonNull public android.os.StrictMode.ThreadPolicy.Builder detectExplicitGc();
-  }
-
   public static final class StrictMode.ViolationInfo implements android.os.Parcelable {
     ctor public StrictMode.ViolationInfo(android.os.Parcel);
     ctor public StrictMode.ViolationInfo(android.os.Parcel, boolean);
@@ -2055,13 +2051,6 @@
 
 }
 
-package android.os.strictmode {
-
-  public final class ExplicitGcViolation extends android.os.strictmode.Violation {
-  }
-
-}
-
 package android.os.vibrator {
 
   public final class PrebakedSegment extends android.os.vibrator.VibrationEffectSegment {
diff --git a/core/java/android/app/TEST_MAPPING b/core/java/android/app/TEST_MAPPING
index 32207af..a2e4239 100644
--- a/core/java/android/app/TEST_MAPPING
+++ b/core/java/android/app/TEST_MAPPING
@@ -121,6 +121,9 @@
                     "include-annotation": "android.platform.test.annotations.Presubmit"
                 },
                 {
+                    "exclude-annotation": "android.platform.test.annotations.LargeTest"
+                },
+                {
                     "exclude-annotation": "androidx.test.filters.FlakyTest"
                 },
                 {
diff --git a/core/java/android/app/VoiceInteractor.java b/core/java/android/app/VoiceInteractor.java
index 7014d69..a5a50d6 100644
--- a/core/java/android/app/VoiceInteractor.java
+++ b/core/java/android/app/VoiceInteractor.java
@@ -43,6 +43,7 @@
 import java.io.PrintWriter;
 import java.lang.ref.WeakReference;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Objects;
 import java.util.concurrent.Executor;
 
@@ -1103,7 +1104,10 @@
         }
         try {
             boolean[] res = mInteractor.supportsCommands(mContext.getOpPackageName(), commands);
-            if (DEBUG) Log.d(TAG, "supportsCommands: cmds=" + commands + " res=" + res);
+            if (DEBUG) {
+                Log.d(TAG, "supportsCommands: cmds=" + Arrays.toString(commands) + " res="
+                        + Arrays.toString(res));
+            }
             return res;
         } catch (RemoteException e) {
             throw new RuntimeException("Voice interactor has died", e);
diff --git a/core/java/android/app/admin/PreferentialNetworkServiceConfig.java b/core/java/android/app/admin/PreferentialNetworkServiceConfig.java
index 24b4f4b..63c9839 100644
--- a/core/java/android/app/admin/PreferentialNetworkServiceConfig.java
+++ b/core/java/android/app/admin/PreferentialNetworkServiceConfig.java
@@ -203,17 +203,14 @@
         return mIsEnabled == that.mIsEnabled
                 && mAllowFallbackToDefaultConnection == that.mAllowFallbackToDefaultConnection
                 && mNetworkId == that.mNetworkId
-                && Objects.equals(mIncludedUids, that.mIncludedUids)
-                && Objects.equals(mExcludedUids, that.mExcludedUids);
+                && Arrays.equals(mIncludedUids, that.mIncludedUids)
+                && Arrays.equals(mExcludedUids, that.mExcludedUids);
     }
 
     @Override
     public int hashCode() {
-        return ((Objects.hashCode(mIsEnabled) * 17)
-                + (Objects.hashCode(mAllowFallbackToDefaultConnection) * 19)
-                + (Objects.hashCode(mIncludedUids) * 23)
-                + (Objects.hashCode(mExcludedUids) * 29)
-                + mNetworkId * 31);
+        return Objects.hash(mIsEnabled, mAllowFallbackToDefaultConnection,
+                Arrays.hashCode(mIncludedUids), Arrays.hashCode(mExcludedUids), mNetworkId);
     }
 
     /**
diff --git a/core/java/android/companion/BluetoothLeDeviceFilter.java b/core/java/android/companion/BluetoothLeDeviceFilter.java
index e6091f0..2934cd2 100644
--- a/core/java/android/companion/BluetoothLeDeviceFilter.java
+++ b/core/java/android/companion/BluetoothLeDeviceFilter.java
@@ -204,9 +204,10 @@
 
     @Override
     public int hashCode() {
-        return Objects.hash(mNamePattern, mScanFilter, mRawDataFilter, mRawDataFilterMask,
-                mRenamePrefix, mRenameSuffix, mRenameBytesFrom, mRenameBytesLength,
-                mRenameNameFrom, mRenameNameLength, mRenameBytesReverseOrder);
+        return Objects.hash(mNamePattern, mScanFilter, Arrays.hashCode(mRawDataFilter),
+                Arrays.hashCode(mRawDataFilterMask), mRenamePrefix, mRenameSuffix,
+                mRenameBytesFrom, mRenameBytesLength, mRenameNameFrom, mRenameNameLength,
+                mRenameBytesReverseOrder);
     }
 
     @Override
diff --git a/core/java/android/content/AttributionSource.java b/core/java/android/content/AttributionSource.java
index 3f2fa21..b0c6cbc 100644
--- a/core/java/android/content/AttributionSource.java
+++ b/core/java/android/content/AttributionSource.java
@@ -495,14 +495,9 @@
 
     @Override
     public int hashCode() {
-        int _hash = 1;
-        _hash = 31 * _hash + mAttributionSourceState.uid;
-        _hash = 31 * _hash + Objects.hashCode(mAttributionSourceState.packageName);
-        _hash = 31 * _hash + Objects.hashCode(mAttributionSourceState.attributionTag);
-        _hash = 31 * _hash + Objects.hashCode(mAttributionSourceState.token);
-        _hash = 31 * _hash + Objects.hashCode(mAttributionSourceState.renouncedPermissions);
-        _hash = 31 * _hash + Objects.hashCode(getNext());
-        return _hash;
+        return Objects.hash(mAttributionSourceState.uid, mAttributionSourceState.packageName,
+                mAttributionSourceState.attributionTag, mAttributionSourceState.token,
+                Arrays.hashCode(mAttributionSourceState.renouncedPermissions), getNext());
     }
 
     @Override
diff --git a/core/java/android/content/TEST_MAPPING b/core/java/android/content/TEST_MAPPING
index 5bb845d..dac79e7 100644
--- a/core/java/android/content/TEST_MAPPING
+++ b/core/java/android/content/TEST_MAPPING
@@ -7,6 +7,9 @@
           "include-annotation": "android.platform.test.annotations.Presubmit"
         },
         {
+          "exclude-annotation": "android.platform.test.annotations.LargeTest"
+        },
+        {
           "exclude-annotation": "androidx.test.filters.FlakyTest"
         },
         {
diff --git a/core/java/android/content/pm/LauncherApps.java b/core/java/android/content/pm/LauncherApps.java
index 301d1bbc..364aa90 100644
--- a/core/java/android/content/pm/LauncherApps.java
+++ b/core/java/android/content/pm/LauncherApps.java
@@ -1723,7 +1723,8 @@
         public void onPackagesAvailable(UserHandle user, String[] packageNames, boolean replacing)
                 throws RemoteException {
             if (DEBUG) {
-                Log.d(TAG, "onPackagesAvailable " + user.getIdentifier() + "," + packageNames);
+                Log.d(TAG, "onPackagesAvailable " + user.getIdentifier() + ","
+                        + Arrays.toString(packageNames));
             }
             synchronized (LauncherApps.this) {
                 for (CallbackMessageHandler callback : mCallbacks) {
@@ -1736,7 +1737,8 @@
         public void onPackagesUnavailable(UserHandle user, String[] packageNames, boolean replacing)
                 throws RemoteException {
             if (DEBUG) {
-                Log.d(TAG, "onPackagesUnavailable " + user.getIdentifier() + "," + packageNames);
+                Log.d(TAG, "onPackagesUnavailable " + user.getIdentifier() + ","
+                        + Arrays.toString(packageNames));
             }
             synchronized (LauncherApps.this) {
                 for (CallbackMessageHandler callback : mCallbacks) {
@@ -1750,7 +1752,8 @@
                 Bundle launcherExtras)
                 throws RemoteException {
             if (DEBUG) {
-                Log.d(TAG, "onPackagesSuspended " + user.getIdentifier() + "," + packageNames);
+                Log.d(TAG, "onPackagesSuspended " + user.getIdentifier() + ","
+                        + Arrays.toString(packageNames));
             }
             synchronized (LauncherApps.this) {
                 for (CallbackMessageHandler callback : mCallbacks) {
@@ -1763,7 +1766,8 @@
         public void onPackagesUnsuspended(UserHandle user, String[] packageNames)
                 throws RemoteException {
             if (DEBUG) {
-                Log.d(TAG, "onPackagesUnsuspended " + user.getIdentifier() + "," + packageNames);
+                Log.d(TAG, "onPackagesUnsuspended " + user.getIdentifier() + ","
+                        + Arrays.toString(packageNames));
             }
             synchronized (LauncherApps.this) {
                 for (CallbackMessageHandler callback : mCallbacks) {
diff --git a/core/java/android/content/pm/ShortcutInfo.java b/core/java/android/content/pm/ShortcutInfo.java
index 52774e3..1f83d75 100644
--- a/core/java/android/content/pm/ShortcutInfo.java
+++ b/core/java/android/content/pm/ShortcutInfo.java
@@ -53,6 +53,7 @@
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
@@ -2617,7 +2618,7 @@
         addIndentOrComma(sb, indent);
 
         sb.append("persons=");
-        sb.append(mPersons);
+        sb.append(Arrays.toString(mPersons));
 
         addIndentOrComma(sb, indent);
 
diff --git a/core/java/android/content/res/GradientColor.java b/core/java/android/content/res/GradientColor.java
index 35ad503..7bc551d 100644
--- a/core/java/android/content/res/GradientColor.java
+++ b/core/java/android/content/res/GradientColor.java
@@ -22,13 +22,6 @@
 import android.annotation.Nullable;
 import android.content.pm.ActivityInfo.Config;
 import android.content.res.Resources.Theme;
-
-import com.android.internal.R;
-import com.android.internal.util.GrowingArrayUtils;
-
-import org.xmlpull.v1.XmlPullParser;
-import org.xmlpull.v1.XmlPullParserException;
-
 import android.graphics.LinearGradient;
 import android.graphics.RadialGradient;
 import android.graphics.Shader;
@@ -38,9 +31,16 @@
 import android.util.Log;
 import android.util.Xml;
 
+import com.android.internal.R;
+import com.android.internal.util.GrowingArrayUtils;
+
+import org.xmlpull.v1.XmlPullParser;
+import org.xmlpull.v1.XmlPullParserException;
+
 import java.io.IOException;
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
+import java.util.Arrays;
 
 /**
  * Lets you define a gradient color, which is used inside
@@ -466,7 +466,7 @@
         }
         if (tempColors.length < 2) {
             Log.w(TAG, "<gradient> tag requires 2 color values specified!" + tempColors.length
-                    + " " + tempColors);
+                    + " " + Arrays.toString(tempColors));
         }
 
         if (mGradientType == GradientDrawable.LINEAR_GRADIENT) {
diff --git a/core/java/android/credentials/OWNERS b/core/java/android/credentials/OWNERS
new file mode 100644
index 0000000..e8f393e
--- /dev/null
+++ b/core/java/android/credentials/OWNERS
@@ -0,0 +1,5 @@
+reemabajwa@google.com
+helenqin@google.com
+sgjerry@google.com
+leecam@google.com
+akaphle@google.com
diff --git a/core/java/android/hardware/radio/ProgramSelector.java b/core/java/android/hardware/radio/ProgramSelector.java
index d525753..2d2882d 100644
--- a/core/java/android/hardware/radio/ProgramSelector.java
+++ b/core/java/android/hardware/radio/ProgramSelector.java
@@ -490,8 +490,12 @@
     public String toString() {
         StringBuilder sb = new StringBuilder("ProgramSelector(type=").append(mProgramType)
                 .append(", primary=").append(mPrimaryId);
-        if (mSecondaryIds.length > 0) sb.append(", secondary=").append(mSecondaryIds);
-        if (mVendorIds.length > 0) sb.append(", vendor=").append(mVendorIds);
+        if (mSecondaryIds.length > 0) {
+            sb.append(", secondary=").append(Arrays.toString(mSecondaryIds));
+        }
+        if (mVendorIds.length > 0) {
+            sb.append(", vendor=").append(Arrays.toString(mVendorIds));
+        }
         sb.append(")");
         return sb.toString();
     }
diff --git a/core/java/android/hardware/radio/RadioManager.java b/core/java/android/hardware/radio/RadioManager.java
index 4cc001a..83589ea 100644
--- a/core/java/android/hardware/radio/RadioManager.java
+++ b/core/java/android/hardware/radio/RadioManager.java
@@ -505,7 +505,8 @@
         public int hashCode() {
             return Objects.hash(mId, mServiceName, mClassId, mImplementor, mProduct, mVersion,
                 mSerial, mNumTuners, mNumAudioSources, mIsInitializationRequired,
-                mIsCaptureSupported, mBands, mIsBgScanSupported, mDabFrequencyTable, mVendorInfo);
+                mIsCaptureSupported, Arrays.hashCode(mBands), mIsBgScanSupported,
+                mDabFrequencyTable, mVendorInfo);
         }
 
         @Override
@@ -525,7 +526,7 @@
             if (mNumAudioSources != other.mNumAudioSources) return false;
             if (mIsInitializationRequired != other.mIsInitializationRequired) return false;
             if (mIsCaptureSupported != other.mIsCaptureSupported) return false;
-            if (!Objects.equals(mBands, other.mBands)) return false;
+            if (!Arrays.equals(mBands, other.mBands)) return false;
             if (mIsBgScanSupported != other.mIsBgScanSupported) return false;
             if (!Objects.equals(mDabFrequencyTable, other.mDabFrequencyTable)) return false;
             if (!Objects.equals(mVendorInfo, other.mVendorInfo)) return false;
diff --git a/core/java/android/metrics/LogMaker.java b/core/java/android/metrics/LogMaker.java
index a19eb56..8644d91 100644
--- a/core/java/android/metrics/LogMaker.java
+++ b/core/java/android/metrics/LogMaker.java
@@ -23,6 +23,7 @@
 import com.android.internal.annotations.VisibleForTesting;
 import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
 
+import java.util.Arrays;
 
 
 /**
@@ -395,7 +396,7 @@
             out[i * 2] = entries.keyAt(i);
             out[i * 2 + 1] = entries.valueAt(i);
         }
-        int size = out.toString().getBytes().length;
+        int size = Arrays.toString(out).getBytes().length;
         if (size > MAX_SERIALIZED_SIZE) {
             Log.i(TAG, "Log line too long, did not emit: " + size + " bytes.");
             throw new RuntimeException();
diff --git a/core/java/android/os/StrictMode.java b/core/java/android/os/StrictMode.java
index 412a33a..113a640 100644
--- a/core/java/android/os/StrictMode.java
+++ b/core/java/android/os/StrictMode.java
@@ -26,6 +26,9 @@
 import android.app.ActivityManager;
 import android.app.ActivityThread;
 import android.app.IActivityManager;
+import android.app.compat.CompatChanges;
+import android.compat.annotation.ChangeId;
+import android.compat.annotation.EnabledSince;
 import android.compat.annotation.UnsupportedAppUsage;
 import android.content.BroadcastReceiver;
 import android.content.Context;
@@ -344,6 +347,13 @@
     public static final int NETWORK_POLICY_LOG = 1;
     /** {@hide} */
     public static final int NETWORK_POLICY_REJECT = 2;
+  
+    /**
+     * Detect explicit calls to {@link Runtime#gc()}.
+     */
+    @ChangeId
+    @EnabledSince(targetSdkVersion = Build.VERSION_CODES.UPSIDE_DOWN_CAKE)
+    static final long DETECT_EXPLICIT_GC = 3400644L;
 
     // TODO: wrap in some ImmutableHashMap thing.
     // Note: must be before static initialization of sVmPolicy.
@@ -496,6 +506,7 @@
              * <p>As of the Gingerbread release this includes network and disk operations but will
              * likely expand in future releases.
              */
+            @SuppressWarnings("AndroidFrameworkCompatChange")
             public @NonNull Builder detectAll() {
                 detectDiskReads();
                 detectDiskWrites();
@@ -511,6 +522,9 @@
                 if (targetSdk >= Build.VERSION_CODES.O) {
                     detectUnbufferedIo();
                 }
+                if (CompatChanges.isChangeEnabled(DETECT_EXPLICIT_GC)) {
+                    detectExplicitGc();
+                }
                 return this;
             }
 
@@ -591,26 +605,16 @@
             }
 
             /**
-             * Detect explicit GC requests, i.e. calls to Runtime.gc().
-             *
-             * @hide
+             * Detect calls to {@link Runtime#gc()}.
              */
-            @TestApi
             public @NonNull Builder detectExplicitGc() {
-                // TODO(b/3400644): Un-hide this for next API update
-                // TODO(b/3400644): Un-hide ExplicitGcViolation for next API update
-                // TODO(b/3400644): Make DETECT_EXPLICIT_GC a @TestApi for next API update
-                // TODO(b/3400644): Call this from detectAll in next API update
                 return enable(DETECT_THREAD_EXPLICIT_GC);
             }
 
             /**
-             * Disable detection of explicit GC requests, i.e. calls to Runtime.gc().
-             *
-             * @hide
+             * Disable detection of calls to {@link Runtime#gc()}.
              */
             public @NonNull Builder permitExplicitGc() {
-                // TODO(b/3400644): Un-hide this for next API update
                 return disable(DETECT_THREAD_EXPLICIT_GC);
             }
 
diff --git a/core/java/android/os/incremental/IncrementalStorage.java b/core/java/android/os/incremental/IncrementalStorage.java
index 13b22d3..a1ed253 100644
--- a/core/java/android/os/incremental/IncrementalStorage.java
+++ b/core/java/android/os/incremental/IncrementalStorage.java
@@ -26,6 +26,7 @@
 import java.io.File;
 import java.io.IOException;
 import java.nio.ByteBuffer;
+import java.util.Arrays;
 import java.util.Objects;
 import java.util.UUID;
 
@@ -515,7 +516,7 @@
             throw new IOException("Unsupported log2BlockSize: " + hashingInfo.log2BlockSize);
         }
         if (hashingInfo.salt != null && hashingInfo.salt.length > 0) {
-            throw new IOException("Unsupported salt: " + hashingInfo.salt);
+            throw new IOException("Unsupported salt: " + Arrays.toString(hashingInfo.salt));
         }
         if (hashingInfo.rawRootHash.length != INCFS_MAX_HASH_SIZE) {
             throw new IOException("rawRootHash has to be " + INCFS_MAX_HASH_SIZE + " bytes");
diff --git a/core/java/android/os/strictmode/ExplicitGcViolation.java b/core/java/android/os/strictmode/ExplicitGcViolation.java
index 583ed1a..c4ae82d 100644
--- a/core/java/android/os/strictmode/ExplicitGcViolation.java
+++ b/core/java/android/os/strictmode/ExplicitGcViolation.java
@@ -19,10 +19,7 @@
 
 /**
  * See #{@link android.os.StrictMode.ThreadPolicy.Builder#detectExplicitGc()}.
- *
- * @hide
  */
-@TestApi
 public final class ExplicitGcViolation extends Violation {
     /** @hide */
     public ExplicitGcViolation() {
diff --git a/core/java/android/service/autofill/OptionalValidators.java b/core/java/android/service/autofill/OptionalValidators.java
index 7189c88..2043539 100644
--- a/core/java/android/service/autofill/OptionalValidators.java
+++ b/core/java/android/service/autofill/OptionalValidators.java
@@ -25,6 +25,8 @@
 
 import com.android.internal.util.Preconditions;
 
+import java.util.Arrays;
+
 /**
  * Compound validator that returns {@code true} on {@link #isValid(ValueFinder)} if any
  * of its subvalidators returns {@code true} as well.
@@ -61,7 +63,8 @@
     public String toString() {
         if (!sDebug) return super.toString();
 
-        return new StringBuilder("OptionalValidators: [validators=").append(mValidators)
+        return new StringBuilder("OptionalValidators: [validators=")
+                .append(Arrays.toString(mValidators))
                 .append("]")
                 .toString();
     }
diff --git a/core/java/android/service/autofill/RequiredValidators.java b/core/java/android/service/autofill/RequiredValidators.java
index 619eba0..054582e 100644
--- a/core/java/android/service/autofill/RequiredValidators.java
+++ b/core/java/android/service/autofill/RequiredValidators.java
@@ -25,6 +25,8 @@
 
 import com.android.internal.util.Preconditions;
 
+import java.util.Arrays;
+
 /**
  * Compound validator that only returns {@code true} on {@link #isValid(ValueFinder)} if all
  * of its subvalidators return {@code true} as well.
@@ -60,7 +62,8 @@
     public String toString() {
         if (!sDebug) return super.toString();
 
-        return new StringBuilder("RequiredValidators: [validators=").append(mValidators)
+        return new StringBuilder("RequiredValidators: [validators=")
+                .append(Arrays.toString(mValidators))
                 .append("]")
                 .toString();
     }
diff --git a/core/java/android/service/credentials/OWNERS b/core/java/android/service/credentials/OWNERS
new file mode 100644
index 0000000..f3b43c1
--- /dev/null
+++ b/core/java/android/service/credentials/OWNERS
@@ -0,0 +1 @@
+include /core/java/android/credentials/OWNERS
diff --git a/core/java/android/service/voice/VoiceInteractionSession.java b/core/java/android/service/voice/VoiceInteractionSession.java
index 11b60ca..777d143 100644
--- a/core/java/android/service/voice/VoiceInteractionSession.java
+++ b/core/java/android/service/voice/VoiceInteractionSession.java
@@ -73,6 +73,7 @@
 import java.io.PrintWriter;
 import java.lang.ref.WeakReference;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
@@ -597,7 +598,7 @@
                 VoiceInteractor.PickOptionRequest.Option[] selections, Bundle result) {
             try {
                 if (DEBUG) Log.d(TAG, "sendPickOptionResult: req=" + mInterface
-                        + " finished=" + finished + " selections=" + selections
+                        + " finished=" + finished + " selections=" + Arrays.toString(selections)
                         + " result=" + result);
                 if (finished) {
                     finishRequest();
diff --git a/core/java/android/speech/tts/FileSynthesisCallback.java b/core/java/android/speech/tts/FileSynthesisCallback.java
index 3bde32b..3177c5c 100644
--- a/core/java/android/speech/tts/FileSynthesisCallback.java
+++ b/core/java/android/speech/tts/FileSynthesisCallback.java
@@ -24,6 +24,7 @@
 import java.nio.ByteBuffer;
 import java.nio.ByteOrder;
 import java.nio.channels.FileChannel;
+import java.util.Arrays;
 
 /**
  * Speech synthesis request that writes the audio to a WAV file.
@@ -152,8 +153,8 @@
     @Override
     public int audioAvailable(byte[] buffer, int offset, int length) {
         if (DBG) {
-            Log.d(TAG, "FileSynthesisRequest.audioAvailable(" + buffer + "," + offset
-                    + "," + length + ")");
+            Log.d(TAG, "FileSynthesisRequest.audioAvailable(" + Arrays.toString(buffer)
+                    + "," + offset + "," + length + ")");
         }
         FileChannel fileChannel = null;
         synchronized (mStateLock) {
diff --git a/core/java/android/util/ArrayMap.java b/core/java/android/util/ArrayMap.java
index c0bc991..155f508 100644
--- a/core/java/android/util/ArrayMap.java
+++ b/core/java/android/util/ArrayMap.java
@@ -23,6 +23,7 @@
 
 import libcore.util.EmptyArray;
 
+import java.util.Arrays;
 import java.util.Collection;
 import java.util.ConcurrentModificationException;
 import java.util.Map;
@@ -231,7 +232,7 @@
                             array[0] = array[1] = null;
                             mTwiceBaseCacheSize--;
                             if (DEBUG) {
-                                Log.d(TAG, "Retrieving 2x cache " + mHashes
+                                Log.d(TAG, "Retrieving 2x cache " + Arrays.toString(mHashes)
                                         + " now have " + mTwiceBaseCacheSize + " entries");
                             }
                             return;
@@ -258,7 +259,7 @@
                             array[0] = array[1] = null;
                             mBaseCacheSize--;
                             if (DEBUG) {
-                                Log.d(TAG, "Retrieving 1x cache " + mHashes
+                                Log.d(TAG, "Retrieving 1x cache " + Arrays.toString(mHashes)
                                         + " now have " + mBaseCacheSize + " entries");
                             }
                             return;
@@ -295,8 +296,10 @@
                     }
                     mTwiceBaseCache = array;
                     mTwiceBaseCacheSize++;
-                    if (DEBUG) Log.d(TAG, "Storing 2x cache " + array
-                            + " now have " + mTwiceBaseCacheSize + " entries");
+                    if (DEBUG) {
+                        Log.d(TAG, "Storing 2x cache " + Arrays.toString(array)
+                                + " now have " + mTwiceBaseCacheSize + " entries");
+                    }
                 }
             }
         } else if (hashes.length == BASE_SIZE) {
@@ -309,8 +312,10 @@
                     }
                     mBaseCache = array;
                     mBaseCacheSize++;
-                    if (DEBUG) Log.d(TAG, "Storing 1x cache " + array
-                            + " now have " + mBaseCacheSize + " entries");
+                    if (DEBUG) {
+                        Log.d(TAG, "Storing 1x cache " + Arrays.toString(array)
+                                + " now have " + mBaseCacheSize + " entries");
+                    }
                 }
             }
         }
diff --git a/core/java/android/util/ArraySet.java b/core/java/android/util/ArraySet.java
index b5c75b9..73114e2 100644
--- a/core/java/android/util/ArraySet.java
+++ b/core/java/android/util/ArraySet.java
@@ -23,6 +23,7 @@
 import libcore.util.EmptyArray;
 
 import java.lang.reflect.Array;
+import java.util.Arrays;
 import java.util.Collection;
 import java.util.ConcurrentModificationException;
 import java.util.Iterator;
@@ -194,8 +195,8 @@
                             array[0] = array[1] = null;
                             sTwiceBaseCacheSize--;
                             if (DEBUG) {
-                                Log.d(TAG, "Retrieving 2x cache " + mHashes + " now have "
-                                        + sTwiceBaseCacheSize + " entries");
+                                Log.d(TAG, "Retrieving 2x cache " + Arrays.toString(mHashes)
+                                        + " now have " + sTwiceBaseCacheSize + " entries");
                             }
                             return;
                         }
@@ -221,8 +222,8 @@
                             array[0] = array[1] = null;
                             sBaseCacheSize--;
                             if (DEBUG) {
-                                Log.d(TAG, "Retrieving 1x cache " + mHashes + " now have "
-                                        + sBaseCacheSize + " entries");
+                                Log.d(TAG, "Retrieving 1x cache " + Arrays.toString(mHashes)
+                                        + " now have " + sBaseCacheSize + " entries");
                             }
                             return;
                         }
@@ -259,8 +260,8 @@
                     sTwiceBaseCache = array;
                     sTwiceBaseCacheSize++;
                     if (DEBUG) {
-                        Log.d(TAG, "Storing 2x cache " + array + " now have " + sTwiceBaseCacheSize
-                                + " entries");
+                        Log.d(TAG, "Storing 2x cache " + Arrays.toString(array) + " now have "
+                                + sTwiceBaseCacheSize + " entries");
                     }
                 }
             }
@@ -275,7 +276,7 @@
                     sBaseCache = array;
                     sBaseCacheSize++;
                     if (DEBUG) {
-                        Log.d(TAG, "Storing 1x cache " + array + " now have "
+                        Log.d(TAG, "Storing 1x cache " + Arrays.toString(array) + " now have "
                                 + sBaseCacheSize + " entries");
                     }
                 }
diff --git a/core/java/android/util/proto/ProtoInputStream.java b/core/java/android/util/proto/ProtoInputStream.java
index 9789b10..9a15cd5 100644
--- a/core/java/android/util/proto/ProtoInputStream.java
+++ b/core/java/android/util/proto/ProtoInputStream.java
@@ -21,6 +21,8 @@
 import java.io.IOException;
 import java.io.InputStream;
 import java.nio.charset.StandardCharsets;
+import java.util.Arrays;
+import java.util.Objects;
 
 /**
  * Class to read to a protobuf stream.
@@ -968,26 +970,17 @@
     public String dumpDebugData() {
         StringBuilder sb = new StringBuilder();
 
-        sb.append("\nmFieldNumber : 0x" + Integer.toHexString(mFieldNumber));
-        sb.append("\nmWireType : 0x" + Integer.toHexString(mWireType));
-        sb.append("\nmState : 0x" + Integer.toHexString(mState));
-        sb.append("\nmDiscardedBytes : 0x" + Integer.toHexString(mDiscardedBytes));
-        sb.append("\nmOffset : 0x" + Integer.toHexString(mOffset));
-        sb.append("\nmExpectedObjectTokenStack : ");
-        if (mExpectedObjectTokenStack == null) {
-            sb.append("null");
-        } else {
-            sb.append(mExpectedObjectTokenStack);
-        }
-        sb.append("\nmDepth : 0x" + Integer.toHexString(mDepth));
-        sb.append("\nmBuffer : ");
-        if (mBuffer == null) {
-            sb.append("null");
-        } else {
-            sb.append(mBuffer);
-        }
-        sb.append("\nmBufferSize : 0x" + Integer.toHexString(mBufferSize));
-        sb.append("\nmEnd : 0x" + Integer.toHexString(mEnd));
+        sb.append("\nmFieldNumber : 0x").append(Integer.toHexString(mFieldNumber));
+        sb.append("\nmWireType : 0x").append(Integer.toHexString(mWireType));
+        sb.append("\nmState : 0x").append(Integer.toHexString(mState));
+        sb.append("\nmDiscardedBytes : 0x").append(Integer.toHexString(mDiscardedBytes));
+        sb.append("\nmOffset : 0x").append(Integer.toHexString(mOffset));
+        sb.append("\nmExpectedObjectTokenStack : ")
+                .append(Objects.toString(mExpectedObjectTokenStack));
+        sb.append("\nmDepth : 0x").append(Integer.toHexString(mDepth));
+        sb.append("\nmBuffer : ").append(Arrays.toString(mBuffer));
+        sb.append("\nmBufferSize : 0x").append(Integer.toHexString(mBufferSize));
+        sb.append("\nmEnd : 0x").append(Integer.toHexString(mEnd));
 
         return sb.toString();
     }
diff --git a/core/java/android/util/proto/ProtoUtils.java b/core/java/android/util/proto/ProtoUtils.java
index 8464d2d..58d9913 100644
--- a/core/java/android/util/proto/ProtoUtils.java
+++ b/core/java/android/util/proto/ProtoUtils.java
@@ -20,6 +20,7 @@
 import android.util.Duration;
 
 import java.io.IOException;
+import java.util.Arrays;
 
 /**
  * This class contains a list of helper functions to write common proto in
@@ -91,27 +92,27 @@
         final int wireType = proto.getWireType();
         long fieldConstant;
 
-        sb.append("Offset : 0x" + Integer.toHexString(proto.getOffset()));
-        sb.append("\nField Number : 0x" + Integer.toHexString(proto.getFieldNumber()));
+        sb.append("Offset : 0x").append(Integer.toHexString(proto.getOffset()));
+        sb.append("\nField Number : 0x").append(Integer.toHexString(proto.getFieldNumber()));
         sb.append("\nWire Type : ");
         switch (wireType) {
             case ProtoStream.WIRE_TYPE_VARINT:
-                sb.append("varint");
                 fieldConstant = ProtoStream.makeFieldId(fieldNumber,
                         ProtoStream.FIELD_COUNT_SINGLE | ProtoStream.FIELD_TYPE_INT64);
-                sb.append("\nField Value : 0x" + Long.toHexString(proto.readLong(fieldConstant)));
+                sb.append("varint\nField Value : 0x");
+                sb.append(Long.toHexString(proto.readLong(fieldConstant)));
                 break;
             case ProtoStream.WIRE_TYPE_FIXED64:
-                sb.append("fixed64");
                 fieldConstant = ProtoStream.makeFieldId(fieldNumber,
                         ProtoStream.FIELD_COUNT_SINGLE | ProtoStream.FIELD_TYPE_FIXED64);
-                sb.append("\nField Value : 0x" + Long.toHexString(proto.readLong(fieldConstant)));
+                sb.append("fixed64\nField Value : 0x");
+                sb.append(Long.toHexString(proto.readLong(fieldConstant)));
                 break;
             case ProtoStream.WIRE_TYPE_LENGTH_DELIMITED:
-                sb.append("length delimited");
                 fieldConstant = ProtoStream.makeFieldId(fieldNumber,
                         ProtoStream.FIELD_COUNT_SINGLE | ProtoStream.FIELD_TYPE_BYTES);
-                sb.append("\nField Bytes : " + proto.readBytes(fieldConstant));
+                sb.append("length delimited\nField Bytes : ");
+                sb.append(Arrays.toString(proto.readBytes(fieldConstant)));
                 break;
             case ProtoStream.WIRE_TYPE_START_GROUP:
                 sb.append("start group");
@@ -120,13 +121,13 @@
                 sb.append("end group");
                 break;
             case ProtoStream.WIRE_TYPE_FIXED32:
-                sb.append("fixed32");
                 fieldConstant = ProtoStream.makeFieldId(fieldNumber,
                         ProtoStream.FIELD_COUNT_SINGLE | ProtoStream.FIELD_TYPE_FIXED32);
-                sb.append("\nField Value : 0x" + Integer.toHexString(proto.readInt(fieldConstant)));
+                sb.append("fixed32\nField Value : 0x");
+                sb.append(Integer.toHexString(proto.readInt(fieldConstant)));
                 break;
             default:
-                sb.append("unknown(" + proto.getWireType() + ")");
+                sb.append("unknown(").append(proto.getWireType()).append(")");
         }
         return sb.toString();
     }
diff --git a/core/java/android/view/SurfaceControl.java b/core/java/android/view/SurfaceControl.java
index a1ce39e..6a23aba 100644
--- a/core/java/android/view/SurfaceControl.java
+++ b/core/java/android/view/SurfaceControl.java
@@ -1934,7 +1934,7 @@
 
         @Override
         public int hashCode() {
-            return Objects.hash(supportedDisplayModes, activeDisplayModeId, activeDisplayModeId,
+            return Objects.hash(Arrays.hashCode(supportedDisplayModes), activeDisplayModeId,
                     activeColorMode, hdrCapabilities);
         }
     }
diff --git a/core/java/android/view/TEST_MAPPING b/core/java/android/view/TEST_MAPPING
index 50d69f7..ecb98f9 100644
--- a/core/java/android/view/TEST_MAPPING
+++ b/core/java/android/view/TEST_MAPPING
@@ -10,6 +10,9 @@
           "include-annotation": "android.platform.test.annotations.Presubmit"
         },
         {
+          "exclude-annotation": "android.platform.test.annotations.LargeTest"
+        },
+        {
           "exclude-annotation": "androidx.test.filters.FlakyTest"
         },
         {
diff --git a/core/java/com/android/internal/os/BatteryStatsImpl.java b/core/java/com/android/internal/os/BatteryStatsImpl.java
index ac57d69..e290812 100644
--- a/core/java/com/android/internal/os/BatteryStatsImpl.java
+++ b/core/java/com/android/internal/os/BatteryStatsImpl.java
@@ -7928,20 +7928,31 @@
         synchronized (mModemNetworkLock) {
             if (displayTransport == TRANSPORT_CELLULAR) {
                 mModemIfaces = includeInStringArray(mModemIfaces, iface);
-                if (DEBUG) Slog.d(TAG, "Note mobile iface " + iface + ": " + mModemIfaces);
+                if (DEBUG) {
+                    Slog.d(TAG, "Note mobile iface " + iface + ": "
+                            + Arrays.toString(mModemIfaces));
+                }
             } else {
                 mModemIfaces = excludeFromStringArray(mModemIfaces, iface);
-                if (DEBUG) Slog.d(TAG, "Note non-mobile iface " + iface + ": " + mModemIfaces);
+                if (DEBUG) {
+                    Slog.d(TAG, "Note non-mobile iface " + iface + ": "
+                            + Arrays.toString(mModemIfaces));
+                }
             }
         }
 
         synchronized (mWifiNetworkLock) {
             if (displayTransport == TRANSPORT_WIFI) {
                 mWifiIfaces = includeInStringArray(mWifiIfaces, iface);
-                if (DEBUG) Slog.d(TAG, "Note wifi iface " + iface + ": " + mWifiIfaces);
+                if (DEBUG) {
+                    Slog.d(TAG, "Note wifi iface " + iface + ": " + Arrays.toString(mWifiIfaces));
+                }
             } else {
                 mWifiIfaces = excludeFromStringArray(mWifiIfaces, iface);
-                if (DEBUG) Slog.d(TAG, "Note non-wifi iface " + iface + ": " + mWifiIfaces);
+                if (DEBUG) {
+                    Slog.d(TAG, "Note non-wifi iface " + iface + ": "
+                            + Arrays.toString(mWifiIfaces));
+                }
             }
         }
     }
@@ -14409,7 +14420,7 @@
             @NonNull CpuDeltaPowerAccumulator accumulator) {
         if (DEBUG_ENERGY) {
             Slog.d(TAG,
-                    "Updating cpu cluster stats: " + clusterChargeUC.toString());
+                    "Updating cpu cluster stats: " + Arrays.toString(clusterChargeUC));
         }
         if (mGlobalMeasuredEnergyStats == null) {
             return;
diff --git a/core/java/com/android/internal/widget/LockscreenCredential.java b/core/java/com/android/internal/widget/LockscreenCredential.java
index 1074004..db83c09 100644
--- a/core/java/com/android/internal/widget/LockscreenCredential.java
+++ b/core/java/com/android/internal/widget/LockscreenCredential.java
@@ -26,7 +26,6 @@
 import android.annotation.Nullable;
 import android.os.Parcel;
 import android.os.Parcelable;
-import android.os.storage.StorageManager;
 import android.text.TextUtils;
 
 import com.android.internal.util.Preconditions;
@@ -368,7 +367,7 @@
     @Override
     public int hashCode() {
         // Effective Java — Always override hashCode when you override equals
-        return (17 + mType) * 31 + mCredential.hashCode();
+        return Objects.hash(mType, Arrays.hashCode(mCredential));
     }
 
     @Override
diff --git a/core/jni/OWNERS b/core/jni/OWNERS
index 7f50204..14699e7 100644
--- a/core/jni/OWNERS
+++ b/core/jni/OWNERS
@@ -95,3 +95,7 @@
 # Battery
 per-file com_android_internal_os_Kernel* = file:/BATTERY_STATS_OWNERS
 per-file com_android_internal_os_*MultiStateCounter* = file:/BATTERY_STATS_OWNERS
+
+# PM
+per-file com_android_internal_content_* = file:/PACKAGE_MANAGER_OWNERS
+
diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml
index 2215c26..bf155cc 100644
--- a/core/res/res/values/strings.xml
+++ b/core/res/res/values/strings.xml
@@ -222,9 +222,9 @@
     <!-- Displayed to tell the user that they should switch their network preference. -->
     <string name="NetworkPreferenceSwitchSummary">Try changing preferred network. Tap to change.</string>
     <!-- Displayed to tell the user that emergency calls might not be available. -->
-    <string name="EmergencyCallWarningTitle">Emergency calling unavailable</string>
+    <string name="EmergencyCallWarningTitle">Emergency calls may be unavailable</string>
     <!-- Displayed to tell the user that emergency calls might not be available. -->
-    <string name="EmergencyCallWarningSummary">Can\u2019t make emergency calls over Wi\u2011Fi</string>
+    <string name="EmergencyCallWarningSummary"><xliff:g id="spn" example="Operator">%s</xliff:g> doesn\'t support emergency calls over Wi-Fi. Tap for details.</string>
 
     <!-- Telephony notification channel name for a channel containing network alert notifications. -->
     <string name="notification_channel_network_alert">Alerts</string>
diff --git a/core/tests/coretests/src/android/provider/FontsContractTest.java b/core/tests/coretests/src/android/provider/FontsContractTest.java
index c5d6f7f..21a2205 100644
--- a/core/tests/coretests/src/android/provider/FontsContractTest.java
+++ b/core/tests/coretests/src/android/provider/FontsContractTest.java
@@ -42,6 +42,7 @@
 
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collections;
 import java.util.List;
 
 /**
@@ -282,9 +283,10 @@
         setupPackageManager();
 
         byte[] wrongCert = Base64.decode("this is a wrong cert", Base64.DEFAULT);
-        List<byte[]> certList = Arrays.asList(wrongCert);
+        List<byte[]> certList = Collections.singletonList(wrongCert);
         FontRequest requestWrongCerts = new FontRequest(
-                TestFontsProvider.AUTHORITY, PACKAGE_NAME, "query", Arrays.asList(certList));
+                TestFontsProvider.AUTHORITY, PACKAGE_NAME, "query",
+                Collections.singletonList(certList));
 
         assertNull(FontsContract.getProvider(mPackageManager, requestWrongCerts));
     }
@@ -293,9 +295,10 @@
             throws PackageManager.NameNotFoundException {
         ProviderInfo info = setupPackageManager();
 
-        List<byte[]> certList = Arrays.asList(BYTE_ARRAY);
+        List<byte[]> certList = Collections.singletonList(BYTE_ARRAY);
         FontRequest requestRightCerts = new FontRequest(
-                TestFontsProvider.AUTHORITY, PACKAGE_NAME, "query", Arrays.asList(certList));
+                TestFontsProvider.AUTHORITY, PACKAGE_NAME, "query",
+                Collections.singletonList(certList));
         ProviderInfo result = FontsContract.getProvider(
                 mPackageManager, requestRightCerts);
 
@@ -309,7 +312,8 @@
         byte[] wrongCert = Base64.decode("this is a wrong cert", Base64.DEFAULT);
         List<byte[]> certList = Arrays.asList(wrongCert, BYTE_ARRAY);
         FontRequest requestRightCerts = new FontRequest(
-                TestFontsProvider.AUTHORITY, PACKAGE_NAME, "query", Arrays.asList(certList));
+                TestFontsProvider.AUTHORITY, PACKAGE_NAME, "query",
+                Collections.singletonList(certList));
         assertNull(FontsContract.getProvider(mPackageManager, requestRightCerts));
     }
 
@@ -332,7 +336,8 @@
         // {BYTE_ARRAY_2, BYTE_ARRAY_COPY}.
         List<byte[]> certList = Arrays.asList(BYTE_ARRAY_2, BYTE_ARRAY_COPY);
         FontRequest requestRightCerts = new FontRequest(
-                TestFontsProvider.AUTHORITY, PACKAGE_NAME, "query", Arrays.asList(certList));
+                TestFontsProvider.AUTHORITY, PACKAGE_NAME, "query",
+                Collections.singletonList(certList));
         assertNull(FontsContract.getProvider(mPackageManager, requestRightCerts));
     }
 
@@ -341,9 +346,9 @@
         ProviderInfo info = setupPackageManager();
 
         List<List<byte[]>> certList = new ArrayList<>();
-        byte[] wrongCert = Base64.decode("this is a wrong cert", Base64.DEFAULT);
-        certList.add(Arrays.asList(wrongCert));
-        certList.add(Arrays.asList(BYTE_ARRAY));
+        certList.add(Collections.singletonList(
+                Base64.decode("this is a wrong cert", Base64.DEFAULT)));
+        certList.add(Collections.singletonList(BYTE_ARRAY));
         FontRequest requestRightCerts = new FontRequest(
                 TestFontsProvider.AUTHORITY, PACKAGE_NAME, "query", certList);
         ProviderInfo result = FontsContract.getProvider(mPackageManager, requestRightCerts);
@@ -356,7 +361,7 @@
         setupPackageManager();
 
         List<List<byte[]>> certList = new ArrayList<>();
-        certList.add(Arrays.asList(BYTE_ARRAY));
+        certList.add(Collections.singletonList(BYTE_ARRAY));
         FontRequest requestRightCerts = new FontRequest(
                 TestFontsProvider.AUTHORITY, "com.wrong.package.name", "query", certList);
         try {
diff --git a/graphics/java/android/graphics/ColorSpace.java b/graphics/java/android/graphics/ColorSpace.java
index 582488f..ca3c847 100644
--- a/graphics/java/android/graphics/ColorSpace.java
+++ b/graphics/java/android/graphics/ColorSpace.java
@@ -2796,7 +2796,8 @@
                 if (mWhitePoint == null || mTransform == null) {
                     throw new IllegalStateException(
                             "ColorSpace (" + this + ") cannot create native object! mWhitePoint: "
-                            + mWhitePoint + " mTransform: " + mTransform);
+                            + Arrays.toString(mWhitePoint) + " mTransform: "
+                            + Arrays.toString(mTransform));
                 }
 
                 // This mimics the old code that was in native.
diff --git a/libs/hwui/SkiaCanvas.cpp b/libs/hwui/SkiaCanvas.cpp
index 53c6db0..f9b3a8c 100644
--- a/libs/hwui/SkiaCanvas.cpp
+++ b/libs/hwui/SkiaCanvas.cpp
@@ -51,6 +51,49 @@
 
 using uirenderer::PaintUtils;
 
+class SkiaCanvas::Clip {
+public:
+    Clip(const SkRect& rect, SkClipOp op, const SkMatrix& m)
+            : mType(Type::Rect), mOp(op), mMatrix(m), mRRect(SkRRect::MakeRect(rect)) {}
+    Clip(const SkRRect& rrect, SkClipOp op, const SkMatrix& m)
+            : mType(Type::RRect), mOp(op), mMatrix(m), mRRect(rrect) {}
+    Clip(const SkPath& path, SkClipOp op, const SkMatrix& m)
+            : mType(Type::Path), mOp(op), mMatrix(m), mPath(std::in_place, path) {}
+
+    void apply(SkCanvas* canvas) const {
+        canvas->setMatrix(mMatrix);
+        switch (mType) {
+            case Type::Rect:
+                // Don't anti-alias rectangular clips
+                canvas->clipRect(mRRect.rect(), mOp, false);
+                break;
+            case Type::RRect:
+                // Ensure rounded rectangular clips are anti-aliased
+                canvas->clipRRect(mRRect, mOp, true);
+                break;
+            case Type::Path:
+                // Ensure path clips are anti-aliased
+                canvas->clipPath(mPath.value(), mOp, true);
+                break;
+        }
+    }
+
+private:
+    enum class Type {
+        Rect,
+        RRect,
+        Path,
+    };
+
+    Type mType;
+    SkClipOp mOp;
+    SkMatrix mMatrix;
+
+    // These are logically a union (tracked separately due to non-POD path).
+    std::optional<SkPath> mPath;
+    SkRRect mRRect;
+};
+
 Canvas* Canvas::create_canvas(const SkBitmap& bitmap) {
     return new SkiaCanvas(bitmap);
 }
@@ -194,49 +237,6 @@
     }
 }
 
-class SkiaCanvas::Clip {
-public:
-    Clip(const SkRect& rect, SkClipOp op, const SkMatrix& m)
-            : mType(Type::Rect), mOp(op), mMatrix(m), mRRect(SkRRect::MakeRect(rect)) {}
-    Clip(const SkRRect& rrect, SkClipOp op, const SkMatrix& m)
-            : mType(Type::RRect), mOp(op), mMatrix(m), mRRect(rrect) {}
-    Clip(const SkPath& path, SkClipOp op, const SkMatrix& m)
-            : mType(Type::Path), mOp(op), mMatrix(m), mPath(std::in_place, path) {}
-
-    void apply(SkCanvas* canvas) const {
-        canvas->setMatrix(mMatrix);
-        switch (mType) {
-            case Type::Rect:
-                // Don't anti-alias rectangular clips
-                canvas->clipRect(mRRect.rect(), mOp, false);
-                break;
-            case Type::RRect:
-                // Ensure rounded rectangular clips are anti-aliased
-                canvas->clipRRect(mRRect, mOp, true);
-                break;
-            case Type::Path:
-                // Ensure path clips are anti-aliased
-                canvas->clipPath(mPath.value(), mOp, true);
-                break;
-        }
-    }
-
-private:
-    enum class Type {
-        Rect,
-        RRect,
-        Path,
-    };
-
-    Type mType;
-    SkClipOp mOp;
-    SkMatrix mMatrix;
-
-    // These are logically a union (tracked separately due to non-POD path).
-    std::optional<SkPath> mPath;
-    SkRRect mRRect;
-};
-
 const SkiaCanvas::SaveRec* SkiaCanvas::currentSaveRec() const {
     const SaveRec* rec = mSaveStack ? static_cast<const SaveRec*>(mSaveStack->back()) : nullptr;
     int currentSaveCount = mCanvas->getSaveCount();
diff --git a/media/java/android/media/MediaPlayer.java b/media/java/android/media/MediaPlayer.java
index 1077275..737bc34 100644
--- a/media/java/android/media/MediaPlayer.java
+++ b/media/java/android/media/MediaPlayer.java
@@ -5089,9 +5089,12 @@
             @Nullable Map<String, String> optionalParameters)
             throws NoDrmSchemeException
     {
-        Log.v(TAG, "getKeyRequest: " +
-                " keySetId: " + keySetId + " initData:" + initData + " mimeType: " + mimeType +
-                " keyType: " + keyType + " optionalParameters: " + optionalParameters);
+        Log.v(TAG, "getKeyRequest: "
+                + " keySetId: " + Arrays.toString(keySetId)
+                + " initData:" + Arrays.toString(initData)
+                + " mimeType: " + mimeType
+                + " keyType: " + keyType
+                + " optionalParameters: " + optionalParameters);
 
         synchronized (mDrmLock) {
             if (!mActiveDrmScheme) {
@@ -5150,7 +5153,8 @@
     public byte[] provideKeyResponse(@Nullable byte[] keySetId, @NonNull byte[] response)
             throws NoDrmSchemeException, DeniedByServerException
     {
-        Log.v(TAG, "provideKeyResponse: keySetId: " + keySetId + " response: " + response);
+        Log.v(TAG, "provideKeyResponse: keySetId: " + Arrays.toString(keySetId)
+                + " response: " + Arrays.toString(response));
 
         synchronized (mDrmLock) {
 
@@ -5166,8 +5170,9 @@
 
                 byte[] keySetResult = mDrmObj.provideKeyResponse(scope, response);
 
-                Log.v(TAG, "provideKeyResponse: keySetId: " + keySetId + " response: " + response +
-                        " --> " + keySetResult);
+                Log.v(TAG, "provideKeyResponse: keySetId: " + Arrays.toString(keySetId)
+                        + " response: " + Arrays.toString(response)
+                        + " --> " + Arrays.toString(keySetResult));
 
 
                 return keySetResult;
@@ -5194,7 +5199,7 @@
     public void restoreKeys(@NonNull byte[] keySetId)
             throws NoDrmSchemeException
     {
-        Log.v(TAG, "restoreKeys: keySetId: " + keySetId);
+        Log.v(TAG, "restoreKeys: keySetId: " + Arrays.toString(keySetId));
 
         synchronized (mDrmLock) {
 
@@ -5481,7 +5486,8 @@
         // at prepareDrm/openSession rather than getKeyRequest/provideKeyResponse
         try {
             mDrmSessionId = mDrmObj.openSession();
-            Log.v(TAG, "prepareDrm_openSessionStep: mDrmSessionId=" + mDrmSessionId);
+            Log.v(TAG, "prepareDrm_openSessionStep: mDrmSessionId="
+                    + Arrays.toString(mDrmSessionId));
 
             // Sending it down to native/mediaserver to create the crypto object
             // This call could simply fail due to bad player state, e.g., after start().
@@ -5544,7 +5550,7 @@
                     response = Streams.readFully(connection.getInputStream());
 
                     Log.v(TAG, "HandleProvisioninig: Thread run: response " +
-                            response.length + " " + response);
+                            response.length + " " + Arrays.toString(response));
                 } catch (Exception e) {
                     status = PREPARE_DRM_STATUS_PROVISIONING_NETWORK_ERROR;
                     Log.w(TAG, "HandleProvisioninig: Thread run: connect " + e + " url: " + url);
@@ -5628,8 +5634,9 @@
             return PREPARE_DRM_STATUS_PREPARATION_ERROR;
         }
 
-        Log.v(TAG, "HandleProvisioninig provReq " +
-                " data: " + provReq.getData() + " url: " + provReq.getDefaultUrl());
+        Log.v(TAG, "HandleProvisioninig provReq "
+                + " data: " + Arrays.toString(provReq.getData())
+                + " url: " + provReq.getDefaultUrl());
 
         // networking in a background thread
         mDrmProvisioningInProgress = true;
@@ -5712,7 +5719,8 @@
     private void cleanDrmObj()
     {
         // the caller holds mDrmLock
-        Log.v(TAG, "cleanDrmObj: mDrmObj=" + mDrmObj + " mDrmSessionId=" + mDrmSessionId);
+        Log.v(TAG, "cleanDrmObj: mDrmObj=" + mDrmObj
+                + " mDrmSessionId=" + Arrays.toString(mDrmSessionId));
 
         if (mDrmSessionId != null)    {
             mDrmObj.closeSession(mDrmSessionId);
diff --git a/media/java/android/media/audiopolicy/AudioProductStrategy.java b/media/java/android/media/audiopolicy/AudioProductStrategy.java
index 31d5967..f957498 100644
--- a/media/java/android/media/audiopolicy/AudioProductStrategy.java
+++ b/media/java/android/media/audiopolicy/AudioProductStrategy.java
@@ -32,6 +32,7 @@
 import com.android.internal.util.Preconditions;
 
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.List;
 
 /**
@@ -182,7 +183,7 @@
         AudioProductStrategy thatStrategy = (AudioProductStrategy) o;
 
         return mName == thatStrategy.mName && mId == thatStrategy.mId
-                && mAudioAttributesGroups.equals(thatStrategy.mAudioAttributesGroups);
+                && Arrays.equals(mAudioAttributesGroups, thatStrategy.mAudioAttributesGroups);
     }
 
     /**
@@ -415,7 +416,7 @@
 
             return mVolumeGroupId == thatAag.mVolumeGroupId
                     && mLegacyStreamType == thatAag.mLegacyStreamType
-                    && mAudioAttributes.equals(thatAag.mAudioAttributes);
+                    && Arrays.equals(mAudioAttributes, thatAag.mAudioAttributes);
         }
 
         public int getStreamType() {
diff --git a/media/java/android/media/audiopolicy/AudioVolumeGroup.java b/media/java/android/media/audiopolicy/AudioVolumeGroup.java
index 79be922..d58111d 100644
--- a/media/java/android/media/audiopolicy/AudioVolumeGroup.java
+++ b/media/java/android/media/audiopolicy/AudioVolumeGroup.java
@@ -114,7 +114,7 @@
         AudioVolumeGroup thatAvg = (AudioVolumeGroup) o;
 
         return mName == thatAvg.mName && mId == thatAvg.mId
-                && mAudioAttributes.equals(thatAvg.mAudioAttributes);
+                && Arrays.equals(mAudioAttributes, thatAvg.mAudioAttributes);
     }
 
     /**
diff --git a/media/java/android/media/metrics/PlaybackMetrics.java b/media/java/android/media/metrics/PlaybackMetrics.java
index e71ee20..51a2c9d 100644
--- a/media/java/android/media/metrics/PlaybackMetrics.java
+++ b/media/java/android/media/metrics/PlaybackMetrics.java
@@ -402,9 +402,10 @@
     @Override
     public int hashCode() {
         return Objects.hash(mMediaDurationMillis, mStreamSource, mStreamType, mPlaybackType,
-                mDrmType, mContentType, mPlayerName, mPlayerVersion, mExperimentIds,
-                mVideoFramesPlayed, mVideoFramesDropped, mAudioUnderrunCount, mNetworkBytesRead,
-                mLocalBytesRead, mNetworkTransferDurationMillis, mDrmSessionId);
+                mDrmType, mContentType, mPlayerName, mPlayerVersion,
+                Arrays.hashCode(mExperimentIds), mVideoFramesPlayed, mVideoFramesDropped,
+                mAudioUnderrunCount, mNetworkBytesRead, mLocalBytesRead,
+                mNetworkTransferDurationMillis, Arrays.hashCode(mDrmSessionId));
     }
 
     @Override
diff --git a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/helpers/CameraErrorCollector.java b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/helpers/CameraErrorCollector.java
index 41914b8..ebf1a75 100644
--- a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/helpers/CameraErrorCollector.java
+++ b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/helpers/CameraErrorCollector.java
@@ -16,10 +16,6 @@
 
 package com.android.mediaframeworktest.helpers;
 
-import org.hamcrest.CoreMatchers;
-import org.hamcrest.Matcher;
-import org.junit.rules.ErrorCollector;
-
 import android.graphics.Rect;
 import android.hardware.camera2.CameraCharacteristics;
 import android.hardware.camera2.CaptureRequest;
@@ -30,6 +26,10 @@
 import android.util.Log;
 import android.util.Size;
 
+import org.hamcrest.CoreMatchers;
+import org.hamcrest.Matcher;
+import org.junit.rules.ErrorCollector;
+
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.HashSet;
@@ -903,7 +903,7 @@
         if ((value = expectKeyValueNotNull(characteristics, key)) == null) {
             return;
         }
-        String reason = "Key " + key.getName() + " value " + value
+        String reason = "Key " + key.getName() + " value " + Arrays.toString(value)
                 + " doesn't contain the expected value " + expected;
         expectContains(reason, value, expected);
     }
@@ -921,7 +921,7 @@
         if ((value = expectKeyValueNotNull(characteristics, key)) == null) {
             return;
         }
-        String reason = "Key " + key.getName() + " value " + value
+        String reason = "Key " + key.getName() + " value " + Arrays.toString(value)
                 + " doesn't contain the expected value " + expected;
         expectContains(reason, value, expected);
     }
@@ -939,7 +939,7 @@
         if ((value = expectKeyValueNotNull(characteristics, key)) == null) {
             return;
         }
-        String reason = "Key " + key.getName() + " value " + value
+        String reason = "Key " + key.getName() + " value " + Arrays.toString(value)
                 + " doesn't contain the expected value " + expected;
         expectContains(reason, value, expected);
     }
@@ -960,7 +960,7 @@
 
     public <T> void expectContains(T[] values, T expected) {
         String reason = "Expected value " + expected
-                + " is not contained in the given values " + values;
+                + " is not contained in the given values " + Arrays.toString(values);
         expectContains(reason, values, expected);
     }
 
@@ -996,7 +996,7 @@
 
     public void expectContains(int[] values, int expected) {
         String reason = "Expected value " + expected
-                + " is not contained in the given values " + values;
+                + " is not contained in the given values " + Arrays.toString(values);
         expectContains(reason, values, expected);
     }
 
@@ -1040,7 +1040,7 @@
      */
     public void expectContains(boolean[] values, boolean expected) {
         String reason = "Expected value " + expected
-                + " is not contained in the given values " + values;
+                + " is not contained in the given values " + Arrays.toString(values);
         expectContains(reason, values, expected);
     }
 
diff --git a/opengl/java/android/opengl/GLLogWrapper.java b/opengl/java/android/opengl/GLLogWrapper.java
index bff7396..e645afa 100644
--- a/opengl/java/android/opengl/GLLogWrapper.java
+++ b/opengl/java/android/opengl/GLLogWrapper.java
@@ -2812,7 +2812,7 @@
     public void glDeleteBuffers(int n, int[] buffers, int offset) {
         begin("glDeleteBuffers");
         arg("n", n);
-        arg("buffers", buffers.toString());
+        arg("buffers", Arrays.toString(buffers));
         arg("offset", offset);
         end();
         mgl11.glDeleteBuffers(n, buffers, offset);
@@ -2831,7 +2831,7 @@
     public void glGenBuffers(int n, int[] buffers, int offset) {
         begin("glGenBuffers");
         arg("n", n);
-        arg("buffers", buffers.toString());
+        arg("buffers", Arrays.toString(buffers));
         arg("offset", offset);
         end();
         mgl11.glGenBuffers(n, buffers, offset);
@@ -2850,7 +2850,7 @@
     public void glGetBooleanv(int pname, boolean[] params, int offset) {
         begin("glGetBooleanv");
         arg("pname", pname);
-        arg("params", params.toString());
+        arg("params", Arrays.toString(params));
         arg("offset", offset);
         end();
         mgl11.glGetBooleanv(pname, params, offset);
@@ -2871,7 +2871,7 @@
         begin("glGetBufferParameteriv");
         arg("target", target);
         arg("pname", pname);
-        arg("params", params.toString());
+        arg("params", Arrays.toString(params));
         arg("offset", offset);
         end();
         mgl11.glGetBufferParameteriv(target, pname, params, offset);
@@ -2891,7 +2891,7 @@
     public void glGetClipPlanef(int pname, float[] eqn, int offset) {
         begin("glGetClipPlanef");
         arg("pname", pname);
-        arg("eqn", eqn.toString());
+        arg("eqn", Arrays.toString(eqn));
         arg("offset", offset);
         end();
         mgl11.glGetClipPlanef(pname, eqn, offset);
@@ -2910,7 +2910,7 @@
     public void glGetClipPlanex(int pname, int[] eqn, int offset) {
         begin("glGetClipPlanex");
         arg("pname", pname);
-        arg("eqn", eqn.toString());
+        arg("eqn", Arrays.toString(eqn));
         arg("offset", offset);
         end();
         mgl11.glGetClipPlanex(pname, eqn, offset);
@@ -2928,7 +2928,7 @@
     public void glGetFixedv(int pname, int[] params, int offset) {
         begin("glGetFixedv");
         arg("pname", pname);
-        arg("params", params.toString());
+        arg("params", Arrays.toString(params));
         arg("offset", offset);
         end();
         mgl11.glGetFixedv(pname, params, offset);
@@ -2946,7 +2946,7 @@
     public void glGetFloatv(int pname, float[] params, int offset) {
         begin("glGetFloatv");
         arg("pname", pname);
-        arg("params", params.toString());
+        arg("params", Arrays.toString(params));
         arg("offset", offset);
         end();
         mgl11.glGetFloatv(pname, params, offset);
@@ -2965,7 +2965,7 @@
         begin("glGetLightfv");
         arg("light", light);
         arg("pname", pname);
-        arg("params", params.toString());
+        arg("params", Arrays.toString(params));
         arg("offset", offset);
         end();
         mgl11.glGetLightfv(light, pname, params, offset);
@@ -2986,7 +2986,7 @@
         begin("glGetLightxv");
         arg("light", light);
         arg("pname", pname);
-        arg("params", params.toString());
+        arg("params", Arrays.toString(params));
         arg("offset", offset);
         end();
         mgl11.glGetLightxv(light, pname, params, offset);
@@ -3008,7 +3008,7 @@
         begin("glGetMaterialfv");
         arg("face", face);
         arg("pname", pname);
-        arg("params", params.toString());
+        arg("params", Arrays.toString(params));
         arg("offset", offset);
         end();
         mgl11.glGetMaterialfv(face, pname, params, offset);
@@ -3029,7 +3029,7 @@
         begin("glGetMaterialxv");
         arg("face", face);
         arg("pname", pname);
-        arg("params", params.toString());
+        arg("params", Arrays.toString(params));
         arg("offset", offset);
         end();
         mgl11.glGetMaterialxv(face, pname, params, offset);
@@ -3050,7 +3050,7 @@
         begin("glGetTexEnviv");
         arg("env", env);
         arg("pname", pname);
-        arg("params", params.toString());
+        arg("params", Arrays.toString(params));
         arg("offset", offset);
         end();
         mgl11.glGetTexEnviv(env, pname, params, offset);
@@ -3071,7 +3071,7 @@
         begin("glGetTexEnviv");
         arg("env", env);
         arg("pname", pname);
-        arg("params", params.toString());
+        arg("params", Arrays.toString(params));
         arg("offset", offset);
         end();
         mgl11.glGetTexEnviv(env, pname, params, offset);
@@ -3092,7 +3092,7 @@
         begin("glGetTexParameterfv");
         arg("target", target);
         arg("pname", pname);
-        arg("params", params.toString());
+        arg("params", Arrays.toString(params));
         arg("offset", offset);
         end();
         mgl11.glGetTexParameterfv(target, pname, params, offset);
@@ -3113,7 +3113,7 @@
         begin("glGetTexParameteriv");
         arg("target", target);
         arg("pname", pname);
-        arg("params", params.toString());
+        arg("params", Arrays.toString(params));
         arg("offset", offset);
         end();
         mgl11.glGetTexEnviv(target, pname, params, offset);
@@ -3135,7 +3135,7 @@
         begin("glGetTexParameterxv");
         arg("target", target);
         arg("pname", pname);
-        arg("params", params.toString());
+        arg("params", Arrays.toString(params));
         arg("offset", offset);
         end();
         mgl11.glGetTexParameterxv(target, pname, params, offset);
@@ -3191,7 +3191,7 @@
     public void glPointParameterfv(int pname, float[] params, int offset) {
         begin("glPointParameterfv");
         arg("pname", pname);
-        arg("params", params.toString());
+        arg("params", Arrays.toString(params));
         arg("offset", offset);
         end();
         mgl11.glPointParameterfv(pname, params, offset);
@@ -3219,7 +3219,7 @@
     public void glPointParameterxv(int pname, int[] params, int offset) {
         begin("glPointParameterxv");
         arg("pname", pname);
-        arg("params", params.toString());
+        arg("params", Arrays.toString(params));
         arg("offset", offset);
         end();
         mgl11.glPointParameterxv(pname, params, offset);
@@ -3259,7 +3259,7 @@
         begin("glTexEnviv");
         arg("target", target);
         arg("pname", pname);
-        arg("params", params.toString());
+        arg("params", Arrays.toString(params));
         arg("offset", offset);
         end();
         mgl11.glTexEnviv(target, pname, params, offset);
@@ -3281,7 +3281,7 @@
         begin("glTexParameterfv");
         arg("target", target);
         arg("pname", pname);
-        arg("params", params.toString());
+        arg("params", Arrays.toString(params));
         arg("offset", offset);
         end();
         mgl11.glTexParameterfv( target, pname, params, offset);
@@ -3313,7 +3313,7 @@
         begin("glTexParameterxv");
         arg("target", target);
         arg("pname", pname);
-        arg("params", params.toString());
+        arg("params", Arrays.toString(params));
         arg("offset", offset);
         end();
         mgl11.glTexParameterxv(target, pname, params, offset);
@@ -3356,7 +3356,7 @@
     public void glGetPointerv(int pname, Buffer[] params) {
         begin("glGetPointerv");
         arg("pname", pname);
-        arg("params", params.toString());
+        arg("params", Arrays.toString(params));
         end();
         mgl11.glGetPointerv(pname, params);
         checkError();
@@ -3513,7 +3513,7 @@
     public void glDeleteFramebuffersOES(int n, int[] framebuffers, int offset) {
         begin("glDeleteFramebuffersOES");
         arg("n", n);
-        arg("framebuffers", framebuffers.toString());
+        arg("framebuffers", Arrays.toString(framebuffers));
         arg("offset", offset);
         end();
         mgl11ExtensionPack.glDeleteFramebuffersOES(n, framebuffers, offset);
@@ -3534,7 +3534,7 @@
     public void glDeleteRenderbuffersOES(int n, int[] renderbuffers, int offset) {
         begin("glDeleteRenderbuffersOES");
         arg("n", n);
-        arg("renderbuffers", renderbuffers.toString());
+        arg("renderbuffers", Arrays.toString(renderbuffers));
         arg("offset", offset);
         end();
         mgl11ExtensionPack.glDeleteRenderbuffersOES(n, renderbuffers, offset);
@@ -3591,7 +3591,7 @@
     public void glGenFramebuffersOES(int n, int[] framebuffers, int offset) {
         begin("glGenFramebuffersOES");
         arg("n", n);
-        arg("framebuffers", framebuffers.toString());
+        arg("framebuffers", Arrays.toString(framebuffers));
         arg("offset", offset);
         end();
         mgl11ExtensionPack.glGenFramebuffersOES(n, framebuffers, offset);
@@ -3612,7 +3612,7 @@
     public void glGenRenderbuffersOES(int n, int[] renderbuffers, int offset) {
         begin("glGenRenderbuffersOES");
         arg("n", n);
-        arg("renderbuffers", renderbuffers.toString());
+        arg("renderbuffers", Arrays.toString(renderbuffers));
         arg("offset", offset);
         end();
         mgl11ExtensionPack.glGenRenderbuffersOES(n, renderbuffers, offset);
@@ -3636,7 +3636,7 @@
         arg("target", target);
         arg("attachment", attachment);
         arg("pname", pname);
-        arg("params", params.toString());
+        arg("params", Arrays.toString(params));
         arg("offset", offset);
         end();
         mgl11ExtensionPack.glGetFramebufferAttachmentParameterivOES(target, attachment, pname, params, offset);
@@ -3662,7 +3662,7 @@
         begin("glGetRenderbufferParameterivOES");
         arg("target", target);
         arg("pname", pname);
-        arg("params", params.toString());
+        arg("params", Arrays.toString(params));
         arg("offset", offset);
         end();
         mgl11ExtensionPack.glGetRenderbufferParameterivOES(target, pname, params, offset);
@@ -3686,7 +3686,7 @@
         begin("glGetTexGenfv");
         arg("coord", coord);
         arg("pname", pname);
-        arg("params", params.toString());
+        arg("params", Arrays.toString(params));
         arg("offset", offset);
         end();
         mgl11ExtensionPack.glGetTexGenfv(coord, pname, params, offset);
@@ -3709,7 +3709,7 @@
         begin("glGetTexGeniv");
         arg("coord", coord);
         arg("pname", pname);
-        arg("params", params.toString());
+        arg("params", Arrays.toString(params));
         arg("offset", offset);
         end();
         mgl11ExtensionPack.glGetTexGeniv(coord, pname, params, offset);
@@ -3732,7 +3732,7 @@
         begin("glGetTexGenxv");
         arg("coord", coord);
         arg("pname", pname);
-        arg("params", params.toString());
+        arg("params", Arrays.toString(params));
         arg("offset", offset);
         end();
         mgl11ExtensionPack.glGetTexGenxv(coord, pname, params, offset);
@@ -3799,7 +3799,7 @@
         begin("glTexGenfv");
         arg("coord", coord);
         arg("pname", pname);
-        arg("params", params.toString());
+        arg("params", Arrays.toString(params));
         arg("offset", offset);
         end();
         mgl11ExtensionPack.glTexGenfv(coord, pname, params, offset);
@@ -3833,7 +3833,7 @@
         begin("glTexGeniv");
         arg("coord", coord);
         arg("pname", pname);
-        arg("params", params.toString());
+        arg("params", Arrays.toString(params));
         arg("offset", offset);
         end();
         mgl11ExtensionPack.glTexGeniv(coord, pname, params, offset);
@@ -3867,7 +3867,7 @@
         begin("glTexGenxv");
         arg("coord", coord);
         arg("pname", pname);
-        arg("params", params.toString());
+        arg("params", Arrays.toString(params));
         arg("offset", offset);
         end();
         mgl11ExtensionPack.glTexGenxv(coord, pname, params, offset);
diff --git a/packages/SystemUI/OWNERS b/packages/SystemUI/OWNERS
index 7076ad9..9ef772e 100644
--- a/packages/SystemUI/OWNERS
+++ b/packages/SystemUI/OWNERS
@@ -13,7 +13,7 @@
 brockman@google.com
 brzezinski@google.com
 brycelee@google.com
-ccassidy@google.com
+caitlinshk@google.com
 chrisgollner@google.com
 dupin@google.com
 ethibodeau@google.com
diff --git a/packages/SystemUI/src/com/android/systemui/volume/OWNERS b/packages/SystemUI/src/com/android/systemui/volume/OWNERS
new file mode 100644
index 0000000..e627d61
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/volume/OWNERS
@@ -0,0 +1,4 @@
+asc@google.com # send reviews here
+
+juliacr@google.com
+tsuji@google.com
diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/MediaResumeListenerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/media/MediaResumeListenerTest.kt
index 3d3ac83..83168cb 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/media/MediaResumeListenerTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/media/MediaResumeListenerTest.kt
@@ -305,7 +305,7 @@
         // Then we save an update with the current time
         verify(sharedPrefsEditor).putString(any(), (capture(componentCaptor)))
         componentCaptor.value.split(ResumeMediaBrowser.DELIMITER.toRegex())
-                ?.dropLastWhile { it.isEmpty() }.forEach {
+                .dropLastWhile { it.isEmpty() }.forEach {
             val result = it.split("/")
             assertThat(result.size).isEqualTo(3)
             assertThat(result[2].toLong()).isEqualTo(currentTime)
@@ -392,7 +392,7 @@
         // Then we store the new lastPlayed time
         verify(sharedPrefsEditor).putString(any(), (capture(componentCaptor)))
         componentCaptor.value.split(ResumeMediaBrowser.DELIMITER.toRegex())
-                ?.dropLastWhile { it.isEmpty() }.forEach {
+                .dropLastWhile { it.isEmpty() }.forEach {
                     val result = it.split("/")
                     assertThat(result.size).isEqualTo(3)
                     assertThat(result[2].toLong()).isEqualTo(currentTime)
diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
index 99c8495..9a1d295 100644
--- a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
+++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
@@ -685,8 +685,8 @@
                 if (mTraceManager.isA11yTracingEnabledForTypes(FLAGS_PACKAGE_BROADCAST_RECEIVER)) {
                     mTraceManager.logTrace(LOG_TAG + ".PM.onHandleForceStop",
                             FLAGS_PACKAGE_BROADCAST_RECEIVER,
-                            "intent=" + intent + ";packages=" + packages + ";uid=" + uid
-                            + ";doit=" + doit);
+                            "intent=" + intent + ";packages=" + Arrays.toString(packages)
+                            + ";uid=" + uid + ";doit=" + doit);
                 }
                 synchronized (mLock) {
                     final int userId = getChangingUserId();
diff --git a/services/accessibility/java/com/android/server/accessibility/gestures/MultiFingerSwipe.java b/services/accessibility/java/com/android/server/accessibility/gestures/MultiFingerSwipe.java
index f731c44..d20fa8e 100644
--- a/services/accessibility/java/com/android/server/accessibility/gestures/MultiFingerSwipe.java
+++ b/services/accessibility/java/com/android/server/accessibility/gestures/MultiFingerSwipe.java
@@ -447,7 +447,7 @@
         StringBuilder builder = new StringBuilder(super.toString());
         if (getState() != STATE_GESTURE_CANCELED) {
             builder.append(", mBase: ")
-                    .append(mBase.toString())
+                    .append(Arrays.toString(mBase))
                     .append(", mMinPixelsBetweenSamplesX:")
                     .append(mMinPixelsBetweenSamplesX)
                     .append(", mMinPixelsBetweenSamplesY:")
diff --git a/services/backup/java/com/android/server/backup/UserBackupManagerService.java b/services/backup/java/com/android/server/backup/UserBackupManagerService.java
index ca7fe0c..b9cbf12 100644
--- a/services/backup/java/com/android/server/backup/UserBackupManagerService.java
+++ b/services/backup/java/com/android/server/backup/UserBackupManagerService.java
@@ -85,7 +85,6 @@
 import android.os.Process;
 import android.os.RemoteException;
 import android.os.SELinux;
-import android.os.ServiceManager;
 import android.os.SystemClock;
 import android.os.UserHandle;
 import android.os.WorkSource;
@@ -2832,7 +2831,7 @@
                                         + " includekeyvalue="
                                         + doKeyValue
                                         + " pkgs="
-                                        + pkgList));
+                                        + Arrays.toString(pkgList)));
             }
             Slog.i(TAG, addUserIdToLogMessage(mUserId, "Beginning adb backup..."));
 
diff --git a/services/backup/java/com/android/server/backup/utils/BackupEligibilityRules.java b/services/backup/java/com/android/server/backup/utils/BackupEligibilityRules.java
index bd1ac2dc..00f0867 100644
--- a/services/backup/java/com/android/server/backup/utils/BackupEligibilityRules.java
+++ b/services/backup/java/com/android/server/backup/utils/BackupEligibilityRules.java
@@ -25,9 +25,9 @@
 import android.annotation.Nullable;
 import android.app.backup.BackupManager.OperationType;
 import android.app.backup.BackupTransport;
+import android.app.compat.CompatChanges;
 import android.compat.annotation.ChangeId;
 import android.compat.annotation.EnabledSince;
-import android.app.compat.CompatChanges;
 import android.compat.annotation.Overridable;
 import android.content.pm.ApplicationInfo;
 import android.content.pm.PackageInfo;
@@ -46,6 +46,7 @@
 
 import com.google.android.collect.Sets;
 
+import java.util.Arrays;
 import java.util.Set;
 
 /**
@@ -359,8 +360,8 @@
         }
 
         if (DEBUG) {
-            Slog.v(TAG, "signaturesMatch(): stored=" + storedSigs + " device="
-                    + signingInfo.getApkContentsSigners());
+            Slog.v(TAG, "signaturesMatch(): stored=" + Arrays.toString(storedSigs)
+                    + " device=" + Arrays.toString(signingInfo.getApkContentsSigners()));
         }
 
         final int nStored = storedSigs.length;
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index 8856147..bc065d1 100644
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -17794,6 +17794,13 @@
     }
 
     /**
+     * Reset the dropbox rate limiter
+     */
+    void resetDropboxRateLimiter() {
+        mDropboxRateLimiter.reset();
+    }
+
+    /**
      * Kill processes for the user with id userId and that depend on the package named packageName
      */
     @Override
diff --git a/services/core/java/com/android/server/am/ActivityManagerShellCommand.java b/services/core/java/com/android/server/am/ActivityManagerShellCommand.java
index 570a157..82d0b67 100644
--- a/services/core/java/com/android/server/am/ActivityManagerShellCommand.java
+++ b/services/core/java/com/android/server/am/ActivityManagerShellCommand.java
@@ -350,6 +350,8 @@
                     return runSetBgAbusiveUids(pw);
                 case "list-bg-exemptions-config":
                     return runListBgExemptionsConfig(pw);
+                case "reset-dropbox-rate-limiter":
+                    return runResetDropboxRateLimiter();
                 default:
                     return handleDefaultCommands(cmd);
             }
@@ -3374,6 +3376,11 @@
         return 0;
     }
 
+    int runResetDropboxRateLimiter() throws RemoteException {
+        mInternal.resetDropboxRateLimiter();
+        return 0;
+    }
+
     private Resources getResources(PrintWriter pw) throws RemoteException {
         // system resources does not contain all the device configuration, construct it manually.
         Configuration config = mInterface.getConfiguration();
diff --git a/services/core/java/com/android/server/am/DropboxRateLimiter.java b/services/core/java/com/android/server/am/DropboxRateLimiter.java
index baf062d..6087f76 100644
--- a/services/core/java/com/android/server/am/DropboxRateLimiter.java
+++ b/services/core/java/com/android/server/am/DropboxRateLimiter.java
@@ -19,11 +19,13 @@
 import android.os.SystemClock;
 import android.text.format.DateUtils;
 import android.util.ArrayMap;
+import android.util.Slog;
 
 import com.android.internal.annotations.GuardedBy;
 
 /** Rate limiter for adding errors into dropbox. */
 public class DropboxRateLimiter {
+    private static final String TAG = "DropboxRateLimiter";
     // After RATE_LIMIT_ALLOWED_ENTRIES have been collected (for a single breakdown of
     // process/eventType) further entries will be rejected until RATE_LIMIT_BUFFER_DURATION has
     // elapsed, after which the current count for this breakdown will be reset.
@@ -105,6 +107,15 @@
         mLastMapCleanUp = now;
     }
 
+    /** Resets the rate limiter memory. */
+    void reset() {
+        synchronized (mErrorClusterRecords) {
+            mErrorClusterRecords.clear();
+        }
+        mLastMapCleanUp = 0L;
+        Slog.i(TAG, "Rate limiter reset.");
+    }
+
     String errorKey(String eventType, String processName) {
         return eventType + processName;
     }
diff --git a/services/core/java/com/android/server/appop/DiscreteRegistry.java b/services/core/java/com/android/server/appop/DiscreteRegistry.java
index 158092f..dd0c4b86 100644
--- a/services/core/java/com/android/server/appop/DiscreteRegistry.java
+++ b/services/core/java/com/android/server/appop/DiscreteRegistry.java
@@ -816,8 +816,7 @@
 
                     }
                 } catch (Throwable t) {
-                    Slog.e(TAG, "Error while cleaning timeline files: " + t.getMessage() + " "
-                            + t.getStackTrace());
+                    Slog.e(TAG, "Error while cleaning timeline files: ", t);
                 }
             }
         }
diff --git a/services/core/java/com/android/server/backup/BackupUtils.java b/services/core/java/com/android/server/backup/BackupUtils.java
index 96c5621..76eba16 100644
--- a/services/core/java/com/android/server/backup/BackupUtils.java
+++ b/services/core/java/com/android/server/backup/BackupUtils.java
@@ -30,6 +30,7 @@
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
+import java.util.stream.Collectors;
 
 public class BackupUtils {
     private static final String TAG = "BackupUtils";
@@ -64,8 +65,9 @@
         }
 
         if (DEBUG) {
-            Slog.v(TAG, "signaturesMatch(): stored=" + storedSigHashes
-                    + " device=" + signingInfo.getApkContentsSigners());
+            Slog.v(TAG, "signaturesMatch(): stored="
+                    + storedSigHashes.stream().map(Arrays::toString).collect(Collectors.toList())
+                    + " device=" + Arrays.toString(signingInfo.getApkContentsSigners()));
         }
 
         final int nStored = storedSigHashes.size();
diff --git a/services/core/java/com/android/server/connectivity/Vpn.java b/services/core/java/com/android/server/connectivity/Vpn.java
index 931c692..9cb1f1d 100644
--- a/services/core/java/com/android/server/connectivity/Vpn.java
+++ b/services/core/java/com/android/server/connectivity/Vpn.java
@@ -756,6 +756,8 @@
             int errorCode, @NonNull final String packageName, @Nullable final String sessionKey,
             @NonNull final VpnProfileState profileState, @Nullable final Network underlyingNetwork,
             @Nullable final NetworkCapabilities nc, @Nullable final LinkProperties lp) {
+        // Add log for debugging flaky test. b/242833779
+        Log.d(TAG, "buildVpnManagerEventIntent: sessionKey = " + sessionKey);
         final Intent intent = new Intent(VpnManager.ACTION_VPN_MANAGER_EVENT);
         intent.setPackage(packageName);
         intent.addCategory(category);
@@ -1110,7 +1112,7 @@
         // Except for Settings and VpnDialogs, the caller should be matched one of oldPackage or
         // newPackage. Otherwise, non VPN owner might get the VPN always-on status of the VPN owner.
         // See b/191382886.
-        if (!hasControlVpnPermission()) {
+        if (mContext.checkCallingOrSelfPermission(CONTROL_VPN) != PERMISSION_GRANTED) {
             if (oldPackage != null) {
                 verifyCallingUidAndPackage(oldPackage);
             }
@@ -1196,25 +1198,7 @@
                 mContext.unbindService(mConnection);
                 cleanupVpnStateLocked();
             } else if (mVpnRunner != null) {
-                // Build intent first because the sessionKey will be reset after performing
-                // VpnRunner.exit(). Also, cache mOwnerUID even if ownerUID will not be changed in
-                // VpnRunner.exit() to prevent design being changed in the future.
-                // TODO(b/230548427): Remove SDK check once VPN related stuff are decoupled from
-                //  ConnectivityServiceTest.
-                final int ownerUid = mOwnerUID;
-                Intent intent = null;
-                if (SdkLevel.isAtLeastT() && isVpnApp(mPackage)) {
-                    intent = buildVpnManagerEventIntent(
-                            VpnManager.CATEGORY_EVENT_DEACTIVATED_BY_USER,
-                            -1 /* errorClass */, -1 /* errorCode*/, mPackage,
-                            getSessionKeyLocked(), makeVpnProfileStateLocked(),
-                            null /* underlyingNetwork */, null /* nc */, null /* lp */);
-                }
-                // cleanupVpnStateLocked() is called from mVpnRunner.exit()
-                mVpnRunner.exit();
-                if (intent != null && isVpnApp(mPackage)) {
-                    notifyVpnManagerVpnStopped(mPackage, ownerUid, intent);
-                }
+                stopVpnRunnerAndNotifyAppLocked(mPackage);
             }
 
             try {
@@ -2073,10 +2057,6 @@
                 "Unauthorized Caller");
     }
 
-    private boolean hasControlVpnPermission() {
-        return mContext.checkCallingOrSelfPermission(CONTROL_VPN) == PERMISSION_GRANTED;
-    }
-
     private class Connection implements ServiceConnection {
         private IBinder mService;
 
@@ -2778,6 +2758,8 @@
             mIpSecManager = (IpSecManager) mContext.getSystemService(Context.IPSEC_SERVICE);
             mNetworkCallback = new VpnIkev2Utils.Ikev2VpnNetworkCallback(TAG, this, mExecutor);
             mSessionKey = UUID.randomUUID().toString();
+            // Add log for debugging flaky test. b/242833779
+            Log.d(TAG, "Generate session key = " + mSessionKey);
 
             // Set the policy so that cancelled tasks will be removed from the work queue
             mExecutor.setRemoveOnCancelPolicy(true);
@@ -3901,10 +3883,8 @@
             Binder.restoreCallingIdentity(token);
         }
 
-        // If package has CONTROL_VPN, grant the ACTIVATE_PLATFORM_VPN appop.
-        if (hasControlVpnPermission()) {
-            setPackageAuthorization(packageName, VpnManager.TYPE_VPN_PLATFORM);
-        }
+        // TODO: if package has CONTROL_VPN, grant the ACTIVATE_PLATFORM_VPN appop.
+        // This mirrors the prepareAndAuthorize that is used by VpnService.
 
         // Return whether the app is already pre-consented
         return isVpnProfilePreConsented(mContext, packageName);
@@ -3972,7 +3952,13 @@
     @GuardedBy("this")
     @Nullable
     private String getSessionKeyLocked() {
-        return isIkev2VpnRunner() ? ((IkeV2VpnRunner) mVpnRunner).mSessionKey : null;
+        // Add log for debugging flaky test. b/242833779
+        final boolean isIkev2VpnRunner = isIkev2VpnRunner();
+        final String sessionKey =
+                isIkev2VpnRunner ? ((IkeV2VpnRunner) mVpnRunner).mSessionKey : null;
+        Log.d(TAG, "getSessionKeyLocked: isIkev2VpnRunner = " + isIkev2VpnRunner
+                + ", sessionKey = " + sessionKey);
+        return sessionKey;
     }
 
     /**
@@ -4074,6 +4060,29 @@
         }
     }
 
+    @GuardedBy("this")
+    private void stopVpnRunnerAndNotifyAppLocked(@NonNull String packageName) {
+        // Build intent first because the sessionKey will be reset after performing
+        // VpnRunner.exit(). Also, cache mOwnerUID even if ownerUID will not be changed in
+        // VpnRunner.exit() to prevent design being changed in the future.
+        // TODO(b/230548427): Remove SDK check once VPN related stuff are decoupled from
+        //  ConnectivityServiceTest.
+        final int ownerUid = mOwnerUID;
+        Intent intent = null;
+        if (SdkLevel.isAtLeastT() && isVpnApp(packageName)) {
+            intent = buildVpnManagerEventIntent(
+                    VpnManager.CATEGORY_EVENT_DEACTIVATED_BY_USER,
+                    -1 /* errorClass */, -1 /* errorCode*/, packageName,
+                    getSessionKeyLocked(), makeVpnProfileStateLocked(),
+                    null /* underlyingNetwork */, null /* nc */, null /* lp */);
+        }
+        // cleanupVpnStateLocked() is called from mVpnRunner.exit()
+        mVpnRunner.exit();
+        if (intent != null && isVpnApp(packageName)) {
+            notifyVpnManagerVpnStopped(packageName, ownerUid, intent);
+        }
+    }
+
     /**
      * Stops an already running VPN Profile for the given package.
      *
@@ -4090,18 +4099,7 @@
         // To stop the VPN profile, the caller must be the current prepared package and must be
         // running an Ikev2VpnProfile.
         if (isCurrentIkev2VpnLocked(packageName)) {
-            // Build intent first because the sessionKey will be reset after performing
-            // VpnRunner.exit(). Also, cache mOwnerUID even if ownerUID will not be changed in
-            // VpnRunner.exit() to prevent design being changed in the future.
-            final int ownerUid = mOwnerUID;
-            final Intent intent = buildVpnManagerEventIntent(
-                    VpnManager.CATEGORY_EVENT_DEACTIVATED_BY_USER,
-                    -1 /* errorClass */, -1 /* errorCode*/, packageName,
-                    getSessionKeyLocked(), makeVpnProfileStateLocked(),
-                    null /* underlyingNetwork */, null /* nc */, null /* lp */);
-
-            mVpnRunner.exit();
-            notifyVpnManagerVpnStopped(packageName, ownerUid, intent);
+            stopVpnRunnerAndNotifyAppLocked(packageName);
         }
     }
 
diff --git a/services/core/java/com/android/server/location/gnss/GnssNetworkConnectivityHandler.java b/services/core/java/com/android/server/location/gnss/GnssNetworkConnectivityHandler.java
index aba7572..d9ca4d3 100644
--- a/services/core/java/com/android/server/location/gnss/GnssNetworkConnectivityHandler.java
+++ b/services/core/java/com/android/server/location/gnss/GnssNetworkConnectivityHandler.java
@@ -554,7 +554,7 @@
                 mAGpsDataConnectionIpAddr = InetAddress.getByAddress(suplIpAddr);
                 if (DEBUG) Log.d(TAG, "IP address converted to: " + mAGpsDataConnectionIpAddr);
             } catch (UnknownHostException e) {
-                Log.e(TAG, "Bad IP Address: " + suplIpAddr, e);
+                Log.e(TAG, "Bad IP Address: " + Arrays.toString(suplIpAddr), e);
             }
         }
 
diff --git a/services/core/java/com/android/server/logcat/OWNERS b/services/core/java/com/android/server/logcat/OWNERS
index 9588fa9..87d30f3 100644
--- a/services/core/java/com/android/server/logcat/OWNERS
+++ b/services/core/java/com/android/server/logcat/OWNERS
@@ -1,5 +1,7 @@
 cbrubaker@google.com
 eunjeongshin@google.com
+georgechan@google.com
 jsharkey@google.com
 vishwath@google.com
 wenhaowang@google.com
+xiaozhenl@google.com
diff --git a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java
index c73c5a0..e2c4cbd 100644
--- a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java
+++ b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java
@@ -123,6 +123,7 @@
 import static android.telephony.CarrierConfigManager.KEY_DATA_WARNING_NOTIFICATION_BOOL;
 import static android.telephony.SubscriptionManager.INVALID_SUBSCRIPTION_ID;
 
+import static com.android.internal.annotations.VisibleForTesting.Visibility.PRIVATE;
 import static com.android.internal.util.ArrayUtils.appendInt;
 import static com.android.internal.util.XmlUtils.readBooleanAttribute;
 import static com.android.internal.util.XmlUtils.readIntAttribute;
@@ -3158,7 +3159,8 @@
      * active merge set [A,B], we'd return a new template that primarily matches
      * A, but also matches B.
      */
-    private static NetworkTemplate normalizeTemplate(@NonNull NetworkTemplate template,
+    @VisibleForTesting(visibility = PRIVATE)
+    static NetworkTemplate normalizeTemplate(@NonNull NetworkTemplate template,
             @NonNull List<String[]> mergedList) {
         // Now there are several types of network which uses Subscriber Id to store network
         // information. For instance:
@@ -3168,6 +3170,12 @@
         if (template.getSubscriberIds().isEmpty()) return template;
 
         for (final String[] merged : mergedList) {
+            // In some rare cases (e.g. b/243015487), merged subscriberId list might contain
+            // duplicated items. Deduplication for better error handling.
+            final ArraySet mergedSet = new ArraySet(merged);
+            if (mergedSet.size() != merged.length) {
+                Log.wtf(TAG, "Duplicated merged list detected: " + Arrays.toString(merged));
+            }
             // TODO: Handle incompatible subscriberIds if that happens in practice.
             for (final String subscriberId : template.getSubscriberIds()) {
                 if (com.android.net.module.util.CollectionUtils.contains(merged, subscriberId)) {
@@ -3175,7 +3183,7 @@
                     // a template that matches all merged subscribers.
                     return new NetworkTemplate.Builder(template.getMatchRule())
                             .setWifiNetworkKeys(template.getWifiNetworkKeys())
-                            .setSubscriberIds(Set.of(merged))
+                            .setSubscriberIds(mergedSet)
                             .setMeteredness(template.getMeteredness())
                             .build();
                 }
diff --git a/services/core/java/com/android/server/net/watchlist/WatchlistLoggingHandler.java b/services/core/java/com/android/server/net/watchlist/WatchlistLoggingHandler.java
index 5599b0c..8ce7b57 100644
--- a/services/core/java/com/android/server/net/watchlist/WatchlistLoggingHandler.java
+++ b/services/core/java/com/android/server/net/watchlist/WatchlistLoggingHandler.java
@@ -36,7 +36,6 @@
 import android.text.TextUtils;
 import android.util.Slog;
 
-import com.android.internal.annotations.GuardedBy;
 import com.android.internal.annotations.VisibleForTesting;
 import com.android.internal.util.ArrayUtils;
 import com.android.internal.util.HexDump;
@@ -45,8 +44,8 @@
 import java.io.IOException;
 import java.security.NoSuchAlgorithmException;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.GregorianCalendar;
-import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
 import java.util.concurrent.ConcurrentHashMap;
@@ -155,7 +154,7 @@
         try {
             final String[] packageNames = mPm.getPackagesForUid(uid);
             if (packageNames == null || packageNames.length == 0) {
-                Slog.e(TAG, "Couldn't find package: " + packageNames);
+                Slog.e(TAG, "Couldn't find package: " + Arrays.toString(packageNames));
                 return false;
             }
             ai = mPm.getApplicationInfo(packageNames[0], 0);
diff --git a/services/core/java/com/android/server/wm/AccessibilityController.java b/services/core/java/com/android/server/wm/AccessibilityController.java
index f1dbad61..d8e4b38 100644
--- a/services/core/java/com/android/server/wm/AccessibilityController.java
+++ b/services/core/java/com/android/server/wm/AccessibilityController.java
@@ -420,7 +420,7 @@
         if (mAccessibilityTracing.isTracingEnabled(FLAGS_WINDOWS_FOR_ACCESSIBILITY_CALLBACK)) {
             mAccessibilityTracing.logTrace(TAG + ".onSomeWindowResizedOrMoved",
                     FLAGS_WINDOWS_FOR_ACCESSIBILITY_CALLBACK,
-                    "displayIds={" + displayIds.toString() + "}", "".getBytes(), callingUid);
+                    "displayIds={" + Arrays.toString(displayIds) + "}", "".getBytes(), callingUid);
         }
         // Not relevant for the display magnifier.
         for (int i = 0; i < displayIds.length; i++) {
diff --git a/services/core/java/com/android/server/wm/TaskPersister.java b/services/core/java/com/android/server/wm/TaskPersister.java
index b8d2feb..09fd900 100644
--- a/services/core/java/com/android/server/wm/TaskPersister.java
+++ b/services/core/java/com/android/server/wm/TaskPersister.java
@@ -53,6 +53,7 @@
 import java.io.IOException;
 import java.io.InputStream;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collections;
 import java.util.Comparator;
 import java.util.List;
@@ -424,7 +425,7 @@
 
     private static void removeObsoleteFiles(ArraySet<Integer> persistentTaskIds, File[] files) {
         if (DEBUG) Slog.d(TAG, "removeObsoleteFiles: persistentTaskIds=" + persistentTaskIds +
-                " files=" + files);
+                " files=" + Arrays.toString(files));
         if (files == null) {
             Slog.e(TAG, "File error accessing recents directory (directory doesn't exist?).");
             return;
diff --git a/services/credentials/OWNERS b/services/credentials/OWNERS
new file mode 100644
index 0000000..f3b43c1
--- /dev/null
+++ b/services/credentials/OWNERS
@@ -0,0 +1 @@
+include /core/java/android/credentials/OWNERS
diff --git a/services/profcollect/src/com/android/server/profcollect/ProfcollectForwardingService.java b/services/profcollect/src/com/android/server/profcollect/ProfcollectForwardingService.java
index d322290..3c68662 100644
--- a/services/profcollect/src/com/android/server/profcollect/ProfcollectForwardingService.java
+++ b/services/profcollect/src/com/android/server/profcollect/ProfcollectForwardingService.java
@@ -205,6 +205,7 @@
                     .setRequiresDeviceIdle(true)
                     .setRequiresCharging(true)
                     .setPeriodic(BG_PROCESS_PERIOD)
+                    .setPriority(JobInfo.PRIORITY_MIN)
                     .build());
         }
 
diff --git a/services/tests/PackageManagerServiceTests/host/src/com/android/server/pm/test/SystemStubMultiUserDisableUninstallTest.kt b/services/tests/PackageManagerServiceTests/host/src/com/android/server/pm/test/SystemStubMultiUserDisableUninstallTest.kt
index 45e0d09..4ef6875 100644
--- a/services/tests/PackageManagerServiceTests/host/src/com/android/server/pm/test/SystemStubMultiUserDisableUninstallTest.kt
+++ b/services/tests/PackageManagerServiceTests/host/src/com/android/server/pm/test/SystemStubMultiUserDisableUninstallTest.kt
@@ -628,6 +628,7 @@
             CodePath.SAME, CodePath.DIFFERENT ->
                 throw AssertionError("secondDataPath cannot be a data path")
             CodePath.SYSTEM -> assertThat(codePaths[1]).isEqualTo(stubFile.parent.toString())
+            else -> {}
         }
     }
 
diff --git a/services/tests/servicestests/src/com/android/server/accessibility/MotionEventInjectorTest.java b/services/tests/servicestests/src/com/android/server/accessibility/MotionEventInjectorTest.java
index 59b69f9..233caf9 100644
--- a/services/tests/servicestests/src/com/android/server/accessibility/MotionEventInjectorTest.java
+++ b/services/tests/servicestests/src/com/android/server/accessibility/MotionEventInjectorTest.java
@@ -837,7 +837,7 @@
 
             @Override
             public void describeTo(Description description) {
-                description.appendText("Contains points " + points);
+                description.appendText("Contains points " + Arrays.toString(points));
             }
         };
     }
diff --git a/services/tests/servicestests/src/com/android/server/net/NetworkPolicyManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/net/NetworkPolicyManagerServiceTest.java
index 0f2fe44..821ce5e 100644
--- a/services/tests/servicestests/src/com/android/server/net/NetworkPolicyManagerServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/net/NetworkPolicyManagerServiceTest.java
@@ -75,6 +75,7 @@
 import static com.android.server.net.NetworkPolicyManagerService.TYPE_RAPID;
 import static com.android.server.net.NetworkPolicyManagerService.TYPE_WARNING;
 import static com.android.server.net.NetworkPolicyManagerService.UidBlockedState.getEffectiveBlockedReasons;
+import static com.android.server.net.NetworkPolicyManagerService.normalizeTemplate;
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
@@ -2030,6 +2031,18 @@
                 METERED_NO, actualPolicy.template.getMeteredness());
     }
 
+    @Test
+    public void testNormalizeTemplate_duplicatedMergedImsiList() {
+        final NetworkTemplate template = new NetworkTemplate.Builder(MATCH_CARRIER)
+                .setSubscriberIds(Set.of(TEST_IMSI)).build();
+        final String[] mergedImsiGroup = new String[] {TEST_IMSI, TEST_IMSI};
+        final ArrayList<String[]> mergedList = new ArrayList<>();
+        mergedList.add(mergedImsiGroup);
+        // Verify the duplicated items in the merged IMSI list won't crash the system.
+        final NetworkTemplate result = normalizeTemplate(template, mergedList);
+        assertEquals(template, result);
+    }
+
     private String formatBlockedStateError(int uid, int rule, boolean metered,
             boolean backgroundRestricted) {
         return String.format(
diff --git a/services/usage/java/com/android/server/usage/AppTimeLimitController.java b/services/usage/java/com/android/server/usage/AppTimeLimitController.java
index f169926..1b34b81 100644
--- a/services/usage/java/com/android/server/usage/AppTimeLimitController.java
+++ b/services/usage/java/com/android/server/usage/AppTimeLimitController.java
@@ -772,7 +772,7 @@
             observerApp.appUsageGroups.append(observerId, group);
 
             if (DEBUG) {
-                Slog.d(TAG, "addObserver " + observed + " for " + timeLimit);
+                Slog.d(TAG, "addObserver " + Arrays.toString(observed) + " for " + timeLimit);
             }
 
             user.addUsageGroup(group);
@@ -881,7 +881,7 @@
             observerApp.appUsageLimitGroups.append(observerId, group);
 
             if (DEBUG) {
-                Slog.d(TAG, "addObserver " + observed + " for " + timeLimit);
+                Slog.d(TAG, "addObserver " + Arrays.toString(observed) + " for " + timeLimit);
             }
 
             user.addUsageGroup(group);
diff --git a/telecomm/java/android/telecom/DisconnectCause.java b/telecomm/java/android/telecom/DisconnectCause.java
index 0f034ad..b003f59 100644
--- a/telecomm/java/android/telecom/DisconnectCause.java
+++ b/telecomm/java/android/telecom/DisconnectCause.java
@@ -88,8 +88,8 @@
     public static final String REASON_WIFI_ON_BUT_WFC_OFF = "REASON_WIFI_ON_BUT_WFC_OFF";
 
     /**
-     * Reason code (returned via {@link #getReason()}), which indicates that the video telephony
-     * call was disconnected because IMS access is blocked.
+     * Reason code (returned via {@link #getReason()}), which indicates that the call was
+     * disconnected because IMS access is blocked.
      */
     public static final String REASON_IMS_ACCESS_BLOCKED = "REASON_IMS_ACCESS_BLOCKED";
 
diff --git a/telephony/common/com/google/android/mms/pdu/PduParser.java b/telephony/common/com/google/android/mms/pdu/PduParser.java
index 677fe2f..62eac7a 100755
--- a/telephony/common/com/google/android/mms/pdu/PduParser.java
+++ b/telephony/common/com/google/android/mms/pdu/PduParser.java
@@ -793,7 +793,7 @@
                         try {
                             if (LOCAL_LOGV) {
                                 Log.v(LOG_TAG, "parseHeaders: CONTENT_TYPE: " + headerField +
-                                        contentType.toString());
+                                        Arrays.toString(contentType));
                             }
                             headers.setTextString(contentType, PduHeaders.CONTENT_TYPE);
                         } catch(NullPointerException e) {
diff --git a/telephony/java/android/telephony/AccessNetworkConstants.java b/telephony/java/android/telephony/AccessNetworkConstants.java
index 4469ffc..7eec86a 100644
--- a/telephony/java/android/telephony/AccessNetworkConstants.java
+++ b/telephony/java/android/telephony/AccessNetworkConstants.java
@@ -115,15 +115,15 @@
         /** @hide */
         public static @RadioAccessNetworkType int fromString(@NonNull String str) {
             switch (str.toUpperCase()) {
-                case "GERAN" : return GERAN;
-                case "UTRAN" : return UTRAN;
-                case "EUTRAN" : return EUTRAN;
-                case "CDMA2000" : return CDMA2000;
-                case "IWLAN" : return IWLAN;
-                case "NGRAN" : return NGRAN;
+                case "UNKNOWN": return UNKNOWN;
+                case "GERAN": return GERAN;
+                case "UTRAN": return UTRAN;
+                case "EUTRAN": return EUTRAN;
+                case "CDMA2000": return CDMA2000;
+                case "IWLAN": return IWLAN;
+                case "NGRAN": return NGRAN;
                 default:
-                    Rlog.e(TAG, "Invalid access network type " + str);
-                    return UNKNOWN;
+                    throw new IllegalArgumentException("Invalid access network type " + str);
             }
         }
     }
diff --git a/telephony/java/android/telephony/CarrierConfigManager.java b/telephony/java/android/telephony/CarrierConfigManager.java
index 70fe6b1..e032f65 100644
--- a/telephony/java/android/telephony/CarrierConfigManager.java
+++ b/telephony/java/android/telephony/CarrierConfigManager.java
@@ -8550,6 +8550,13 @@
      * IWLAN handover rules that determine whether handover is allowed or disallowed between
      * cellular and IWLAN.
      *
+     * Rule syntax: "source=[GERAN|UTRAN|EUTRAN|NGRAN|IWLAN|UNKNOWN], target=[GERAN|UTRAN|EUTRAN
+     * |NGRAN|IWLAN], type=[allowed|disallowed], roaming=[true|false], capabilities=[INTERNET|MMS
+     * |FOTA|IMS|CBS|SUPL|EIMS|XCAP|DUN]"
+     *
+     * Note that UNKNOWN can be only specified in the source access network and can be only used
+     * in the disallowed rule.
+     *
      * The handover rules will be matched in the order. Here are some sample rules.
      * <string-array name="iwlan_handover_rules" num="5">
      *     <!-- Handover from IWLAN to 2G/3G is not allowed -->
diff --git a/telephony/java/android/telephony/DataFailCause.java b/telephony/java/android/telephony/DataFailCause.java
index ac1f376..5f7cfd1 100644
--- a/telephony/java/android/telephony/DataFailCause.java
+++ b/telephony/java/android/telephony/DataFailCause.java
@@ -981,8 +981,15 @@
     /** The ePDG does not support un-authenticated IMSI based emergency PDN bringup **/
     public static final int IWLAN_UNAUTHENTICATED_EMERGENCY_NOT_SUPPORTED = 0x2B2F;
 
-    // Device is unable to establish an IPSec tunnel with the ePDG for any reason
-    // e.g authentication fail or certificate validation or DNS Resolution and timeout failure.
+    // The below error causes are relevant when the device is unable to establish an IPSec tunnel
+    // with the ePDG for any reason, e.g. authentication fail or certificate validation or DNS
+    // Resolution and timeout failure.
+
+    /**
+     * The requested service was rejected because of congestion in the network while accessing the
+     * IWLAN ePDG. Defined in 3GPP TS 24.502, Section 9.2.4.2.
+     */
+    public static final int IWLAN_CONGESTION = 0x3C8C;
 
     /** IKE configuration error resulting in failure  */
     public static final int IWLAN_IKEV2_CONFIG_FAILURE = 0x4000;
diff --git a/telephony/java/android/telephony/PhysicalChannelConfig.java b/telephony/java/android/telephony/PhysicalChannelConfig.java
index d978f57..212aaae 100644
--- a/telephony/java/android/telephony/PhysicalChannelConfig.java
+++ b/telephony/java/android/telephony/PhysicalChannelConfig.java
@@ -433,7 +433,8 @@
         return Objects.hash(
                 mCellConnectionStatus, mCellBandwidthDownlinkKhz, mCellBandwidthUplinkKhz,
                 mNetworkType, mFrequencyRange, mDownlinkChannelNumber, mUplinkChannelNumber,
-                mContextIds, mPhysicalCellId, mBand, mDownlinkFrequency, mUplinkFrequency);
+                Arrays.hashCode(mContextIds), mPhysicalCellId, mBand, mDownlinkFrequency,
+                mUplinkFrequency);
     }
 
     public static final
diff --git a/telephony/java/android/telephony/SignalThresholdInfo.java b/telephony/java/android/telephony/SignalThresholdInfo.java
index ae7d209..3c18245 100644
--- a/telephony/java/android/telephony/SignalThresholdInfo.java
+++ b/telephony/java/android/telephony/SignalThresholdInfo.java
@@ -574,8 +574,8 @@
 
     @Override
     public int hashCode() {
-        return Objects.hash(mRan, mSignalMeasurementType, mHysteresisMs, mHysteresisDb, mThresholds,
-                mIsEnabled);
+        return Objects.hash(mRan, mSignalMeasurementType, mHysteresisMs, mHysteresisDb,
+                Arrays.hashCode(mThresholds), mIsEnabled);
     }
 
     public static final @NonNull Parcelable.Creator<SignalThresholdInfo> CREATOR =
diff --git a/telephony/java/android/telephony/SmsManager.java b/telephony/java/android/telephony/SmsManager.java
index cbd03c7..d670e55 100644
--- a/telephony/java/android/telephony/SmsManager.java
+++ b/telephony/java/android/telephony/SmsManager.java
@@ -1935,7 +1935,7 @@
                         + " at calling enableCellBroadcastRangeForSubscriber. subId = " + subId);
             }
         } catch (RemoteException ex) {
-            Rlog.d(TAG, "enableCellBroadcastRange: " + ex.getStackTrace());
+            Rlog.d(TAG, "enableCellBroadcastRange: ", ex);
             // ignore it
         }
 
@@ -1996,7 +1996,7 @@
                         + " at calling disableCellBroadcastRangeForSubscriber. subId = " + subId);
             }
         } catch (RemoteException ex) {
-            Rlog.d(TAG, "disableCellBroadcastRange: " + ex.getStackTrace());
+            Rlog.d(TAG, "disableCellBroadcastRange: ", ex);
             // ignore it
         }
 
diff --git a/telephony/java/android/telephony/SubscriptionInfo.java b/telephony/java/android/telephony/SubscriptionInfo.java
index c36eb2f..cb985bf 100644
--- a/telephony/java/android/telephony/SubscriptionInfo.java
+++ b/telephony/java/android/telephony/SubscriptionInfo.java
@@ -967,9 +967,9 @@
     public int hashCode() {
         return Objects.hash(mId, mSimSlotIndex, mNameSource, mIconTint, mDataRoaming, mIsEmbedded,
                 mIsOpportunistic, mGroupUUID, mIccId, mNumber, mMcc, mMnc, mCountryIso, mCardString,
-                mCardId, mDisplayName, mCarrierName, mNativeAccessRules, mIsGroupDisabled,
-                mCarrierId, mProfileClass, mGroupOwner, mAreUiccApplicationsEnabled, mPortIndex,
-                mUsageSetting);
+                mCardId, mDisplayName, mCarrierName, Arrays.hashCode(mNativeAccessRules),
+                mIsGroupDisabled, mCarrierId, mProfileClass, mGroupOwner,
+                mAreUiccApplicationsEnabled, mPortIndex, mUsageSetting);
     }
 
     @Override
diff --git a/telephony/java/android/telephony/SubscriptionManager.java b/telephony/java/android/telephony/SubscriptionManager.java
index 70f1639..5ed6cb9 100644
--- a/telephony/java/android/telephony/SubscriptionManager.java
+++ b/telephony/java/android/telephony/SubscriptionManager.java
@@ -139,24 +139,19 @@
     @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
     public static final Uri CONTENT_URI = SimInfo.CONTENT_URI;
 
-    /** @hide */
-    public static final String CACHE_KEY_DEFAULT_SUB_ID_PROPERTY =
+    private static final String CACHE_KEY_DEFAULT_SUB_ID_PROPERTY =
             "cache_key.telephony.get_default_sub_id";
 
-    /** @hide */
-    public static final String CACHE_KEY_DEFAULT_DATA_SUB_ID_PROPERTY =
+    private static final String CACHE_KEY_DEFAULT_DATA_SUB_ID_PROPERTY =
             "cache_key.telephony.get_default_data_sub_id";
 
-    /** @hide */
-    public static final String CACHE_KEY_DEFAULT_SMS_SUB_ID_PROPERTY =
+    private static final String CACHE_KEY_DEFAULT_SMS_SUB_ID_PROPERTY =
             "cache_key.telephony.get_default_sms_sub_id";
 
-    /** @hide */
-    public static final String CACHE_KEY_ACTIVE_DATA_SUB_ID_PROPERTY =
+    private static final String CACHE_KEY_ACTIVE_DATA_SUB_ID_PROPERTY =
             "cache_key.telephony.get_active_data_sub_id";
 
-    /** @hide */
-    public static final String CACHE_KEY_SLOT_INDEX_PROPERTY =
+    private static final String CACHE_KEY_SLOT_INDEX_PROPERTY =
             "cache_key.telephony.get_slot_index";
 
     /** @hide */
diff --git a/telephony/java/android/telephony/TelephonyScanManager.java b/telephony/java/android/telephony/TelephonyScanManager.java
index e0c5298..19f2a9b 100644
--- a/telephony/java/android/telephony/TelephonyScanManager.java
+++ b/telephony/java/android/telephony/TelephonyScanManager.java
@@ -171,7 +171,7 @@
                                 ci[i] = (CellInfo) parcelables[i];
                             }
                             executor.execute(() -> {
-                                Rlog.d(TAG, "onResults: " + ci.toString());
+                                Rlog.d(TAG, "onResults: " + Arrays.toString(ci));
                                 callback.onResults(Arrays.asList(ci));
                             });
                         } catch (Exception e) {
diff --git a/telephony/java/com/android/internal/telephony/TelephonyIntents.java b/telephony/java/com/android/internal/telephony/TelephonyIntents.java
index b905212..546d2ce 100644
--- a/telephony/java/com/android/internal/telephony/TelephonyIntents.java
+++ b/telephony/java/com/android/internal/telephony/TelephonyIntents.java
@@ -424,4 +424,24 @@
      */
     @Deprecated
     public static final String EXTRA_DEFAULT_NETWORK_AVAILABLE = "defaultNetworkAvailable";
+
+    /**
+     * <p>Broadcast sent to show Emergency notification due to Voice Over Wifi availability
+     *
+     * <p class="note">
+     * You can <em>not</em> receive this through components declared
+     * in manifests, only by explicitly registering for it with
+     * {@link android.content.Context#registerReceiver(android.content.BroadcastReceiver,
+     * android.content.IntentFilter) Context.registerReceiver()}.
+     *
+     * <p class="note">
+     * Requires no permission.
+     *
+     * <p class="note">This is a protected intent that can only be sent
+     * by the system.
+     *
+     * @hide
+     */
+    public static final String ACTION_VOWIFI_ENABLED
+            = "com.android.internal.telephony.ACTION_VOWIFI_ENABLED";
 }
diff --git a/tests/RollbackTest/Android.bp b/tests/RollbackTest/Android.bp
index 9f6ce4e..b7c4c5b 100644
--- a/tests/RollbackTest/Android.bp
+++ b/tests/RollbackTest/Android.bp
@@ -61,6 +61,7 @@
     static_libs: ["RollbackTestLib", "frameworks-base-hostutils"],
     test_suites: ["general-tests"],
     test_config: "NetworkStagedRollbackTest.xml",
+    data: [":RollbackTest"],
 }
 
 java_test_host {
diff --git a/tests/VoiceInteraction/src/com/android/test/voiceinteraction/MainInteractionSession.java b/tests/VoiceInteraction/src/com/android/test/voiceinteraction/MainInteractionSession.java
index db48984..661dd84 100644
--- a/tests/VoiceInteraction/src/com/android/test/voiceinteraction/MainInteractionSession.java
+++ b/tests/VoiceInteraction/src/com/android/test/voiceinteraction/MainInteractionSession.java
@@ -33,6 +33,8 @@
 import android.widget.ImageView;
 import android.widget.TextView;
 
+import java.util.Arrays;
+
 public class MainInteractionSession extends VoiceInteractionSession
         implements View.OnClickListener {
     static final String TAG = "MainInteractionSession";
@@ -403,7 +405,7 @@
     @Override
     public void onRequestPickOption(PickOptionRequest request) {
         Log.i(TAG, "onPickOption: prompt=" + request.getVoicePrompt() + " options="
-                + request.getOptions() + " extras=" + request.getExtras());
+                + Arrays.toString(request.getOptions()) + " extras=" + request.getExtras());
         mConfirmButton.setText("Pick Option");
         mPendingRequest = request;
         setPrompt(request.getVoicePrompt());
diff --git a/tests/VoiceInteraction/src/com/android/test/voiceinteraction/StartVoiceInteractionActivity.java b/tests/VoiceInteraction/src/com/android/test/voiceinteraction/StartVoiceInteractionActivity.java
index 733f602..8ae7186 100644
--- a/tests/VoiceInteraction/src/com/android/test/voiceinteraction/StartVoiceInteractionActivity.java
+++ b/tests/VoiceInteraction/src/com/android/test/voiceinteraction/StartVoiceInteractionActivity.java
@@ -24,6 +24,8 @@
 import android.widget.Button;
 import android.widget.TextView;
 
+import java.util.Arrays;
+
 public class StartVoiceInteractionActivity extends Activity implements View.OnClickListener {
     static final String TAG = "LocalVoiceInteractionActivity";
 
@@ -187,7 +189,8 @@
         }
         @Override
         public void onPickOptionResult(boolean finished, Option[] selections, Bundle result) {
-            Log.i(TAG, "Pick result: finished=" + finished + " selections=" + selections
+            Log.i(TAG, "Pick result: finished=" + finished
+                    + " selections=" + Arrays.toString(selections)
                     + " result=" + result);
             StringBuilder sb = new StringBuilder();
             if (finished) {
diff --git a/tests/VoiceInteraction/src/com/android/test/voiceinteraction/TestInteractionActivity.java b/tests/VoiceInteraction/src/com/android/test/voiceinteraction/TestInteractionActivity.java
index ada0e21..4fc3a15 100644
--- a/tests/VoiceInteraction/src/com/android/test/voiceinteraction/TestInteractionActivity.java
+++ b/tests/VoiceInteraction/src/com/android/test/voiceinteraction/TestInteractionActivity.java
@@ -28,6 +28,8 @@
 import android.widget.Button;
 import android.widget.TextView;
 
+import java.util.Arrays;
+
 public class TestInteractionActivity extends Activity implements View.OnClickListener {
     static final String TAG = "TestInteractionActivity";
 
@@ -240,7 +242,8 @@
         }
         @Override
         public void onPickOptionResult(boolean finished, Option[] selections, Bundle result) {
-            Log.i(TAG, "Pick result: finished=" + finished + " selections=" + selections
+            Log.i(TAG, "Pick result: finished=" + finished
+                    + " selections=" + Arrays.toString(selections)
                     + " result=" + result);
             StringBuilder sb = new StringBuilder();
             if (finished) {
diff --git a/tools/aapt2/format/Container.cpp b/tools/aapt2/format/Container.cpp
index 9cef7b3..1ff6c49 100644
--- a/tools/aapt2/format/Container.cpp
+++ b/tools/aapt2/format/Container.cpp
@@ -76,7 +76,7 @@
   coded_out.WriteLittleEndian32(kResTable);
 
   // Write the aligned size.
-  const ::google::protobuf::uint64 size = table.ByteSize();
+  const size_t size = table.ByteSizeLong();
   const int padding = CalculatePaddingForAlignment(size);
   coded_out.WriteLittleEndian64(size);
 
@@ -109,7 +109,7 @@
   coded_out.WriteLittleEndian32(kResFile);
 
   // Write the aligned size.
-  const ::google::protobuf::uint32 header_size = file.ByteSize();
+  const size_t header_size = file.ByteSizeLong();
   const int header_padding = CalculatePaddingForAlignment(header_size);
   const ::google::protobuf::uint64 data_size = in->TotalSize();
   const int data_padding = CalculatePaddingForAlignment(data_size);
diff --git a/tools/aapt2/io/Util.h b/tools/aapt2/io/Util.h
index 5cb8206..1b48a28 100644
--- a/tools/aapt2/io/Util.h
+++ b/tools/aapt2/io/Util.h
@@ -131,8 +131,7 @@
   template <typename T> bool ReadMessage(T *message) {
     ZeroCopyInputAdaptor adapter(in_);
     google::protobuf::io::CodedInputStream coded_stream(&adapter);
-    coded_stream.SetTotalBytesLimit(std::numeric_limits<int32_t>::max(),
-                                    coded_stream.BytesUntilTotalBytesLimit());
+    coded_stream.SetTotalBytesLimit(std::numeric_limits<int32_t>::max());
     return message->ParseFromCodedStream(&coded_stream);
   }
 
diff --git a/tools/xmlpersistence/src/main/kotlin/Generator.kt b/tools/xmlpersistence/src/main/kotlin/Generator.kt
index b2c5f4a..8e62388 100644
--- a/tools/xmlpersistence/src/main/kotlin/Generator.kt
+++ b/tools/xmlpersistence/src/main/kotlin/Generator.kt
@@ -149,6 +149,7 @@
                 when (field) {
                     is ClassFieldInfo -> this += field.allClassFields
                     is ListFieldInfo -> this += field.element.allClassFields
+                    else -> {}
                 }
             }
         }