Merge "Use new AIDL IR interface for ConsumerIr service"
This commit is contained in:
@@ -154,6 +154,7 @@ java_library_static {
|
|||||||
"android.hardware.oemlock-V1.0-java",
|
"android.hardware.oemlock-V1.0-java",
|
||||||
"android.hardware.configstore-V1.1-java",
|
"android.hardware.configstore-V1.1-java",
|
||||||
"android.hardware.contexthub-V1.0-java",
|
"android.hardware.contexthub-V1.0-java",
|
||||||
|
"android.hardware.ir-V1-java",
|
||||||
"android.hardware.rebootescrow-V1-java",
|
"android.hardware.rebootescrow-V1-java",
|
||||||
"android.hardware.soundtrigger-V2.3-java",
|
"android.hardware.soundtrigger-V2.3-java",
|
||||||
"android.hardware.power.stats-V1-java",
|
"android.hardware.power.stats-V1-java",
|
||||||
|
|||||||
@@ -19,17 +19,19 @@ package com.android.server;
|
|||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.pm.PackageManager;
|
import android.content.pm.PackageManager;
|
||||||
import android.hardware.IConsumerIrService;
|
import android.hardware.IConsumerIrService;
|
||||||
|
import android.hardware.ir.ConsumerIrFreqRange;
|
||||||
|
import android.hardware.ir.IConsumerIr;
|
||||||
import android.os.PowerManager;
|
import android.os.PowerManager;
|
||||||
|
import android.os.RemoteException;
|
||||||
|
import android.os.ServiceManager;
|
||||||
import android.util.Slog;
|
import android.util.Slog;
|
||||||
|
|
||||||
import java.lang.RuntimeException;
|
|
||||||
|
|
||||||
public class ConsumerIrService extends IConsumerIrService.Stub {
|
public class ConsumerIrService extends IConsumerIrService.Stub {
|
||||||
private static final String TAG = "ConsumerIrService";
|
private static final String TAG = "ConsumerIrService";
|
||||||
|
|
||||||
private static final int MAX_XMIT_TIME = 2000000; /* in microseconds */
|
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 halTransmit(int carrierFrequency, int[] pattern);
|
||||||
private static native int[] halGetCarrierFrequencies();
|
private static native int[] halGetCarrierFrequencies();
|
||||||
|
|
||||||
@@ -37,6 +39,7 @@ public class ConsumerIrService extends IConsumerIrService.Stub {
|
|||||||
private final PowerManager.WakeLock mWakeLock;
|
private final PowerManager.WakeLock mWakeLock;
|
||||||
private final boolean mHasNativeHal;
|
private final boolean mHasNativeHal;
|
||||||
private final Object mHalLock = new Object();
|
private final Object mHalLock = new Object();
|
||||||
|
private IConsumerIr mAidlService = null;
|
||||||
|
|
||||||
ConsumerIrService(Context context) {
|
ConsumerIrService(Context context) {
|
||||||
mContext = context;
|
mContext = context;
|
||||||
@@ -45,7 +48,8 @@ public class ConsumerIrService extends IConsumerIrService.Stub {
|
|||||||
mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, TAG);
|
mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, TAG);
|
||||||
mWakeLock.setReferenceCounted(true);
|
mWakeLock.setReferenceCounted(true);
|
||||||
|
|
||||||
mHasNativeHal = halOpen();
|
mHasNativeHal = getHalService();
|
||||||
|
|
||||||
if (mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CONSUMER_IR)) {
|
if (mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CONSUMER_IR)) {
|
||||||
if (!mHasNativeHal) {
|
if (!mHasNativeHal) {
|
||||||
throw new RuntimeException("FEATURE_CONSUMER_IR present, but no IR HAL loaded!");
|
throw new RuntimeException("FEATURE_CONSUMER_IR present, but no IR HAL loaded!");
|
||||||
@@ -60,6 +64,19 @@ public class ConsumerIrService extends IConsumerIrService.Stub {
|
|||||||
return mHasNativeHal;
|
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() {
|
private void throwIfNoIrEmitter() {
|
||||||
if (!mHasNativeHal) {
|
if (!mHasNativeHal) {
|
||||||
throw new UnsupportedOperationException("IR emitter not available");
|
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
|
// Right now there is no mechanism to ensure fair queing of IR requests
|
||||||
synchronized (mHalLock) {
|
synchronized (mHalLock) {
|
||||||
int err = halTransmit(carrierFrequency, pattern);
|
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) {
|
if (err < 0) {
|
||||||
Slog.e(TAG, "Error transmitting: " + err);
|
Slog.e(TAG, "Error transmitting: " + err);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -109,7 +134,24 @@ public class ConsumerIrService extends IConsumerIrService.Stub {
|
|||||||
throwIfNoIrEmitter();
|
throwIfNoIrEmitter();
|
||||||
|
|
||||||
synchronized(mHalLock) {
|
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();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -34,7 +34,7 @@ namespace android {
|
|||||||
|
|
||||||
static sp<IConsumerIr> mHal;
|
static sp<IConsumerIr> mHal;
|
||||||
|
|
||||||
static jboolean halOpen(JNIEnv* /* env */, jobject /* obj */) {
|
static jboolean getHidlHalService(JNIEnv * /* env */, jobject /* obj */) {
|
||||||
// TODO(b/31632518)
|
// TODO(b/31632518)
|
||||||
mHal = IConsumerIr::getService();
|
mHal = IConsumerIr::getService();
|
||||||
return mHal != nullptr;
|
return mHal != nullptr;
|
||||||
@@ -84,9 +84,9 @@ static jintArray halGetCarrierFrequencies(JNIEnv *env, jobject /* obj */) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static const JNINativeMethod method_table[] = {
|
static const JNINativeMethod method_table[] = {
|
||||||
{ "halOpen", "()Z", (void *)halOpen },
|
{"getHidlHalService", "()Z", (void *)getHidlHalService},
|
||||||
{ "halTransmit", "(I[I)I", (void *)halTransmit },
|
{"halTransmit", "(I[I)I", (void *)halTransmit},
|
||||||
{ "halGetCarrierFrequencies", "()[I", (void *)halGetCarrierFrequencies},
|
{"halGetCarrierFrequencies", "()[I", (void *)halGetCarrierFrequencies},
|
||||||
};
|
};
|
||||||
|
|
||||||
int register_android_server_ConsumerIrService(JNIEnv *env) {
|
int register_android_server_ConsumerIrService(JNIEnv *env) {
|
||||||
|
|||||||
Reference in New Issue
Block a user