diff --git a/telephony/java/android/telephony/data/DataService.java b/telephony/java/android/telephony/data/DataService.java index fa19ea0690440..c4f9022c31cee 100644 --- a/telephony/java/android/telephony/data/DataService.java +++ b/telephony/java/android/telephony/data/DataService.java @@ -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 mServiceMap = new SparseArray<>(); - private final SparseArray 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 { - - private final int mSlotId; - - IDataServiceWrapper(int slotId) { - mSlotId = slotId; + @Override + public void createDataServiceProvider(int slotId) { + mHandler.obtainMessage(DATA_SERVICE_CREATE_DATA_SERVICE_PROVIDER, slotId, 0) + .sendToTarget(); } @Override - public void setupDataCall(int accessNetworkType, DataProfile dataProfile, + public void removeDataServiceProvider(int slotId) { + mHandler.obtainMessage(DATA_SERVICE_REMOVE_DATA_SERVICE_PROVIDER, slotId, 0) + .sendToTarget(); + } + + @Override + 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 dps, boolean isRoaming, + public void setDataProfile(int slotId, List 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(); } } diff --git a/telephony/java/android/telephony/data/IDataService.aidl b/telephony/java/android/telephony/data/IDataService.aidl index 07720b69e45f2..d4d9be85ffa88 100644 --- a/telephony/java/android/telephony/data/IDataService.aidl +++ b/telephony/java/android/telephony/data/IDataService.aidl @@ -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 dps, boolean isRoaming, IDataServiceCallback callback); - void getDataCallList(IDataServiceCallback callback); - void registerForDataCallListChanged(IDataServiceCallback callback); - void unregisterForDataCallListChanged(IDataServiceCallback callback); + void setDataProfile(int slotId, in List dps, boolean isRoaming, + IDataServiceCallback callback); + void getDataCallList(int slotId, IDataServiceCallback callback); + void registerForDataCallListChanged(int slotId, IDataServiceCallback callback); + void unregisterForDataCallListChanged(int slotId, IDataServiceCallback callback); }