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 249630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown#include <ScopedUtfChars.h> 259630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown 2600fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown#include <limits.h> 27b08a1af667b16cb1faaea2aec1cf2a0e4659cb3fJoe Onorato 2800fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown#include <android_runtime/AndroidRuntime.h> 297304c343821309dd15f769b18f1de2fa43751573Jeff Brown#include <utils/Timers.h> 307304c343821309dd15f769b18f1de2fa43751573Jeff Brown#include <utils/misc.h> 317304c343821309dd15f769b18f1de2fa43751573Jeff Brown#include <utils/String8.h> 329630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown#include <utils/Log.h> 337304c343821309dd15f769b18f1de2fa43751573Jeff Brown#include <hardware/power.h> 347304c343821309dd15f769b18f1de2fa43751573Jeff Brown#include <hardware_legacy/power.h> 357304c343821309dd15f769b18f1de2fa43751573Jeff Brown#include <cutils/android_reboot.h> 367304c343821309dd15f769b18f1de2fa43751573Jeff Brown#include <suspend/autosuspend.h> 37b08a1af667b16cb1faaea2aec1cf2a0e4659cb3fJoe Onorato 384f8ecd80296508a1dc69d3f3a23fd91e962c2784Jeff Brown#include "com_android_server_power_PowerManagerService.h" 3900fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown 4000fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brownnamespace android { 4100fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown 4200fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown// ---------------------------------------------------------------------------- 4300fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown 4400fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brownstatic struct { 459630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown jmethodID wakeUpFromNative; 469630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown jmethodID goToSleepFromNative; 479630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown jmethodID userActivityFromNative; 4800fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown} gPowerManagerServiceClassInfo; 4900fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown 5000fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown// ---------------------------------------------------------------------------- 5100fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown 5200fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brownstatic jobject gPowerManagerServiceObj; 537304c343821309dd15f769b18f1de2fa43751573Jeff Brownstatic struct power_module* gPowerModule; 5400fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown 5500fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brownstatic Mutex gPowerManagerLock; 5600fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brownstatic bool gScreenOn; 5700fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brownstatic bool gScreenBright; 5800fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown 59b696de5c10ebcc7bf42d8487fc0e56e0e937754dJeff Brownstatic nsecs_t gLastEventTime[USER_ACTIVITY_EVENT_LAST + 1]; 6090291577a08f582e0978651f55dd950f40eb111dJeff Brown 6190291577a08f582e0978651f55dd950f40eb111dJeff Brown// Throttling interval for user activity calls. 6290291577a08f582e0978651f55dd950f40eb111dJeff Brownstatic const nsecs_t MIN_TIME_BETWEEN_USERACTIVITIES = 500 * 1000000L; // 500ms 6390291577a08f582e0978651f55dd950f40eb111dJeff Brown 6400fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown// ---------------------------------------------------------------------------- 6500fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown 6600fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brownstatic bool checkAndClearExceptionFromCallback(JNIEnv* env, const char* methodName) { 6700fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown if (env->ExceptionCheck()) { 683762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("An exception was thrown by callback '%s'.", methodName); 6900fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown LOGE_EX(env); 7000fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown env->ExceptionClear(); 7100fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown return true; 7200fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown } 7300fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown return false; 7400fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown} 7500fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown 7600fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brownbool android_server_PowerManagerService_isScreenOn() { 7700fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown AutoMutex _l(gPowerManagerLock); 7800fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown return gScreenOn; 7900fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown} 8000fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown 8100fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brownbool android_server_PowerManagerService_isScreenBright() { 8200fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown AutoMutex _l(gPowerManagerLock); 8300fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown return gScreenBright; 8400fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown} 8500fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown 8600fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brownvoid android_server_PowerManagerService_userActivity(nsecs_t eventTime, int32_t eventType) { 87d232afa003689d87b637cb4525aae9a6af426700Jeff Brown // Tell the power HAL when user activity occurs. 88d232afa003689d87b637cb4525aae9a6af426700Jeff Brown if (gPowerModule && gPowerModule->powerHint) { 89d232afa003689d87b637cb4525aae9a6af426700Jeff Brown gPowerModule->powerHint(gPowerModule, POWER_HINT_INTERACTION, NULL); 9030e5eb4826a2b6880fb8ef3844206cc5ffd13ed9Jeff Brown } 9130e5eb4826a2b6880fb8ef3844206cc5ffd13ed9Jeff Brown 9200fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown if (gPowerManagerServiceObj) { 9390291577a08f582e0978651f55dd950f40eb111dJeff Brown // Throttle calls into user activity by event type. 9490291577a08f582e0978651f55dd950f40eb111dJeff Brown // We're a little conservative about argument checking here in case the caller 9590291577a08f582e0978651f55dd950f40eb111dJeff Brown // passes in bad data which could corrupt system state. 96b696de5c10ebcc7bf42d8487fc0e56e0e937754dJeff Brown if (eventType >= 0 && eventType <= USER_ACTIVITY_EVENT_LAST) { 9790291577a08f582e0978651f55dd950f40eb111dJeff Brown nsecs_t now = systemTime(SYSTEM_TIME_MONOTONIC); 9890291577a08f582e0978651f55dd950f40eb111dJeff Brown if (eventTime > now) { 9990291577a08f582e0978651f55dd950f40eb111dJeff Brown eventTime = now; 10090291577a08f582e0978651f55dd950f40eb111dJeff Brown } 10190291577a08f582e0978651f55dd950f40eb111dJeff Brown 10290291577a08f582e0978651f55dd950f40eb111dJeff Brown if (gLastEventTime[eventType] + MIN_TIME_BETWEEN_USERACTIVITIES > eventTime) { 10390291577a08f582e0978651f55dd950f40eb111dJeff Brown return; 10490291577a08f582e0978651f55dd950f40eb111dJeff Brown } 10590291577a08f582e0978651f55dd950f40eb111dJeff Brown gLastEventTime[eventType] = eventTime; 10690291577a08f582e0978651f55dd950f40eb111dJeff Brown } 10790291577a08f582e0978651f55dd950f40eb111dJeff Brown 10800fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown JNIEnv* env = AndroidRuntime::getJNIEnv(); 10900fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown 1109630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown env->CallVoidMethod(gPowerManagerServiceObj, 1119630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown gPowerManagerServiceClassInfo.userActivityFromNative, 1129630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown nanoseconds_to_milliseconds(eventTime), eventType, 0); 1139630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown checkAndClearExceptionFromCallback(env, "userActivityFromNative"); 11400fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown } 11500fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown} 11600fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown 1179630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brownvoid android_server_PowerManagerService_wakeUp(nsecs_t eventTime) { 11800fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown if (gPowerManagerServiceObj) { 11900fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown JNIEnv* env = AndroidRuntime::getJNIEnv(); 12000fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown 1219630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown env->CallVoidMethod(gPowerManagerServiceObj, 1229630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown gPowerManagerServiceClassInfo.wakeUpFromNative, 12300fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown nanoseconds_to_milliseconds(eventTime)); 1249630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown checkAndClearExceptionFromCallback(env, "wakeUpFromNative"); 1259630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown } 1269630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown} 1279630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown 1289630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brownvoid android_server_PowerManagerService_goToSleep(nsecs_t eventTime) { 1299630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown if (gPowerManagerServiceObj) { 1309630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown JNIEnv* env = AndroidRuntime::getJNIEnv(); 1319630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown 1329630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown env->CallVoidMethod(gPowerManagerServiceObj, 1339630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown gPowerManagerServiceClassInfo.goToSleepFromNative, 1349630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown nanoseconds_to_milliseconds(eventTime), 0); 1359630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown checkAndClearExceptionFromCallback(env, "goToSleepFromNative"); 13600fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown } 13700fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown} 13800fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown 13900fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown// ---------------------------------------------------------------------------- 14000fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown 1417304c343821309dd15f769b18f1de2fa43751573Jeff Brownstatic void nativeInit(JNIEnv* env, jobject obj) { 14200fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown gPowerManagerServiceObj = env->NewGlobalRef(obj); 1437304c343821309dd15f769b18f1de2fa43751573Jeff Brown 1447304c343821309dd15f769b18f1de2fa43751573Jeff Brown status_t err = hw_get_module(POWER_HARDWARE_MODULE_ID, 1457304c343821309dd15f769b18f1de2fa43751573Jeff Brown (hw_module_t const**)&gPowerModule); 146d232afa003689d87b637cb4525aae9a6af426700Jeff Brown if (!err) { 147d232afa003689d87b637cb4525aae9a6af426700Jeff Brown gPowerModule->init(gPowerModule); 148d232afa003689d87b637cb4525aae9a6af426700Jeff Brown } else { 149d232afa003689d87b637cb4525aae9a6af426700Jeff Brown ALOGE("Couldn't load %s module (%s)", POWER_HARDWARE_MODULE_ID, strerror(-err)); 1507304c343821309dd15f769b18f1de2fa43751573Jeff Brown } 15100fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown} 15200fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown 1537304c343821309dd15f769b18f1de2fa43751573Jeff Brownstatic void nativeSetPowerState(JNIEnv* env, 1549630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown jclass clazz, jboolean screenOn, jboolean screenBright) { 15500fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown AutoMutex _l(gPowerManagerLock); 15600fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown gScreenOn = screenOn; 15700fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown gScreenBright = screenBright; 15800fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown} 15900fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown 1609630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brownstatic void nativeAcquireSuspendBlocker(JNIEnv *env, jclass clazz, jstring nameStr) { 1619630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown ScopedUtfChars name(env, nameStr); 1629630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown acquire_wake_lock(PARTIAL_WAKE_LOCK, name.c_str()); 163b08a1af667b16cb1faaea2aec1cf2a0e4659cb3fJoe Onorato} 164b08a1af667b16cb1faaea2aec1cf2a0e4659cb3fJoe Onorato 1659630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brownstatic void nativeReleaseSuspendBlocker(JNIEnv *env, jclass clazz, jstring nameStr) { 1669630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown ScopedUtfChars name(env, nameStr); 1679630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown release_wake_lock(name.c_str()); 1687304c343821309dd15f769b18f1de2fa43751573Jeff Brown} 1697304c343821309dd15f769b18f1de2fa43751573Jeff Brown 1709e316a1a2a8d734315bbd56a85308f9657a92913Jeff Brownstatic void nativeSetInteractive(JNIEnv *env, jclass clazz, jboolean enable) { 1710a19d001c4ffbeec7e4e23b7640fff6bd7f11bc7Jeff Brown if (gPowerModule) { 1720a19d001c4ffbeec7e4e23b7640fff6bd7f11bc7Jeff Brown if (enable) { 1730a19d001c4ffbeec7e4e23b7640fff6bd7f11bc7Jeff Brown ALOGD_IF_SLOW(20, "Excessive delay in setInteractive(true) while turning screen on"); 1740a19d001c4ffbeec7e4e23b7640fff6bd7f11bc7Jeff Brown gPowerModule->setInteractive(gPowerModule, true); 1750a19d001c4ffbeec7e4e23b7640fff6bd7f11bc7Jeff Brown } else { 1760a19d001c4ffbeec7e4e23b7640fff6bd7f11bc7Jeff Brown ALOGD_IF_SLOW(20, "Excessive delay in setInteractive(false) while turning screen off"); 1770a19d001c4ffbeec7e4e23b7640fff6bd7f11bc7Jeff Brown gPowerModule->setInteractive(gPowerModule, false); 1780a19d001c4ffbeec7e4e23b7640fff6bd7f11bc7Jeff Brown } 1799e316a1a2a8d734315bbd56a85308f9657a92913Jeff Brown } 1809e316a1a2a8d734315bbd56a85308f9657a92913Jeff Brown} 1817304c343821309dd15f769b18f1de2fa43751573Jeff Brown 1829e316a1a2a8d734315bbd56a85308f9657a92913Jeff Brownstatic void nativeSetAutoSuspend(JNIEnv *env, jclass clazz, jboolean enable) { 1839e316a1a2a8d734315bbd56a85308f9657a92913Jeff Brown if (enable) { 1849e316a1a2a8d734315bbd56a85308f9657a92913Jeff Brown ALOGD_IF_SLOW(100, "Excessive delay in autosuspend_enable() while turning screen off"); 1859e316a1a2a8d734315bbd56a85308f9657a92913Jeff Brown autosuspend_enable(); 1869e316a1a2a8d734315bbd56a85308f9657a92913Jeff Brown } else { 1879e316a1a2a8d734315bbd56a85308f9657a92913Jeff Brown ALOGD_IF_SLOW(100, "Excessive delay in autosuspend_disable() while turning screen on"); 1889e316a1a2a8d734315bbd56a85308f9657a92913Jeff Brown autosuspend_disable(); 1899630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown } 1907304c343821309dd15f769b18f1de2fa43751573Jeff Brown} 1917304c343821309dd15f769b18f1de2fa43751573Jeff Brown 1929630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brownstatic void nativeShutdown(JNIEnv *env, jclass clazz) { 1937304c343821309dd15f769b18f1de2fa43751573Jeff Brown android_reboot(ANDROID_RB_POWEROFF, 0, 0); 1947304c343821309dd15f769b18f1de2fa43751573Jeff Brown} 1957304c343821309dd15f769b18f1de2fa43751573Jeff Brown 1969630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brownstatic void nativeReboot(JNIEnv *env, jclass clazz, jstring reason) { 1977304c343821309dd15f769b18f1de2fa43751573Jeff Brown if (reason == NULL) { 1987304c343821309dd15f769b18f1de2fa43751573Jeff Brown android_reboot(ANDROID_RB_RESTART, 0, 0); 1997304c343821309dd15f769b18f1de2fa43751573Jeff Brown } else { 2007304c343821309dd15f769b18f1de2fa43751573Jeff Brown const char *chars = env->GetStringUTFChars(reason, NULL); 2017304c343821309dd15f769b18f1de2fa43751573Jeff Brown android_reboot(ANDROID_RB_RESTART2, 0, (char *) chars); 2027304c343821309dd15f769b18f1de2fa43751573Jeff Brown env->ReleaseStringUTFChars(reason, chars); // In case it fails. 2037304c343821309dd15f769b18f1de2fa43751573Jeff Brown } 2047304c343821309dd15f769b18f1de2fa43751573Jeff Brown jniThrowIOException(env, errno); 2057304c343821309dd15f769b18f1de2fa43751573Jeff Brown} 2067304c343821309dd15f769b18f1de2fa43751573Jeff Brown 2077304c343821309dd15f769b18f1de2fa43751573Jeff Brown 20800fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown// ---------------------------------------------------------------------------- 20900fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown 21000fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brownstatic JNINativeMethod gPowerManagerServiceMethods[] = { 21100fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown /* name, signature, funcPtr */ 21200fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown { "nativeInit", "()V", 2137304c343821309dd15f769b18f1de2fa43751573Jeff Brown (void*) nativeInit }, 21400fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown { "nativeSetPowerState", "(ZZ)V", 2157304c343821309dd15f769b18f1de2fa43751573Jeff Brown (void*) nativeSetPowerState }, 2169630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown { "nativeAcquireSuspendBlocker", "(Ljava/lang/String;)V", 2179630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown (void*) nativeAcquireSuspendBlocker }, 2189630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown { "nativeReleaseSuspendBlocker", "(Ljava/lang/String;)V", 2199630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown (void*) nativeReleaseSuspendBlocker }, 2209e316a1a2a8d734315bbd56a85308f9657a92913Jeff Brown { "nativeSetInteractive", "(Z)V", 2219e316a1a2a8d734315bbd56a85308f9657a92913Jeff Brown (void*) nativeSetInteractive }, 2229e316a1a2a8d734315bbd56a85308f9657a92913Jeff Brown { "nativeSetAutoSuspend", "(Z)V", 2239e316a1a2a8d734315bbd56a85308f9657a92913Jeff Brown (void*) nativeSetAutoSuspend }, 2247304c343821309dd15f769b18f1de2fa43751573Jeff Brown { "nativeShutdown", "()V", 2257304c343821309dd15f769b18f1de2fa43751573Jeff Brown (void*) nativeShutdown }, 2267304c343821309dd15f769b18f1de2fa43751573Jeff Brown { "nativeReboot", "(Ljava/lang/String;)V", 2277304c343821309dd15f769b18f1de2fa43751573Jeff Brown (void*) nativeReboot }, 22800fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown}; 22900fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown 23000fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown#define FIND_CLASS(var, className) \ 23100fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown var = env->FindClass(className); \ 23217cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro LOG_FATAL_IF(! var, "Unable to find class " className); 23300fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown 23400fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown#define GET_METHOD_ID(var, clazz, methodName, methodDescriptor) \ 23500fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown var = env->GetMethodID(clazz, methodName, methodDescriptor); \ 23600fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown LOG_FATAL_IF(! var, "Unable to find method " methodName); 23700fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown 23800fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown#define GET_FIELD_ID(var, clazz, fieldName, fieldDescriptor) \ 23900fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown var = env->GetFieldID(clazz, fieldName, fieldDescriptor); \ 24000fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown LOG_FATAL_IF(! var, "Unable to find field " fieldName); 24100fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown 24200fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brownint register_android_server_PowerManagerService(JNIEnv* env) { 2434f8ecd80296508a1dc69d3f3a23fd91e962c2784Jeff Brown int res = jniRegisterNativeMethods(env, "com/android/server/power/PowerManagerService", 24400fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown gPowerManagerServiceMethods, NELEM(gPowerManagerServiceMethods)); 24500fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown LOG_FATAL_IF(res < 0, "Unable to register native methods."); 24600fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown 24700fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown // Callbacks 24800fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown 24917cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro jclass clazz; 2504f8ecd80296508a1dc69d3f3a23fd91e962c2784Jeff Brown FIND_CLASS(clazz, "com/android/server/power/PowerManagerService"); 25100fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown 2529630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown GET_METHOD_ID(gPowerManagerServiceClassInfo.wakeUpFromNative, clazz, 2539630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown "wakeUpFromNative", "(J)V"); 2549630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown 2559630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown GET_METHOD_ID(gPowerManagerServiceClassInfo.goToSleepFromNative, clazz, 2569630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown "goToSleepFromNative", "(JI)V"); 25700fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown 2589630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown GET_METHOD_ID(gPowerManagerServiceClassInfo.userActivityFromNative, clazz, 2599630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown "userActivityFromNative", "(JII)V"); 26000fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown 26190291577a08f582e0978651f55dd950f40eb111dJeff Brown // Initialize 262b696de5c10ebcc7bf42d8487fc0e56e0e937754dJeff Brown for (int i = 0; i <= USER_ACTIVITY_EVENT_LAST; 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