diff options
author | Christian Strømme <christian.stromme@digia.com> | 2014-05-08 11:06:32 +0200 |
---|---|---|
committer | Christian Stromme <christian.stromme@digia.com> | 2014-05-09 12:08:56 +0300 |
commit | 50602d270ba701d524462f21256a23761146ca65 (patch) | |
tree | 78a8468c78e06f4e75c56f7ca3803d7a83e3d98e /src | |
parent | 5b14eac6bfb70867c6b97f3dcec3841b856061ee (diff) |
Add PowerManager service.
On Android 4.4 we need to respond to wake-lock requests to prevent
StageFrigh from committing suicide.
Change-Id: Ie2c261c0c1b962a63ba8516fefaac71a0ec3a54e
Reviewed-by: Eirik Aavitsland <eirik.aavitsland@digia.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/doppelganger/doppelganger.pro | 8 | ||||
-rw-r--r-- | src/doppelganger/main.cpp | 2 | ||||
-rw-r--r-- | src/doppelganger/powermanager.cpp | 88 | ||||
-rw-r--r-- | src/doppelganger/powermanager.h | 62 |
4 files changed, 157 insertions, 3 deletions
diff --git a/src/doppelganger/doppelganger.pro b/src/doppelganger/doppelganger.pro index fc337df..40c7650 100644 --- a/src/doppelganger/doppelganger.pro +++ b/src/doppelganger/doppelganger.pro @@ -3,16 +3,18 @@ QT -= core gui TARGET = doppelganger LIBS += -lutils -lbinder -lcutils \ - -L$${ANDROID_PRODUCT_OUT}/obj/STATIC_LIBRARIES/libscheduling_policy_intermediates -lscheduling_policy + -L$${ANDROID_PRODUCT_OUT}/obj/STATIC_LIBRARIES/libscheduling_policy_intermediates -lscheduling_policy -lpowermanager TEMPLATE = app SOURCES += main.cpp \ permissioncontroller.cpp \ - schedulingpolicyservice.cpp + schedulingpolicyservice.cpp \ + powermanager.cpp HEADERS += \ permissioncontroller.h \ - schedulingpolicyservice.h + schedulingpolicyservice.h \ + powermanager.h load(qt_tool) diff --git a/src/doppelganger/main.cpp b/src/doppelganger/main.cpp index e4a06c8..6d81991 100644 --- a/src/doppelganger/main.cpp +++ b/src/doppelganger/main.cpp @@ -20,6 +20,7 @@ #include "permissioncontroller.h" #include "schedulingpolicyservice.h" +#include "powermanager.h" using namespace android; @@ -28,5 +29,6 @@ int main(int, char *[]) sp<ProcessState> proc(ProcessState::self()); SchedulingPolicyService::instantiate(); PermissionController::instantiate(); + PowerManager::instantiate(); IPCThreadState::self()->joinThreadPool(); } diff --git a/src/doppelganger/powermanager.cpp b/src/doppelganger/powermanager.cpp new file mode 100644 index 0000000..47ab02f --- /dev/null +++ b/src/doppelganger/powermanager.cpp @@ -0,0 +1,88 @@ +/**************************************************************************** +** +** Copyright (C) 2014 Digia Plc +** All rights reserved. +** For any questions to Digia, please use the contact form at +** http://qt.digia.com/ +** +** This file is part of Qt Enterprise Embedded. +** +** Licensees holding valid Qt Enterprise licenses may use this file in +** accordance with the Qt Enterprise License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. +** +** If you have questions regarding the use of this file, please use +** the contact form at http://qt.digia.com/ +** +****************************************************************************/ + +#include "powermanager.h" + +#include <binder/IServiceManager.h> + +using namespace android; + +enum { + ACQUIRE_WAKE_LOCK = IBinder::FIRST_CALL_TRANSACTION, + ACQUIRE_WAKE_LOCK_UID = IBinder::FIRST_CALL_TRANSACTION + 1, + RELEASE_WAKE_LOCK = IBinder::FIRST_CALL_TRANSACTION + 2, + UPDATE_WAKE_LOCK_UIDS = IBinder::FIRST_CALL_TRANSACTION + 3, +}; + +void PowerManager::instantiate() +{ + defaultServiceManager()->addService(String16("power"), new PowerManager()); +} + +status_t PowerManager::onTransact(uint32_t code, + const Parcel &, + Parcel *, + uint32_t) +{ + switch (code) { + case ACQUIRE_WAKE_LOCK: + case ACQUIRE_WAKE_LOCK_UID: + case RELEASE_WAKE_LOCK: + case UPDATE_WAKE_LOCK_UIDS: + return NO_ERROR; + default: + break; + } +} + +#if Q_ANDROID_VERSION_MAJOR > 4 || (Q_ANDROID_VERSION_MAJOR == 4 && Q_ANDROID_VERSION_MINOR >= 4) +status_t PowerManager::acquireWakeLock(int, + const sp<IBinder> &, + const String16 &, + const String16 &) +{ + return OK; +} + +status_t PowerManager::acquireWakeLockWithUid(int, + const sp<IBinder> &, + const String16 &, + const String16 &, + int) +{ + return OK; +} + +status_t PowerManager::updateWakeLockUids(const sp<IBinder> &, + int, + const int *) +{ + return OK; +} +#else // < 4.4 +status_t PowerManager::acquireWakeLock(int, const sp<android::IBinder> &, const String16 &) +{ + return OK; +} +#endif + +status_t PowerManager::releaseWakeLock(const sp<IBinder> &, int) +{ + return OK; +} diff --git a/src/doppelganger/powermanager.h b/src/doppelganger/powermanager.h new file mode 100644 index 0000000..f934b31 --- /dev/null +++ b/src/doppelganger/powermanager.h @@ -0,0 +1,62 @@ +/**************************************************************************** +** +** Copyright (C) 2014 Digia Plc +** All rights reserved. +** For any questions to Digia, please use the contact form at +** http://qt.digia.com/ +** +** This file is part of Qt Enterprise Embedded. +** +** Licensees holding valid Qt Enterprise licenses may use this file in +** accordance with the Qt Enterprise License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. +** +** If you have questions regarding the use of this file, please use +** the contact form at http://qt.digia.com/ +** +****************************************************************************/ + +#ifndef POWERMANAGER_H +#define POWERMANAGER_H + +#include <powermanager/IPowerManager.h> + +namespace android { + +typedef BnInterface<IPowerManager> BnPowerManagerService; + +} // namespace android + +class PowerManager : public android::BnPowerManagerService +{ +public: + static void instantiate(); + android::status_t onTransact(uint32_t code, + const android::Parcel &data, + android::Parcel *reply, + uint32_t flags); + +#if Q_ANDROID_VERSION_MAJOR > 4 || (Q_ANDROID_VERSION_MAJOR == 4 && Q_ANDROID_VERSION_MINOR >= 4) + virtual android::status_t acquireWakeLock(int flags, + const android::sp<android::IBinder>& lock, + const android::String16& tag, + const android::String16& packageName); + virtual android::status_t acquireWakeLockWithUid(int flags, + const android::sp<android::IBinder>& lock, + const android::String16& tag, + const android::String16& packageName, + int uid); + virtual android::status_t updateWakeLockUids(const android::sp<android::IBinder>& lock, + int len, + const int *uids); +#else // < 4.4 + virtual android::status_t acquireWakeLock(int flags, + const android::sp<android::IBinder>& lock, + const android::String16& tag); +#endif + + virtual android::status_t releaseWakeLock(const android::sp<android::IBinder>& lock, int flags); +}; + +#endif // POWERMANAGER_H |