Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d4dc4ee2 authored by Malcolm Chen's avatar Malcolm Chen
Browse files

Make setMetered and setOpportunistic public.

Making SubscriptionManager#setMetered and #setOpportunistic public
APIs. Adding proper permission checks and descriptions.

Bug: 120138251
Test: cts, unittest

Change-Id: Id6f074b15a1c03d00ede2665d44595fa7be965e4
Merged-In: Id6f074b15a1c03d00ede2665d44595fa7be965e4
parent 97c9aba8
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -42912,6 +42912,8 @@ package android.telephony {
    method public void removeOnOpportunisticSubscriptionsChangedListener(android.telephony.SubscriptionManager.OnOpportunisticSubscriptionsChangedListener);
    method public void removeOnSubscriptionsChangedListener(android.telephony.SubscriptionManager.OnSubscriptionsChangedListener);
    method public boolean removeSubscriptionsFromGroup(int[]);
    method public boolean setMetered(boolean, int);
    method public boolean setOpportunistic(boolean, int);
    method public java.lang.String setSubscriptionGroup(int[]);
    method public void setSubscriptionOverrideCongested(int, boolean, long);
    method public void setSubscriptionOverrideUnmetered(int, boolean, long);
+7 −0
Original line number Diff line number Diff line
@@ -1974,6 +1974,13 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub {
                    android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE, null);
        }

        if ((events & PhoneStateListener.LISTEN_PREFERRED_DATA_SUBID_CHANGE) != 0) {
            // It can have either READ_PHONE_STATE or READ_PRIVILEGED_PHONE_STATE.
            TelephonyPermissions.checkReadPhoneState(mContext,
                    SubscriptionManager.INVALID_SUBSCRIPTION_ID, Binder.getCallingPid(),
                    Binder.getCallingUid(), callingPackage, "listen to "
                            + "LISTEN_PREFERRED_DATA_SUBID_CHANGE");
        }

        if ((events & PhoneStateListener.LISTEN_CALL_DISCONNECT_CAUSES) != 0) {
            mContext.enforceCallingOrSelfPermission(
+32 −11
Original line number Diff line number Diff line
@@ -580,7 +580,6 @@ public class SubscriptionManager {
     * TelephonyProvider column name for whether a subscription is opportunistic, that is,
     * whether the network it connects to is limited in functionality or coverage.
     * For example, CBRS.
     * IS_EMBEDDED should always be true.
     * <p>Type: INTEGER (int), 1 for opportunistic or 0 for non-opportunistic.
     * @hide
     */
@@ -2371,18 +2370,32 @@ public class SubscriptionManager {
    }

    /**
     * Set opportunistic by simInfo index
     * Set whether a subscription is opportunistic, that is, whether the network it connects
     * to has limited coverage. For example, CBRS. Setting a subscription opportunistic has
     * following impacts:
     *  1) Even if it's active, it will be dormant most of the time. The modem will not try
     *     to scan or camp until it knows an available network is nearby to save power.
     *  2) Telephony relies on system app or carrier input to notify nearby available networks.
     *     See {@link TelephonyManager#updateAvailableNetworks(List)} for more information.
     *  3) In multi-SIM devices, when the network is nearby and camped, system may automatically
     *     switch internet data between it and default data subscription, based on carrier
     *     recommendation and its signal strength and metered-ness, etc.
     *
     *
     * Caller will either have {@link android.Manifest.permission#MODIFY_PHONE_STATE} or carrier
     * privilege permission of the subscription.
     *
     * @param opportunistic whether it’s opportunistic subscription.
     * @param subId the unique SubscriptionInfo index in database
     * @return the number of records updated
     * @hide
     * @return {@code true} if the operation is succeed, {@code false} otherwise.
     */
    @SuppressAutoDoc // Blocked by b/72967236 - no support for carrier privileges
    @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE)
    public int setOpportunistic(boolean opportunistic, int subId) {
    public boolean setOpportunistic(boolean opportunistic, int subId) {
        if (VDBG) logd("[setOpportunistic]+ opportunistic:" + opportunistic + " subId:" + subId);
        return setSubscriptionPropertyHelper(subId, "setOpportunistic",
                (iSub)-> iSub.setOpportunistic(opportunistic, subId));
                (iSub)-> iSub.setOpportunistic(
                        opportunistic, subId, mContext.getOpPackageName())) == 1;
    }

    /**
@@ -2502,18 +2515,26 @@ public class SubscriptionManager {
    }

    /**
     * Set metered by simInfo index
     * Set if a subscription is metered or not. Similar to Wi-Fi, metered means
     * user may be charged more if more data is used.
     *
     * By default all Cellular networks are considered metered. System or carrier privileged apps
     * can set a subscription un-metered which will be considered when system switches data between
     * primary subscription and opportunistic subscription.
     *
     * Caller will either have {@link android.Manifest.permission#MODIFY_PHONE_STATE} or carrier
     * privilege permission of the subscription.
     *
     * @param isMetered whether it’s a metered subscription.
     * @param subId the unique SubscriptionInfo index in database
     * @return the number of records updated
     * @hide
     * @return {@code true} if the operation is succeed, {@code false} otherwise.
     */
    @SuppressAutoDoc // Blocked by b/72967236 - no support for carrier privileges
    @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE)
    public int setMetered(boolean isMetered, int subId) {
    public boolean setMetered(boolean isMetered, int subId) {
        if (VDBG) logd("[setIsMetered]+ isMetered:" + isMetered + " subId:" + subId);
        return setSubscriptionPropertyHelper(subId, "setIsMetered",
                (iSub)-> iSub.setMetered(isMetered, subId));
                (iSub)-> iSub.setMetered(isMetered, subId, mContext.getOpPackageName())) == 1;
    }

    /**
+2 −2
Original line number Diff line number Diff line
@@ -6665,8 +6665,8 @@ public class TelephonyManager {
        try {
            ITelephony telephony = getITelephony();
            if (telephony != null) {
                return telephony.getCarrierPrivilegeStatus(subId) ==
                    CARRIER_PRIVILEGE_STATUS_HAS_ACCESS;
                return telephony.getCarrierPrivilegeStatus(subId)
                        == CARRIER_PRIVILEGE_STATUS_HAS_ACCESS;
            }
        } catch (RemoteException ex) {
            Rlog.e(TAG, "hasCarrierPrivileges RemoteException", ex);
+2 −2
Original line number Diff line number Diff line
@@ -162,7 +162,7 @@ interface ISub {
     * @param subId the unique SubscriptionInfo index in database
     * @return the number of records updated
     */
    int setOpportunistic(boolean opportunistic, int subId);
    int setOpportunistic(boolean opportunistic, int subId, String callingPackage);

    /**
     * Inform SubscriptionManager that subscriptions in the list are bundled
@@ -190,7 +190,7 @@ interface ISub {
     * @param subId the unique SubscriptionInfo index in database
     * @return the number of records updated
     */
    int setMetered(boolean isMetered, int subId);
    int setMetered(boolean isMetered, int subId, String callingPackage);

    /**
     * Set which subscription is preferred for cellular data. It's