Merge "Unregister DeviceIdle Receiver in IpSecPacketLossDetector" into main
diff --git a/AconfigFlags.bp b/AconfigFlags.bp
index b43053b..40e1957 100644
--- a/AconfigFlags.bp
+++ b/AconfigFlags.bp
@@ -414,7 +414,7 @@
         "//apex_available:platform",
         "com.android.art",
         "com.android.art.debug",
-        "com.android.btservices",
+        "com.android.bt",
         "com.android.mediaprovider",
         "com.android.permission",
     ],
diff --git a/core/java/com/android/internal/os/RuntimeInit.java b/core/java/com/android/internal/os/RuntimeInit.java
index 1709ca7..f6de345 100644
--- a/core/java/com/android/internal/os/RuntimeInit.java
+++ b/core/java/com/android/internal/os/RuntimeInit.java
@@ -174,7 +174,9 @@
                     // System process is dead; ignore
                 } else {
                     try {
-                        Clog_e(TAG, "Error reporting crash", t2);
+                        // Log original crash and then log the error reporting exception.
+                        Clog_e(TAG, "Couldn't report crash. Here's the crash:", e);
+                        Clog_e(TAG, "Error reporting crash. Here's the error:", t2);
                     } catch (Throwable t3) {
                         // Even Clog_e() fails!  Oh well.
                     }
diff --git a/data/etc/preinstalled-packages-platform.xml b/data/etc/preinstalled-packages-platform.xml
index 7823277..efa0b8c 100644
--- a/data/etc/preinstalled-packages-platform.xml
+++ b/data/etc/preinstalled-packages-platform.xml
@@ -102,7 +102,7 @@
 to pre-existing users, but cannot uninstall pre-existing system packages from pre-existing users.
 -->
 <config>
-    <!--  Bluetooth (com.android.btservices apex) - visible on the sharesheet -->
+    <!--  Bluetooth (com.android.bt apex) - visible on the sharesheet -->
     <install-in-user-type package="com.android.bluetooth">
         <install-in user-type="SYSTEM" />
         <install-in user-type="FULL" />
diff --git a/keystore/java/android/security/keystore2/AndroidKeyStoreKeyPairGeneratorSpi.java b/keystore/java/android/security/keystore2/AndroidKeyStoreKeyPairGeneratorSpi.java
index e6c652c..5e93f8d 100644
--- a/keystore/java/android/security/keystore2/AndroidKeyStoreKeyPairGeneratorSpi.java
+++ b/keystore/java/android/security/keystore2/AndroidKeyStoreKeyPairGeneratorSpi.java
@@ -20,6 +20,7 @@
 
 import android.annotation.NonNull;
 import android.annotation.Nullable;
+import android.annotation.RequiresPermission;
 import android.content.Context;
 import android.hardware.security.keymint.EcCurve;
 import android.hardware.security.keymint.KeyParameter;
@@ -732,6 +733,8 @@
         }
     }
 
+    @RequiresPermission(value = android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE,
+            conditional = true)
     private void addAttestationParameters(@NonNull List<KeyParameter> params)
             throws ProviderException, IllegalArgumentException, DeviceIdAttestationException {
         byte[] challenge = mSpec.getAttestationChallenge();
@@ -824,7 +827,13 @@
                         break;
                     }
                     case AttestationUtils.ID_TYPE_MEID: {
-                        final String meid = telephonyService.getMeid(0);
+                        String meid;
+                        try {
+                            meid = telephonyService.getMeid(0);
+                        } catch (UnsupportedOperationException e) {
+                            Log.e(TAG, "Unable to retrieve MEID", e);
+                            meid = null;
+                        }
                         if (meid == null) {
                             throw new DeviceIdAttestationException("Unable to retrieve MEID");
                         }
diff --git a/native/graphics/jni/Android.bp b/native/graphics/jni/Android.bp
index 962f54d..fdd44de 100644
--- a/native/graphics/jni/Android.bp
+++ b/native/graphics/jni/Android.bp
@@ -95,8 +95,13 @@
     static_libs: ["libarect"],
     fuzz_config: {
         cc: [
+            // Alphabetical order -- assign to skia-android-triage@google.com
+            "danieldilan@google.com",
             "dichenzhang@google.com",
-            "scroggo@google.com",
+            "fmalita@google.com",
+            "jreck@google.com",
+            "nscobie@google.com",
+            "skia-android-triage@google.com",
         ],
         asan_options: [
             "detect_odr_violation=1",
diff --git a/nfc-non-updatable/flags/flags.aconfig b/nfc-non-updatable/flags/flags.aconfig
index 6b14a1e..54ded0c 100644
--- a/nfc-non-updatable/flags/flags.aconfig
+++ b/nfc-non-updatable/flags/flags.aconfig
@@ -197,3 +197,11 @@
     description: "Expose constructor for ApduServiceInfo"
     bug: "380892385"
 }
+
+flag {
+    name: "nfc_hce_latency_events"
+    is_exported: true
+    namespace: "wallet_integration"
+    description: "Enables tracking latency for HCE"
+    bug: "379849603"
+}
diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java
index 5dc0747..ff08403 100644
--- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java
+++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java
@@ -408,74 +408,10 @@
                         Slog.w(LOG_TAG, "Bulk sync request to acongid failed.");
                     }
                 }
