/* * 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 com.android.net.module.util; import android.annotation.NonNull; import android.annotation.Nullable; import android.content.ContentResolver; import android.content.Context; import android.provider.Settings; import android.text.TextUtils; /** * Collection of connectivity settings utilities. * * @hide */ public class ConnectivitySettingsUtils { public static final int PRIVATE_DNS_MODE_OFF = 1; public static final int PRIVATE_DNS_MODE_OPPORTUNISTIC = 2; public static final int PRIVATE_DNS_MODE_PROVIDER_HOSTNAME = 3; public static final String PRIVATE_DNS_DEFAULT_MODE = "private_dns_default_mode"; public static final String PRIVATE_DNS_MODE = "private_dns_mode"; public static final String PRIVATE_DNS_MODE_OFF_STRING = "off"; public static final String PRIVATE_DNS_MODE_OPPORTUNISTIC_STRING = "opportunistic"; public static final String PRIVATE_DNS_MODE_PROVIDER_HOSTNAME_STRING = "hostname"; public static final String PRIVATE_DNS_SPECIFIER = "private_dns_specifier"; /** * Get private DNS mode as string. * * @param mode One of the private DNS values. * @return A string of private DNS mode. */ public static String getPrivateDnsModeAsString(int mode) { switch (mode) { case PRIVATE_DNS_MODE_OFF: return PRIVATE_DNS_MODE_OFF_STRING; case PRIVATE_DNS_MODE_OPPORTUNISTIC: return PRIVATE_DNS_MODE_OPPORTUNISTIC_STRING; case PRIVATE_DNS_MODE_PROVIDER_HOSTNAME: return PRIVATE_DNS_MODE_PROVIDER_HOSTNAME_STRING; default: throw new IllegalArgumentException("Invalid private dns mode: " + mode); } } private static int getPrivateDnsModeAsInt(String mode) { // If both PRIVATE_DNS_MODE and PRIVATE_DNS_DEFAULT_MODE are not set, choose // PRIVATE_DNS_MODE_OPPORTUNISTIC as default mode. if (TextUtils.isEmpty(mode)) return PRIVATE_DNS_MODE_OPPORTUNISTIC; switch (mode) { case "off": return PRIVATE_DNS_MODE_OFF; case "hostname": return PRIVATE_DNS_MODE_PROVIDER_HOSTNAME; case "opportunistic": return PRIVATE_DNS_MODE_OPPORTUNISTIC; default: // b/260211513: adb shell settings put global private_dns_mode foo // can result in arbitrary strings - treat any unknown value as empty string. // throw new IllegalArgumentException("Invalid private dns mode: " + mode); return PRIVATE_DNS_MODE_OPPORTUNISTIC; } } /** * Get private DNS mode from settings. * * @param context The Context to query the private DNS mode from settings. * @return An integer of private DNS mode. */ public static int getPrivateDnsMode(@NonNull Context context) { final ContentResolver cr = context.getContentResolver(); String mode = Settings.Global.getString(cr, PRIVATE_DNS_MODE); if (TextUtils.isEmpty(mode)) mode = Settings.Global.getString(cr, PRIVATE_DNS_DEFAULT_MODE); return getPrivateDnsModeAsInt(mode); } /** * Set private DNS mode to settings. * * @param context The {@link Context} to set the private DNS mode. * @param mode The private dns mode. This should be one of the PRIVATE_DNS_MODE_* constants. */ public static void setPrivateDnsMode(@NonNull Context context, int mode) { if (!(mode == PRIVATE_DNS_MODE_OFF || mode == PRIVATE_DNS_MODE_OPPORTUNISTIC || mode == PRIVATE_DNS_MODE_PROVIDER_HOSTNAME)) { throw new IllegalArgumentException("Invalid private dns mode: " + mode); } Settings.Global.putString(context.getContentResolver(), PRIVATE_DNS_MODE, getPrivateDnsModeAsString(mode)); } /** * Get specific private dns provider name from {@link Settings}. * * @param context The {@link Context} to query the setting. * @return The specific private dns provider name, or null if no setting value. */ @Nullable public static String getPrivateDnsHostname(@NonNull Context context) { return Settings.Global.getString(context.getContentResolver(), PRIVATE_DNS_SPECIFIER); } /** * Set specific private dns provider name to {@link Settings}. * * @param context The {@link Context} to set the setting. * @param specifier The specific private dns provider name. */ public static void setPrivateDnsHostname(@NonNull Context context, @Nullable String specifier) { Settings.Global.putString(context.getContentResolver(), PRIVATE_DNS_SPECIFIER, specifier); } }