diff options
| -rwxr-xr-x | api/system-current.txt | 3 | ||||
| -rw-r--r-- | core/java/android/telephony/PhoneStateListener.java | 10 | ||||
| -rw-r--r-- | core/res/AndroidManifest.xml | 5 | ||||
| -rw-r--r-- | services/core/java/com/android/server/TelephonyRegistry.java | 38 | ||||
| -rw-r--r-- | telephony/java/android/telephony/TelephonyManager.java | 21 | ||||
| -rw-r--r-- | telephony/java/com/android/internal/telephony/ITelephony.aidl | 5 |
6 files changed, 82 insertions, 0 deletions
diff --git a/api/system-current.txt b/api/system-current.txt index 576e571fa2b4..9b62fcc03313 100755 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -93,6 +93,7 @@ package android { field public static final String INTERNAL_SYSTEM_WINDOW = "android.permission.INTERNAL_SYSTEM_WINDOW"; field public static final String INVOKE_CARRIER_SETUP = "android.permission.INVOKE_CARRIER_SETUP"; field public static final String KILL_UID = "android.permission.KILL_UID"; + field public static final String LISTEN_ALWAYS_REPORTED_SIGNAL_STRENGTH = "android.permission.LISTEN_ALWAYS_REPORTED_SIGNAL_STRENGTH"; field public static final String LOCAL_MAC_ADDRESS = "android.permission.LOCAL_MAC_ADDRESS"; field public static final String LOCK_DEVICE = "android.permission.LOCK_DEVICE"; field public static final String LOOP_RADIO = "android.permission.LOOP_RADIO"; @@ -9083,6 +9084,7 @@ package android.telephony { method public void onRadioPowerStateChanged(int); method public void onSrvccStateChanged(int); method public void onVoiceActivationStateChanged(int); + field @RequiresPermission(android.Manifest.permission.LISTEN_ALWAYS_REPORTED_SIGNAL_STRENGTH) public static final int LISTEN_ALWAYS_REPORTED_SIGNAL_STRENGTH = 512; // 0x200 field @RequiresPermission("android.permission.READ_PRECISE_PHONE_STATE") public static final int LISTEN_CALL_ATTRIBUTES_CHANGED = 67108864; // 0x4000000 field @RequiresPermission(android.Manifest.permission.READ_ACTIVE_EMERGENCY_SESSION) public static final int LISTEN_OUTGOING_EMERGENCY_CALL = 268435456; // 0x10000000 field @RequiresPermission(android.Manifest.permission.READ_ACTIVE_EMERGENCY_SESSION) public static final int LISTEN_OUTGOING_EMERGENCY_SMS = 536870912; // 0x20000000 @@ -9534,6 +9536,7 @@ package android.telephony { method @RequiresPermission(android.Manifest.permission.CONNECTIVITY_INTERNAL) public void resetSettings(); method @Deprecated @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public int setAllowedCarriers(int, java.util.List<android.service.carrier.CarrierIdentifier>); method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public boolean setAllowedNetworkTypes(long); + method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setAlwaysReportSignalStrength(boolean); method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setCarrierDataEnabled(boolean); method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public int setCarrierRestrictionRules(@NonNull android.telephony.CarrierRestrictionRules); method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setDataActivationState(int); diff --git a/core/java/android/telephony/PhoneStateListener.java b/core/java/android/telephony/PhoneStateListener.java index f886cf58b850..03e7361159e1 100644 --- a/core/java/android/telephony/PhoneStateListener.java +++ b/core/java/android/telephony/PhoneStateListener.java @@ -168,6 +168,16 @@ public class PhoneStateListener { public static final int LISTEN_SIGNAL_STRENGTHS = 0x00000100; /** + * Listen for always reported changes of the network signal strengths (cellular), + * even in some situations such as the screen of the device is off. + * + * @hide + */ + @RequiresPermission(android.Manifest.permission.LISTEN_ALWAYS_REPORTED_SIGNAL_STRENGTH) + @SystemApi + public static final int LISTEN_ALWAYS_REPORTED_SIGNAL_STRENGTH = 0x00000200; + + /** * Listen for changes to observed cell info. * * @see #onCellInfoChanged diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml index b8b8e81ebaca..aea055bbc093 100644 --- a/core/res/AndroidManifest.xml +++ b/core/res/AndroidManifest.xml @@ -2086,6 +2086,11 @@ <permission android:name="android.permission.READ_ACTIVE_EMERGENCY_SESSION" android:protectionLevel="signature" /> + <!-- @SystemApi Allows listen permission to always reported signal strength. + @hide Used internally. --> + <permission android:name="android.permission.LISTEN_ALWAYS_REPORTED_SIGNAL_STRENGTH" + android:protectionLevel="signature|telephony" /> + <!-- @SystemApi Protects the ability to register any PhoneAccount with PhoneAccount#CAPABILITY_SIM_SUBSCRIPTION. This capability indicates that the PhoneAccount corresponds to a device SIM. diff --git a/services/core/java/com/android/server/TelephonyRegistry.java b/services/core/java/com/android/server/TelephonyRegistry.java index 62743aac55f6..5eacb28c76a9 100644 --- a/services/core/java/com/android/server/TelephonyRegistry.java +++ b/services/core/java/com/android/server/TelephonyRegistry.java @@ -882,6 +882,10 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub { remove(r.binder); } } + if ((events & PhoneStateListener.LISTEN_ALWAYS_REPORTED_SIGNAL_STRENGTH) + != 0) { + updateReportSignalStrengthDecision(r.subId); + } if (validateEventsAndUserLocked(r, PhoneStateListener.LISTEN_CELL_INFO)) { try { if (DBG_LOC) log("listen: mCellInfo[" + phoneId + "] = " @@ -1005,6 +1009,27 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub { } } + private void updateReportSignalStrengthDecision(int subscriptionId) { + synchronized (mRecords) { + TelephonyManager telephonyManager = (TelephonyManager) mContext + .getSystemService(Context.TELEPHONY_SERVICE); + for (Record r : mRecords) { + // If any of the system clients wants to always listen to signal strength, + // we need to set it on. + if (r.matchPhoneStateListenerEvent( + PhoneStateListener.LISTEN_ALWAYS_REPORTED_SIGNAL_STRENGTH)) { + telephonyManager.createForSubscriptionId(subscriptionId) + .setAlwaysReportSignalStrength(true); + return; + } + } + // If none of the system clients wants to always listen to signal strength, + // we need to set it off. + telephonyManager.createForSubscriptionId(subscriptionId) + .setAlwaysReportSignalStrength(false); + } + } + private String getCallIncomingNumber(Record record, int phoneId) { // Only reveal the incoming number if the record has read call log permission. return record.canReadCallLog() ? mCallIncomingNumber[phoneId] : ""; @@ -1062,6 +1087,14 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub { } mRecords.remove(i); + + // Every time a client that is registrating to always receive the signal + // strength is removed from registry records, we need to check if + // the signal strength decision needs to update on its slot. + if (r.matchPhoneStateListenerEvent( + PhoneStateListener.LISTEN_ALWAYS_REPORTED_SIGNAL_STRENGTH)) { + updateReportSignalStrengthDecision(r.subId); + } return; } } @@ -2415,6 +2448,11 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub { android.Manifest.permission.READ_ACTIVE_EMERGENCY_SESSION, null); } + if ((events & PhoneStateListener.LISTEN_ALWAYS_REPORTED_SIGNAL_STRENGTH) != 0) { + mContext.enforceCallingOrSelfPermission( + android.Manifest.permission.LISTEN_ALWAYS_REPORTED_SIGNAL_STRENGTH, null); + } + if ((events & PhoneStateListener.LISTEN_OEM_HOOK_RAW_EVENT) != 0) { mContext.enforceCallingOrSelfPermission( android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE, null); diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java index 6aa4c5dc41d4..b9473e1de155 100644 --- a/telephony/java/android/telephony/TelephonyManager.java +++ b/telephony/java/android/telephony/TelephonyManager.java @@ -10663,6 +10663,27 @@ public class TelephonyManager { } /** + * Enable or disable signal strength changes from radio will always be reported in any + * condition (e.g. screen is off). This is only allowed for System caller. + * + * @param isEnabled {@code true} for enabling; {@code false} for disabling. + * @hide + */ + @SystemApi + @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) + public void setAlwaysReportSignalStrength(boolean isEnabled) { + try { + ITelephony telephony = getITelephony(); + if (telephony != null) { + telephony.setAlwaysReportSignalStrength(getSubId(), isEnabled); + } + } catch (RemoteException ex) { + Log.e(TAG, "setAlwaysReportSignalStrength RemoteException", ex); + ex.rethrowAsRuntimeException(); + } + } + + /** * Get the most recently available signal strength information. * * Get the most recent SignalStrength information reported by the modem. Due diff --git a/telephony/java/com/android/internal/telephony/ITelephony.aidl b/telephony/java/com/android/internal/telephony/ITelephony.aidl index dfb4ee50f7cc..99b71e84c77a 100644 --- a/telephony/java/com/android/internal/telephony/ITelephony.aidl +++ b/telephony/java/com/android/internal/telephony/ITelephony.aidl @@ -995,6 +995,11 @@ interface ITelephony { boolean isManualNetworkSelectionAllowed(int subId); /** + * Enable or disable always reporting signal strength changes from radio. + */ + void setAlwaysReportSignalStrength(int subId, boolean isEnable); + + /** * Get P-CSCF address from PCO after data connection is established or modified. * @param apnType the apnType, "ims" for IMS APN, "emergency" for EMERGENCY APN * @param callingPackage The package making the call. |