[HWUI] Use ANativeWindow inteception methods in ReliableSurface

Test: boots
Test: manually test with opening and scrolling through settings app
Change-Id: I8d7a44d3ead0b2350318e1514153e256f97ccca5
diff --git a/libs/hwui/renderthread/ReliableSurface.h b/libs/hwui/renderthread/ReliableSurface.h
index f768df3..a823d9d 100644
--- a/libs/hwui/renderthread/ReliableSurface.h
+++ b/libs/hwui/renderthread/ReliableSurface.h
@@ -16,6 +16,7 @@
 
 #pragma once
 
+#include <apex/window.h>
 #include <gui/Surface.h>
 #include <utils/Macros.h>
 #include <utils/StrongPointer.h>
@@ -24,13 +25,20 @@
 
 namespace android::uirenderer::renderthread {
 
-class ReliableSurface : public ANativeObjectBase<ANativeWindow, ReliableSurface, RefBase> {
+class ReliableSurface {
     PREVENT_COPY_AND_ASSIGN(ReliableSurface);
 
 public:
     ReliableSurface(sp<Surface>&& surface);
     ~ReliableSurface();
 
+    // Performs initialization that is not safe to do in the constructor.
+    // For instance, registering ANativeWindow interceptors with ReliableSurface
+    // passed as the data pointer is not safe.
+    void init();
+
+    ANativeWindow* getNativeWindow() { return mSurface.get(); }
+
     int reserveNext();
 
     void allocateBuffers() { mSurface->allocateBuffers(); }
@@ -61,7 +69,7 @@
     }
 
 private:
-    const sp<Surface> mSurface;
+    sp<Surface> mSurface;
 
     mutable std::mutex mMutex;
 
@@ -78,27 +86,20 @@
     ANativeWindowBuffer* acquireFallbackBuffer(int error);
     void clearReservedBuffer();
 
-    void perform(int operation, va_list args);
-    int cancelBuffer(ANativeWindowBuffer* buffer, int fenceFd);
-    int dequeueBuffer(ANativeWindowBuffer** buffer, int* fenceFd);
-    int queueBuffer(ANativeWindowBuffer* buffer, int fenceFd);
+    // ANativeWindow hooks. When an ANativeWindow_* method is called on the
+    // underlying ANativeWindow, these methods will intercept the original call.
+    // For example, an EGL driver would call into these hooks instead of the
+    // original methods.
+    static int hook_cancelBuffer(ANativeWindow* window, ANativeWindow_cancelBufferFn cancelBuffer,
+                                 void* data, ANativeWindowBuffer* buffer, int fenceFd);
+    static int hook_dequeueBuffer(ANativeWindow* window,
+                                  ANativeWindow_dequeueBufferFn dequeueBuffer, void* data,
+                                  ANativeWindowBuffer** buffer, int* fenceFd);
+    static int hook_queueBuffer(ANativeWindow* window, ANativeWindow_queueBufferFn queueBuffer,
+                                void* data, ANativeWindowBuffer* buffer, int fenceFd);
 
-    static Surface* getWrapped(const ANativeWindow*);
-
-    // ANativeWindow hooks
-    static int hook_cancelBuffer(ANativeWindow* window, ANativeWindowBuffer* buffer, int fenceFd);
-    static int hook_dequeueBuffer(ANativeWindow* window, ANativeWindowBuffer** buffer,
-                                  int* fenceFd);
-    static int hook_queueBuffer(ANativeWindow* window, ANativeWindowBuffer* buffer, int fenceFd);
-
-    static int hook_perform(ANativeWindow* window, int operation, ...);
-    static int hook_query(const ANativeWindow* window, int what, int* value);
-    static int hook_setSwapInterval(ANativeWindow* window, int interval);
-
-    static int hook_cancelBuffer_DEPRECATED(ANativeWindow* window, ANativeWindowBuffer* buffer);
-    static int hook_dequeueBuffer_DEPRECATED(ANativeWindow* window, ANativeWindowBuffer** buffer);
-    static int hook_lockBuffer_DEPRECATED(ANativeWindow* window, ANativeWindowBuffer* buffer);
-    static int hook_queueBuffer_DEPRECATED(ANativeWindow* window, ANativeWindowBuffer* buffer);
+    static int hook_perform(ANativeWindow* window, ANativeWindow_performFn perform, void* data,
+                            int operation, va_list args);
 };
 
 };  // namespace android::uirenderer::renderthread