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> 2790291577a08f582e0978651f55dd950f40eb111dJeff Brown#include <utils/Timers.h> 28b08a1af667b16cb1faaea2aec1cf2a0e4659cb3fJoe Onorato#include <surfaceflinger/ISurfaceComposer.h> 29b08a1af667b16cb1faaea2aec1cf2a0e4659cb3fJoe Onorato#include <surfaceflinger/SurfaceComposerClient.h> 30b08a1af667b16cb1faaea2aec1cf2a0e4659cb3fJoe Onorato 3100fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown#include "com_android_server_PowerManagerService.h" 3200fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown 3300fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brownnamespace android { 3400fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown 3500fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown// ---------------------------------------------------------------------------- 3600fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown 3700fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brownstatic struct { 3800fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown jmethodID goToSleep; 3900fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown jmethodID userActivity; 4000fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown} gPowerManagerServiceClassInfo; 4100fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown 4200fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown// ---------------------------------------------------------------------------- 4300fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown 4400fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brownstatic jobject gPowerManagerServiceObj; 4500fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown 4600fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brownstatic Mutex gPowerManagerLock; 4700fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brownstatic bool gScreenOn; 4800fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brownstatic bool gScreenBright; 4900fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown 5090291577a08f582e0978651f55dd950f40eb111dJeff Brownstatic nsecs_t gLastEventTime[POWER_MANAGER_LAST_EVENT + 1]; 5190291577a08f582e0978651f55dd950f40eb111dJeff Brown 5290291577a08f582e0978651f55dd950f40eb111dJeff Brown// Throttling interval for user activity calls. 5390291577a08f582e0978651f55dd950f40eb111dJeff Brownstatic const nsecs_t MIN_TIME_BETWEEN_USERACTIVITIES = 500 * 1000000L; // 500ms 5490291577a08f582e0978651f55dd950f40eb111dJeff Brown 5500fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown// ---------------------------------------------------------------------------- 5600fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown 5700fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brownstatic bool checkAndClearExceptionFromCallback(JNIEnv* env, const char* methodName) { 5800fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown if (env->ExceptionCheck()) { 5900fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown LOGE("An exception was thrown by callback '%s'.", methodName); 6000fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown LOGE_EX(env); 6100fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown env->ExceptionClear(); 6200fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown return true; 6300fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown } 6400fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown return false; 6500fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown} 6600fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown 6700fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brownbool android_server_PowerManagerService_isScreenOn() { 6800fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown AutoMutex _l(gPowerManagerLock); 6900fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown return gScreenOn; 7000fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown} 7100fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown 7200fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brownbool android_server_PowerManagerService_isScreenBright() { 7300fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown AutoMutex _l(gPowerManagerLock); 7400fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown return gScreenBright; 7500fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown} 7600fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown 7700fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brownvoid android_server_PowerManagerService_userActivity(nsecs_t eventTime, int32_t eventType) { 7800fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown if (gPowerManagerServiceObj) { 7990291577a08f582e0978651f55dd950f40eb111dJeff Brown // Throttle calls into user activity by event type. 8090291577a08f582e0978651f55dd950f40eb111dJeff Brown // We're a little conservative about argument checking here in case the caller 8190291577a08f582e0978651f55dd950f40eb111dJeff Brown // passes in bad data which could corrupt system state. 8290291577a08f582e0978651f55dd950f40eb111dJeff Brown if (eventType >= 0 && eventType <= POWER_MANAGER_LAST_EVENT) { 8390291577a08f582e0978651f55dd950f40eb111dJeff Brown nsecs_t now = systemTime(SYSTEM_TIME_MONOTONIC); 8490291577a08f582e0978651f55dd950f40eb111dJeff Brown if (eventTime > now) { 8590291577a08f582e0978651f55dd950f40eb111dJeff Brown eventTime = now; 8690291577a08f582e0978651f55dd950f40eb111dJeff Brown } 8790291577a08f582e0978651f55dd950f40eb111dJeff Brown 8890291577a08f582e0978651f55dd950f40eb111dJeff Brown if (gLastEventTime[eventType] + MIN_TIME_BETWEEN_USERACTIVITIES > eventTime) { 8990291577a08f582e0978651f55dd950f40eb111dJeff Brown return; 9090291577a08f582e0978651f55dd950f40eb111dJeff Brown } 9190291577a08f582e0978651f55dd950f40eb111dJeff Brown gLastEventTime[eventType] = eventTime; 9290291577a08f582e0978651f55dd950f40eb111dJeff Brown } 9390291577a08f582e0978651f55dd950f40eb111dJeff Brown 9400fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown JNIEnv* env = AndroidRuntime::getJNIEnv(); 9500fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown 9600fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown env->CallVoidMethod(gPowerManagerServiceObj, gPowerManagerServiceClassInfo.userActivity, 9700fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown nanoseconds_to_milliseconds(eventTime), false, eventType, false); 9800fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown checkAndClearExceptionFromCallback(env, "userActivity"); 9900fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown } 10000fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown} 10100fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown 10200fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brownvoid android_server_PowerManagerService_goToSleep(nsecs_t eventTime) { 10300fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown if (gPowerManagerServiceObj) { 10400fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown JNIEnv* env = AndroidRuntime::getJNIEnv(); 10500fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown 10600fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown env->CallVoidMethod(gPowerManagerServiceObj, gPowerManagerServiceClassInfo.goToSleep, 10700fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown nanoseconds_to_milliseconds(eventTime)); 10800fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown checkAndClearExceptionFromCallback(env, "goToSleep"); 10900fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown } 11000fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown} 11100fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown 11200fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown// ---------------------------------------------------------------------------- 11300fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown 11400fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brownstatic void android_server_PowerManagerService_nativeInit(JNIEnv* env, jobject obj) { 11500fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown gPowerManagerServiceObj = env->NewGlobalRef(obj); 11600fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown} 11700fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown 11800fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brownstatic void android_server_PowerManagerService_nativeSetPowerState(JNIEnv* env, 11900fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown jobject serviceObj, jboolean screenOn, jboolean screenBright) { 12000fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown AutoMutex _l(gPowerManagerLock); 12100fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown gScreenOn = screenOn; 12200fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown gScreenBright = screenBright; 12300fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown} 12400fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown 125b08a1af667b16cb1faaea2aec1cf2a0e4659cb3fJoe Onoratostatic void android_server_PowerManagerService_nativeStartSurfaceFlingerAnimation(JNIEnv* env, 126609695dab0f0318459d32ff5dfc529d7398e751bJoe Onorato jobject obj, jint mode) { 127b08a1af667b16cb1faaea2aec1cf2a0e4659cb3fJoe Onorato sp<ISurfaceComposer> s(ComposerService::getComposerService()); 128609695dab0f0318459d32ff5dfc529d7398e751bJoe Onorato s->turnElectronBeamOff(mode); 129b08a1af667b16cb1faaea2aec1cf2a0e4659cb3fJoe Onorato} 130b08a1af667b16cb1faaea2aec1cf2a0e4659cb3fJoe Onorato 13100fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown// ---------------------------------------------------------------------------- 13200fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown 13300fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brownstatic JNINativeMethod gPowerManagerServiceMethods[] = { 13400fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown /* name, signature, funcPtr */ 13500fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown { "nativeInit", "()V", 13600fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown (void*) android_server_PowerManagerService_nativeInit }, 13700fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown { "nativeSetPowerState", "(ZZ)V", 13800fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown (void*) android_server_PowerManagerService_nativeSetPowerState }, 139609695dab0f0318459d32ff5dfc529d7398e751bJoe Onorato { "nativeStartSurfaceFlingerAnimation", "(I)V", 140b08a1af667b16cb1faaea2aec1cf2a0e4659cb3fJoe Onorato (void*) android_server_PowerManagerService_nativeStartSurfaceFlingerAnimation }, 14100fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown}; 14200fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown 14300fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown#define FIND_CLASS(var, className) \ 14400fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown var = env->FindClass(className); \ 14517cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro LOG_FATAL_IF(! var, "Unable to find class " className); 14600fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown 14700fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown#define GET_METHOD_ID(var, clazz, methodName, methodDescriptor) \ 14800fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown var = env->GetMethodID(clazz, methodName, methodDescriptor); \ 14900fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown LOG_FATAL_IF(! var, "Unable to find method " methodName); 15000fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown 15100fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown#define GET_FIELD_ID(var, clazz, fieldName, fieldDescriptor) \ 15200fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown var = env->GetFieldID(clazz, fieldName, fieldDescriptor); \ 15300fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown LOG_FATAL_IF(! var, "Unable to find field " fieldName); 15400fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown 15500fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brownint register_android_server_PowerManagerService(JNIEnv* env) { 15600fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown int res = jniRegisterNativeMethods(env, "com/android/server/PowerManagerService", 15700fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown gPowerManagerServiceMethods, NELEM(gPowerManagerServiceMethods)); 15800fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown LOG_FATAL_IF(res < 0, "Unable to register native methods."); 15900fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown 16000fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown // Callbacks 16100fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown 16217cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro jclass clazz; 16317cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro FIND_CLASS(clazz, "com/android/server/PowerManagerService"); 16400fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown 16517cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro GET_METHOD_ID(gPowerManagerServiceClassInfo.goToSleep, clazz, 16600fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown "goToSleep", "(J)V"); 16700fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown 16817cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro GET_METHOD_ID(gPowerManagerServiceClassInfo.userActivity, clazz, 16900fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown "userActivity", "(JZIZ)V"); 17000fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown 17190291577a08f582e0978651f55dd950f40eb111dJeff Brown // Initialize 17290291577a08f582e0978651f55dd950f40eb111dJeff Brown for (int i = 0; i < POWER_MANAGER_LAST_EVENT; i++) { 17390291577a08f582e0978651f55dd950f40eb111dJeff Brown gLastEventTime[i] = LLONG_MIN; 17490291577a08f582e0978651f55dd950f40eb111dJeff Brown } 17590291577a08f582e0978651f55dd950f40eb111dJeff Brown gScreenOn = true; 17690291577a08f582e0978651f55dd950f40eb111dJeff Brown gScreenBright = true; 17700fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown return 0; 17800fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown} 17900fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown 18000fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown} /* namespace android */ 181