Loading core/java/android/telephony/TelephonyRegistryManager.java +6 −4 Original line number Diff line number Diff line Loading @@ -239,8 +239,10 @@ public class TelephonyRegistryManager { * @param events Events * @param notifyNow Whether to notify instantly */ public void listenFromListener(int subId, @NonNull String pkg, @NonNull String featureId, @NonNull PhoneStateListener listener, @NonNull int events, boolean notifyNow) { public void listenFromListener(int subId, @NonNull boolean renounceFineLocationAccess, @NonNull boolean renounceCoarseLocationAccess, @NonNull String pkg, @NonNull String featureId, @NonNull PhoneStateListener listener, @NonNull int events, boolean notifyNow) { if (listener == null) { throw new IllegalStateException("telephony service is null."); } Loading @@ -257,8 +259,8 @@ public class TelephonyRegistryManager { } else if (listener.mSubId != null) { subId = listener.mSubId; } sRegistry.listenWithEventList(false, false, subId, pkg, featureId, listener.callback, eventsList, notifyNow); sRegistry.listenWithEventList(renounceFineLocationAccess, renounceCoarseLocationAccess, subId, pkg, featureId, listener.callback, eventsList, notifyNow); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } Loading telephony/java/android/telephony/TelephonyManager.java +70 −16 Original line number Diff line number Diff line Loading @@ -48,6 +48,7 @@ import android.compat.annotation.EnabledAfter; import android.compat.annotation.UnsupportedAppUsage; import android.content.ComponentName; import android.content.Context; import android.content.ContextParams; import android.content.Intent; import android.database.Cursor; import android.net.ConnectivityManager; Loading Loading @@ -140,6 +141,7 @@ import java.util.List; import java.util.Locale; import java.util.Map; import java.util.Objects; import java.util.Set; import java.util.UUID; import java.util.concurrent.Executor; import java.util.concurrent.RejectedExecutionException; Loading Loading @@ -377,16 +379,8 @@ public class TelephonyManager { @UnsupportedAppUsage public TelephonyManager(Context context, int subId) { mSubId = subId; Context appContext = context.getApplicationContext(); if (appContext != null) { if (Objects.equals(context.getAttributionTag(), appContext.getAttributionTag())) { mContext = appContext; } else { mContext = appContext.createAttributionContext(context.getAttributionTag()); } } else { mContext = context; } mContext = mergeAttributionAndRenouncedPermissions(context.getApplicationContext(), context); mSubscriptionManager = SubscriptionManager.from(mContext); } Loading @@ -407,6 +401,34 @@ public class TelephonyManager { return sInstance; } // This method takes the Application context and adds the attributionTag // and renouncedPermissions from the given context. private Context mergeAttributionAndRenouncedPermissions(Context to, Context from) { Context contextToReturn = from; if (to != null) { if (!Objects.equals(from.getAttributionTag(), to.getAttributionTag())) { contextToReturn = to.createAttributionContext(from.getAttributionTag()); } else { contextToReturn = to; } Set<String> renouncedPermissions = from.getAttributionSource().getRenouncedPermissions(); if (!renouncedPermissions.isEmpty()) { if (to.getParams() != null) { contextToReturn = contextToReturn.createContext( new ContextParams.Builder(to.getParams()) .setRenouncedPermissions(renouncedPermissions).build()); } else { contextToReturn = contextToReturn.createContext( new ContextParams.Builder() .setRenouncedPermissions(renouncedPermissions).build()); } } } return contextToReturn; } private String getOpPackageName() { // For legacy reasons the TelephonyManager has API for getting // a static instance with no context set preventing us from Loading Loading @@ -437,6 +459,16 @@ public class TelephonyManager { return null; } private Set<String> getRenouncedPermissions() { // For legacy reasons the TelephonyManager has API for getting // a static instance with no context set preventing us from // getting the attribution source. if (mContext != null) { return mContext.getAttributionSource().getRenouncedPermissions(); } return Collections.emptySet(); } /** * Post a runnable to the BackgroundThread. * Loading Loading @@ -6138,8 +6170,14 @@ public class TelephonyManager { (TelephonyRegistryManager) mContext.getSystemService(Context.TELEPHONY_REGISTRY_SERVICE); if (telephonyRegistry != null) { telephonyRegistry.listenFromListener(mSubId, getOpPackageName(), getAttributionTag(), listener, events, notifyNow); Set<String> renouncedPermissions = getRenouncedPermissions(); boolean renounceFineLocationAccess = renouncedPermissions .contains(Manifest.permission.ACCESS_FINE_LOCATION); boolean renounceCoarseLocationAccess = renouncedPermissions .contains(Manifest.permission.ACCESS_COARSE_LOCATION); telephonyRegistry.listenFromListener(mSubId, renounceFineLocationAccess, renounceCoarseLocationAccess, getOpPackageName(), getAttributionTag(), listener, events, notifyNow); } else { Rlog.w(TAG, "telephony registry not ready."); } Loading Loading @@ -11602,7 +11640,10 @@ public class TelephonyManager { Manifest.permission.ACCESS_COARSE_LOCATION }) public @Nullable ServiceState getServiceState() { return getServiceState(false, false); return getServiceState(getRenouncedPermissions() .contains(Manifest.permission.ACCESS_FINE_LOCATION), getRenouncedPermissions() .contains(Manifest.permission.ACCESS_COARSE_LOCATION)); } /** Loading @@ -11614,6 +11655,11 @@ public class TelephonyManager { * If you want continuous updates of service state info, register a {@link PhoneStateListener} * via {@link #listen} with the {@link PhoneStateListener#LISTEN_SERVICE_STATE} event. * * There's another way to renounce permissions with a custom context * {@link AttributionSource.Builder#setRenouncedPermissions(Set<String>)} but only for system * apps. To avoid confusion, calling this method supersede renouncing permissions with a * custom context. * * <p>Requires Permission: {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE} * or that the calling app has carrier privileges (see {@link #hasCarrierPrivileges}) * and {@link android.Manifest.permission#ACCESS_COARSE_LOCATION}. Loading Loading @@ -11657,8 +11703,7 @@ public class TelephonyManager { ITelephony service = getITelephony(); if (service != null) { return service.getServiceStateForSubscriber(subId, renounceFineLocationAccess, renounceCoarseLocationAccess, getOpPackageName(), getAttributionTag()); renounceCoarseLocationAccess, getOpPackageName(), getAttributionTag()); } } catch (RemoteException e) { Log.e(TAG, "Error calling ITelephony#getServiceStateForSubscriber", e); Loading Loading @@ -15494,7 +15539,10 @@ public class TelephonyManager { */ public void registerTelephonyCallback(@NonNull @CallbackExecutor Executor executor, @NonNull TelephonyCallback callback) { registerTelephonyCallback(false, false, executor, callback); registerTelephonyCallback( getRenouncedPermissions().contains(Manifest.permission.ACCESS_FINE_LOCATION), getRenouncedPermissions().contains(Manifest.permission.ACCESS_COARSE_LOCATION), executor, callback); } /** Loading Loading @@ -15524,6 +15572,12 @@ public class TelephonyManager { * instability. If a process has registered too many callbacks without unregistering them, it * may encounter an {@link IllegalStateException} when trying to register more callbacks. * * <p> * There's another way to renounce permissions with a custom context * {@link AttributionSource.Builder#setRenouncedPermissions(Set<String>)} but only for system * apps. To avoid confusion, calling this method supersede renouncing permissions with a * custom context. * * @param renounceFineLocationAccess Set this to true if the caller would not like to receive * location related information which will be sent if the caller already possess * {@link android.Manifest.permission#ACCESS_FINE_LOCATION} and do not renounce the permissions. Loading
core/java/android/telephony/TelephonyRegistryManager.java +6 −4 Original line number Diff line number Diff line Loading @@ -239,8 +239,10 @@ public class TelephonyRegistryManager { * @param events Events * @param notifyNow Whether to notify instantly */ public void listenFromListener(int subId, @NonNull String pkg, @NonNull String featureId, @NonNull PhoneStateListener listener, @NonNull int events, boolean notifyNow) { public void listenFromListener(int subId, @NonNull boolean renounceFineLocationAccess, @NonNull boolean renounceCoarseLocationAccess, @NonNull String pkg, @NonNull String featureId, @NonNull PhoneStateListener listener, @NonNull int events, boolean notifyNow) { if (listener == null) { throw new IllegalStateException("telephony service is null."); } Loading @@ -257,8 +259,8 @@ public class TelephonyRegistryManager { } else if (listener.mSubId != null) { subId = listener.mSubId; } sRegistry.listenWithEventList(false, false, subId, pkg, featureId, listener.callback, eventsList, notifyNow); sRegistry.listenWithEventList(renounceFineLocationAccess, renounceCoarseLocationAccess, subId, pkg, featureId, listener.callback, eventsList, notifyNow); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } Loading
telephony/java/android/telephony/TelephonyManager.java +70 −16 Original line number Diff line number Diff line Loading @@ -48,6 +48,7 @@ import android.compat.annotation.EnabledAfter; import android.compat.annotation.UnsupportedAppUsage; import android.content.ComponentName; import android.content.Context; import android.content.ContextParams; import android.content.Intent; import android.database.Cursor; import android.net.ConnectivityManager; Loading Loading @@ -140,6 +141,7 @@ import java.util.List; import java.util.Locale; import java.util.Map; import java.util.Objects; import java.util.Set; import java.util.UUID; import java.util.concurrent.Executor; import java.util.concurrent.RejectedExecutionException; Loading Loading @@ -377,16 +379,8 @@ public class TelephonyManager { @UnsupportedAppUsage public TelephonyManager(Context context, int subId) { mSubId = subId; Context appContext = context.getApplicationContext(); if (appContext != null) { if (Objects.equals(context.getAttributionTag(), appContext.getAttributionTag())) { mContext = appContext; } else { mContext = appContext.createAttributionContext(context.getAttributionTag()); } } else { mContext = context; } mContext = mergeAttributionAndRenouncedPermissions(context.getApplicationContext(), context); mSubscriptionManager = SubscriptionManager.from(mContext); } Loading @@ -407,6 +401,34 @@ public class TelephonyManager { return sInstance; } // This method takes the Application context and adds the attributionTag // and renouncedPermissions from the given context. private Context mergeAttributionAndRenouncedPermissions(Context to, Context from) { Context contextToReturn = from; if (to != null) { if (!Objects.equals(from.getAttributionTag(), to.getAttributionTag())) { contextToReturn = to.createAttributionContext(from.getAttributionTag()); } else { contextToReturn = to; } Set<String> renouncedPermissions = from.getAttributionSource().getRenouncedPermissions(); if (!renouncedPermissions.isEmpty()) { if (to.getParams() != null) { contextToReturn = contextToReturn.createContext( new ContextParams.Builder(to.getParams()) .setRenouncedPermissions(renouncedPermissions).build()); } else { contextToReturn = contextToReturn.createContext( new ContextParams.Builder() .setRenouncedPermissions(renouncedPermissions).build()); } } } return contextToReturn; } private String getOpPackageName() { // For legacy reasons the TelephonyManager has API for getting // a static instance with no context set preventing us from Loading Loading @@ -437,6 +459,16 @@ public class TelephonyManager { return null; } private Set<String> getRenouncedPermissions() { // For legacy reasons the TelephonyManager has API for getting // a static instance with no context set preventing us from // getting the attribution source. if (mContext != null) { return mContext.getAttributionSource().getRenouncedPermissions(); } return Collections.emptySet(); } /** * Post a runnable to the BackgroundThread. * Loading Loading @@ -6138,8 +6170,14 @@ public class TelephonyManager { (TelephonyRegistryManager) mContext.getSystemService(Context.TELEPHONY_REGISTRY_SERVICE); if (telephonyRegistry != null) { telephonyRegistry.listenFromListener(mSubId, getOpPackageName(), getAttributionTag(), listener, events, notifyNow); Set<String> renouncedPermissions = getRenouncedPermissions(); boolean renounceFineLocationAccess = renouncedPermissions .contains(Manifest.permission.ACCESS_FINE_LOCATION); boolean renounceCoarseLocationAccess = renouncedPermissions .contains(Manifest.permission.ACCESS_COARSE_LOCATION); telephonyRegistry.listenFromListener(mSubId, renounceFineLocationAccess, renounceCoarseLocationAccess, getOpPackageName(), getAttributionTag(), listener, events, notifyNow); } else { Rlog.w(TAG, "telephony registry not ready."); } Loading Loading @@ -11602,7 +11640,10 @@ public class TelephonyManager { Manifest.permission.ACCESS_COARSE_LOCATION }) public @Nullable ServiceState getServiceState() { return getServiceState(false, false); return getServiceState(getRenouncedPermissions() .contains(Manifest.permission.ACCESS_FINE_LOCATION), getRenouncedPermissions() .contains(Manifest.permission.ACCESS_COARSE_LOCATION)); } /** Loading @@ -11614,6 +11655,11 @@ public class TelephonyManager { * If you want continuous updates of service state info, register a {@link PhoneStateListener} * via {@link #listen} with the {@link PhoneStateListener#LISTEN_SERVICE_STATE} event. * * There's another way to renounce permissions with a custom context * {@link AttributionSource.Builder#setRenouncedPermissions(Set<String>)} but only for system * apps. To avoid confusion, calling this method supersede renouncing permissions with a * custom context. * * <p>Requires Permission: {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE} * or that the calling app has carrier privileges (see {@link #hasCarrierPrivileges}) * and {@link android.Manifest.permission#ACCESS_COARSE_LOCATION}. Loading Loading @@ -11657,8 +11703,7 @@ public class TelephonyManager { ITelephony service = getITelephony(); if (service != null) { return service.getServiceStateForSubscriber(subId, renounceFineLocationAccess, renounceCoarseLocationAccess, getOpPackageName(), getAttributionTag()); renounceCoarseLocationAccess, getOpPackageName(), getAttributionTag()); } } catch (RemoteException e) { Log.e(TAG, "Error calling ITelephony#getServiceStateForSubscriber", e); Loading Loading @@ -15494,7 +15539,10 @@ public class TelephonyManager { */ public void registerTelephonyCallback(@NonNull @CallbackExecutor Executor executor, @NonNull TelephonyCallback callback) { registerTelephonyCallback(false, false, executor, callback); registerTelephonyCallback( getRenouncedPermissions().contains(Manifest.permission.ACCESS_FINE_LOCATION), getRenouncedPermissions().contains(Manifest.permission.ACCESS_COARSE_LOCATION), executor, callback); } /** Loading Loading @@ -15524,6 +15572,12 @@ public class TelephonyManager { * instability. If a process has registered too many callbacks without unregistering them, it * may encounter an {@link IllegalStateException} when trying to register more callbacks. * * <p> * There's another way to renounce permissions with a custom context * {@link AttributionSource.Builder#setRenouncedPermissions(Set<String>)} but only for system * apps. To avoid confusion, calling this method supersede renouncing permissions with a * custom context. * * @param renounceFineLocationAccess Set this to true if the caller would not like to receive * location related information which will be sent if the caller already possess * {@link android.Manifest.permission#ACCESS_FINE_LOCATION} and do not renounce the permissions.