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

Commit 6aca8c36 authored by Chiachang Wang's avatar Chiachang Wang Committed by Automerger Merge Worker
Browse files

Merge changes I0a75c440,Ief9e8925,Ie03e8276,If0ac9a64,I716bd771 am: 63bc7bd3...

Merge changes I0a75c440,Ief9e8925,Ie03e8276,If0ac9a64,I716bd771 am: 63bc7bd3 am: 7fcc3efb am: 2540861d

Original change: https://android-review.googlesource.com/c/platform/frameworks/base/+/1573943

MUST ONLY BE SUBMITTED BY AUTOMERGER

Change-Id: I52c41154ae3364774e63376fbdd5a9f42727b65f
parents 6ab42367 2540861d
Loading
Loading
Loading
Loading
+0 −35
Original line number Original line Diff line number Diff line
@@ -24,7 +24,6 @@ import android.net.Network;
import android.net.NetworkStats;
import android.net.NetworkStats;
import android.net.RouteInfo;
import android.net.RouteInfo;
import android.net.UidRange;
import android.net.UidRange;
import android.os.INetworkActivityListener;


/**
/**
 * @hide
 * @hide
@@ -294,25 +293,6 @@ interface INetworkManagementService
    @UnsupportedAppUsage(maxTargetSdk = 30, trackingBug = 170729553)
    @UnsupportedAppUsage(maxTargetSdk = 30, trackingBug = 170729553)
    boolean isBandwidthControlEnabled();
    boolean isBandwidthControlEnabled();


    /**
     * Sets idletimer for an interface.
     *
     * This either initializes a new idletimer or increases its
     * reference-counting if an idletimer already exists for given
     * {@code iface}.
     *
     * {@code type} is the type of the interface, such as TYPE_MOBILE.
     *
     * Every {@code addIdleTimer} should be paired with a
     * {@link removeIdleTimer} to cleanup when the network disconnects.
     */
    void addIdleTimer(String iface, int timeout, int type);

    /**
     * Removes idletimer for an interface.
     */
    void removeIdleTimer(String iface);

    void setFirewallEnabled(boolean enabled);
    void setFirewallEnabled(boolean enabled);
    boolean isFirewallEnabled();
    boolean isFirewallEnabled();
    void setFirewallInterfaceRule(String iface, boolean allow);
    void setFirewallInterfaceRule(String iface, boolean allow);
