Merge "Keep Vehicle internal network always up"

This commit is contained in:
Tomasz Wasilczyk
2021-01-12 22:40:50 +00:00
committed by Gerrit Code Review
2 changed files with 51 additions and 11 deletions

View File

@@ -171,6 +171,7 @@ public final class NetworkCapabilities implements Parcelable {
NET_CAPABILITY_PARTIAL_CONNECTIVITY,
NET_CAPABILITY_TEMPORARILY_NOT_METERED,
NET_CAPABILITY_OEM_PRIVATE,
NET_CAPABILITY_VEHICLE_INTERNAL,
})
public @interface NetCapability { }
@@ -357,8 +358,17 @@ public final class NetworkCapabilities implements Parcelable {
@SystemApi
public static final int NET_CAPABILITY_OEM_PRIVATE = 26;
/**
* Indicates this is an internal vehicle network, meant to communicate with other
* automotive systems.
*
* @hide
*/
@SystemApi
public static final int NET_CAPABILITY_VEHICLE_INTERNAL = 27;
private static final int MIN_NET_CAPABILITY = NET_CAPABILITY_MMS;
private static final int MAX_NET_CAPABILITY = NET_CAPABILITY_OEM_PRIVATE;
private static final int MAX_NET_CAPABILITY = NET_CAPABILITY_VEHICLE_INTERNAL;
/**
* Network capabilities that are expected to be mutable, i.e., can change while a particular
@@ -401,15 +411,16 @@ public final class NetworkCapabilities implements Parcelable {
*/
@VisibleForTesting
/* package */ static final long RESTRICTED_CAPABILITIES =
(1 << NET_CAPABILITY_CBS) |
(1 << NET_CAPABILITY_DUN) |
(1 << NET_CAPABILITY_EIMS) |
(1 << NET_CAPABILITY_FOTA) |
(1 << NET_CAPABILITY_IA) |
(1 << NET_CAPABILITY_IMS) |
(1 << NET_CAPABILITY_RCS) |
(1 << NET_CAPABILITY_XCAP) |
(1 << NET_CAPABILITY_MCX);
(1 << NET_CAPABILITY_CBS)
| (1 << NET_CAPABILITY_DUN)
| (1 << NET_CAPABILITY_EIMS)
| (1 << NET_CAPABILITY_FOTA)
| (1 << NET_CAPABILITY_IA)
| (1 << NET_CAPABILITY_IMS)
| (1 << NET_CAPABILITY_MCX)
| (1 << NET_CAPABILITY_RCS)
| (1 << NET_CAPABILITY_VEHICLE_INTERNAL)
| (1 << NET_CAPABILITY_XCAP);
/**
* Capabilities that force network to be restricted.
@@ -1939,6 +1950,7 @@ public final class NetworkCapabilities implements Parcelable {
case NET_CAPABILITY_PARTIAL_CONNECTIVITY: return "PARTIAL_CONNECTIVITY";
case NET_CAPABILITY_TEMPORARILY_NOT_METERED: return "TEMPORARILY_NOT_METERED";
case NET_CAPABILITY_OEM_PRIVATE: return "OEM_PRIVATE";
case NET_CAPABILITY_VEHICLE_INTERNAL: return "NET_CAPABILITY_VEHICLE_INTERNAL";
default: return Integer.toString(capability);
}
}

View File

@@ -63,6 +63,7 @@ import static android.system.OsConstants.IPPROTO_UDP;
import static java.util.Map.Entry;
import android.Manifest;
import android.annotation.BoolRes;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.app.AppOpsManager;
@@ -974,6 +975,10 @@ public class ConnectivityService extends IConnectivityManager.Stub
mDefaultWifiRequest = createDefaultInternetRequestForTransport(
NetworkCapabilities.TRANSPORT_WIFI, NetworkRequest.Type.BACKGROUND_REQUEST);
mDefaultVehicleRequest = createAlwaysOnRequestForCapability(
NetworkCapabilities.NET_CAPABILITY_VEHICLE_INTERNAL,
NetworkRequest.Type.BACKGROUND_REQUEST);
mHandlerThread = mDeps.makeHandlerThread();
mHandlerThread.start();
mHandler = new InternalHandler(mHandlerThread.getLooper());
@@ -1173,6 +1178,15 @@ public class ConnectivityService extends IConnectivityManager.Stub
return new NetworkRequest(netCap, TYPE_NONE, nextNetworkRequestId(), type);
}
private NetworkRequest createAlwaysOnRequestForCapability(int capability,
NetworkRequest.Type type) {
final NetworkCapabilities netCap = new NetworkCapabilities();
netCap.clearAll();
netCap.addCapability(capability);
netCap.setRequestorUidAndPackageName(Process.myUid(), mContext.getPackageName());
return new NetworkRequest(netCap, TYPE_NONE, nextNetworkRequestId(), type);
}
// Used only for testing.
// TODO: Delete this and either:
// 1. Give FakeSettingsProvider the ability to send settings change notifications (requires
@@ -1190,10 +1204,19 @@ public class ConnectivityService extends IConnectivityManager.Stub
mHandler.sendEmptyMessage(EVENT_PRIVATE_DNS_SETTINGS_CHANGED);
}
private void handleAlwaysOnNetworkRequest(NetworkRequest networkRequest, @BoolRes int id) {
final boolean enable = mContext.getResources().getBoolean(id);
handleAlwaysOnNetworkRequest(networkRequest, enable);
}
private void handleAlwaysOnNetworkRequest(
NetworkRequest networkRequest, String settingName, boolean defaultValue) {
final boolean enable = toBool(Settings.Global.getInt(
mContext.getContentResolver(), settingName, encodeBool(defaultValue)));
handleAlwaysOnNetworkRequest(networkRequest, enable);
}
private void handleAlwaysOnNetworkRequest(NetworkRequest networkRequest, boolean enable) {
final boolean isEnabled = (mNetworkRequests.get(networkRequest) != null);
if (enable == isEnabled) {
return; // Nothing to do.
@@ -1210,9 +1233,11 @@ public class ConnectivityService extends IConnectivityManager.Stub
private void handleConfigureAlwaysOnNetworks() {
handleAlwaysOnNetworkRequest(
mDefaultMobileDataRequest,Settings.Global.MOBILE_DATA_ALWAYS_ON, true);
mDefaultMobileDataRequest, Settings.Global.MOBILE_DATA_ALWAYS_ON, true);
handleAlwaysOnNetworkRequest(mDefaultWifiRequest, Settings.Global.WIFI_ALWAYS_REQUESTED,
false);
handleAlwaysOnNetworkRequest(mDefaultVehicleRequest,
com.android.internal.R.bool.config_vehicleInternalNetworkAlwaysRequested);
}
private void registerSettingsCallbacks() {
@@ -5966,6 +5991,9 @@ public class ConnectivityService extends IConnectivityManager.Stub
// priority networks like ethernet are active.
private final NetworkRequest mDefaultWifiRequest;
// Request used to optionally keep vehicle internal network always active
private final NetworkRequest mDefaultVehicleRequest;
private NetworkAgentInfo getDefaultNetwork() {
return mDefaultNetworkNai;
}