Merge "Added slot id in the internal API" am: 045ff781b9
am: 5674b8e119
Change-Id: I12f2a0e8d75e593ac046368ee94d1f8d183d6ded
This commit is contained in:
@@ -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 {
|
||||
|
||||
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<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();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user