Merge "Remove Redundant Variable for getStatusBarHeightForRotation" into main
diff --git a/core/jni/android_media_audio_common_AidlConversion.cpp b/core/jni/android_media_audio_common_AidlConversion.cpp
index 2ef817c..1a6091f 100644
--- a/core/jni/android_media_audio_common_AidlConversion.cpp
+++ b/core/jni/android_media_audio_common_AidlConversion.cpp
@@ -154,6 +154,13 @@
             });
 }
 
+/* Used for test purposes only, not efficient. */
+jobject legacy2aidl_audio_devices_t_AudioDeviceDescription_Parcel(JNIEnv* env, jobject,
+                                                                  int /*audio_devices_t*/ legacy) {
+    return legacy2aidlParcel(env, static_cast<audio_devices_t>(legacy),
+                             legacy2aidl_audio_devices_t_AudioDeviceDescription);
+}
+
 int aidl2legacy_AudioFormatDescription_Parcel_audio_format_t(JNIEnv* env, jobject,
                                                              jobject jParcel) {
     return aidlParcel2legacy<
@@ -208,6 +215,8 @@
          reinterpret_cast<void*>(aidl2legacy_AudioChannelLayout_Parcel_audio_channel_mask_t)},
         {"legacy2aidl_audio_channel_mask_t_AudioChannelLayout_Parcel", "(IZ)Landroid/os/Parcel;",
          reinterpret_cast<void*>(legacy2aidl_audio_channel_mask_t_AudioChannelLayout_Parcel)},
+        {"legacy2aidl_audio_devices_t_AudioDeviceDescription_Parcel", "(I)Landroid/os/Parcel;",
+         reinterpret_cast<void*>(legacy2aidl_audio_devices_t_AudioDeviceDescription_Parcel)},
         {"aidl2legacy_AudioFormatDescription_Parcel_audio_format_t", "(Landroid/os/Parcel;)I",
          reinterpret_cast<void*>(aidl2legacy_AudioFormatDescription_Parcel_audio_format_t)},
         {"legacy2aidl_audio_format_t_AudioFormatDescription_Parcel", "(I)Landroid/os/Parcel;",
diff --git a/media/java/android/media/ThumbnailUtils.java b/media/java/android/media/ThumbnailUtils.java
index 9b238e1..f8f5366 100644
--- a/media/java/android/media/ThumbnailUtils.java
+++ b/media/java/android/media/ThumbnailUtils.java
@@ -372,10 +372,8 @@
 
             final int width = Integer.parseInt(mmr.extractMetadata(METADATA_KEY_VIDEO_WIDTH));
             final int height = Integer.parseInt(mmr.extractMetadata(METADATA_KEY_VIDEO_HEIGHT));
-            // Fall back to middle of video
-            // Note: METADATA_KEY_DURATION unit is in ms, not us.
-            final long thumbnailTimeUs =
-                    Long.parseLong(mmr.extractMetadata(METADATA_KEY_DURATION)) * 1000 / 2;
+            // Returns whatever frame the implementation considers representative.
+            final long thumbnailTimeUs = -1;
 
             // If we're okay with something larger than native format, just
             // return a frame without up-scaling it
diff --git a/media/java/android/media/audio/common/AidlConversion.java b/media/java/android/media/audio/common/AidlConversion.java
index 8521d1c..fa21181 100644
--- a/media/java/android/media/audio/common/AidlConversion.java
+++ b/media/java/android/media/audio/common/AidlConversion.java
@@ -834,18 +834,18 @@
                 aidl.connection = AudioDeviceDescription.CONNECTION_IP_V4;
                 break;
             case AudioSystem.DEVICE_IN_BUS:
-                aidl.type = AudioDeviceType.IN_DEVICE;
-                aidl.connection = AudioDeviceDescription.CONNECTION_BUS;
+                aidl.type = AudioDeviceType.IN_BUS;
                 break;
             case AudioSystem.DEVICE_OUT_BUS:
-                aidl.type = AudioDeviceType.OUT_DEVICE;
-                aidl.connection = AudioDeviceDescription.CONNECTION_BUS;
+                aidl.type = AudioDeviceType.OUT_BUS;
                 break;
             case AudioSystem.DEVICE_IN_PROXY:
                 aidl.type = AudioDeviceType.IN_AFE_PROXY;
+                aidl.connection = AudioDeviceDescription.CONNECTION_VIRTUAL;
                 break;
             case AudioSystem.DEVICE_OUT_PROXY:
                 aidl.type = AudioDeviceType.OUT_AFE_PROXY;
+                aidl.connection = AudioDeviceDescription.CONNECTION_VIRTUAL;
                 break;
             case AudioSystem.DEVICE_IN_USB_HEADSET:
                 aidl.type = AudioDeviceType.IN_HEADSET;
@@ -891,10 +891,27 @@
         return aidl;
     }
 
