Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a62df616 authored by Chalard Jean's avatar Chalard Jean Committed by Android (Google) Code Review
Browse files

Merge "Move the Private DNS dialog back to the top level." into pi-dev

parents d73d3a8f 42405603
Loading
Loading
Loading
Loading
+22 −12
Original line number Diff line number Diff line
@@ -18,7 +18,8 @@
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:settings="http://schemas.android.com/apk/res-auto"
    android:key="network_and_internet_screen"
    android:title="@string/network_dashboard_title">
    android:title="@string/network_dashboard_title"
    settings:initialExpandedChildrenCount="5">

    <com.android.settings.widget.MasterSwitchPreference
        android:fragment="com.android.settings.wifi.WifiSettings"
@@ -58,20 +59,11 @@
        settings:userRestriction="no_config_tethering"
        settings:useAdminDisabledSummary="true" />

    <com.android.settingslib.RestrictedPreference
        android:fragment="com.android.settings.vpn2.VpnSettings"
        android:key="vpn_settings"
        android:title="@string/vpn_settings_title"
        android:icon="@drawable/ic_vpn_key"
        android:order="0"
        android:summary="@string/summary_placeholder"
        settings:userRestriction="no_config_vpn"
        settings:useAdminDisabledSummary="true" />

    <com.android.settingslib.RestrictedPreference
        android:key="manage_mobile_plan"
        android:title="@string/manage_mobile_plan_title"
        android:persistent="false"
        android:order="0"
        settings:userRestriction="no_config_mobile_networks"
        settings:useAdminDisabledSummary="true" />

@@ -88,4 +80,22 @@
        android:key="proxy_settings"
        android:title="@string/proxy_settings_title" />

    <com.android.settingslib.RestrictedPreference
        android:fragment="com.android.settings.vpn2.VpnSettings"
        android:key="vpn_settings"
        android:title="@string/vpn_settings_title"
        android:icon="@drawable/ic_vpn_key"
        android:order="10"
        android:summary="@string/summary_placeholder"
        settings:userRestriction="no_config_vpn"
        settings:useAdminDisabledSummary="true" />

    <com.android.settings.network.PrivateDnsModeDialogPreference
        android:key="private_dns_settings"
        android:title="@string/select_private_dns_configuration_title"
        android:order="15"
        android:dialogTitle="@string/select_private_dns_configuration_dialog_title"
        android:dialogLayout="@layout/private_dns_mode_dialog"
        android:positiveButtonText="@string/save" />

</PreferenceScreen>
+4 −5
Original line number Diff line number Diff line
@@ -49,10 +49,8 @@ public class NetworkDashboardFragment extends DashboardFragment implements

    private static final String TAG = "NetworkDashboardFrag";
    private static final int MENU_NETWORK_RESET = Menu.FIRST;
    private static final int MENU_PRIVATE_DNS = Menu.FIRST + 1;

    private NetworkResetActionMenuController mNetworkResetController;
    private PrivateDnsMenuController mPrivateDnsMenuController;

    @Override
    public int getMetricsCategory() {
@@ -73,8 +71,6 @@ public class NetworkDashboardFragment extends DashboardFragment implements
    public void onAttach(Context context) {
        super.onAttach(context);
        mNetworkResetController = new NetworkResetActionMenuController(context, MENU_NETWORK_RESET);
        mPrivateDnsMenuController = new PrivateDnsMenuController(getFragmentManager(),
                MENU_PRIVATE_DNS);
    }

    @Override
@@ -86,7 +82,6 @@ public class NetworkDashboardFragment extends DashboardFragment implements
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        super.onCreateOptionsMenu(menu, inflater);
        mNetworkResetController.buildMenuItem(menu);
        mPrivateDnsMenuController.buildMenuItem(menu);
    }

    @Override
@@ -109,6 +104,8 @@ public class NetworkDashboardFragment extends DashboardFragment implements
                new MobileNetworkPreferenceController(context);
        final VpnPreferenceController vpnPreferenceController =
                new VpnPreferenceController(context);
        final PrivateDnsPreferenceController privateDnsPreferenceController =
                new PrivateDnsPreferenceController(context);

        if (lifecycle != null) {
            lifecycle.addObserver(airplaneModePreferenceController);
@@ -116,6 +113,7 @@ public class NetworkDashboardFragment extends DashboardFragment implements
            lifecycle.addObserver(wifiPreferenceController);
            lifecycle.addObserver(mobileNetworkPreferenceController);
            lifecycle.addObserver(vpnPreferenceController);
            lifecycle.addObserver(privateDnsPreferenceController);
        }

        final List<AbstractPreferenceController> controllers = new ArrayList<>();
