Merge "Add slotId in INetworkService.aidl methods."
am: b1c6aa4567
Change-Id: I950f4617cbe6abcd8c943e1cc0b5aba60163f202
This commit is contained in:
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user