-                // TOBO(b/312444587): remove the comparison logic after Test Mission 2.
-                if (requests == null) {
-                    Map<String, AconfigdFlagInfo> aconfigdFlagMap =
-                            AconfigdJavaUtils.listFlagsValueInNewStorage(localSocket);
-                    compareFlagValueInNewStorage(
-                            mAconfigDefaultFlags,
-                            aconfigdFlagMap);
-                }
             }
         }
     }
 
-    // TOBO(b/312444587): remove the comparison logic after Test Mission 2.
-    public int compareFlagValueInNewStorage(
-            Map<String, AconfigdFlagInfo> defaultFlagMap,
-            Map<String, AconfigdFlagInfo> aconfigdFlagMap) {
-
-        // Get all defaults from the default map. The mSettings may not contain
-        // all flags, since it only contains updated flags.
-        int diffNum = 0;
-        for (Map.Entry<String, AconfigdFlagInfo> entry : defaultFlagMap.entrySet()) {
-            String key = entry.getKey();
-            AconfigdFlagInfo flag = entry.getValue();
-
-            AconfigdFlagInfo aconfigdFlag = aconfigdFlagMap.get(key);
-            if (aconfigdFlag == null) {
-                Slog.w(LOG_TAG, String.format("Flag %s is missing from aconfigd", key));
-                diffNum++;
-                continue;
-            }
-            String diff = flag.dumpDiff(aconfigdFlag);
-            if (!diff.isEmpty()) {
-                Slog.w(
-                        LOG_TAG,
-                        String.format(
-                                "Flag %s is different in Settings and aconfig: %s", key, diff));
-                diffNum++;
-            }
-        }
-
-        for (String key : aconfigdFlagMap.keySet()) {
-            if (defaultFlagMap.containsKey(key)) continue;
-            Slog.w(LOG_TAG, String.format("Flag %s is missing from Settings", key));
-            diffNum++;
-        }
-
-        String compareMarkerName = "aconfigd_marker/compare_diff_num";
-        synchronized (mLock) {
-            Setting markerSetting = mSettings.get(compareMarkerName);
-            if (markerSetting == null) {
-                markerSetting =
-                        new Setting(
-                                compareMarkerName,
-                                String.valueOf(diffNum),
-                                false,
-                                "aconfig",
-                                "aconfig");
-                mSettings.put(compareMarkerName, markerSetting);
-            }
-            markerSetting.value = String.valueOf(diffNum);
-        }
-
-        if (diffNum == 0) {
-            Slog.w(LOG_TAG, "Settings and new storage have same flags.");
-        }
-        return diffNum;
-    }
-
     @GuardedBy("mLock")
     public int getAllAconfigFlagsFromSettings(
             @NonNull Map<String, AconfigdFlagInfo> flagInfoDefault) {
diff --git a/packages/SettingsProvider/test/src/com/android/providers/settings/SettingsStateTest.java b/packages/SettingsProvider/test/src/com/android/providers/settings/SettingsStateTest.java
index 48ce49d..f798a35 100644
--- a/packages/SettingsProvider/test/src/com/android/providers/settings/SettingsStateTest.java
+++ b/packages/SettingsProvider/test/src/com/android/providers/settings/SettingsStateTest.java
@@ -1302,84 +1302,4 @@
         assertFalse(flag3.getHasServerOverride());
         assertFalse(flag3.getHasLocalOverride());
     }
