diff options
| author | 2017-06-26 20:58:41 +0000 | |
|---|---|---|
| committer | 2017-06-26 20:58:52 +0000 | |
| commit | 319f81c83c75b8c313fc4d3ede500ec3f5a78a0d (patch) | |
| tree | 8dae21377ad87e52222acec08318ee97bb2e5bd1 | |
| parent | aea1444d59fea3f6e50a14803d0bcfd17a872fbb (diff) | |
| parent | 4bd958353e70b3a80f3ea85aa13576396eaa1bd2 (diff) | |
Merge "Remove previous implementation of RadioService."
| -rw-r--r-- | core/java/android/hardware/radio/RadioModule.java | 234 | ||||
| -rw-r--r-- | core/jni/Android.bp | 3 | ||||
| -rw-r--r-- | core/jni/AndroidRuntime.cpp | 2 | ||||
| -rw-r--r-- | core/jni/android_hardware_Radio.cpp | 969 |
4 files changed, 0 insertions, 1208 deletions
diff --git a/core/java/android/hardware/radio/RadioModule.java b/core/java/android/hardware/radio/RadioModule.java deleted file mode 100644 index c0df0f386b09..000000000000 --- a/core/java/android/hardware/radio/RadioModule.java +++ /dev/null @@ -1,234 +0,0 @@ -/* - * Copyright (C) 2015 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package android.hardware.radio; - -import android.annotation.NonNull; -import android.annotation.Nullable; -import android.annotation.SystemApi; -import android.content.Context; -import android.content.Intent; -import android.os.Handler; -import android.os.Looper; -import android.os.Message; -import java.lang.ref.WeakReference; -import java.util.List; -import java.util.UUID; - -/** - * A RadioModule implements the RadioTuner interface for a broadcast radio tuner physically - * present on the device and exposed by the radio HAL. - * - * @hide - */ -public class RadioModule extends RadioTuner { - private long mNativeContext = 0; - private int mId; - private NativeEventHandlerDelegate mEventHandlerDelegate; - - RadioModule(int moduleId, RadioManager.BandConfig config, boolean withAudio, - RadioTuner.Callback callback, Handler handler) { - mId = moduleId; - mEventHandlerDelegate = new NativeEventHandlerDelegate(callback, handler); - native_setup(new WeakReference<RadioModule>(this), config, withAudio); - } - private native void native_setup(Object module_this, - RadioManager.BandConfig config, boolean withAudio); - - @Override - protected void finalize() { - native_finalize(); - } - private native void native_finalize(); - - boolean initCheck() { - return mNativeContext != 0; - } - - // RadioTuner implementation - public native void close(); - - public native int setConfiguration(RadioManager.BandConfig config); - - public native int getConfiguration(RadioManager.BandConfig[] config); - - public native int setMute(boolean mute); - - public native boolean getMute(); - - public native int step(int direction, boolean skipSubChannel); - - public native int scan(int direction, boolean skipSubChannel); - - public native int tune(int channel, int subChannel); - - public native int cancel(); - - public native int getProgramInformation(RadioManager.ProgramInfo[] info); - - public native boolean startBackgroundScan(); - - public native @NonNull List<RadioManager.ProgramInfo> getProgramList(@Nullable String filter); - - public native boolean isAnalogForced(); - - public native void setAnalogForced(boolean isForced); - - public native boolean isAntennaConnected(); - - public native boolean hasControl(); - - - /* keep in sync with radio_event_type_t in system/core/include/system/radio.h */ - static final int EVENT_HW_FAILURE = 0; - static final int EVENT_CONFIG = 1; - static final int EVENT_ANTENNA = 2; - static final int EVENT_TUNED = 3; - static final int EVENT_METADATA = 4; - static final int EVENT_TA = 5; - static final int EVENT_AF_SWITCH = 6; - static final int EVENT_EA = 7; - static final int EVENT_CONTROL = 100; - static final int EVENT_SERVER_DIED = 101; - - private class NativeEventHandlerDelegate { - private final Handler mHandler; - - NativeEventHandlerDelegate(final RadioTuner.Callback callback, - Handler handler) { - // find the looper for our new event handler - Looper looper; - if (handler != null) { - looper = handler.getLooper(); - } else { - looper = Looper.getMainLooper(); - } - - // construct the event handler with this looper - if (looper != null) { - // implement the event handler delegate - mHandler = new Handler(looper) { - @Override - public void handleMessage(Message msg) { - switch (msg.what) { - case EVENT_HW_FAILURE: - if (callback != null) { - callback.onError(RadioTuner.ERROR_HARDWARE_FAILURE); - } - break; - case EVENT_CONFIG: { - RadioManager.BandConfig config = (RadioManager.BandConfig)msg.obj; - switch(msg.arg1) { - case RadioManager.STATUS_OK: - if (callback != null) { - callback.onConfigurationChanged(config); - } - break; - default: - if (callback != null) { - callback.onError(RadioTuner.ERROR_CONFIG); - } - break; - } - } break; - case EVENT_ANTENNA: - if (callback != null) { - callback.onAntennaState(msg.arg2 == 1); - } - break; - case EVENT_AF_SWITCH: - case EVENT_TUNED: { - RadioManager.ProgramInfo info = (RadioManager.ProgramInfo)msg.obj; - switch (msg.arg1) { - case RadioManager.STATUS_OK: - if (callback != null) { - callback.onProgramInfoChanged(info); - } - break; - case RadioManager.STATUS_TIMED_OUT: - if (callback != null) { - callback.onError(RadioTuner.ERROR_SCAN_TIMEOUT); - } - break; - case RadioManager.STATUS_INVALID_OPERATION: - default: - if (callback != null) { - callback.onError(RadioTuner.ERROR_CANCELLED); - } - break; - } - } break; - case EVENT_METADATA: { - RadioMetadata metadata = (RadioMetadata)msg.obj; - if (callback != null) { - callback.onMetadataChanged(metadata); - } - } break; - case EVENT_TA: - if (callback != null) { - callback.onTrafficAnnouncement(msg.arg2 == 1); - } - break; - case EVENT_EA: - if (callback != null) { - callback.onEmergencyAnnouncement(msg.arg2 == 1); - } - case EVENT_CONTROL: - if (callback != null) { - callback.onControlChanged(msg.arg2 == 1); - } - break; - case EVENT_SERVER_DIED: - if (callback != null) { - callback.onError(RadioTuner.ERROR_SERVER_DIED); - } - break; - default: - // Should not happen - break; - } - } - }; - } else { - mHandler = null; - } - } - - Handler handler() { - return mHandler; - } - } - - - @SuppressWarnings("unused") - private static void postEventFromNative(Object module_ref, - int what, int arg1, int arg2, Object obj) { - RadioModule module = (RadioModule)((WeakReference)module_ref).get(); - if (module == null) { - return; - } - - NativeEventHandlerDelegate delegate = module.mEventHandlerDelegate; - if (delegate != null) { - Handler handler = delegate.handler(); - if (handler != null) { - Message m = handler.obtainMessage(what, arg1, arg2, obj); - handler.sendMessage(m); - } - } - } -} - diff --git a/core/jni/Android.bp b/core/jni/Android.bp index c5279e10d93f..51851690c08d 100644 --- a/core/jni/Android.bp +++ b/core/jni/Android.bp @@ -162,7 +162,6 @@ cc_library_shared { "android_hardware_camera2_DngCreator.cpp", "android_hardware_display_DisplayViewport.cpp", "android_hardware_HardwareBuffer.cpp", - "android_hardware_Radio.cpp", "android_hardware_SensorManager.cpp", "android_hardware_SerialPort.cpp", "android_hardware_SoundTrigger.cpp", @@ -258,12 +257,10 @@ cc_library_shared { "libpdfium", "libimg_utils", "libnetd_client", - "libradio", "libsoundtrigger", "libminikin", "libprocessgroup", "libnativebridge", - "libradio_metadata", "libnativeloader", "libmemunreachable", "libhidlbase", diff --git a/core/jni/AndroidRuntime.cpp b/core/jni/AndroidRuntime.cpp index 659f47debaf1..92bc16055931 100644 --- a/core/jni/AndroidRuntime.cpp +++ b/core/jni/AndroidRuntime.cpp @@ -88,7 +88,6 @@ extern int register_android_hardware_camera2_legacy_LegacyCameraDevice(JNIEnv *e extern int register_android_hardware_camera2_legacy_PerfMeasurement(JNIEnv *env); extern int register_android_hardware_camera2_DngCreator(JNIEnv *env); extern int register_android_hardware_HardwareBuffer(JNIEnv *env); -extern int register_android_hardware_Radio(JNIEnv *env); extern int register_android_hardware_SensorManager(JNIEnv *env); extern int register_android_hardware_SerialPort(JNIEnv *env); extern int register_android_hardware_SoundTrigger(JNIEnv *env); @@ -1402,7 +1401,6 @@ static const RegJNIRec gRegJNI[] = { REG_JNI(register_android_hardware_camera2_legacy_PerfMeasurement), REG_JNI(register_android_hardware_camera2_DngCreator), REG_JNI(register_android_hardware_HardwareBuffer), - REG_JNI(register_android_hardware_Radio), REG_JNI(register_android_hardware_SensorManager), REG_JNI(register_android_hardware_SerialPort), REG_JNI(register_android_hardware_SoundTrigger), diff --git a/core/jni/android_hardware_Radio.cpp b/core/jni/android_hardware_Radio.cpp deleted file mode 100644 index 8b9be68bf712..000000000000 --- a/core/jni/android_hardware_Radio.cpp +++ /dev/null @@ -1,969 +0,0 @@ -/* -** -** Copyright 2015, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - -#define LOG_NDEBUG 1 -#define LOG_TAG "Radio-JNI" -#include <utils/Log.h> - -#include "jni.h" -#include "JNIHelp.h" -#include "core_jni_helpers.h" -#include <system/radio.h> -#include <system/RadioMetadataWrapper.h> -#include <radio/RadioCallback.h> -#include <radio/Radio.h> -#include <utils/RefBase.h> -#include <utils/Vector.h> -#include <binder/IMemory.h> -#include <binder/MemoryDealer.h> - -using namespace android; - -static jclass gArrayListClass; -static struct { - jmethodID add; -} gArrayListMethods; - -static const char* const kRadioManagerClassPathName = "android/hardware/radio/RadioManager"; -static jclass gRadioManagerClass; - -static const char* const kRadioModuleClassPathName = "android/hardware/radio/RadioModule"; -static jclass gRadioModuleClass; -static struct { - jfieldID mNativeContext; - jfieldID mId; -} gModuleFields; -static jmethodID gPostEventFromNative; - -static const char* const kModulePropertiesClassPathName = - "android/hardware/radio/RadioManager$ModuleProperties"; -static jclass gModulePropertiesClass; -static jmethodID gModulePropertiesCstor; - - -static const char* const kRadioBandDescriptorClassPathName = - "android/hardware/radio/RadioManager$BandDescriptor"; -static jclass gRadioBandDescriptorClass; -static struct { - jfieldID mRegion; - jfieldID mType; - jfieldID mLowerLimit; - jfieldID mUpperLimit; - jfieldID mSpacing; -} gRadioBandDescriptorFields; - -static const char* const kRadioFmBandDescriptorClassPathName = - "android/hardware/radio/RadioManager$FmBandDescriptor"; -static jclass gRadioFmBandDescriptorClass; -static jmethodID gRadioFmBandDescriptorCstor; - -static const char* const kRadioAmBandDescriptorClassPathName = - "android/hardware/radio/RadioManager$AmBandDescriptor"; -static jclass gRadioAmBandDescriptorClass; -static jmethodID gRadioAmBandDescriptorCstor; - -static const char* const kRadioBandConfigClassPathName = - "android/hardware/radio/RadioManager$BandConfig"; -static jclass gRadioBandConfigClass; -static struct { - jfieldID mDescriptor; -} gRadioBandConfigFields; - - -static const char* const kRadioFmBandConfigClassPathName = - "android/hardware/radio/RadioManager$FmBandConfig"; -static jclass gRadioFmBandConfigClass; -static jmethodID gRadioFmBandConfigCstor; -static struct { - jfieldID mStereo; - jfieldID mRds; - jfieldID mTa; - jfieldID mAf; - jfieldID mEa; -} gRadioFmBandConfigFields; - -static const char* const kRadioAmBandConfigClassPathName = - "android/hardware/radio/RadioManager$AmBandConfig"; -static jclass gRadioAmBandConfigClass; -static jmethodID gRadioAmBandConfigCstor; -static struct { - jfieldID mStereo; -} gRadioAmBandConfigFields; - - -static const char* const kRadioProgramInfoClassPathName = - "android/hardware/radio/RadioManager$ProgramInfo"; -static jclass gRadioProgramInfoClass; -static jmethodID gRadioProgramInfoCstor; - -static const char* const kRadioMetadataClassPathName = - "android/hardware/radio/RadioMetadata"; -static jclass gRadioMetadataClass; -static jmethodID gRadioMetadataCstor; -static struct { - jmethodID putIntFromNative; - jmethodID putStringFromNative; - jmethodID putBitmapFromNative; - jmethodID putClockFromNative; -} gRadioMetadataMethods; - -static Mutex gLock; - -enum { - RADIO_STATUS_OK = 0, - RADIO_STATUS_ERROR = INT_MIN, - RADIO_PERMISSION_DENIED = -1, - RADIO_STATUS_NO_INIT = -19, - RADIO_STATUS_BAD_VALUE = -22, - RADIO_STATUS_DEAD_OBJECT = -32, - RADIO_STATUS_INVALID_OPERATION = -38, - RADIO_STATUS_TIMED_OUT = -110, -}; - - -// ---------------------------------------------------------------------------- - -static sp<Radio> getRadio(JNIEnv* env, jobject thiz) -{ - Mutex::Autolock l(gLock); - Radio* const radio = (Radio*)env->GetLongField(thiz, gModuleFields.mNativeContext); - return sp<Radio>(radio); -} - -static sp<Radio> setRadio(JNIEnv* env, jobject thiz, const sp<Radio>& module) -{ - Mutex::Autolock l(gLock); - sp<Radio> old = (Radio*)env->GetLongField(thiz, gModuleFields.mNativeContext); - if (module.get()) { - module->incStrong((void*)setRadio); - } - if (old != 0) { - old->decStrong((void*)setRadio); - } - env->SetLongField(thiz, gModuleFields.mNativeContext, (jlong)module.get()); - return old; -} - -static jint convertBandDescriptorFromNative(JNIEnv *env, - jobject *jBandDescriptor, - const radio_band_config_t *nBandconfig) -{ - ALOGV("%s type %d region %d", __FUNCTION__, nBandconfig->band.type, nBandconfig->region); - - if (nBandconfig->band.type == RADIO_BAND_FM || - nBandconfig->band.type == RADIO_BAND_FM_HD) { - *jBandDescriptor = env->NewObject(gRadioFmBandDescriptorClass, gRadioFmBandDescriptorCstor, - nBandconfig->region, nBandconfig->band.type, - nBandconfig->band.lower_limit, nBandconfig->band.upper_limit, - nBandconfig->band.spacings[0], - nBandconfig->band.fm.stereo, - nBandconfig->band.fm.rds != RADIO_RDS_NONE, - nBandconfig->band.fm.ta, - nBandconfig->band.fm.af, - nBandconfig->band.fm.ea); - } else if (nBandconfig->band.type == RADIO_BAND_AM) { - *jBandDescriptor = env->NewObject(gRadioAmBandDescriptorClass, gRadioAmBandDescriptorCstor, - nBandconfig->region, nBandconfig->band.type, - nBandconfig->band.lower_limit, nBandconfig->band.upper_limit, - nBandconfig->band.spacings[0], - nBandconfig->band.am.stereo); - } else { - ALOGE("%s unknown band type %d", __FUNCTION__, nBandconfig->band.type); - return (jint)RADIO_STATUS_BAD_VALUE; - } - - if (*jBandDescriptor == NULL) { - return (jint)RADIO_STATUS_NO_INIT; - } - - return (jint)RADIO_STATUS_OK; -} - -static jint convertBandConfigFromNative(JNIEnv *env, - jobject *jBandConfig, - const radio_band_config_t *nBandconfig) -{ - ALOGV("%s type %d region %d", __FUNCTION__, nBandconfig->band.type, nBandconfig->region); - - if (nBandconfig->band.type == RADIO_BAND_FM || - nBandconfig->band.type == RADIO_BAND_FM_HD) { - *jBandConfig = env->NewObject(gRadioFmBandConfigClass, gRadioFmBandConfigCstor, - nBandconfig->region, nBandconfig->band.type, - nBandconfig->band.lower_limit, nBandconfig->band.upper_limit, - nBandconfig->band.spacings[0], - nBandconfig->band.fm.stereo, - nBandconfig->band.fm.rds != RADIO_RDS_NONE, - nBandconfig->band.fm.ta, - nBandconfig->band.fm.af, - nBandconfig->band.fm.ea); - } else if (nBandconfig->band.type == RADIO_BAND_AM) { - *jBandConfig = env->NewObject(gRadioAmBandConfigClass, gRadioAmBandConfigCstor, - nBandconfig->region, nBandconfig->band.type, - nBandconfig->band.lower_limit, nBandconfig->band.upper_limit, - nBandconfig->band.spacings[0], - nBandconfig->band.am.stereo); - } else { - ALOGE("%s unknown band type %d", __FUNCTION__, nBandconfig->band.type); - return (jint)RADIO_STATUS_BAD_VALUE; - } - - if (*jBandConfig == NULL) { - return (jint)RADIO_STATUS_NO_INIT; - } - - return (jint)RADIO_STATUS_OK; -} - -static jint convertMetadataFromNative(JNIEnv *env, - jobject *jMetadata, - const radio_metadata_t *nMetadata) -{ - ALOGV("%s", __FUNCTION__); - int count = radio_metadata_get_count(nMetadata); - if (count <= 0) { - return (jint)count; - } - *jMetadata = env->NewObject(gRadioMetadataClass, gRadioMetadataCstor); - - jint jCount = 0; - jint jStatus = 0; - for (unsigned int i = 0; i < (unsigned int)count; i++) { - radio_metadata_key_t key; - radio_metadata_type_t type; - void *value; - size_t size; - if (radio_metadata_get_at_index(nMetadata, i , &key, &type, &value, &size) != 0) { - continue; - } - switch (type) { - case RADIO_METADATA_TYPE_INT: { - ALOGV("%s RADIO_METADATA_TYPE_INT %d", __FUNCTION__, key); - int32_t val = *(int32_t *)value; - jStatus = env->CallIntMethod(*jMetadata, - gRadioMetadataMethods.putIntFromNative, - key, (jint)val); - if (jStatus == 0) { - jCount++; - } - } break; - case RADIO_METADATA_TYPE_TEXT: { - ALOGV("%s RADIO_METADATA_TYPE_TEXT %d", __FUNCTION__, key); - jstring jText = env->NewStringUTF((char *)value); - jStatus = env->CallIntMethod(*jMetadata, - gRadioMetadataMethods.putStringFromNative, - key, jText); - if (jStatus == 0) { - jCount++; - } - env->DeleteLocalRef(jText); - } break; - case RADIO_METADATA_TYPE_RAW: { - ALOGV("%s RADIO_METADATA_TYPE_RAW %d size %zu", __FUNCTION__, key, size); - if (size == 0) { - break; - } - jbyteArray jData = env->NewByteArray(size); - if (jData == NULL) { - break; - } - env->SetByteArrayRegion(jData, 0, size, (jbyte *)value); - jStatus = env->CallIntMethod(*jMetadata, - gRadioMetadataMethods.putBitmapFromNative, - key, jData); - if (jStatus == 0) { - jCount++; - } - env->DeleteLocalRef(jData); - } break; - case RADIO_METADATA_TYPE_CLOCK: { - ALOGV("%s RADIO_METADATA_TYPE_CLOCK %d", __FUNCTION__, key); - radio_metadata_clock_t *clock = (radio_metadata_clock_t *) value; - jStatus = - env->CallIntMethod(*jMetadata, - gRadioMetadataMethods.putClockFromNative, - key, (jint) clock->utc_seconds_since_epoch, - (jint) clock->timezone_offset_in_minutes); - if (jStatus == 0) { - jCount++; - } - } break; - } - } - return jCount; -} - -static jint convertProgramInfoFromNative(JNIEnv *env, - jobject *jProgramInfo, - const radio_program_info_t *nProgramInfo) -{ - ALOGV("%s", __FUNCTION__); - int jStatus; - jobject jMetadata = NULL; - - if (nProgramInfo == nullptr || nProgramInfo->metadata == nullptr) { - return (jint)RADIO_STATUS_BAD_VALUE; - } - - jStatus = convertMetadataFromNative(env, &jMetadata, nProgramInfo->metadata); - if (jStatus < 0) { - return jStatus; - } - - ALOGV("%s channel %d tuned %d", __FUNCTION__, nProgramInfo->channel, nProgramInfo->tuned); - - int flags = 0; // TODO(b/32621193): pass from the HAL - jstring jVendorExension = env->NewStringUTF(""); // TODO(b/32621193): pass from the HAL - *jProgramInfo = env->NewObject(gRadioProgramInfoClass, gRadioProgramInfoCstor, - nProgramInfo->channel, nProgramInfo->sub_channel, - nProgramInfo->tuned, nProgramInfo->stereo, - nProgramInfo->digital, nProgramInfo->signal_strength, - jMetadata, flags, jVendorExension); - - env->DeleteLocalRef(jMetadata); - env->DeleteLocalRef(jVendorExension); - return (jint)RADIO_STATUS_OK; -} - - -static jint convertBandConfigToNative(JNIEnv *env, - radio_band_config_t *nBandconfig, - jobject jBandConfig) -{ - ALOGV("%s", __FUNCTION__); - - jobject jDescriptor = env->GetObjectField(jBandConfig, gRadioBandConfigFields.mDescriptor); - - if (jDescriptor == NULL) { - return (jint)RADIO_STATUS_NO_INIT; - } - - nBandconfig->region = - (radio_region_t)env->GetIntField(jDescriptor, gRadioBandDescriptorFields.mRegion); - nBandconfig->band.type = - (radio_band_t)env->GetIntField(jDescriptor, gRadioBandDescriptorFields.mType); - nBandconfig->band.lower_limit = - env->GetIntField(jDescriptor, gRadioBandDescriptorFields.mLowerLimit); - nBandconfig->band.upper_limit = - env->GetIntField(jDescriptor, gRadioBandDescriptorFields.mUpperLimit); - nBandconfig->band.num_spacings = 1; - nBandconfig->band.spacings[0] = - env->GetIntField(jDescriptor, gRadioBandDescriptorFields.mSpacing); - - if (env->IsInstanceOf(jBandConfig, gRadioFmBandConfigClass)) { - nBandconfig->band.fm.deemphasis = radio_demephasis_for_region(nBandconfig->region); - nBandconfig->band.fm.stereo = - env->GetBooleanField(jBandConfig, gRadioFmBandConfigFields.mStereo); - nBandconfig->band.fm.rds = - radio_rds_for_region(env->GetBooleanField(jBandConfig, - gRadioFmBandConfigFields.mRds), - nBandconfig->region); - nBandconfig->band.fm.ta = env->GetBooleanField(jBandConfig, gRadioFmBandConfigFields.mTa); - nBandconfig->band.fm.af = env->GetBooleanField(jBandConfig, gRadioFmBandConfigFields.mAf); - nBandconfig->band.fm.ea = env->GetBooleanField(jBandConfig, gRadioFmBandConfigFields.mEa); - } else if (env->IsInstanceOf(jBandConfig, gRadioAmBandConfigClass)) { - nBandconfig->band.am.stereo = - env->GetBooleanField(jBandConfig, gRadioAmBandConfigFields.mStereo); - } else { - return (jint)RADIO_STATUS_BAD_VALUE; - } - - return (jint)RADIO_STATUS_OK; -} - -static jint -android_hardware_Radio_listModules(JNIEnv *env, jobject clazz, - jobject jModules) -{ - ALOGV("%s", __FUNCTION__); - - if (jModules == NULL) { - ALOGE("listModules NULL ArrayList"); - return RADIO_STATUS_BAD_VALUE; - } - if (!env->IsInstanceOf(jModules, gArrayListClass)) { - ALOGE("listModules not an arraylist"); - return RADIO_STATUS_BAD_VALUE; - } - - unsigned int numModules = 0; - radio_properties_t *nModules = NULL; - - status_t status = Radio::listModules(nModules, &numModules); - if (status != NO_ERROR || numModules == 0) { - return (jint)status; - } - - nModules = (radio_properties_t *)calloc(numModules, sizeof(radio_properties_t)); - - status = Radio::listModules(nModules, &numModules); - ALOGV("%s Radio::listModules status %d numModules %d", __FUNCTION__, status, numModules); - - if (status != NO_ERROR) { - numModules = 0; - } - - for (size_t i = 0; i < numModules; i++) { - if (nModules[i].num_bands == 0) { - continue; - } - ALOGV("%s module %zu id %d implementor %s product %s", - __FUNCTION__, i, nModules[i].handle, nModules[i].implementor, - nModules[i].product); - - - jobjectArray jBands = env->NewObjectArray(nModules[i].num_bands, - gRadioBandDescriptorClass, NULL); - - for (size_t j = 0; j < nModules[i].num_bands; j++) { - jobject jBandDescriptor; - int jStatus = - convertBandDescriptorFromNative(env, &jBandDescriptor, &nModules[i].bands[j]); - if (jStatus != RADIO_STATUS_OK) { - continue; - } - env->SetObjectArrayElement(jBands, j, jBandDescriptor); - env->DeleteLocalRef(jBandDescriptor); - } - - if (env->GetArrayLength(jBands) == 0) { - continue; - } - jstring jImplementor = env->NewStringUTF(nModules[i].implementor); - jstring jProduct = env->NewStringUTF(nModules[i].product); - jstring jVersion = env->NewStringUTF(nModules[i].version); - jstring jSerial = env->NewStringUTF(nModules[i].serial); - bool isBgscanSupported = false; // TODO(b/32621193): pass from the HAL - jstring jVendorExension = env->NewStringUTF(""); // TODO(b/32621193): pass from the HAL - jobject jModule = env->NewObject(gModulePropertiesClass, gModulePropertiesCstor, - nModules[i].handle, nullptr, nModules[i].class_id, - jImplementor, jProduct, jVersion, jSerial, - nModules[i].num_tuners, - nModules[i].num_audio_sources, - nModules[i].supports_capture, - jBands, isBgscanSupported, jVendorExension); - - env->DeleteLocalRef(jImplementor); - env->DeleteLocalRef(jProduct); - env->DeleteLocalRef(jVersion); - env->DeleteLocalRef(jSerial); - env->DeleteLocalRef(jBands); - env->DeleteLocalRef(jVendorExension); - if (jModule == NULL) { - continue; - } - env->CallBooleanMethod(jModules, gArrayListMethods.add, jModule); - } - - free(nModules); - return (jint) status; -} - -// ---------------------------------------------------------------------------- - -class JNIRadioCallback: public RadioCallback -{ -public: - JNIRadioCallback(JNIEnv* env, jobject thiz, jobject weak_thiz); - ~JNIRadioCallback(); - - virtual void onEvent(struct radio_event *event); - -private: - jclass mClass; // Reference to Radio class - jobject mObject; // Weak ref to Radio Java object to call on -}; - -JNIRadioCallback::JNIRadioCallback(JNIEnv* env, jobject thiz, jobject weak_thiz) -{ - - // Hold onto the RadioModule class for use in calling the static method - // that posts events to the application thread. - jclass clazz = env->GetObjectClass(thiz); - if (clazz == NULL) { - ALOGE("Can't find class %s", kRadioModuleClassPathName); - return; - } - mClass = (jclass)env->NewGlobalRef(clazz); - - // We use a weak reference so the RadioModule object can be garbage collected. - // The reference is only used as a proxy for callbacks. - mObject = env->NewGlobalRef(weak_thiz); -} - -JNIRadioCallback::~JNIRadioCallback() -{ - // remove global references - JNIEnv *env = AndroidRuntime::getJNIEnv(); - if (env == NULL) { - return; - } - env->DeleteGlobalRef(mObject); - env->DeleteGlobalRef(mClass); -} - -void JNIRadioCallback::onEvent(struct radio_event *event) -{ - JNIEnv *env = AndroidRuntime::getJNIEnv(); - if (env == NULL) { - return; - } - - ALOGV("%s", __FUNCTION__); - - jobject jObj = NULL; - jint jArg2 = 0; - jint jStatus = RADIO_STATUS_OK; - switch (event->type) { - case RADIO_EVENT_CONFIG: - jStatus = convertBandConfigFromNative(env, &jObj, &event->config); - break; - case RADIO_EVENT_TUNED: - case RADIO_EVENT_AF_SWITCH: - ALOGV("%s RADIO_EVENT_TUNED channel %d", __FUNCTION__, event->info.channel); - jStatus = convertProgramInfoFromNative(env, &jObj, &event->info); - break; - case RADIO_EVENT_METADATA: - jStatus = convertMetadataFromNative(env, &jObj, event->metadata); - if (jStatus >= 0) { - jStatus = RADIO_STATUS_OK; - } - break; - case RADIO_EVENT_ANTENNA: - case RADIO_EVENT_TA: - case RADIO_EVENT_EA: - case RADIO_EVENT_CONTROL: - jArg2 = event->on ? 1 : 0; - break; - } - - if (jStatus != RADIO_STATUS_OK) { - return; - } - env->CallStaticVoidMethod(mClass, gPostEventFromNative, mObject, - event->type, event->status, jArg2, jObj); - - env->DeleteLocalRef(jObj); - if (env->ExceptionCheck()) { - ALOGW("An exception occurred while notifying an event."); - env->ExceptionClear(); - } -} - -// ---------------------------------------------------------------------------- - -static void -android_hardware_Radio_setup(JNIEnv *env, jobject thiz, - jobject weak_this, jobject jConfig, jboolean withAudio) -{ - ALOGV("%s", __FUNCTION__); - - setRadio(env, thiz, 0); - - sp<JNIRadioCallback> callback = new JNIRadioCallback(env, thiz, weak_this); - - radio_handle_t handle = (radio_handle_t)env->GetIntField(thiz, gModuleFields.mId); - - struct radio_band_config nConfig; - struct radio_band_config *configPtr = NULL; - if (jConfig != NULL) { - jint jStatus = convertBandConfigToNative(env, &nConfig, jConfig); - if (jStatus != RADIO_STATUS_OK) { - return; - } - configPtr = &nConfig; - } - sp<Radio> module = Radio::attach(handle, configPtr, (bool)withAudio, callback); - if (module == 0) { - return; - } - - setRadio(env, thiz, module); -} - -static void -android_hardware_Radio_close(JNIEnv *env, jobject thiz) -{ - ALOGV("%s", __FUNCTION__); - sp<Radio> module = setRadio(env, thiz, 0); - ALOGV("detach module %p", module.get()); - if (module != 0) { - ALOGV("detach module->detach()"); - module->detach(); - } -} - -static void -android_hardware_Radio_finalize(JNIEnv *env, jobject thiz) -{ - ALOGV("%s", __FUNCTION__); - sp<Radio> module = getRadio(env, thiz); - if (module != 0) { - ALOGW("Radio finalized without being detached"); - } - android_hardware_Radio_close(env, thiz); -} - -static jint -android_hardware_Radio_setConfiguration(JNIEnv *env, jobject thiz, jobject jConfig) -{ - ALOGV("%s", __FUNCTION__); - sp<Radio> module = getRadio(env, thiz); - if (module == NULL) { - return RADIO_STATUS_NO_INIT; - } - - if (!env->IsInstanceOf(jConfig, gRadioFmBandConfigClass) && - !env->IsInstanceOf(jConfig, gRadioAmBandConfigClass)) { - return RADIO_STATUS_BAD_VALUE; - } - - struct radio_band_config nConfig; - jint jStatus = convertBandConfigToNative(env, &nConfig, jConfig); - if (jStatus != RADIO_STATUS_OK) { - return jStatus; - } - - status_t status = module->setConfiguration(&nConfig); - return (jint)status; -} - -static jint -android_hardware_Radio_getConfiguration(JNIEnv *env, jobject thiz, jobjectArray jConfigs) -{ - ALOGV("%s", __FUNCTION__); - sp<Radio> module = getRadio(env, thiz); - if (module == NULL) { - return RADIO_STATUS_NO_INIT; - } - if (env->GetArrayLength(jConfigs) != 1) { - return (jint)RADIO_STATUS_BAD_VALUE; - } - - struct radio_band_config nConfig; - - status_t status = module->getConfiguration(&nConfig); - if (status != NO_ERROR) { - return (jint)status; - } - jobject jConfig; - int jStatus = convertBandConfigFromNative(env, &jConfig, &nConfig); - if (jStatus != RADIO_STATUS_OK) { - return jStatus; - } - env->SetObjectArrayElement(jConfigs, 0, jConfig); - env->DeleteLocalRef(jConfig); - return RADIO_STATUS_OK; -} - -static jint -android_hardware_Radio_setMute(JNIEnv *env, jobject thiz, jboolean mute) -{ - ALOGV("%s", __FUNCTION__); - sp<Radio> module = getRadio(env, thiz); - if (module == NULL) { - return RADIO_STATUS_NO_INIT; - } - status_t status = module->setMute((bool)mute); - return (jint)status; -} - -static jboolean -android_hardware_Radio_getMute(JNIEnv *env, jobject thiz) -{ - ALOGV("%s", __FUNCTION__); - sp<Radio> module = getRadio(env, thiz); - if (module == NULL) { - return true; - } - bool mute = true; - status_t status = module->getMute(&mute); - if (status != NO_ERROR) { - return true; - } - return (jboolean)mute; -} - -static jint -android_hardware_Radio_step(JNIEnv *env, jobject thiz, jint direction, jboolean skipSubChannel) -{ - ALOGV("%s", __FUNCTION__); - sp<Radio> module = getRadio(env, thiz); - if (module == NULL) { - return RADIO_STATUS_NO_INIT; - } - status_t status = module->step((radio_direction_t)direction, (bool)skipSubChannel); - return (jint)status; -} - -static jint -android_hardware_Radio_scan(JNIEnv *env, jobject thiz, jint direction, jboolean skipSubChannel) -{ - ALOGV("%s", __FUNCTION__); - sp<Radio> module = getRadio(env, thiz); - if (module == NULL) { - return RADIO_STATUS_NO_INIT; - } - status_t status = module->scan((radio_direction_t)direction, (bool)skipSubChannel); - return (jint)status; -} - -static jint -android_hardware_Radio_tune(JNIEnv *env, jobject thiz, jint channel, jint subChannel) -{ - ALOGV("%s", __FUNCTION__); - sp<Radio> module = getRadio(env, thiz); - if (module == NULL) { - return RADIO_STATUS_NO_INIT; - } - status_t status = module->tune((uint32_t)channel, (uint32_t)subChannel); - return (jint)status; -} - -static jint -android_hardware_Radio_cancel(JNIEnv *env, jobject thiz) -{ - ALOGV("%s", __FUNCTION__); - sp<Radio> module = getRadio(env, thiz); - if (module == NULL) { - return RADIO_STATUS_NO_INIT; - } - status_t status = module->cancel(); - return (jint)status; -} - -static jint -android_hardware_Radio_getProgramInformation(JNIEnv *env, jobject thiz, jobjectArray jInfos) -{ - ALOGV("%s", __FUNCTION__); - sp<Radio> module = getRadio(env, thiz); - if (module == NULL) { - return RADIO_STATUS_NO_INIT; - } - if (env->GetArrayLength(jInfos) != 1) { - return (jint)RADIO_STATUS_BAD_VALUE; - } - - struct radio_program_info nInfo; - RadioMetadataWrapper metadataWrapper(&nInfo.metadata); - jobject jInfo = NULL; - int jStatus; - - jStatus = (int)module->getProgramInformation(&nInfo); - if (jStatus != RADIO_STATUS_OK) { - goto exit; - } - jStatus = convertProgramInfoFromNative(env, &jInfo, &nInfo); - if (jStatus != RADIO_STATUS_OK) { - goto exit; - } - env->SetObjectArrayElement(jInfos, 0, jInfo); - -exit: - if (jInfo != NULL) { - env->DeleteLocalRef(jInfo); - } - return jStatus; -} - -static jboolean -android_hardware_Radio_isAntennaConnected(JNIEnv *env, jobject thiz) -{ - ALOGV("%s", __FUNCTION__); - sp<Radio> module = getRadio(env, thiz); - if (module == NULL) { - return false; - } - - struct radio_band_config nConfig; - - status_t status = module->getConfiguration(&nConfig); - if (status != NO_ERROR) { - return false; - } - - return (jboolean)nConfig.band.antenna_connected; -} - - -static jboolean -android_hardware_Radio_hasControl(JNIEnv *env, jobject thiz) -{ - ALOGV("%s", __FUNCTION__); - sp<Radio> module = getRadio(env, thiz); - if (module == NULL) { - return false; - } - - bool hasControl; - status_t status = module->hasControl(&hasControl); - if (status != NO_ERROR) { - return false; - } - - return (jboolean)hasControl; -} - - -static JNINativeMethod gMethods[] = { - {"nativeListModules", - "(Ljava/util/List;)I", - (void *)android_hardware_Radio_listModules}, -}; - -static JNINativeMethod gModuleMethods[] = { - {"native_setup", - "(Ljava/lang/Object;Landroid/hardware/radio/RadioManager$BandConfig;Z)V", - (void *)android_hardware_Radio_setup}, - {"native_finalize", - "()V", - (void *)android_hardware_Radio_finalize}, - {"close", - "()V", - (void *)android_hardware_Radio_close}, - {"setConfiguration", - "(Landroid/hardware/radio/RadioManager$BandConfig;)I", - (void *)android_hardware_Radio_setConfiguration}, - {"getConfiguration", - "([Landroid/hardware/radio/RadioManager$BandConfig;)I", - (void *)android_hardware_Radio_getConfiguration}, - {"setMute", - "(Z)I", - (void *)android_hardware_Radio_setMute}, - {"getMute", - "()Z", - (void *)android_hardware_Radio_getMute}, - {"step", - "(IZ)I", - (void *)android_hardware_Radio_step}, - {"scan", - "(IZ)I", - (void *)android_hardware_Radio_scan}, - {"tune", - "(II)I", - (void *)android_hardware_Radio_tune}, - {"cancel", - "()I", - (void *)android_hardware_Radio_cancel}, - {"getProgramInformation", - "([Landroid/hardware/radio/RadioManager$ProgramInfo;)I", - (void *)android_hardware_Radio_getProgramInformation}, - {"isAntennaConnected", - "()Z", - (void *)android_hardware_Radio_isAntennaConnected}, - {"hasControl", - "()Z", - (void *)android_hardware_Radio_hasControl}, -}; - -int register_android_hardware_Radio(JNIEnv *env) -{ - jclass arrayListClass = FindClassOrDie(env, "java/util/ArrayList"); - gArrayListClass = MakeGlobalRefOrDie(env, arrayListClass); - gArrayListMethods.add = GetMethodIDOrDie(env, arrayListClass, "add", "(Ljava/lang/Object;)Z"); - - jclass lClass = FindClassOrDie(env, kRadioManagerClassPathName); - gRadioManagerClass = MakeGlobalRefOrDie(env, lClass); - - jclass moduleClass = FindClassOrDie(env, kRadioModuleClassPathName); - gRadioModuleClass = MakeGlobalRefOrDie(env, moduleClass); - gPostEventFromNative = GetStaticMethodIDOrDie(env, moduleClass, "postEventFromNative", - "(Ljava/lang/Object;IIILjava/lang/Object;)V"); - gModuleFields.mNativeContext = GetFieldIDOrDie(env, moduleClass, "mNativeContext", "J"); - gModuleFields.mId = GetFieldIDOrDie(env, moduleClass, "mId", "I"); - - jclass modulePropertiesClass = FindClassOrDie(env, kModulePropertiesClassPathName); - gModulePropertiesClass = MakeGlobalRefOrDie(env, modulePropertiesClass); - gModulePropertiesCstor = GetMethodIDOrDie(env, modulePropertiesClass, "<init>", - "(ILjava/lang/String;ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;" - "Ljava/lang/String;IIZ[Landroid/hardware/radio/RadioManager$BandDescriptor;Z" - "Ljava/lang/String;)V"); - - jclass bandDescriptorClass = FindClassOrDie(env, kRadioBandDescriptorClassPathName); - gRadioBandDescriptorClass = MakeGlobalRefOrDie(env, bandDescriptorClass); - gRadioBandDescriptorFields.mRegion = GetFieldIDOrDie(env, bandDescriptorClass, "mRegion", "I"); - gRadioBandDescriptorFields.mType = GetFieldIDOrDie(env, bandDescriptorClass, "mType", "I"); - gRadioBandDescriptorFields.mLowerLimit = - GetFieldIDOrDie(env, bandDescriptorClass, "mLowerLimit", "I"); - gRadioBandDescriptorFields.mUpperLimit = - GetFieldIDOrDie(env, bandDescriptorClass, "mUpperLimit", "I"); - gRadioBandDescriptorFields.mSpacing = - GetFieldIDOrDie(env, bandDescriptorClass, "mSpacing", "I"); - - jclass fmBandDescriptorClass = FindClassOrDie(env, kRadioFmBandDescriptorClassPathName); - gRadioFmBandDescriptorClass = MakeGlobalRefOrDie(env, fmBandDescriptorClass); - gRadioFmBandDescriptorCstor = GetMethodIDOrDie(env, fmBandDescriptorClass, "<init>", - "(IIIIIZZZZZ)V"); - - jclass amBandDescriptorClass = FindClassOrDie(env, kRadioAmBandDescriptorClassPathName); - gRadioAmBandDescriptorClass = MakeGlobalRefOrDie(env, amBandDescriptorClass); - gRadioAmBandDescriptorCstor = GetMethodIDOrDie(env, amBandDescriptorClass, "<init>", - "(IIIIIZ)V"); - - jclass bandConfigClass = FindClassOrDie(env, kRadioBandConfigClassPathName); - gRadioBandConfigClass = MakeGlobalRefOrDie(env, bandConfigClass); - gRadioBandConfigFields.mDescriptor = - GetFieldIDOrDie(env, bandConfigClass, "mDescriptor", - "Landroid/hardware/radio/RadioManager$BandDescriptor;"); - - jclass fmBandConfigClass = FindClassOrDie(env, kRadioFmBandConfigClassPathName); - gRadioFmBandConfigClass = MakeGlobalRefOrDie(env, fmBandConfigClass); - gRadioFmBandConfigCstor = GetMethodIDOrDie(env, fmBandConfigClass, "<init>", - "(IIIIIZZZZZ)V"); - gRadioFmBandConfigFields.mStereo = GetFieldIDOrDie(env, fmBandConfigClass, "mStereo", "Z"); - gRadioFmBandConfigFields.mRds = GetFieldIDOrDie(env, fmBandConfigClass, "mRds", "Z"); - gRadioFmBandConfigFields.mTa = GetFieldIDOrDie(env, fmBandConfigClass, "mTa", "Z"); - gRadioFmBandConfigFields.mAf = GetFieldIDOrDie(env, fmBandConfigClass, "mAf", "Z"); - gRadioFmBandConfigFields.mEa = - GetFieldIDOrDie(env, fmBandConfigClass, "mEa", "Z"); - - - jclass amBandConfigClass = FindClassOrDie(env, kRadioAmBandConfigClassPathName); - gRadioAmBandConfigClass = MakeGlobalRefOrDie(env, amBandConfigClass); - gRadioAmBandConfigCstor = GetMethodIDOrDie(env, amBandConfigClass, "<init>", - "(IIIIIZ)V"); - gRadioAmBandConfigFields.mStereo = GetFieldIDOrDie(env, amBandConfigClass, "mStereo", "Z"); - - jclass programInfoClass = FindClassOrDie(env, kRadioProgramInfoClassPathName); - gRadioProgramInfoClass = MakeGlobalRefOrDie(env, programInfoClass); - gRadioProgramInfoCstor = GetMethodIDOrDie(env, programInfoClass, "<init>", - "(IIZZZILandroid/hardware/radio/RadioMetadata;ILjava/lang/String;)V"); - - jclass metadataClass = FindClassOrDie(env, kRadioMetadataClassPathName); - gRadioMetadataClass = MakeGlobalRefOrDie(env, metadataClass); - gRadioMetadataCstor = GetMethodIDOrDie(env, metadataClass, "<init>", "()V"); - gRadioMetadataMethods.putIntFromNative = GetMethodIDOrDie(env, metadataClass, - "putIntFromNative", - "(II)I"); - gRadioMetadataMethods.putStringFromNative = GetMethodIDOrDie(env, metadataClass, - "putStringFromNative", - "(ILjava/lang/String;)I"); - gRadioMetadataMethods.putBitmapFromNative = GetMethodIDOrDie(env, metadataClass, - "putBitmapFromNative", - "(I[B)I"); - gRadioMetadataMethods.putClockFromNative = GetMethodIDOrDie(env, metadataClass, - "putClockFromNative", - "(IJI)I"); - - - RegisterMethodsOrDie(env, kRadioManagerClassPathName, gMethods, NELEM(gMethods)); - - int ret = RegisterMethodsOrDie(env, kRadioModuleClassPathName, gModuleMethods, NELEM(gModuleMethods)); - - ALOGV("%s DONE", __FUNCTION__); - - return ret; -} |