From 1c11e207af7fffe79bb6f7d4379ae2b95644f812 Mon Sep 17 00:00:00 2001 From: Shuo Qian Date: Fri, 27 Apr 2018 01:27:02 +0000 Subject: [PATCH] Restore the OEM hook implementation and usage The current plan is to keep the OEM hook implementation in the framework , this is for legacy device and old device upgrading (per b/78098059). For P launching device, the OEM hook service is removed in hal, so the OEM hook api in framework should return something dummy, and prevent infinite loop to get service, but these parts should be done in seperate CLs after this restore CL is merged. This reverts commit f09bde2809b4eb34fb68d0935f8b963fb6a9fcde. Bug: 34344851 Change-Id: I2aea9be9aa7cecd4f7a1f1783391f0af173bfc59 Test: pass Treehugger tests; pass cuttlefish test RilE2eTests Merged-In: I1f2117331a7f846b192c5f956f3841d58cb8154b --- .../com/android/server/TelephonyRegistry.java | 30 +++++++++++++++++++ .../android/telephony/PhoneStateListener.java | 27 +++++++++++++++++ .../android/telephony/TelephonyManager.java | 23 ++++++++++++++ .../telephony/IPhoneStateListener.aidl | 1 + .../internal/telephony/ITelephony.aidl | 11 +++++++ .../telephony/ITelephonyRegistry.aidl | 1 + 6 files changed, 93 insertions(+) diff --git a/services/core/java/com/android/server/TelephonyRegistry.java b/services/core/java/com/android/server/TelephonyRegistry.java index 539c00135f6a1..27e7ba8845e9c 100644 --- a/services/core/java/com/android/server/TelephonyRegistry.java +++ b/services/core/java/com/android/server/TelephonyRegistry.java @@ -1426,6 +1426,31 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub { } } + public void notifyOemHookRawEventForSubscriber(int subId, byte[] rawData) { + if (!checkNotifyPermission("notifyOemHookRawEventForSubscriber")) { + return; + } + + synchronized (mRecords) { + for (Record r : mRecords) { + if (VDBG) { + log("notifyOemHookRawEventForSubscriber: r=" + r + " subId=" + subId); + } + if ((r.matchPhoneStateListenerEvent( + PhoneStateListener.LISTEN_OEM_HOOK_RAW_EVENT)) && + ((r.subId == subId) || + (r.subId == SubscriptionManager.DEFAULT_SUBSCRIPTION_ID))) { + try { + r.callback.onOemHookRawEvent(rawData); + } catch (RemoteException ex) { + mRemoveList.add(r.binder); + } + } + } + handleRemoveListLocked(); + } + } + @Override public void dump(FileDescriptor fd, PrintWriter writer, String[] args) { final IndentingPrintWriter pw = new IndentingPrintWriter(writer, " "); @@ -1693,6 +1718,11 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub { android.Manifest.permission.READ_PRECISE_PHONE_STATE, null); } + if ((events & PhoneStateListener.LISTEN_OEM_HOOK_RAW_EVENT) != 0) { + mContext.enforceCallingOrSelfPermission( + android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE, null); + } + return true; } diff --git a/telephony/java/android/telephony/PhoneStateListener.java b/telephony/java/android/telephony/PhoneStateListener.java index 7db83f6069383..3e73b9341da72 100644 --- a/telephony/java/android/telephony/PhoneStateListener.java +++ b/telephony/java/android/telephony/PhoneStateListener.java @@ -204,6 +204,16 @@ public class PhoneStateListener { */ public static final int LISTEN_VOLTE_STATE = 0x00004000; + /** + * Listen for OEM hook raw event + * + * @see #onOemHookRawEvent + * @hide + * @deprecated OEM needs a vendor-extension hal and their apps should use that instead + */ + @Deprecated + public static final int LISTEN_OEM_HOOK_RAW_EVENT = 0x00008000; + /** * Listen for carrier network changes indicated by a carrier app. * @@ -368,6 +378,9 @@ public class PhoneStateListener { case LISTEN_USER_MOBILE_DATA_STATE: PhoneStateListener.this.onUserMobileDataStateChanged((boolean)msg.obj); break; + case LISTEN_OEM_HOOK_RAW_EVENT: + PhoneStateListener.this.onOemHookRawEvent((byte[])msg.obj); + break; case LISTEN_CARRIER_NETWORK_CHANGE: PhoneStateListener.this.onCarrierNetworkChange((boolean)msg.obj); break; @@ -587,6 +600,16 @@ public class PhoneStateListener { // default implementation empty } + /** + * Callback invoked when OEM hook raw event is received. Requires + * the READ_PRIVILEGED_PHONE_STATE permission. + * @param rawData is the byte array of the OEM hook raw data. + * @hide + */ + public void onOemHookRawEvent(byte[] rawData) { + // default implementation empty + } + /** * Callback invoked when telephony has received notice from a carrier * app that a network action that could result in connectivity loss @@ -703,6 +726,10 @@ public class PhoneStateListener { send(LISTEN_USER_MOBILE_DATA_STATE, 0, 0, enabled); } + public void onOemHookRawEvent(byte[] rawData) { + send(LISTEN_OEM_HOOK_RAW_EVENT, 0, 0, rawData); + } + public void onCarrierNetworkChange(boolean active) { send(LISTEN_CARRIER_NETWORK_CHANGE, 0, 0, active); } diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java index f55061a241f53..9de18ff2a4c2e 100644 --- a/telephony/java/android/telephony/TelephonyManager.java +++ b/telephony/java/android/telephony/TelephonyManager.java @@ -6425,6 +6425,29 @@ public class TelephonyManager { return retVal; } + /** + * Returns the result and response from RIL for oem request + * + * @param oemReq the data is sent to ril. + * @param oemResp the respose data from RIL. + * @return negative value request was not handled or get error + * 0 request was handled succesfully, but no response data + * positive value success, data length of response + * @hide + * @deprecated OEM needs a vendor-extension hal and their apps should use that instead + */ + @Deprecated + public int invokeOemRilRequestRaw(byte[] oemReq, byte[] oemResp) { + try { + ITelephony telephony = getITelephony(); + if (telephony != null) + return telephony.invokeOemRilRequestRaw(oemReq, oemResp); + } catch (RemoteException ex) { + } catch (NullPointerException ex) { + } + return -1; + } + /** @hide */ @SystemApi @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) diff --git a/telephony/java/com/android/internal/telephony/IPhoneStateListener.aidl b/telephony/java/com/android/internal/telephony/IPhoneStateListener.aidl index 1cfe8c2442bd6..0d315e5e563e1 100644 --- a/telephony/java/com/android/internal/telephony/IPhoneStateListener.aidl +++ b/telephony/java/com/android/internal/telephony/IPhoneStateListener.aidl @@ -47,6 +47,7 @@ oneway interface IPhoneStateListener { void onVoLteServiceStateChanged(in VoLteServiceState lteState); void onVoiceActivationStateChanged(int activationState); void onDataActivationStateChanged(int activationState); + void onOemHookRawEvent(in byte[] rawData); void onCarrierNetworkChange(in boolean active); void onUserMobileDataStateChanged(in boolean enabled); } diff --git a/telephony/java/com/android/internal/telephony/ITelephony.aidl b/telephony/java/com/android/internal/telephony/ITelephony.aidl index 9b71b8a1b9a58..e0297ca6720b4 100644 --- a/telephony/java/com/android/internal/telephony/ITelephony.aidl +++ b/telephony/java/com/android/internal/telephony/ITelephony.aidl @@ -1054,6 +1054,17 @@ interface ITelephony { in List gsmNonRoamingList, in List cdmaRoamingList, in List cdmaNonRoamingList); + /** + * Returns the result and response from RIL for oem request + * + * @param oemReq the data is sent to ril. + * @param oemResp the respose data from RIL. + * @return negative value request was not handled or get error + * 0 request was handled succesfully, but no response data + * positive value success, data length of response + */ + int invokeOemRilRequestRaw(in byte[] oemReq, out byte[] oemResp); + /** * Check if any mobile Radios need to be shutdown. * diff --git a/telephony/java/com/android/internal/telephony/ITelephonyRegistry.aidl b/telephony/java/com/android/internal/telephony/ITelephonyRegistry.aidl index 06dc13e53bf7a..0127db97963e3 100644 --- a/telephony/java/com/android/internal/telephony/ITelephonyRegistry.aidl +++ b/telephony/java/com/android/internal/telephony/ITelephonyRegistry.aidl @@ -70,6 +70,7 @@ interface ITelephonyRegistry { void notifyVoLteServiceStateChanged(in VoLteServiceState lteState); void notifySimActivationStateChangedForPhoneId(in int phoneId, in int subId, int activationState, int activationType); + void notifyOemHookRawEventForSubscriber(in int subId, in byte[] rawData); void notifySubscriptionInfoChanged(); void notifyCarrierNetworkChange(in boolean active); void notifyUserMobileDataStateChangedForPhoneId(in int phoneId, in int subId, in boolean state);