From 32deda2df30c940dc95c6d913cf17256005a7fd6 Mon Sep 17 00:00:00 2001 From: Nathan Harold Date: Thu, 4 Jun 2020 16:05:03 -0700 Subject: [PATCH 1/2] Add Location Checks on CellLocation#requestLocationUpdate Update CellLocation#requestLocationUpdate to pass the necessary information to do soft location permission checks and bill modem battery usage against the caller of the API. Bug: 152648516 Test: atest CellLocationTest Change-Id: Id9e354538953ef93193a937a834e5890e62ecebd --- .../java/android/telephony/CellLocation.java | 24 +++++++++++++++---- .../internal/telephony/ITelephony.aidl | 5 ++++ 2 files changed, 25 insertions(+), 4 deletions(-) diff --git a/telephony/java/android/telephony/CellLocation.java b/telephony/java/android/telephony/CellLocation.java index 64776e377fa41..b32f456581ab8 100644 --- a/telephony/java/android/telephony/CellLocation.java +++ b/telephony/java/android/telephony/CellLocation.java @@ -16,7 +16,9 @@ package android.telephony; +import android.app.ActivityThread; import android.compat.annotation.UnsupportedAppUsage; +import android.content.Context; import android.os.Bundle; import android.os.RemoteException; import android.os.ServiceManager; @@ -32,15 +34,29 @@ import com.android.internal.telephony.PhoneConstants; public abstract class CellLocation { /** - * Request an update of the current location. If the location has changed, - * a broadcast will be sent to everyone registered with {@link - * PhoneStateListener#LISTEN_CELL_LOCATION}. + * This method will not do anything. + * + * Whenever location changes, a callback will automatically be be sent to + * all registrants of {@link PhoneStateListener#LISTEN_CELL_LOCATION}. + * + *

This method is a no-op for callers targeting SDK level 31 or greater. + *

