diff options
| author | 2019-09-30 16:08:04 -0700 | |
|---|---|---|
| committer | 2019-09-30 16:08:04 -0700 | |
| commit | 64418f4c31d80c0a42c84a2acfb1a6647f65c73f (patch) | |
| tree | f56ba6f247de9c89a7b3107e970ddd5beb64ebea | |
| parent | f26f7a206f499c632c15ed203ceb92e914906c23 (diff) | |
| parent | 4a54c2fa2bcfd044090e77382d90267205a86f90 (diff) | |
Merge "Integrate the active emergency session listener in TelephonyRegistry"
am: 4a54c2fa2b
Change-Id: I890a913c18332669dee8f21baf81db78a50a0fb0
| -rw-r--r-- | api/system-current.txt | 2 | ||||
| -rw-r--r-- | api/test-current.txt | 5 | ||||
| -rw-r--r-- | cmds/telecom/src/com/android/commands/telecom/Telecom.java | 17 | ||||
| -rw-r--r-- | packages/Shell/AndroidManifest.xml | 1 | ||||
| -rw-r--r-- | services/core/java/com/android/server/TelephonyRegistry.java | 67 | ||||
| -rw-r--r-- | telecomm/java/com/android/internal/telecom/ITelecomService.aidl | 5 | ||||
| -rw-r--r-- | telephony/java/android/telephony/PhoneStateListener.java | 5 | ||||
| -rw-r--r-- | telephony/java/com/android/internal/telephony/ITelephonyRegistry.aidl | 4 |
8 files changed, 106 insertions, 0 deletions
diff --git a/api/system-current.txt b/api/system-current.txt index 8132c768f60c..b321065ebda9 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -7752,6 +7752,8 @@ package android.telephony { method public void onCallAttributesChanged(@NonNull android.telephony.CallAttributes); method @RequiresPermission("android.permission.READ_PRECISE_PHONE_STATE") public void onCallDisconnectCauseChanged(int, int); method @RequiresPermission("android.permission.READ_PRECISE_PHONE_STATE") public void onImsCallDisconnectCauseChanged(@NonNull android.telephony.ims.ImsReasonInfo); + method public void onOutgoingEmergencyCall(@NonNull android.telephony.emergency.EmergencyNumber); + method public void onOutgoingEmergencySms(@NonNull android.telephony.emergency.EmergencyNumber); method @RequiresPermission("android.permission.READ_PRECISE_PHONE_STATE") public void onPreciseCallStateChanged(@NonNull android.telephony.PreciseCallState); method @RequiresPermission("android.permission.READ_PRECISE_PHONE_STATE") public void onPreciseDataConnectionStateChanged(@NonNull android.telephony.PreciseDataConnectionState); method public void onRadioPowerStateChanged(int); diff --git a/api/test-current.txt b/api/test-current.txt index 9fa7f99895c1..a442896b48c8 100644 --- a/api/test-current.txt +++ b/api/test-current.txt @@ -2853,6 +2853,11 @@ package android.telephony { method public static void setMinMatchForTest(int); } + public class PhoneStateListener { + field @RequiresPermission("android.permission.READ_ACTIVE_EMERGENCY_SESSION") public static final int LISTEN_OUTGOING_CALL_EMERGENCY_NUMBER = 268435456; // 0x10000000 + field @RequiresPermission("android.permission.READ_ACTIVE_EMERGENCY_SESSION") public static final int LISTEN_OUTGOING_SMS_EMERGENCY_NUMBER = 536870912; // 0x20000000 + } + public class ServiceState implements android.os.Parcelable { method public void addNetworkRegistrationInfo(android.telephony.NetworkRegistrationInfo); method public void setCdmaSystemAndNetworkId(int, int); diff --git a/cmds/telecom/src/com/android/commands/telecom/Telecom.java b/cmds/telecom/src/com/android/commands/telecom/Telecom.java index e0f7d862e70a..b37ee74b100c 100644 --- a/cmds/telecom/src/com/android/commands/telecom/Telecom.java +++ b/cmds/telecom/src/com/android/commands/telecom/Telecom.java @@ -65,6 +65,14 @@ public final class Telecom extends BaseCommand { private static final String COMMAND_UNREGISTER_PHONE_ACCOUNT = "unregister-phone-account"; private static final String COMMAND_SET_DEFAULT_DIALER = "set-default-dialer"; private static final String COMMAND_GET_DEFAULT_DIALER = "get-default-dialer"; + /** + * Change the system dialer package name if a package name was specified, + * Example: adb shell telecom set-system-dialer <PACKAGE> + * + * Restore it to the default if if argument is "default" or no argument is passed. + * Example: adb shell telecom set-system-dialer default + */ + private static final String COMMAND_SET_SYSTEM_DIALER = "set-system-dialer"; private static final String COMMAND_GET_SYSTEM_DIALER = "get-system-dialer"; private static final String COMMAND_WAIT_ON_HANDLERS = "wait-on-handlers"; private static final String COMMAND_SET_SIM_COUNT = "set-sim-count"; @@ -193,6 +201,9 @@ public final class Telecom extends BaseCommand { case COMMAND_GET_DEFAULT_DIALER: runGetDefaultDialer(); break; + case COMMAND_SET_SYSTEM_DIALER: + runSetSystemDialer(); + break; case COMMAND_GET_SYSTEM_DIALER: runGetSystemDialer(); break; @@ -297,6 +308,12 @@ public final class Telecom extends BaseCommand { System.out.println("Success - " + packageName + " set as override default dialer."); } + private void runSetSystemDialer() throws RemoteException { + final String packageName = nextArg(); + mTelecomService.setSystemDialerPackage(packageName.equals("default") ? null : packageName); + System.out.println("Success - " + packageName + " set as override system dialer."); + } + private void runGetDefaultDialer() throws RemoteException { System.out.println(mTelecomService.getDefaultDialerPackage()); } diff --git a/packages/Shell/AndroidManifest.xml b/packages/Shell/AndroidManifest.xml index d2e0201ad555..11b0487a64b2 100644 --- a/packages/Shell/AndroidManifest.xml +++ b/packages/Shell/AndroidManifest.xml @@ -29,6 +29,7 @@ <uses-permission android:name="android.permission.CALL_PHONE" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.READ_PRECISE_PHONE_STATE" /> + <uses-permission android:name="android.permission.READ_ACTIVE_EMERGENCY_SESSION" /> <uses-permission android:name="android.permission.READ_PRIVILEGED_PHONE_STATE" /> <uses-permission android:name="android.permission.READ_CONTACTS" /> <uses-permission android:name="android.permission.WRITE_CONTACTS" /> diff --git a/services/core/java/com/android/server/TelephonyRegistry.java b/services/core/java/com/android/server/TelephonyRegistry.java index 9c896abd5567..cb5d5bfab1df 100644 --- a/services/core/java/com/android/server/TelephonyRegistry.java +++ b/services/core/java/com/android/server/TelephonyRegistry.java @@ -209,6 +209,10 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub { private Map<Integer, List<EmergencyNumber>> mEmergencyNumberList; + private EmergencyNumber[] mOutgoingSmsEmergencyNumber; + + private EmergencyNumber[] mOutgoingCallEmergencyNumber; + private CallQuality[] mCallQuality; private CallAttributes[] mCallAttributes; @@ -267,6 +271,10 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub { PhoneStateListener.LISTEN_PRECISE_CALL_STATE | PhoneStateListener.LISTEN_PRECISE_DATA_CONNECTION_STATE; + static final int READ_ACTIVE_EMERGENCY_SESSION_PERMISSION_MASK = + PhoneStateListener.LISTEN_OUTGOING_CALL_EMERGENCY_NUMBER + | PhoneStateListener.LISTEN_OUTGOING_SMS_EMERGENCY_NUMBER; + private static final int MSG_USER_SWITCHED = 1; private static final int MSG_UPDATE_DEFAULT_SUB = 2; @@ -407,6 +415,8 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub { mImsReasonInfo = new ArrayList<>(); mPhysicalChannelConfigs = new ArrayList<>(); mEmergencyNumberList = new HashMap<>(); + mOutgoingCallEmergencyNumber = new EmergencyNumber[numPhones]; + mOutgoingSmsEmergencyNumber = new EmergencyNumber[numPhones]; for (int i = 0; i < numPhones; i++) { mCallState[i] = TelephonyManager.CALL_STATE_IDLE; mDataActivity[i] = TelephonyManager.DATA_ACTIVITY_NONE; @@ -1926,6 +1936,56 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub { } @Override + public void notifyOutgoingEmergencyCall(int phoneId, int subId, + EmergencyNumber emergencyNumber) { + if (!checkNotifyPermission("notifyOutgoingEmergencyCall()")) { + return; + } + synchronized (mRecords) { + if (validatePhoneId(phoneId)) { + mOutgoingCallEmergencyNumber[phoneId] = emergencyNumber; + for (Record r : mRecords) { + if (r.matchPhoneStateListenerEvent( + PhoneStateListener.LISTEN_OUTGOING_CALL_EMERGENCY_NUMBER) + && idMatch(r.subId, subId, phoneId)) { + try { + r.callback.onOutgoingEmergencyCall(emergencyNumber); + } catch (RemoteException ex) { + mRemoveList.add(r.binder); + } + } + } + } + handleRemoveListLocked(); + } + } + + @Override + public void notifyOutgoingEmergencySms(int phoneId, int subId, + EmergencyNumber emergencyNumber) { + if (!checkNotifyPermission("notifyOutgoingEmergencySms()")) { + return; + } + synchronized (mRecords) { + if (validatePhoneId(phoneId)) { + mOutgoingSmsEmergencyNumber[phoneId] = emergencyNumber; + for (Record r : mRecords) { + if (r.matchPhoneStateListenerEvent( + PhoneStateListener.LISTEN_OUTGOING_SMS_EMERGENCY_NUMBER) + && idMatch(r.subId, subId, phoneId)) { + try { + r.callback.onOutgoingEmergencySms(emergencyNumber); + } catch (RemoteException ex) { + mRemoveList.add(r.binder); + } + } + } + } + handleRemoveListLocked(); + } + } + + @Override public void notifyCallQualityChanged(CallQuality callQuality, int phoneId, int subId, int callNetworkType) { if (!checkNotifyPermission("notifyCallQualityChanged()")) { @@ -1997,6 +2057,8 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub { pw.println("mCallAttributes=" + mCallAttributes[i]); pw.println("mCallNetworkType=" + mCallNetworkType[i]); pw.println("mPreciseDataConnectionState=" + mPreciseDataConnectionState[i]); + pw.println("mOutgoingCallEmergencyNumber=" + mOutgoingCallEmergencyNumber[i]); + pw.println("mOutgoingSmsEmergencyNumber=" + mOutgoingSmsEmergencyNumber[i]); pw.decreaseIndent(); } pw.println("mCarrierNetworkChangeState=" + mCarrierNetworkChangeState); @@ -2266,6 +2328,11 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub { android.Manifest.permission.READ_PRECISE_PHONE_STATE, null); } + if ((events & READ_ACTIVE_EMERGENCY_SESSION_PERMISSION_MASK) != 0) { + mContext.enforceCallingOrSelfPermission( + android.Manifest.permission.READ_ACTIVE_EMERGENCY_SESSION, null); + } + if ((events & PhoneStateListener.LISTEN_OEM_HOOK_RAW_EVENT) != 0) { mContext.enforceCallingOrSelfPermission( android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE, null); diff --git a/telecomm/java/com/android/internal/telecom/ITelecomService.aidl b/telecomm/java/com/android/internal/telecom/ITelecomService.aidl index 4fcda4d00883..704749844c19 100644 --- a/telecomm/java/com/android/internal/telecom/ITelecomService.aidl +++ b/telecomm/java/com/android/internal/telecom/ITelecomService.aidl @@ -302,6 +302,11 @@ interface ITelecomService { void setTestAutoModeApp(String packageName); /** + * @see TelecomServiceImpl#setSystemDialerPackage + */ + void setSystemDialerPackage(in String packageName); + + /** * @see TelecomServiceImpl#setTestDefaultDialer */ void setTestDefaultDialer(in String packageName); diff --git a/telephony/java/android/telephony/PhoneStateListener.java b/telephony/java/android/telephony/PhoneStateListener.java index fe882ea74e76..2c4d59d18916 100644 --- a/telephony/java/android/telephony/PhoneStateListener.java +++ b/telephony/java/android/telephony/PhoneStateListener.java @@ -20,6 +20,7 @@ import android.Manifest; import android.annotation.NonNull; import android.annotation.RequiresPermission; import android.annotation.SystemApi; +import android.annotation.TestApi; import android.annotation.UnsupportedAppUsage; import android.os.Binder; import android.os.Build; @@ -371,6 +372,7 @@ public class PhoneStateListener { * @hide */ @SystemApi + @TestApi @RequiresPermission(Manifest.permission.READ_ACTIVE_EMERGENCY_SESSION) public static final int LISTEN_OUTGOING_CALL_EMERGENCY_NUMBER = 0x10000000; @@ -383,6 +385,7 @@ public class PhoneStateListener { * @hide */ @SystemApi + @TestApi @RequiresPermission(Manifest.permission.READ_ACTIVE_EMERGENCY_SESSION) public static final int LISTEN_OUTGOING_SMS_EMERGENCY_NUMBER = 0x20000000; @@ -874,6 +877,7 @@ public class PhoneStateListener { * to. * @hide */ + @SystemApi public void onOutgoingEmergencyCall(@NonNull EmergencyNumber placedEmergencyNumber) { // default implementation empty } @@ -884,6 +888,7 @@ public class PhoneStateListener { * @param sentEmergencyNumber the emergency number {@link EmergencyNumber} the SMS is sent to. * @hide */ + @SystemApi public void onOutgoingEmergencySms(@NonNull EmergencyNumber sentEmergencyNumber) { // default implementation empty } diff --git a/telephony/java/com/android/internal/telephony/ITelephonyRegistry.aidl b/telephony/java/com/android/internal/telephony/ITelephonyRegistry.aidl index dc026d48c6cf..a20c49455888 100644 --- a/telephony/java/com/android/internal/telephony/ITelephonyRegistry.aidl +++ b/telephony/java/com/android/internal/telephony/ITelephonyRegistry.aidl @@ -89,6 +89,10 @@ interface ITelephonyRegistry { void notifyActiveDataSubIdChanged(int activeDataSubId); void notifyRadioPowerStateChanged(in int phoneId, in int subId, in int state); void notifyEmergencyNumberList(in int phoneId, in int subId); + void notifyOutgoingEmergencyCall(in int phoneId, in int subId, + in EmergencyNumber emergencyNumber); + void notifyOutgoingEmergencySms(in int phoneId, in int subId, + in EmergencyNumber emergencyNumber); void notifyCallQualityChanged(in CallQuality callQuality, int phoneId, int subId, int callNetworkType); void notifyImsDisconnectCause(int subId, in ImsReasonInfo imsReasonInfo); |