-
-    @Test
-    public void testCompareFlagValueInNewStorage() {
-                int configKey = SettingsState.makeKey(SettingsState.SETTINGS_TYPE_CONFIG, 0);
-        Object lock = new Object();
-        SettingsState settingsState =
-                new SettingsState(
-                        InstrumentationRegistry.getContext(),
-                        lock,
-                        mSettingsFile,
-                        configKey,
-                        SettingsState.MAX_BYTES_PER_APP_PACKAGE_UNLIMITED,
-                        Looper.getMainLooper());
-
-        AconfigdFlagInfo defaultFlag1 =
-                AconfigdFlagInfo.newBuilder()
-                        .setPackageName("com.android.flags")
-                        .setFlagName("flag1")
-                        .setDefaultFlagValue("false")
-                        .setServerFlagValue("true")
-                        .setHasServerOverride(true)
-                        .setIsReadWrite(true)
-                        .build();
-
-        AconfigdFlagInfo expectedFlag1 =
-                AconfigdFlagInfo.newBuilder()
-                        .setPackageName("com.android.flags")
-                        .setFlagName("flag1")
-                        .setServerFlagValue("true")
-                        .setDefaultFlagValue("false")
-                        .setHasServerOverride(true)
-                        .setIsReadWrite(true)
-                        .build();
-
-        Map<String, AconfigdFlagInfo> aconfigdMap = new HashMap<>();
-        Map<String, AconfigdFlagInfo> defaultMap = new HashMap<>();
-
-        defaultMap.put("com.android.flags.flag1", defaultFlag1);
-        aconfigdMap.put("com.android.flags.flag1", expectedFlag1);
-
-        int ret = settingsState.compareFlagValueInNewStorage(defaultMap, aconfigdMap);
-        assertEquals(0, ret);
-
-        String value =
-                settingsState.getSettingLocked("aconfigd_marker/compare_diff_num").getValue();
-        assertEquals("0", value);
-
-        AconfigdFlagInfo defaultFlag2 =
-                AconfigdFlagInfo.newBuilder()
-                        .setPackageName("com.android.flags")
-                        .setFlagName("flag2")
-                        .setDefaultFlagValue("false")
-                        .build();
-        defaultMap.put("com.android.flags.flag2", defaultFlag2);
-
-        ret = settingsState.compareFlagValueInNewStorage(defaultMap, aconfigdMap);
-        // missing from new storage
-        assertEquals(1, ret);
-        value =
-                settingsState.getSettingLocked("aconfigd_marker/compare_diff_num").getValue();
-        assertEquals("1", value);
-
-        AconfigdFlagInfo expectedFlag2 =
-        AconfigdFlagInfo.newBuilder()
-                .setPackageName("com.android.flags")
-                .setFlagName("flag2")
-                .setServerFlagValue("true")
-                .setLocalFlagValue("true")
-                .setDefaultFlagValue("false")
-                .setHasServerOverride(true)
-                .setHasLocalOverride(true)
-                .build();
-        aconfigdMap.put("com.android.flags.flag2", expectedFlag2);
-        ret = settingsState.compareFlagValueInNewStorage(defaultMap, aconfigdMap);
-        // skip the server and local value comparison when the flag is read_only
-        assertEquals(0, ret);
-        value =
-                settingsState.getSettingLocked("aconfigd_marker/compare_diff_num").getValue();
-        assertEquals("0", value);
-    }
 }
diff --git a/services/core/java/com/android/server/crashrecovery/OWNERS b/services/core/java/com/android/server/crashrecovery/OWNERS
index daa0211..02df986 100644
--- a/services/core/java/com/android/server/crashrecovery/OWNERS
+++ b/services/core/java/com/android/server/crashrecovery/OWNERS
@@ -1,3 +1,2 @@
-ancr@google.com
 harshitmahajan@google.com
 robertogil@google.com
diff --git a/services/core/java/com/android/server/wm/TaskPersister.java b/services/core/java/com/android/server/wm/TaskPersister.java
index d89dc0b..91cd949 100644
--- a/services/core/java/com/android/server/wm/TaskPersister.java
+++ b/services/core/java/com/android/server/wm/TaskPersister.java
@@ -245,18 +245,20 @@
 
     private static String fileToString(File file) {
         final String newline = System.lineSeparator();
+        BufferedReader reader = null;
         try {
-            BufferedReader reader = new BufferedReader(new FileReader(file));
+            reader = new BufferedReader(new FileReader(file));
             StringBuffer sb = new StringBuffer((int) file.length() * 2);
             String line;
             while ((line = reader.readLine()) != null) {
                 sb.append(line + newline);
             }
-            reader.close();
             return sb.toString();
         } catch (IOException ioe) {
             Slog.e(TAG, "Couldn't read file " + file.getName());
             return null;
+        } finally {
+            IoUtils.closeQuietly(reader);
         }
     }