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

Commit 6966e1f6 authored by Jack Yu's avatar Jack Yu
Browse files

Improved data network controller callback

Added executor support and added basic data
network setup unit tests.

Bug: 196597630
Test: atest DataNetworkControllerTest
Merged-In: Id33662363908e47e5827f256d675888ccd516704
Change-Id: Id33662363908e47e5827f256d675888ccd516704
parent fa1677a9
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -4909,6 +4909,7 @@ public class ServiceStateTracker extends Handler {
            if (!mPendingRadioPowerOffAfterDataOff) {
                if (mPhone.isUsingNewDataStack()) {
                    mPhone.getDataNetworkController().registerDataNetworkControllerCallback(
                            this::post,
                            new DataNetworkController.DataNetworkControllerCallback() {
                                @Override
                                public void onAllDataNetworksDisconnected() {
+90 −46
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@

package com.android.internal.telephony.data;

import android.annotation.CallbackExecutor;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.content.BroadcastReceiver;
@@ -55,6 +56,7 @@ import android.telephony.ims.RegistrationManager;
import android.telephony.ims.feature.ImsFeature;
import android.text.TextUtils;
import android.util.ArrayMap;
import android.util.ArraySet;
import android.util.IndentingPrintWriter;
import android.util.LocalLog;
import android.util.SparseArray;
@@ -87,6 +89,7 @@ import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
import java.util.concurrent.Executor;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.stream.Collectors;
@@ -394,40 +397,53 @@ public class DataNetworkController extends Handler {
     * internally in the data stack, should not be used externally.
     */
    public static class DataNetworkControllerCallback {
        /** The executor of the callback. */
        private Executor mExecutor;

        /**
         * indicates the callback is automatically unregistered after first invocation. This is
         * Indicates the callback is automatically unregistered after first invocation. This is
         * useful for the clients which only want to get the result once.
         */
        private boolean mAutoUnregisterEnabled = false;

        /**
         * Indicates callback auto unregister should be skipped this time. This
         * is internally used by {@link DataNetworkControllerCallbackList}.
         */
        private boolean mSkipAutoUnregisterThisTime = false;

        /**
         * Called when internet data network validation status changed.
         * Set the executor of the callback.
         *
         * @param validationStatus The validation status.
         * @param executor The executor
         * @param enableAutoUnregister {@code true} if this callback should be unregistered
         * automatically after invoked the overridden callback method.
         */
        public void onInternetDataNetworkValidationStatusChanged(
                @ValidationStatus int validationStatus) {
            mSkipAutoUnregisterThisTime = true;
        final void init(@NonNull @CallbackExecutor Executor executor,
                boolean enableAutoUnregister) {
            Objects.requireNonNull(executor);
            mExecutor = executor;
            mAutoUnregisterEnabled = enableAutoUnregister;
        }

        /** Called when internet data network is connected. */
        public void onInternetDataNetworkConnected() {
            mSkipAutoUnregisterThisTime = true;
        }

        /** Called when internet data network is disconnected. */
        public void onInternetDataNetworkDisconnected() {
            mSkipAutoUnregisterThisTime = true;
        /**
         * @return The executor of the callback.
         */
        final Executor getExecutor() {
            return mExecutor;
        }

        /** Called when all data networks are disconnected. */
        public void onAllDataNetworksDisconnected() {
            mSkipAutoUnregisterThisTime = true;
        /**
         * @return {@code true} if this callback should be unregistered automatically after invoked
         * the overridden callback method.
         */
        final boolean isAutoUnregisterEnabled() {
            return mAutoUnregisterEnabled;
        }

        /**
         * @return {@code true} indicates the callback is automatically unregistered after first
         * invocation. This is useful for the clients which only want to get the result once.
         * @return {@code true} if the callback auto unregister should be skipped this time. This
         * is internally used by {@link DataNetworkControllerCallbackList}.
         */
        final boolean shouldSkipAutoUnregister() {
            return mSkipAutoUnregisterThisTime;
@@ -442,6 +458,34 @@ public class DataNetworkController extends Handler {
        final void setSkipAutoUnregister(boolean skip) {
            mSkipAutoUnregisterThisTime = skip;
        }

        /**
         * Called when internet data network validation status changed.
         *
         * @param validationStatus The validation status.
         */
        public void onInternetDataNetworkValidationStatusChanged(
                @ValidationStatus int validationStatus) {
            mSkipAutoUnregisterThisTime = true;
        }

        /** Called when internet data network is connected. */
        public void onInternetDataNetworkConnected() {
            // Never remove this line.
            mSkipAutoUnregisterThisTime = true;
        }

        /** Called when internet data network is disconnected. */
        public void onInternetDataNetworkDisconnected() {
            // Never remove this line.
            mSkipAutoUnregisterThisTime = true;
        }

        /** Called when all data networks are disconnected. */
        public void onAllDataNetworksDisconnected() {
            // Never remove this line.
            mSkipAutoUnregisterThisTime = true;
        }
    }

    /**
@@ -449,24 +493,17 @@ public class DataNetworkController extends Handler {
     */
    @VisibleForTesting
    public class DataNetworkControllerCallbackList {
        /**
         * Callbacks map. The key is the callback, value indicates this callback should be
         * auto-unregistered or not.
         */
        private final @NonNull Map<DataNetworkControllerCallback, Boolean> mCallbacks =
                new ArrayMap<>();
        /** Callbacks set. */
        private final @NonNull Set<DataNetworkControllerCallback> mCallbacks = new ArraySet<>();

        /**
         * Register the callback.
         *
         * @param callback The callback.
         * @param autoUnregister {@code true} means the callback will be auto unregistered once the
         * callback is called once.
         */
        public void registerCallback(@NonNull DataNetworkControllerCallback callback,
                boolean autoUnregister) {
            Objects.requireNonNull(callback);
            mCallbacks.put(callback, autoUnregister);
        public void registerCallback(@NonNull DataNetworkControllerCallback callback) {
            logv("registerCallback: " + callback);
            mCallbacks.add(Objects.requireNonNull(callback));

            if (mDataNetworkList.isEmpty()) {
                notifyListeners(DataNetworkControllerCallback::onAllDataNetworksDisconnected);
@@ -479,6 +516,7 @@ public class DataNetworkController extends Handler {
         * @param callback The callback.
         */
        public void unregisterCallback(@NonNull DataNetworkControllerCallback callback) {
            logv("unregisterCallback: " + callback);
            mCallbacks.remove(callback);
        }

@@ -488,16 +526,12 @@ public class DataNetworkController extends Handler {
         * @param callbackConsumer The consumer which contains the actual callback method.
         */
        public void notifyListeners(Consumer<DataNetworkControllerCallback> callbackConsumer) {
            Iterator<Map.Entry<DataNetworkControllerCallback, Boolean>> it =
                    mCallbacks.entrySet().iterator();
            Iterator<DataNetworkControllerCallback> it = mCallbacks.iterator();
            while (it.hasNext()) {
                Map.Entry<DataNetworkControllerCallback, Boolean> callbackEntry = it.next();

                DataNetworkControllerCallback callback = callbackEntry.getKey();
                DataNetworkControllerCallback callback = it.next();
                callback.setSkipAutoUnregister(false);
                // Invoke the actual callback passed in consumer.
                callbackConsumer.accept(callback);

                callback.getExecutor().execute(() -> callbackConsumer.accept(callback));
                // The client might not override this method, we should skip auto unregister in
                // this case.
                if (callback.shouldSkipAutoUnregister()) {
@@ -507,8 +541,7 @@ public class DataNetworkController extends Handler {

                // If the callback was registered as an auto-unregistered callback, unregister now
                // since the callback has been invoked.
                boolean isAutoUnregisterCallback = callbackEntry.getValue();
                if (isAutoUnregisterCallback) {
                if (callback.isAutoUnregisterEnabled()) {
                    logv("Callback " + callback + " automatically removed.");
                    it.remove();
                }
@@ -633,7 +666,7 @@ public class DataNetworkController extends Handler {
                break;
            case EVENT_REGISTER_DATA_NETWORK_CONTROLLER_CALLBACK:
                mDataNetworkControllerCallbacks
                        .registerCallback((DataNetworkControllerCallback) msg.obj, msg.arg1 == 1);
                        .registerCallback((DataNetworkControllerCallback) msg.obj);
                break;
            case EVENT_UNREGISTER_DATA_NETWORK_CONTROLLER_CALLBACK:
                mDataNetworkControllerCallbacks.unregisterCallback(
@@ -1517,14 +1550,25 @@ public class DataNetworkController extends Handler {
    /**
     * Register data network controller callback.
     *
     * @param executor The executor of the callback.
     * @param callback The callback.
     * @oaram autoUnregister {@code true} Indicates that once the callback is called, unregister
     * the callback automatically.
     * @param autoUnregister {@code true} if this callback should be unregistered automatically
     * after invoked the overridden callback method.
     */
    public void registerDataNetworkControllerCallback(
    public void registerDataNetworkControllerCallback(@NonNull @CallbackExecutor Executor executor,
            @NonNull DataNetworkControllerCallback callback, boolean autoUnregister) {
        sendMessage(obtainMessage(EVENT_REGISTER_DATA_NETWORK_CONTROLLER_CALLBACK,
                (autoUnregister ? 1 : 0), 0, callback));
        callback.init(executor, autoUnregister);
        sendMessage(obtainMessage(EVENT_REGISTER_DATA_NETWORK_CONTROLLER_CALLBACK, callback));
    }

    /**
     * Unregister data network controller callback.
     *
     * @param callback The callback.
     */
    public void unregisterDataNetworkControllerCallback(
            @NonNull DataNetworkControllerCallback callback) {
        sendMessage(obtainMessage(EVENT_UNREGISTER_DATA_NETWORK_CONTROLLER_CALLBACK, callback));
    }

    /**
+4 −22
Original line number Diff line number Diff line
@@ -71,15 +71,6 @@ public class DataStallRecoveryManager extends Handler {
    /** Event for data config updated. */
    private static final int EVENT_DATA_CONFIG_UPDATED = 1;

    /** Event for internet validation status changed. */
    private static final int EVENT_INTERNET_VALIDATION_STATUS_CHANGED = 2;

    /** Event for internet data network connected. */
    private static final int EVENT_INTERNET_CONNECTED = 3;

    /** Event for internet data network disconnected. */
    private static final int EVENT_INTERNET_DISCONNECTED = 4;

    private final @NonNull Phone mPhone;
    private final @NonNull String mLogTag;
    private final @NonNull LocalLog mLocalLog = new LocalLog(128);
@@ -155,22 +146,22 @@ public class DataStallRecoveryManager extends Handler {
    private void registerAllEvents() {
        mDataConfigManager.registerForConfigUpdate(this, EVENT_DATA_CONFIG_UPDATED);
        mDataNetworkController.registerDataNetworkControllerCallback(
                this::post,
                new DataNetworkControllerCallback() {
                    @Override
                    public void onInternetDataNetworkValidationStatusChanged(
                            @ValidationStatus int validationStatus) {
                        sendMessage(obtainMessage(EVENT_INTERNET_VALIDATION_STATUS_CHANGED,
                                validationStatus, 0));
                        onInternetValidationStatusChanged(validationStatus);
                    }

                    @Override
                    public void onInternetDataNetworkConnected() {
                        sendEmptyMessage(EVENT_INTERNET_CONNECTED);
                        // onInternetDataNetworkConnected();
                    }

                    @Override
                    public void onInternetDataNetworkDisconnected() {
                        sendEmptyMessage(EVENT_INTERNET_DISCONNECTED);
                        // onInternetDataNetworkDisconnected();
                    }
                }, false);
        mTelephonyManager.registerTelephonyCallback(
@@ -206,15 +197,6 @@ public class DataStallRecoveryManager extends Handler {
            case EVENT_DATA_CONFIG_UPDATED:
                onDataConfigUpdated();
                break;
            case EVENT_INTERNET_VALIDATION_STATUS_CHANGED:
                onInternetValidationStatusChanged(msg.arg1);
                break;
            case EVENT_INTERNET_CONNECTED:
                // handle internet connected event.
                break;
            case EVENT_INTERNET_DISCONNECTED:
                // handle internet disconnected event.
                break;
            default:
                loge("Unexpected message " + msg);
                break;
+182 −24

File changed.

Preview size limit exceeded, changes collapsed.