summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Steven Moreland <smoreland@google.com> 2016-10-04 17:25:52 -0700
committer Steven Moreland <smoreland@google.com> 2016-10-12 16:14:42 -0700
commit8b9ec4fa0b27e1cc0aba1d27b85761b88ca4c9d0 (patch)
tree1ab9f7ac224dd958ec75b331668c38e3c8e0539c
parent87ff355f0a91785a44d50f8e15392781c2065f1d (diff)
Updating light service for hidl.
Bug: 32022100 Test: end to end Change-Id: I3c35551ffbbd272df4291f74455ba9562373f517
-rw-r--r--services/core/Android.mk8
-rw-r--r--services/core/java/com/android/server/lights/Light.java15
-rw-r--r--services/core/java/com/android/server/lights/LightsManager.java20
-rw-r--r--services/core/java/com/android/server/lights/LightsService.java19
-rw-r--r--services/core/jni/Android.mk6
-rw-r--r--services/core/jni/com_android_server_lights_LightsService.cpp155
6 files changed, 93 insertions, 130 deletions
diff --git a/services/core/Android.mk b/services/core/Android.mk
index fedce0c964fe..9efafb7a0694 100644
--- a/services/core/Android.mk
+++ b/services/core/Android.mk
@@ -17,8 +17,12 @@ LOCAL_SRC_FILES += \
LOCAL_AIDL_INCLUDES += \
system/netd/server/binder
-LOCAL_JAVA_LIBRARIES := services.net telephony-common \
- android.hardware.power@1.0-java
+LOCAL_JAVA_LIBRARIES := \
+ services.net \
+ telephony-common \
+ android.hardware.power@1.0-java \
+ android.hardware.light@2.0-java
+
LOCAL_STATIC_JAVA_LIBRARIES := tzdata_update
LOCAL_PROTOC_OPTIMIZE_TYPE := nano
diff --git a/services/core/java/com/android/server/lights/Light.java b/services/core/java/com/android/server/lights/Light.java
index b18a18129248..0bab86b67e82 100644
--- a/services/core/java/com/android/server/lights/Light.java
+++ b/services/core/java/com/android/server/lights/Light.java
@@ -16,25 +16,28 @@
package com.android.server.lights;
+import android.hardware.light.V2_0.Flash;
+import android.hardware.light.V2_0.Brightness;
+
public abstract class Light {
- public static final int LIGHT_FLASH_NONE = 0;
- public static final int LIGHT_FLASH_TIMED = 1;
- public static final int LIGHT_FLASH_HARDWARE = 2;
+ public static final int LIGHT_FLASH_NONE = Flash.NONE;
+ public static final int LIGHT_FLASH_TIMED = Flash.TIMED;
+ public static final int LIGHT_FLASH_HARDWARE = Flash.HARDWARE;
/**
* Light brightness is managed by a user setting.
*/
- public static final int BRIGHTNESS_MODE_USER = 0;
+ public static final int BRIGHTNESS_MODE_USER = Brightness.USER;
/**
* Light brightness is managed by a light sensor.
*/
- public static final int BRIGHTNESS_MODE_SENSOR = 1;
+ public static final int BRIGHTNESS_MODE_SENSOR = Brightness.SENSOR;
/**
* Low-persistence light mode.
*/
- public static final int BRIGHTNESS_MODE_LOW_PERSISTENCE = 2;
+ public static final int BRIGHTNESS_MODE_LOW_PERSISTENCE = Brightness.LOW_PERSISTENCE;
public abstract void setBrightness(int brightness);
public abstract void setBrightness(int brightness, int brightnessMode);
diff --git a/services/core/java/com/android/server/lights/LightsManager.java b/services/core/java/com/android/server/lights/LightsManager.java
index 2f20509dddf5..be20a445432b 100644
--- a/services/core/java/com/android/server/lights/LightsManager.java
+++ b/services/core/java/com/android/server/lights/LightsManager.java
@@ -16,16 +16,18 @@
package com.android.server.lights;
+import android.hardware.light.V2_0.Type;
+
public abstract class LightsManager {
- public static final int LIGHT_ID_BACKLIGHT = 0;
- public static final int LIGHT_ID_KEYBOARD = 1;
- public static final int LIGHT_ID_BUTTONS = 2;
- public static final int LIGHT_ID_BATTERY = 3;
- public static final int LIGHT_ID_NOTIFICATIONS = 4;
- public static final int LIGHT_ID_ATTENTION = 5;
- public static final int LIGHT_ID_BLUETOOTH = 6;
- public static final int LIGHT_ID_WIFI = 7;
- public static final int LIGHT_ID_COUNT = 8;
+ public static final int LIGHT_ID_BACKLIGHT = Type.BACKLIGHT;
+ public static final int LIGHT_ID_KEYBOARD = Type.KEYBOARD;
+ public static final int LIGHT_ID_BUTTONS = Type.BUTTONS;
+ public static final int LIGHT_ID_BATTERY = Type.BATTERY;
+ public static final int LIGHT_ID_NOTIFICATIONS = Type.NOTIFICATIONS;
+ public static final int LIGHT_ID_ATTENTION = Type.ATTENTION;
+ public static final int LIGHT_ID_BLUETOOTH = Type.BLUETOOTH;
+ public static final int LIGHT_ID_WIFI = Type.WIFI;
+ public static final int LIGHT_ID_COUNT = Type.COUNT;
public abstract Light getLight(int id);
}
diff --git a/services/core/java/com/android/server/lights/LightsService.java b/services/core/java/com/android/server/lights/LightsService.java
index ca6481792dfe..bba0a50e7af4 100644
--- a/services/core/java/com/android/server/lights/LightsService.java
+++ b/services/core/java/com/android/server/lights/LightsService.java
@@ -133,7 +133,7 @@ public class LightsService extends SystemService {
Trace.traceBegin(Trace.TRACE_TAG_POWER, "setLight(" + mId + ", 0x"
+ Integer.toHexString(color) + ")");
try {
- setLight_native(mNativePointer, mId, color, mode, onMS, offMS, brightnessMode);
+ setLight_native(mId, color, mode, onMS, offMS, brightnessMode);
} finally {
Trace.traceEnd(Trace.TRACE_TAG_POWER);
}
@@ -155,8 +155,6 @@ public class LightsService extends SystemService {
public LightsService(Context context) {
super(context);
- mNativePointer = init_native();
-
for (int i = 0; i < LightsManager.LIGHT_ID_COUNT; i++) {
mLights[i] = new LightImpl(i);
}
@@ -217,7 +215,7 @@ public class LightsService extends SystemService {
private final LightsManager mService = new LightsManager() {
@Override
public Light getLight(int id) {
- if (id < LIGHT_ID_COUNT) {
+ if (0 <= id && id < LIGHT_ID_COUNT) {
return mLights[id];
} else {
return null;
@@ -225,12 +223,6 @@ public class LightsService extends SystemService {
}
};
- @Override
- protected void finalize() throws Throwable {
- finalize_native(mNativePointer);
- super.finalize();
- }
-
private Handler mH = new Handler() {
@Override
public void handleMessage(Message msg) {
@@ -239,11 +231,6 @@ public class LightsService extends SystemService {
}
};
- private static native long init_native();
- private static native void finalize_native(long ptr);
-
- static native void setLight_native(long ptr, int light, int color, int mode,
+ static native void setLight_native(int light, int color, int mode,
int onMS, int offMS, int brightnessMode);
-
- private long mNativePointer;
}
diff --git a/services/core/jni/Android.mk b/services/core/jni/Android.mk
index b3bfc16e6320..d328ade5d66f 100644
--- a/services/core/jni/Android.mk
+++ b/services/core/jni/Android.mk
@@ -68,7 +68,5 @@ LOCAL_SHARED_LIBRARIES += \
libhwbinder \
libutils \
android.hardware.power@1.0 \
-
-LOCAL_SHARED_LIBRARIES += \
- libhidl libhwbinder android.hardware.vibrator@1.0
-
+ android.hardware.vibrator@1.0 \
+ android.hardware.light@2.0 \
diff --git a/services/core/jni/com_android_server_lights_LightsService.cpp b/services/core/jni/com_android_server_lights_LightsService.cpp
index c8e3946970e9..e6072bb03ccc 100644
--- a/services/core/jni/com_android_server_lights_LightsService.cpp
+++ b/services/core/jni/com_android_server_lights_LightsService.cpp
@@ -20,136 +20,105 @@
#include "JNIHelp.h"
#include "android_runtime/AndroidRuntime.h"
+#include <android/hardware/light/2.0/ILight.h>
+#include <android/hardware/light/2.0/types.h>
#include <utils/misc.h>
#include <utils/Log.h>
-#include <hardware/hardware.h>
-#include <hardware/lights.h>
-
+#include <map>
#include <stdio.h>
-namespace android
-{
-
-// These values must correspond with the LIGHT_ID constants in
-// LightsService.java
-enum {
- LIGHT_INDEX_BACKLIGHT = 0,
- LIGHT_INDEX_KEYBOARD = 1,
- LIGHT_INDEX_BUTTONS = 2,
- LIGHT_INDEX_BATTERY = 3,
- LIGHT_INDEX_NOTIFICATIONS = 4,
- LIGHT_INDEX_ATTENTION = 5,
- LIGHT_INDEX_BLUETOOTH = 6,
- LIGHT_INDEX_WIFI = 7,
- LIGHT_COUNT
-};
+namespace android {
-struct Devices {
- light_device_t* lights[LIGHT_COUNT];
-};
+using ILight = ::android::hardware::light::V2_0::ILight;
+using Brightness = ::android::hardware::light::V2_0::Brightness;
+using Flash = ::android::hardware::light::V2_0::Flash;
+using Type = ::android::hardware::light::V2_0::Type;
+using LightState = ::android::hardware::light::V2_0::LightState;
-static light_device_t* get_device(hw_module_t* module, char const* name)
-{
- int err;
- hw_device_t* device;
- err = module->methods->open(module, name, &device);
- if (err == 0) {
- return (light_device_t*)device;
- } else {
- return NULL;
+static sp<ILight> gLight;
+
+static bool validate(jint light, jint flash, jint brightness) {
+ bool valid = true;
+
+ if (light < 0 || light >= static_cast<int>(Type::COUNT)) {
+ ALOGE("Invalid light parameter %d.", light);
+ valid = false;
}
-}
-static jlong init_native(JNIEnv* /* env */, jobject /* clazz */)
-{
- int err;
- hw_module_t* module;
- Devices* devices;
-
- devices = (Devices*)malloc(sizeof(Devices));
-
- err = hw_get_module(LIGHTS_HARDWARE_MODULE_ID, (hw_module_t const**)&module);
- if (err == 0) {
- devices->lights[LIGHT_INDEX_BACKLIGHT]
- = get_device(module, LIGHT_ID_BACKLIGHT);
- devices->lights[LIGHT_INDEX_KEYBOARD]
- = get_device(module, LIGHT_ID_KEYBOARD);
- devices->lights[LIGHT_INDEX_BUTTONS]
- = get_device(module, LIGHT_ID_BUTTONS);
- devices->lights[LIGHT_INDEX_BATTERY]
- = get_device(module, LIGHT_ID_BATTERY);
- devices->lights[LIGHT_INDEX_NOTIFICATIONS]
- = get_device(module, LIGHT_ID_NOTIFICATIONS);
- devices->lights[LIGHT_INDEX_ATTENTION]
- = get_device(module, LIGHT_ID_ATTENTION);
- devices->lights[LIGHT_INDEX_BLUETOOTH]
- = get_device(module, LIGHT_ID_BLUETOOTH);
- devices->lights[LIGHT_INDEX_WIFI]
- = get_device(module, LIGHT_ID_WIFI);
- } else {
- memset(devices, 0, sizeof(Devices));
+ if (flash != static_cast<int>(Flash::NONE) &&
+ flash != static_cast<int>(Flash::TIMED) &&
+ flash != static_cast<int>(Flash::HARDWARE)) {
+ ALOGE("Invalid flash parameter %d.", flash);
+ valid = false;
}
- return (jlong)devices;
+ if (brightness != static_cast<int>(Brightness::USER) &&
+ brightness != static_cast<int>(Brightness::SENSOR) &&
+ brightness != static_cast<int>(Brightness::LOW_PERSISTENCE)) {
+ ALOGE("Invalid brightness parameter %d.", brightness);
+ valid = false;
+ }
+
+ return valid;
}
-static void finalize_native(JNIEnv* /* env */, jobject /* clazz */, jlong ptr)
-{
- Devices* devices = (Devices*)ptr;
- if (devices == NULL) {
+static void setLight_native(
+ JNIEnv* /* env */,
+ jobject /* clazz */,
+ jint light,
+ jint colorARGB,
+ jint flashMode,
+ jint onMS,
+ jint offMS,
+ jint brightnessMode) {
+
+ if (!validate(light, flashMode, brightnessMode)) {
return;
}
- free(devices);
-}
-
-static void setLight_native(JNIEnv* /* env */, jobject /* clazz */, jlong ptr,
- jint light, jint colorARGB, jint flashMode, jint onMS, jint offMS, jint brightnessMode)
-{
- Devices* devices = (Devices*)ptr;
- light_state_t state;
+ // TODO(b/31632518)
+ if (gLight == nullptr) {
+ gLight = ILight::getService("light");
+ }
- if (light < 0 || light >= LIGHT_COUNT || devices->lights[light] == NULL) {
- return ;
+ if (gLight == nullptr) {
+ ALOGE("LightService unable to get ILight interface.");
+ return;
}
- uint32_t version = devices->lights[light]->common.version;
+ Type type = static_cast<Type>(light);
+ Flash flash = static_cast<Flash>(flashMode);
+ Brightness brightness = static_cast<Brightness>(brightnessMode);
- memset(&state, 0, sizeof(light_state_t));
+ LightState state{};
- if (brightnessMode == BRIGHTNESS_MODE_LOW_PERSISTENCE) {
- if (light != LIGHT_INDEX_BACKLIGHT) {
+ if (brightnessMode == static_cast<int>(Brightness::LOW_PERSISTENCE)) {
+ if (light != static_cast<int>(Type::BACKLIGHT)) {
ALOGE("Cannot set low-persistence mode for non-backlight device.");
return;
}
- if (version < LIGHTS_DEVICE_API_VERSION_2_0) {
- // HAL impl has not been upgraded to support this.
- return;
- }
+ state.flashMode = Flash::NONE;
} else {
// Only set non-brightness settings when not in low-persistence mode
state.color = colorARGB;
- state.flashMode = flashMode;
- state.flashOnMS = onMS;
- state.flashOffMS = offMS;
+ state.flashMode = flash;
+ state.flashOnMs = onMS;
+ state.flashOffMs = offMS;
}
- state.brightnessMode = brightnessMode;
+ state.brightnessMode = brightness;
{
ALOGD_IF_SLOW(50, "Excessive delay setting light");
- devices->lights[light]->set_light(devices->lights[light], &state);
+ gLight->setLight(type, state);
}
}
static const JNINativeMethod method_table[] = {
- { "init_native", "()J", (void*)init_native },
- { "finalize_native", "(J)V", (void*)finalize_native },
- { "setLight_native", "(JIIIIII)V", (void*)setLight_native },
+ { "setLight_native", "(IIIIII)V", (void*)setLight_native },
};
-int register_android_server_LightsService(JNIEnv *env)
-{
+int register_android_server_LightsService(JNIEnv *env) {
return jniRegisterNativeMethods(env, "com/android/server/lights/LightsService",
method_table, NELEM(method_table));
}