From a912022c5529f43705d922509f3a890eacee1fc4 Mon Sep 17 00:00:00 2001 From: KOSBUM Date: Thu, 2 Jul 2015 02:18:22 +0300 Subject: [PATCH 1/2] proxy server settings were added to 'Advanced settings' screen --- .../src/main/java/org/floens/chan/Chan.java | 4 +- .../org/floens/chan/core/cache/FileCache.java | 12 +++ .../chan/core/net/ProxiedHurlStack.java | 29 ++++++++ .../chan/core/settings/ChanSettings.java | 8 ++ .../chan/core/settings/IntegerSetting.java | 39 ++++++++++ .../AdvancedSettingsController.java | 8 ++ .../chan/ui/settings/IntegerSettingView.java | 74 +++++++++++++++++++ .../chan/ui/settings/SettingsController.java | 11 ++- Clover/app/src/main/res/values/strings.xml | 5 ++ 9 files changed, 187 insertions(+), 3 deletions(-) create mode 100644 Clover/app/src/main/java/org/floens/chan/core/net/ProxiedHurlStack.java create mode 100644 Clover/app/src/main/java/org/floens/chan/core/settings/IntegerSetting.java create mode 100644 Clover/app/src/main/java/org/floens/chan/ui/settings/IntegerSettingView.java diff --git a/Clover/app/src/main/java/org/floens/chan/Chan.java b/Clover/app/src/main/java/org/floens/chan/Chan.java index 40a43f4b..979e0c6b 100644 --- a/Clover/app/src/main/java/org/floens/chan/Chan.java +++ b/Clover/app/src/main/java/org/floens/chan/Chan.java @@ -34,6 +34,7 @@ import org.floens.chan.core.manager.BoardManager; import org.floens.chan.core.manager.WatchManager; import org.floens.chan.core.net.BitmapLruImageCache; import org.floens.chan.core.http.ReplyManager; +import org.floens.chan.core.net.ProxiedHurlStack; import org.floens.chan.core.settings.ChanSettings; import org.floens.chan.database.DatabaseManager; import org.floens.chan.utils.AndroidUtils; @@ -151,7 +152,8 @@ public class Chan extends Application { replyManager = new ReplyManager(this); - volleyRequestQueue = Volley.newRequestQueue(this, getUserAgent(), null, new File(cacheDir, Volley.DEFAULT_CACHE_DIR), VOLLEY_CACHE_SIZE); + String userAgent = getUserAgent(); + volleyRequestQueue = Volley.newRequestQueue(this, userAgent, new ProxiedHurlStack(userAgent), new File(cacheDir, Volley.DEFAULT_CACHE_DIR), VOLLEY_CACHE_SIZE); imageLoader = new ImageLoader(volleyRequestQueue, new BitmapLruImageCache(VOLLEY_LRU_CACHE_SIZE)); fileCache = new FileCache(new File(cacheDir, FILE_CACHE_NAME), FILE_CACHE_DISK_SIZE, getUserAgent()); diff --git a/Clover/app/src/main/java/org/floens/chan/core/cache/FileCache.java b/Clover/app/src/main/java/org/floens/chan/core/cache/FileCache.java index 2b0af178..6a298ea7 100644 --- a/Clover/app/src/main/java/org/floens/chan/core/cache/FileCache.java +++ b/Clover/app/src/main/java/org/floens/chan/core/cache/FileCache.java @@ -25,6 +25,7 @@ import com.squareup.okhttp.Response; import com.squareup.okhttp.ResponseBody; import com.squareup.okhttp.internal.Util; +import org.floens.chan.core.settings.ChanSettings; import org.floens.chan.utils.AndroidUtils; import org.floens.chan.utils.Logger; import org.floens.chan.utils.Time; @@ -35,6 +36,8 @@ import java.io.File; import java.io.FileOutputStream; import java.io.InterruptedIOException; import java.io.OutputStream; +import java.net.InetSocketAddress; +import java.net.Proxy; import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -419,6 +422,15 @@ public class FileCache { .header("User-Agent", userAgent) .build(); + Proxy proxy = null; + if (ChanSettings.proxyEnabled.get()) + { + proxy = new Proxy(Proxy.Type.HTTP, InetSocketAddress.createUnresolved( + ChanSettings.proxyAddress.get(), + ChanSettings.proxyPort.get())); + } + fileCache.httpClient.setProxy(proxy); + call = fileCache.httpClient.newCall(request); Response response = call.execute(); if (!response.isSuccessful()) { diff --git a/Clover/app/src/main/java/org/floens/chan/core/net/ProxiedHurlStack.java b/Clover/app/src/main/java/org/floens/chan/core/net/ProxiedHurlStack.java new file mode 100644 index 00000000..877012ca --- /dev/null +++ b/Clover/app/src/main/java/org/floens/chan/core/net/ProxiedHurlStack.java @@ -0,0 +1,29 @@ +package org.floens.chan.core.net; + +import java.io.IOException; +import java.net.HttpURLConnection; +import java.net.InetSocketAddress; +import java.net.Proxy; +import java.net.URL; +import com.android.volley.toolbox.HurlStack; +import org.floens.chan.core.settings.ChanSettings; + +public class ProxiedHurlStack extends HurlStack { + + public ProxiedHurlStack(String userAgent) { + super(userAgent, null); + } + + @Override + protected HttpURLConnection createConnection(URL url) throws IOException { + // Start the connection by specifying a proxy server + Proxy proxy = null; + if (ChanSettings.proxyEnabled.get()) + { + proxy = new Proxy(Proxy.Type.HTTP, InetSocketAddress.createUnresolved( + ChanSettings.proxyAddress.get(), + ChanSettings.proxyPort.get())); + } + return (HttpURLConnection) url.openConnection(proxy); + } +} \ No newline at end of file diff --git a/Clover/app/src/main/java/org/floens/chan/core/settings/ChanSettings.java b/Clover/app/src/main/java/org/floens/chan/core/settings/ChanSettings.java index 4f6ae8b4..0fe4b500 100644 --- a/Clover/app/src/main/java/org/floens/chan/core/settings/ChanSettings.java +++ b/Clover/app/src/main/java/org/floens/chan/core/settings/ChanSettings.java @@ -94,6 +94,10 @@ public class ChanSettings { public static final StringSetting passPin; public static final StringSetting passId; + public static final BooleanSetting proxyEnabled; + public static final StringSetting proxyAddress; + public static final IntegerSetting proxyPort; + static { SharedPreferences p = AndroidUtils.getPreferences(); @@ -155,6 +159,10 @@ public class ChanSettings { passPin = new StringSetting(p, "preference_pass_pin", ""); passId = new StringSetting(p, "preference_pass_id", ""); + proxyEnabled = new BooleanSetting(p, "preference_proxy_enabled", false); + proxyAddress = new StringSetting(p, "preference_proxy_address", ""); + proxyPort = new IntegerSetting(p, "preference_proxy_port", 80); + // Old (but possibly still in some users phone) // preference_board_view_mode default "list" // preference_board_editor_filler default false diff --git a/Clover/app/src/main/java/org/floens/chan/core/settings/IntegerSetting.java b/Clover/app/src/main/java/org/floens/chan/core/settings/IntegerSetting.java new file mode 100644 index 00000000..19839fd7 --- /dev/null +++ b/Clover/app/src/main/java/org/floens/chan/core/settings/IntegerSetting.java @@ -0,0 +1,39 @@ +package org.floens.chan.core.settings; + +import android.content.SharedPreferences; + +/** + * Created by Zetsubou on 02.07.2015. + */ +public class IntegerSetting extends Setting { + private boolean hasCached = false; + private Integer cached; + + public IntegerSetting(SharedPreferences sharedPreferences, String key, Integer def) { + super(sharedPreferences, key, def); + } + + public IntegerSetting(SharedPreferences sharedPreferences, String key, Integer def, SettingCallback callback) { + super(sharedPreferences, key, def, callback); + } + + @Override + public Integer get() { + if (hasCached) { + return cached; + } else { + cached = sharedPreferences.getInt(key, def); + hasCached = true; + return cached; + } + } + + @Override + public void set(Integer value) { + if (!value.equals(get())) { + sharedPreferences.edit().putInt(key, value).apply(); + cached = value; + onValueChanged(); + } + } +} diff --git a/Clover/app/src/main/java/org/floens/chan/ui/controller/AdvancedSettingsController.java b/Clover/app/src/main/java/org/floens/chan/ui/controller/AdvancedSettingsController.java index a9af23bf..c36063b9 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/controller/AdvancedSettingsController.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/controller/AdvancedSettingsController.java @@ -27,9 +27,11 @@ import org.floens.chan.R; import org.floens.chan.core.settings.ChanSettings; import org.floens.chan.ui.fragment.FolderPickFragment; import org.floens.chan.ui.settings.BooleanSettingView; +import org.floens.chan.ui.settings.IntegerSettingView; import org.floens.chan.ui.settings.LinkSettingView; import org.floens.chan.ui.settings.SettingsController; import org.floens.chan.ui.settings.SettingsGroup; +import org.floens.chan.ui.settings.StringSettingView; import java.io.File; @@ -91,6 +93,12 @@ public class AdvancedSettingsController extends SettingsController { settings.add(new BooleanSettingView(this, ChanSettings.confirmExit, string(R.string.setting_confirm_exit), null)); groups.add(settings); + + SettingsGroup proxy = new SettingsGroup(string(R.string.settings_group_proxy)); + proxy.add(new BooleanSettingView(this, ChanSettings.proxyEnabled, string(R.string.setting_proxy_enabled), null)); + proxy.add(new StringSettingView(this, ChanSettings.proxyAddress, string(R.string.setting_proxy_address), string(R.string.setting_proxy_address))); + proxy.add(new IntegerSettingView(this, ChanSettings.proxyPort, string(R.string.setting_proxy_port), string(R.string.setting_proxy_port))); + groups.add(proxy); } private void setSaveLocationDescription() { diff --git a/Clover/app/src/main/java/org/floens/chan/ui/settings/IntegerSettingView.java b/Clover/app/src/main/java/org/floens/chan/ui/settings/IntegerSettingView.java new file mode 100644 index 00000000..007c83c9 --- /dev/null +++ b/Clover/app/src/main/java/org/floens/chan/ui/settings/IntegerSettingView.java @@ -0,0 +1,74 @@ +package org.floens.chan.ui.settings; + +import android.app.AlertDialog; +import android.content.DialogInterface; +import android.text.InputType; +import android.view.View; +import android.view.WindowManager; +import android.view.inputmethod.EditorInfo; +import android.widget.EditText; +import android.widget.LinearLayout; + +import org.floens.chan.R; +import org.floens.chan.core.settings.Setting; + +import static org.floens.chan.utils.AndroidUtils.dp; + +/** + * Created by Zetsubou on 02.07.2015. + */ +public class IntegerSettingView extends SettingView implements View.OnClickListener { + private final Setting setting; + private final String dialogTitle; + + public IntegerSettingView(SettingsController settingsController, Setting setting, String name, String dialogTitle) { + super(settingsController, name); + this.setting = setting; + this.dialogTitle = dialogTitle; + } + + @Override + public void setView(View view) { + super.setView(view); + view.setOnClickListener(this); + } + + @Override + public String getBottomDescription() { + return setting.get() != null ? setting.get().toString() : null; + } + + @Override + public void onClick(View v) { + LinearLayout container = new LinearLayout(v.getContext()); + container.setPadding(dp(24), dp(8), dp(24), 0); + + final EditText editText = new EditText(v.getContext()); + editText.setImeOptions(EditorInfo.IME_FLAG_NO_FULLSCREEN); + editText.setText(setting.get().toString()); + editText.setInputType(InputType.TYPE_CLASS_NUMBER); + editText.setSingleLine(true); + + container.addView(editText, LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT); + + AlertDialog dialog = new AlertDialog.Builder(v.getContext()) + .setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface d, int which) { + try { + setting.set(Integer.parseInt(editText.getText().toString())); + } catch (Exception e) { + setting.set(setting.getDefault()); + } + + settingsController.onPreferenceChange(IntegerSettingView.this); + } + }) + .setNegativeButton(R.string.cancel, null) + .setTitle(dialogTitle) + .setView(container) + .create(); + dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE); + dialog.show(); + } +} \ No newline at end of file diff --git a/Clover/app/src/main/java/org/floens/chan/ui/settings/SettingsController.java b/Clover/app/src/main/java/org/floens/chan/ui/settings/SettingsController.java index 3b525b2f..1b2ce8d8 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/settings/SettingsController.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/settings/SettingsController.java @@ -65,7 +65,10 @@ public class SettingsController extends Controller implements AndroidUtils.OnMea } public void onPreferenceChange(SettingView item) { - if ((item instanceof ListSettingView) || (item instanceof StringSettingView) || (item instanceof LinkSettingView)) { + if ((item instanceof ListSettingView) + || (item instanceof StringSettingView) + || (item instanceof IntegerSettingView) + || (item instanceof LinkSettingView)) { setDescriptionText(item.view, item.getTopDescription(), item.getBottomDescription()); } } @@ -130,7 +133,11 @@ public class SettingsController extends Controller implements AndroidUtils.OnMea String topValue = settingView.getTopDescription(); String bottomValue = settingView.getBottomDescription(); - if ((settingView instanceof ListSettingView) || (settingView instanceof LinkSettingView) || (settingView instanceof StringSettingView)) { + if ((settingView instanceof ListSettingView) + || (settingView instanceof LinkSettingView) + || (settingView instanceof StringSettingView) + || (settingView instanceof IntegerSettingView) ) + { preferenceView = (ViewGroup) inf.inflate(R.layout.setting_link, groupLayout, false); } else if (settingView instanceof BooleanSettingView) { preferenceView = (ViewGroup) inf.inflate(R.layout.setting_boolean, groupLayout, false); diff --git a/Clover/app/src/main/res/values/strings.xml b/Clover/app/src/main/res/values/strings.xml index 6d8fcc99..517910ea 100644 --- a/Clover/app/src/main/res/values/strings.xml +++ b/Clover/app/src/main/res/values/strings.xml @@ -243,6 +243,11 @@ along with this program. If not, see . Confirm before exit Confirm exit + HTTP Proxy + Enable proxy + Proxy server address + Proxy server port + Watcher settings Watcher settings To watch pins for new posts, turn the thread watcher on. From eea2302b03f0835eb1cad8e4ed22239537d929c6 Mon Sep 17 00:00:00 2001 From: KOSBUM Date: Sun, 12 Jul 2015 16:14:03 +0300 Subject: [PATCH 2/2] url.openConnection exception fix --- .../java/org/floens/chan/core/net/ProxiedHurlStack.java | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/Clover/app/src/main/java/org/floens/chan/core/net/ProxiedHurlStack.java b/Clover/app/src/main/java/org/floens/chan/core/net/ProxiedHurlStack.java index 877012ca..ec63a07f 100644 --- a/Clover/app/src/main/java/org/floens/chan/core/net/ProxiedHurlStack.java +++ b/Clover/app/src/main/java/org/floens/chan/core/net/ProxiedHurlStack.java @@ -17,13 +17,16 @@ public class ProxiedHurlStack extends HurlStack { @Override protected HttpURLConnection createConnection(URL url) throws IOException { // Start the connection by specifying a proxy server - Proxy proxy = null; if (ChanSettings.proxyEnabled.get()) { - proxy = new Proxy(Proxy.Type.HTTP, InetSocketAddress.createUnresolved( + Proxy proxy = new Proxy(Proxy.Type.HTTP, InetSocketAddress.createUnresolved( ChanSettings.proxyAddress.get(), ChanSettings.proxyPort.get())); + return (HttpURLConnection) url.openConnection(proxy); + } + else + { + return (HttpURLConnection) url.openConnection(); } - return (HttpURLConnection) url.openConnection(proxy); } } \ No newline at end of file