@@ -320,21 +300,6 @@ interface INetworkManagementService
    void setFirewallUidRules(int chain, in int[] uids, in int[] rules);
    void setFirewallUidRules(int chain, in int[] uids, in int[] rules);
    void setFirewallChainEnabled(int chain, boolean enable);
    void setFirewallChainEnabled(int chain, boolean enable);


    /**
     * Start listening for mobile activity state changes.
     */
    void registerNetworkActivityListener(INetworkActivityListener listener);

    /**
     * Stop listening for mobile activity state changes.
     */
    void unregisterNetworkActivityListener(INetworkActivityListener listener);

    /**
     * Check whether the mobile radio is currently active.
     */
    boolean isNetworkActive();

    void addLegacyRouteForNetId(int netId, in RouteInfo routeInfo, int uid);
    void addLegacyRouteForNetId(int netId, in RouteInfo routeInfo, int uid);


    /**
    /**
+3 −17
Original line number Original line Diff line number Diff line
@@ -49,8 +49,6 @@ import android.os.Build.VERSION_CODES;
import android.os.Bundle;
import android.os.Bundle;
import android.os.Handler;
import android.os.Handler;
import android.os.IBinder;
import android.os.IBinder;
import android.os.INetworkActivityListener;
import android.os.INetworkManagementService;
import android.os.Looper;
import android.os.Looper;
import android.os.Message;
import android.os.Message;
import android.os.Messenger;
import android.os.Messenger;
@@ -835,7 +833,6 @@ public class ConnectivityManager {


    private final Context mContext;
    private final Context mContext;


    private INetworkManagementService mNMService;
    private INetworkPolicyManager mNPManager;
    private INetworkPolicyManager mNPManager;
    private final TetheringManager mTetheringManager;
    private final TetheringManager mTetheringManager;


@@ -2211,17 +2208,6 @@ public class ConnectivityManager {
        void onNetworkActive();
        void onNetworkActive();
    }
    }


    private INetworkManagementService getNetworkManagementService() {
        synchronized (this) {
            if (mNMService != null) {
                return mNMService;
            }
            IBinder b = ServiceManager.getService(Context.NETWORKMANAGEMENT_SERVICE);
            mNMService = INetworkManagementService.Stub.asInterface(b);
            return mNMService;
        }
    }

    private final ArrayMap<OnNetworkActiveListener, INetworkActivityListener>
    private final ArrayMap<OnNetworkActiveListener, INetworkActivityListener>
            mNetworkActivityListeners = new ArrayMap<>();
            mNetworkActivityListeners = new ArrayMap<>();


@@ -2246,7 +2232,7 @@ public class ConnectivityManager {
        };
        };


        try {
        try {
            getNetworkManagementService().registerNetworkActivityListener(rl);
            mService.registerNetworkActivityListener(rl);
            mNetworkActivityListeners.put(l, rl);
            mNetworkActivityListeners.put(l, rl);
        } catch (RemoteException e) {
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
            throw e.rethrowFromSystemServer();
@@ -2263,7 +2249,7 @@ public class ConnectivityManager {
        INetworkActivityListener rl = mNetworkActivityListeners.get(l);
        INetworkActivityListener rl = mNetworkActivityListeners.get(l);
        Preconditions.checkArgument(rl != null, "Listener was not registered.");
        Preconditions.checkArgument(rl != null, "Listener was not registered.");
        try {
        try {
            getNetworkManagementService().unregisterNetworkActivityListener(rl);
            mService.registerNetworkActivityListener(rl);
        } catch (RemoteException e) {
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
            throw e.rethrowFromSystemServer();
        }
        }
@@ -2279,7 +2265,7 @@ public class ConnectivityManager {
     */
     */
    public boolean isDefaultNetworkActive() {
    public boolean isDefaultNetworkActive() {
        try {
        try {
            return getNetworkManagementService().isNetworkActive();
            return mService.isDefaultNetworkActive();
        } catch (RemoteException e) {
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
            throw e.rethrowFromSystemServer();
        }
        }
+1 −1
Original line number Original line Diff line number Diff line
@@ -21,6 +21,7 @@ import android.net.ConnectionInfo;
import android.net.ConnectivityDiagnosticsManager;
import android.net.ConnectivityDiagnosticsManager;
import android.net.IConnectivityDiagnosticsCallback;
import android.net.IConnectivityDiagnosticsCallback;
import android.net.IOnSetOemNetworkPreferenceListener;
import android.net.IOnSetOemNetworkPreferenceListener;
import android.net.INetworkActivityListener;
import android.net.IQosCallback;
import android.net.IQosCallback;
import android.net.ISocketKeepaliveCallback;
import android.net.ISocketKeepaliveCallback;
import android.net.LinkProperties;
import android.net.LinkProperties;
@@ -36,7 +37,6 @@ import android.net.UidRange;
import android.net.QosSocketInfo;
import android.net.QosSocketInfo;
import android.os.Bundle;
import android.os.Bundle;
import android.os.IBinder;
import android.os.IBinder;
import android.os.INetworkActivityListener;
import android.os.Messenger;
import android.os.Messenger;
import android.os.ParcelFileDescriptor;
import android.os.ParcelFileDescriptor;
import android.os.PersistableBundle;
import android.os.PersistableBundle;
+1 −1
Original line number Original line Diff line number Diff line
@@ -13,7 +13,7 @@
** limitations under the License.
** limitations under the License.
*/
*/


package android.os;
package android.net;


/**
/**
 * @hide
 * @hide
+164 −19
Original line number Original line Diff line number Diff line
@@ -90,6 +90,7 @@ import android.net.IConnectivityDiagnosticsCallback;
import android.net.IConnectivityManager;
import android.net.IConnectivityManager;
import android.net.IDnsResolver;
import android.net.IDnsResolver;
import android.net.INetd;
import android.net.INetd;
import android.net.INetworkActivityListener;
import android.net.INetworkManagementEventObserver;
import android.net.INetworkManagementEventObserver;
import android.net.INetworkMonitor;
import android.net.INetworkMonitor;
import android.net.INetworkMonitorCallbacks;
import android.net.INetworkMonitorCallbacks;
@@ -147,13 +148,13 @@ import android.net.netlink.InetDiagMessage;
import android.net.shared.PrivateDnsConfig;
import android.net.shared.PrivateDnsConfig;
import android.net.util.MultinetworkPolicyTracker;
import android.net.util.MultinetworkPolicyTracker;
import android.net.util.NetdService;
import android.net.util.NetdService;
import android.os.BatteryStatsManager;
import android.os.Binder;
import android.os.Binder;
import android.os.Build;
import android.os.Build;
import android.os.Bundle;
import android.os.Bundle;
import android.os.Handler;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.HandlerThread;
import android.os.IBinder;
import android.os.IBinder;
import android.os.INetworkActivityListener;
import android.os.INetworkManagementService;
import android.os.INetworkManagementService;
import android.os.Looper;
import android.os.Looper;
import android.os.Message;
import android.os.Message;
@@ -163,6 +164,7 @@ import android.os.Parcelable;
import android.os.PersistableBundle;
import android.os.PersistableBundle;
import android.os.PowerManager;
import android.os.PowerManager;
import android.os.Process;
import android.os.Process;
import android.os.RemoteCallbackList;
import android.os.RemoteException;
import android.os.RemoteException;
import android.os.ServiceSpecificException;
import android.os.ServiceSpecificException;
import android.os.SystemClock;
import android.os.SystemClock;
@@ -172,6 +174,7 @@ import android.os.UserManager;
import android.provider.Settings;
import android.provider.Settings;
import android.telephony.TelephonyManager;
import android.telephony.TelephonyManager;
import android.text.TextUtils;
import android.text.TextUtils;
import android.util.ArrayMap;
import android.util.ArraySet;
import android.util.ArraySet;
import android.util.LocalLog;
import android.util.LocalLog;
import android.util.Log;
import android.util.Log;
@@ -558,6 +561,11 @@ public class ConnectivityService extends IConnectivityManager.Stub
     */
     */
    private static final int EVENT_SET_OEM_NETWORK_PREFERENCE = 48;
    private static final int EVENT_SET_OEM_NETWORK_PREFERENCE = 48;


    /**
     * Used to indicate the system default network becomes active.
     */
    private static final int EVENT_REPORT_NETWORK_ACTIVITY = 49;

    /**
    /**
     * Argument for {@link #EVENT_PROVISIONING_NOTIFICATION} to indicate that the notification
     * Argument for {@link #EVENT_PROVISIONING_NOTIFICATION} to indicate that the notification
     * should be shown.
     * should be shown.
@@ -1192,7 +1200,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
        mUserAllContext.registerReceiver(mIntentReceiver, intentFilter,
        mUserAllContext.registerReceiver(mIntentReceiver, intentFilter,
                null /* broadcastPermission */, mHandler);
                null /* broadcastPermission */, mHandler);


        mNetworkActivityTracker = new LegacyNetworkActivityTracker(mContext, mNMS);
        mNetworkActivityTracker = new LegacyNetworkActivityTracker(mContext, mHandler, mNMS, mNetd);


        mSettingsObserver = new SettingsObserver(mContext, mHandler);
        mSettingsObserver = new SettingsObserver(mContext, mHandler);
        registerSettingsCallbacks();
        registerSettingsCallbacks();
