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

Commit 8d48570f authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "ConnectivityManager: use ConnectivityThread looper"

parents 12bfe654 7724cdd8
Loading
Loading
Loading
Loading
+20 −39
Original line number Diff line number Diff line
@@ -2679,6 +2679,7 @@ public class ConnectivityManager {
    public static final int CALLBACK_IP_CHANGED          = BASE + 7;
    /** @hide */
    public static final int CALLBACK_RELEASED            = BASE + 8;
    // TODO: consider deleting CALLBACK_EXIT and shifting following enum codes down by 1.
    /** @hide */
    public static final int CALLBACK_EXIT                = BASE + 9;
    /** @hide obj = NetworkCapabilities, arg1 = seq number */
@@ -2790,24 +2791,16 @@ public class ConnectivityManager {
                    break;
                }
                case CALLBACK_RELEASED: {
                    NetworkCallback callback = null;
                    final NetworkCallback callback;
                    synchronized(sCallbacks) {
                        callback = sCallbacks.remove(request);
                    }
                    if (callback != null) {
                        synchronized(sCallbackRefCount) {
                            if (sCallbackRefCount.decrementAndGet() == 0) {
                                getLooper().quit();
                            }
                        }
                    } else {
                    if (callback == null) {
                        Log.e(TAG, "callback not found for RELEASED message");
                    }
                    break;
                }
                case CALLBACK_EXIT: {
                    Log.d(TAG, "Listener quitting");
                    getLooper().quit();
                    break;
                }
                case EXPIRE_LEGACY_REQUEST: {
@@ -2833,49 +2826,40 @@ public class ConnectivityManager {
        }
    }

    private void incCallbackHandlerRefCount() {
        synchronized(sCallbackRefCount) {
            if (sCallbackRefCount.incrementAndGet() == 1) {
                // TODO: switch this to ConnectivityThread
                HandlerThread callbackThread = new HandlerThread("ConnectivityManager");
                callbackThread.start();
                sCallbackHandler = new CallbackHandler(callbackThread.getLooper());
            }
        }
    }

    private void decCallbackHandlerRefCount() {
        synchronized(sCallbackRefCount) {
            if (sCallbackRefCount.decrementAndGet() == 0) {
                sCallbackHandler.obtainMessage(CALLBACK_EXIT).sendToTarget();
                sCallbackHandler = null;
    private CallbackHandler getHandler() {
        synchronized (sCallbacks) {
            if (sCallbackHandler == null) {
                sCallbackHandler = new CallbackHandler(ConnectivityThread.getInstanceLooper());
            }
            return sCallbackHandler;
        }
    }

    static final HashMap<NetworkRequest, NetworkCallback> sCallbacks = new HashMap<>();
    static final AtomicInteger sCallbackRefCount = new AtomicInteger(0);
    static CallbackHandler sCallbackHandler = null;
    static CallbackHandler sCallbackHandler;

    private final static int LISTEN  = 1;
    private final static int REQUEST = 2;

    private NetworkRequest sendRequestForNetwork(NetworkCapabilities need,
            NetworkCallback networkCallback, int timeoutMs, int action,
            int legacyType) {
        if (networkCallback == null) {
            NetworkCallback callback, int timeoutMs, int action, int legacyType) {
        return sendRequestForNetwork(need, callback, getHandler(), timeoutMs, action, legacyType);
    }

    private NetworkRequest sendRequestForNetwork(NetworkCapabilities need,
            NetworkCallback callback, Handler handler, int timeoutMs, int action, int legacyType) {
        if (callback == null) {
            throw new IllegalArgumentException("null NetworkCallback");
        }
        if (need == null && action != REQUEST) {
            throw new IllegalArgumentException("null NetworkCapabilities");
        }
        // TODO: throw an exception if networkCallback.networkRequest is not null.
        // TODO: throw an exception if callback.networkRequest is not null.
        // http://b/20701525
        final NetworkRequest request;
        try {
            incCallbackHandlerRefCount();
            synchronized(sCallbacks) {
                Messenger messenger = new Messenger(sCallbackHandler);
                Messenger messenger = new Messenger(handler);
                Binder binder = new Binder();
                if (action == LISTEN) {
                    request = mService.listenForNetwork(need, messenger, binder);
@@ -2884,16 +2868,13 @@ public class ConnectivityManager {
                            need, messenger, timeoutMs, binder, legacyType);
                }
                if (request != null) {
                    sCallbacks.put(request, networkCallback);
                    sCallbacks.put(request, callback);
                }
                networkCallback.networkRequest = request;
                callback.networkRequest = request;
            }
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }
        if (request == null) {
            decCallbackHandlerRefCount();
        }
        return request;
    }