DebianServiceImpl to Kotlin

Bug: 383243644
Test: port forwarding
Change-Id: I72490c4d8ac74ba6fcc8ae84c1dad81f9d267780
diff --git a/android/TerminalApp/java/com/android/virtualization/terminal/DebianServiceImpl.java b/android/TerminalApp/java/com/android/virtualization/terminal/DebianServiceImpl.java
deleted file mode 100644
index b4dffee..0000000
--- a/android/TerminalApp/java/com/android/virtualization/terminal/DebianServiceImpl.java
+++ /dev/null
@@ -1,148 +0,0 @@
-/*
- * Copyright (C) 2024 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.
- */
-
-package com.android.virtualization.terminal;
-
-import static com.android.virtualization.terminal.MainActivity.TAG;
-
-import android.content.Context;
-import android.util.Log;
-
-import androidx.annotation.Keep;
-
-import com.android.virtualization.terminal.proto.DebianServiceGrpc;
-import com.android.virtualization.terminal.proto.ForwardingRequestItem;
-import com.android.virtualization.terminal.proto.QueueOpeningRequest;
-import com.android.virtualization.terminal.proto.ReportVmActivePortsRequest;
-import com.android.virtualization.terminal.proto.ReportVmActivePortsResponse;
-import com.android.virtualization.terminal.proto.ShutdownQueueOpeningRequest;
-import com.android.virtualization.terminal.proto.ShutdownRequestItem;
-
-import io.grpc.stub.StreamObserver;
-
-import java.util.Set;
-
-final class DebianServiceImpl extends DebianServiceGrpc.DebianServiceImplBase {
-    private final Context mContext;
-    private final PortsStateManager mPortsStateManager;
-    private PortsStateManager.Listener mPortsStateListener;
-    private Runnable mShutdownRunnable;
-
-    static {
-        System.loadLibrary("forwarder_host_jni");
-    }
-
-    DebianServiceImpl(Context context) {
-        super();
-        mContext = context;
-        mPortsStateManager = PortsStateManager.getInstance(mContext);
-    }
-
-    @Override
-    public void reportVmActivePorts(
-            ReportVmActivePortsRequest request,
-            StreamObserver<ReportVmActivePortsResponse> responseObserver) {
-        mPortsStateManager.updateActivePorts(request.getPortsList());
-        Log.d(TAG, "reportVmActivePorts: " + mPortsStateManager.getActivePorts());
-        ReportVmActivePortsResponse reply =
-                ReportVmActivePortsResponse.newBuilder().setSuccess(true).build();
-        responseObserver.onNext(reply);
-        responseObserver.onCompleted();
-    }
-
-    @Override
-    public void openForwardingRequestQueue(
-            QueueOpeningRequest request, StreamObserver<ForwardingRequestItem> responseObserver) {
-        Log.d(TAG, "OpenForwardingRequestQueue");
-        mPortsStateListener =
-                new PortsStateManager.Listener() {
-                    @Override
-                    public void onPortsStateUpdated(
-                            Set<Integer> oldActivePorts, Set<Integer> newActivePorts) {
-                        updateListeningPorts();
-                    }
-                };
-        mPortsStateManager.registerListener(mPortsStateListener);
-        updateListeningPorts();
-        runForwarderHost(request.getCid(), new ForwarderHostCallback(responseObserver));
-        responseObserver.onCompleted();
-    }
-
-    public boolean shutdownDebian() {
-        if (mShutdownRunnable == null) {
-            Log.d(TAG, "mShutdownRunnable is not ready.");
-            return false;
-        }
-        mShutdownRunnable.run();
-        return true;
-    }
-
-    @Override
-    public void openShutdownRequestQueue(
-            ShutdownQueueOpeningRequest request,
-            StreamObserver<ShutdownRequestItem> responseObserver) {
-        Log.d(TAG, "openShutdownRequestQueue");
-        mShutdownRunnable =
-                () -> {
-                    responseObserver.onNext(ShutdownRequestItem.newBuilder().build());
-                    responseObserver.onCompleted();
-                    mShutdownRunnable = null;
-                };
-    }
-
-    @Keep
-    private static class ForwarderHostCallback {
-        private StreamObserver<ForwardingRequestItem> mResponseObserver;
-
-        ForwarderHostCallback(StreamObserver<ForwardingRequestItem> responseObserver) {
-            mResponseObserver = responseObserver;
-        }
-
-        private void onForwardingRequestReceived(int guestTcpPort, int vsockPort) {
-            ForwardingRequestItem item =
-                    ForwardingRequestItem.newBuilder()
-                            .setGuestTcpPort(guestTcpPort)
-                            .setVsockPort(vsockPort)
-                            .build();
-            mResponseObserver.onNext(item);
-        }
-    }
-
-    private static native void runForwarderHost(int cid, ForwarderHostCallback callback);
-
-    private static native void terminateForwarderHost();
-
-    void killForwarderHost() {
-        Log.d(TAG, "Stopping port forwarding");
-        if (mPortsStateListener != null) {
-            mPortsStateManager.unregisterListener(mPortsStateListener);
-            mPortsStateListener = null;
-        }
-        terminateForwarderHost();
-    }
-
-    private static native void updateListeningPorts(int[] ports);
-
-    private void updateListeningPorts() {
-        Set<Integer> activePorts = mPortsStateManager.getActivePorts();
-        Set<Integer> enabledPorts = mPortsStateManager.getEnabledPorts();
-        updateListeningPorts(
-                activePorts.stream()
-                        .filter(port -> enabledPorts.contains(port))
-                        .mapToInt(Integer::intValue)
-                        .toArray());
-    }
-}
diff --git a/android/TerminalApp/java/com/android/virtualization/terminal/DebianServiceImpl.kt b/android/TerminalApp/java/com/android/virtualization/terminal/DebianServiceImpl.kt
new file mode 100644
index 0000000..887ae02
--- /dev/null
+++ b/android/TerminalApp/java/com/android/virtualization/terminal/DebianServiceImpl.kt
@@ -0,0 +1,131 @@
+/*
+ * Copyright (C) 2024 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.
+ */
+package com.android.virtualization.terminal
+
+import android.content.Context
+import android.util.Log
+import androidx.annotation.Keep
+import com.android.virtualization.terminal.DebianServiceImpl.ForwarderHostCallback
+import com.android.virtualization.terminal.MainActivity.Companion.TAG
+import com.android.virtualization.terminal.PortsStateManager.Companion.getInstance
+import com.android.virtualization.terminal.proto.DebianServiceGrpc.DebianServiceImplBase
+import com.android.virtualization.terminal.proto.ForwardingRequestItem
+import com.android.virtualization.terminal.proto.QueueOpeningRequest
+import com.android.virtualization.terminal.proto.ReportVmActivePortsRequest
+import com.android.virtualization.terminal.proto.ReportVmActivePortsResponse
+import com.android.virtualization.terminal.proto.ShutdownQueueOpeningRequest
+import com.android.virtualization.terminal.proto.ShutdownRequestItem
+import io.grpc.stub.StreamObserver
+
+internal class DebianServiceImpl(context: Context) : DebianServiceImplBase() {
+    private val portsStateManager: PortsStateManager = getInstance(context)
+    private var portsStateListener: PortsStateManager.Listener? = null
+    private var shutdownRunnable: Runnable? = null
+
+    override fun reportVmActivePorts(
+        request: ReportVmActivePortsRequest,
+        responseObserver: StreamObserver<ReportVmActivePortsResponse?>,
+    ) {
+        portsStateManager.updateActivePorts(request.portsList)
+        Log.d(TAG, "reportVmActivePorts: " + portsStateManager.getActivePorts())
+        val reply = ReportVmActivePortsResponse.newBuilder().setSuccess(true).build()
+        responseObserver.onNext(reply)
+        responseObserver.onCompleted()
+    }
+
+    override fun openForwardingRequestQueue(
+        request: QueueOpeningRequest,
+        responseObserver: StreamObserver<ForwardingRequestItem?>,
+    ) {
+        Log.d(TAG, "OpenForwardingRequestQueue")
+        portsStateListener =
+            object : PortsStateManager.Listener {
+                override fun onPortsStateUpdated(
+                    oldActivePorts: Set<Int>,
+                    newActivePorts: Set<Int>,
+                ) {
+                    updateListeningPorts()
+                }
+            }
+        portsStateManager.registerListener(portsStateListener!!)
+        updateListeningPorts()
+        runForwarderHost(request.cid, ForwarderHostCallback(responseObserver))
+        responseObserver.onCompleted()
+    }
+
+    fun shutdownDebian(): Boolean {
+        if (shutdownRunnable == null) {
+            Log.d(TAG, "mShutdownRunnable is not ready.")
+            return false
+        }
+        shutdownRunnable!!.run()
+        return true
+    }
+
+    override fun openShutdownRequestQueue(
+        request: ShutdownQueueOpeningRequest?,
+        responseObserver: StreamObserver<ShutdownRequestItem?>,
+    ) {
+        Log.d(TAG, "openShutdownRequestQueue")
+        shutdownRunnable = Runnable {
+            responseObserver.onNext(ShutdownRequestItem.newBuilder().build())
+            responseObserver.onCompleted()
+            shutdownRunnable = null
+        }
+    }
+
+    @Keep
+    private class ForwarderHostCallback(
+        private val responseObserver: StreamObserver<ForwardingRequestItem?>
+    ) {
+
+        fun onForwardingRequestReceived(guestTcpPort: Int, vsockPort: Int) {
+            val item =
+                ForwardingRequestItem.newBuilder()
+                    .setGuestTcpPort(guestTcpPort)
+                    .setVsockPort(vsockPort)
+                    .build()
+            responseObserver.onNext(item)
+        }
+    }
+
+    fun killForwarderHost() {
+        Log.d(TAG, "Stopping port forwarding")
+        if (portsStateListener != null) {
+            portsStateManager.unregisterListener(portsStateListener!!)
+            portsStateListener = null
+        }
+        terminateForwarderHost()
+    }
+
+    private fun updateListeningPorts() {
+        val activePorts: Set<Int> = portsStateManager.getActivePorts()
+        val enabledPorts: Set<Int> = portsStateManager.getEnabledPorts()
+        updateListeningPorts(activePorts.filter { enabledPorts.contains(it) }.toIntArray())
+    }
+
+    companion object {
+        init {
+            System.loadLibrary("forwarder_host_jni")
+        }
+
+        @JvmStatic private external fun runForwarderHost(cid: Int, callback: ForwarderHostCallback?)
+
+        @JvmStatic private external fun terminateForwarderHost()
+
+        @JvmStatic private external fun updateListeningPorts(ports: IntArray?)
+    }
+}