diff options
Diffstat (limited to 'android/telephony/NetworkService.java')
-rw-r--r-- | android/telephony/NetworkService.java | 145 |
1 files changed, 66 insertions, 79 deletions
diff --git a/android/telephony/NetworkService.java b/android/telephony/NetworkService.java index 6b3584c1..35682a74 100644 --- a/android/telephony/NetworkService.java +++ b/android/telephony/NetworkService.java @@ -28,6 +28,8 @@ import android.os.Message; import android.os.RemoteException; import android.util.SparseArray; +import com.android.internal.annotations.VisibleForTesting; + import java.util.ArrayList; import java.util.List; @@ -38,7 +40,7 @@ import java.util.List; * follow the following format: * ... * <service android:name=".xxxNetworkService" - * android:permission="android.permission.BIND_NETWORK_SERVICE" > + * android:permission="android.permission.BIND_TELEPHONY_NETWORK_SERVICE" > * <intent-filter> * <action android:name="android.telephony.NetworkService" /> * </intent-filter> @@ -53,11 +55,13 @@ public abstract class NetworkService extends Service { public static final String NETWORK_SERVICE_INTERFACE = "android.telephony.NetworkService"; 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_GET_REGISTRATION_STATE = 2; - private static final int NETWORK_SERVICE_REGISTER_FOR_STATE_CHANGE = 3; - private static final int NETWORK_SERVICE_UNREGISTER_FOR_STATE_CHANGE = 4; - private static final int NETWORK_SERVICE_INDICATION_NETWORK_STATE_CHANGED = 5; + private static final int NETWORK_SERVICE_CREATE_NETWORK_SERVICE_PROVIDER = 1; + private static final int NETWORK_SERVICE_REMOVE_NETWORK_SERVICE_PROVIDER = 2; + private static final int NETWORK_SERVICE_REMOVE_ALL_NETWORK_SERVICE_PROVIDERS = 3; + private static final int NETWORK_SERVICE_GET_REGISTRATION_STATE = 4; + 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; @@ -66,7 +70,11 @@ public abstract class NetworkService extends Service { private final SparseArray<NetworkServiceProvider> mServiceMap = new SparseArray<>(); - private final SparseArray<INetworkServiceWrapper> mBinderMap = new SparseArray<>(); + /** + * @hide + */ + @VisibleForTesting + public final INetworkServiceWrapper mBinder = new INetworkServiceWrapper(); /** * The abstract class of the actual network service implementation. The network service provider @@ -147,37 +155,50 @@ public abstract class NetworkService extends Service { public void handleMessage(Message message) { final int slotId = message.arg1; final INetworkServiceCallback callback = (INetworkServiceCallback) message.obj; - NetworkServiceProvider service; - synchronized (mServiceMap) { - service = mServiceMap.get(slotId); - } + NetworkServiceProvider serviceProvider = mServiceMap.get(slotId); switch (message.what) { - case NETWORK_SERVICE_INTERNAL_REQUEST_INITIALIZE_SERVICE: - service = createNetworkServiceProvider(message.arg1); - if (service != null) { - mServiceMap.put(slotId, service); + case NETWORK_SERVICE_CREATE_NETWORK_SERVICE_PROVIDER: + // If the service provider doesn't exist yet, we try to create it. + if (serviceProvider == null) { + mServiceMap.put(slotId, createNetworkServiceProvider(slotId)); + } + 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: - if (service == null) break; + if (serviceProvider == null) break; int domainId = message.arg2; - service.getNetworkRegistrationState(domainId, + serviceProvider.getNetworkRegistrationState(domainId, new NetworkServiceCallback(callback)); break; case NETWORK_SERVICE_REGISTER_FOR_STATE_CHANGE: - if (service == null) break; - service.registerForStateChanged(callback); + if (serviceProvider == null) break; + serviceProvider.registerForStateChanged(callback); break; case NETWORK_SERVICE_UNREGISTER_FOR_STATE_CHANGE: - if (service == null) break; - service.unregisterForStateChanged(callback); + if (serviceProvider == null) break; + serviceProvider.unregisterForStateChanged(callback); break; case NETWORK_SERVICE_INDICATION_NETWORK_STATE_CHANGED: - if (service == null) break; - service.notifyStateChangedToCallbacks(); + if (serviceProvider == null) break; + serviceProvider.notifyStateChangedToCallbacks(); break; default: break; @@ -212,47 +233,14 @@ public abstract class NetworkService extends Service { return null; } - int slotId = intent.getIntExtra( - 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; + return mBinder; } /** @hide */ @Override public boolean onUnbind(Intent intent) { - int slotId = intent.getIntExtra(NETWORK_SERVICE_EXTRA_SLOT_ID, - SubscriptionManager.INVALID_SIM_SLOT_INDEX); - 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); - } + mHandler.obtainMessage(NETWORK_SERVICE_REMOVE_ALL_NETWORK_SERVICE_PROVIDERS, 0, + 0, null).sendToTarget(); return false; } @@ -260,16 +248,6 @@ public abstract class NetworkService extends Service { /** @hide */ @Override 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(); } @@ -279,27 +257,36 @@ public abstract class NetworkService extends Service { */ private class INetworkServiceWrapper extends INetworkService.Stub { - private final int mSlotId; + @Override + public void createNetworkServiceProvider(int slotId) { + mHandler.obtainMessage(NETWORK_SERVICE_CREATE_NETWORK_SERVICE_PROVIDER, slotId, + 0, null).sendToTarget(); + } - INetworkServiceWrapper(int slotId) { - mSlotId = slotId; + @Override + public void removeNetworkServiceProvider(int slotId) { + mHandler.obtainMessage(NETWORK_SERVICE_REMOVE_NETWORK_SERVICE_PROVIDER, slotId, + 0, null).sendToTarget(); } @Override - public void getNetworkRegistrationState(int domain, INetworkServiceCallback callback) { - mHandler.obtainMessage(NETWORK_SERVICE_GET_REGISTRATION_STATE, mSlotId, + public void getNetworkRegistrationState( + int slotId, int domain, INetworkServiceCallback callback) { + mHandler.obtainMessage(NETWORK_SERVICE_GET_REGISTRATION_STATE, slotId, domain, callback).sendToTarget(); } @Override - public void registerForNetworkRegistrationStateChanged(INetworkServiceCallback callback) { - mHandler.obtainMessage(NETWORK_SERVICE_REGISTER_FOR_STATE_CHANGE, mSlotId, + public void registerForNetworkRegistrationStateChanged( + int slotId, INetworkServiceCallback callback) { + mHandler.obtainMessage(NETWORK_SERVICE_REGISTER_FOR_STATE_CHANGE, slotId, 0, callback).sendToTarget(); } @Override - public void unregisterForNetworkRegistrationStateChanged(INetworkServiceCallback callback) { - mHandler.obtainMessage(NETWORK_SERVICE_UNREGISTER_FOR_STATE_CHANGE, mSlotId, + public void unregisterForNetworkRegistrationStateChanged( + int slotId,INetworkServiceCallback callback) { + mHandler.obtainMessage(NETWORK_SERVICE_UNREGISTER_FOR_STATE_CHANGE, slotId, 0, callback).sendToTarget(); } } @@ -311,4 +298,4 @@ public abstract class NetworkService extends Service { private final void loge(String s) { Rlog.e(TAG, s); } -}
\ No newline at end of file +} |