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

Commit 5a009161 authored by Treehugger Robot's avatar Treehugger Robot Committed by Automerger Merge Worker
Browse files

Merge "Add setEthernetEnabled and its listener API" am: 3b481235 am: c05949b4

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

Change-Id: Ifa06c4f75acb872c3297d2a9a77101bebbad1c05
parents c3f28b77 c05949b4
Loading
Loading
Loading
Loading
+126 −25
Original line number Diff line number Diff line
@@ -41,6 +41,7 @@ import java.lang.annotation.RetentionPolicy;
import java.util.ArrayList;
import java.util.Objects;
import java.util.concurrent.Executor;
import java.util.function.IntConsumer;

/**
 * A class that manages and configures Ethernet interfaces.
@@ -53,15 +54,31 @@ public class EthernetManager {
    private static final String TAG = "EthernetManager";

    private final IEthernetManager mService;
    @GuardedBy("mListeners")
    private final ArrayList<ListenerInfo> mListeners = new ArrayList<>();
    @GuardedBy("mListenerLock")
    private final ArrayList<ListenerInfo<InterfaceStateListener>> mIfaceListeners =
            new ArrayList<>();
    @GuardedBy("mListenerLock")
    private final ArrayList<ListenerInfo<IntConsumer>> mEthernetStateListeners =
            new ArrayList<>();
    final Object mListenerLock = new Object();
    private final IEthernetServiceListener.Stub mServiceListener =
            new IEthernetServiceListener.Stub() {
                @Override
                public void onEthernetStateChanged(int state) {
                    synchronized (mListenerLock) {
                        for (ListenerInfo<IntConsumer> li : mEthernetStateListeners) {
                            li.executor.execute(() -> {
                                li.listener.accept(state);
                            });
                        }
                    }
                }

                @Override
                public void onInterfaceStateChanged(String iface, int state, int role,
                        IpConfiguration configuration) {
                    synchronized (mListeners) {
                        for (ListenerInfo li : mListeners) {
                    synchronized (mListenerLock) {
                        for (ListenerInfo<InterfaceStateListener> li : mIfaceListeners) {
                            li.executor.execute(() ->
                                    li.listener.onInterfaceStateChanged(iface, state, role,
                                            configuration));
@@ -70,13 +87,29 @@ public class EthernetManager {
                }
            };

    private static class ListenerInfo {
    /**
     * Indicates that Ethernet is disabled.
     *
     * @hide
     */
    @SystemApi(client = MODULE_LIBRARIES)
    public static final int ETHERNET_STATE_DISABLED = 0;

    /**
     * Indicates that Ethernet is enabled.
     *
     * @hide
     */
    @SystemApi(client = MODULE_LIBRARIES)
    public static final int ETHERNET_STATE_ENABLED  = 1;

    private static class ListenerInfo<T> {
        @NonNull
        public final Executor executor;
        @NonNull
        public final InterfaceStateListener listener;
        public final T listener;

        private ListenerInfo(@NonNull Executor executor, @NonNull InterfaceStateListener listener) {
        private ListenerInfo(@NonNull Executor executor, @NonNull T listener) {
            this.executor = executor;
            this.listener = listener;
        }
@@ -289,16 +322,22 @@ public class EthernetManager {
        if (listener == null || executor == null) {
            throw new NullPointerException("listener and executor must not be null");
        }
        synchronized (mListeners) {
            mListeners.add(new ListenerInfo(executor, listener));
            if (mListeners.size() == 1) {
        synchronized (mListenerLock) {
            maybeAddServiceListener();
            mIfaceListeners.add(new ListenerInfo<InterfaceStateListener>(executor, listener));
        }
    }

    @GuardedBy("mListenerLock")
    private void maybeAddServiceListener() {
        if (!mIfaceListeners.isEmpty() || !mEthernetStateListeners.isEmpty()) return;

        try {
            mService.addListener(mServiceListener);
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }
            }
        }

    }

    /**
@@ -323,17 +362,22 @@ public class EthernetManager {
    @SystemApi(client = MODULE_LIBRARIES)
    public void removeInterfaceStateListener(@NonNull InterfaceStateListener listener) {
        Objects.requireNonNull(listener);
        synchronized (mListeners) {
            mListeners.removeIf(l -> l.listener == listener);
            if (mListeners.isEmpty()) {
        synchronized (mListenerLock) {
            mIfaceListeners.removeIf(l -> l.listener == listener);
            maybeRemoveServiceListener();
        }
    }

    @GuardedBy("mListenerLock")
    private void maybeRemoveServiceListener() {
        if (!mIfaceListeners.isEmpty() || !mEthernetStateListeners.isEmpty()) return;

        try {
            mService.removeListener(mServiceListener);
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }
    }
        }
    }

    /**
     * Removes a listener.
@@ -611,4 +655,61 @@ public class EthernetManager {
            throw e.rethrowFromSystemServer();
        }
    }

    /**
     * Change ethernet setting.
     *
     * @param enabled enable or disable ethernet settings.
     *
     * @hide
     */
    @RequiresPermission(anyOf = {
            NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK,
            android.Manifest.permission.NETWORK_STACK,
            android.Manifest.permission.NETWORK_SETTINGS})
    @SystemApi(client = MODULE_LIBRARIES)
    public void setEthernetEnabled(boolean enabled) {
        try {
            mService.setEthernetEnabled(enabled);
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }
    }

    /**
     * Listen to changes in the state of ethernet.
     *
     * @param executor to run callbacks on.
     * @param listener to listen ethernet state changed.
     *
     * @hide
     */
    @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE)
    @SystemApi(client = MODULE_LIBRARIES)
    public void addEthernetStateListener(@NonNull Executor executor,
            @NonNull IntConsumer listener) {
        Objects.requireNonNull(executor);
        Objects.requireNonNull(listener);
        synchronized (mListenerLock) {
            maybeAddServiceListener();
            mEthernetStateListeners.add(new ListenerInfo<IntConsumer>(executor, listener));
        }
    }

    /**
     * Removes a listener.
     *
     * @param listener to listen ethernet state changed.
     *
     * @hide
     */
    @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE)
    @SystemApi(client = MODULE_LIBRARIES)
    public void removeEthernetStateListener(@NonNull IntConsumer listener) {
        Objects.requireNonNull(listener);
        synchronized (mListenerLock) {
            mEthernetStateListeners.removeIf(l -> l.listener == listener);
            maybeRemoveServiceListener();
        }
    }
}
+1 −0
Original line number Diff line number Diff line
@@ -43,4 +43,5 @@ interface IEthernetManager
        in INetworkInterfaceOutcomeReceiver listener);
    void connectNetwork(String iface, in INetworkInterfaceOutcomeReceiver listener);
    void disconnectNetwork(String iface, in INetworkInterfaceOutcomeReceiver listener);
    void setEthernetEnabled(boolean enabled);
}
+1 −0
Original line number Diff line number Diff line
@@ -21,6 +21,7 @@ import android.net.IpConfiguration;
/** @hide */
oneway interface IEthernetServiceListener
{
    void onEthernetStateChanged(int state);
    void onInterfaceStateChanged(String iface, int state, int role,
            in IpConfiguration configuration);
}