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

Commit 7af1fd03 authored by Sarah Chin's avatar Sarah Chin
Browse files

5G meteredness for telephony framework

Added networkTypes to SubscriptionPlan
Send SubscriptionPlans as dispatch via listener
Updated API for R

Bug: 139070884
Test: atest FrameworksTelephonyTests
Test: atest cts/tests/tests/telephony/current/src/android/telephony/cts/SubscriptionManagerTest.java
Change-Id: Idb67fb7676adf9e1158113e7b8b08e655f470920
parent 0d24da19
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -45056,6 +45056,7 @@ package android.telephony {
    method public long getDataLimitBytes();
    method public long getDataUsageBytes();
    method public long getDataUsageTime();
    method @Nullable public int[] getNetworkTypes();
    method @Nullable public CharSequence getSummary();
    method @Nullable public CharSequence getTitle();
    method public void writeToParcel(android.os.Parcel, int);
@@ -45075,6 +45076,7 @@ package android.telephony {
    method public static android.telephony.SubscriptionPlan.Builder createRecurring(java.time.ZonedDateTime, java.time.Period);
    method public android.telephony.SubscriptionPlan.Builder setDataLimit(long, int);
    method public android.telephony.SubscriptionPlan.Builder setDataUsage(long, long);
    method @NonNull public android.telephony.SubscriptionPlan.Builder setNetworkTypes(@Nullable int[]);
    method public android.telephony.SubscriptionPlan.Builder setSummary(@Nullable CharSequence);
    method public android.telephony.SubscriptionPlan.Builder setTitle(@Nullable CharSequence);
  }
+3 −1
Original line number Diff line number Diff line
@@ -15,6 +15,7 @@
 */

package android.net;
import android.telephony.SubscriptionPlan;

/** {@hide} */
oneway interface INetworkPolicyListener {
@@ -22,5 +23,6 @@ oneway interface INetworkPolicyListener {
    void onMeteredIfacesChanged(in String[] meteredIfaces);
    void onRestrictBackgroundChanged(boolean restrictBackground);
    void onUidPoliciesChanged(int uid, int uidPolicies);
    void onSubscriptionOverride(int subId, int overrideMask, int overrideValue, long networkTypeMask);
    void onSubscriptionOverride(int subId, int overrideMask, int overrideValue);
    void onSubscriptionPlansChanged(int subId, in SubscriptionPlan[] plans);
}
+1 −1
Original line number Diff line number Diff line
@@ -76,7 +76,7 @@ interface INetworkPolicyManager {
    SubscriptionPlan[] getSubscriptionPlans(int subId, String callingPackage);
    void setSubscriptionPlans(int subId, in SubscriptionPlan[] plans, String callingPackage);
    String getSubscriptionPlansOwner(int subId);
    void setSubscriptionOverride(int subId, int overrideMask, int overrideValue, long networkTypeMask, long timeoutMillis, String callingPackage);
    void setSubscriptionOverride(int subId, int overrideMask, int overrideValue, long timeoutMillis, String callingPackage);

    void factoryReset(String subscriber);

+4 −2
Original line number Diff line number Diff line
@@ -31,6 +31,7 @@ import android.net.wifi.WifiInfo;
import android.os.Build;
import android.os.RemoteException;
import android.os.UserHandle;
import android.telephony.SubscriptionPlan;
import android.util.DebugUtils;
import android.util.Pair;
import android.util.Range;
@@ -380,7 +381,8 @@ public class NetworkPolicyManager {
        @Override public void onMeteredIfacesChanged(String[] meteredIfaces) { }
        @Override public void onRestrictBackgroundChanged(boolean restrictBackground) { }
        @Override public void onUidPoliciesChanged(int uid, int uidPolicies) { }
        @Override public void onSubscriptionOverride(int subId, int overrideMask, int overrideValue,
                long networkTypeMask) { }
        @Override public void onSubscriptionOverride(int subId, int overrideMask,
                int overrideValue) { }
        @Override public void onSubscriptionPlansChanged(int subId, SubscriptionPlan[] plans) { }
    }
}
+64 −21
Original line number Diff line number Diff line
@@ -217,7 +217,6 @@ import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.messages.nano.SystemMessageProto.SystemMessage;
import com.android.internal.notification.SystemNotificationChannels;
import com.android.internal.os.SomeArgs;
import com.android.internal.telephony.PhoneConstants;
import com.android.internal.util.ArrayUtils;
import com.android.internal.util.ConcurrentUtils;
@@ -385,6 +384,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
    private static final int MSG_SUBSCRIPTION_OVERRIDE = 16;
    private static final int MSG_METERED_RESTRICTED_PACKAGES_CHANGED = 17;
    private static final int MSG_SET_NETWORK_TEMPLATE_ENABLED = 18;
    private static final int MSG_SUBSCRIPTION_PLANS_CHANGED = 19;

    private static final int UID_MSG_STATE_CHANGED = 100;
    private static final int UID_MSG_GONE = 101;
@@ -3064,6 +3064,34 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
        mContext.enforceCallingOrSelfPermission(MANAGE_SUBSCRIPTION_PLANS, TAG);
    }

    private void enforceSubscriptionPlanValidity(SubscriptionPlan[] plans) {
        // nothing to check if no plans
        if (plans.length == 0) {
            return;
        }

        long applicableNetworkTypes = 0;
        boolean allNetworks = false;
        for (SubscriptionPlan plan : plans) {
            if (plan.getNetworkTypes() == null) {
                allNetworks = true;
            } else {
                if ((applicableNetworkTypes & plan.getNetworkTypesBitMask()) != 0) {
                    throw new IllegalArgumentException(
                            "Multiple subscription plans defined for a single network type.");
                } else {
                    applicableNetworkTypes |= plan.getNetworkTypesBitMask();
                }
            }
        }

        // ensure at least one plan applies for every network type
        if (!allNetworks) {
            throw new IllegalArgumentException(
                    "No generic subscription plan that applies to all network types.");
        }
    }

    @Override
    public SubscriptionPlan[] getSubscriptionPlans(int subId, String callingPackage) {
        enforceSubscriptionPlanAccess(subId, Binder.getCallingUid(), callingPackage);
@@ -3228,6 +3256,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
    @Override
    public void setSubscriptionPlans(int subId, SubscriptionPlan[] plans, String callingPackage) {
        enforceSubscriptionPlanAccess(subId, Binder.getCallingUid(), callingPackage);
        enforceSubscriptionPlanValidity(plans);

        for (SubscriptionPlan plan : plans) {
            Preconditions.checkNotNull(plan);
@@ -3256,6 +3285,8 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
            intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY);
            intent.putExtra(SubscriptionManager.EXTRA_SUBSCRIPTION_INDEX, subId);
            mContext.sendBroadcast(intent, android.Manifest.permission.MANAGE_SUBSCRIPTION_PLANS);
            mHandler.sendMessage(
                    mHandler.obtainMessage(MSG_SUBSCRIPTION_PLANS_CHANGED, subId, 0, plans));
        } finally {
            Binder.restoreCallingIdentity(token);
        }
@@ -3282,7 +3313,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {

    @Override
    public void setSubscriptionOverride(int subId, int overrideMask, int overrideValue,
            long networkTypeMask, long timeoutMillis, String callingPackage) {
            long timeoutMillis, String callingPackage) {
        enforceSubscriptionPlanAccess(subId, Binder.getCallingUid(), callingPackage);

        // We can only override when carrier told us about plans
@@ -3300,16 +3331,11 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
        final boolean overrideEnabled = Settings.Global.getInt(mContext.getContentResolver(),
                NETPOLICY_OVERRIDE_ENABLED, 1) != 0;
        if (overrideEnabled || overrideValue == 0) {
            SomeArgs args = SomeArgs.obtain();
            args.arg1 = subId;
            args.arg2 = overrideMask;
            args.arg3 = overrideValue;
            args.arg4 = networkTypeMask;
            mHandler.sendMessage(mHandler.obtainMessage(MSG_SUBSCRIPTION_OVERRIDE, args));
            mHandler.sendMessage(mHandler.obtainMessage(MSG_SUBSCRIPTION_OVERRIDE,
                    overrideMask, overrideValue, subId));
            if (timeoutMillis > 0) {
                args.arg3 = 0;
                mHandler.sendMessageDelayed(mHandler.obtainMessage(MSG_SUBSCRIPTION_OVERRIDE, args),
                        timeoutMillis);
                mHandler.sendMessageDelayed(mHandler.obtainMessage(MSG_SUBSCRIPTION_OVERRIDE,
                        overrideMask, 0, subId), timeoutMillis);
            }
        }
    }
@@ -4445,11 +4471,20 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
    }

    private void dispatchSubscriptionOverride(INetworkPolicyListener listener, int subId,
            int overrideMask, int overrideValue, long networkTypeMask) {
            int overrideMask, int overrideValue) {
        if (listener != null) {
            try {
                listener.onSubscriptionOverride(subId, overrideMask, overrideValue,
                        networkTypeMask);
                listener.onSubscriptionOverride(subId, overrideMask, overrideValue);
            } catch (RemoteException ignored) {
            }
        }
    }

    private void dispatchSubscriptionPlansChanged(INetworkPolicyListener listener, int subId,
            SubscriptionPlan[] plans) {
        if (listener != null) {
            try {
                listener.onSubscriptionPlansChanged(subId, plans);
            } catch (RemoteException ignored) {
            }
        }
@@ -4550,16 +4585,13 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
                    return true;
                }
                case MSG_SUBSCRIPTION_OVERRIDE: {
                    final SomeArgs args = (SomeArgs) msg.obj;
                    final int subId = (int) args.arg1;
                    final int overrideMask = (int) args.arg2;
                    final int overrideValue = (int) args.arg3;
                    final long networkTypeMask = (long) args.arg4;
                    final int overrideMask = msg.arg1;
                    final int overrideValue = msg.arg2;
                    final int subId = (int) msg.obj;
                    final int length = mListeners.beginBroadcast();
                    for (int i = 0; i < length; i++) {
                        final INetworkPolicyListener listener = mListeners.getBroadcastItem(i);
                        dispatchSubscriptionOverride(listener, subId, overrideMask, overrideValue,
                                networkTypeMask);
                        dispatchSubscriptionOverride(listener, subId, overrideMask, overrideValue);
                    }
                    mListeners.finishBroadcast();
                    return true;
@@ -4576,6 +4608,17 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
                    setNetworkTemplateEnabledInner(template, enabled);
                    return true;
                }
                case MSG_SUBSCRIPTION_PLANS_CHANGED: {
                    final SubscriptionPlan[] plans = (SubscriptionPlan[]) msg.obj;
                    final int subId = msg.arg1;
                    final int length = mListeners.beginBroadcast();
                    for (int i = 0; i < length; i++) {
                        final INetworkPolicyListener listener = mListeners.getBroadcastItem(i);
                        dispatchSubscriptionPlansChanged(listener, subId, plans);
                    }
                    mListeners.finishBroadcast();
                    return true;
                }
                default: {
                    return false;
                }
Loading