@@ -126,6 +124,7 @@ public class NetworkDashboardFragment extends DashboardFragment implements
        controllers.add(new ProxyPreferenceController(context));
        controllers.add(mobilePlanPreferenceController);
        controllers.add(wifiPreferenceController);
        controllers.add(privateDnsPreferenceController);
        return controllers;
    }

+54 −52
Original line number Diff line number Diff line
@@ -20,19 +20,18 @@ import static android.net.ConnectivityManager.PRIVATE_DNS_MODE_OPPORTUNISTIC;
import static android.net.ConnectivityManager.PRIVATE_DNS_MODE_PROVIDER_HOSTNAME;

import android.app.AlertDialog;
import android.app.Dialog;
import android.app.FragmentManager;
import android.content.ActivityNotFoundException;
import android.content.ContentResolver;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.provider.Settings;
import android.support.annotation.VisibleForTesting;
import android.text.Editable;
import android.text.TextWatcher;
import android.text.method.LinkMovementMethod;
import android.view.LayoutInflater;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
@@ -41,8 +40,9 @@ import android.widget.TextView;

import com.android.internal.logging.nano.MetricsProto;
import com.android.settings.R;
import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
import com.android.settings.overlay.FeatureFactory;
import com.android.settings.utils.AnnotationSpan;
import com.android.settingslib.CustomDialogPreference;
import com.android.settingslib.HelpUtils;

import java.util.HashMap;
@@ -51,7 +51,7 @@ import java.util.Map;
/**
 * Dialog to set the private dns
 */
