diff --git a/OsmAnd-java/src/net/osmand/osm/io/NetworkUtils.java b/OsmAnd-java/src/net/osmand/osm/io/NetworkUtils.java index f74da15963..4328edfec4 100644 --- a/OsmAnd-java/src/net/osmand/osm/io/NetworkUtils.java +++ b/OsmAnd-java/src/net/osmand/osm/io/NetworkUtils.java @@ -9,6 +9,9 @@ import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.net.HttpURLConnection; +import java.net.InetSocketAddress; +import java.net.MalformedURLException; +import java.net.Proxy; import java.net.URL; import java.net.URLEncoder; import java.util.Map; @@ -21,12 +24,15 @@ import org.apache.commons.logging.Log; public class NetworkUtils { private static final Log log = PlatformUtil.getLog(NetworkUtils.class); + + private static Proxy proxy = null; + public static String sendGetRequest(String urlText, String userNamePassword){ URL url; try { log.info("GET : " + urlText); url = new URL(urlText); - HttpURLConnection conn = (HttpURLConnection) url.openConnection(); + HttpURLConnection conn = getHttpURLConnection(urlText); conn.setDoInput(true); conn.setDoOutput(false); conn.setRequestMethod("GET"); @@ -151,4 +157,24 @@ public class NetworkUtils { } } + public static void setProxy(String host, int port) { + if(host != null && port > 0) { + InetSocketAddress isa = new InetSocketAddress(host, port); + proxy = new Proxy(Proxy.Type.HTTP, isa); + } else { + proxy = null; + } + } + + public static HttpURLConnection getHttpURLConnection(String urlString) throws MalformedURLException, IOException { + return getHttpURLConnection(new URL(urlString)); + } + + public static HttpURLConnection getHttpURLConnection(URL url) throws IOException { + if (proxy != null) { + return (HttpURLConnection) url.openConnection(proxy); + } else { + return (HttpURLConnection) url.openConnection(); + } + } } diff --git a/OsmAnd/res/values/strings.xml b/OsmAnd/res/values/strings.xml index d7ae79244d..71b7f721a6 100644 --- a/OsmAnd/res/values/strings.xml +++ b/OsmAnd/res/values/strings.xml @@ -155,6 +155,13 @@ Choose logging interval for track recording during navigation Select voice guidance for navigation Voice guidance + Proxy + Enable HTTP Proxy + Configure HTTP Proxy for all network requests + Proxy Host + Configure your proxy\'s hostname (e.g. 127.0.0.1) + Proxy Port + Configure your proxy\'s port number (e.g. 8118) Help Help OsmAnd is a navigation application with many features. diff --git a/OsmAnd/res/xml/general_settings.xml b/OsmAnd/res/xml/general_settings.xml index 9d8cf09906..d6f60f4217 100644 --- a/OsmAnd/res/xml/general_settings.xml +++ b/OsmAnd/res/xml/general_settings.xml @@ -13,6 +13,16 @@ + + + + + diff --git a/OsmAnd/src/net/osmand/plus/OsmandSettings.java b/OsmAnd/src/net/osmand/plus/OsmandSettings.java index d5e369f781..4eb256d465 100644 --- a/OsmAnd/src/net/osmand/plus/OsmandSettings.java +++ b/OsmAnd/src/net/osmand/plus/OsmandSettings.java @@ -796,6 +796,9 @@ public class OsmandSettings { public final CommonPreference INTERRUPT_MUSIC = new BooleanPreference("interrupt_music", false).makeGlobal(); + public final CommonPreference ENABLE_PROXY = new BooleanPreference("enable_proxy", false).makeGlobal(); + public final CommonPreference PROXY_HOST = new StringPreference("proxy_host", "127.0.0.1").makeGlobal(); + public final CommonPreference PROXY_PORT = new IntPreference("proxy_port", 8118).makeGlobal(); // this value string is synchronized with settings_pref.xml preference name public static final String SAVE_CURRENT_TRACK = "save_current_track"; //$NON-NLS-1$ diff --git a/OsmAnd/src/net/osmand/plus/activities/SettingsGeneralActivity.java b/OsmAnd/src/net/osmand/plus/activities/SettingsGeneralActivity.java index f15838da6b..0056414517 100644 --- a/OsmAnd/src/net/osmand/plus/activities/SettingsGeneralActivity.java +++ b/OsmAnd/src/net/osmand/plus/activities/SettingsGeneralActivity.java @@ -14,6 +14,7 @@ import net.osmand.CallbackWithObject; import net.osmand.IProgress; import net.osmand.IndexConstants; import net.osmand.access.AccessibleToast; +import net.osmand.osm.io.NetworkUtils; import net.osmand.plus.ApplicationMode; import net.osmand.plus.OsmandApplication; import net.osmand.plus.OsmandSettings; @@ -43,6 +44,7 @@ import android.media.AudioManager; import android.os.AsyncTask; import android.os.Bundle; import android.preference.CheckBoxPreference; +import android.preference.EditTextPreference; import android.preference.ListPreference; import android.preference.Preference; import android.preference.Preference.OnPreferenceChangeListener; @@ -94,6 +96,7 @@ public class SettingsGeneralActivity extends SettingsBaseActivity { addLocalPrefs((PreferenceGroup) screen.findPreference("localization")); addVoicePrefs((PreferenceGroup) screen.findPreference("voice")); + addProxyPrefs((PreferenceGroup) screen.findPreference("proxy")); addMiscPreferences((PreferenceGroup) screen.findPreference("misc")); @@ -264,6 +267,54 @@ public class SettingsGeneralActivity extends SettingsBaseActivity { + + private void addProxyPrefs(PreferenceGroup proxy) { + CheckBoxPreference enableProxyPref = (CheckBoxPreference) proxy.findPreference(settings.ENABLE_PROXY.getId()); + enableProxyPref.setOnPreferenceChangeListener(new OnPreferenceChangeListener() { + + @Override + public boolean onPreferenceChange(Preference preference, Object newValue) { + if ((Boolean) newValue) + NetworkUtils.setProxy(settings.PROXY_HOST.get(), settings.PROXY_PORT.get()); + else + NetworkUtils.setProxy(null, 0); + return true; + } + }); + + EditTextPreference hostPref = (EditTextPreference) proxy.findPreference(settings.PROXY_HOST.getId()); + hostPref.setOnPreferenceChangeListener(new OnPreferenceChangeListener() { + + @Override + public boolean onPreferenceChange(Preference preference, Object newValue) { + System.out.println("PROXY newValue: " + newValue); + settings.PROXY_HOST.set((String) newValue); + NetworkUtils.setProxy((String) newValue, settings.PROXY_PORT.get()); + return true; + } + }); + + EditTextPreference portPref = (EditTextPreference) proxy.findPreference(settings.PROXY_PORT.getId()); + portPref.setOnPreferenceChangeListener(new OnPreferenceChangeListener() { + + @Override + public boolean onPreferenceChange(Preference preference, Object newValue) { + System.out.println("PROXY newValue: " + newValue); + int port = -1; + String portString = (String) newValue; + try { + port = Integer.valueOf(portString.replaceAll("[^0-9]", "")); + } catch (NumberFormatException e1) { + } + settings.PROXY_PORT.set(port); + NetworkUtils.setProxy(settings.PROXY_HOST.get(), port); + return true; + } + }); + } + + + private void addMiscPreferences(PreferenceGroup misc) { if (!Version.isBlackberry(getMyApplication())) { applicationDir = new Preference(this); diff --git a/OsmAnd/src/net/osmand/plus/download/DownloadFileHelper.java b/OsmAnd/src/net/osmand/plus/download/DownloadFileHelper.java index b4e7cfb6a1..23d8127333 100644 --- a/OsmAnd/src/net/osmand/plus/download/DownloadFileHelper.java +++ b/OsmAnd/src/net/osmand/plus/download/DownloadFileHelper.java @@ -14,6 +14,7 @@ import java.util.zip.ZipInputStream; import net.osmand.IProgress; import net.osmand.IndexConstants; import net.osmand.PlatformUtil; +import net.osmand.osm.io.NetworkUtils; import net.osmand.plus.OsmandApplication; import net.osmand.plus.R; import net.osmand.plus.Version; @@ -66,7 +67,7 @@ public class DownloadFileHelper { } catch (InterruptedException e) { } } - HttpURLConnection conn = (HttpURLConnection) url.openConnection(); + HttpURLConnection conn = NetworkUtils.getHttpURLConnection(url); conn.setRequestProperty("User-Agent", Version.getFullVersion(ctx)); //$NON-NLS-1$ conn.setReadTimeout(30000); if (fileread > 0) { diff --git a/OsmAnd/src/net/osmand/plus/download/DownloadOsmandIndexesHelper.java b/OsmAnd/src/net/osmand/plus/download/DownloadOsmandIndexesHelper.java index 650660de05..8c86372812 100644 --- a/OsmAnd/src/net/osmand/plus/download/DownloadOsmandIndexesHelper.java +++ b/OsmAnd/src/net/osmand/plus/download/DownloadOsmandIndexesHelper.java @@ -4,6 +4,7 @@ import java.io.File; import java.io.IOException; import java.io.InputStream; import java.net.URL; +import java.net.URLConnection; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -12,6 +13,7 @@ import java.util.zip.GZIPInputStream; import net.osmand.AndroidUtils; import net.osmand.IndexConstants; import net.osmand.PlatformUtil; +import net.osmand.osm.io.NetworkUtils; import net.osmand.plus.OsmandApplication; import net.osmand.plus.OsmandSettings; @@ -104,9 +106,9 @@ public class DownloadOsmandIndexesHelper { String strUrl = ctx.getAppCustomization().getIndexesUrl(); log.info(strUrl); - URL url = new URL(strUrl ); XmlPullParser parser = XmlPullParserFactory.newInstance().newPullParser(); - parser.setInput(new GZIPInputStream(url.openStream()), "UTF-8"); //$NON-NLS-1$ + URLConnection connection = NetworkUtils.getHttpURLConnection(strUrl); + parser.setInput(new GZIPInputStream(connection.getInputStream()), "UTF-8"); //$NON-NLS-1$ int next; while((next = parser.next()) != XmlPullParser.END_DOCUMENT) { if (next == XmlPullParser.START_TAG) { diff --git a/OsmAnd/src/net/osmand/plus/download/DownloadTracker.java b/OsmAnd/src/net/osmand/plus/download/DownloadTracker.java index 3df7b14917..20aa692dad 100644 --- a/OsmAnd/src/net/osmand/plus/download/DownloadTracker.java +++ b/OsmAnd/src/net/osmand/plus/download/DownloadTracker.java @@ -13,6 +13,7 @@ import java.util.Map.Entry; import java.util.Random; import net.osmand.PlatformUtil; +import net.osmand.osm.io.NetworkUtils; import net.osmand.plus.OsmandApplication; import net.osmand.plus.Version; @@ -102,8 +103,7 @@ public class DownloadTracker { } log.debug(urlString); - URL url = new URL(urlString.toString()); - HttpURLConnection conn = (HttpURLConnection) url.openConnection(); + HttpURLConnection conn = NetworkUtils.getHttpURLConnection(urlString.toString()); conn.setConnectTimeout(5000); conn.setDoInput(false); conn.setDoOutput(false); diff --git a/OsmAnd/src/net/osmand/plus/osmedit/OpenstreetmapRemoteUtil.java b/OsmAnd/src/net/osmand/plus/osmedit/OpenstreetmapRemoteUtil.java index d1bfabf1d5..5ed3c88d05 100644 --- a/OsmAnd/src/net/osmand/plus/osmedit/OpenstreetmapRemoteUtil.java +++ b/OsmAnd/src/net/osmand/plus/osmedit/OpenstreetmapRemoteUtil.java @@ -103,7 +103,7 @@ public class OpenstreetmapRemoteUtil implements OpenstreetmapUtil { private String sendRequest(String url, String requestMethod, String requestBody, String userOperation, boolean doAuthenticate) { log.info("Sending request " + url); //$NON-NLS-1$ try { - HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection(); + HttpURLConnection connection = NetworkUtils.getHttpURLConnection(url); connection.setConnectTimeout(15000); connection.setRequestMethod(requestMethod); diff --git a/OsmAnd/src/net/osmand/plus/osmedit/OsmBugsRemoteUtil.java b/OsmAnd/src/net/osmand/plus/osmedit/OsmBugsRemoteUtil.java index 3d475e3639..38081cd30c 100644 --- a/OsmAnd/src/net/osmand/plus/osmedit/OsmBugsRemoteUtil.java +++ b/OsmAnd/src/net/osmand/plus/osmedit/OsmBugsRemoteUtil.java @@ -11,6 +11,7 @@ import java.net.URLEncoder; import net.osmand.PlatformUtil; import net.osmand.osm.io.Base64; +import net.osmand.osm.io.NetworkUtils; import net.osmand.plus.OsmandApplication; import net.osmand.plus.OsmandSettings; import net.osmand.plus.R; @@ -76,7 +77,7 @@ public class OsmBugsRemoteUtil implements OsmBugsUtil { private String editingPOI(String url, String requestMethod, String userOperation) { try { - HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection(); + HttpURLConnection connection = NetworkUtils.getHttpURLConnection(url); log.info("Editing poi " + url); connection.setConnectTimeout(15000); connection.setRequestMethod(requestMethod); diff --git a/OsmAnd/src/net/osmand/plus/poi/NameFinderPoiFilter.java b/OsmAnd/src/net/osmand/plus/poi/NameFinderPoiFilter.java index b04c877fba..f79f0ecb45 100644 --- a/OsmAnd/src/net/osmand/plus/poi/NameFinderPoiFilter.java +++ b/OsmAnd/src/net/osmand/plus/poi/NameFinderPoiFilter.java @@ -3,6 +3,7 @@ package net.osmand.plus.poi; import java.io.IOException; import java.io.InputStream; import java.net.URL; +import java.net.URLConnection; import java.net.URLEncoder; import java.util.ArrayList; import java.util.List; @@ -11,6 +12,7 @@ import net.osmand.PlatformUtil; import net.osmand.ResultMatcher; import net.osmand.data.Amenity; import net.osmand.data.AmenityType; +import net.osmand.osm.io.NetworkUtils; import net.osmand.plus.OsmandApplication; import net.osmand.plus.R; import net.osmand.plus.R.string; @@ -76,8 +78,8 @@ public class NameFinderPoiFilter extends PoiLegacyFilter { lastError = ""; String urlq = NOMINATIM_API + URLEncoder.encode(query)+ "?format=xml&addressdetails=1&limit="+LIMIT+"&bounded=1&"+viewbox; log.info(urlq); - URL url = new URL(urlq); //$NON-NLS-1$ - InputStream stream = url.openStream(); + URLConnection connection = NetworkUtils.getHttpURLConnection(urlq); //$NON-NLS-1$ + InputStream stream = connection.getInputStream(); XmlPullParser parser = PlatformUtil.newXMLPullParser(); parser.setInput(stream, "UTF-8"); //$NON-NLS-1$ int eventType; diff --git a/OsmAnd/src/net/osmand/plus/routing/RouteProvider.java b/OsmAnd/src/net/osmand/plus/routing/RouteProvider.java index e228cb0da5..e46c634809 100644 --- a/OsmAnd/src/net/osmand/plus/routing/RouteProvider.java +++ b/OsmAnd/src/net/osmand/plus/routing/RouteProvider.java @@ -27,6 +27,7 @@ import net.osmand.PlatformUtil; import net.osmand.binary.BinaryMapIndexReader; import net.osmand.data.LatLon; import net.osmand.data.LocationPoint; +import net.osmand.osm.io.NetworkUtils; import net.osmand.plus.ApplicationMode; import net.osmand.plus.GPXUtilities; import net.osmand.plus.GPXUtilities.GPXFile; @@ -1103,8 +1104,7 @@ public class RouteProvider { log.info("URL route " + uri); - URL url = new URL(uri.toString()); - URLConnection connection = url.openConnection(); + URLConnection connection = NetworkUtils.getHttpURLConnection(uri.toString()); connection.setRequestProperty("User-Agent", Version.getFullVersion(params.ctx)); // StringBuilder content = new StringBuilder(); // BufferedReader rs = new BufferedReader(new InputStreamReader(connection.getInputStream())); diff --git a/OsmAnd/src/net/osmand/plus/views/YandexTrafficAdapter.java b/OsmAnd/src/net/osmand/plus/views/YandexTrafficAdapter.java index 2982398549..3b7d0460bf 100644 --- a/OsmAnd/src/net/osmand/plus/views/YandexTrafficAdapter.java +++ b/OsmAnd/src/net/osmand/plus/views/YandexTrafficAdapter.java @@ -6,10 +6,12 @@ import java.io.ByteArrayOutputStream; import java.io.File; import java.io.IOException; import java.net.URL; +import java.net.URLConnection; import net.osmand.IndexConstants; import net.osmand.PlatformUtil; import net.osmand.data.RotatedTileBox; +import net.osmand.osm.io.NetworkUtils; import net.osmand.map.TileSourceManager.TileSourceTemplate; import net.osmand.util.Algorithms; @@ -65,7 +67,8 @@ public class YandexTrafficAdapter extends MapTileAdapter { if (mTimestamp == null || (System.currentTimeMillis() - lastTimestampUpdated) > DELTA) { log.info("Updating timestamp"); //$NON-NLS-1$ try { - BufferedInputStream in = new BufferedInputStream(new URL(YANDEX_BASE_URL + "/trf/stat.js").openStream(), 1024); //$NON-NLS-1$ + URLConnection connection = NetworkUtils.getHttpURLConnection(YANDEX_BASE_URL + "/trf/stat.js"); + BufferedInputStream in = new BufferedInputStream(connection.getInputStream(), 1024); //$NON-NLS-1$ ByteArrayOutputStream dataStream = new ByteArrayOutputStream(); BufferedOutputStream out = new BufferedOutputStream(dataStream, 1024); Algorithms.streamCopy(in, out);