Hold a weak reference to PointerController when handling vsync am: 33c5903e77 am: 8728a2fe53

am: 23bb30843c

Change-Id: Ifccc705f9b21fb8c24fd7fc83f99d9c58ac85b5c
This commit is contained in:
Vladislav Kaznacheev
2016-09-13 23:11:41 +00:00
committed by android-build-merger
2 changed files with 26 additions and 1 deletions

View File

@@ -36,6 +36,29 @@
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 ---
// 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) :
mPolicy(policy), mLooper(looper), mSpriteController(spriteController) {
mHandler = new WeakMessageHandler(this);
mCallback = new WeakLooperCallback(this);
if (mDisplayEventReceiver.initCheck() == NO_ERROR) {
mLooper->addFd(mDisplayEventReceiver.getFd(), Looper::POLL_CALLBACK,
Looper::EVENT_INPUT, this, nullptr);
Looper::EVENT_INPUT, mCallback, nullptr);
} else {
ALOGE("Failed to initialize DisplayEventReceiver.");
}

View File

@@ -144,6 +144,7 @@ private:
sp<Looper> mLooper;
sp<SpriteController> mSpriteController;
sp<WeakMessageHandler> mHandler;
sp<LooperCallback> mCallback;
DisplayEventReceiver mDisplayEventReceiver;