diff options
4 files changed, 57 insertions, 0 deletions
diff --git a/services/core/java/com/android/server/TelephonyRegistry.java b/services/core/java/com/android/server/TelephonyRegistry.java index 164a4f7cc8d0..fe005ecfeedf 100644 --- a/services/core/java/com/android/server/TelephonyRegistry.java +++ b/services/core/java/com/android/server/TelephonyRegistry.java @@ -1068,6 +1068,30 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub { } } + public void notifyOemHookRawEventForSubscriber(long subId, byte[] rawData) { + if (!checkNotifyPermission("notifyOemHookRawEventForSubscriber")) { + return; + } + + synchronized (mRecords) { + for (Record r : mRecords) { + if (VDBG) { + log("notifyOemHookRawEventForSubscriber: r=" + r + " subId=" + subId); + } + if (((r.events & PhoneStateListener.LISTEN_OEM_HOOK_RAW_EVENT) != 0) && + ((r.subId == subId) || + (r.subId == SubscriptionManager.DEFAULT_SUB_ID))) { + try { + r.callback.onOemHookRawEvent(rawData); + } catch (RemoteException ex) { + mRemoveList.add(r.binder); + } + } + } + handleRemoveListLocked(); + } + } + @Override public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.DUMP) @@ -1277,6 +1301,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); + } } private void handleRemoveListLocked() { diff --git a/telephony/java/android/telephony/PhoneStateListener.java b/telephony/java/android/telephony/PhoneStateListener.java index 34da1c9a442b..0dcd7c6ee537 100644 --- a/telephony/java/android/telephony/PhoneStateListener.java +++ b/telephony/java/android/telephony/PhoneStateListener.java @@ -212,6 +212,14 @@ public class PhoneStateListener { */ public static final int LISTEN_VOLTE_STATE = 0x00004000; + /** + * Listen for OEM hook raw event + * + * @see #onOemHookRawEvent + * @hide + */ + public static final int LISTEN_OEM_HOOK_RAW_EVENT = 0x00008000; + /* * Subscription used to listen to the phone state changes * @hide @@ -312,6 +320,10 @@ public class PhoneStateListener { case LISTEN_VOLTE_STATE: PhoneStateListener.this.onVoLteServiceStateChanged((VoLteServiceState)msg.obj); break; + case LISTEN_OEM_HOOK_RAW_EVENT: + PhoneStateListener.this.onOemHookRawEvent((byte[])msg.obj); + break; + } } }; @@ -480,6 +492,16 @@ public class PhoneStateListener { } /** + * 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 + } + + /** * The callback methods need to be called on the handler thread where * this object was created. If the binder did that for us it'd be nice. */ @@ -551,6 +573,10 @@ public class PhoneStateListener { public void onVoLteServiceStateChanged(VoLteServiceState lteState) { Message.obtain(mHandler, LISTEN_VOLTE_STATE, 0, 0, lteState).sendToTarget(); } + + public void onOemHookRawEvent(byte[] rawData) { + Message.obtain(mHandler, LISTEN_OEM_HOOK_RAW_EVENT, 0, 0, rawData).sendToTarget(); + } }; private void log(String s) { diff --git a/telephony/java/com/android/internal/telephony/IPhoneStateListener.aidl b/telephony/java/com/android/internal/telephony/IPhoneStateListener.aidl index a95336e54ecd..cea62babe9a8 100644 --- a/telephony/java/com/android/internal/telephony/IPhoneStateListener.aidl +++ b/telephony/java/com/android/internal/telephony/IPhoneStateListener.aidl @@ -43,5 +43,6 @@ oneway interface IPhoneStateListener { void onPreciseDataConnectionStateChanged(in PreciseDataConnectionState dataConnectionState); void onDataConnectionRealTimeInfoChanged(in DataConnectionRealTimeInfo dcRtInfo); void onVoLteServiceStateChanged(in VoLteServiceState lteState); + void onOemHookRawEvent(in byte[] rawData); } diff --git a/telephony/java/com/android/internal/telephony/ITelephonyRegistry.aidl b/telephony/java/com/android/internal/telephony/ITelephonyRegistry.aidl index ea5fa2754ce7..39defcf44e85 100644 --- a/telephony/java/com/android/internal/telephony/ITelephonyRegistry.aidl +++ b/telephony/java/com/android/internal/telephony/ITelephonyRegistry.aidl @@ -62,4 +62,5 @@ interface ITelephonyRegistry { void notifyCellInfoForSubscriber(in long subId, in List<CellInfo> cellInfo); void notifyDataConnectionRealTimeInfo(in DataConnectionRealTimeInfo dcRtInfo); void notifyVoLteServiceStateChanged(in VoLteServiceState lteState); + void notifyOemHookRawEventForSubscriber(in long subId, in byte[] rawData); } |