Skip to content
This repository has been archived by the owner on Jan 10, 2022. It is now read-only.

Commit

Permalink
Network & Internet Settings: Add option to switch off Captive portal …
Browse files Browse the repository at this point in the history
…check

 * Option added in Network & Internet Settings, which is equivalent to
   the adb shell command 'settings put global captive_portal_mode [1/0]'
 * Will be reset to default, if 'Reset network settings' is chosen (menu)
 * Warning dialog is shown, when captive portal check is switched off
 * Hidden under 'advanced'

Cherry-picked from lin16-microG repo and adapted to Q (e.g. androidx pref.)

Change-Id: Ibbffdb5f3930df74ca8b4ba93d451f7fad086989
  • Loading branch information
MSe1969 committed Nov 21, 2020
1 parent 2f359b0 commit b483b4e
Show file tree
Hide file tree
Showing 9 changed files with 228 additions and 1 deletion.
3 changes: 3 additions & 0 deletions res/values-de/cm_strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -103,4 +103,7 @@
<string name="heads_up_notifications_enabled_summary">Wichtige Benachrichtigungen in einem kleinen, schwebenden Fenster anzeigen</string>
<string name="restore_hosts_switch_title">hosts Datei beim Update beibehalten</string>
<string name="restore_hosts_switch_summary">Sichern und Wiederherstellen der /etc/hosts Datei bei einem Update. Dieses ROM liefert eine regelmäßig aktualisierte hosts Datei mit vielen blockierten Werbe-/Malware-Seiten.\nDie Einstellung macht daher nur Sinn bei Verwendung einer Hosts-Editor-App.</string>
<string name="captive_portal_switch_title">Captive Portal Erkennung</string>
<string name="captive_portal_switch_summary">Ein-/Ausschalten der Captive Portal Erkennung (Vorgabe EIN).\nHierbei wird bei jeder WLAN Anmeldung eine Verbindung zum definierten Dienst(Vorgabe: GrapheneOS) aufgebaut.</string>
<string name="captive_portal_switch_warning">Nach dem Ausschalten der Captive-Portal-Erkennung empfangen Sie keine Verbindungs-Rückmeldung mehr. Wirklich fortfahren?</string>
</resources>
5 changes: 5 additions & 0 deletions res/values/cm_strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -193,4 +193,9 @@
<!-- hosts backup/retore -->
<string name="restore_hosts_switch_title">Restore hosts file during update</string>
<string name="restore_hosts_switch_summary">If active, the /etc/hosts file is restored during an update. This ROM delivers a regularly updated hosts file with many blocked ad-/malware sites.\nThis setting therefore only makes sense, if you use a hosts editor app.</string>

<!-- Captive Portal -->
<string name="captive_portal_switch_title">Captive portal mode</string>
<string name="captive_portal_switch_summary">Enable or disable the captive portal probing for connection attempts (default ON).\nA connection to the defined provider (default: GrapheneOS) is established at every WiFi authentication.</string>
<string name="captive_portal_switch_warning">If you switch off the captive portal, you will not receive connectivity informations any longer. Really switch off?</string>
</resources>
6 changes: 6 additions & 0 deletions res/xml/network_and_internet.xml
Original file line number Diff line number Diff line change
Expand Up @@ -97,4 +97,10 @@
android:positiveButtonText="@string/save"
android:negativeButtonText="@android:string/cancel" />

<SwitchPreference
android:key="captive_portal_switch"
android:title="@string/captive_portal_switch_title"
android:summary="@string/captive_portal_switch_summary"
android:order="20" />

</PreferenceScreen>
6 changes: 6 additions & 0 deletions res/xml/network_and_internet_v2.xml
Original file line number Diff line number Diff line change
Expand Up @@ -107,4 +107,10 @@
android:positiveButtonText="@string/save"
android:negativeButtonText="@android:string/cancel" />

<SwitchPreference
android:key="captive_portal_switch"
android:title="@string/captive_portal_switch_title"
android:summary="@string/captive_portal_switch_summary"
android:order="25" />

</PreferenceScreen>
4 changes: 4 additions & 0 deletions src/com/android/settings/ResetNetworkConfirm.java
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@
import android.os.RecoverySystem;
import android.os.UserHandle;
import android.os.UserManager;
import android.provider.Settings;
import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager;
import android.view.LayoutInflater;
Expand Down Expand Up @@ -125,6 +126,9 @@ protected Boolean doInBackground(Void... params) {
}
}

Settings.Global.putInt(mContext.getContentResolver(),
Settings.Global.CAPTIVE_PORTAL_MODE, 1);

