Merge "Store last data received from WindowInfosListener" into tm-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
249f65916d
@@ -17,6 +17,7 @@
|
|||||||
package android.window;
|
package android.window;
|
||||||
|
|
||||||
import android.graphics.Matrix;
|
import android.graphics.Matrix;
|
||||||
|
import android.util.Pair;
|
||||||
import android.util.Size;
|
import android.util.Size;
|
||||||
import android.view.InputWindowHandle;
|
import android.view.InputWindowHandle;
|
||||||
|
|
||||||
@@ -47,9 +48,13 @@ public abstract class WindowInfosListener {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Register the 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() {
|
public Pair<InputWindowHandle[], DisplayInfo[]> register() {
|
||||||
nativeRegister(mNativeListener);
|
return nativeRegister(mNativeListener);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -60,7 +65,7 @@ public abstract class WindowInfosListener {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private static native long nativeCreate(WindowInfosListener thiz);
|
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 void nativeUnregister(long ptr);
|
||||||
private static native long nativeGetFinalizer();
|
private static native long nativeGetFinalizer();
|
||||||
|
|
||||||
|
|||||||
@@ -44,6 +44,11 @@ static struct {
|
|||||||
jmethodID ctor;
|
jmethodID ctor;
|
||||||
} gDisplayInfoClassInfo;
|
} gDisplayInfoClassInfo;
|
||||||
|
|
||||||
|
static struct {
|
||||||
|
jclass clazz;
|
||||||
|
jmethodID ctor;
|
||||||
|
} gPairClassInfo;
|
||||||
|
|
||||||
static jclass gInputWindowHandleClass;
|
static jclass gInputWindowHandleClass;
|
||||||
|
|
||||||
jobject fromDisplayInfo(JNIEnv* env, gui::DisplayInfo displayInfo) {
|
jobject fromDisplayInfo(JNIEnv* env, gui::DisplayInfo displayInfo) {
|
||||||
@@ -57,6 +62,30 @@ jobject fromDisplayInfo(JNIEnv* env, gui::DisplayInfo displayInfo) {
|
|||||||
displayInfo.logicalHeight, matrixObj.get());
|
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 {
|
struct WindowInfosListener : public gui::WindowInfosListener {
|
||||||
WindowInfosListener(JNIEnv* env, jobject listener)
|
WindowInfosListener(JNIEnv* env, jobject listener)
|
||||||
: mListener(env->NewWeakGlobalRef(listener)) {}
|
: mListener(env->NewWeakGlobalRef(listener)) {}
|
||||||
@@ -72,26 +101,8 @@ struct WindowInfosListener : public gui::WindowInfosListener {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
ScopedLocalRef<jobjectArray>
|
ScopedLocalRef<jobjectArray> jWindowHandlesArray(env, fromWindowInfos(env, windowInfos));
|
||||||
jWindowHandlesArray(env,
|
ScopedLocalRef<jobjectArray> jDisplayInfoArray(env, fromDisplayInfos(env, displayInfos));
|
||||||
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());
|
|
||||||
}
|
|
||||||
|
|
||||||
env->CallVoidMethod(listener, gListenerClassInfo.onWindowInfosChanged,
|
env->CallVoidMethod(listener, gListenerClassInfo.onWindowInfosChanged,
|
||||||
jWindowHandlesArray.get(), jDisplayInfoArray.get());
|
jWindowHandlesArray.get(), jDisplayInfoArray.get());
|
||||||
@@ -124,9 +135,16 @@ void destroyNativeService(void* ptr) {
|
|||||||
listener->decStrong((void*)nativeCreate);
|
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);
|
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) {
|
void nativeUnregister(JNIEnv* env, jclass clazz, jlong ptr) {
|
||||||
@@ -141,7 +159,7 @@ static jlong nativeGetFinalizer(JNIEnv* /* env */, jclass /* clazz */) {
|
|||||||
const JNINativeMethod gMethods[] = {
|
const JNINativeMethod gMethods[] = {
|
||||||
/* name, signature, funcPtr */
|
/* name, signature, funcPtr */
|
||||||
{"nativeCreate", "(Landroid/window/WindowInfosListener;)J", (void*)nativeCreate},
|
{"nativeCreate", "(Landroid/window/WindowInfosListener;)J", (void*)nativeCreate},
|
||||||
{"nativeRegister", "(J)V", (void*)nativeRegister},
|
{"nativeRegister", "(J)Landroid/util/Pair;", (void*)nativeRegister},
|
||||||
{"nativeUnregister", "(J)V", (void*)nativeUnregister},
|
{"nativeUnregister", "(J)V", (void*)nativeUnregister},
|
||||||
{"nativeGetFinalizer", "()J", (void*)nativeGetFinalizer}};
|
{"nativeGetFinalizer", "()J", (void*)nativeGetFinalizer}};
|
||||||
|
|
||||||
@@ -166,6 +184,12 @@ int register_android_window_WindowInfosListener(JNIEnv* env) {
|
|||||||
gDisplayInfoClassInfo.clazz = MakeGlobalRefOrDie(env, clazz);
|
gDisplayInfoClassInfo.clazz = MakeGlobalRefOrDie(env, clazz);
|
||||||
gDisplayInfoClassInfo.ctor = env->GetMethodID(gDisplayInfoClassInfo.clazz, "<init>",
|
gDisplayInfoClassInfo.ctor = env->GetMethodID(gDisplayInfoClassInfo.clazz, "<init>",
|
||||||
"(IIILandroid/graphics/Matrix;)V");
|
"(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;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -30,6 +30,7 @@ import android.os.IBinder;
|
|||||||
import android.os.InputConfig;
|
import android.os.InputConfig;
|
||||||
import android.os.Looper;
|
import android.os.Looper;
|
||||||
import android.os.Message;
|
import android.os.Message;
|
||||||
|
import android.util.Pair;
|
||||||
import android.util.Slog;
|
import android.util.Slog;
|
||||||
import android.util.SparseArray;
|
import android.util.SparseArray;
|
||||||
import android.view.IWindow;
|
import android.view.IWindow;
|
||||||
@@ -94,8 +95,6 @@ public final class AccessibilityWindowsPopulator extends WindowInfosListener {
|
|||||||
mService = service;
|
mService = service;
|
||||||
mAccessibilityController = accessibilityController;
|
mAccessibilityController = accessibilityController;
|
||||||
mHandler = new MyHandler(mService.mH.getLooper());
|
mHandler = new MyHandler(mService.mH.getLooper());
|
||||||
|
|
||||||
register();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -219,8 +218,10 @@ public final class AccessibilityWindowsPopulator extends WindowInfosListener {
|
|||||||
}
|
}
|
||||||
mWindowsNotificationEnabled = register;
|
mWindowsNotificationEnabled = register;
|
||||||
if (mWindowsNotificationEnabled) {
|
if (mWindowsNotificationEnabled) {
|
||||||
populateVisibleWindowHandlesAndNotifyWindowsChangeIfNeeded();
|
Pair<InputWindowHandle[], DisplayInfo[]> info = register();
|
||||||
|
onWindowInfosChangedInternal(info.first, info.second);
|
||||||
} else {
|
} else {
|
||||||
|
unregister();
|
||||||
releaseResources();
|
releaseResources();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user