1/* //device/libs/android_runtime/android_os_Power.cpp
2**
3** Copyright 2006, The Android Open Source Project
4**
5** Licensed under the Apache License, Version 2.0 (the "License");
6** you may not use this file except in compliance with the License.
7** You may obtain a copy of the License at
8**
9**     http://www.apache.org/licenses/LICENSE-2.0
10**
11** Unless required by applicable law or agreed to in writing, software
12** distributed under the License is distributed on an "AS IS" BASIS,
13** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14** See the License for the specific language governing permissions and
15** limitations under the License.
16*/
17
18#include "JNIHelp.h"
19#include "jni.h"
20#include "android_runtime/AndroidRuntime.h"
21#include <utils/misc.h>
22#include <hardware_legacy/power.h>
23#include <sys/reboot.h>
24
25namespace android
26{
27
28static void throw_NullPointerException(JNIEnv *env, const char* msg)
29{
30    jclass clazz;
31    clazz = env->FindClass("java/lang/NullPointerException");
32    env->ThrowNew(clazz, msg);
33}
34
35static void
36acquireWakeLock(JNIEnv *env, jobject clazz, jint lock, jstring idObj)
37{
38    if (idObj == NULL) {
39        throw_NullPointerException(env, "id is null");
40        return ;
41    }
42
43    const char *id = env->GetStringUTFChars(idObj, NULL);
44
45    acquire_wake_lock(lock, id);
46
47    env->ReleaseStringUTFChars(idObj, id);
48}
49
50static void
51releaseWakeLock(JNIEnv *env, jobject clazz, jstring idObj)
52{
53    if (idObj == NULL) {
54        throw_NullPointerException(env, "id is null");
55        return ;
56    }
57
58    const char *id = env->GetStringUTFChars(idObj, NULL);
59
60    release_wake_lock(id);
61
62    env->ReleaseStringUTFChars(idObj, id);
63
64}
65
66static int
67setLastUserActivityTimeout(JNIEnv *env, jobject clazz, jlong timeMS)
68{
69    return set_last_user_activity_timeout(timeMS/1000);
70}
71
72static int
73setScreenState(JNIEnv *env, jobject clazz, jboolean on)
74{
75    return set_screen_state(on);
76}
77
78static void android_os_Power_shutdown(JNIEnv *env, jobject clazz)
79{
80    sync();
81#ifdef HAVE_ANDROID_OS
82    reboot(RB_POWER_OFF);
83#endif
84}
85
86static void android_os_Power_reboot(JNIEnv *env, jobject clazz, jstring reason)
87{
88    sync();
89#ifdef HAVE_ANDROID_OS
90    if (reason == NULL) {
91        reboot(RB_AUTOBOOT);
92    } else {
93        const char *chars = env->GetStringUTFChars(reason, NULL);
94        __reboot(LINUX_REBOOT_MAGIC1, LINUX_REBOOT_MAGIC2,
95                 LINUX_REBOOT_CMD_RESTART2, (char*) chars);
96        env->ReleaseStringUTFChars(reason, chars);  // In case it fails.
97    }
98    jniThrowIOException(env, errno);
99#endif
100}
101
102static JNINativeMethod method_table[] = {
103    { "acquireWakeLock", "(ILjava/lang/String;)V", (void*)acquireWakeLock },
104    { "releaseWakeLock", "(Ljava/lang/String;)V", (void*)releaseWakeLock },
105    { "setLastUserActivityTimeout", "(J)I", (void*)setLastUserActivityTimeout },
106    { "setScreenState", "(Z)I", (void*)setScreenState },
107    { "shutdown", "()V", (void*)android_os_Power_shutdown },
108    { "rebootNative", "(Ljava/lang/String;)V", (void*)android_os_Power_reboot },
109};
110
111int register_android_os_Power(JNIEnv *env)
112{
113    return AndroidRuntime::registerNativeMethods(
114        env, "android/os/Power",
115        method_table, NELEM(method_table));
116}
117
118};
119