ImsManager.getInstance(mContext,
SubscriptionManager.getPhoneId(mSubId)).factoryReset();
restoreDefaultApn(mContext);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
/*
* Copyright (C) 2018 The LineageOS 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.settings.network;

import android.content.Context;
import android.provider.Settings;

import androidx.fragment.app.Fragment;
import androidx.preference.Preference;
import androidx.preference.SwitchPreference;

import com.android.settings.core.PreferenceControllerMixin;
import com.android.settingslib.core.AbstractPreferenceController;

public class CaptivePortalModePreferenceController extends AbstractPreferenceController
implements PreferenceControllerMixin, Preference.OnPreferenceChangeListener {

private static final String TAG = "CaptivePortalModePreferenceController";
private static final String CAPTIVE_PORTAL_SWITCH_KEY = "captive_portal_switch";

private SwitchPreference mCaptivePortalMode;
private Preference mPreference;
private final Fragment mFragment;

public CaptivePortalModePreferenceController(Context context, Fragment hostFragment) {
super(context);

mFragment = hostFragment;
}

@Override
public void updateState(Preference preference) {
boolean value = (Settings.Global.getInt(mContext.getContentResolver(),
Settings.Global.CAPTIVE_PORTAL_MODE,
Settings.Global.CAPTIVE_PORTAL_MODE_PROMPT) != 0);
((SwitchPreference) preference).setChecked(value);
}

@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
mPreference = preference;
if ((Boolean) newValue) {
Settings.Global.putInt(mContext.getContentResolver(),
Settings.Global.CAPTIVE_PORTAL_MODE, 1);
} else {
CaptivePortalWarningDialog.show(mFragment);
}
return true;
}

public void onCaptivePortalSwitchOffDialogConfirmed() {
Settings.Global.putInt(mContext.getContentResolver(),
Settings.Global.CAPTIVE_PORTAL_MODE, 0);
}

public void onCaptivePortalSwitchOffDialogDismissed() {
updateState(mPreference);
}

@Override
public boolean isAvailable() {
return true;
}

@Override
public String getPreferenceKey() {
return CAPTIVE_PORTAL_SWITCH_KEY;
}
}
74 changes: 74 additions & 0 deletions src/com/android/settings/network/CaptivePortalWarningDialog.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
/*
* Copyright (C) 2018 The LineageOS 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.settings.network;

import android.app.Dialog;
import android.content.DialogInterface;
import android.os.Bundle;

import androidx.appcompat.app.AlertDialog;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;

import com.android.internal.logging.nano.MetricsProto;
import com.android.settings.R;
import com.android.settings.core.instrumentation.InstrumentedDialogFragment;

public class CaptivePortalWarningDialog extends InstrumentedDialogFragment implements
DialogInterface.OnClickListener, DialogInterface.OnDismissListener {

public static final String TAG = "CaptivePortalWarningDialog";

public static void show(Fragment host) {
final FragmentManager manager = host.getActivity().getSupportFragmentManager();
if (manager.findFragmentByTag(TAG) == null) {
final CaptivePortalWarningDialog dialog =
new CaptivePortalWarningDialog();
dialog.setTargetFragment(host, 0 /* requestCode */);
dialog.show(manager, TAG);
}
}

@Override
public int getMetricsCategory() {
return MetricsProto.MetricsEvent.TYPE_UNKNOWN;
}

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
return new AlertDialog.Builder(getActivity())
.setTitle(R.string.captive_portal_switch_title)
.setMessage(R.string.captive_portal_switch_warning)
.setIconAttribute(android.R.attr.alertDialogIcon)
.setPositiveButton(android.R.string.yes, this /* onClickListener */)
.setNegativeButton(android.R.string.no, this /* onClickListener */)
.create();
}

@Override
public void onClick(DialogInterface dialog, int which) {
final CaptivePortalWarningDialogHost host = (CaptivePortalWarningDialogHost) getTargetFragment();
if (host == null) {
return;
}
if (which == DialogInterface.BUTTON_POSITIVE) {
host.onCaptivePortalSwitchOffDialogConfirmed();
} else {
host.onCaptivePortalSwitchOffDialogDismissed();
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
/*
* Copyright (C) 2018 The LineageOS 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.settings.network;

/**
* Interface for CaptivePortalWarningDialogHost callbacks.
*/
public interface CaptivePortalWarningDialogHost {
/**
* Called when the user presses YES/ok on the warning dialog.
*/
void onCaptivePortalSwitchOffDialogConfirmed();

/**
* Called when the user presses NO/cancel on the warning dialog.
*/
void onCaptivePortalSwitchOffDialogDismissed();
}
17 changes: 16 additions & 1 deletion src/com/android/settings/network/NetworkDashboardFragment.java
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@

@SearchIndexable
public class NetworkDashboardFragment extends DashboardFragment implements
MobilePlanPreferenceHost {
MobilePlanPreferenceHost, CaptivePortalWarningDialogHost {

private static final String TAG = "NetworkDashboardFrag";

Expand Down Expand Up @@ -104,6 +104,8 @@ private static List<AbstractPreferenceController> buildPreferenceControllers(Con
new VpnPreferenceController(context);
final PrivateDnsPreferenceController privateDnsPreferenceController =
new PrivateDnsPreferenceController(context);
final CaptivePortalModePreferenceController captiveportalModePreferenceController =
new CaptivePortalModePreferenceController(context, fragment);

if (lifecycle != null) {
lifecycle.addObserver(mobilePlanPreferenceController);
Expand All @@ -129,9 +131,22 @@ private static List<AbstractPreferenceController> buildPreferenceControllers(Con
controllers.add(mobilePlanPreferenceController);
controllers.add(wifiPreferenceController);
controllers.add(privateDnsPreferenceController);
controllers.add(captiveportalModePreferenceController);
return controllers;
}

public void onCaptivePortalSwitchOffDialogConfirmed() {
final CaptivePortalModePreferenceController controller =
use(CaptivePortalModePreferenceController.class);
controller.onCaptivePortalSwitchOffDialogConfirmed();
}

public void onCaptivePortalSwitchOffDialogDismissed() {
final CaptivePortalModePreferenceController controller =
use(CaptivePortalModePreferenceController.class);
controller.onCaptivePortalSwitchOffDialogDismissed();
}

@Override
public void showMobilePlanMessageDialog() {
showDialog(MANAGE_MOBILE_PLAN_DIALOG_ID);
Expand Down

0 comments on commit b483b4e

Please sign in to comment.