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

Commit da1f3a56 authored by Jack Yu's avatar Jack Yu Committed by android-build-merger
Browse files

Merge "Added slot id in the internal API" am: 045ff781

am: 5674b8e1

Change-Id: I12f2a0e8d75e593ac046368ee94d1f8d183d6ded
parents 6331bfd2 5674b8e1
Loading
Loading
Loading
Loading
+73 −102
Original line number Diff line number Diff line
@@ -86,15 +86,17 @@ public abstract class DataService extends Service {
    /** The reason of the data request is IWLAN handover */
    public static final int REQUEST_REASON_HANDOVER = 3;

    private static final int DATA_SERVICE_INTERNAL_REQUEST_INITIALIZE_SERVICE          = 1;
    private static final int DATA_SERVICE_REQUEST_SETUP_DATA_CALL                      = 2;
    private static final int DATA_SERVICE_REQUEST_DEACTIVATE_DATA_CALL                 = 3;
    private static final int DATA_SERVICE_REQUEST_SET_INITIAL_ATTACH_APN               = 4;
    private static final int DATA_SERVICE_REQUEST_SET_DATA_PROFILE                     = 5;
    private static final int DATA_SERVICE_REQUEST_GET_DATA_CALL_LIST                   = 6;
    private static final int DATA_SERVICE_REQUEST_REGISTER_DATA_CALL_LIST_CHANGED      = 7;
    private static final int DATA_SERVICE_REQUEST_UNREGISTER_DATA_CALL_LIST_CHANGED    = 8;
    private static final int DATA_SERVICE_INDICATION_DATA_CALL_LIST_CHANGED            = 9;
    private static final int DATA_SERVICE_CREATE_DATA_SERVICE_PROVIDER                 = 1;
    private static final int DATA_SERVICE_REMOVE_DATA_SERVICE_PROVIDER                 = 2;
    private static final int DATA_SERVICE_REMOVE_ALL_DATA_SERVICE_PROVIDERS            = 3;
    private static final int DATA_SERVICE_REQUEST_SETUP_DATA_CALL                      = 4;
    private static final int DATA_SERVICE_REQUEST_DEACTIVATE_DATA_CALL                 = 5;
    private static final int DATA_SERVICE_REQUEST_SET_INITIAL_ATTACH_APN               = 6;
    private static final int DATA_SERVICE_REQUEST_SET_DATA_PROFILE                     = 7;
    private static final int DATA_SERVICE_REQUEST_GET_DATA_CALL_LIST                   = 8;
    private static final int DATA_SERVICE_REQUEST_REGISTER_DATA_CALL_LIST_CHANGED      = 9;
    private static final int DATA_SERVICE_REQUEST_UNREGISTER_DATA_CALL_LIST_CHANGED    = 10;
    private static final int DATA_SERVICE_INDICATION_DATA_CALL_LIST_CHANGED            = 11;

    private final HandlerThread mHandlerThread;

@@ -102,7 +104,7 @@ public abstract class DataService extends Service {

    private final SparseArray<DataServiceProvider> mServiceMap = new SparseArray<>();

    private final SparseArray<IDataServiceWrapper> mBinderMap = new SparseArray<>();
    private final IBinder mBinder = new IDataServiceWrapper();

    /**
     * The abstract class of the actual data service implementation. The data service provider
@@ -321,23 +323,34 @@ public abstract class DataService extends Service {
        public void handleMessage(Message message) {
            IDataServiceCallback callback;
            final int slotId = message.arg1;
            DataServiceProvider service;

            synchronized (mServiceMap) {
                service = mServiceMap.get(slotId);
            }
            DataServiceProvider serviceProvider = mServiceMap.get(slotId);

            switch (message.what) {
                case DATA_SERVICE_INTERNAL_REQUEST_INITIALIZE_SERVICE:
                    service = createDataServiceProvider(message.arg1);
                    if (service != null) {
                        mServiceMap.put(slotId, service);
                case DATA_SERVICE_CREATE_DATA_SERVICE_PROVIDER:
                    serviceProvider = createDataServiceProvider(message.arg1);
                    if (serviceProvider != null) {
                        mServiceMap.put(slotId, serviceProvider);
                    }
                    break;
                case DATA_SERVICE_REMOVE_DATA_SERVICE_PROVIDER:
                    if (serviceProvider != null) {
                        serviceProvider.onDestroy();
                        mServiceMap.remove(slotId);
                    }
                    break;
                case DATA_SERVICE_REMOVE_ALL_DATA_SERVICE_PROVIDERS:
                    for (int i = 0; i < mServiceMap.size(); i++) {
                        serviceProvider = mServiceMap.get(i);
                        if (serviceProvider != null) {
                            serviceProvider.onDestroy();
                        }
                    }
                    mServiceMap.clear();
                    break;
                case DATA_SERVICE_REQUEST_SETUP_DATA_CALL:
                    if (service == null) break;
                    if (serviceProvider == null) break;
                    SetupDataCallRequest setupDataCallRequest = (SetupDataCallRequest) message.obj;
                    service.setupDataCall(setupDataCallRequest.accessNetworkType,
                    serviceProvider.setupDataCall(setupDataCallRequest.accessNetworkType,
                            setupDataCallRequest.dataProfile, setupDataCallRequest.isRoaming,
                            setupDataCallRequest.allowRoaming, setupDataCallRequest.reason,
                            setupDataCallRequest.linkProperties,
@@ -345,46 +358,46 @@ public abstract class DataService extends Service {

                    break;
                case DATA_SERVICE_REQUEST_DEACTIVATE_DATA_CALL:
                    if (service == null) break;
                    if (serviceProvider == null) break;
                    DeactivateDataCallRequest deactivateDataCallRequest =
                            (DeactivateDataCallRequest) message.obj;
                    service.deactivateDataCall(deactivateDataCallRequest.cid,
                    serviceProvider.deactivateDataCall(deactivateDataCallRequest.cid,
                            deactivateDataCallRequest.reason,
                            new DataServiceCallback(deactivateDataCallRequest.callback));
                    break;
                case DATA_SERVICE_REQUEST_SET_INITIAL_ATTACH_APN:
                    if (service == null) break;
                    if (serviceProvider == null) break;
                    SetInitialAttachApnRequest setInitialAttachApnRequest =
                            (SetInitialAttachApnRequest) message.obj;
                    service.setInitialAttachApn(setInitialAttachApnRequest.dataProfile,
                    serviceProvider.setInitialAttachApn(setInitialAttachApnRequest.dataProfile,
                            setInitialAttachApnRequest.isRoaming,
                            new DataServiceCallback(setInitialAttachApnRequest.callback));
                    break;
                case DATA_SERVICE_REQUEST_SET_DATA_PROFILE:
                    if (service == null) break;
                    if (serviceProvider == null) break;
                    SetDataProfileRequest setDataProfileRequest =
                            (SetDataProfileRequest) message.obj;
                    service.setDataProfile(setDataProfileRequest.dps,
                    serviceProvider.setDataProfile(setDataProfileRequest.dps,
                            setDataProfileRequest.isRoaming,
                            new DataServiceCallback(setDataProfileRequest.callback));
                    break;
                case DATA_SERVICE_REQUEST_GET_DATA_CALL_LIST:
                    if (service == null) break;
                    if (serviceProvider == null) break;

                    service.getDataCallList(new DataServiceCallback(
                    serviceProvider.getDataCallList(new DataServiceCallback(
                            (IDataServiceCallback) message.obj));
                    break;
                case DATA_SERVICE_REQUEST_REGISTER_DATA_CALL_LIST_CHANGED:
                    if (service == null) break;
                    service.registerForDataCallListChanged((IDataServiceCallback) message.obj);
                    if (serviceProvider == null) break;
                    serviceProvider.registerForDataCallListChanged((IDataServiceCallback) message.obj);
                    break;
                case DATA_SERVICE_REQUEST_UNREGISTER_DATA_CALL_LIST_CHANGED:
                    if (service == null) break;
                    if (serviceProvider == null) break;
                    callback = (IDataServiceCallback) message.obj;
                    service.unregisterForDataCallListChanged(callback);
                    serviceProvider.unregisterForDataCallListChanged(callback);
                    break;
                case DATA_SERVICE_INDICATION_DATA_CALL_LIST_CHANGED:
                    if (service == null) break;
                    if (serviceProvider == null) break;
                    DataCallListChangedIndication indication =
                            (DataCallListChangedIndication) message.obj;
                    try {
@@ -423,67 +436,19 @@ public abstract class DataService extends Service {
            loge("Unexpected intent " + intent);
            return null;
        }

        int slotId = intent.getIntExtra(
                DATA_SERVICE_EXTRA_SLOT_ID, SubscriptionManager.INVALID_SIM_SLOT_INDEX);

        if (!SubscriptionManager.isValidSlotIndex(slotId)) {
            loge("Invalid slot id " + slotId);
            return null;
        }

        log("onBind: slot id=" + slotId);

        IDataServiceWrapper binder = mBinderMap.get(slotId);
        if (binder == null) {
            Message msg = mHandler.obtainMessage(DATA_SERVICE_INTERNAL_REQUEST_INITIALIZE_SERVICE);
            msg.arg1 = slotId;
            msg.sendToTarget();

            binder = new IDataServiceWrapper(slotId);
            mBinderMap.put(slotId, binder);
        }

        return binder;
        return mBinder;
    }

    /** @hide */
    @Override
    public boolean onUnbind(Intent intent) {
        int slotId = intent.getIntExtra(DATA_SERVICE_EXTRA_SLOT_ID,
                SubscriptionManager.INVALID_SIM_SLOT_INDEX);
        if (mBinderMap.get(slotId) != null) {
            DataServiceProvider serviceImpl;
            synchronized (mServiceMap) {
                serviceImpl = mServiceMap.get(slotId);
            }
            if (serviceImpl != null) {
                serviceImpl.onDestroy();
            }
            mBinderMap.remove(slotId);
        }

        // If all clients unbinds, quit the handler thread
        if (mBinderMap.size() == 0) {
            mHandlerThread.quit();
        }

        mHandler.obtainMessage(DATA_SERVICE_REMOVE_ALL_DATA_SERVICE_PROVIDERS).sendToTarget();
        return false;
    }

    /** @hide */
    @Override
    public void onDestroy() {
        synchronized (mServiceMap) {
            for (int i = 0; i < mServiceMap.size(); i++) {
                DataServiceProvider serviceImpl = mServiceMap.get(i);
                if (serviceImpl != null) {
                    serviceImpl.onDestroy();
                }
            }
            mServiceMap.clear();
        }

        mHandlerThread.quit();
    }

@@ -491,68 +456,74 @@ public abstract class DataService extends Service {
     * A wrapper around IDataService that forwards calls to implementations of {@link DataService}.
     */
    private class IDataServiceWrapper extends IDataService.Stub {
        @Override
        public void createDataServiceProvider(int slotId) {
            mHandler.obtainMessage(DATA_SERVICE_CREATE_DATA_SERVICE_PROVIDER, slotId, 0)
                    .sendToTarget();
        }

        private final int mSlotId;

        IDataServiceWrapper(int slotId) {
            mSlotId = slotId;
        @Override
        public void removeDataServiceProvider(int slotId) {
            mHandler.obtainMessage(DATA_SERVICE_REMOVE_DATA_SERVICE_PROVIDER, slotId, 0)
                    .sendToTarget();
        }

        @Override
        public void setupDataCall(int accessNetworkType, DataProfile dataProfile,
        public void setupDataCall(int slotId, int accessNetworkType, DataProfile dataProfile,
                                  boolean isRoaming, boolean allowRoaming, int reason,
                                  LinkProperties linkProperties, IDataServiceCallback callback) {
            mHandler.obtainMessage(DATA_SERVICE_REQUEST_SETUP_DATA_CALL, mSlotId, 0,
            mHandler.obtainMessage(DATA_SERVICE_REQUEST_SETUP_DATA_CALL, slotId, 0,
                    new SetupDataCallRequest(accessNetworkType, dataProfile, isRoaming,
                            allowRoaming, reason, linkProperties, callback))
                    .sendToTarget();
        }

        @Override
        public void deactivateDataCall(int cid, int reason, IDataServiceCallback callback) {
            mHandler.obtainMessage(DATA_SERVICE_REQUEST_DEACTIVATE_DATA_CALL, mSlotId, 0,
        public void deactivateDataCall(int slotId, int cid, int reason,
                                       IDataServiceCallback callback) {
            mHandler.obtainMessage(DATA_SERVICE_REQUEST_DEACTIVATE_DATA_CALL, slotId, 0,
                    new DeactivateDataCallRequest(cid, reason, callback))
                    .sendToTarget();
        }

        @Override
        public void setInitialAttachApn(DataProfile dataProfile, boolean isRoaming,
        public void setInitialAttachApn(int slotId, DataProfile dataProfile, boolean isRoaming,
                                        IDataServiceCallback callback) {
            mHandler.obtainMessage(DATA_SERVICE_REQUEST_SET_INITIAL_ATTACH_APN, mSlotId, 0,
            mHandler.obtainMessage(DATA_SERVICE_REQUEST_SET_INITIAL_ATTACH_APN, slotId, 0,
                    new SetInitialAttachApnRequest(dataProfile, isRoaming, callback))
                    .sendToTarget();
        }

        @Override
        public void setDataProfile(List<DataProfile> dps, boolean isRoaming,
        public void setDataProfile(int slotId, List<DataProfile> dps, boolean isRoaming,
                                   IDataServiceCallback callback) {
            mHandler.obtainMessage(DATA_SERVICE_REQUEST_SET_DATA_PROFILE, mSlotId, 0,
            mHandler.obtainMessage(DATA_SERVICE_REQUEST_SET_DATA_PROFILE, slotId, 0,
                    new SetDataProfileRequest(dps, isRoaming, callback)).sendToTarget();
        }

        @Override
        public void getDataCallList(IDataServiceCallback callback) {
            mHandler.obtainMessage(DATA_SERVICE_REQUEST_GET_DATA_CALL_LIST, mSlotId, 0,
        public void getDataCallList(int slotId, IDataServiceCallback callback) {
            mHandler.obtainMessage(DATA_SERVICE_REQUEST_GET_DATA_CALL_LIST, slotId, 0,
                    callback).sendToTarget();
        }

        @Override
        public void registerForDataCallListChanged(IDataServiceCallback callback) {
        public void registerForDataCallListChanged(int slotId, IDataServiceCallback callback) {
            if (callback == null) {
                loge("Callback is null");
                return;
            }
            mHandler.obtainMessage(DATA_SERVICE_REQUEST_REGISTER_DATA_CALL_LIST_CHANGED, mSlotId,
            mHandler.obtainMessage(DATA_SERVICE_REQUEST_REGISTER_DATA_CALL_LIST_CHANGED, slotId,
                    0, callback).sendToTarget();
        }

        @Override
        public void unregisterForDataCallListChanged(IDataServiceCallback callback) {
        public void unregisterForDataCallListChanged(int slotId, IDataServiceCallback callback) {
            if (callback == null) {
                loge("Callback is null");
                return;
            }
            mHandler.obtainMessage(DATA_SERVICE_REQUEST_UNREGISTER_DATA_CALL_LIST_CHANGED, mSlotId,
            mHandler.obtainMessage(DATA_SERVICE_REQUEST_UNREGISTER_DATA_CALL_LIST_CHANGED, slotId,
                    0, callback).sendToTarget();
        }
    }
+10 −7
Original line number Diff line number Diff line
@@ -25,14 +25,17 @@ import android.telephony.data.IDataServiceCallback;
 */
oneway interface IDataService
{
    void setupDataCall(int accessNetwork, in DataProfile dataProfile, boolean isRoaming,
    void createDataServiceProvider(int slotId);
    void removeDataServiceProvider(int slotId);
    void setupDataCall(int slotId, int accessNetwork, in DataProfile dataProfile, boolean isRoaming,
                       boolean allowRoaming, int reason, in LinkProperties linkProperties,
                       IDataServiceCallback callback);
    void deactivateDataCall(int cid, int reason, IDataServiceCallback callback);
    void setInitialAttachApn(in DataProfile dataProfile, boolean isRoaming,
    void deactivateDataCall(int slotId, int cid, int reason, IDataServiceCallback callback);
    void setInitialAttachApn(int slotId, in DataProfile dataProfile, boolean isRoaming,
                             IDataServiceCallback callback);
    void setDataProfile(in List<DataProfile> dps, boolean isRoaming, IDataServiceCallback callback);
    void getDataCallList(IDataServiceCallback callback);
    void registerForDataCallListChanged(IDataServiceCallback callback);
    void unregisterForDataCallListChanged(IDataServiceCallback callback);
    void setDataProfile(int slotId, in List<DataProfile> dps, boolean isRoaming,
                        IDataServiceCallback callback);
    void getDataCallList(int slotId, IDataServiceCallback callback);
    void registerForDataCallListChanged(int slotId, IDataServiceCallback callback);
    void unregisterForDataCallListChanged(int slotId, IDataServiceCallback callback);
}