Merge "Do not allow VmsHalService to close the large packet SharedMemory." into rvc-dev
diff --git a/car-lib/src/android/car/vms/VmsClient.java b/car-lib/src/android/car/vms/VmsClient.java
index 394ba67..a941909 100644
--- a/car-lib/src/android/car/vms/VmsClient.java
+++ b/car-lib/src/android/car/vms/VmsClient.java
@@ -65,6 +65,7 @@
     private final Executor mExecutor;
     private final VmsClientCallback mCallback;
     private final boolean mLegacyClient;
+    private final IVmsClientCallback mClientCallback;
     private final Consumer<RemoteException> mExceptionHandler;
     private final IBinder mClientToken;
 
@@ -80,11 +81,13 @@
      * @hide
      */
     public VmsClient(IVmsBrokerService service, Executor executor, VmsClientCallback callback,
-            boolean legacyClient, Consumer<RemoteException> exceptionHandler) {
+            boolean legacyClient, boolean autoCloseMemory,
+            Consumer<RemoteException> exceptionHandler) {
         mService = service;
         mExecutor = executor;
         mCallback = callback;
         mLegacyClient = legacyClient;
+        mClientCallback = new IVmsClientCallbackImpl(this, autoCloseMemory);
         mExceptionHandler = exceptionHandler;
         mClientToken = new Binder();
     }
@@ -279,8 +282,8 @@
      * @hide
      */
     public void register() throws RemoteException {
-        VmsRegistrationInfo registrationInfo = mService.registerClient(mClientToken,
-                new IVmsClientCallbackImpl(this), mLegacyClient);
+        VmsRegistrationInfo registrationInfo = mService.registerClient(
+                mClientToken, mClientCallback, mLegacyClient);
         synchronized (mLock) {
             mAvailableLayers = registrationInfo.getAvailableLayers();
             mSubscriptionState = registrationInfo.getSubscriptionState();
@@ -298,9 +301,11 @@
 
     private static class IVmsClientCallbackImpl extends IVmsClientCallback.Stub {
         private final WeakReference<VmsClient> mClient;
+        private final boolean mAutoCloseMemory;
 
-        private IVmsClientCallbackImpl(VmsClient client) {
+        private IVmsClientCallbackImpl(VmsClient client, boolean autoCloseMemory) {
             mClient = new WeakReference<>(client);
+            mAutoCloseMemory = autoCloseMemory;
         }
 
         @Override
@@ -337,15 +342,20 @@
 
         @Override
         public void onLargePacketReceived(int providerId, VmsLayer layer, SharedMemory packet) {
-            try (SharedMemory largePacket = packet) {
-                if (DBG) {
-                    Log.d(TAG, "Received large packet from " + providerId + " for: " + layer
-                            + " (" + largePacket.getSize() + " bytes)");
-                }
-                byte[] packetData = sharedMemoryToPacket(largePacket);
-                executeCallback((client, callback) ->
-                        callback.onPacketReceived(providerId, layer, packetData));
+            if (DBG) {
+                Log.d(TAG, "Received large packet from " + providerId + " for: " + layer
+                        + " (" + packet.getSize() + " bytes)");
             }
+            byte[] largePacket;
+            if (mAutoCloseMemory) {
+                try (SharedMemory autoClosedPacket = packet) {
+                    largePacket = sharedMemoryToPacket(autoClosedPacket);
+                }
+            } else {
+                largePacket = sharedMemoryToPacket(packet);
+            }
+            executeCallback((client, callback) ->
+                    callback.onPacketReceived(providerId, layer, largePacket));
         }
 
         private void executeCallback(BiConsumer<VmsClient, VmsClientCallback> callbackOperation) {
diff --git a/car-lib/src/android/car/vms/VmsClientManager.java b/car-lib/src/android/car/vms/VmsClientManager.java
index c6f8be8..db43342 100644
--- a/car-lib/src/android/car/vms/VmsClientManager.java
+++ b/car-lib/src/android/car/vms/VmsClientManager.java
@@ -127,6 +127,7 @@
             }
 
             client = new VmsClient(mBrokerService, executor, callback, legacyClient,
+                    /* autoCloseMemory */ true,
                     this::handleRemoteExceptionFromCarService);
             mClients.put(callback, client);
             if (DBG) Log.d(TAG, "Client count: " + mClients.size());
diff --git a/service/src/com/android/car/hal/VmsHalService.java b/service/src/com/android/car/hal/VmsHalService.java
index f740f10..f1129f7 100644
--- a/service/src/com/android/car/hal/VmsHalService.java
+++ b/service/src/com/android/car/hal/VmsHalService.java
@@ -347,7 +347,8 @@
             return null;
         }
         VmsClient client = new VmsClient(brokerService, new HandlerExecutor(handler), callback,
-                /* legacyClient= */ true, /* exceptionHandler= */ ignored -> { });
+                /* legacyClient= */ true, /* autoCloseMemory */ false,
+                /* exceptionHandler= */ ignored -> { });
         try {
             client.register();
         } catch (RemoteException e) {