summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/core/java/com/android/server/ConsumerIrService.java22
-rw-r--r--services/core/jni/Android.mk1
-rw-r--r--services/core/jni/com_android_server_ConsumerIrService.cpp79
3 files changed, 43 insertions, 59 deletions
diff --git a/services/core/java/com/android/server/ConsumerIrService.java b/services/core/java/com/android/server/ConsumerIrService.java
index ea6812d2df85..2ed6c77baa0d 100644
--- a/services/core/java/com/android/server/ConsumerIrService.java
+++ b/services/core/java/com/android/server/ConsumerIrService.java
@@ -29,13 +29,13 @@ public class ConsumerIrService extends IConsumerIrService.Stub {
private static final int MAX_XMIT_TIME = 2000000; /* in microseconds */
- private static native long halOpen();
- private static native int halTransmit(long halObject, int carrierFrequency, int[] pattern);
- private static native int[] halGetCarrierFrequencies(long halObject);
+ private static native boolean halOpen();
+ private static native int halTransmit(int carrierFrequency, int[] pattern);
+ private static native int[] halGetCarrierFrequencies();
private final Context mContext;
private final PowerManager.WakeLock mWakeLock;
- private final long mNativeHal;
+ private final boolean mHasNativeHal;
private final Object mHalLock = new Object();
ConsumerIrService(Context context) {
@@ -45,23 +45,23 @@ public class ConsumerIrService extends IConsumerIrService.Stub {
mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, TAG);
mWakeLock.setReferenceCounted(true);
- mNativeHal = halOpen();
+ mHasNativeHal = halOpen();
if (mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CONSUMER_IR)) {
- if (mNativeHal == 0) {
+ if (!mHasNativeHal) {
throw new RuntimeException("FEATURE_CONSUMER_IR present, but no IR HAL loaded!");
}
- } else if (mNativeHal != 0) {
+ } else if (mHasNativeHal) {
throw new RuntimeException("IR HAL present, but FEATURE_CONSUMER_IR is not set!");
}
}
@Override
public boolean hasIrEmitter() {
- return mNativeHal != 0;
+ return mHasNativeHal;
}
private void throwIfNoIrEmitter() {
- if (mNativeHal == 0) {
+ if (!mHasNativeHal) {
throw new UnsupportedOperationException("IR emitter not available");
}
}
@@ -91,7 +91,7 @@ public class ConsumerIrService extends IConsumerIrService.Stub {
// Right now there is no mechanism to ensure fair queing of IR requests
synchronized (mHalLock) {
- int err = halTransmit(mNativeHal, carrierFrequency, pattern);
+ int err = halTransmit(carrierFrequency, pattern);
if (err < 0) {
Slog.e(TAG, "Error transmitting: " + err);
@@ -109,7 +109,7 @@ public class ConsumerIrService extends IConsumerIrService.Stub {
throwIfNoIrEmitter();
synchronized(mHalLock) {
- return halGetCarrierFrequencies(mNativeHal);
+ return halGetCarrierFrequencies();
}
}
}
diff --git a/services/core/jni/Android.mk b/services/core/jni/Android.mk
index 50a6095912e2..3e8e42063bc1 100644
--- a/services/core/jni/Android.mk
+++ b/services/core/jni/Android.mk
@@ -74,6 +74,7 @@ LOCAL_SHARED_LIBRARIES += \
libutils \
android.hardware.audio.common@2.0 \
android.hardware.gnss@1.0 \
+ android.hardware.ir@1.0 \
android.hardware.light@2.0 \
android.hardware.power@1.0 \
android.hardware.thermal@1.0 \
diff --git a/services/core/jni/com_android_server_ConsumerIrService.cpp b/services/core/jni/com_android_server_ConsumerIrService.cpp
index 7104870349b5..5906e6b602ef 100644
--- a/services/core/jni/com_android_server_ConsumerIrService.cpp
+++ b/services/core/jni/com_android_server_ConsumerIrService.cpp
@@ -23,87 +23,70 @@
#include <stdlib.h>
#include <utils/misc.h>
#include <utils/Log.h>
-#include <hardware/hardware.h>
-#include <hardware/consumerir.h>
+#include <android/hardware/ir/1.0/IConsumerIr.h>
#include <ScopedPrimitiveArray.h>
-namespace android {
-
-static jlong halOpen(JNIEnv* /* env */, jobject /* obj */) {
- hw_module_t const* module;
- consumerir_device_t *dev;
- int err;
+using ::android::hardware::ir::V1_0::IConsumerIr;
+using ::android::hardware::ir::V1_0::ConsumerIrFreqRange;
+using ::android::hardware::hidl_vec;
- err = hw_get_module(CONSUMERIR_HARDWARE_MODULE_ID, &module);
- if (err != 0) {
- ALOGE("Can't open consumer IR HW Module, error: %d", err);
- return 0;
- }
+namespace android {
- err = module->methods->open(module, CONSUMERIR_TRANSMITTER,
- (hw_device_t **) &dev);
- if (err < 0) {
- ALOGE("Can't open consumer IR transmitter, error: %d", err);
- return 0;
- }
+static sp<IConsumerIr> mHal;
- return reinterpret_cast<jlong>(dev);
+static jboolean halOpen(JNIEnv* /* env */, jobject /* obj */) {
+ // TODO(b/31632518)
+ mHal = IConsumerIr::getService("consumerir");
+ return mHal != nullptr;
}
-static jint halTransmit(JNIEnv *env, jobject /* obj */, jlong halObject,
- jint carrierFrequency, jintArray pattern) {
- int ret;
-
- consumerir_device_t *dev = reinterpret_cast<consumerir_device_t*>(halObject);
+static jint halTransmit(JNIEnv *env, jobject /* obj */, jint carrierFrequency,
+ jintArray pattern) {
ScopedIntArrayRO cPattern(env, pattern);
if (cPattern.get() == NULL) {
return -EINVAL;
}
- jsize patternLength = cPattern.size();
-
- ret = dev->transmit(dev, carrierFrequency, cPattern.get(), patternLength);
+ hidl_vec<int32_t> patternVec;
+ patternVec.setToExternal(const_cast<int32_t*>(cPattern.get()), cPattern.size());
- return reinterpret_cast<jint>(ret);
+ bool success = mHal->transmit(carrierFrequency, patternVec, cPattern.size());
+ return success ? 0 : -1;
}
-static jintArray halGetCarrierFrequencies(JNIEnv *env, jobject /* obj */,
- jlong halObject) {
- consumerir_device_t *dev = reinterpret_cast<consumerir_device_t*>(halObject);
- consumerir_freq_range_t *ranges;
+static jintArray halGetCarrierFrequencies(JNIEnv *env, jobject /* obj */) {
int len;
+ hidl_vec<ConsumerIrFreqRange> ranges;
+ bool success;
- len = dev->get_num_carrier_freqs(dev);
- if (len <= 0)
- return NULL;
-
- ranges = new consumerir_freq_range_t[len];
+ auto cb = [&](bool s, hidl_vec<ConsumerIrFreqRange> vec) {
+ ranges = vec;
+ success = s;
+ };
+ mHal->getCarrierFreqs(cb);
- len = dev->get_carrier_freqs(dev, len, ranges);
- if (len <= 0) {
- delete[] ranges;
+ if (!success) {
return NULL;
}
+ len = ranges.size();
int i;
ScopedIntArrayRW freqsOut(env, env->NewIntArray(len*2));
jint *arr = freqsOut.get();
if (arr == NULL) {
- delete[] ranges;
return NULL;
}
for (i = 0; i < len; i++) {
- arr[i*2] = ranges[i].min;
- arr[i*2+1] = ranges[i].max;
+ arr[i*2] = static_cast<jint>(ranges[i].min);
+ arr[i*2+1] = static_cast<jint>(ranges[i].max);
}
- delete[] ranges;
return freqsOut.getJavaArray();
}
static const JNINativeMethod method_table[] = {
- { "halOpen", "()J", (void *)halOpen },
- { "halTransmit", "(JI[I)I", (void *)halTransmit },
- { "halGetCarrierFrequencies", "(J)[I", (void *)halGetCarrierFrequencies},
+ { "halOpen", "()Z", (void *)halOpen },
+ { "halTransmit", "(I[I)I", (void *)halTransmit },
+ { "halGetCarrierFrequencies", "()[I", (void *)halGetCarrierFrequencies},
};
int register_android_server_ConsumerIrService(JNIEnv *env) {