summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Chavi Weingarten <chaviw@google.com> 2022-08-31 21:01:06 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2022-08-31 21:01:06 +0000
commit7761e7dc2f9b9543ac0b56704c95e4f9ec7ef8da (patch)
treeeb96bad3ddc78fd80ab7c709d05d95577417f7cc
parent4e2a09bf00e773d0929106a1e96d5cf7df143a6f (diff)
parent7c25a8f17349b29e4545183363092d88eb5567d5 (diff)
Merge "Move create and destroy display APIs into server."
-rw-r--r--services/core/java/com/android/server/display/DisplayControl.java55
-rw-r--r--services/core/java/com/android/server/display/OverlayDisplayAdapter.java4
-rw-r--r--services/core/java/com/android/server/display/VirtualDisplayAdapter.java5
-rw-r--r--services/core/java/com/android/server/display/WifiDisplayAdapter.java4
-rw-r--r--services/core/jni/Android.bp1
-rw-r--r--services/core/jni/com_android_server_display_DisplayControl.cpp52
-rw-r--r--services/core/jni/onload.cpp2
7 files changed, 116 insertions, 7 deletions
diff --git a/services/core/java/com/android/server/display/DisplayControl.java b/services/core/java/com/android/server/display/DisplayControl.java
new file mode 100644
index 000000000000..e9640cf6b4d5
--- /dev/null
+++ b/services/core/java/com/android/server/display/DisplayControl.java
@@ -0,0 +1,55 @@
+/*
+ * 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.
+ */
+
+package com.android.server.display;
+
+import android.os.IBinder;
+
+import java.util.Objects;
+
+/**
+ * Calls into SurfaceFlinger for Display creation and deletion.
+ */
+public class DisplayControl {
+ private static native IBinder nativeCreateDisplay(String name, boolean secure);
+ private static native void nativeDestroyDisplay(IBinder displayToken);
+
+ /**
+ * Create a display in SurfaceFlinger.
+ *
+ * @param name The name of the display
+ * @param secure Whether this display is secure.
+ * @return The token reference for the display in SurfaceFlinger.
+ */
+ public static IBinder createDisplay(String name, boolean secure) {
+ Objects.requireNonNull(name, "name must not be null");
+ return nativeCreateDisplay(name, secure);
+ }
+
+ /**
+ * Destroy a display in SurfaceFlinger.
+ *
+ * @param displayToken The display token for the display to be destroyed.
+ */
+ public static void destroyDisplay(IBinder displayToken) {
+ if (displayToken == null) {
+ throw new IllegalArgumentException("displayToken must not be null");
+ }
+
+ nativeDestroyDisplay(displayToken);
+ }
+
+}
diff --git a/services/core/java/com/android/server/display/OverlayDisplayAdapter.java b/services/core/java/com/android/server/display/OverlayDisplayAdapter.java
index 330379cf58eb..b0de844389b6 100644
--- a/services/core/java/com/android/server/display/OverlayDisplayAdapter.java
+++ b/services/core/java/com/android/server/display/OverlayDisplayAdapter.java
@@ -305,7 +305,7 @@ final class OverlayDisplayAdapter extends DisplayAdapter {
mSurface.release();
mSurface = null;
}
- SurfaceControl.destroyDisplay(getDisplayTokenLocked());
+ DisplayControl.destroyDisplay(getDisplayTokenLocked());
}
@Override
@@ -460,7 +460,7 @@ final class OverlayDisplayAdapter extends DisplayAdapter {
public void onWindowCreated(SurfaceTexture surfaceTexture, float refreshRate,
long presentationDeadlineNanos, int state) {
synchronized (getSyncRoot()) {
- IBinder displayToken = SurfaceControl.createDisplay(mName, mFlags.mSecure);
+ IBinder displayToken = DisplayControl.createDisplay(mName, mFlags.mSecure);
mDevice = new OverlayDisplayDevice(displayToken, mName, mModes, mActiveMode,
DEFAULT_MODE_INDEX, refreshRate, presentationDeadlineNanos,
mFlags, state, surfaceTexture, mNumber) {
diff --git a/services/core/java/com/android/server/display/VirtualDisplayAdapter.java b/services/core/java/com/android/server/display/VirtualDisplayAdapter.java
index 479629eae7ac..38728ce106af 100644
--- a/services/core/java/com/android/server/display/VirtualDisplayAdapter.java
+++ b/services/core/java/com/android/server/display/VirtualDisplayAdapter.java
@@ -82,8 +82,7 @@ public class VirtualDisplayAdapter extends DisplayAdapter {
// Called with SyncRoot lock held.
public VirtualDisplayAdapter(DisplayManagerService.SyncRoot syncRoot,
Context context, Handler handler, Listener listener) {
- this(syncRoot, context, handler, listener,
- (String name, boolean secure) -> SurfaceControl.createDisplay(name, secure));
+ this(syncRoot, context, handler, listener, DisplayControl::createDisplay);
}
@VisibleForTesting
@@ -296,7 +295,7 @@ public class VirtualDisplayAdapter extends DisplayAdapter {
mSurface.release();
mSurface = null;
}
- SurfaceControl.destroyDisplay(getDisplayTokenLocked());
+ DisplayControl.destroyDisplay(getDisplayTokenLocked());
if (mProjection != null && mMediaProjectionCallback != null) {
try {
mProjection.unregisterCallback(mMediaProjectionCallback);
diff --git a/services/core/java/com/android/server/display/WifiDisplayAdapter.java b/services/core/java/com/android/server/display/WifiDisplayAdapter.java
index d632ee3d021c..146b003650ac 100644
--- a/services/core/java/com/android/server/display/WifiDisplayAdapter.java
+++ b/services/core/java/com/android/server/display/WifiDisplayAdapter.java
@@ -388,7 +388,7 @@ final class WifiDisplayAdapter extends DisplayAdapter {
String name = display.getFriendlyDisplayName();
String address = display.getDeviceAddress();
- IBinder displayToken = SurfaceControl.createDisplay(name, secure);
+ IBinder displayToken = DisplayControl.createDisplay(name, secure);
mDisplayDevice = new WifiDisplayDevice(displayToken, name, width, height,
refreshRate, deviceFlags, address, surface);
sendDisplayDeviceEventLocked(mDisplayDevice, DISPLAY_DEVICE_EVENT_ADDED);
@@ -621,7 +621,7 @@ final class WifiDisplayAdapter extends DisplayAdapter {
mSurface.release();
mSurface = null;
}
- SurfaceControl.destroyDisplay(getDisplayTokenLocked());
+ DisplayControl.destroyDisplay(getDisplayTokenLocked());
}
public void setNameLocked(String name) {
diff --git a/services/core/jni/Android.bp b/services/core/jni/Android.bp
index 24101dd159a2..5d6ffd8b8ead 100644
--- a/services/core/jni/Android.bp
+++ b/services/core/jni/Android.bp
@@ -37,6 +37,7 @@ cc_library_static {
"com_android_server_ConsumerIrService.cpp",
"com_android_server_companion_virtual_InputController.cpp",
"com_android_server_devicepolicy_CryptoTestHelper.cpp",
+ "com_android_server_display_DisplayControl.cpp",
"com_android_server_connectivity_Vpn.cpp",
"com_android_server_gpu_GpuService.cpp",
"com_android_server_HardwarePropertiesManagerService.cpp",
diff --git a/services/core/jni/com_android_server_display_DisplayControl.cpp b/services/core/jni/com_android_server_display_DisplayControl.cpp
new file mode 100644
index 000000000000..61f2b1411a0b
--- /dev/null
+++ b/services/core/jni/com_android_server_display_DisplayControl.cpp
@@ -0,0 +1,52 @@
+/*
+ * 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.
+ */
+
+#include <android_util_Binder.h>
+#include <gui/SurfaceComposerClient.h>
+#include <jni.h>
+#include <nativehelper/ScopedUtfChars.h>
+
+namespace android {
+
+static jobject nativeCreateDisplay(JNIEnv* env, jclass clazz, jstring nameObj, jboolean secure) {
+ ScopedUtfChars name(env, nameObj);
+ sp<IBinder> token(SurfaceComposerClient::createDisplay(String8(name.c_str()), bool(secure)));
+ return javaObjectForIBinder(env, token);
+}
+
+static void nativeDestroyDisplay(JNIEnv* env, jclass clazz, jobject tokenObj) {
+ sp<IBinder> token(ibinderForJavaObject(env, tokenObj));
+ if (token == NULL) return;
+ SurfaceComposerClient::destroyDisplay(token);
+}
+
+// ----------------------------------------------------------------------------
+
+static const JNINativeMethod sDisplayMethods[] = {
+ // clang-format off
+ {"nativeCreateDisplay", "(Ljava/lang/String;Z)Landroid/os/IBinder;",
+ (void*)nativeCreateDisplay },
+ {"nativeDestroyDisplay", "(Landroid/os/IBinder;)V",
+ (void*)nativeDestroyDisplay },
+ // clang-format on
+};
+
+int register_com_android_server_display_DisplayControl(JNIEnv* env) {
+ return jniRegisterNativeMethods(env, "com/android/server/display/DisplayControl",
+ sDisplayMethods, NELEM(sDisplayMethods));
+}
+
+} // namespace android
diff --git a/services/core/jni/onload.cpp b/services/core/jni/onload.cpp
index 0cd949457cd1..00bef0935308 100644
--- a/services/core/jni/onload.cpp
+++ b/services/core/jni/onload.cpp
@@ -64,6 +64,7 @@ int register_android_server_sensor_SensorService(JavaVM* vm, JNIEnv* env);
int register_android_server_companion_virtual_InputController(JNIEnv* env);
int register_android_server_app_GameManagerService(JNIEnv* env);
int register_com_android_server_wm_TaskFpsCallbackController(JNIEnv* env);
+int register_com_android_server_display_DisplayControl(JNIEnv* env);
};
using namespace android;
@@ -120,5 +121,6 @@ extern "C" jint JNI_OnLoad(JavaVM* vm, void* /* reserved */)
register_android_server_companion_virtual_InputController(env);
register_android_server_app_GameManagerService(env);
register_com_android_server_wm_TaskFpsCallbackController(env);
+ register_com_android_server_display_DisplayControl(env);
return JNI_VERSION_1_4;
}