+    /** For test purposes only, not efficient. */
+    public static AudioDeviceDescription legacy2aidl_audio_devices_t_AudioDeviceDescriptionTestOnly(
+            int nativeType) {
+        Parcel in = legacy2aidl_audio_devices_t_AudioDeviceDescription_Parcel(nativeType);
+        if (in != null) {
+            try {
+                return AudioDeviceDescription.CREATOR.createFromParcel(in);
+            } finally {
+                in.recycle();
+            }
+        }
+        throw new IllegalArgumentException(
+                "Failed to convert legacy audio_devices_t value " + nativeType);
+    }
+
     private static native int aidl2legacy_AudioChannelLayout_Parcel_audio_channel_mask_t(
             Parcel aidl, boolean isInput);
     private static native Parcel legacy2aidl_audio_channel_mask_t_AudioChannelLayout_Parcel(
             int legacy, boolean isInput);
+    private static native Parcel legacy2aidl_audio_devices_t_AudioDeviceDescription_Parcel(
+            int legacy);
     private static native int aidl2legacy_AudioFormatDescription_Parcel_audio_format_t(
             Parcel aidl);
     private static native Parcel legacy2aidl_audio_format_t_AudioFormatDescription_Parcel(
diff --git a/media/tests/aidltests/src/com/android/media/AidlConversionUnitTests.java b/media/tests/aidltests/src/com/android/media/AidlConversionUnitTests.java
index d9a1221..f98a3cf 100644
--- a/media/tests/aidltests/src/com/android/media/AidlConversionUnitTests.java
+++ b/media/tests/aidltests/src/com/android/media/AidlConversionUnitTests.java
@@ -18,7 +18,6 @@
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotEquals;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertThrows;
 import static org.junit.Assert.assertTrue;
@@ -508,21 +507,21 @@
     @Test
     public void testAudioDeviceDescriptionConversion() {
         for (int nativeDeviceType : AudioSystem.DEVICE_OUT_ALL_SET) {
-            assertNotEquals(
-                    AidlConversion.api2aidl_NativeType_AudioDeviceDescription(nativeDeviceType)
-                            .type,
-                    AudioDeviceType.NONE);
+            assertEquals(
+                    /* Reference value obtained from the native converter. */
+                    AidlConversion.legacy2aidl_audio_devices_t_AudioDeviceDescriptionTestOnly(
+                            nativeDeviceType),
+                    AidlConversion.api2aidl_NativeType_AudioDeviceDescription(nativeDeviceType));
         }
-
         for (int nativeDeviceType : AudioSystem.DEVICE_IN_ALL_SET) {
             if (nativeDeviceType == AudioSystem.DEVICE_IN_COMMUNICATION
                     || nativeDeviceType == AudioSystem.DEVICE_IN_AMBIENT) {
                 continue;
             }
-            assertNotEquals(
-                    AidlConversion.api2aidl_NativeType_AudioDeviceDescription(nativeDeviceType)
-                            .type,
-                    AudioDeviceType.NONE);
+            assertEquals(
+                    AidlConversion.legacy2aidl_audio_devices_t_AudioDeviceDescriptionTestOnly(
+                            nativeDeviceType),
+                    AidlConversion.api2aidl_NativeType_AudioDeviceDescription(nativeDeviceType));
         }
     }
 
diff --git a/services/core/java/com/android/server/adb/AdbDebuggingManager.java b/services/core/java/com/android/server/adb/AdbDebuggingManager.java
index 193d827..dcb25c2 100644
--- a/services/core/java/com/android/server/adb/AdbDebuggingManager.java
+++ b/services/core/java/com/android/server/adb/AdbDebuggingManager.java
@@ -95,6 +95,8 @@
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
 import java.security.MessageDigest;
 import java.security.SecureRandom;
 import java.util.AbstractMap;
@@ -107,7 +109,6 @@
 import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.TimeoutException;
-import java.util.concurrent.atomic.AtomicBoolean;
 
 /**
  * Provides communication to the Android Debug Bridge daemon to allow, deny, or clear public keys
@@ -167,7 +168,6 @@
     // The current info of the adbwifi connection.
     private AdbConnectionInfo mAdbConnectionInfo = new AdbConnectionInfo();
     // Polls for a tls port property when adb wifi is enabled
-    private AdbConnectionPortPoller mConnectionPortPoller;
     private final Ticker mTicker;
 
     public AdbDebuggingManager(Context context) {
@@ -322,63 +322,13 @@
         }
     }
 
-    /**
-     * This class will poll for a period of time for adbd to write the port
-     * it connected to.
-     *
-     * TODO(joshuaduong): The port is being sent via system property because the adbd socket
-     * (AdbDebuggingManager) is not created when ro.adb.secure=0. Thus, we must communicate the
-     * port through different means. A better fix would be to always start AdbDebuggingManager, but
-     * it needs to adjust accordingly on whether ro.adb.secure is set.
-     */
-    private class AdbConnectionPortPoller extends Thread {
-        private final String mAdbPortProp = "service.adb.tls.port";
-        private final int mDurationSecs = 10;
-        private AtomicBoolean mCanceled = new AtomicBoolean(false);
-
-        @Override
-        public void run() {
-            Slog.d(TAG, "Starting adb port property poller");
-            // Once adbwifi is enabled, we poll the service.adb.tls.port
-            // system property until we get the port, or -1 on failure.
-            // Let's also limit the polling to 10 seconds, just in case
-            // something went wrong.
-            for (int i = 0; i < mDurationSecs; ++i) {
-                if (mCanceled.get()) {
-                    return;
-                }
-
-                // If the property is set to -1, then that means adbd has failed
-                // to start the server. Otherwise we should have a valid port.
-                int port = SystemProperties.getInt(mAdbPortProp, Integer.MAX_VALUE);
-                if (port == -1 || (port > 0 && port <= 65535)) {
-                    onPortReceived(port);
-                    return;
-                }
-                SystemClock.sleep(1000);
-            }
-            Slog.w(TAG, "Failed to receive adb connection port");
-            onPortReceived(-1);
-        }
-
-        private void onPortReceived(int port) {
-            Slog.d(TAG, "Received tls port=" + port);
-            Message msg = mHandler.obtainMessage(port > 0
-                    ? AdbDebuggingHandler.MSG_SERVER_CONNECTED
-                    : AdbDebuggingHandler.MSG_SERVER_DISCONNECTED);
-            msg.obj = port;
-            mHandler.sendMessage(msg);
-        }
-
-        public void cancelAndWait() {
-            mCanceled.set(true);
-            if (this.isAlive()) {
-                try {
-                    this.join();
-                } catch (InterruptedException e) {
-                }
-            }
-        }
+    private void onServerServerPortReceived(int port) {
+        Slog.d(TAG, "Received tls port=" + port);
+        Message msg = mHandler.obtainMessage(port > 0
+                ? AdbDebuggingHandler.MSG_SERVER_CONNECTED
+                : AdbDebuggingHandler.MSG_SERVER_DISCONNECTED);
+        msg.obj = port;
+        mHandler.sendMessage(msg);
     }
 
     @VisibleForTesting
@@ -438,7 +388,7 @@
                 mInputStream = mSocket.getInputStream();
                 mHandler.sendEmptyMessage(AdbDebuggingHandler.MSG_ADBD_SOCKET_CONNECTED);
             } catch (IOException ioe) {
-                Slog.e(TAG, "Caught an exception opening the socket: " + ioe);
+                Slog.e(TAG, "adbd_auth domain socket unavailable: " + ioe);
                 closeSocketLocked();
                 throw ioe;
             }
@@ -456,6 +406,8 @@
                         break;
                     }
 
