[NS04.5] Have NetworkOffer embark a provider ID

...instead of a Messenger.
This will be useful later to compare whether a given offer is
offered by the same provider satisfying a request.

Bug: 167544279
Test: ConnectivityServiceTest
Merged-In: I3c2563d4ae4e3715d0c6270344ba8f7ef067872f
Merged-In: I975a9439021c7fa511c50ac982819b6dd146291e
Change-Id: I975a9439021c7fa511c50ac982819b6dd146291e
  (cherry-picked from 148dcce559)
This commit is contained in:
Chalard Jean
2021-03-22 22:44:02 +09:00
committed by Junyu Lai
parent 43740568b6
commit 30689b8fd7
5 changed files with 16 additions and 20 deletions

View File

@@ -3364,11 +3364,11 @@ public class ConnectivityManager {
@RequiresPermission(anyOf = { @RequiresPermission(anyOf = {
NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK, NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK,
android.Manifest.permission.NETWORK_FACTORY}) 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 NetworkScore score, @NonNull final NetworkCapabilities caps,
@NonNull final INetworkOfferCallback callback) { @NonNull final INetworkOfferCallback callback) {
try { try {
mService.offerNetwork(Objects.requireNonNull(provider.getMessenger(), "null messenger"), mService.offerNetwork(providerId,
Objects.requireNonNull(score, "null score"), Objects.requireNonNull(score, "null score"),
Objects.requireNonNull(caps, "null caps"), Objects.requireNonNull(caps, "null caps"),
Objects.requireNonNull(callback, "null callback")); Objects.requireNonNull(callback, "null callback"));

View File

@@ -223,7 +223,7 @@ interface IConnectivityManager
int getRestrictBackgroundStatusByCaller(); int getRestrictBackgroundStatusByCaller();
void offerNetwork(in Messenger messenger, in NetworkScore score, void offerNetwork(int providerId, in NetworkScore score,
in NetworkCapabilities caps, in INetworkOfferCallback callback); in NetworkCapabilities caps, in INetworkOfferCallback callback);
void unofferNetwork(in INetworkOfferCallback callback); void unofferNetwork(in INetworkOfferCallback callback);
} }

View File

@@ -272,6 +272,9 @@ public class NetworkProvider {
public void offerNetwork(@NonNull final NetworkScore score, public void offerNetwork(@NonNull final NetworkScore score,
@NonNull final NetworkCapabilities caps, @NonNull final Executor executor, @NonNull final NetworkCapabilities caps, @NonNull final Executor executor,
@NonNull final NetworkOfferCallback callback) { @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; NetworkOfferCallbackProxy proxy = null;
synchronized (mProxies) { synchronized (mProxies) {
for (final NetworkOfferCallbackProxy existingProxy : mProxies) { for (final NetworkOfferCallbackProxy existingProxy : mProxies) {
@@ -285,7 +288,8 @@ public class NetworkProvider {
mProxies.add(proxy); mProxies.add(proxy);
} }
} }
mContext.getSystemService(ConnectivityManager.class).offerNetwork(this, score, caps, proxy); mContext.getSystemService(ConnectivityManager.class)
.offerNetwork(providerId, score, caps, proxy);
} }
/** /**

View File

@@ -6237,11 +6237,11 @@ public class ConnectivityService extends IConnectivityManager.Stub
} }
@Override @Override
public void offerNetwork(@NonNull final Messenger providerMessenger, public void offerNetwork(final int providerId,
@NonNull final NetworkScore score, @NonNull final NetworkCapabilities caps, @NonNull final NetworkScore score, @NonNull final NetworkCapabilities caps,
@NonNull final INetworkOfferCallback callback) { @NonNull final INetworkOfferCallback callback) {
final NetworkOffer offer = new NetworkOffer( 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)); mHandler.sendMessage(mHandler.obtainMessage(EVENT_REGISTER_NETWORK_OFFER, offer));
} }
@@ -6259,7 +6259,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
// Unregister all the offers from this provider // Unregister all the offers from this provider
final ArrayList<NetworkOfferInfo> toRemove = new ArrayList<>(); final ArrayList<NetworkOfferInfo> toRemove = new ArrayList<>();
for (final NetworkOfferInfo noi : mNetworkOffers) { 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 // Can't call handleUnregisterNetworkOffer here because iteration is in progress
toRemove.add(noi); toRemove.add(noi);
} }
@@ -6651,13 +6651,6 @@ public class ConnectivityService extends IConnectivityManager.Stub
*/ */
private void handleRegisterNetworkOffer(@NonNull final NetworkOffer newOffer) { private void handleRegisterNetworkOffer(@NonNull final NetworkOffer newOffer) {
ensureRunningOnConnectivityServiceThread(); 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); final NetworkOfferInfo existingOffer = findNetworkOfferInfoByCallback(newOffer.callback);
if (null != existingOffer) { if (null != existingOffer) {
@@ -6666,7 +6659,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
} }
final NetworkOfferInfo noi = new NetworkOfferInfo(newOffer); final NetworkOfferInfo noi = new NetworkOfferInfo(newOffer);
try { try {
noi.offer.provider.getBinder().linkToDeath(noi, 0 /* flags */); noi.offer.callback.asBinder().linkToDeath(noi, 0 /* flags */);
} catch (RemoteException e) { } catch (RemoteException e) {
noi.binderDied(); noi.binderDied();
return; return;
@@ -6678,7 +6671,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
private void handleUnregisterNetworkOffer(@NonNull final NetworkOfferInfo noi) { private void handleUnregisterNetworkOffer(@NonNull final NetworkOfferInfo noi) {
ensureRunningOnConnectivityServiceThread(); ensureRunningOnConnectivityServiceThread();
mNetworkOffers.remove(noi); mNetworkOffers.remove(noi);
noi.offer.provider.getBinder().unlinkToDeath(noi, 0 /* flags */); noi.offer.callback.asBinder().unlinkToDeath(noi, 0 /* flags */);
} }
@Nullable private NetworkOfferInfo findNetworkOfferInfoByCallback( @Nullable private NetworkOfferInfo findNetworkOfferInfoByCallback(

View File

@@ -21,7 +21,6 @@ import android.annotation.Nullable;
import android.net.INetworkOfferCallback; import android.net.INetworkOfferCallback;
import android.net.NetworkCapabilities; import android.net.NetworkCapabilities;
import android.net.NetworkRequest; import android.net.NetworkRequest;
import android.os.Messenger;
import java.util.Objects; import java.util.Objects;
@@ -44,7 +43,7 @@ public class NetworkOffer {
@NonNull public final FullScore score; @NonNull public final FullScore score;
@NonNull public final NetworkCapabilities caps; @NonNull public final NetworkCapabilities caps;
@NonNull public final INetworkOfferCallback callback; @NonNull public final INetworkOfferCallback callback;
@NonNull public final Messenger provider; @NonNull public final int providerId;
private static NetworkCapabilities emptyCaps() { private static NetworkCapabilities emptyCaps() {
final NetworkCapabilities nc = new NetworkCapabilities(); final NetworkCapabilities nc = new NetworkCapabilities();
@@ -56,11 +55,11 @@ public class NetworkOffer {
public NetworkOffer(@NonNull final FullScore score, public NetworkOffer(@NonNull final FullScore score,
@Nullable final NetworkCapabilities caps, @Nullable final NetworkCapabilities caps,
@NonNull final INetworkOfferCallback callback, @NonNull final INetworkOfferCallback callback,
@NonNull final Messenger provider) { @NonNull final int providerId) {
this.score = Objects.requireNonNull(score); this.score = Objects.requireNonNull(score);
this.caps = null != caps ? caps : emptyCaps(); this.caps = null != caps ? caps : emptyCaps();
this.callback = Objects.requireNonNull(callback); this.callback = Objects.requireNonNull(callback);
this.provider = Objects.requireNonNull(provider); this.providerId = providerId;
} }
/** /**