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 5d0c3c95..fd2314d7 100644 --- a/Clover/app/src/main/java/org/floens/chan/Chan.java +++ b/Clover/app/src/main/java/org/floens/chan/Chan.java @@ -35,6 +35,7 @@ import org.floens.chan.core.http.ReplyManager; 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.net.ProxiedHurlStack; import org.floens.chan.core.settings.ChanSettings; import org.floens.chan.utils.AndroidUtils; import org.floens.chan.utils.Logger; @@ -150,7 +151,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); final int runtimeMemory = (int) (Runtime.getRuntime().maxMemory() / 1024); final int lruImageCacheSize = runtimeMemory / 8; diff --git a/Clover/app/src/main/java/org/floens/chan/chan/ChanHelper.java b/Clover/app/src/main/java/org/floens/chan/chan/ChanHelper.java index 42087118..e39f7393 100644 --- a/Clover/app/src/main/java/org/floens/chan/chan/ChanHelper.java +++ b/Clover/app/src/main/java/org/floens/chan/chan/ChanHelper.java @@ -1,3 +1,20 @@ +/* + * Clover - 4chan browser https://github.com/Floens/Clover/ + * Copyright (C) 2014 Floens + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.floens.chan.chan; import android.net.Uri; 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..be2ae6e4 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; @@ -419,6 +420,8 @@ public class FileCache { .header("User-Agent", userAgent) .build(); + fileCache.httpClient.setProxy(ChanSettings.getProxy()); + call = fileCache.httpClient.newCall(request); Response response = call.execute(); if (!response.isSuccessful()) { diff --git a/Clover/app/src/main/java/org/floens/chan/core/http/PassHttpCall.java b/Clover/app/src/main/java/org/floens/chan/core/http/PassHttpCall.java index ad6457f7..cbf3fa1c 100644 --- a/Clover/app/src/main/java/org/floens/chan/core/http/PassHttpCall.java +++ b/Clover/app/src/main/java/org/floens/chan/core/http/PassHttpCall.java @@ -1,3 +1,20 @@ +/* + * Clover - 4chan browser https://github.com/Floens/Clover/ + * Copyright (C) 2014 Floens + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.floens.chan.core.http; import com.squareup.okhttp.FormEncodingBuilder; 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..7d57c2e3 --- /dev/null +++ b/Clover/app/src/main/java/org/floens/chan/core/net/ProxiedHurlStack.java @@ -0,0 +1,44 @@ +/* + * Clover - 4chan browser https://github.com/Floens/Clover/ + * Copyright (C) 2014 Floens + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package org.floens.chan.core.net; + +import com.android.volley.toolbox.HurlStack; + +import org.floens.chan.core.settings.ChanSettings; + +import java.io.IOException; +import java.net.HttpURLConnection; +import java.net.Proxy; +import java.net.URL; + +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 = ChanSettings.getProxy(); + if (proxy != null) { + return (HttpURLConnection) url.openConnection(proxy); + } else { + return (HttpURLConnection) url.openConnection(); + } + } +} diff --git a/Clover/app/src/main/java/org/floens/chan/core/presenter/ReplyPresenter.java b/Clover/app/src/main/java/org/floens/chan/core/presenter/ReplyPresenter.java index 8b564a4f..12e25063 100644 --- a/Clover/app/src/main/java/org/floens/chan/core/presenter/ReplyPresenter.java +++ b/Clover/app/src/main/java/org/floens/chan/core/presenter/ReplyPresenter.java @@ -22,6 +22,7 @@ import android.text.TextUtils; import org.floens.chan.Chan; import org.floens.chan.R; import org.floens.chan.chan.ChanUrls; +import org.floens.chan.core.database.DatabaseManager; import org.floens.chan.core.http.ReplyHttpCall; import org.floens.chan.core.http.ReplyManager; import org.floens.chan.core.manager.BoardManager; @@ -32,7 +33,6 @@ import org.floens.chan.core.model.Post; import org.floens.chan.core.model.Reply; import org.floens.chan.core.model.SavedReply; import org.floens.chan.core.settings.ChanSettings; -import org.floens.chan.core.database.DatabaseManager; import org.floens.chan.ui.helper.ImagePickDelegate; import org.floens.chan.ui.layout.CaptchaLayout; 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 9f56d646..adce6c88 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 @@ -28,6 +28,8 @@ import org.floens.chan.ui.cell.PostCellInterface; import org.floens.chan.utils.AndroidUtils; import java.io.File; +import java.net.InetSocketAddress; +import java.net.Proxy; public class ChanSettings { public enum ImageAutoLoadMode { @@ -54,6 +56,8 @@ public class ChanSettings { } } + private static Proxy proxy; + private static final StringSetting theme; public static final StringSetting fontSize; public static final BooleanSetting openLinkConfirmation; @@ -97,6 +101,10 @@ public class ChanSettings { public static final BooleanSetting historyEnabled; + public static final BooleanSetting proxyEnabled; + public static final StringSetting proxyAddress; + public static final IntegerSetting proxyPort; + static { SharedPreferences p = AndroidUtils.getPreferences(); @@ -161,6 +169,26 @@ public class ChanSettings { historyEnabled = new BooleanSetting(p, "preference_history_enabled", true); + proxyEnabled = new BooleanSetting(p, "preference_proxy_enabled", false, new Setting.SettingCallback() { + @Override + public void onValueChange(Setting setting, Boolean value) { + loadProxy(); + } + }); + proxyAddress = new StringSetting(p, "preference_proxy_address", "", new Setting.SettingCallback() { + @Override + public void onValueChange(Setting setting, String value) { + loadProxy(); + } + }); + proxyPort = new IntegerSetting(p, "preference_proxy_port", 80, new Setting.SettingCallback() { + @Override + public void onValueChange(Setting setting, Integer value) { + loadProxy(); + } + }); + loadProxy(); + // Old (but possibly still in some users phone) // preference_board_view_mode default "list" // preference_board_editor_filler default false @@ -194,6 +222,23 @@ public class ChanSettings { } } + /** + * Returns a {@link Proxy} if a proxy is enabled, null otherwise. + * + * @return a proxy or null + */ + public static Proxy getProxy() { + return proxy; + } + + private static void loadProxy() { + if (proxyEnabled.get()) { + proxy = new Proxy(Proxy.Type.HTTP, InetSocketAddress.createUnresolved(proxyAddress.get(), proxyPort.get())); + } else { + proxy = null; + } + } + public static class ThemeColor { public String theme; public String color; 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..72dcb102 --- /dev/null +++ b/Clover/app/src/main/java/org/floens/chan/core/settings/IntegerSetting.java @@ -0,0 +1,56 @@ +/* + * Clover - 4chan browser https://github.com/Floens/Clover/ + * Copyright (C) 2014 Floens + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +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/core/watch/PinWatcher.java b/Clover/app/src/main/java/org/floens/chan/core/watch/PinWatcher.java index 6df7e77c..41e71f33 100644 --- a/Clover/app/src/main/java/org/floens/chan/core/watch/PinWatcher.java +++ b/Clover/app/src/main/java/org/floens/chan/core/watch/PinWatcher.java @@ -21,10 +21,10 @@ import com.android.volley.VolleyError; import org.floens.chan.Chan; import org.floens.chan.chan.ChanLoader; -import org.floens.chan.core.net.LoaderPool; import org.floens.chan.core.model.ChanThread; import org.floens.chan.core.model.Pin; import org.floens.chan.core.model.Post; +import org.floens.chan.core.net.LoaderPool; import org.floens.chan.utils.AndroidUtils; import org.floens.chan.utils.Logger; diff --git a/Clover/app/src/main/java/org/floens/chan/test/TestActivity.java b/Clover/app/src/main/java/org/floens/chan/test/TestActivity.java index 632a8f5b..ecd84569 100644 --- a/Clover/app/src/main/java/org/floens/chan/test/TestActivity.java +++ b/Clover/app/src/main/java/org/floens/chan/test/TestActivity.java @@ -28,13 +28,13 @@ import android.widget.LinearLayout; import com.android.volley.VolleyError; import org.floens.chan.Chan; -import org.floens.chan.core.cache.FileCache; import org.floens.chan.chan.ChanLoader; +import org.floens.chan.core.cache.FileCache; import org.floens.chan.core.model.ChanThread; import org.floens.chan.core.model.Loadable; import org.floens.chan.core.model.Post; -import org.floens.chan.utils.Logger; import org.floens.chan.ui.theme.ThemeHelper; +import org.floens.chan.utils.Logger; import java.io.File; 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 5e81d5b0..d0d5fedf 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; @@ -92,6 +94,12 @@ public class AdvancedSettingsController extends SettingsController { settings.add(new BooleanSettingView(this, ChanSettings.tapNoReply, string(R.string.setting_tap_no_rely), 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/controller/MainSettingsController.java b/Clover/app/src/main/java/org/floens/chan/ui/controller/MainSettingsController.java index c39e3d08..4d01828a 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/controller/MainSettingsController.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/controller/MainSettingsController.java @@ -172,7 +172,7 @@ public class MainSettingsController extends SettingsController implements Toolba List imageAutoLoadTypes = new ArrayList<>(); for (ChanSettings.ImageAutoLoadMode mode : ChanSettings.ImageAutoLoadMode.values()) { String name = ""; - switch(mode) { + switch (mode) { case ALL: name = string(R.string.setting_image_auto_load_all); break; diff --git a/Clover/app/src/main/java/org/floens/chan/ui/controller/ViewThreadController.java b/Clover/app/src/main/java/org/floens/chan/ui/controller/ViewThreadController.java index e6e08f7a..6c8ea6e0 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/controller/ViewThreadController.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/controller/ViewThreadController.java @@ -177,7 +177,7 @@ public class ViewThreadController extends ThreadController implements ThreadLayo break; case UP_ID: case DOWN_ID: - boolean up = ((Integer)item.getId()) == UP_ID; + boolean up = ((Integer) item.getId()) == UP_ID; threadLayout.getPresenter().scrollTo(up ? 0 : -1, false); break; } diff --git a/Clover/app/src/main/java/org/floens/chan/ui/helper/RefreshUIMessage.java b/Clover/app/src/main/java/org/floens/chan/ui/helper/RefreshUIMessage.java index 3c3a6653..809e827c 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/helper/RefreshUIMessage.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/helper/RefreshUIMessage.java @@ -1,3 +1,20 @@ +/* + * Clover - 4chan browser https://github.com/Floens/Clover/ + * Copyright (C) 2014 Floens + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.floens.chan.ui.helper; public class RefreshUIMessage { diff --git a/Clover/app/src/main/java/org/floens/chan/ui/layout/ReplyLayout.java b/Clover/app/src/main/java/org/floens/chan/ui/layout/ReplyLayout.java index 211e5f14..c188efb5 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/layout/ReplyLayout.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/layout/ReplyLayout.java @@ -38,9 +38,9 @@ import org.floens.chan.core.model.Loadable; import org.floens.chan.core.model.Reply; import org.floens.chan.core.presenter.ReplyPresenter; import org.floens.chan.core.settings.ChanSettings; -import org.floens.chan.ui.helper.ImagePickDelegate; import org.floens.chan.ui.activity.StartActivity; import org.floens.chan.ui.drawable.DropdownArrowDrawable; +import org.floens.chan.ui.helper.ImagePickDelegate; import org.floens.chan.ui.theme.ThemeHelper; import org.floens.chan.ui.view.LoadView; import org.floens.chan.ui.view.SelectionListeningEditText; 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..c4b53ecb --- /dev/null +++ b/Clover/app/src/main/java/org/floens/chan/ui/settings/IntegerSettingView.java @@ -0,0 +1,91 @@ +/* + * Clover - 4chan browser https://github.com/Floens/Clover/ + * Copyright (C) 2014 Floens + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +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 f8a55926..1e8f31d3 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,10 @@ 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/java/org/floens/chan/ui/state/ChanState.java b/Clover/app/src/main/java/org/floens/chan/ui/state/ChanState.java index ee2f412a..bb8b90e4 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/state/ChanState.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/state/ChanState.java @@ -1,3 +1,20 @@ +/* + * Clover - 4chan browser https://github.com/Floens/Clover/ + * Copyright (C) 2014 Floens + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.floens.chan.ui.state; import android.os.Parcel; diff --git a/Clover/app/src/main/java/org/floens/chan/ui/theme/DarkTheme.java b/Clover/app/src/main/java/org/floens/chan/ui/theme/DarkTheme.java index 9ece2259..8591fb69 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/theme/DarkTheme.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/theme/DarkTheme.java @@ -1,3 +1,20 @@ +/* + * Clover - 4chan browser https://github.com/Floens/Clover/ + * Copyright (C) 2014 Floens + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.floens.chan.ui.theme; import org.floens.chan.R; diff --git a/Clover/app/src/main/res/values/strings.xml b/Clover/app/src/main/res/values/strings.xml index e1c9c0a0..daf7b57f 100644 --- a/Clover/app/src/main/res/values/strings.xml +++ b/Clover/app/src/main/res/values/strings.xml @@ -310,6 +310,11 @@ If the pattern matches then the post can be hidden or highlighted.<br> Confirm exit Tap the post number to reply + 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.