+                    Slog.d(TAG, "Recv packet: " + new String(Arrays.copyOfRange(buffer, 0, 2)));
+
                     if (buffer[0] == 'P' && buffer[1] == 'K') {
                         String key = new String(Arrays.copyOfRange(buffer, 2, count));
                         Slog.d(TAG, "Received public key: " + key);
@@ -517,6 +469,19 @@
                             Slog.e(TAG, "Got unknown transport type from adbd (" + transportType
                                     + ")");
                         }
+                    } else if (buffer[0] == 'T' && buffer[1] == 'P') {
+                        if (count < 4) {
+                            Slog.e(TAG, "Bad TP message length " + count);
+                            break;
+                        }
+                        ByteBuffer bytes = ByteBuffer.wrap(buffer, 2, 2);
+                        bytes.order(ByteOrder.LITTLE_ENDIAN);
+
+                        int port = bytes.getShort() & 0xFFFF;
+                        Message msg = mHandler.obtainMessage(
+                                AdbDebuggingHandler.MSG_TLS_SERVER_PORT);
+                        msg.obj = port;
+                        mHandler.sendMessage(msg);
                     } else {
                         Slog.e(TAG, "Wrong message: "
                                 + (new String(Arrays.copyOfRange(buffer, 0, 2))));
@@ -562,6 +527,7 @@
 
         void sendResponse(String msg) {
             synchronized (this) {
+                Slog.d(TAG, "Send packet " + msg);
                 if (!mStopped && mOutputStream != null) {
                     try {
                         mOutputStream.write(msg.getBytes());
@@ -786,6 +752,8 @@
         // === Messages from other parts of the system
         private static final int MESSAGE_KEY_FILES_UPDATED = 28;
 
+        private static final int MSG_TLS_SERVER_PORT = 29;
+
         // === Messages we can send to adbd ===========
         static final String MSG_DISCONNECT_DEVICE = "DD";
 
@@ -1075,8 +1043,6 @@
                     mContext.registerReceiver(mBroadcastReceiver, intentFilter);
 
                     SystemProperties.set(AdbService.WIFI_PERSISTENT_CONFIG_PROPERTY, "1");
-                    mConnectionPortPoller = new AdbDebuggingManager.AdbConnectionPortPoller();
-                    mConnectionPortPoller.start();
 
                     startAdbDebuggingThread();
                     mAdbWifiEnabled = true;
@@ -1121,8 +1087,6 @@
                     mContext.registerReceiver(mBroadcastReceiver, intentFilter);
 
                     SystemProperties.set(AdbService.WIFI_PERSISTENT_CONFIG_PROPERTY, "1");
-                    mConnectionPortPoller = new AdbDebuggingManager.AdbConnectionPortPoller();
-                    mConnectionPortPoller.start();
 
                     startAdbDebuggingThread();
                     mAdbWifiEnabled = true;
@@ -1228,28 +1192,14 @@
                     Settings.Global.putInt(mContentResolver,
                             Settings.Global.ADB_WIFI_ENABLED, 0);
                     stopAdbDebuggingThread();
-                    if (mConnectionPortPoller != null) {
-                        mConnectionPortPoller.cancelAndWait();
-                        mConnectionPortPoller = null;
-                    }
                     break;
                 }
                 case MSG_ADBD_SOCKET_CONNECTED: {
                     Slog.d(TAG, "adbd socket connected");
-                    if (mAdbWifiEnabled) {
-                        // In scenarios where adbd is restarted, the tls port may change.
-                        mConnectionPortPoller =
-                                new AdbDebuggingManager.AdbConnectionPortPoller();
-                        mConnectionPortPoller.start();
-                    }
                     break;
                 }
                 case MSG_ADBD_SOCKET_DISCONNECTED: {
                     Slog.d(TAG, "adbd socket disconnected");
-                    if (mConnectionPortPoller != null) {
-                        mConnectionPortPoller.cancelAndWait();
-                        mConnectionPortPoller = null;
-                    }
                     if (mAdbWifiEnabled) {
                         // In scenarios where adbd is restarted, the tls port may change.
                         onAdbdWifiServerDisconnected(-1);
@@ -1260,6 +1210,9 @@
                     mAdbKeyStore.reloadKeyMap();
                     break;
                 }
+                case MSG_TLS_SERVER_PORT: {
+                    onServerServerPortReceived((int) msg.obj);
+                }
             }
         }
 
diff --git a/services/core/java/com/android/server/connectivity/Vpn.java b/services/core/java/com/android/server/connectivity/Vpn.java
index aa98590..3ad690d 100644
--- a/services/core/java/com/android/server/connectivity/Vpn.java
+++ b/services/core/java/com/android/server/connectivity/Vpn.java
@@ -152,6 +152,7 @@
 import com.android.server.DeviceIdleInternal;
 import com.android.server.LocalServices;
 import com.android.server.net.BaseNetworkObserver;
+import com.android.server.utils.LazyJniRegistrar;
 
 import libcore.io.IoUtils;
 
@@ -468,6 +469,8 @@
 
     @VisibleForTesting
     public static class Dependencies {
+        protected Dependencies() {}
+
         public boolean isCallerSystem() {
             return Binder.getCallingUid() == Process.SYSTEM_UID;
         }
@@ -593,6 +596,14 @@
         }
     }
 
+    // A helper class to ensure JNI registration before use. This avoids native lib dependencies in
+    // test-only environments that mock or partially use the base Dependencies class.
+    private static final class DependenciesWithJniRegistration extends Dependencies {
+        static {
+            LazyJniRegistrar.registerVpn();
+        }
+    }
+
     @VisibleForTesting
     interface ValidationStatusCallback {
         void onValidationStatus(int status);
@@ -600,8 +611,8 @@
 
     public Vpn(Looper looper, Context context, INetworkManagementService netService, INetd netd,
             @UserIdInt int userId, VpnProfileStore vpnProfileStore) {
-        this(looper, context, new Dependencies(), netService, netd, userId, vpnProfileStore,
-                new SystemServices(context), new Ikev2SessionCreator());
+        this(looper, context, new DependenciesWithJniRegistration(), netService, netd, userId,
+                vpnProfileStore, new SystemServices(context), new Ikev2SessionCreator());
     }
 
     @VisibleForTesting
diff --git a/services/core/java/com/android/server/utils/LazyJniRegistrar.java b/services/core/java/com/android/server/utils/LazyJniRegistrar.java
index 6d29e9e..927d092 100644
--- a/services/core/java/com/android/server/utils/LazyJniRegistrar.java
+++ b/services/core/java/com/android/server/utils/LazyJniRegistrar.java
@@ -47,4 +47,7 @@
 
     /** Registers native methods for VrManagerService. */
     public static native void registerVrManagerService();
+
+    /** Registers native methods for Vpn (the JNI counterpart for VpnManagerService). */
+    public static native void registerVpn();
 }
diff --git a/services/core/jni/Android.bp b/services/core/jni/Android.bp
index 85169b8..d8cfbb1 100644
--- a/services/core/jni/Android.bp
+++ b/services/core/jni/Android.bp
@@ -42,7 +42,6 @@
         "com_android_server_devicepolicy_CryptoTestHelper.cpp",
         "com_android_server_display_DisplayControl.cpp",
         "com_android_server_display_SmallAreaDetectionController.cpp",
-        "com_android_server_connectivity_Vpn.cpp",
         "com_android_server_gpu_GpuService.cpp",
         "com_android_server_HardwarePropertiesManagerService.cpp",
         "com_android_server_input_InputManagerService.cpp",
@@ -261,6 +260,7 @@
     srcs: [
         "com_android_server_ConsumerIrService.cpp",
         "com_android_server_app_GameManagerService.cpp",
+        "com_android_server_connectivity_Vpn.cpp",
         "com_android_server_utils_LazyJniRegistrar.cpp",
         "com_android_server_vr_VrManagerService.cpp",
     ],
diff --git a/services/core/jni/com_android_server_utils_LazyJniRegistrar.cpp b/services/core/jni/com_android_server_utils_LazyJniRegistrar.cpp
index 0c0f8b02..9690982 100644
--- a/services/core/jni/com_android_server_utils_LazyJniRegistrar.cpp
+++ b/services/core/jni/com_android_server_utils_LazyJniRegistrar.cpp
@@ -23,6 +23,7 @@
 // Forward declared per-class registration methods.
 int register_android_server_ConsumerIrService(JNIEnv* env);
 int register_android_server_app_GameManagerService(JNIEnv* env);
+int register_android_server_connectivity_Vpn(JNIEnv* env);
 int register_android_server_vr_VrManagerService(JNIEnv* env);
 
 namespace {
@@ -38,6 +39,10 @@
     register_android_server_app_GameManagerService(env);
 }
 
+void registerVpn(JNIEnv* env, jclass) {
+    register_android_server_connectivity_Vpn(env);
+}
+
 void registerVrManagerService(JNIEnv* env, jclass) {
     register_android_server_vr_VrManagerService(env);
 }
@@ -45,6 +50,7 @@
 static const JNINativeMethod sJniRegistrarMethods[] = {
         {"registerConsumerIrService", "()V", (void*)registerConsumerIrService},
         {"registerGameManagerService", "()V", (void*)registerGameManagerService},
+        {"registerVpn", "()V", (void*)registerVpn},
         {"registerVrManagerService", "()V", (void*)registerVrManagerService},
 };
 
diff --git a/services/core/jni/onload.cpp b/services/core/jni/onload.cpp
index ddcff7b..f9942ba 100644
--- a/services/core/jni/onload.cpp
+++ b/services/core/jni/onload.cpp
@@ -40,7 +40,6 @@
 int register_android_server_vibrator_VibratorController(JavaVM* vm, JNIEnv* env);
 int register_android_server_vibrator_VibratorManagerService(JavaVM* vm, JNIEnv* env);
 int register_android_server_location_GnssLocationProvider(JNIEnv* env);
-int register_android_server_connectivity_Vpn(JNIEnv* env);
 int register_android_server_devicepolicy_CryptoTestHelper(JNIEnv*);
 int register_android_server_tv_TvUinputBridge(JNIEnv* env);
 int register_android_server_tv_TvInputHal(JNIEnv* env);
@@ -106,7 +105,6 @@
     register_android_server_vibrator_VibratorManagerService(vm, env);
     register_android_server_SystemServer(env);
     register_android_server_location_GnssLocationProvider(env);
-    register_android_server_connectivity_Vpn(env);
     register_android_server_devicepolicy_CryptoTestHelper(env);
     register_android_server_BatteryStatsService(env);
     register_android_server_tv_TvUinputBridge(env);
diff --git a/services/tests/mockingservicestests/jni/Android.bp b/services/tests/mockingservicestests/jni/Android.bp
index 03bd73c..746e4f5 100644
--- a/services/tests/mockingservicestests/jni/Android.bp
+++ b/services/tests/mockingservicestests/jni/Android.bp
@@ -48,6 +48,7 @@
         "libmemevents",
         "libmeminfo",
         "libnativehelper",
+        "libnetutils",
         "libprocessgroup",
         "libutils",
         "libcutils",
diff --git a/services/tests/servicestests/jni/Android.bp b/services/tests/servicestests/jni/Android.bp
index e738c19..b465ff2 100644
--- a/services/tests/servicestests/jni/Android.bp
+++ b/services/tests/servicestests/jni/Android.bp
@@ -48,6 +48,7 @@
         "libmeminfo",
         "libmemevents",
         "libnativehelper",
+        "libnetutils",
         "libprocessgroup",
         "libutils",
         "libcutils",