public class PrivateDnsModeDialogFragment extends InstrumentedDialogFragment implements
public class PrivateDnsModeDialogPreference extends CustomDialogPreference implements
        DialogInterface.OnClickListener, RadioGroup.OnCheckedChangeListener, TextWatcher {

    public static final String ANNOTATION_URL = "url";
@@ -77,41 +77,44 @@ public class PrivateDnsModeDialogFragment extends InstrumentedDialogFragment imp
    @VisibleForTesting
    RadioGroup mRadioGroup;
    @VisibleForTesting
    Button mSaveButton;
    @VisibleForTesting
    String mMode;

    public static void show(FragmentManager fragmentManager) {
        if (fragmentManager.findFragmentByTag(TAG) == null) {
            final PrivateDnsModeDialogFragment fragment = new PrivateDnsModeDialogFragment();
            fragment.show(fragmentManager, TAG);
    public PrivateDnsModeDialogPreference(Context context) {
        super(context);
    }

    public PrivateDnsModeDialogPreference(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        final Context context = getContext();
    public PrivateDnsModeDialogPreference(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

        final AlertDialog dialog = new AlertDialog.Builder(context)
                .setTitle(R.string.select_private_dns_configuration_title)
                .setView(buildPrivateDnsView(context))
                .setPositiveButton(R.string.save, this)
                .setNegativeButton(R.string.dlg_cancel, null)
                .create();
    public PrivateDnsModeDialogPreference(Context context, AttributeSet attrs, int defStyleAttr,
            int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
    }

        dialog.setOnShowListener(dialogInterface -> {
            mSaveButton = dialog.getButton(DialogInterface.BUTTON_POSITIVE);
            updateDialogInfo();
        });
        return dialog;
    private final AnnotationSpan.LinkInfo mUrlLinkInfo = new AnnotationSpan.LinkInfo(
            ANNOTATION_URL, (widget) -> {
        final Context context = widget.getContext();
        final Intent intent = HelpUtils.getHelpIntent(context,
                context.getString(R.string.help_uri_private_dns),
                context.getClass().getName());
        if (intent != null) {
            try {
                widget.startActivityForResult(intent, 0);
            } catch (ActivityNotFoundException e) {
                Log.w(TAG, "Activity was not found for intent, " + intent.toString());
            }
        }
    });

    private View buildPrivateDnsView(final Context context) {
    @Override
    protected void onBindDialogView(View view) {
        final Context context = getContext();
        final ContentResolver contentResolver = context.getContentResolver();
        mMode = Settings.Global.getString(contentResolver, MODE_KEY);
        final View view = LayoutInflater.from(context).inflate(R.layout.private_dns_mode_dialog,
                null);

        mEditText = view.findViewById(R.id.private_dns_mode_provider_hostname);
        mEditText.addTextChangedListener(this);
        mEditText.setText(Settings.Global.getString(contentResolver, HOSTNAME_KEY));
@@ -131,26 +134,20 @@ public class PrivateDnsModeDialogFragment extends InstrumentedDialogFragment imp
            helpTextView.setText(AnnotationSpan.linkify(
                    context.getText(R.string.private_dns_help_message), linkInfo));
        }

        return view;
    }

    @Override
    public void onClick(DialogInterface dialog, int which) {
        final Context context = getContext();
        if (mMode.equals(PRIVATE_DNS_MODE_PROVIDER_HOSTNAME)) {
            // Only clickable if hostname is valid, so we could save it safely
            Settings.Global.putString(getContext().getContentResolver(), HOSTNAME_KEY,
            Settings.Global.putString(context.getContentResolver(), HOSTNAME_KEY,
                    mEditText.getText().toString());
        }

        mMetricsFeatureProvider.action(getContext(),
        FeatureFactory.getFactory(context).getMetricsFeatureProvider().action(context,
                MetricsProto.MetricsEvent.ACTION_PRIVATE_DNS_MODE, mMode);
        Settings.Global.putString(getContext().getContentResolver(), MODE_KEY, mMode);
    }

    @Override
    public int getMetricsCategory() {
        return MetricsProto.MetricsEvent.DIALOG_PRIVATE_DNS;
        Settings.Global.putString(context.getContentResolver(), MODE_KEY, mMode);
    }

    @Override
@@ -179,9 +176,7 @@ public class PrivateDnsModeDialogFragment extends InstrumentedDialogFragment imp

    @Override
    public void afterTextChanged(Editable s) {
        if (mSaveButton != null) {
            mSaveButton.setEnabled(isWeaklyValidatedHostname(mEditText.getText().toString()));
        }
        updateDialogInfo();
    }

    private boolean isWeaklyValidatedHostname(String hostname) {
@@ -193,17 +188,24 @@ public class PrivateDnsModeDialogFragment extends InstrumentedDialogFragment imp
        return hostname.matches(WEAK_HOSTNAME_REGEX);
    }

    private Button getSaveButton() {
        final AlertDialog dialog = (AlertDialog) getDialog();
        if (dialog == null) {
            return null;
        }
        return dialog.getButton(DialogInterface.BUTTON_POSITIVE);
    }

    private void updateDialogInfo() {
        final boolean modeProvider = PRIVATE_DNS_MODE_PROVIDER_HOSTNAME.equals(mMode);
        if (mEditText != null) {
            mEditText.setEnabled(modeProvider);
        }
        if (mSaveButton != null) {
            mSaveButton.setEnabled(
                    modeProvider
        final Button saveButton = getSaveButton();
        if (saveButton != null) {
            saveButton.setEnabled(modeProvider
                    ? isWeaklyValidatedHostname(mEditText.getText().toString())
                    : true);
        }
    }

}
+17 −18
Original line number Diff line number Diff line
@@ -16,29 +16,28 @@

package com.android.settings.network;

import android.app.FragmentManager;
import android.view.Menu;
import android.view.MenuItem;
import android.content.Context;

import com.android.settings.R;
import com.android.settings.core.BasePreferenceController;
import com.android.settings.core.PreferenceControllerMixin;
import com.android.settingslib.core.lifecycle.LifecycleObserver;

public class PrivateDnsMenuController {
    private final FragmentManager mFragmentManager;
    private final int mMenuId;
public class PrivateDnsPreferenceController extends BasePreferenceController
        implements PreferenceControllerMixin, LifecycleObserver {
    private static final String KEY_PRIVATE_DNS_SETTINGS = "private_dns_settings";

    public PrivateDnsMenuController(FragmentManager fragmentManager, int menuId) {
        mFragmentManager = fragmentManager;
        mMenuId = menuId;
    public PrivateDnsPreferenceController(Context context) {
        super(context, KEY_PRIVATE_DNS_SETTINGS);
    }

    public void buildMenuItem(Menu menu) {
        if (menu != null) {
            MenuItem item = menu.add(0 /* groupId */, mMenuId, 0 /* order */,
                    R.string.select_private_dns_configuration_title);
            item.setOnMenuItemClickListener(target -> {
                PrivateDnsModeDialogFragment.show(mFragmentManager);
                return true;
            });
    @Override
    public String getPreferenceKey() {
        return KEY_PRIVATE_DNS_SETTINGS;
    }

    @Override
    public int getAvailabilityStatus() {
        return AVAILABLE;
    }
}
+0 −2
Original line number Diff line number Diff line
@@ -180,13 +180,11 @@ public class VpnPreferenceController extends AbstractPreferenceController
            mNetworkCallback = new ConnectivityManager.NetworkCallback() {
        @Override
        public void onAvailable(Network network) {
            Log.d(TAG, "onAvailable " + network.netId);
            updateSummary();
        }

        @Override
        public void onLost(Network network) {
            Log.d(TAG, "onLost " + network.netId);
            updateSummary();
        }
    };
Loading