100fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown/* 200fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown * Copyright (C) 2010 The Android Open Source Project 300fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown * 400fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown * Licensed under the Apache License, Version 2.0 (the "License"); 500fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown * you may not use this file except in compliance with the License. 600fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown * You may obtain a copy of the License at 700fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown * 800fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown * http://www.apache.org/licenses/LICENSE-2.0 900fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown * 1000fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown * Unless required by applicable law or agreed to in writing, software 1100fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown * distributed under the License is distributed on an "AS IS" BASIS, 1200fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1300fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown * See the License for the specific language governing permissions and 1400fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown * limitations under the License. 1500fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown */ 1600fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown 1700fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown#define LOG_TAG "PowerManagerService-JNI" 1800fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown 1900fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown//#define LOG_NDEBUG 0 2000fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown 2100fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown#include "JNIHelp.h" 2200fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown#include "jni.h" 23b08a1af667b16cb1faaea2aec1cf2a0e4659cb3fJoe Onorato 2400fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown#include <limits.h> 25b08a1af667b16cb1faaea2aec1cf2a0e4659cb3fJoe Onorato 2600fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown#include <android_runtime/AndroidRuntime.h> 278335f1ccccedb6655d96d9d5b697a7f0938235ddMathias Agopian#include <gui/ISurfaceComposer.h> 287304c343821309dd15f769b18f1de2fa43751573Jeff Brown#include <utils/Timers.h> 297304c343821309dd15f769b18f1de2fa43751573Jeff Brown#include <utils/misc.h> 307304c343821309dd15f769b18f1de2fa43751573Jeff Brown#include <utils/String8.h> 317304c343821309dd15f769b18f1de2fa43751573Jeff Brown#include <hardware/power.h> 327304c343821309dd15f769b18f1de2fa43751573Jeff Brown#include <hardware_legacy/power.h> 337304c343821309dd15f769b18f1de2fa43751573Jeff Brown#include <cutils/android_reboot.h> 347304c343821309dd15f769b18f1de2fa43751573Jeff Brown#include <suspend/autosuspend.h> 35b08a1af667b16cb1faaea2aec1cf2a0e4659cb3fJoe Onorato 363f15700a012b1ab0097eaf90caf0540ba6caa529Mathias Agopian#include <private/gui/ComposerService.h> 373f15700a012b1ab0097eaf90caf0540ba6caa529Mathias Agopian 3800fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown#include "com_android_server_PowerManagerService.h" 3900fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown 4000fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brownnamespace android { 4100fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown 4200fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown// ---------------------------------------------------------------------------- 4300fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown 4400fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brownstatic struct { 4500fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown jmethodID goToSleep; 4600fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown jmethodID userActivity; 4700fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown} gPowerManagerServiceClassInfo; 4800fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown 4900fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown// ---------------------------------------------------------------------------- 5000fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown 5100fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brownstatic jobject gPowerManagerServiceObj; 527304c343821309dd15f769b18f1de2fa43751573Jeff Brownstatic struct power_module* gPowerModule; 5300fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown 5400fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brownstatic Mutex gPowerManagerLock; 5500fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brownstatic bool gScreenOn; 5600fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brownstatic bool gScreenBright; 5700fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown 5890291577a08f582e0978651f55dd950f40eb111dJeff Brownstatic nsecs_t gLastEventTime[POWER_MANAGER_LAST_EVENT + 1]; 5990291577a08f582e0978651f55dd950f40eb111dJeff Brown 6090291577a08f582e0978651f55dd950f40eb111dJeff Brown// Throttling interval for user activity calls. 6190291577a08f582e0978651f55dd950f40eb111dJeff Brownstatic const nsecs_t MIN_TIME_BETWEEN_USERACTIVITIES = 500 * 1000000L; // 500ms 6290291577a08f582e0978651f55dd950f40eb111dJeff Brown 6300fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown// ---------------------------------------------------------------------------- 6400fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown 6500fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brownstatic bool checkAndClearExceptionFromCallback(JNIEnv* env, const char* methodName) { 6600fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown if (env->ExceptionCheck()) { 673762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("An exception was thrown by callback '%s'.", methodName); 6800fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown LOGE_EX(env); 6900fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown env->ExceptionClear(); 7000fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown return true; 7100fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown } 7200fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown return false; 7300fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown} 7400fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown 7500fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brownbool android_server_PowerManagerService_isScreenOn() { 7600fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown AutoMutex _l(gPowerManagerLock); 7700fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown return gScreenOn; 7800fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown} 7900fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown 8000fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brownbool android_server_PowerManagerService_isScreenBright() { 8100fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown AutoMutex _l(gPowerManagerLock); 8200fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown return gScreenBright; 8300fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown} 8400fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown 8500fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brownvoid android_server_PowerManagerService_userActivity(nsecs_t eventTime, int32_t eventType) { 86d232afa003689d87b637cb4525aae9a6af426700Jeff Brown // Tell the power HAL when user activity occurs. 87d232afa003689d87b637cb4525aae9a6af426700Jeff Brown if (gPowerModule && gPowerModule->powerHint) { 88d232afa003689d87b637cb4525aae9a6af426700Jeff Brown gPowerModule->powerHint(gPowerModule, POWER_HINT_INTERACTION, NULL); 8930e5eb4826a2b6880fb8ef3844206cc5ffd13ed9Jeff Brown } 9030e5eb4826a2b6880fb8ef3844206cc5ffd13ed9Jeff Brown 9100fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown if (gPowerManagerServiceObj) { 9290291577a08f582e0978651f55dd950f40eb111dJeff Brown // Throttle calls into user activity by event type. 9390291577a08f582e0978651f55dd950f40eb111dJeff Brown // We're a little conservative about argument checking here in case the caller 9490291577a08f582e0978651f55dd950f40eb111dJeff Brown // passes in bad data which could corrupt system state. 9590291577a08f582e0978651f55dd950f40eb111dJeff Brown if (eventType >= 0 && eventType <= POWER_MANAGER_LAST_EVENT) { 9690291577a08f582e0978651f55dd950f40eb111dJeff Brown nsecs_t now = systemTime(SYSTEM_TIME_MONOTONIC); 9790291577a08f582e0978651f55dd950f40eb111dJeff Brown if (eventTime > now) { 9890291577a08f582e0978651f55dd950f40eb111dJeff Brown eventTime = now; 9990291577a08f582e0978651f55dd950f40eb111dJeff Brown } 10090291577a08f582e0978651f55dd950f40eb111dJeff Brown 10190291577a08f582e0978651f55dd950f40eb111dJeff Brown if (gLastEventTime[eventType] + MIN_TIME_BETWEEN_USERACTIVITIES > eventTime) { 10290291577a08f582e0978651f55dd950f40eb111dJeff Brown return; 10390291577a08f582e0978651f55dd950f40eb111dJeff Brown } 10490291577a08f582e0978651f55dd950f40eb111dJeff Brown gLastEventTime[eventType] = eventTime; 10590291577a08f582e0978651f55dd950f40eb111dJeff Brown } 10690291577a08f582e0978651f55dd950f40eb111dJeff Brown 10700fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown JNIEnv* env = AndroidRuntime::getJNIEnv(); 10800fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown 10900fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown env->CallVoidMethod(gPowerManagerServiceObj, gPowerManagerServiceClassInfo.userActivity, 11000fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown nanoseconds_to_milliseconds(eventTime), false, eventType, false); 11100fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown checkAndClearExceptionFromCallback(env, "userActivity"); 11200fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown } 11300fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown} 11400fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown 11500fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brownvoid android_server_PowerManagerService_goToSleep(nsecs_t eventTime) { 11600fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown if (gPowerManagerServiceObj) { 11700fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown JNIEnv* env = AndroidRuntime::getJNIEnv(); 11800fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown 11900fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown env->CallVoidMethod(gPowerManagerServiceObj, gPowerManagerServiceClassInfo.goToSleep, 12000fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown nanoseconds_to_milliseconds(eventTime)); 12100fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown checkAndClearExceptionFromCallback(env, "goToSleep"); 12200fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown } 12300fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown} 12400fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown 12500fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown// ---------------------------------------------------------------------------- 12600fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown 1277304c343821309dd15f769b18f1de2fa43751573Jeff Brownstatic void nativeInit(JNIEnv* env, jobject obj) { 12800fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown gPowerManagerServiceObj = env->NewGlobalRef(obj); 1297304c343821309dd15f769b18f1de2fa43751573Jeff Brown 1307304c343821309dd15f769b18f1de2fa43751573Jeff Brown status_t err = hw_get_module(POWER_HARDWARE_MODULE_ID, 1317304c343821309dd15f769b18f1de2fa43751573Jeff Brown (hw_module_t const**)&gPowerModule); 132d232afa003689d87b637cb4525aae9a6af426700Jeff Brown if (!err) { 133d232afa003689d87b637cb4525aae9a6af426700Jeff Brown gPowerModule->init(gPowerModule); 134d232afa003689d87b637cb4525aae9a6af426700Jeff Brown } else { 135d232afa003689d87b637cb4525aae9a6af426700Jeff Brown ALOGE("Couldn't load %s module (%s)", POWER_HARDWARE_MODULE_ID, strerror(-err)); 1367304c343821309dd15f769b18f1de2fa43751573Jeff Brown } 13700fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown} 13800fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown 1397304c343821309dd15f769b18f1de2fa43751573Jeff Brownstatic void nativeSetPowerState(JNIEnv* env, 14000fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown jobject serviceObj, jboolean screenOn, jboolean screenBright) { 14100fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown AutoMutex _l(gPowerManagerLock); 14200fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown gScreenOn = screenOn; 14300fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown gScreenBright = screenBright; 14400fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown} 14500fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown 1467304c343821309dd15f769b18f1de2fa43751573Jeff Brownstatic void nativeStartSurfaceFlingerAnimation(JNIEnv* env, 147609695dab0f0318459d32ff5dfc529d7398e751bJoe Onorato jobject obj, jint mode) { 148b08a1af667b16cb1faaea2aec1cf2a0e4659cb3fJoe Onorato sp<ISurfaceComposer> s(ComposerService::getComposerService()); 149609695dab0f0318459d32ff5dfc529d7398e751bJoe Onorato s->turnElectronBeamOff(mode); 150b08a1af667b16cb1faaea2aec1cf2a0e4659cb3fJoe Onorato} 151b08a1af667b16cb1faaea2aec1cf2a0e4659cb3fJoe Onorato 1527304c343821309dd15f769b18f1de2fa43751573Jeff Brownstatic void nativeAcquireWakeLock(JNIEnv *env, jobject clazz, jint lock, jstring idObj) { 1537304c343821309dd15f769b18f1de2fa43751573Jeff Brown if (idObj == NULL) { 1547304c343821309dd15f769b18f1de2fa43751573Jeff Brown jniThrowNullPointerException(env, "id is null"); 1557304c343821309dd15f769b18f1de2fa43751573Jeff Brown return; 1567304c343821309dd15f769b18f1de2fa43751573Jeff Brown } 1577304c343821309dd15f769b18f1de2fa43751573Jeff Brown 1587304c343821309dd15f769b18f1de2fa43751573Jeff Brown const char *id = env->GetStringUTFChars(idObj, NULL); 1597304c343821309dd15f769b18f1de2fa43751573Jeff Brown 1607304c343821309dd15f769b18f1de2fa43751573Jeff Brown acquire_wake_lock(lock, id); 1617304c343821309dd15f769b18f1de2fa43751573Jeff Brown 1627304c343821309dd15f769b18f1de2fa43751573Jeff Brown env->ReleaseStringUTFChars(idObj, id); 1637304c343821309dd15f769b18f1de2fa43751573Jeff Brown} 1647304c343821309dd15f769b18f1de2fa43751573Jeff Brown 1657304c343821309dd15f769b18f1de2fa43751573Jeff Brownstatic void nativeReleaseWakeLock(JNIEnv *env, jobject clazz, jstring idObj) { 1667304c343821309dd15f769b18f1de2fa43751573Jeff Brown if (idObj == NULL) { 1677304c343821309dd15f769b18f1de2fa43751573Jeff Brown jniThrowNullPointerException(env, "id is null"); 1687304c343821309dd15f769b18f1de2fa43751573Jeff Brown return ; 1697304c343821309dd15f769b18f1de2fa43751573Jeff Brown } 1707304c343821309dd15f769b18f1de2fa43751573Jeff Brown 1717304c343821309dd15f769b18f1de2fa43751573Jeff Brown const char *id = env->GetStringUTFChars(idObj, NULL); 1727304c343821309dd15f769b18f1de2fa43751573Jeff Brown 1737304c343821309dd15f769b18f1de2fa43751573Jeff Brown release_wake_lock(id); 1747304c343821309dd15f769b18f1de2fa43751573Jeff Brown 1757304c343821309dd15f769b18f1de2fa43751573Jeff Brown env->ReleaseStringUTFChars(idObj, id); 1767304c343821309dd15f769b18f1de2fa43751573Jeff Brown 1777304c343821309dd15f769b18f1de2fa43751573Jeff Brown} 1787304c343821309dd15f769b18f1de2fa43751573Jeff Brown 1797304c343821309dd15f769b18f1de2fa43751573Jeff Brownstatic int nativeSetScreenState(JNIEnv *env, jobject clazz, jboolean on) { 1807304c343821309dd15f769b18f1de2fa43751573Jeff Brown if (on) { 1817304c343821309dd15f769b18f1de2fa43751573Jeff Brown autosuspend_disable(); 1827304c343821309dd15f769b18f1de2fa43751573Jeff Brown if (gPowerModule) { 1837304c343821309dd15f769b18f1de2fa43751573Jeff Brown gPowerModule->setInteractive(gPowerModule, true); 1847304c343821309dd15f769b18f1de2fa43751573Jeff Brown } 1857304c343821309dd15f769b18f1de2fa43751573Jeff Brown } else { 1867304c343821309dd15f769b18f1de2fa43751573Jeff Brown if (gPowerModule) { 1877304c343821309dd15f769b18f1de2fa43751573Jeff Brown gPowerModule->setInteractive(gPowerModule, false); 1887304c343821309dd15f769b18f1de2fa43751573Jeff Brown } 1897304c343821309dd15f769b18f1de2fa43751573Jeff Brown autosuspend_enable(); 1907304c343821309dd15f769b18f1de2fa43751573Jeff Brown } 1917304c343821309dd15f769b18f1de2fa43751573Jeff Brown 1927304c343821309dd15f769b18f1de2fa43751573Jeff Brown return 0; 1937304c343821309dd15f769b18f1de2fa43751573Jeff Brown} 1947304c343821309dd15f769b18f1de2fa43751573Jeff Brown 1957304c343821309dd15f769b18f1de2fa43751573Jeff Brownstatic void nativeShutdown(JNIEnv *env, jobject clazz) { 1967304c343821309dd15f769b18f1de2fa43751573Jeff Brown android_reboot(ANDROID_RB_POWEROFF, 0, 0); 1977304c343821309dd15f769b18f1de2fa43751573Jeff Brown} 1987304c343821309dd15f769b18f1de2fa43751573Jeff Brown 1997304c343821309dd15f769b18f1de2fa43751573Jeff Brownstatic void nativeReboot(JNIEnv *env, jobject clazz, jstring reason) { 2007304c343821309dd15f769b18f1de2fa43751573Jeff Brown if (reason == NULL) { 2017304c343821309dd15f769b18f1de2fa43751573Jeff Brown android_reboot(ANDROID_RB_RESTART, 0, 0); 2027304c343821309dd15f769b18f1de2fa43751573Jeff Brown } else { 2037304c343821309dd15f769b18f1de2fa43751573Jeff Brown const char *chars = env->GetStringUTFChars(reason, NULL); 2047304c343821309dd15f769b18f1de2fa43751573Jeff Brown android_reboot(ANDROID_RB_RESTART2, 0, (char *) chars); 2057304c343821309dd15f769b18f1de2fa43751573Jeff Brown env->ReleaseStringUTFChars(reason, chars); // In case it fails. 2067304c343821309dd15f769b18f1de2fa43751573Jeff Brown } 2077304c343821309dd15f769b18f1de2fa43751573Jeff Brown jniThrowIOException(env, errno); 2087304c343821309dd15f769b18f1de2fa43751573Jeff Brown} 2097304c343821309dd15f769b18f1de2fa43751573Jeff Brown 2107304c343821309dd15f769b18f1de2fa43751573Jeff Brown 21100fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown// ---------------------------------------------------------------------------- 21200fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown 21300fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brownstatic JNINativeMethod gPowerManagerServiceMethods[] = { 21400fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown /* name, signature, funcPtr */ 21500fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown { "nativeInit", "()V", 2167304c343821309dd15f769b18f1de2fa43751573Jeff Brown (void*) nativeInit }, 21700fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown { "nativeSetPowerState", "(ZZ)V", 2187304c343821309dd15f769b18f1de2fa43751573Jeff Brown (void*) nativeSetPowerState }, 219609695dab0f0318459d32ff5dfc529d7398e751bJoe Onorato { "nativeStartSurfaceFlingerAnimation", "(I)V", 2207304c343821309dd15f769b18f1de2fa43751573Jeff Brown (void*) nativeStartSurfaceFlingerAnimation }, 2217304c343821309dd15f769b18f1de2fa43751573Jeff Brown { "nativeAcquireWakeLock", "(ILjava/lang/String;)V", 2227304c343821309dd15f769b18f1de2fa43751573Jeff Brown (void*) nativeAcquireWakeLock }, 2237304c343821309dd15f769b18f1de2fa43751573Jeff Brown { "nativeReleaseWakeLock", "(Ljava/lang/String;)V", 2247304c343821309dd15f769b18f1de2fa43751573Jeff Brown (void*) nativeReleaseWakeLock }, 2257304c343821309dd15f769b18f1de2fa43751573Jeff Brown { "nativeSetScreenState", "(Z)I", 2267304c343821309dd15f769b18f1de2fa43751573Jeff Brown (void*) nativeSetScreenState }, 2277304c343821309dd15f769b18f1de2fa43751573Jeff Brown { "nativeShutdown", "()V", 2287304c343821309dd15f769b18f1de2fa43751573Jeff Brown (void*) nativeShutdown }, 2297304c343821309dd15f769b18f1de2fa43751573Jeff Brown { "nativeReboot", "(Ljava/lang/String;)V", 2307304c343821309dd15f769b18f1de2fa43751573Jeff Brown (void*) nativeReboot }, 23100fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown}; 23200fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown 23300fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown#define FIND_CLASS(var, className) \ 23400fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown var = env->FindClass(className); \ 23517cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro LOG_FATAL_IF(! var, "Unable to find class " className); 23600fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown 23700fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown#define GET_METHOD_ID(var, clazz, methodName, methodDescriptor) \ 23800fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown var = env->GetMethodID(clazz, methodName, methodDescriptor); \ 23900fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown LOG_FATAL_IF(! var, "Unable to find method " methodName); 24000fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown 24100fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown#define GET_FIELD_ID(var, clazz, fieldName, fieldDescriptor) \ 24200fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown var = env->GetFieldID(clazz, fieldName, fieldDescriptor); \ 24300fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown LOG_FATAL_IF(! var, "Unable to find field " fieldName); 24400fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown 24500fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brownint register_android_server_PowerManagerService(JNIEnv* env) { 24600fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown int res = jniRegisterNativeMethods(env, "com/android/server/PowerManagerService", 24700fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown gPowerManagerServiceMethods, NELEM(gPowerManagerServiceMethods)); 24800fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown LOG_FATAL_IF(res < 0, "Unable to register native methods."); 24900fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown 25000fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown // Callbacks 25100fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown 25217cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro jclass clazz; 25317cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro FIND_CLASS(clazz, "com/android/server/PowerManagerService"); 25400fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown 25517cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro GET_METHOD_ID(gPowerManagerServiceClassInfo.goToSleep, clazz, 25600fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown "goToSleep", "(J)V"); 25700fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown 25817cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro GET_METHOD_ID(gPowerManagerServiceClassInfo.userActivity, clazz, 25900fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown "userActivity", "(JZIZ)V"); 26000fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown 26190291577a08f582e0978651f55dd950f40eb111dJeff Brown // Initialize 26290291577a08f582e0978651f55dd950f40eb111dJeff Brown for (int i = 0; i < POWER_MANAGER_LAST_EVENT; i++) { 26390291577a08f582e0978651f55dd950f40eb111dJeff Brown gLastEventTime[i] = LLONG_MIN; 26490291577a08f582e0978651f55dd950f40eb111dJeff Brown } 26590291577a08f582e0978651f55dd950f40eb111dJeff Brown gScreenOn = true; 26690291577a08f582e0978651f55dd950f40eb111dJeff Brown gScreenBright = true; 26730e5eb4826a2b6880fb8ef3844206cc5ffd13ed9Jeff Brown gPowerManagerServiceObj = NULL; 26830e5eb4826a2b6880fb8ef3844206cc5ffd13ed9Jeff Brown gPowerModule = NULL; 26900fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown return 0; 27000fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown} 27100fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown 27200fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown} /* namespace android */ 273