summaryrefslogtreecommitdiff
path: root/common/device/android/net/NetworkFactoryImpl.java
diff options
context:
space:
mode:
Diffstat (limited to 'common/device/android/net/NetworkFactoryImpl.java')
-rw-r--r--common/device/android/net/NetworkFactoryImpl.java322
1 files changed, 0 insertions, 322 deletions
diff --git a/common/device/android/net/NetworkFactoryImpl.java b/common/device/android/net/NetworkFactoryImpl.java
deleted file mode 100644
index 9c1190c2..00000000
--- a/common/device/android/net/NetworkFactoryImpl.java
+++ /dev/null
@@ -1,322 +0,0 @@
-/*
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net;
-
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.content.Context;
-import android.net.NetworkProvider.NetworkOfferCallback;
-import android.os.Looper;
-import android.os.Message;
-
-import java.io.FileDescriptor;
-import java.io.PrintWriter;
-import java.util.LinkedHashMap;
-import java.util.Map;
-import java.util.concurrent.Executor;
-
-/**
- * A NetworkFactory is an entity that creates NetworkAgent objects.
- * The bearers register with ConnectivityService using {@link #register} and
- * their factory will start receiving scored NetworkRequests. NetworkRequests
- * can be filtered 3 ways: by NetworkCapabilities, by score and more complexly by
- * overridden function. All of these can be dynamic - changing NetworkCapabilities
- * or score forces re-evaluation of all current requests.
- *
- * If any requests pass the filter some overrideable functions will be called.
- * If the bearer only cares about very simple start/stopNetwork callbacks, those
- * functions can be overridden. If the bearer needs more interaction, it can
- * override addNetworkRequest and removeNetworkRequest which will give it each
- * request that passes their current filters.
- * @hide
- **/
-// TODO(b/187083878): factor out common code between this and NetworkFactoryLegacyImpl
-class NetworkFactoryImpl extends NetworkFactoryLegacyImpl {
- private static final boolean DBG = NetworkFactory.DBG;
- private static final boolean VDBG = NetworkFactory.VDBG;
-
- // A score that will win against everything, so that score filtering will let all requests
- // through
- // TODO : remove this and replace with an API to listen to all requests.
- @NonNull
- private static final NetworkScore INVINCIBLE_SCORE =
- new NetworkScore.Builder().setLegacyInt(1000).build();
-
- // TODO(b/187082970): Replace CMD_* with Handler.post(() -> { ... }) since all the CMDs do is to
- // run the tasks asynchronously on the Handler thread.
-
- /**
- * Pass a network request to the bearer. If the bearer believes it can
- * satisfy the request it should connect to the network and create a
- * NetworkAgent. Once the NetworkAgent is fully functional it will
- * register itself with ConnectivityService using registerNetworkAgent.
- * If the bearer cannot immediately satisfy the request (no network,
- * user disabled the radio, lower-scored network) it should remember
- * any NetworkRequests it may be able to satisfy in the future. It may
- * disregard any that it will never be able to service, for example
- * those requiring a different bearer.
- * msg.obj = NetworkRequest
- */
- // TODO : this and CANCEL_REQUEST are only used by telephony tests. Replace it in the tests
- // and remove them and the associated code.
- private static final int CMD_REQUEST_NETWORK = NetworkFactory.CMD_REQUEST_NETWORK;
-
- /**
- * Cancel a network request
- * msg.obj = NetworkRequest
- */
- private static final int CMD_CANCEL_REQUEST = NetworkFactory.CMD_CANCEL_REQUEST;
-
- /**
- * Internally used to set our best-guess score.
- * msg.obj = new score
- */
- private static final int CMD_SET_SCORE = 3;
-
- /**
- * Internally used to set our current filter for coarse bandwidth changes with
- * technology changes.
- * msg.obj = new filter
- */
- private static final int CMD_SET_FILTER = 4;
-
- /**
- * Internally used to send the network offer associated with this factory.
- * No arguments, will read from members
- */
- private static final int CMD_OFFER_NETWORK = 5;
-
- /**
- * Internally used to send the request to listen to all requests.
- * No arguments, will read from members
- */
- private static final int CMD_LISTEN_TO_ALL_REQUESTS = 6;
-
- private final Map<NetworkRequest, NetworkRequestInfo> mNetworkRequests =
- new LinkedHashMap<>();
-
- @NonNull private NetworkScore mScore = new NetworkScore.Builder().setLegacyInt(0).build();
-
- private final NetworkOfferCallback mRequestCallback = new NetworkOfferCallback() {
- @Override
- public void onNetworkNeeded(@NonNull final NetworkRequest request) {
- handleAddRequest(request);
- }
-
- @Override
- public void onNetworkUnneeded(@NonNull final NetworkRequest request) {
- handleRemoveRequest(request);
- }
- };
- @NonNull private final Executor mExecutor = command -> post(command);
-
-
- // Ideally the filter argument would be non-null, but null has historically meant to see
- // no requests and telephony passes null.
- NetworkFactoryImpl(NetworkFactory parent, Looper looper, Context context,
- @Nullable final NetworkCapabilities filter) {
- super(parent, looper, context,
- null != filter ? filter :
- NetworkCapabilities.Builder.withoutDefaultCapabilities().build());
- }
-
- /* Registers this NetworkFactory with the system. May only be called once per factory. */
- @Override public void register(final String logTag) {
- register(logTag, false);
- }
-
- /**
- * Registers this NetworkFactory with the system ignoring the score filter. This will let
- * the factory always see all network requests matching its capabilities filter.
- * May only be called once per factory.
- */
- @Override public void registerIgnoringScore(final String logTag) {
- register(logTag, true);
- }
-
- private void register(final String logTag, final boolean listenToAllRequests) {
- if (mProvider != null) {
- throw new IllegalStateException("A NetworkFactory must only be registered once");
- }
- if (DBG) mParent.log("Registering NetworkFactory");
-
- mProvider = new NetworkProvider(mContext, NetworkFactoryImpl.this.getLooper(), logTag) {
- @Override
- public void onNetworkRequested(@NonNull NetworkRequest request, int score,
- int servingProviderId) {
- handleAddRequest(request);
- }
-
- @Override
- public void onNetworkRequestWithdrawn(@NonNull NetworkRequest request) {
- handleRemoveRequest(request);
- }
- };
-
- ((ConnectivityManager) mContext.getSystemService(
- Context.CONNECTIVITY_SERVICE)).registerNetworkProvider(mProvider);
-
- // The mScore and mCapabilityFilter members can only be accessed on the handler thread.
- // TODO : offer a separate API to listen to all requests instead
- if (listenToAllRequests) {
- sendMessage(obtainMessage(CMD_LISTEN_TO_ALL_REQUESTS));
- } else {
- sendMessage(obtainMessage(CMD_OFFER_NETWORK));
- }
- }
-
- private void handleOfferNetwork(@NonNull final NetworkScore score) {
- mProvider.registerNetworkOffer(score, mCapabilityFilter, mExecutor, mRequestCallback);
- }
-
- @Override
- public void handleMessage(Message msg) {
- switch (msg.what) {
- case CMD_REQUEST_NETWORK: {
- handleAddRequest((NetworkRequest) msg.obj);
- break;
- }
- case CMD_CANCEL_REQUEST: {
- handleRemoveRequest((NetworkRequest) msg.obj);
- break;
- }
- case CMD_SET_SCORE: {
- handleSetScore((NetworkScore) msg.obj);
- break;
- }
- case CMD_SET_FILTER: {
- handleSetFilter((NetworkCapabilities) msg.obj);
- break;
- }
- case CMD_OFFER_NETWORK: {
- handleOfferNetwork(mScore);
- break;
- }
- case CMD_LISTEN_TO_ALL_REQUESTS: {
- handleOfferNetwork(INVINCIBLE_SCORE);
- break;
- }
- }
- }
-
- private static class NetworkRequestInfo {
- @NonNull public final NetworkRequest request;
- public boolean requested; // do we have a request outstanding, limited by score
-
- NetworkRequestInfo(@NonNull final NetworkRequest request) {
- this.request = request;
- this.requested = false;
- }
-
- @Override
- public String toString() {
- return "{" + request + ", requested=" + requested + "}";
- }
- }
-
- /**
- * Add a NetworkRequest that the bearer may want to attempt to satisfy.
- * @see #CMD_REQUEST_NETWORK
- *
- * @param request the request to handle.
- */
- private void handleAddRequest(@NonNull final NetworkRequest request) {
- NetworkRequestInfo n = mNetworkRequests.get(request);
- if (n == null) {
- if (DBG) mParent.log("got request " + request);
- n = new NetworkRequestInfo(request);
- mNetworkRequests.put(n.request, n);
- } else {
- if (VDBG) mParent.log("handle existing request " + request);
- }
- if (VDBG) mParent.log(" my score=" + mScore + ", my filter=" + mCapabilityFilter);
-
- if (mParent.acceptRequest(request)) {
- n.requested = true;
- mParent.needNetworkFor(request);
- }
- }
-
- private void handleRemoveRequest(NetworkRequest request) {
- NetworkRequestInfo n = mNetworkRequests.get(request);
- if (n != null) {
- mNetworkRequests.remove(request);
- if (n.requested) mParent.releaseNetworkFor(n.request);
- }
- }
-
- private void handleSetScore(@NonNull final NetworkScore score) {
- if (mScore.equals(score)) return;
- mScore = score;
- mParent.reevaluateAllRequests();
- }
-
- private void handleSetFilter(@NonNull final NetworkCapabilities netCap) {
- if (netCap.equals(mCapabilityFilter)) return;
- mCapabilityFilter = netCap;
- mParent.reevaluateAllRequests();
- }
-
- @Override public final void reevaluateAllRequests() {
- if (mProvider == null) return;
- mProvider.registerNetworkOffer(mScore, mCapabilityFilter, mExecutor, mRequestCallback);
- }
-
- /**
- * @deprecated this method was never part of the API (system or public) and is only added
- * for migration of existing clients.
- */
- @Deprecated
- public void setScoreFilter(final int score) {
- setScoreFilter(new NetworkScore.Builder().setLegacyInt(score).build());
- }
-
- /**
- * Set a score filter for this factory.
- *
- * This should include the transports the factory knows its networks will have, and
- * an optimistic view of the attributes it may have. This does not commit the factory
- * to being able to bring up such a network ; it only lets it avoid hearing about
- * requests that it has no chance of fulfilling.
- *
- * @param score the filter
- */
- @Override public void setScoreFilter(@NonNull final NetworkScore score) {
- sendMessage(obtainMessage(CMD_SET_SCORE, score));
- }
-
- @Override public void setCapabilityFilter(NetworkCapabilities netCap) {
- sendMessage(obtainMessage(CMD_SET_FILTER, new NetworkCapabilities(netCap)));
- }
-
- @Override public int getRequestCount() {
- return mNetworkRequests.size();
- }
-
- @Override public void dump(FileDescriptor fd, PrintWriter writer, String[] args) {
- writer.println(toString());
- for (NetworkRequestInfo n : mNetworkRequests.values()) {
- writer.println(" " + n);
- }
- }
-
- @Override public String toString() {
- return "providerId=" + (mProvider != null ? mProvider.getProviderId() : "null")
- + ", ScoreFilter=" + mScore + ", Filter=" + mCapabilityFilter
- + ", requests=" + mNetworkRequests.size();
- }
-}