Merge "Add slotId in INetworkService.aidl methods."

am: b1c6aa4567

Change-Id: I950f4617cbe6abcd8c943e1cc0b5aba60163f202
This commit is contained in:
Malcolm Chen
2018-01-25 15:06:59 +00:00
committed by android-build-merger
2 changed files with 65 additions and 82 deletions

View File

@@ -23,7 +23,9 @@ import android.telephony.INetworkServiceCallback;
*/ */
oneway interface INetworkService oneway interface INetworkService
{ {
void getNetworkRegistrationState(int domain, INetworkServiceCallback callback); void createNetworkServiceProvider(int slotId);
void registerForNetworkRegistrationStateChanged(INetworkServiceCallback callback); void removeNetworkServiceProvider(int slotId);
void unregisterForNetworkRegistrationStateChanged(INetworkServiceCallback callback); void getNetworkRegistrationState(int slotId, int domain, INetworkServiceCallback callback);
void registerForNetworkRegistrationStateChanged(int slotId, INetworkServiceCallback callback);
void unregisterForNetworkRegistrationStateChanged(int slotId, INetworkServiceCallback callback);
} }

View File

@@ -53,11 +53,13 @@ public abstract class NetworkService extends Service {
public static final String NETWORK_SERVICE_INTERFACE = "android.telephony.NetworkService"; public static final String NETWORK_SERVICE_INTERFACE = "android.telephony.NetworkService";
public static final String NETWORK_SERVICE_EXTRA_SLOT_ID = "android.telephony.extra.SLOT_ID"; public static final String NETWORK_SERVICE_EXTRA_SLOT_ID = "android.telephony.extra.SLOT_ID";
private static final int NETWORK_SERVICE_INTERNAL_REQUEST_INITIALIZE_SERVICE = 1; private static final int NETWORK_SERVICE_CREATE_NETWORK_SERVICE_PROVIDER = 1;
private static final int NETWORK_SERVICE_GET_REGISTRATION_STATE = 2; private static final int NETWORK_SERVICE_REMOVE_NETWORK_SERVICE_PROVIDER = 2;
private static final int NETWORK_SERVICE_REGISTER_FOR_STATE_CHANGE = 3; private static final int NETWORK_SERVICE_REMOVE_ALL_NETWORK_SERVICE_PROVIDERS = 3;
private static final int NETWORK_SERVICE_UNREGISTER_FOR_STATE_CHANGE = 4; private static final int NETWORK_SERVICE_GET_REGISTRATION_STATE = 4;
private static final int NETWORK_SERVICE_INDICATION_NETWORK_STATE_CHANGED = 5; private static final int NETWORK_SERVICE_REGISTER_FOR_STATE_CHANGE = 5;
private static final int NETWORK_SERVICE_UNREGISTER_FOR_STATE_CHANGE = 6;
private static final int NETWORK_SERVICE_INDICATION_NETWORK_STATE_CHANGED = 7;
private final HandlerThread mHandlerThread; private final HandlerThread mHandlerThread;
@@ -66,7 +68,7 @@ public abstract class NetworkService extends Service {
private final SparseArray<NetworkServiceProvider> mServiceMap = new SparseArray<>(); private final SparseArray<NetworkServiceProvider> mServiceMap = new SparseArray<>();
private final SparseArray<INetworkServiceWrapper> mBinderMap = new SparseArray<>(); private final INetworkServiceWrapper mBinder = new INetworkServiceWrapper();
/** /**
* The abstract class of the actual network service implementation. The network service provider * The abstract class of the actual network service implementation. The network service provider
@@ -147,37 +149,50 @@ public abstract class NetworkService extends Service {
public void handleMessage(Message message) { public void handleMessage(Message message) {
final int slotId = message.arg1; final int slotId = message.arg1;
final INetworkServiceCallback callback = (INetworkServiceCallback) message.obj; final INetworkServiceCallback callback = (INetworkServiceCallback) message.obj;
NetworkServiceProvider service;
synchronized (mServiceMap) { NetworkServiceProvider serviceProvider = mServiceMap.get(slotId);
service = mServiceMap.get(slotId);
}
switch (message.what) { switch (message.what) {
case NETWORK_SERVICE_INTERNAL_REQUEST_INITIALIZE_SERVICE: case NETWORK_SERVICE_CREATE_NETWORK_SERVICE_PROVIDER:
service = createNetworkServiceProvider(message.arg1); // If the service provider doesn't exist yet, we try to create it.
if (service != null) { if (serviceProvider == null) {
mServiceMap.put(slotId, service); mServiceMap.put(slotId, createNetworkServiceProvider(slotId));
} }
break; break;
case NETWORK_SERVICE_REMOVE_NETWORK_SERVICE_PROVIDER:
// If the service provider doesn't exist yet, we try to create it.
if (serviceProvider != null) {
serviceProvider.onDestroy();
mServiceMap.remove(slotId);
}
break;
case NETWORK_SERVICE_REMOVE_ALL_NETWORK_SERVICE_PROVIDERS:
for (int i = 0; i < mServiceMap.size(); i++) {
serviceProvider = mServiceMap.get(i);
if (serviceProvider != null) {
serviceProvider.onDestroy();
}
}
mServiceMap.clear();
break;
case NETWORK_SERVICE_GET_REGISTRATION_STATE: case NETWORK_SERVICE_GET_REGISTRATION_STATE:
if (service == null) break; if (serviceProvider == null) break;
int domainId = message.arg2; int domainId = message.arg2;
service.getNetworkRegistrationState(domainId, serviceProvider.getNetworkRegistrationState(domainId,
new NetworkServiceCallback(callback)); new NetworkServiceCallback(callback));
break; break;
case NETWORK_SERVICE_REGISTER_FOR_STATE_CHANGE: case NETWORK_SERVICE_REGISTER_FOR_STATE_CHANGE:
if (service == null) break; if (serviceProvider == null) break;
service.registerForStateChanged(callback); serviceProvider.registerForStateChanged(callback);
break; break;
case NETWORK_SERVICE_UNREGISTER_FOR_STATE_CHANGE: case NETWORK_SERVICE_UNREGISTER_FOR_STATE_CHANGE:
if (service == null) break; if (serviceProvider == null) break;
service.unregisterForStateChanged(callback); serviceProvider.unregisterForStateChanged(callback);
break; break;
case NETWORK_SERVICE_INDICATION_NETWORK_STATE_CHANGED: case NETWORK_SERVICE_INDICATION_NETWORK_STATE_CHANGED:
if (service == null) break; if (serviceProvider == null) break;
service.notifyStateChangedToCallbacks(); serviceProvider.notifyStateChangedToCallbacks();
break; break;
default: default:
break; break;
@@ -212,47 +227,14 @@ public abstract class NetworkService extends Service {
return null; return null;
} }
int slotId = intent.getIntExtra( return mBinder;
NETWORK_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);
INetworkServiceWrapper binder = mBinderMap.get(slotId);
if (binder == null) {
Message msg = mHandler.obtainMessage(
NETWORK_SERVICE_INTERNAL_REQUEST_INITIALIZE_SERVICE);
msg.arg1 = slotId;
msg.sendToTarget();
binder = new INetworkServiceWrapper(slotId);
mBinderMap.put(slotId, binder);
}
return binder;
} }
/** @hide */ /** @hide */
@Override @Override
public boolean onUnbind(Intent intent) { public boolean onUnbind(Intent intent) {
int slotId = intent.getIntExtra(NETWORK_SERVICE_EXTRA_SLOT_ID, mHandler.obtainMessage(NETWORK_SERVICE_REMOVE_ALL_NETWORK_SERVICE_PROVIDERS, 0,
SubscriptionManager.INVALID_SIM_SLOT_INDEX); 0, null).sendToTarget();
if (mBinderMap.get(slotId) != null) {
NetworkServiceProvider serviceImpl;
synchronized (mServiceMap) {
serviceImpl = mServiceMap.get(slotId);
}
// We assume only one component might bind to the service. So if onUnbind is ever
// called, we destroy the serviceImpl.
if (serviceImpl != null) {
serviceImpl.onDestroy();
}
mBinderMap.remove(slotId);
}
return false; return false;
} }
@@ -260,16 +242,6 @@ public abstract class NetworkService extends Service {
/** @hide */ /** @hide */
@Override @Override
public void onDestroy() { public void onDestroy() {
synchronized (mServiceMap) {
for (int i = 0; i < mServiceMap.size(); i++) {
NetworkServiceProvider serviceImpl = mServiceMap.get(i);
if (serviceImpl != null) {
serviceImpl.onDestroy();
}
}
mServiceMap.clear();
}
mHandlerThread.quit(); mHandlerThread.quit();
} }
@@ -279,27 +251,36 @@ public abstract class NetworkService extends Service {
*/ */
private class INetworkServiceWrapper extends INetworkService.Stub { private class INetworkServiceWrapper extends INetworkService.Stub {
private final int mSlotId; @Override
public void createNetworkServiceProvider(int slotId) {
INetworkServiceWrapper(int slotId) { mHandler.obtainMessage(NETWORK_SERVICE_CREATE_NETWORK_SERVICE_PROVIDER, slotId,
mSlotId = slotId; 0, null).sendToTarget();
} }
@Override @Override
public void getNetworkRegistrationState(int domain, INetworkServiceCallback callback) { public void removeNetworkServiceProvider(int slotId) {
mHandler.obtainMessage(NETWORK_SERVICE_GET_REGISTRATION_STATE, mSlotId, mHandler.obtainMessage(NETWORK_SERVICE_REMOVE_NETWORK_SERVICE_PROVIDER, slotId,
0, null).sendToTarget();
}
@Override
public void getNetworkRegistrationState(
int slotId, int domain, INetworkServiceCallback callback) {
mHandler.obtainMessage(NETWORK_SERVICE_GET_REGISTRATION_STATE, slotId,
domain, callback).sendToTarget(); domain, callback).sendToTarget();
} }
@Override @Override
public void registerForNetworkRegistrationStateChanged(INetworkServiceCallback callback) { public void registerForNetworkRegistrationStateChanged(
mHandler.obtainMessage(NETWORK_SERVICE_REGISTER_FOR_STATE_CHANGE, mSlotId, int slotId, INetworkServiceCallback callback) {
mHandler.obtainMessage(NETWORK_SERVICE_REGISTER_FOR_STATE_CHANGE, slotId,
0, callback).sendToTarget(); 0, callback).sendToTarget();
} }
@Override @Override
public void unregisterForNetworkRegistrationStateChanged(INetworkServiceCallback callback) { public void unregisterForNetworkRegistrationStateChanged(
mHandler.obtainMessage(NETWORK_SERVICE_UNREGISTER_FOR_STATE_CHANGE, mSlotId, int slotId,INetworkServiceCallback callback) {
mHandler.obtainMessage(NETWORK_SERVICE_UNREGISTER_FOR_STATE_CHANGE, slotId,
0, callback).sendToTarget(); 0, callback).sendToTarget();
} }
} }
@@ -311,4 +292,4 @@ public abstract class NetworkService extends Service {
private final void loge(String s) { private final void loge(String s) {
Rlog.e(TAG, s); Rlog.e(TAG, s);
} }
} }