Merge "Store last data received from WindowInfosListener" into tm-dev

This commit is contained in:
Chavi Weingarten
2022-03-18 21:11:20 +00:00
committed by Android (Google) Code Review
3 changed files with 59 additions and 29 deletions

View File

@@ -17,6 +17,7 @@
package android.window;
import android.graphics.Matrix;
import android.util.Pair;
import android.util.Size;
import android.view.InputWindowHandle;
@@ -47,9 +48,13 @@ public abstract class WindowInfosListener {
/**
* Register the WindowInfosListener.
*
* @return The cached values for InputWindowHandles and DisplayInfos. This is the last updated
* value that was sent from SurfaceFlinger to this particular process. If there was nothing
* registered previously, then the data can be empty.
*/
public void register() {
nativeRegister(mNativeListener);
public Pair<InputWindowHandle[], DisplayInfo[]> register() {
return nativeRegister(mNativeListener);
}
/**
@@ -60,7 +65,7 @@ public abstract class WindowInfosListener {
}
private static native long nativeCreate(WindowInfosListener thiz);
private static native void nativeRegister(long ptr);
private static native Pair<InputWindowHandle[], DisplayInfo[]> nativeRegister(long ptr);
private static native void nativeUnregister(long ptr);
private static native long nativeGetFinalizer();

View File

@@ -44,6 +44,11 @@ static struct {
jmethodID ctor;
} gDisplayInfoClassInfo;
static struct {
jclass clazz;
jmethodID ctor;
} gPairClassInfo;
static jclass gInputWindowHandleClass;
jobject fromDisplayInfo(JNIEnv* env, gui::DisplayInfo displayInfo) {
@@ -57,6 +62,30 @@ jobject fromDisplayInfo(JNIEnv* env, gui::DisplayInfo displayInfo) {
displayInfo.logicalHeight, matrixObj.get());
}
static jobjectArray fromWindowInfos(JNIEnv* env, const std::vector<WindowInfo>& windowInfos) {
jobjectArray jWindowHandlesArray =
env->NewObjectArray(windowInfos.size(), gInputWindowHandleClass, nullptr);
for (int i = 0; i < windowInfos.size(); i++) {
ScopedLocalRef<jobject>
jWindowHandle(env,
android_view_InputWindowHandle_fromWindowInfo(env, windowInfos[i]));
env->SetObjectArrayElement(jWindowHandlesArray, i, jWindowHandle.get());
}
return jWindowHandlesArray;
}
static jobjectArray fromDisplayInfos(JNIEnv* env, const std::vector<DisplayInfo>& displayInfos) {
jobjectArray jDisplayInfoArray =
env->NewObjectArray(displayInfos.size(), gDisplayInfoClassInfo.clazz, nullptr);
for (int i = 0; i < displayInfos.size(); i++) {
ScopedLocalRef<jobject> jDisplayInfo(env, fromDisplayInfo(env, displayInfos[i]));
env->SetObjectArrayElement(jDisplayInfoArray, i, jDisplayInfo.get());
}
return jDisplayInfoArray;
}
struct WindowInfosListener : public gui::WindowInfosListener {
WindowInfosListener(JNIEnv* env, jobject listener)
: mListener(env->NewWeakGlobalRef(listener)) {}
@@ -72,26 +101,8 @@ struct WindowInfosListener : public gui::WindowInfosListener {
return;
}
ScopedLocalRef<jobjectArray>
jWindowHandlesArray(env,
env->NewObjectArray(windowInfos.size(), gInputWindowHandleClass,
nullptr));
for (int i = 0; i < windowInfos.size(); i++) {
ScopedLocalRef<jobject>
jWindowHandle(env,
android_view_InputWindowHandle_fromWindowInfo(env,
windowInfos[i]));
env->SetObjectArrayElement(jWindowHandlesArray.get(), i, jWindowHandle.get());
}
ScopedLocalRef<jobjectArray>
jDisplayInfoArray(env,
env->NewObjectArray(displayInfos.size(),
gDisplayInfoClassInfo.clazz, nullptr));
for (int i = 0; i < displayInfos.size(); i++) {
ScopedLocalRef<jobject> jDisplayInfo(env, fromDisplayInfo(env, displayInfos[i]));
env->SetObjectArrayElement(jDisplayInfoArray.get(), i, jDisplayInfo.get());
}
ScopedLocalRef<jobjectArray> jWindowHandlesArray(env, fromWindowInfos(env, windowInfos));
ScopedLocalRef<jobjectArray> jDisplayInfoArray(env, fromDisplayInfos(env, displayInfos));
env->CallVoidMethod(listener, gListenerClassInfo.onWindowInfosChanged,
jWindowHandlesArray.get(), jDisplayInfoArray.get());
@@ -124,9 +135,16 @@ void destroyNativeService(void* ptr) {
listener->decStrong((void*)nativeCreate);
}
void nativeRegister(JNIEnv* env, jclass clazz, jlong ptr) {
jobject nativeRegister(JNIEnv* env, jclass clazz, jlong ptr) {
sp<WindowInfosListener> listener = reinterpret_cast<WindowInfosListener*>(ptr);
SurfaceComposerClient::getDefault()->addWindowInfosListener(listener);
std::pair<std::vector<gui::WindowInfo>, std::vector<gui::DisplayInfo>> initialInfo;
SurfaceComposerClient::getDefault()->addWindowInfosListener(listener, &initialInfo);
ScopedLocalRef<jobjectArray> jWindowHandlesArray(env, fromWindowInfos(env, initialInfo.first));
ScopedLocalRef<jobjectArray> jDisplayInfoArray(env, fromDisplayInfos(env, initialInfo.second));
return env->NewObject(gPairClassInfo.clazz, gPairClassInfo.ctor, jWindowHandlesArray.get(),
jDisplayInfoArray.get());
}
void nativeUnregister(JNIEnv* env, jclass clazz, jlong ptr) {
@@ -141,7 +159,7 @@ static jlong nativeGetFinalizer(JNIEnv* /* env */, jclass /* clazz */) {
const JNINativeMethod gMethods[] = {
/* name, signature, funcPtr */
{"nativeCreate", "(Landroid/window/WindowInfosListener;)J", (void*)nativeCreate},
{"nativeRegister", "(J)V", (void*)nativeRegister},
{"nativeRegister", "(J)Landroid/util/Pair;", (void*)nativeRegister},
{"nativeUnregister", "(J)V", (void*)nativeUnregister},
{"nativeGetFinalizer", "()J", (void*)nativeGetFinalizer}};
@@ -166,6 +184,12 @@ int register_android_window_WindowInfosListener(JNIEnv* env) {
gDisplayInfoClassInfo.clazz = MakeGlobalRefOrDie(env, clazz);
gDisplayInfoClassInfo.ctor = env->GetMethodID(gDisplayInfoClassInfo.clazz, "<init>",
"(IIILandroid/graphics/Matrix;)V");
clazz = env->FindClass("android/util/Pair");
gPairClassInfo.clazz = MakeGlobalRefOrDie(env, clazz);
gPairClassInfo.ctor = env->GetMethodID(gPairClassInfo.clazz, "<init>",
"(Ljava/lang/Object;Ljava/lang/Object;)V");
return 0;
}

View File

@@ -30,6 +30,7 @@ import android.os.IBinder;
import android.os.InputConfig;
import android.os.Looper;
import android.os.Message;
import android.util.Pair;
import android.util.Slog;
import android.util.SparseArray;
import android.view.IWindow;
@@ -94,8 +95,6 @@ public final class AccessibilityWindowsPopulator extends WindowInfosListener {
mService = service;
mAccessibilityController = accessibilityController;
mHandler = new MyHandler(mService.mH.getLooper());
register();
}
/**
@@ -219,8 +218,10 @@ public final class AccessibilityWindowsPopulator extends WindowInfosListener {
}
mWindowsNotificationEnabled = register;
if (mWindowsNotificationEnabled) {
populateVisibleWindowHandlesAndNotifyWindowsChangeIfNeeded();
Pair<InputWindowHandle[], DisplayInfo[]> info = register();
onWindowInfosChangedInternal(info.first, info.second);
} else {
unregister();
releaseResources();
}
}