From 4a4608a8982ffc5d2612c9da4e20acb635e10061 Mon Sep 17 00:00:00 2001 From: MarijnS95 Date: Wed, 4 Dec 2019 17:59:09 +0100 Subject: [PATCH 1/3] Convert QcRilAm to SDK compliant app without PRIVATE_API access. In order to build devices on API 28 and above, all vendor apps need to use public, "stable" SDK APIs. Use of LOCAL_PRIVATE_PLATFORM_APIS is not allowed anymore. Noteworthy changes: - The app doesn't need to be privileged. Both permissions have protectionLevel=normal, and the selinux domain can be applied to non-privileged apps just fine. - AudioManager is a wrapper around AudioSystem, at least when it comes to get/setParameters which are used here. - Sim slot count now comes from SubscriptionManager, which internally uses the isub system service and needs an extra selinux permission to retrieve. Note that the Max() variant, which retrieves the number of sim slots, does not require the dangerous permission READ_PHONE_STATE, while the "actual inserted sim count" variant of this function does. - the android.hidl.manager dependency isn't necessary. Signed-off-by: MarijnS95 --- Android.mk | 4 +--- src/com/sony/qcrilam/QcRilAmService.java | 24 ++++++++++++++++-------- 2 files changed, 17 insertions(+), 11 deletions(-) diff --git a/Android.mk b/Android.mk index cf52fcc..e2ebc8b 100644 --- a/Android.mk +++ b/Android.mk @@ -8,11 +8,9 @@ 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 -LOCAL_PRIVATE_PLATFORM_APIS := true -LOCAL_PRIVILEGED_MODULE := true +LOCAL_SDK_VERSION := system_current include $(BUILD_PACKAGE) diff --git a/src/com/sony/qcrilam/QcRilAmService.java b/src/com/sony/qcrilam/QcRilAmService.java index 5cd9563..2faf4ef 100644 --- a/src/com/sony/qcrilam/QcRilAmService.java +++ b/src/com/sony/qcrilam/QcRilAmService.java @@ -2,10 +2,10 @@ package com.sony.qcrilam; import android.app.Service; import android.content.Intent; -import android.media.AudioSystem; +import android.media.AudioManager; import android.os.IBinder; import android.os.RemoteException; -import android.telephony.TelephonyManager; +import android.telephony.SubscriptionManager; import android.util.Log; import vendor.qti.hardware.radio.am.V1_0.IQcRilAudio; import vendor.qti.hardware.radio.am.V1_0.IQcRilAudioCallback; @@ -18,7 +18,7 @@ public class QcRilAmService extends Service { return isRunning; } - private void addCallbackForSimSlot(int simSlotNo) { + private void addCallbackForSimSlot(final int simSlotNo, final AudioManager audioManager) { try { IQcRilAudio QcRilAudio = IQcRilAudio.getService("slot" + simSlotNo); if (QcRilAudio == null) { @@ -26,15 +26,19 @@ public class QcRilAmService extends Service { } else { QcRilAudio.setCallback(new IQcRilAudioCallback.Stub() { public String getParameters(String keys) { - return AudioSystem.getParameters(keys); + return audioManager.getParameters(keys); } public int setParameters(String keyValuePairs) { - return AudioSystem.setParameters(keyValuePairs); + /* return */ audioManager.setParameters(keyValuePairs); + // AudioManager.setParameters does not check nor return + // the value coming from AudioSystem.setParameters. + // Assume there was no error: + return 0; } }); } - } catch(RemoteException exception) { + } catch (RemoteException exception) { Log.e(TAG, "RemoteException while trying to add callback for slot" + simSlotNo); } } @@ -47,9 +51,13 @@ public class QcRilAmService extends Service { @Override public void onCreate() { isRunning = true; - int simCount = TelephonyManager.from(this).getSimCount(); + int simCount = SubscriptionManager.from(this).getActiveSubscriptionInfoCountMax(); + Log.i(TAG, "Device has " + simCount + " sim slots"); + final AudioManager audioManager = getSystemService(AudioManager.class); + if (audioManager == null) + throw new RuntimeException("Can't get audiomanager!"); for (int simSlotNo = 1; simSlotNo <= simCount; simSlotNo++) { - addCallbackForSimSlot(simSlotNo); + addCallbackForSimSlot(simSlotNo, audioManager); } } From 2154fe661e412cb32319c6b024fc4bcc9630f9d4 Mon Sep 17 00:00:00 2001 From: MarijnS95 Date: Wed, 4 Dec 2019 18:14:51 +0100 Subject: [PATCH 2/3] Drop useless isRunning boolean; startService only starts it once. A service can only be started once. After that, intents will be delivered to the onStartCommand function (if overridden). In the very unlikely event that the service dies and the bootreceiver receives an intent it is properly restarted again, instead of falsely being classified as running. Signed-off-by: MarijnS95 --- src/com/sony/qcrilam/BootReceiver.java | 8 ++------ src/com/sony/qcrilam/QcRilAmService.java | 6 ------ 2 files changed, 2 insertions(+), 12 deletions(-) diff --git a/src/com/sony/qcrilam/BootReceiver.java b/src/com/sony/qcrilam/BootReceiver.java index efba285..67b210b 100644 --- a/src/com/sony/qcrilam/BootReceiver.java +++ b/src/com/sony/qcrilam/BootReceiver.java @@ -14,11 +14,7 @@ public class BootReceiver extends BroadcastReceiver { 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)); - } + + context.startService(new Intent(context, QcRilAmService.class)); } } diff --git a/src/com/sony/qcrilam/QcRilAmService.java b/src/com/sony/qcrilam/QcRilAmService.java index 2faf4ef..471c0a9 100644 --- a/src/com/sony/qcrilam/QcRilAmService.java +++ b/src/com/sony/qcrilam/QcRilAmService.java @@ -12,11 +12,6 @@ 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(final int simSlotNo, final AudioManager audioManager) { try { @@ -50,7 +45,6 @@ public class QcRilAmService extends Service { @Override public void onCreate() { - isRunning = true; int simCount = SubscriptionManager.from(this).getActiveSubscriptionInfoCountMax(); Log.i(TAG, "Device has " + simCount + " sim slots"); final AudioManager audioManager = getSystemService(AudioManager.class); From 5f60b389597574c19a9f35d9ddfa8541ef8dd980 Mon Sep 17 00:00:00 2001 From: MarijnS95 Date: Wed, 4 Dec 2019 18:24:44 +0100 Subject: [PATCH 3/3] Convert makefile to blueprint with androidmk. Signed-off-by: MarijnS95 --- Android.bp | 16 ++++++++++++++++ Android.mk | 16 ---------------- 2 files changed, 16 insertions(+), 16 deletions(-) delete mode 100644 Android.mk diff --git a/Android.bp b/Android.bp index cdc66d4..2b34545 100755 --- a/Android.bp +++ b/Android.bp @@ -6,3 +6,19 @@ hidl_package_root { name: "vendor.qti.hardware.radio.am", path: "vendor/oss/qcrilam/interface/am", } + +android_app { + name: "QcRilAm", + certificate: "platform", + + proprietary: true, + + srcs: ["src/**/*.java"], + + static_libs: ["vendor.qti.hardware.radio.am-V1.0-java"], + + optimize: { + proguard_flags_files: ["proguard.flags"], + }, + sdk_version: "system_current", +} diff --git a/Android.mk b/Android.mk deleted file mode 100644 index e2ebc8b..0000000 --- a/Android.mk +++ /dev/null @@ -1,16 +0,0 @@ -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_STATIC_JAVA_LIBRARIES := vendor.qti.hardware.radio.am-V1.0-java - -LOCAL_PROGUARD_FLAG_FILES := proguard.flags -LOCAL_SDK_VERSION := system_current - -include $(BUILD_PACKAGE)