diff --git a/framework/src/android/net/ConnectivityManager.java b/framework/src/android/net/ConnectivityManager.java index 2af5b35218..6f2cdea1cc 100644 --- a/framework/src/android/net/ConnectivityManager.java +++ b/framework/src/android/net/ConnectivityManager.java @@ -3364,11 +3364,11 @@ public class ConnectivityManager { @RequiresPermission(anyOf = { NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK, android.Manifest.permission.NETWORK_FACTORY}) - public void offerNetwork(@NonNull final NetworkProvider provider, + public void offerNetwork(@NonNull final int providerId, @NonNull final NetworkScore score, @NonNull final NetworkCapabilities caps, @NonNull final INetworkOfferCallback callback) { try { - mService.offerNetwork(Objects.requireNonNull(provider.getMessenger(), "null messenger"), + mService.offerNetwork(providerId, Objects.requireNonNull(score, "null score"), Objects.requireNonNull(caps, "null caps"), Objects.requireNonNull(callback, "null callback")); diff --git a/framework/src/android/net/IConnectivityManager.aidl b/framework/src/android/net/IConnectivityManager.aidl index d937c9cd78..c434bbcb0f 100644 --- a/framework/src/android/net/IConnectivityManager.aidl +++ b/framework/src/android/net/IConnectivityManager.aidl @@ -223,7 +223,7 @@ interface IConnectivityManager int getRestrictBackgroundStatusByCaller(); - void offerNetwork(in Messenger messenger, in NetworkScore score, + void offerNetwork(int providerId, in NetworkScore score, in NetworkCapabilities caps, in INetworkOfferCallback callback); void unofferNetwork(in INetworkOfferCallback callback); } diff --git a/framework/src/android/net/NetworkProvider.java b/framework/src/android/net/NetworkProvider.java index 8f93047cf8..d5b5c9b603 100644 --- a/framework/src/android/net/NetworkProvider.java +++ b/framework/src/android/net/NetworkProvider.java @@ -272,6 +272,9 @@ public class NetworkProvider { public void offerNetwork(@NonNull final NetworkScore score, @NonNull final NetworkCapabilities caps, @NonNull final Executor executor, @NonNull final NetworkOfferCallback callback) { + // Can't offer a network with a provider that is not yet registered or already unregistered. + final int providerId = mProviderId; + if (providerId == ID_NONE) return; NetworkOfferCallbackProxy proxy = null; synchronized (mProxies) { for (final NetworkOfferCallbackProxy existingProxy : mProxies) { @@ -285,7 +288,8 @@ public class NetworkProvider { mProxies.add(proxy); } } - mContext.getSystemService(ConnectivityManager.class).offerNetwork(this, score, caps, proxy); + mContext.getSystemService(ConnectivityManager.class) + .offerNetwork(providerId, score, caps, proxy); } /** diff --git a/service/src/com/android/server/ConnectivityService.java b/service/src/com/android/server/ConnectivityService.java index adfcacea1a..e7f08c61da 100644 --- a/service/src/com/android/server/ConnectivityService.java +++ b/service/src/com/android/server/ConnectivityService.java @@ -6233,11 +6233,11 @@ public class ConnectivityService extends IConnectivityManager.Stub } @Override - public void offerNetwork(@NonNull final Messenger providerMessenger, + public void offerNetwork(final int providerId, @NonNull final NetworkScore score, @NonNull final NetworkCapabilities caps, @NonNull final INetworkOfferCallback callback) { final NetworkOffer offer = new NetworkOffer( - FullScore.makeProspectiveScore(score, caps), caps, callback, providerMessenger); + FullScore.makeProspectiveScore(score, caps), caps, callback, providerId); mHandler.sendMessage(mHandler.obtainMessage(EVENT_REGISTER_NETWORK_OFFER, offer)); } @@ -6255,7 +6255,7 @@ public class ConnectivityService extends IConnectivityManager.Stub // Unregister all the offers from this provider final ArrayList toRemove = new ArrayList<>(); for (final NetworkOfferInfo noi : mNetworkOffers) { - if (noi.offer.provider == messenger) { + if (noi.offer.providerId == npi.providerId) { // Can't call handleUnregisterNetworkOffer here because iteration is in progress toRemove.add(noi); } @@ -6647,13 +6647,6 @@ public class ConnectivityService extends IConnectivityManager.Stub */ private void handleRegisterNetworkOffer(@NonNull final NetworkOffer newOffer) { ensureRunningOnConnectivityServiceThread(); - if (null == mNetworkProviderInfos.get(newOffer.provider)) { - // This may actually happen if a provider updates its score or registers and then - // immediately unregisters. The offer would still be in the handler queue, but the - // provider would have been removed. - if (DBG) log("Received offer from an unregistered provider"); - return; - } final NetworkOfferInfo existingOffer = findNetworkOfferInfoByCallback(newOffer.callback); if (null != existingOffer) { @@ -6662,7 +6655,7 @@ public class ConnectivityService extends IConnectivityManager.Stub } final NetworkOfferInfo noi = new NetworkOfferInfo(newOffer); try { - noi.offer.provider.getBinder().linkToDeath(noi, 0 /* flags */); + noi.offer.callback.asBinder().linkToDeath(noi, 0 /* flags */); } catch (RemoteException e) { noi.binderDied(); return; @@ -6674,7 +6667,7 @@ public class ConnectivityService extends IConnectivityManager.Stub private void handleUnregisterNetworkOffer(@NonNull final NetworkOfferInfo noi) { ensureRunningOnConnectivityServiceThread(); mNetworkOffers.remove(noi); - noi.offer.provider.getBinder().unlinkToDeath(noi, 0 /* flags */); + noi.offer.callback.asBinder().unlinkToDeath(noi, 0 /* flags */); } @Nullable private NetworkOfferInfo findNetworkOfferInfoByCallback( diff --git a/service/src/com/android/server/connectivity/NetworkOffer.java b/service/src/com/android/server/connectivity/NetworkOffer.java index fa2d465fff..548db6b6dd 100644 --- a/service/src/com/android/server/connectivity/NetworkOffer.java +++ b/service/src/com/android/server/connectivity/NetworkOffer.java @@ -21,7 +21,6 @@ import android.annotation.Nullable; import android.net.INetworkOfferCallback; import android.net.NetworkCapabilities; import android.net.NetworkRequest; -import android.os.Messenger; import java.util.Objects; @@ -44,7 +43,7 @@ public class NetworkOffer { @NonNull public final FullScore score; @NonNull public final NetworkCapabilities caps; @NonNull public final INetworkOfferCallback callback; - @NonNull public final Messenger provider; + @NonNull public final int providerId; private static NetworkCapabilities emptyCaps() { final NetworkCapabilities nc = new NetworkCapabilities(); @@ -56,11 +55,11 @@ public class NetworkOffer { public NetworkOffer(@NonNull final FullScore score, @Nullable final NetworkCapabilities caps, @NonNull final INetworkOfferCallback callback, - @NonNull final Messenger provider) { + @NonNull final int providerId) { this.score = Objects.requireNonNull(score); this.caps = null != caps ? caps : emptyCaps(); this.callback = Objects.requireNonNull(callback); - this.provider = Objects.requireNonNull(provider); + this.providerId = providerId; } /**