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
This commit is contained in:
Nathan Harold
2020-06-04 16:05:03 -07:00
parent 644015b732
commit 32deda2df3
2 changed files with 25 additions and 4 deletions

View File

@@ -16,7 +16,9 @@
package android.telephony; package android.telephony;
import android.app.ActivityThread;
import android.compat.annotation.UnsupportedAppUsage; import android.compat.annotation.UnsupportedAppUsage;
import android.content.Context;
import android.os.Bundle; import android.os.Bundle;
import android.os.RemoteException; import android.os.RemoteException;
import android.os.ServiceManager; import android.os.ServiceManager;
@@ -32,15 +34,29 @@ import com.android.internal.telephony.PhoneConstants;
public abstract class CellLocation { public abstract class CellLocation {
/** /**
* Request an update of the current location. If the location has changed, * This method will not do anything.
* a broadcast will be sent to everyone registered with {@link *
* PhoneStateListener#LISTEN_CELL_LOCATION}. * Whenever location changes, a callback will automatically be be sent to
* all registrants of {@link PhoneStateListener#LISTEN_CELL_LOCATION}.
*
* <p>This method is a no-op for callers targeting SDK level 31 or greater.
* <p>This method is a no-op for callers that target SDK level 29 or 30 and lack
* {@link android.Manifest.permission#ACCESS_FINE_LOCATION}.
* <p>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() { 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 { try {
ITelephony phone = ITelephony.Stub.asInterface(ServiceManager.getService("phone")); ITelephony phone = ITelephony.Stub.asInterface(ServiceManager.getService("phone"));
if (phone != null) { if (phone != null) {
phone.updateServiceLocation(); phone.updateServiceLocationWithPackageName(appContext.getOpPackageName());
} }
} catch (RemoteException ex) { } catch (RemoteException ex) {
// ignore it // ignore it

View File

@@ -227,6 +227,11 @@ interface ITelephony {
@UnsupportedAppUsage @UnsupportedAppUsage
void updateServiceLocation(); 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 * Request to update location information for a subscrition in service state
* @param subId user preferred subId. * @param subId user preferred subId.