Merge branch 'proxy-on-app-start' into 'master'
Proxy on app start See merge request fdroid/fdroidclient!815
This commit is contained in:
commit
736341b34e
@ -4,6 +4,7 @@
|
|||||||
* Copyright (C) 2014-2018 Hans-Christoph Steiner <hans@eds.org>
|
* Copyright (C) 2014-2018 Hans-Christoph Steiner <hans@eds.org>
|
||||||
* Copyright (C) 2015-2016 Daniel Martí <mvdan@mvdan.cc>
|
* Copyright (C) 2015-2016 Daniel Martí <mvdan@mvdan.cc>
|
||||||
* Copyright (c) 2018 Senecto Limited
|
* Copyright (c) 2018 Senecto Limited
|
||||||
|
* Copyright (C) 2019 Michael Pöhn <michael.poehn@fsfe.org>
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or
|
* This program is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU General Public License
|
* modify it under the terms of the GNU General Public License
|
||||||
@ -388,7 +389,8 @@ public class FDroidApp extends Application {
|
|||||||
PRNGFixes.apply();
|
PRNGFixes.apply();
|
||||||
|
|
||||||
curTheme = preferences.getTheme();
|
curTheme = preferences.getTheme();
|
||||||
preferences.configureProxy();
|
configureProxy(preferences);
|
||||||
|
|
||||||
|
|
||||||
// bug specific to exactly 5.0 makes it only work with the old index
|
// bug specific to exactly 5.0 makes it only work with the old index
|
||||||
// which includes an ugly, hacky workaround
|
// which includes an ugly, hacky workaround
|
||||||
@ -485,8 +487,6 @@ public class FDroidApp extends Application {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
configureTor(preferences.isTorEnabled());
|
|
||||||
|
|
||||||
if (preferences.isKeepingInstallHistory()) {
|
if (preferences.isKeepingInstallHistory()) {
|
||||||
InstallHistoryService.register(this);
|
InstallHistoryService.register(this);
|
||||||
}
|
}
|
||||||
@ -640,30 +640,27 @@ public class FDroidApp extends Application {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static boolean useTor;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set the proxy settings based on whether Tor should be enabled or not.
|
* Put proxy settings (or Tor settings) globally into effect based on whats configured in Preferences.
|
||||||
|
*
|
||||||
|
* Must be called on App startup and after every proxy configuration change.
|
||||||
*/
|
*/
|
||||||
private static void configureTor(boolean enabled) {
|
public static void configureProxy(Preferences preferences) {
|
||||||
useTor = enabled;
|
if (preferences.isTorEnabled()) {
|
||||||
if (useTor) {
|
|
||||||
NetCipher.useTor();
|
NetCipher.useTor();
|
||||||
|
} else if (preferences.isProxyEnabled()) {
|
||||||
|
NetCipher.setProxy(preferences.getProxyHost(), preferences.getProxyPort());
|
||||||
} else {
|
} else {
|
||||||
NetCipher.clearProxy();
|
NetCipher.clearProxy();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void checkStartTor(Context context) {
|
public static void checkStartTor(Context context, Preferences preferences) {
|
||||||
if (useTor) {
|
if (preferences.isTorEnabled()) {
|
||||||
OrbotHelper.requestStartTor(context);
|
OrbotHelper.requestStartTor(context);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean isUsingTor() {
|
|
||||||
return useTor;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Context getInstance() {
|
public static Context getInstance() {
|
||||||
return instance;
|
return instance;
|
||||||
}
|
}
|
||||||
|
@ -31,13 +31,9 @@ import android.os.Build;
|
|||||||
import android.support.v7.preference.PreferenceManager;
|
import android.support.v7.preference.PreferenceManager;
|
||||||
import android.text.format.DateUtils;
|
import android.text.format.DateUtils;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
import info.guardianproject.netcipher.NetCipher;
|
|
||||||
import org.fdroid.fdroid.installer.PrivilegedInstaller;
|
import org.fdroid.fdroid.installer.PrivilegedInstaller;
|
||||||
import org.fdroid.fdroid.net.ConnectivityMonitorService;
|
import org.fdroid.fdroid.net.ConnectivityMonitorService;
|
||||||
|
|
||||||
import java.net.InetSocketAddress;
|
|
||||||
import java.net.Proxy;
|
|
||||||
import java.net.SocketAddress;
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@ -481,22 +477,10 @@ public final class Preferences implements SharedPreferences.OnSharedPreferenceCh
|
|||||||
return preferences.getBoolean(PREF_USE_TOR, IGNORED_B);
|
return preferences.getBoolean(PREF_USE_TOR, IGNORED_B);
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean isProxyEnabled() {
|
public boolean isProxyEnabled() {
|
||||||
return preferences.getBoolean(PREF_ENABLE_PROXY, IGNORED_B);
|
return preferences.getBoolean(PREF_ENABLE_PROXY, IGNORED_B);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Configure the proxy settings based on whether its enabled and set up. This must be
|
|
||||||
* run once at app startup, then whenever any of these settings changes.
|
|
||||||
*/
|
|
||||||
public void configureProxy() {
|
|
||||||
if (isProxyEnabled()) {
|
|
||||||
// if "Use Tor" is set, NetCipher will ignore these proxy settings
|
|
||||||
SocketAddress sa = new InetSocketAddress(getProxyHost(), getProxyPort());
|
|
||||||
NetCipher.setProxy(new Proxy(Proxy.Type.HTTP, sa));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getProxyHost() {
|
public String getProxyHost() {
|
||||||
return preferences.getString(PREF_PROXY_HOST, DEFAULT_PROXY_HOST);
|
return preferences.getString(PREF_PROXY_HOST, DEFAULT_PROXY_HOST);
|
||||||
}
|
}
|
||||||
|
@ -28,6 +28,7 @@ import android.database.Cursor;
|
|||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
import com.fasterxml.jackson.annotation.JsonIgnore;
|
import com.fasterxml.jackson.annotation.JsonIgnore;
|
||||||
import org.fdroid.fdroid.FDroidApp;
|
import org.fdroid.fdroid.FDroidApp;
|
||||||
|
import org.fdroid.fdroid.Preferences;
|
||||||
import org.fdroid.fdroid.Utils;
|
import org.fdroid.fdroid.Utils;
|
||||||
import org.fdroid.fdroid.data.Schema.RepoTable.Cols;
|
import org.fdroid.fdroid.data.Schema.RepoTable.Cols;
|
||||||
|
|
||||||
@ -390,9 +391,12 @@ public class Repo extends ValueObject {
|
|||||||
* Get the number of available mirrors, including the canonical repo.
|
* Get the number of available mirrors, including the canonical repo.
|
||||||
*/
|
*/
|
||||||
public int getMirrorCount() {
|
public int getMirrorCount() {
|
||||||
|
|
||||||
|
final boolean isTorEnabled = Preferences.get().isTorEnabled();
|
||||||
|
|
||||||
int count = 0;
|
int count = 0;
|
||||||
for (String m : getMirrorList()) {
|
for (String m : getMirrorList()) {
|
||||||
if (FDroidApp.isUsingTor()) {
|
if (isTorEnabled) {
|
||||||
count++;
|
count++;
|
||||||
} else if (!m.contains(".onion")) {
|
} else if (!m.contains(".onion")) {
|
||||||
count++;
|
count++;
|
||||||
@ -430,11 +434,14 @@ public class Repo extends ValueObject {
|
|||||||
}
|
}
|
||||||
List<String> shuffledMirrors = getMirrorList();
|
List<String> shuffledMirrors = getMirrorList();
|
||||||
if (shuffledMirrors.size() > 0) {
|
if (shuffledMirrors.size() > 0) {
|
||||||
|
|
||||||
|
final boolean isTorEnabled = Preferences.get().isTorEnabled();
|
||||||
|
|
||||||
Collections.shuffle(shuffledMirrors);
|
Collections.shuffle(shuffledMirrors);
|
||||||
for (String m : shuffledMirrors) {
|
for (String m : shuffledMirrors) {
|
||||||
// Return a non default, and not last used mirror
|
// Return a non default, and not last used mirror
|
||||||
if (!m.equals(mirrorToSkip)) {
|
if (!m.equals(mirrorToSkip)) {
|
||||||
if (FDroidApp.isUsingTor()) {
|
if (isTorEnabled) {
|
||||||
return m;
|
return m;
|
||||||
} else {
|
} else {
|
||||||
// Filter-out onion mirrors for non-tor connections
|
// Filter-out onion mirrors for non-tor connections
|
||||||
|
@ -60,6 +60,7 @@ import android.widget.Toast;
|
|||||||
import org.fdroid.fdroid.AddRepoIntentService;
|
import org.fdroid.fdroid.AddRepoIntentService;
|
||||||
import org.fdroid.fdroid.FDroidApp;
|
import org.fdroid.fdroid.FDroidApp;
|
||||||
import org.fdroid.fdroid.IndexUpdater;
|
import org.fdroid.fdroid.IndexUpdater;
|
||||||
|
import org.fdroid.fdroid.Preferences;
|
||||||
import org.fdroid.fdroid.R;
|
import org.fdroid.fdroid.R;
|
||||||
import org.fdroid.fdroid.UpdateService;
|
import org.fdroid.fdroid.UpdateService;
|
||||||
import org.fdroid.fdroid.Utils;
|
import org.fdroid.fdroid.Utils;
|
||||||
@ -128,7 +129,7 @@ public class ManageReposActivity extends AppCompatActivity
|
|||||||
@Override
|
@Override
|
||||||
protected void onResume() {
|
protected void onResume() {
|
||||||
super.onResume();
|
super.onResume();
|
||||||
FDroidApp.checkStartTor(this);
|
FDroidApp.checkStartTor(this, Preferences.get());
|
||||||
|
|
||||||
/* let's see if someone is trying to send us a new repo */
|
/* let's see if someone is trying to send us a new repo */
|
||||||
addRepoFromIntent(getIntent());
|
addRepoFromIntent(getIntent());
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
|
* Copyright (C) 2019 Michael Pöhn
|
||||||
* Copyright (C) 2014-2018 Hans-Christoph Steiner
|
* Copyright (C) 2014-2018 Hans-Christoph Steiner
|
||||||
* Copyright (C) 2014-2017 Peter Serwylo
|
* Copyright (C) 2014-2017 Peter Serwylo
|
||||||
* Copyright (C) 2015-2016 Daniel Martí
|
* Copyright (C) 2015-2016 Daniel Martí
|
||||||
@ -26,6 +27,7 @@
|
|||||||
package org.fdroid.fdroid.views;
|
package org.fdroid.fdroid.views;
|
||||||
|
|
||||||
import android.app.Activity;
|
import android.app.Activity;
|
||||||
|
import android.content.Context;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.content.SharedPreferences;
|
import android.content.SharedPreferences;
|
||||||
import android.content.pm.PackageManager;
|
import android.content.pm.PackageManager;
|
||||||
@ -44,7 +46,7 @@ import android.support.v7.widget.LinearSmoothScroller;
|
|||||||
import android.support.v7.widget.RecyclerView;
|
import android.support.v7.widget.RecyclerView;
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
import android.view.WindowManager;
|
import android.view.WindowManager;
|
||||||
import info.guardianproject.netcipher.NetCipher;
|
|
||||||
import info.guardianproject.netcipher.proxy.OrbotHelper;
|
import info.guardianproject.netcipher.proxy.OrbotHelper;
|
||||||
import org.fdroid.fdroid.CleanCacheService;
|
import org.fdroid.fdroid.CleanCacheService;
|
||||||
import org.fdroid.fdroid.FDroidApp;
|
import org.fdroid.fdroid.FDroidApp;
|
||||||
@ -121,7 +123,9 @@ public class PreferencesFragment extends PreferenceFragment
|
|||||||
installHistoryPref.setVisible(keepInstallHistoryPref.isChecked());
|
installHistoryPref.setVisible(keepInstallHistoryPref.isChecked());
|
||||||
|
|
||||||
useTorCheckPref = (SwitchPreference) findPreference(Preferences.PREF_USE_TOR);
|
useTorCheckPref = (SwitchPreference) findPreference(Preferences.PREF_USE_TOR);
|
||||||
|
useTorCheckPref.setOnPreferenceChangeListener(useTorChangedListener);
|
||||||
enableProxyCheckPref = (SwitchPreference) findPreference(Preferences.PREF_ENABLE_PROXY);
|
enableProxyCheckPref = (SwitchPreference) findPreference(Preferences.PREF_ENABLE_PROXY);
|
||||||
|
enableProxyCheckPref.setOnPreferenceChangeListener(proxyEnabledChangedListener);
|
||||||
updateAutoDownloadPref = findPreference(Preferences.PREF_AUTO_DOWNLOAD_INSTALL_UPDATES);
|
updateAutoDownloadPref = findPreference(Preferences.PREF_AUTO_DOWNLOAD_INSTALL_UPDATES);
|
||||||
|
|
||||||
overWifiSeekBar = (LiveSeekBarPreference) findPreference(Preferences.PREF_OVER_WIFI);
|
overWifiSeekBar = (LiveSeekBarPreference) findPreference(Preferences.PREF_OVER_WIFI);
|
||||||
@ -445,31 +449,40 @@ public class PreferencesFragment extends PreferenceFragment
|
|||||||
/**
|
/**
|
||||||
* The default for "Use Tor" is dynamically set based on whether Orbot is installed.
|
* The default for "Use Tor" is dynamically set based on whether Orbot is installed.
|
||||||
*/
|
*/
|
||||||
private void initUseTorPreference() {
|
private void initUseTorPreference(Context context) {
|
||||||
boolean useTor = Preferences.get().isTorEnabled();
|
useTorCheckPref.setDefaultValue(OrbotHelper.isOrbotInstalled(context));
|
||||||
useTorCheckPref.setDefaultValue(useTor);
|
useTorCheckPref.setChecked(Preferences.get().isTorEnabled());
|
||||||
useTorCheckPref.setChecked(useTor);
|
|
||||||
useTorCheckPref.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
|
|
||||||
@Override
|
|
||||||
public boolean onPreferenceChange(Preference preference, Object enabled) {
|
|
||||||
if ((Boolean) enabled) {
|
|
||||||
final Activity activity = getActivity();
|
|
||||||
enableProxyCheckPref.setEnabled(false);
|
|
||||||
if (OrbotHelper.isOrbotInstalled(activity)) {
|
|
||||||
NetCipher.useTor();
|
|
||||||
} else {
|
|
||||||
Intent intent = OrbotHelper.getOrbotInstallIntent(activity);
|
|
||||||
activity.startActivityForResult(intent, REQUEST_INSTALL_ORBOT);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
enableProxyCheckPref.setEnabled(true);
|
|
||||||
NetCipher.clearProxy();
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private final Preference.OnPreferenceChangeListener useTorChangedListener =
|
||||||
|
new Preference.OnPreferenceChangeListener() {
|
||||||
|
@Override
|
||||||
|
public boolean onPreferenceChange(Preference preference, Object enabled) {
|
||||||
|
if ((Boolean) enabled) {
|
||||||
|
enableProxyCheckPref.setChecked(false);
|
||||||
|
final Activity activity = getActivity();
|
||||||
|
if (!OrbotHelper.isOrbotInstalled(activity)) {
|
||||||
|
Intent intent = OrbotHelper.getOrbotInstallIntent(activity);
|
||||||
|
activity.startActivityForResult(intent, REQUEST_INSTALL_ORBOT);
|
||||||
|
}
|
||||||
|
// NetCipher gets configured to use Tor in onPause()
|
||||||
|
// via a call to FDroidApp.configureProxy()
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
private final Preference.OnPreferenceChangeListener proxyEnabledChangedListener =
|
||||||
|
new Preference.OnPreferenceChangeListener() {
|
||||||
|
@Override
|
||||||
|
public boolean onPreferenceChange(Preference preference, Object enabled) {
|
||||||
|
if ((Boolean) enabled) {
|
||||||
|
useTorCheckPref.setChecked(false);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onResume() {
|
public void onResume() {
|
||||||
super.onResume();
|
super.onResume();
|
||||||
@ -484,14 +497,14 @@ public class PreferencesFragment extends PreferenceFragment
|
|||||||
|
|
||||||
initAutoFetchUpdatesPreference();
|
initAutoFetchUpdatesPreference();
|
||||||
initPrivilegedInstallerPreference();
|
initPrivilegedInstallerPreference();
|
||||||
initUseTorPreference();
|
initUseTorPreference(getActivity().getApplicationContext());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onPause() {
|
public void onPause() {
|
||||||
super.onPause();
|
super.onPause();
|
||||||
getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this);
|
getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this);
|
||||||
Preferences.get().configureProxy();
|
FDroidApp.configureProxy(Preferences.get());
|
||||||
|
|
||||||
if (updateIntervalPrevious != updateIntervalSeekBar.getValue()) {
|
if (updateIntervalPrevious != updateIntervalSeekBar.getValue()) {
|
||||||
UpdateService.schedule(getActivity());
|
UpdateService.schedule(getActivity());
|
||||||
|
@ -209,7 +209,7 @@ public class MainActivity extends AppCompatActivity implements BottomNavigationB
|
|||||||
protected void onResume() {
|
protected void onResume() {
|
||||||
super.onResume();
|
super.onResume();
|
||||||
|
|
||||||
FDroidApp.checkStartTor(this);
|
FDroidApp.checkStartTor(this, Preferences.get());
|
||||||
|
|
||||||
if (getIntent().hasExtra(EXTRA_VIEW_UPDATES)) {
|
if (getIntent().hasExtra(EXTRA_VIEW_UPDATES)) {
|
||||||
getIntent().removeExtra(EXTRA_VIEW_UPDATES);
|
getIntent().removeExtra(EXTRA_VIEW_UPDATES);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user