diff options
7 files changed, 40 insertions, 16 deletions
diff --git a/core/java/android/view/Choreographer.java b/core/java/android/view/Choreographer.java index c64386e8db79..e95b5caa4fa0 100644 --- a/core/java/android/view/Choreographer.java +++ b/core/java/android/view/Choreographer.java @@ -16,6 +16,7 @@ package android.view; +import static android.view.DisplayEventReceiver.CONFIG_CHANGED_EVENT_SUPPRESS; import static android.view.DisplayEventReceiver.VSYNC_SOURCE_APP; import static android.view.DisplayEventReceiver.VSYNC_SOURCE_SURFACE_FLINGER; @@ -910,7 +911,7 @@ public final class Choreographer { private int mFrame; public FrameDisplayEventReceiver(Looper looper, int vsyncSource) { - super(looper, vsyncSource); + super(looper, vsyncSource, CONFIG_CHANGED_EVENT_SUPPRESS); } // TODO(b/116025192): physicalDisplayId is ignored because SF only emits VSYNC events for diff --git a/core/java/android/view/DisplayEventReceiver.java b/core/java/android/view/DisplayEventReceiver.java index 60daddd663d5..91acc4638c26 100644 --- a/core/java/android/view/DisplayEventReceiver.java +++ b/core/java/android/view/DisplayEventReceiver.java @@ -53,6 +53,20 @@ public abstract class DisplayEventReceiver { */ public static final int VSYNC_SOURCE_SURFACE_FLINGER = 1; + /** + * Specifies to suppress config changed events from being generated from Surface Flinger. + * <p> + * Needs to be kept in sync with frameworks/native/include/gui/ISurfaceComposer.h + */ + public static final int CONFIG_CHANGED_EVENT_SUPPRESS = 0; + + /** + * Specifies to generate config changed events from Surface Flinger. + * <p> + * Needs to be kept in sync with frameworks/native/include/gui/ISurfaceComposer.h + */ + public static final int CONFIG_CHANGED_EVENT_DISPATCH = 1; + private static final String TAG = "DisplayEventReceiver"; private final CloseGuard mCloseGuard = CloseGuard.get(); @@ -65,7 +79,7 @@ public abstract class DisplayEventReceiver { private MessageQueue mMessageQueue; private static native long nativeInit(WeakReference<DisplayEventReceiver> receiver, - MessageQueue messageQueue, int vsyncSource); + MessageQueue messageQueue, int vsyncSource, int configChanged); private static native void nativeDispose(long receiverPtr); @FastNative private static native void nativeScheduleVsync(long receiverPtr); @@ -77,7 +91,7 @@ public abstract class DisplayEventReceiver { */ @UnsupportedAppUsage public DisplayEventReceiver(Looper looper) { - this(looper, VSYNC_SOURCE_APP); + this(looper, VSYNC_SOURCE_APP, CONFIG_CHANGED_EVENT_SUPPRESS); } /** @@ -85,15 +99,17 @@ public abstract class DisplayEventReceiver { * * @param looper The looper to use when invoking callbacks. * @param vsyncSource The source of the vsync tick. Must be on of the VSYNC_SOURCE_* values. + * @param configChanged Whether to dispatch config changed events. Must be one of the + * CONFIG_CHANGED_EVENT_* values. */ - public DisplayEventReceiver(Looper looper, int vsyncSource) { + public DisplayEventReceiver(Looper looper, int vsyncSource, int configChanged) { if (looper == null) { throw new IllegalArgumentException("looper must not be null"); } mMessageQueue = looper.getQueue(); mReceiverPtr = nativeInit(new WeakReference<DisplayEventReceiver>(this), mMessageQueue, - vsyncSource); + vsyncSource, configChanged); mCloseGuard.open("dispose"); } diff --git a/core/jni/android_view_DisplayEventReceiver.cpp b/core/jni/android_view_DisplayEventReceiver.cpp index 8d702d11d8fe..ba538a855f81 100644 --- a/core/jni/android_view_DisplayEventReceiver.cpp +++ b/core/jni/android_view_DisplayEventReceiver.cpp @@ -48,7 +48,8 @@ static struct { class NativeDisplayEventReceiver : public DisplayEventDispatcher { public: NativeDisplayEventReceiver(JNIEnv* env, - jobject receiverWeak, const sp<MessageQueue>& messageQueue, jint vsyncSource); + jobject receiverWeak, const sp<MessageQueue>& messageQueue, jint vsyncSource, + jint configChanged); void dispose(); @@ -68,9 +69,11 @@ private: NativeDisplayEventReceiver::NativeDisplayEventReceiver(JNIEnv* env, - jobject receiverWeak, const sp<MessageQueue>& messageQueue, jint vsyncSource) : + jobject receiverWeak, const sp<MessageQueue>& messageQueue, jint vsyncSource, + jint configChanged) : DisplayEventDispatcher(messageQueue->getLooper(), - static_cast<ISurfaceComposer::VsyncSource>(vsyncSource)), + static_cast<ISurfaceComposer::VsyncSource>(vsyncSource), + static_cast<ISurfaceComposer::ConfigChanged>(configChanged)), mReceiverWeakGlobal(env->NewGlobalRef(receiverWeak)), mMessageQueue(messageQueue) { ALOGV("receiver %p ~ Initializing display event receiver.", this); @@ -136,7 +139,7 @@ void NativeDisplayEventReceiver::dispatchConfigChanged(nsecs_t timestamp, static jlong nativeInit(JNIEnv* env, jclass clazz, jobject receiverWeak, - jobject messageQueueObj, jint vsyncSource) { + jobject messageQueueObj, jint vsyncSource, jint configChanged) { sp<MessageQueue> messageQueue = android_os_MessageQueue_getMessageQueue(env, messageQueueObj); if (messageQueue == NULL) { jniThrowRuntimeException(env, "MessageQueue is not initialized."); @@ -144,7 +147,7 @@ static jlong nativeInit(JNIEnv* env, jclass clazz, jobject receiverWeak, } sp<NativeDisplayEventReceiver> receiver = new NativeDisplayEventReceiver(env, - receiverWeak, messageQueue, vsyncSource); + receiverWeak, messageQueue, vsyncSource, configChanged); status_t status = receiver->initialize(); if (status) { String8 message; @@ -179,7 +182,7 @@ static void nativeScheduleVsync(JNIEnv* env, jclass clazz, jlong receiverPtr) { static const JNINativeMethod gMethods[] = { /* name, signature, funcPtr */ { "nativeInit", - "(Ljava/lang/ref/WeakReference;Landroid/os/MessageQueue;I)J", + "(Ljava/lang/ref/WeakReference;Landroid/os/MessageQueue;II)J", (void*)nativeInit }, { "nativeDispose", "(J)V", diff --git a/libs/androidfw/DisplayEventDispatcher.cpp b/libs/androidfw/DisplayEventDispatcher.cpp index 660614895603..d8a3f42690f4 100644 --- a/libs/androidfw/DisplayEventDispatcher.cpp +++ b/libs/androidfw/DisplayEventDispatcher.cpp @@ -34,8 +34,9 @@ namespace android { static const size_t EVENT_BUFFER_SIZE = 100; DisplayEventDispatcher::DisplayEventDispatcher(const sp<Looper>& looper, - ISurfaceComposer::VsyncSource vsyncSource) : - mLooper(looper), mReceiver(vsyncSource), mWaitingForVsync(false) { + ISurfaceComposer::VsyncSource vsyncSource, + ISurfaceComposer::ConfigChanged configChanged) : + mLooper(looper), mReceiver(vsyncSource, configChanged), mWaitingForVsync(false) { ALOGV("dispatcher %p ~ Initializing display event dispatcher.", this); } diff --git a/libs/androidfw/include/androidfw/DisplayEventDispatcher.h b/libs/androidfw/include/androidfw/DisplayEventDispatcher.h index 5381c0174cb0..8bc25202b3ab 100644 --- a/libs/androidfw/include/androidfw/DisplayEventDispatcher.h +++ b/libs/androidfw/include/androidfw/DisplayEventDispatcher.h @@ -23,7 +23,8 @@ namespace android { class DisplayEventDispatcher : public LooperCallback { public: explicit DisplayEventDispatcher(const sp<Looper>& looper, - ISurfaceComposer::VsyncSource vsyncSource = ISurfaceComposer::eVsyncSourceApp); + ISurfaceComposer::VsyncSource vsyncSource = ISurfaceComposer::eVsyncSourceApp, + ISurfaceComposer::ConfigChanged configChanged = ISurfaceComposer::eConfigChangedSuppress); status_t initialize(); void dispose(); diff --git a/libs/hwui/renderthread/RenderThread.cpp b/libs/hwui/renderthread/RenderThread.cpp index 41cb8fdc66bd..71c5b53f727a 100644 --- a/libs/hwui/renderthread/RenderThread.cpp +++ b/libs/hwui/renderthread/RenderThread.cpp @@ -156,7 +156,9 @@ void RenderThread::initializeDisplayEventReceiver() { LOG_ALWAYS_FATAL_IF(mVsyncSource, "Initializing a second DisplayEventReceiver?"); if (!Properties::isolatedProcess) { - auto receiver = std::make_unique<DisplayEventReceiver>(); + auto receiver = std::make_unique<DisplayEventReceiver>( + ISurfaceComposer::eVsyncSourceApp, + ISurfaceComposer::eConfigChangedDispatch); status_t status = receiver->initCheck(); LOG_ALWAYS_FATAL_IF(status != NO_ERROR, "Initialization of DisplayEventReceiver " diff --git a/services/core/java/com/android/server/display/LocalDisplayAdapter.java b/services/core/java/com/android/server/display/LocalDisplayAdapter.java index 85fbdf6d0182..b03dc3b2ae93 100644 --- a/services/core/java/com/android/server/display/LocalDisplayAdapter.java +++ b/services/core/java/com/android/server/display/LocalDisplayAdapter.java @@ -856,7 +856,7 @@ final class LocalDisplayAdapter extends DisplayAdapter { private final class PhysicalDisplayEventReceiver extends DisplayEventReceiver { PhysicalDisplayEventReceiver(Looper looper) { - super(looper, VSYNC_SOURCE_APP); + super(looper, VSYNC_SOURCE_APP, CONFIG_CHANGED_EVENT_DISPATCH); } @Override |