From d0e1cf6a93e2a0ec6055f9a56f4fc5336db6c3db Mon Sep 17 00:00:00 2001 From: oshmoun Date: Thu, 15 Nov 2018 11:20:28 +0100 Subject: [PATCH] QcRilAm: An app to handle QcRilAudio callbacks This app simply communicates with the vendor.qti.hardware.radio.am hal and sets the callbacks required for functional incall audio. The interface definition of the hal was taken from: https://github.com/phhusson/treble_experimentations/tree/master/interfaces/vendor/qti/hardware/radio/am/1.0 --- Android.bp | 8 ++++ Android.mk | 16 +++++++ AndroidManifest.xml | 22 ++++++++++ interface/am/1.0/Android.bp | 15 +++++++ interface/am/1.0/IQcRilAudio.hal | 8 ++++ interface/am/1.0/IQcRilAudioCallback.hal | 6 +++ proguard.flags | 7 +++ src/com/sony/qcrilam/BootReceiver.java | 24 ++++++++++ src/com/sony/qcrilam/QcRilAmService.java | 56 ++++++++++++++++++++++++ 9 files changed, 162 insertions(+) create mode 100755 Android.bp create mode 100644 Android.mk create mode 100755 AndroidManifest.xml create mode 100644 interface/am/1.0/Android.bp create mode 100644 interface/am/1.0/IQcRilAudio.hal create mode 100644 interface/am/1.0/IQcRilAudioCallback.hal create mode 100644 proguard.flags create mode 100644 src/com/sony/qcrilam/BootReceiver.java create mode 100644 src/com/sony/qcrilam/QcRilAmService.java diff --git a/Android.bp b/Android.bp new file mode 100755 index 0000000..c83d71f --- /dev/null +++ b/Android.bp @@ -0,0 +1,8 @@ +subdirs = [ + "interface", +] + +hidl_package_root { + name: "vendor.qti.hardware.radio.am", + path: "vendor/sony/oss/qcrilam/interface/am", +} diff --git a/Android.mk b/Android.mk new file mode 100644 index 0000000..24d8d3b --- /dev/null +++ b/Android.mk @@ -0,0 +1,16 @@ +LOCAL_PATH := $(call my-dir) +include $(CLEAR_VARS) + +LOCAL_PACKAGE_NAME := QcRilAm +LOCAL_CERTIFICATE := platform +LOCAL_MODULE_TAGS := optional +LOCAL_PROPRIETARY_MODULE := true + +LOCAL_SRC_FILES := $(call all-java-files-under, src) + +LOCAL_JAVA_LIBRARIES := android.hidl.manager-V1.0-java +LOCAL_STATIC_JAVA_LIBRARIES := vendor.qti.hardware.radio.am-V1.0-java + +LOCAL_PROGUARD_FLAG_FILES := proguard.flags + +include $(BUILD_PACKAGE) diff --git a/AndroidManifest.xml b/AndroidManifest.xml new file mode 100755 index 0000000..b022a56 --- /dev/null +++ b/AndroidManifest.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + diff --git a/interface/am/1.0/Android.bp b/interface/am/1.0/Android.bp new file mode 100644 index 0000000..15de6ef --- /dev/null +++ b/interface/am/1.0/Android.bp @@ -0,0 +1,15 @@ +// This file is autogenerated by hidl-gen -Landroidbp. + +hidl_interface { + name: "vendor.qti.hardware.radio.am@1.0", + root: "vendor.qti.hardware.radio.am", + srcs: [ + "IQcRilAudio.hal", + "IQcRilAudioCallback.hal", + ], + interfaces: [ + "android.hidl.base@1.0", + ], + gen_java: true, +} + diff --git a/interface/am/1.0/IQcRilAudio.hal b/interface/am/1.0/IQcRilAudio.hal new file mode 100644 index 0000000..4baccbf --- /dev/null +++ b/interface/am/1.0/IQcRilAudio.hal @@ -0,0 +1,8 @@ +package vendor.qti.hardware.radio.am@1.0; + +import vendor.qti.hardware.radio.am@1.0::IQcRilAudioCallback; + +interface IQcRilAudio { + oneway setCallback(IQcRilAudioCallback iQcRilAudioCallback); + oneway setError(int32_t error); +}; diff --git a/interface/am/1.0/IQcRilAudioCallback.hal b/interface/am/1.0/IQcRilAudioCallback.hal new file mode 100644 index 0000000..6569039 --- /dev/null +++ b/interface/am/1.0/IQcRilAudioCallback.hal @@ -0,0 +1,6 @@ +package vendor.qti.hardware.radio.am@1.0; + +interface IQcRilAudioCallback { + getParameters(string str) generates (string result); + setParameters(string str) generates (int32_t success); +}; diff --git a/proguard.flags b/proguard.flags new file mode 100644 index 0000000..b787290 --- /dev/null +++ b/proguard.flags @@ -0,0 +1,7 @@ +-keep class com.sony.qcrilam.BootReceiver { + *; +} + +-keep class com.sony.qcrilam.QcrRilAmService { + *; +} diff --git a/src/com/sony/qcrilam/BootReceiver.java b/src/com/sony/qcrilam/BootReceiver.java new file mode 100644 index 0000000..efba285 --- /dev/null +++ b/src/com/sony/qcrilam/BootReceiver.java @@ -0,0 +1,24 @@ +package com.sony.qcrilam; + +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.util.Log; + +public class BootReceiver extends BroadcastReceiver { + private static final String TAG = "QcRilAm-BootReceiver"; + + @Override + public void onReceive(Context context, Intent intent) { + if (context == null || intent == null) { + Log.w(TAG, "BOOT_COMPLETE NULL intent"); + return; + } + if (QcRilAmService.isServiceRunning()) { + Log.d(TAG, "Service is already running"); + } else { + intent.setClass(context, QcRilAmService.class); + context.startService(new Intent(context, QcRilAmService.class)); + } + } +} diff --git a/src/com/sony/qcrilam/QcRilAmService.java b/src/com/sony/qcrilam/QcRilAmService.java new file mode 100644 index 0000000..5cd9563 --- /dev/null +++ b/src/com/sony/qcrilam/QcRilAmService.java @@ -0,0 +1,56 @@ +package com.sony.qcrilam; + +import android.app.Service; +import android.content.Intent; +import android.media.AudioSystem; +import android.os.IBinder; +import android.os.RemoteException; +import android.telephony.TelephonyManager; +import android.util.Log; +import vendor.qti.hardware.radio.am.V1_0.IQcRilAudio; +import vendor.qti.hardware.radio.am.V1_0.IQcRilAudioCallback; + +public class QcRilAmService extends Service { + private static final String TAG = "QcRilAm-Service"; + private static boolean isRunning = false; + + public static boolean isServiceRunning() { + return isRunning; + } + + private void addCallbackForSimSlot(int simSlotNo) { + try { + IQcRilAudio QcRilAudio = IQcRilAudio.getService("slot" + simSlotNo); + if (QcRilAudio == null) { + Log.e(TAG, "Could not get service instance for slot" + simSlotNo + ", failing"); + } else { + QcRilAudio.setCallback(new IQcRilAudioCallback.Stub() { + public String getParameters(String keys) { + return AudioSystem.getParameters(keys); + } + + public int setParameters(String keyValuePairs) { + return AudioSystem.setParameters(keyValuePairs); + } + }); + } + } catch(RemoteException exception) { + Log.e(TAG, "RemoteException while trying to add callback for slot" + simSlotNo); + } + } + + @Override + public IBinder onBind(Intent intent) { + return null; + } + + @Override + public void onCreate() { + isRunning = true; + int simCount = TelephonyManager.from(this).getSimCount(); + for (int simSlotNo = 1; simSlotNo <= simCount; simSlotNo++) { + addCallbackForSimSlot(simSlotNo); + } + } + +}