@@ -2404,7 +2412,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
     */
     */
    @Override
    @Override
    public void registerNetworkActivityListener(@NonNull INetworkActivityListener l) {
    public void registerNetworkActivityListener(@NonNull INetworkActivityListener l) {
        // TODO: Replace network activity listener registry in ConnectivityManager from NMS to here
        mNetworkActivityTracker.registerNetworkActivityListener(l);
    }
    }


    /**
    /**
@@ -2412,7 +2420,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
     */
     */
    @Override
    @Override
    public void unregisterNetworkActivityListener(@NonNull INetworkActivityListener l) {
    public void unregisterNetworkActivityListener(@NonNull INetworkActivityListener l) {
        // TODO: Replace network activity listener registry in ConnectivityManager from NMS to here
        mNetworkActivityTracker.unregisterNetworkActivityListener(l);
    }
    }


    /**
    /**
@@ -2420,8 +2428,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
     */
     */
    @Override
    @Override
    public boolean isDefaultNetworkActive() {
    public boolean isDefaultNetworkActive() {
        // TODO: Replace isNetworkActive() in NMS.
        return mNetworkActivityTracker.isDefaultNetworkActive();
        return false;
    }
    }


    /**
    /**
@@ -2686,6 +2693,12 @@ public class ConnectivityService extends IConnectivityManager.Stub
        pw.increaseIndent();
        pw.increaseIndent();
        mPermissionMonitor.dump(pw);
        mPermissionMonitor.dump(pw);
        pw.decreaseIndent();
        pw.decreaseIndent();

        pw.println();
        pw.println("Legacy network activity:");
        pw.increaseIndent();
        mNetworkActivityTracker.dump(pw);
        pw.decreaseIndent();
    }
    }


    private void dumpNetworks(IndentingPrintWriter pw) {
    private void dumpNetworks(IndentingPrintWriter pw) {
@@ -4452,6 +4465,9 @@ public class ConnectivityService extends IConnectivityManager.Stub
                        loge("handleMessage.EVENT_SET_OEM_NETWORK_PREFERENCE failed", e);
                        loge("handleMessage.EVENT_SET_OEM_NETWORK_PREFERENCE failed", e);
                    }
                    }
                    break;
                    break;
                case EVENT_REPORT_NETWORK_ACTIVITY:
                    mNetworkActivityTracker.handleReportNetworkActivity();
                    break;
            }
            }
        }
        }
    }
    }
@@ -8639,13 +8655,35 @@ public class ConnectivityService extends IConnectivityManager.Stub
     * changes.
     * changes.
     */
     */
    private static final class LegacyNetworkActivityTracker {
    private static final class LegacyNetworkActivityTracker {
        private static final int NO_UID = -1;
        private final Context mContext;
        private final Context mContext;
        private final INetd mNetd;
        private final INetworkManagementService mNMS;
        private final INetworkManagementService mNMS;
        private final RemoteCallbackList<INetworkActivityListener> mNetworkActivityListeners =
                new RemoteCallbackList<>();
        // Indicate the current system default network activity is active or not.
        @GuardedBy("mActiveIdleTimers")
        private boolean mNetworkActive;
        @GuardedBy("mActiveIdleTimers")
        private final ArrayMap<String, IdleTimerParams> mActiveIdleTimers = new ArrayMap();
        private final Handler mHandler;


        LegacyNetworkActivityTracker(@NonNull Context context,
        private class IdleTimerParams {
                @NonNull INetworkManagementService nms) {
            public final int timeout;
            public final int transportType;

            IdleTimerParams(int timeout, int transport) {
                this.timeout = timeout;
                this.transportType = transport;
            }
        }

        LegacyNetworkActivityTracker(@NonNull Context context, @NonNull Handler handler,
                @NonNull INetworkManagementService nms, @NonNull INetd netd) {
            mContext = context;
            mContext = context;
            mNMS = nms;
            mNMS = nms;
            mNetd = netd;
            mHandler = handler;
            try {
            try {
                mNMS.registerObserver(mDataActivityObserver);
                mNMS.registerObserver(mDataActivityObserver);
            } catch (RemoteException e) {
            } catch (RemoteException e) {
@@ -8661,9 +8699,50 @@ public class ConnectivityService extends IConnectivityManager.Stub
                            long tsNanos, int uid) {
                            long tsNanos, int uid) {
                        sendDataActivityBroadcast(transportTypeToLegacyType(transportType), active,
                        sendDataActivityBroadcast(transportTypeToLegacyType(transportType), active,
                                tsNanos);
                                tsNanos);
                        synchronized (mActiveIdleTimers) {
                            mNetworkActive = active;
                            // If there are no idle timers, it means that system is not monitoring
                            // activity, so the system default network for those default network
                            // unspecified apps is always considered active.
                            //
                            // TODO: If the mActiveIdleTimers is empty, netd will actually not send
                            // any network activity change event. Whenever this event is received,
                            // the mActiveIdleTimers should be always not empty. The legacy behavior
                            // is no-op. Remove to refer to mNetworkActive only.
                            if (mNetworkActive || mActiveIdleTimers.isEmpty()) {
                                mHandler.sendMessage(
                                        mHandler.obtainMessage(EVENT_REPORT_NETWORK_ACTIVITY));
                            }
                        }
                    }
                    }
                };
                };


        // The network activity should only be updated from ConnectivityService handler thread
        // when mActiveIdleTimers lock is held.
        @GuardedBy("mActiveIdleTimers")
        private void reportNetworkActive() {
            final int length = mNetworkActivityListeners.beginBroadcast();
            if (DDBG) log("reportNetworkActive, notify " + length + " listeners");
            try {
                for (int i = 0; i < length; i++) {
                    try {
                        mNetworkActivityListeners.getBroadcastItem(i).onNetworkActive();
                    } catch (RemoteException | RuntimeException e) {
                        loge("Fail to send network activie to listener " + e);
                    }
                }
            } finally {
                mNetworkActivityListeners.finishBroadcast();
            }
        }

        @GuardedBy("mActiveIdleTimers")
        public void handleReportNetworkActivity() {
            synchronized (mActiveIdleTimers) {
                reportNetworkActive();
            }
        }

        // This is deprecated and only to support legacy use cases.
        // This is deprecated and only to support legacy use cases.
        private int transportTypeToLegacyType(int type) {
        private int transportTypeToLegacyType(int type) {
            switch (type) {
            switch (type) {
@@ -8728,10 +8807,17 @@ public class ConnectivityService extends IConnectivityManager.Stub
                return; // do not track any other networks
                return; // do not track any other networks
            }
            }


            updateRadioPowerState(true /* isActive */, type);

            if (timeout > 0 && iface != null) {
            if (timeout > 0 && iface != null) {
                try {
                try {
                    // TODO: Access INetd directly instead of NMS
                    synchronized (mActiveIdleTimers) {
                    mNMS.addIdleTimer(iface, timeout, type);
                        // Networks start up.
                        mNetworkActive = true;
                        mActiveIdleTimers.put(iface, new IdleTimerParams(timeout, type));
                        mNetd.idletimerAddInterface(iface, timeout, Integer.toString(type));
                        reportNetworkActive();
                    }
                } catch (Exception e) {
                } catch (Exception e) {
                    // You shall not crash!
                    // You shall not crash!
                    loge("Exception in setupDataActivityTracking " + e);
                    loge("Exception in setupDataActivityTracking " + e);
@@ -8746,18 +8832,30 @@ public class ConnectivityService extends IConnectivityManager.Stub
            final String iface = networkAgent.linkProperties.getInterfaceName();
            final String iface = networkAgent.linkProperties.getInterfaceName();
            final NetworkCapabilities caps = networkAgent.networkCapabilities;
            final NetworkCapabilities caps = networkAgent.networkCapabilities;


            if (iface != null && (caps.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)
            if (iface == null) return;
                    || caps.hasTransport(NetworkCapabilities.TRANSPORT_WIFI))) {

            final int type;
            if (caps.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)) {
                type = NetworkCapabilities.TRANSPORT_CELLULAR;
            } else if (caps.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)) {
                type = NetworkCapabilities.TRANSPORT_WIFI;
            } else {
                return; // do not track any other networks
            }

            try {
            try {
                    // the call fails silently if no idle timer setup for this interface
                updateRadioPowerState(false /* isActive */, type);
                    // TODO: Access INetd directly instead of NMS
                synchronized (mActiveIdleTimers) {
                    mNMS.removeIdleTimer(iface);
                    final IdleTimerParams params = mActiveIdleTimers.remove(iface);
                    // The call fails silently if no idle timer setup for this interface
                    mNetd.idletimerRemoveInterface(iface, params.timeout,
                            Integer.toString(params.transportType));
                }
            } catch (Exception e) {
            } catch (Exception e) {
                // You shall not crash!
                // You shall not crash!
                loge("Exception in removeDataActivityTracking " + e);
                loge("Exception in removeDataActivityTracking " + e);
            }
            }
        }
        }
        }


        /**
        /**
         * Update data activity tracking when network state is updated.
         * Update data activity tracking when network state is updated.
@@ -8771,6 +8869,53 @@ public class ConnectivityService extends IConnectivityManager.Stub
                removeDataActivityTracking(oldNetwork);
                removeDataActivityTracking(oldNetwork);
            }
            }
        }
        }

        private void updateRadioPowerState(boolean isActive, int transportType) {
            final BatteryStatsManager bs = mContext.getSystemService(BatteryStatsManager.class);
            switch (transportType) {
                case NetworkCapabilities.TRANSPORT_CELLULAR:
                    bs.reportMobileRadioPowerState(isActive, NO_UID);
                    break;
                case NetworkCapabilities.TRANSPORT_WIFI:
                    bs.reportWifiRadioPowerState(isActive, NO_UID);
                    break;
                default:
                    logw("Untracked transport type:" + transportType);
            }
        }

        public boolean isDefaultNetworkActive() {
            synchronized (mActiveIdleTimers) {
                // If there are no idle timers, it means that system is not monitoring activity,
                // so the default network is always considered active.
                //
                // TODO : Distinguish between the cases where mActiveIdleTimers is empty because
                // tracking is disabled (negative idle timer value configured), or no active default
                // network. In the latter case, this reports active but it should report inactive.
                return mNetworkActive || mActiveIdleTimers.isEmpty();
            }
        }

        public void registerNetworkActivityListener(@NonNull INetworkActivityListener l) {
            mNetworkActivityListeners.register(l);
        }

        public void unregisterNetworkActivityListener(@NonNull INetworkActivityListener l) {
            mNetworkActivityListeners.unregister(l);
        }

        public void dump(IndentingPrintWriter pw) {
            synchronized (mActiveIdleTimers) {
                pw.print("mNetworkActive="); pw.println(mNetworkActive);
                pw.println("Idle timers:");
                for (HashMap.Entry<String, IdleTimerParams> ent : mActiveIdleTimers.entrySet()) {
                    pw.print("  "); pw.print(ent.getKey()); pw.println(":");
                    final IdleTimerParams params = ent.getValue();
                    pw.print("    timeout="); pw.print(params.timeout);
                    pw.print(" type="); pw.println(params.transportType);
                }
            }
        }
    }
    }


    /**
    /**
Loading