summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorChristian Strømme <christian.stromme@digia.com>2014-05-08 11:06:32 +0200
committerChristian Stromme <christian.stromme@digia.com>2014-05-09 12:08:56 +0300
commit50602d270ba701d524462f21256a23761146ca65 (patch)
tree78a8468c78e06f4e75c56f7ca3803d7a83e3d98e /src
parent5b14eac6bfb70867c6b97f3dcec3841b856061ee (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.pro8
-rw-r--r--src/doppelganger/main.cpp2
-rw-r--r--src/doppelganger/powermanager.cpp88
-rw-r--r--src/doppelganger/powermanager.h62
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