Hold a weak reference to PointerController when handling vsync am: 33c5903e77
am: 8728a2fe53
Change-Id: Id131b973188298718a6f5423373af5bf54c8b18f
This commit is contained in:
@@ -36,6 +36,29 @@
|
|||||||
|
|
||||||
namespace android {
|
namespace android {
|
||||||
|
|
||||||
|
// --- WeakLooperCallback ---
|
||||||
|
|
||||||
|
class WeakLooperCallback: public LooperCallback {
|
||||||
|
protected:
|
||||||
|
virtual ~WeakLooperCallback() { }
|
||||||
|
|
||||||
|
public:
|
||||||
|
WeakLooperCallback(const wp<LooperCallback>& callback) :
|
||||||
|
mCallback(callback) {
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual int handleEvent(int fd, int events, void* data) {
|
||||||
|
sp<LooperCallback> callback = mCallback.promote();
|
||||||
|
if (callback != NULL) {
|
||||||
|
return callback->handleEvent(fd, events, data);
|
||||||
|
}
|
||||||
|
return 0; // the client is gone, remove the callback
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
wp<LooperCallback> mCallback;
|
||||||
|
};
|
||||||
|
|
||||||
// --- PointerController ---
|
// --- PointerController ---
|
||||||
|
|
||||||
// Time to wait before starting the fade when the pointer is inactive.
|
// Time to wait before starting the fade when the pointer is inactive.
|
||||||
@@ -57,10 +80,11 @@ PointerController::PointerController(const sp<PointerControllerPolicyInterface>&
|
|||||||
const sp<Looper>& looper, const sp<SpriteController>& spriteController) :
|
const sp<Looper>& looper, const sp<SpriteController>& spriteController) :
|
||||||
mPolicy(policy), mLooper(looper), mSpriteController(spriteController) {
|
mPolicy(policy), mLooper(looper), mSpriteController(spriteController) {
|
||||||
mHandler = new WeakMessageHandler(this);
|
mHandler = new WeakMessageHandler(this);
|
||||||
|
mCallback = new WeakLooperCallback(this);
|
||||||
|
|
||||||
if (mDisplayEventReceiver.initCheck() == NO_ERROR) {
|
if (mDisplayEventReceiver.initCheck() == NO_ERROR) {
|
||||||
mLooper->addFd(mDisplayEventReceiver.getFd(), Looper::POLL_CALLBACK,
|
mLooper->addFd(mDisplayEventReceiver.getFd(), Looper::POLL_CALLBACK,
|
||||||
Looper::EVENT_INPUT, this, nullptr);
|
Looper::EVENT_INPUT, mCallback, nullptr);
|
||||||
} else {
|
} else {
|
||||||
ALOGE("Failed to initialize DisplayEventReceiver.");
|
ALOGE("Failed to initialize DisplayEventReceiver.");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -144,6 +144,7 @@ private:
|
|||||||
sp<Looper> mLooper;
|
sp<Looper> mLooper;
|
||||||
sp<SpriteController> mSpriteController;
|
sp<SpriteController> mSpriteController;
|
||||||
sp<WeakMessageHandler> mHandler;
|
sp<WeakMessageHandler> mHandler;
|
||||||
|
sp<LooperCallback> mCallback;
|
||||||
|
|
||||||
DisplayEventReceiver mDisplayEventReceiver;
|
DisplayEventReceiver mDisplayEventReceiver;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user