From ca8e637bac317faac7cff384815812ee054f6c42 Mon Sep 17 00:00:00 2001 From: Isaac Katzenelson Date: Sat, 11 Feb 2023 01:44:27 +0000 Subject: [PATCH] Read service package and intent action from resources Bug: 268741563 Test: atest SharedConnectivityManagerTest Change-Id: Iab3843749faaf8eb5399bc6395e75a6cc611252f --- .../android/app/SystemServiceRegistry.java | 2 +- .../app/SharedConnectivityManager.java | 57 ++++++++++--------- .../app/SharedConnectivityManagerTest.java | 34 +++++------ 3 files changed, 48 insertions(+), 45 deletions(-) diff --git a/core/java/android/app/SystemServiceRegistry.java b/core/java/android/app/SystemServiceRegistry.java index 64538ec132ded..6d80a44d3d60f 100644 --- a/core/java/android/app/SystemServiceRegistry.java +++ b/core/java/android/app/SystemServiceRegistry.java @@ -1570,7 +1570,7 @@ public final class SystemServiceRegistry { new CachedServiceFetcher() { @Override public SharedConnectivityManager createService(ContextImpl ctx) { - return new SharedConnectivityManager(ctx); + return SharedConnectivityManager.create(ctx); } }); diff --git a/wifi/java/src/android/net/wifi/sharedconnectivity/app/SharedConnectivityManager.java b/wifi/java/src/android/net/wifi/sharedconnectivity/app/SharedConnectivityManager.java index c2981899d2abb..8aa369e31ce82 100644 --- a/wifi/java/src/android/net/wifi/sharedconnectivity/app/SharedConnectivityManager.java +++ b/wifi/java/src/android/net/wifi/sharedconnectivity/app/SharedConnectivityManager.java @@ -35,6 +35,8 @@ import android.os.IInterface; import android.os.RemoteException; import android.util.Log; +import com.android.internal.R; + import java.util.HashMap; import java.util.List; import java.util.Map; @@ -51,8 +53,6 @@ import java.util.concurrent.Executor; public class SharedConnectivityManager { private static final String TAG = SharedConnectivityManager.class.getSimpleName(); private static final boolean DEBUG = true; - private static final String SERVICE_PACKAGE_NAME = "sharedconnectivity_service_package"; - private static final String SERVICE_CLASS_NAME = "sharedconnectivity_service_class"; private static final class SharedConnectivityCallbackProxy extends ISharedConnectivityCallback.Stub { @@ -101,7 +101,7 @@ public class SharedConnectivityManager { Binder.restoreCallingIdentity(token); } } - }; + } @Override public void onTetherNetworkConnectionStatusChanged( @@ -115,7 +115,7 @@ public class SharedConnectivityManager { Binder.restoreCallingIdentity(token); } } - }; + } @Override public void onKnownNetworkConnectionStatusChanged( @@ -129,7 +129,7 @@ public class SharedConnectivityManager { Binder.restoreCallingIdentity(token); } } - }; + } } private ISharedConnectivityService mService; @@ -137,14 +137,33 @@ public class SharedConnectivityManager { mProxyMap = new HashMap<>(); /** - * Constructor for new instance of {@link SharedConnectivityManager}. + * Creates a new instance of {@link SharedConnectivityManager}. * * Automatically binds to implementation of {@link SharedConnectivityService} specified in * device overlay. * + * @return An instance of {@link SharedConnectivityManager} or null if the shared connectivity + * service is not found. * @hide */ - public SharedConnectivityManager(@NonNull Context context) { + @Nullable + public static SharedConnectivityManager create(@NonNull Context context) { + Resources resources = context.getResources(); + try { + String servicePackageName = resources.getString( + R.string.shared_connectivity_service_package); + String serviceIntentAction = resources.getString( + R.string.shared_connectivity_service_intent_action); + return new SharedConnectivityManager(context, servicePackageName, serviceIntentAction); + } catch (Resources.NotFoundException e) { + Log.e(TAG, "To support shared connectivity service on this device, the service's" + + " package name and intent action string must be defined"); + } + return null; + } + + private SharedConnectivityManager(@NonNull Context context, String servicePackageName, + String serviceIntentAction) { ServiceConnection serviceConnection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { @@ -158,7 +177,10 @@ public class SharedConnectivityManager { mProxyMap.clear(); } }; - bind(context, serviceConnection); + + context.bindService( + new Intent().setPackage(servicePackageName).setAction(serviceIntentAction), + serviceConnection, Context.BIND_AUTO_CREATE); } /** @@ -169,25 +191,6 @@ public class SharedConnectivityManager { mService = (ISharedConnectivityService) service; } - private void bind(Context context, ServiceConnection serviceConnection) { - Resources resources = context.getResources(); - int packageNameId = resources.getIdentifier(SERVICE_PACKAGE_NAME, "string", - context.getPackageName()); - int classNameId = resources.getIdentifier(SERVICE_CLASS_NAME, "string", - context.getPackageName()); - if (packageNameId == 0 || classNameId == 0) { - throw new Resources.NotFoundException("Package and class names for" - + " shared connectivity service must be defined"); - } - - Intent intent = new Intent(); - intent.setComponent(new ComponentName(resources.getString(packageNameId), - resources.getString(classNameId))); - context.bindService( - intent, - serviceConnection, Context.BIND_AUTO_CREATE); - } - /** * Registers a callback for receiving updates to the list of Tether Networks and Known Networks. * diff --git a/wifi/tests/src/android/net/wifi/sharedconnectivity/app/SharedConnectivityManagerTest.java b/wifi/tests/src/android/net/wifi/sharedconnectivity/app/SharedConnectivityManagerTest.java index 9aeccac1968e5..784e9c4731eec 100644 --- a/wifi/tests/src/android/net/wifi/sharedconnectivity/app/SharedConnectivityManagerTest.java +++ b/wifi/tests/src/android/net/wifi/sharedconnectivity/app/SharedConnectivityManagerTest.java @@ -89,7 +89,7 @@ public class SharedConnectivityManagerTest { */ @Test public void testBindingToService() { - new SharedConnectivityManager(mContext); + SharedConnectivityManager.create(mContext); verify(mContext).bindService(any(), any(), anyInt()); } @@ -98,22 +98,22 @@ public class SharedConnectivityManagerTest { */ @Test public void testRegisterCallback() throws Exception { - SharedConnectivityManager manager = new SharedConnectivityManager(mContext); + SharedConnectivityManager manager = SharedConnectivityManager.create(mContext); manager.setService(null); assertFalse(manager.registerCallback(mExecutor, mClientCallback)); - manager = new SharedConnectivityManager(mContext); + manager = SharedConnectivityManager.create(mContext); manager.setService(mService); assertTrue(manager.registerCallback(mExecutor, mClientCallback)); verify(mService).registerCallback(any()); // Registering the same callback twice should fail. - manager = new SharedConnectivityManager(mContext); + manager = SharedConnectivityManager.create(mContext); manager.setService(mService); manager.registerCallback(mExecutor, mClientCallback); assertFalse(manager.registerCallback(mExecutor, mClientCallback)); - manager = new SharedConnectivityManager(mContext); + manager = SharedConnectivityManager.create(mContext); manager.setService(mService); doThrow(new RemoteException()).when(mService).registerCallback(any()); assertFalse(manager.registerCallback(mExecutor, mClientCallback)); @@ -125,24 +125,24 @@ public class SharedConnectivityManagerTest { */ @Test public void testUnregisterCallback() throws Exception { - SharedConnectivityManager manager = new SharedConnectivityManager(mContext); + SharedConnectivityManager manager = SharedConnectivityManager.create(mContext); manager.setService(null); assertFalse(manager.unregisterCallback(mClientCallback)); - manager = new SharedConnectivityManager(mContext); + manager = SharedConnectivityManager.create(mContext); manager.setService(mService); manager.registerCallback(mExecutor, mClientCallback); assertTrue(manager.unregisterCallback(mClientCallback)); verify(mService).unregisterCallback(any()); - manager = new SharedConnectivityManager(mContext); + manager = SharedConnectivityManager.create(mContext); manager.setService(mService); manager.registerCallback(mExecutor, mClientCallback); manager.unregisterCallback(mClientCallback); assertFalse(manager.unregisterCallback(mClientCallback)); - manager = new SharedConnectivityManager(mContext); + manager = SharedConnectivityManager.create(mContext); manager.setService(mService); doThrow(new RemoteException()).when(mService).unregisterCallback(any()); assertFalse(manager.unregisterCallback(mClientCallback)); @@ -156,11 +156,11 @@ public class SharedConnectivityManagerTest { public void testConnectTetherNetwork() throws RemoteException { TetherNetwork network = buildTetherNetwork(); - SharedConnectivityManager manager = new SharedConnectivityManager(mContext); + SharedConnectivityManager manager = SharedConnectivityManager.create(mContext); manager.setService(null); assertFalse(manager.connectTetherNetwork(network)); - manager = new SharedConnectivityManager(mContext); + manager = SharedConnectivityManager.create(mContext); manager.setService(mService); manager.connectTetherNetwork(network); verify(mService).connectTetherNetwork(network); @@ -175,11 +175,11 @@ public class SharedConnectivityManagerTest { */ @Test public void testDisconnectTetherNetwork() throws RemoteException { - SharedConnectivityManager manager = new SharedConnectivityManager(mContext); + SharedConnectivityManager manager = SharedConnectivityManager.create(mContext); manager.setService(null); assertFalse(manager.disconnectTetherNetwork()); - manager = new SharedConnectivityManager(mContext); + manager = SharedConnectivityManager.create(mContext); manager.setService(mService); manager.disconnectTetherNetwork(); verify(mService).disconnectTetherNetwork(); @@ -196,11 +196,11 @@ public class SharedConnectivityManagerTest { public void testConnectKnownNetwork() throws RemoteException { KnownNetwork network = buildKnownNetwork(); - SharedConnectivityManager manager = new SharedConnectivityManager(mContext); + SharedConnectivityManager manager = SharedConnectivityManager.create(mContext); manager.setService(null); assertFalse(manager.connectKnownNetwork(network)); - manager = new SharedConnectivityManager(mContext); + manager = SharedConnectivityManager.create(mContext); manager.setService(mService); manager.connectKnownNetwork(network); verify(mService).connectKnownNetwork(network); @@ -217,11 +217,11 @@ public class SharedConnectivityManagerTest { public void testForgetKnownNetwork() throws RemoteException { KnownNetwork network = buildKnownNetwork(); - SharedConnectivityManager manager = new SharedConnectivityManager(mContext); + SharedConnectivityManager manager = SharedConnectivityManager.create(mContext); manager.setService(null); assertFalse(manager.forgetKnownNetwork(network)); - manager = new SharedConnectivityManager(mContext); + manager = SharedConnectivityManager.create(mContext); manager.setService(mService); manager.forgetKnownNetwork(network); verify(mService).forgetKnownNetwork(network);