From 1b9fd2058347a9c04d44aa3e3aad421610007ae2 Mon Sep 17 00:00:00 2001 From: Isaac Katzenelson Date: Sat, 29 Jul 2023 18:11:14 +0000 Subject: Call onServiceConnected only after callback is saved in the service. Prevent the onServiceConnected to be called prematurely. Until now it was called in the manager and so that a client may rely on the callback being called before it was actually available to the service to use. Bug: 293511169 Test: atest android.net.wifi.sharedconnectivity.cts Change-Id: I698378a057990bd8ea73974130fa29ab1cd7c738 --- .../sharedconnectivity/app/SharedConnectivityManager.java | 15 ++++++++++++++- .../service/ISharedConnectivityCallback.aidl | 1 + .../service/SharedConnectivityService.java | 5 +++++ 3 files changed, 20 insertions(+), 1 deletion(-) (limited to 'wifi/java') 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 feef0497c152..d41c0197addc 100644 --- a/wifi/java/src/android/net/wifi/sharedconnectivity/app/SharedConnectivityManager.java +++ b/wifi/java/src/android/net/wifi/sharedconnectivity/app/SharedConnectivityManager.java @@ -81,6 +81,19 @@ public class SharedConnectivityManager { mCallback = callback; } + @Override + public void onServiceConnected() { + if (mCallback != null) { + final long token = Binder.clearCallingIdentity(); + try { + mExecutor.execute(() -> mCallback.onServiceConnected()); + } finally { + Binder.restoreCallingIdentity(token); + } + } + } + + @Override public void onHotspotNetworksUpdated(@NonNull List networks) { if (mCallback != null) { final long token = Binder.clearCallingIdentity(); @@ -117,6 +130,7 @@ public class SharedConnectivityManager { } } + @Override public void onHotspotNetworkConnectionStatusChanged( @NonNull HotspotNetworkConnectionStatus status) { if (mCallback != null) { @@ -251,7 +265,6 @@ public class SharedConnectivityManager { synchronized (mProxyDataLock) { mProxyMap.put(callback, proxy); } - callback.onServiceConnected(); } catch (RemoteException e) { Log.e(TAG, "Exception in registerCallback", e); callback.onRegisterCallbackFailed(e); diff --git a/wifi/java/src/android/net/wifi/sharedconnectivity/service/ISharedConnectivityCallback.aidl b/wifi/java/src/android/net/wifi/sharedconnectivity/service/ISharedConnectivityCallback.aidl index 737aa6d9964c..521f94367f6f 100644 --- a/wifi/java/src/android/net/wifi/sharedconnectivity/service/ISharedConnectivityCallback.aidl +++ b/wifi/java/src/android/net/wifi/sharedconnectivity/service/ISharedConnectivityCallback.aidl @@ -31,4 +31,5 @@ interface ISharedConnectivityCallback { oneway void onKnownNetworksUpdated(in List networks); oneway void onKnownNetworkConnectionStatusChanged(in KnownNetworkConnectionStatus status); oneway void onSharedConnectivitySettingsChanged(in SharedConnectivitySettingsState state); + oneway void onServiceConnected(); } diff --git a/wifi/java/src/android/net/wifi/sharedconnectivity/service/SharedConnectivityService.java b/wifi/java/src/android/net/wifi/sharedconnectivity/service/SharedConnectivityService.java index 2bbe91958383..ebda6f1c5826 100644 --- a/wifi/java/src/android/net/wifi/sharedconnectivity/service/SharedConnectivityService.java +++ b/wifi/java/src/android/net/wifi/sharedconnectivity/service/SharedConnectivityService.java @@ -276,6 +276,11 @@ public abstract class SharedConnectivityService extends Service { private void onRegisterCallback(ISharedConnectivityCallback callback) { mRemoteCallbackList.register(callback); + try { + callback.onServiceConnected(); + } catch (RemoteException e) { + if (DEBUG) Log.w(TAG, "Exception in onRegisterCallback", e); + } if (mCountDownLatch != null) { mCountDownLatch.countDown(); } -- cgit v1.2.3-59-g8ed1b