This method is a no-op for callers that target SDK level 29 or 30 and lack + * {@link android.Manifest.permission#ACCESS_FINE_LOCATION}. + *

This method is a no-op for callers that target SDK level 28 or below and lack + * {@link android.Manifest.permission#ACCESS_COARSE_LOCATION}. + * + * Callers wishing to request a single location update should use + * {@link TelephonyManager#requestCellInfoUpdate}. */ public static void requestLocationUpdate() { + // Since this object doesn't have a context, this is the best we can do. + final Context appContext = ActivityThread.currentApplication(); + if (appContext == null) return; // should never happen + try { ITelephony phone = ITelephony.Stub.asInterface(ServiceManager.getService("phone")); if (phone != null) { - phone.updateServiceLocation(); + phone.updateServiceLocationWithPackageName(appContext.getOpPackageName()); } } catch (RemoteException ex) { // ignore it diff --git a/telephony/java/com/android/internal/telephony/ITelephony.aidl b/telephony/java/com/android/internal/telephony/ITelephony.aidl index 5a6b997f0723e..7fb2d5cb9ea00 100644 --- a/telephony/java/com/android/internal/telephony/ITelephony.aidl +++ b/telephony/java/com/android/internal/telephony/ITelephony.aidl @@ -227,6 +227,11 @@ interface ITelephony { @UnsupportedAppUsage void updateServiceLocation(); + /** + * Version of updateServiceLocation that records the caller and validates permissions. + */ + void updateServiceLocationWithPackageName(String callingPkg); + /** * Request to update location information for a subscrition in service state * @param subId user preferred subId. From 0459eb7cdc7b7a938b8d91dca98a3acd3b225212 Mon Sep 17 00:00:00 2001 From: Nathan Harold Date: Thu, 28 May 2020 20:19:28 -0700 Subject: [PATCH 2/2] Remove Support for Deprecated Location Updating Remove support for location update control that impacts the services state tracker. This functionality hasn't been needed in many years, and it has the ability to: -consume additional battery -cause ServiceState to be reported incorrectly -cause the phone to not know about changes to the service state (current cell, technology, etc). Bug: 152648516 Test: compilation - code removal only Change-Id: I1bf880c037b5c005bdd61a0ff6f5c4000ec2f9be --- .../android/telephony/TelephonyManager.java | 67 ++----------------- .../internal/telephony/ITelephony.aidl | 24 +------ 2 files changed, 9 insertions(+), 82 deletions(-) diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java index 68977068aa742..6fa94d39dbc74 100644 --- a/telephony/java/android/telephony/TelephonyManager.java +++ b/telephony/java/android/telephony/TelephonyManager.java @@ -2188,58 +2188,6 @@ public class TelephonyManager { } } - /** - * Enables location update notifications. {@link PhoneStateListener#onCellLocationChanged - * PhoneStateListener.onCellLocationChanged} will be called on location updates. - * - * @hide - */ - @RequiresPermission(android.Manifest.permission.CONTROL_LOCATION_UPDATES) - public void enableLocationUpdates() { - enableLocationUpdates(getSubId()); - } - - /** - * Enables location update notifications for a subscription. - * {@link PhoneStateListener#onCellLocationChanged - * PhoneStateListener.onCellLocationChanged} will be called on location updates. - * - * @param subId for which the location updates are enabled - * @hide - */ - @RequiresPermission(android.Manifest.permission.CONTROL_LOCATION_UPDATES) - public void enableLocationUpdates(int subId) { - try { - ITelephony telephony = getITelephony(); - if (telephony != null) - telephony.enableLocationUpdatesForSubscriber(subId); - } catch (RemoteException ex) { - } catch (NullPointerException ex) { - } - } - - /** - * Disables location update notifications. {@link PhoneStateListener#onCellLocationChanged - * PhoneStateListener.onCellLocationChanged} will be called on location updates. - * - * @hide - */ - @RequiresPermission(android.Manifest.permission.CONTROL_LOCATION_UPDATES) - public void disableLocationUpdates() { - disableLocationUpdates(getSubId()); - } - - /** @hide */ - public void disableLocationUpdates(int subId) { - try { - ITelephony telephony = getITelephony(); - if (telephony != null) - telephony.disableLocationUpdatesForSubscriber(subId); - } catch (RemoteException ex) { - } catch (NullPointerException ex) { - } - } - /** * Returns the neighboring cell information of the device. * @@ -8969,17 +8917,14 @@ public class TelephonyManager { return RADIO_POWER_UNAVAILABLE; } - /** @hide */ + /** + * This method should not be used due to privacy and stability concerns. + * + * @hide + */ @SystemApi - @SuppressLint("Doclava125") public void updateServiceLocation() { - try { - ITelephony telephony = getITelephony(); - if (telephony != null) - telephony.updateServiceLocation(); - } catch (RemoteException e) { - Log.e(TAG, "Error calling ITelephony#updateServiceLocation", e); - } + Log.e(TAG, "Do not call TelephonyManager#updateServiceLocation()"); } /** @hide */ diff --git a/telephony/java/com/android/internal/telephony/ITelephony.aidl b/telephony/java/com/android/internal/telephony/ITelephony.aidl index 7fb2d5cb9ea00..9b64ff17cc1ed 100644 --- a/telephony/java/com/android/internal/telephony/ITelephony.aidl +++ b/telephony/java/com/android/internal/telephony/ITelephony.aidl @@ -222,7 +222,7 @@ interface ITelephony { boolean setRadioPower(boolean turnOn); /** - * Request to update location information in service state + * This method has been removed due to security and stability issues. */ @UnsupportedAppUsage void updateServiceLocation(); @@ -233,35 +233,17 @@ interface ITelephony { void updateServiceLocationWithPackageName(String callingPkg); /** - * Request to update location information for a subscrition in service state - * @param subId user preferred subId. - */ - void updateServiceLocationForSubscriber(int subId); - - /** - * Enable location update notifications. + * This method has been removed due to security and stability issues. */ @UnsupportedAppUsage void enableLocationUpdates(); /** - * Enable location update notifications. - * @param subId user preferred subId. - */ - void enableLocationUpdatesForSubscriber(int subId); - - /** - * Disable location update notifications. + * This method has been removed due to security and stability issues. */ @UnsupportedAppUsage void disableLocationUpdates(); - /** - * Disable location update notifications. - * @param subId user preferred subId. - */ - void disableLocationUpdatesForSubscriber(int subId); - /** * Allow mobile data connections. */