diff options
| -rw-r--r-- | services/core/Android.bp | 1 | ||||
| -rw-r--r-- | services/core/java/com/android/server/ConsumerIrService.java | 60 | ||||
| -rw-r--r-- | services/core/jni/com_android_server_ConsumerIrService.cpp | 8 |
3 files changed, 56 insertions, 13 deletions
diff --git a/services/core/Android.bp b/services/core/Android.bp index 1dda14ca0db5..7a4f1de95e0c 100644 --- a/services/core/Android.bp +++ b/services/core/Android.bp @@ -154,6 +154,7 @@ java_library_static { "android.hardware.oemlock-V1.0-java", "android.hardware.configstore-V1.1-java", "android.hardware.contexthub-V1.0-java", + "android.hardware.ir-V1-java", "android.hardware.rebootescrow-V1-java", "android.hardware.soundtrigger-V2.3-java", "android.hardware.power.stats-V1-java", diff --git a/services/core/java/com/android/server/ConsumerIrService.java b/services/core/java/com/android/server/ConsumerIrService.java index 2ed6c77baa0d..c4e84a4cd138 100644 --- a/services/core/java/com/android/server/ConsumerIrService.java +++ b/services/core/java/com/android/server/ConsumerIrService.java @@ -19,17 +19,19 @@ package com.android.server; import android.content.Context; import android.content.pm.PackageManager; import android.hardware.IConsumerIrService; +import android.hardware.ir.ConsumerIrFreqRange; +import android.hardware.ir.IConsumerIr; import android.os.PowerManager; +import android.os.RemoteException; +import android.os.ServiceManager; import android.util.Slog; -import java.lang.RuntimeException; - public class ConsumerIrService extends IConsumerIrService.Stub { private static final String TAG = "ConsumerIrService"; private static final int MAX_XMIT_TIME = 2000000; /* in microseconds */ - private static native boolean halOpen(); + private static native boolean getHidlHalService(); private static native int halTransmit(int carrierFrequency, int[] pattern); private static native int[] halGetCarrierFrequencies(); @@ -37,6 +39,7 @@ public class ConsumerIrService extends IConsumerIrService.Stub { private final PowerManager.WakeLock mWakeLock; private final boolean mHasNativeHal; private final Object mHalLock = new Object(); + private IConsumerIr mAidlService = null; ConsumerIrService(Context context) { mContext = context; @@ -45,7 +48,8 @@ public class ConsumerIrService extends IConsumerIrService.Stub { mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, TAG); mWakeLock.setReferenceCounted(true); - mHasNativeHal = halOpen(); + mHasNativeHal = getHalService(); + if (mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CONSUMER_IR)) { if (!mHasNativeHal) { throw new RuntimeException("FEATURE_CONSUMER_IR present, but no IR HAL loaded!"); @@ -60,6 +64,19 @@ public class ConsumerIrService extends IConsumerIrService.Stub { return mHasNativeHal; } + private boolean getHalService() { + // Attempt to get the AIDL HAL service first + final String fqName = IConsumerIr.DESCRIPTOR + "/default"; + mAidlService = IConsumerIr.Stub.asInterface( + ServiceManager.waitForDeclaredService(fqName)); + if (mAidlService != null) { + return true; + } + + // Fall back to the HIDL HAL service + return getHidlHalService(); + } + private void throwIfNoIrEmitter() { if (!mHasNativeHal) { throw new UnsupportedOperationException("IR emitter not available"); @@ -91,10 +108,18 @@ public class ConsumerIrService extends IConsumerIrService.Stub { // Right now there is no mechanism to ensure fair queing of IR requests synchronized (mHalLock) { - int err = halTransmit(carrierFrequency, pattern); - - if (err < 0) { - Slog.e(TAG, "Error transmitting: " + err); + if (mAidlService != null) { + try { + mAidlService.transmit(carrierFrequency, pattern); + } catch (RemoteException ignore) { + Slog.e(TAG, "Error transmitting frequency: " + carrierFrequency); + } + } else { + int err = halTransmit(carrierFrequency, pattern); + + if (err < 0) { + Slog.e(TAG, "Error transmitting: " + err); + } } } } @@ -109,7 +134,24 @@ public class ConsumerIrService extends IConsumerIrService.Stub { throwIfNoIrEmitter(); synchronized(mHalLock) { - return halGetCarrierFrequencies(); + if (mAidlService != null) { + try { + ConsumerIrFreqRange[] output = mAidlService.getCarrierFreqs(); + if (output.length <= 0) { + Slog.e(TAG, "Error getting carrier frequencies."); + } + int[] result = new int[output.length * 2]; + for (int i = 0; i < output.length; i++) { + result[i * 2] = output[i].minHz; + result[i * 2 + 1] = output[i].maxHz; + } + return result; + } catch (RemoteException ignore) { + return null; + } + } else { + return halGetCarrierFrequencies(); + } } } } diff --git a/services/core/jni/com_android_server_ConsumerIrService.cpp b/services/core/jni/com_android_server_ConsumerIrService.cpp index 2ca348b3ae46..63daa3503bd5 100644 --- a/services/core/jni/com_android_server_ConsumerIrService.cpp +++ b/services/core/jni/com_android_server_ConsumerIrService.cpp @@ -34,7 +34,7 @@ namespace android { static sp<IConsumerIr> mHal; -static jboolean halOpen(JNIEnv* /* env */, jobject /* obj */) { +static jboolean getHidlHalService(JNIEnv * /* env */, jobject /* obj */) { // TODO(b/31632518) mHal = IConsumerIr::getService(); return mHal != nullptr; @@ -84,9 +84,9 @@ static jintArray halGetCarrierFrequencies(JNIEnv *env, jobject /* obj */) { } static const JNINativeMethod method_table[] = { - { "halOpen", "()Z", (void *)halOpen }, - { "halTransmit", "(I[I)I", (void *)halTransmit }, - { "halGetCarrierFrequencies", "()[I", (void *)halGetCarrierFrequencies}, + {"getHidlHalService", "()Z", (void *)getHidlHalService}, + {"halTransmit", "(I[I)I", (void *)halTransmit}, + {"halGetCarrierFrequencies", "()[I", (void *)halGetCarrierFrequencies}, }; int register_android_server_ConsumerIrService(JNIEnv *env) { |