From 145a9099a926f105d3257324d5018a10f10a67f7 Mon Sep 17 00:00:00 2001 From: Floens Date: Thu, 11 Jan 2018 20:03:43 +0100 Subject: [PATCH] reorganize settings organized all settings we have into different sections. the advanced settings screen is not gone. the strings have also been organized. removed the https setting (it was already always https since the site reorganisation). --- .../core/database/DatabaseFilterManager.java | 4 + .../core/database/DatabaseSiteManager.java | 4 + .../core/presenter/SettingsPresenter.java | 61 +++ .../chan/core/settings/ChanSettings.java | 6 +- .../chan/ui/activity/StartActivity.java | 2 +- .../AdvancedSettingsController.java | 116 ----- .../AppearanceSettingsController.java | 169 ++++++++ .../BehaviourSettingsController.java | 170 ++++++++ .../ui/controller/MainSettingsController.java | 409 +++++------------- .../controller/MediaSettingsController.java | 194 +++++++++ .../ui/controller/SiteSetupController.java | 2 +- .../controller/WatchSettingsController.java | 8 - .../chan/ui/settings/SettingsController.java | 34 +- Clover/app/src/main/res/values/strings.xml | 252 ++++++----- 14 files changed, 908 insertions(+), 523 deletions(-) create mode 100644 Clover/app/src/main/java/org/floens/chan/core/presenter/SettingsPresenter.java delete mode 100644 Clover/app/src/main/java/org/floens/chan/ui/controller/AdvancedSettingsController.java create mode 100644 Clover/app/src/main/java/org/floens/chan/ui/controller/AppearanceSettingsController.java create mode 100644 Clover/app/src/main/java/org/floens/chan/ui/controller/BehaviourSettingsController.java create mode 100644 Clover/app/src/main/java/org/floens/chan/ui/controller/MediaSettingsController.java diff --git a/Clover/app/src/main/java/org/floens/chan/core/database/DatabaseFilterManager.java b/Clover/app/src/main/java/org/floens/chan/core/database/DatabaseFilterManager.java index 93dbc6c8..9e33886e 100644 --- a/Clover/app/src/main/java/org/floens/chan/core/database/DatabaseFilterManager.java +++ b/Clover/app/src/main/java/org/floens/chan/core/database/DatabaseFilterManager.java @@ -71,4 +71,8 @@ public class DatabaseFilterManager { } }; } + + public Callable getCount() { + return () -> helper.filterDao.countOf(); + } } diff --git a/Clover/app/src/main/java/org/floens/chan/core/database/DatabaseSiteManager.java b/Clover/app/src/main/java/org/floens/chan/core/database/DatabaseSiteManager.java index d84f5e2c..a9a4452a 100644 --- a/Clover/app/src/main/java/org/floens/chan/core/database/DatabaseSiteManager.java +++ b/Clover/app/src/main/java/org/floens/chan/core/database/DatabaseSiteManager.java @@ -41,6 +41,10 @@ public class DatabaseSiteManager { }; } + public Callable getCount() { + return () -> helper.siteDao.countOf(); + } + public Callable add(final SiteModel site) { return new Callable() { @Override diff --git a/Clover/app/src/main/java/org/floens/chan/core/presenter/SettingsPresenter.java b/Clover/app/src/main/java/org/floens/chan/core/presenter/SettingsPresenter.java new file mode 100644 index 00000000..cf266d3e --- /dev/null +++ b/Clover/app/src/main/java/org/floens/chan/core/presenter/SettingsPresenter.java @@ -0,0 +1,61 @@ +/* + * 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.presenter; + +import org.floens.chan.core.database.DatabaseManager; +import org.floens.chan.core.settings.ChanSettings; + +import javax.inject.Inject; + +public class SettingsPresenter { + private Callback callback; + + private DatabaseManager databaseManager; + + @Inject + public SettingsPresenter(DatabaseManager databaseManager) { + this.databaseManager = databaseManager; + } + + public void create(Callback callback) { + this.callback = callback; + } + + public void destroy() { + + } + + public void show() { + long siteCount = databaseManager.runTask( + databaseManager.getDatabaseSiteManager().getCount()); + long filterCount = databaseManager.runTask( + databaseManager.getDatabaseFilterManager().getCount()); + + callback.setSiteCount((int) siteCount); + callback.setFiltersCount((int) filterCount); + callback.setWatchEnabled(ChanSettings.watchEnabled.get()); + } + + public interface Callback { + void setSiteCount(int count); + + void setFiltersCount(int count); + + void setWatchEnabled(boolean enabled); + } +} 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 b1b07a03..0f6c6849 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 @@ -115,7 +115,6 @@ public class ChanSettings { public static final StringSetting saveLocation; public static final BooleanSetting saveOriginalFilename; public static final BooleanSetting shareUrl; - public static final BooleanSetting networkHttps; public static final BooleanSetting enableReplyFab; public static final BooleanSetting anonymize; public static final BooleanSetting anonymizeIds; @@ -150,7 +149,6 @@ public class ChanSettings { public static final StringSetting proxyAddress; public static final IntegerSetting proxyPort; - public static final CounterSetting settingsOpenCounter; public static final CounterSetting historyOpenCounter; public static final CounterSetting replyOpenCounter; public static final CounterSetting threadOpenCounter; @@ -192,7 +190,6 @@ public class ChanSettings { EventBus.getDefault().post(new SettingChanged<>(saveLocation))); saveOriginalFilename = new BooleanSetting(p, "preference_image_save_original", false); shareUrl = new BooleanSetting(p, "preference_image_share_url", false); - networkHttps = new BooleanSetting(p, "preference_network_https", true); enableReplyFab = new BooleanSetting(p, "preference_enable_reply_fab", true); anonymize = new BooleanSetting(p, "preference_anonymize", false); anonymizeIds = new BooleanSetting(p, "preference_anonymize_ids", false); @@ -236,7 +233,6 @@ public class ChanSettings { proxyPort.addCallback((setting, value) -> loadProxy()); loadProxy(); - settingsOpenCounter = new CounterSetting(p, "counter_settings_open"); historyOpenCounter = new CounterSetting(p, "counter_history_open"); replyOpenCounter = new CounterSetting(p, "counter_reply_open"); threadOpenCounter = new CounterSetting(p, "counter_thread_open"); @@ -250,6 +246,8 @@ public class ChanSettings { // preference_pass_enabled default false // preference_autoplay false // preference_watch_background_timeout "60" the old timeout background setting in minutes + // preference_network_https true + // counter_settings_open } public static ThemeColor getThemeAndColor() { diff --git a/Clover/app/src/main/java/org/floens/chan/ui/activity/StartActivity.java b/Clover/app/src/main/java/org/floens/chan/ui/activity/StartActivity.java index 6ebd4a9d..241615bf 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/activity/StartActivity.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/activity/StartActivity.java @@ -433,7 +433,7 @@ public class StartActivity extends AppCompatActivity implements NfcAdapter.Creat if (!stackTop().onBack()) { if (ChanSettings.confirmExit.get()) { new AlertDialog.Builder(this) - .setTitle(R.string.setting_confirm_exit_title) + .setTitle(R.string.action_confirm_exit_title) .setNegativeButton(R.string.cancel, null) .setPositiveButton(R.string.exit, new DialogInterface.OnClickListener() { @Override 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 deleted file mode 100644 index d2fa8ecb..00000000 --- a/Clover/app/src/main/java/org/floens/chan/ui/controller/AdvancedSettingsController.java +++ /dev/null @@ -1,116 +0,0 @@ -/* - * 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.controller; - -import android.content.Context; -import android.widget.LinearLayout; - -import org.floens.chan.R; -import org.floens.chan.core.settings.ChanSettings; -import org.floens.chan.ui.activity.StartActivity; -import org.floens.chan.ui.helper.RefreshUIMessage; -import org.floens.chan.ui.settings.BooleanSettingView; -import org.floens.chan.ui.settings.IntegerSettingView; -import org.floens.chan.ui.settings.SettingView; -import org.floens.chan.ui.settings.SettingsController; -import org.floens.chan.ui.settings.SettingsGroup; -import org.floens.chan.ui.settings.StringSettingView; - -import de.greenrobot.event.EventBus; - -public class AdvancedSettingsController extends SettingsController { - private static final String TAG = "AdvancedSettingsController"; - - private boolean needRestart; - private SettingView newCaptcha; - private SettingView enableReplyFab; - private SettingView neverHideToolbar; - private SettingView controllersSwipeable; - - public AdvancedSettingsController(Context context) { - super(context); - } - - @Override - public void onCreate() { - super.onCreate(); - - navigation.setTitle(R.string.settings_screen_advanced); - - view = inflateRes(R.layout.settings_layout); - content = view.findViewById(R.id.scrollview_content); - - populatePreferences(); - - buildPreferences(); - - ChanSettings.settingsOpenCounter.set(5); - } - - @Override - public void onDestroy() { - super.onDestroy(); - - if (needRestart) { - ((StartActivity) context).restart(); - } - } - - @Override - public void onPreferenceChange(SettingView item) { - super.onPreferenceChange(item); - - if (item == enableReplyFab || item == newCaptcha || item == neverHideToolbar || item == controllersSwipeable) { - needRestart = true; - } else { - EventBus.getDefault().post(new RefreshUIMessage("postui")); - } - } - - private void populatePreferences() { - SettingsGroup settings = new SettingsGroup(R.string.settings_group_advanced); - - newCaptcha = settings.add(new BooleanSettingView(this, ChanSettings.postNewCaptcha, R.string.setting_use_new_captcha, R.string.setting_use_new_captcha_description)); - settings.add(new BooleanSettingView(this, ChanSettings.saveOriginalFilename, R.string.setting_save_original_filename, 0)); - controllersSwipeable = settings.add(new BooleanSettingView(this, ChanSettings.controllerSwipeable, R.string.setting_controller_swipeable, 0)); - settings.add(new BooleanSettingView(this, ChanSettings.shareUrl, R.string.setting_share_url, R.string.setting_share_url_description)); - settings.add(new BooleanSettingView(this, ChanSettings.networkHttps, R.string.setting_network_https, R.string.setting_network_https_description)); - enableReplyFab = settings.add(new BooleanSettingView(this, ChanSettings.enableReplyFab, R.string.setting_enable_reply_fab, R.string.setting_enable_reply_fab_description)); - settings.add(new BooleanSettingView(this, ChanSettings.anonymize, R.string.setting_anonymize, 0)); - settings.add(new BooleanSettingView(this, ChanSettings.anonymizeIds, R.string.setting_anonymize_ids, 0)); - settings.add(new BooleanSettingView(this, ChanSettings.showAnonymousName, R.string.setting_show_anonymous_name, 0)); - settings.add(new BooleanSettingView(this, ChanSettings.revealImageSpoilers, R.string.settings_reveal_image_spoilers, 0)); - settings.add(new BooleanSettingView(this, ChanSettings.revealTextSpoilers, R.string.settings_reveal_text_spoilers, R.string.settings_reveal_text_spoilers_description)); - settings.add(new BooleanSettingView(this, ChanSettings.repliesButtonsBottom, R.string.setting_buttons_bottom, 0)); - settings.add(new BooleanSettingView(this, ChanSettings.confirmExit, R.string.setting_confirm_exit, 0)); - settings.add(new BooleanSettingView(this, ChanSettings.tapNoReply, R.string.setting_tap_no_rely, 0)); - settings.add(new BooleanSettingView(this, ChanSettings.volumeKeysScrolling, R.string.setting_volume_key_scrolling, 0)); - settings.add(new BooleanSettingView(this, ChanSettings.postFullDate, R.string.setting_post_full_date, 0)); - settings.add(new BooleanSettingView(this, ChanSettings.postFileInfo, R.string.setting_post_file_info, 0)); - settings.add(new BooleanSettingView(this, ChanSettings.postFilename, R.string.setting_post_filename, 0)); - neverHideToolbar = settings.add(new BooleanSettingView(this, ChanSettings.neverHideToolbar, R.string.setting_never_hide_toolbar, 0)); - - groups.add(settings); - - SettingsGroup proxy = new SettingsGroup(R.string.settings_group_proxy); - proxy.add(new BooleanSettingView(this, ChanSettings.proxyEnabled, R.string.setting_proxy_enabled, 0)); - proxy.add(new StringSettingView(this, ChanSettings.proxyAddress, R.string.setting_proxy_address, R.string.setting_proxy_address)); - proxy.add(new IntegerSettingView(this, ChanSettings.proxyPort, R.string.setting_proxy_port, R.string.setting_proxy_port)); - groups.add(proxy); - } -} diff --git a/Clover/app/src/main/java/org/floens/chan/ui/controller/AppearanceSettingsController.java b/Clover/app/src/main/java/org/floens/chan/ui/controller/AppearanceSettingsController.java new file mode 100644 index 00000000..296c67f4 --- /dev/null +++ b/Clover/app/src/main/java/org/floens/chan/ui/controller/AppearanceSettingsController.java @@ -0,0 +1,169 @@ +/* + * 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.controller; + +import android.content.Context; + +import org.floens.chan.R; +import org.floens.chan.core.settings.ChanSettings; +import org.floens.chan.ui.settings.BooleanSettingView; +import org.floens.chan.ui.settings.LinkSettingView; +import org.floens.chan.ui.settings.ListSettingView; +import org.floens.chan.ui.settings.SettingsController; +import org.floens.chan.ui.settings.SettingsGroup; + +import java.util.ArrayList; +import java.util.List; + +import static org.floens.chan.ui.theme.ThemeHelper.theme; +import static org.floens.chan.utils.AndroidUtils.getString; + +public class AppearanceSettingsController extends SettingsController { + public AppearanceSettingsController(Context context) { + super(context); + } + + @Override + public void onCreate() { + super.onCreate(); + + navigation.setTitle(R.string.settings_screen_appearance); + + setupLayout(); + + populatePreferences(); + + buildPreferences(); + } + + private void populatePreferences() { + // Appearance group + { + SettingsGroup appearance = new SettingsGroup(R.string.settings_group_appearance); + + appearance.add(new LinkSettingView(this, + getString(R.string.setting_theme), theme().displayName, + v -> navigationController.pushController( + new ThemeSettingsController(context)))); + + groups.add(appearance); + } + + // Layout group + { + SettingsGroup layout = new SettingsGroup(R.string.settings_group_layout); + + setupLayoutModeSetting(layout); + + setupGridColumnsSetting(layout); + + requiresRestart.add(layout.add(new BooleanSettingView(this, + ChanSettings.neverHideToolbar, + R.string.setting_never_hide_toolbar, 0))); + + requiresRestart.add(layout.add(new BooleanSettingView(this, + ChanSettings.enableReplyFab, + R.string.setting_enable_reply_fab, + R.string.setting_enable_reply_fab_description))); + + groups.add(layout); + } + + // Post group + { + SettingsGroup post = new SettingsGroup(R.string.settings_group_post); + + setupFontSizeSetting(post); + + requiresUiRefresh.add(post.add(new BooleanSettingView(this, + ChanSettings.fontCondensed, + R.string.setting_font_condensed, + R.string.setting_font_condensed_description))); + + requiresUiRefresh.add(post.add(new BooleanSettingView(this, + ChanSettings.postFullDate, + R.string.setting_post_full_date, 0))); + + requiresUiRefresh.add(post.add(new BooleanSettingView(this, + ChanSettings.postFileInfo, + R.string.setting_post_file_info, 0))); + + requiresUiRefresh.add(post.add(new BooleanSettingView(this, + ChanSettings.postFilename, + R.string.setting_post_filename, 0))); + + groups.add(post); + } + } + + private void setupLayoutModeSetting(SettingsGroup layout) { + List layoutModes = new ArrayList<>(); + for (ChanSettings.LayoutMode mode : ChanSettings.LayoutMode.values()) { + int name = 0; + switch (mode) { + case AUTO: + name = R.string.setting_layout_mode_auto; + break; + case PHONE: + name = R.string.setting_layout_mode_phone; + break; + case SLIDE: + name = R.string.setting_layout_mode_slide; + break; + case SPLIT: + name = R.string.setting_layout_mode_split; + break; + } + layoutModes.add(new ListSettingView.Item<>(getString(name), mode)); + } + + requiresRestart.add(layout.add(new ListSettingView<>(this, + ChanSettings.layoutMode, + R.string.setting_layout_mode, layoutModes))); + } + + private void setupGridColumnsSetting(SettingsGroup layout) { + List gridColumns = new ArrayList<>(); + gridColumns.add(new ListSettingView.Item<>( + getString(R.string.setting_board_grid_span_count_default), 0)); + for (int columns = 2; columns <= 5; columns++) { + gridColumns.add(new ListSettingView.Item<>( + context.getString(R.string.setting_board_grid_span_count_item, columns), + columns)); + } + requiresUiRefresh.add(layout.add(new ListSettingView<>(this, + ChanSettings.boardGridSpanCount, + R.string.setting_board_grid_span_count, gridColumns))); + } + + private void setupFontSizeSetting(SettingsGroup post) { + List fontSizes = new ArrayList<>(); + for (int size = 10; size <= 19; size++) { + String name = size + (String.valueOf(size) + .equals(ChanSettings.fontSize.getDefault()) ? + " " + getString(R.string.setting_font_size_default) : + ""); + fontSizes.add(new ListSettingView.Item<>(name, String.valueOf(size))); + } + + requiresUiRefresh.add(post.add(new ListSettingView<>(this, + ChanSettings.fontSize, + R.string.setting_font_size, + fontSizes.toArray(new ListSettingView.Item[fontSizes.size()])))); + } +} diff --git a/Clover/app/src/main/java/org/floens/chan/ui/controller/BehaviourSettingsController.java b/Clover/app/src/main/java/org/floens/chan/ui/controller/BehaviourSettingsController.java new file mode 100644 index 00000000..7151649a --- /dev/null +++ b/Clover/app/src/main/java/org/floens/chan/ui/controller/BehaviourSettingsController.java @@ -0,0 +1,170 @@ +/* + * 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.controller; + +import android.content.Context; +import android.view.View; +import android.widget.Toast; + +import org.floens.chan.R; +import org.floens.chan.core.database.DatabaseManager; +import org.floens.chan.core.settings.ChanSettings; +import org.floens.chan.ui.helper.RefreshUIMessage; +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 de.greenrobot.event.EventBus; + +import static org.floens.chan.Chan.injector; + +public class BehaviourSettingsController extends SettingsController { + public BehaviourSettingsController(Context context) { + super(context); + } + + @Override + public void onCreate() { + super.onCreate(); + + navigation.setTitle(R.string.settings_screen_behaviour); + + setupLayout(); + + populatePreferences(); + + buildPreferences(); + } + + private void populatePreferences() { + // General group + { + SettingsGroup general = new SettingsGroup(R.string.settings_group_general); + + general.add(new BooleanSettingView(this, + ChanSettings.autoRefreshThread, + R.string.setting_auto_refresh_thread, 0)); + + general.add(new BooleanSettingView(this, ChanSettings.confirmExit, + R.string.setting_confirm_exit, 0)); + + requiresRestart.add(general.add(new BooleanSettingView(this, + ChanSettings.controllerSwipeable, + R.string.setting_controller_swipeable, 0))); + + setupClearThreadHidesSetting(general); + + groups.add(general); + } + + // Reply group + { + SettingsGroup reply = new SettingsGroup(R.string.settings_group_reply); + + reply.add(new BooleanSettingView(this, + ChanSettings.postNewCaptcha, + R.string.setting_use_new_captcha, + R.string.setting_use_new_captcha_description)); + + reply.add(new BooleanSettingView(this, ChanSettings.postPinThread, + R.string.setting_post_pin, 0)); + + reply.add(new StringSettingView(this, ChanSettings.postDefaultName, + R.string.setting_post_default_name, R.string.setting_post_default_name)); + + groups.add(reply); + } + + // Post group + { + SettingsGroup post = new SettingsGroup(R.string.settings_group_post); + + requiresUiRefresh.add(post.add(new BooleanSettingView(this, + ChanSettings.textOnly, + R.string.setting_text_only, R.string.setting_text_only_description))); + + requiresUiRefresh.add(post.add(new BooleanSettingView(this, + ChanSettings.revealTextSpoilers, + R.string.settings_reveal_text_spoilers, + R.string.settings_reveal_text_spoilers_description))); + + requiresUiRefresh.add(post.add(new BooleanSettingView(this, + ChanSettings.anonymize, + R.string.setting_anonymize, 0))); + + requiresUiRefresh.add(post.add(new BooleanSettingView(this, + ChanSettings.anonymizeIds, + R.string.setting_anonymize_ids, 0))); + + requiresUiRefresh.add(post.add(new BooleanSettingView(this, + ChanSettings.showAnonymousName, + R.string.setting_show_anonymous_name, 0))); + + post.add(new BooleanSettingView(this, + ChanSettings.repliesButtonsBottom, + R.string.setting_buttons_bottom, 0)); + + post.add(new BooleanSettingView(this, + ChanSettings.volumeKeysScrolling, + R.string.setting_volume_key_scrolling, 0)); + + post.add(new BooleanSettingView(this, + ChanSettings.tapNoReply, + R.string.setting_tap_no_rely, 0)); + + post.add(new BooleanSettingView(this, + ChanSettings.openLinkConfirmation, + R.string.setting_open_link_confirmation, 0)); + + groups.add(post); + } + + // Proxy group + { + SettingsGroup proxy = new SettingsGroup(R.string.settings_group_proxy); + + proxy.add(new BooleanSettingView(this, ChanSettings.proxyEnabled, + R.string.setting_proxy_enabled, 0)); + + proxy.add(new StringSettingView(this, ChanSettings.proxyAddress, + R.string.setting_proxy_address, R.string.setting_proxy_address)); + + proxy.add(new IntegerSettingView(this, ChanSettings.proxyPort, + R.string.setting_proxy_port, R.string.setting_proxy_port)); + + groups.add(proxy); + } + } + + private void setupClearThreadHidesSetting(SettingsGroup post) { + post.add(new LinkSettingView(this, R.string.setting_clear_thread_hides, 0, new View.OnClickListener() { + @Override + public void onClick(View v) { + // TODO: don't do this here. + DatabaseManager databaseManager = injector().instance(DatabaseManager.class); + databaseManager.clearAllThreadHides(); + Toast.makeText(context, R.string.setting_cleared_thread_hides, Toast.LENGTH_LONG) + .show(); + EventBus.getDefault().post(new RefreshUIMessage("clearhides")); + } + })); + } +} 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 b4ea505c..e2bc0dda 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 @@ -23,61 +23,32 @@ import android.content.pm.PackageManager; import android.net.Uri; import android.text.TextUtils; import android.view.View; -import android.widget.ImageView; import android.widget.Toast; import org.floens.chan.R; -import org.floens.chan.core.database.DatabaseManager; +import org.floens.chan.core.presenter.SettingsPresenter; import org.floens.chan.core.settings.ChanSettings; import org.floens.chan.ui.activity.StartActivity; -import org.floens.chan.ui.helper.HintPopup; -import org.floens.chan.ui.helper.RefreshUIMessage; -import org.floens.chan.ui.settings.BooleanSettingView; import org.floens.chan.ui.settings.LinkSettingView; -import org.floens.chan.ui.settings.ListSettingView; import org.floens.chan.ui.settings.SettingView; import org.floens.chan.ui.settings.SettingsController; import org.floens.chan.ui.settings.SettingsGroup; -import org.floens.chan.ui.settings.StringSettingView; -import org.floens.chan.ui.toolbar.ToolbarMenu; -import org.floens.chan.ui.toolbar.ToolbarMenuItem; -import org.floens.chan.ui.view.FloatingMenuItem; import org.floens.chan.utils.AndroidUtils; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - import javax.inject.Inject; -import de.greenrobot.event.EventBus; - import static org.floens.chan.Chan.inject; -import static org.floens.chan.ui.theme.ThemeHelper.theme; import static org.floens.chan.utils.AndroidUtils.getString; -public class MainSettingsController extends SettingsController implements ToolbarMenuItem.ToolbarMenuItemCallback, WatchSettingsController.WatchSettingControllerListener { - private static final int ADVANCED_SETTINGS = 1; - private ListSettingView imageAutoLoadView; - private ListSettingView videoAutoLoadView; +public class MainSettingsController extends SettingsController implements SettingsPresenter.Callback { + @Inject + private SettingsPresenter presenter; - private LinkSettingView saveLocation; private LinkSettingView watchLink; private int clickCount; private SettingView developerView; - private SettingView fontView; - private SettingView layoutModeView; - private SettingView fontCondensed; - private SettingView textOnly; - private SettingView gridColumnsView; - private ToolbarMenuItem overflow; - - private ChanSettings.LayoutMode previousLayoutMode; - - private HintPopup advancedSettingsHint; - - @Inject - DatabaseManager databaseManager; + private LinkSettingView sitesSetting; + private LinkSettingView filtersSetting; public MainSettingsController(Context context) { super(context); @@ -88,263 +59,128 @@ public class MainSettingsController extends SettingsController implements Toolba super.onCreate(); inject(this); - EventBus.getDefault().register(this); - navigation.setTitle(R.string.settings_screen); - navigation.menu = new ToolbarMenu(context); - overflow = navigation.createOverflow(context, this, Collections.singletonList( - new FloatingMenuItem(ADVANCED_SETTINGS, R.string.settings_screen_advanced) - )); - view = inflateRes(R.layout.settings_layout); - content = view.findViewById(R.id.scrollview_content); - - previousLayoutMode = ChanSettings.layoutMode.get(); + setupLayout(); populatePreferences(); - onWatchEnabledChanged(ChanSettings.watchEnabled.get()); - buildPreferences(); - onPreferenceChange(imageAutoLoadView); - if (!ChanSettings.developer.get()) { developerView.view.setVisibility(View.GONE); } - if (ChanSettings.settingsOpenCounter.increase() == 3) { - ImageView view = overflow.getView(); - view.startAnimation(android.view.animation.AnimationUtils.loadAnimation(context, R.anim.menu_overflow_shake)); - advancedSettingsHint = HintPopup.show(context, view, R.string.settings_advanced_hint); - } - } - - @Override - public void onHide() { - super.onHide(); - - if (advancedSettingsHint != null) { - advancedSettingsHint.dismiss(); - advancedSettingsHint = null; - } + presenter.create(this); } @Override public void onDestroy() { super.onDestroy(); - EventBus.getDefault().unregister(this); - - if (previousLayoutMode != ChanSettings.layoutMode.get()) { - ((StartActivity) context).restart(); - } - } - - public void onEvent(ChanSettings.SettingChanged setting) { - if (setting.setting == ChanSettings.saveLocation) { - setSaveLocationDescription(); - } + presenter.destroy(); } @Override - public void onMenuItemClicked(ToolbarMenuItem item) { + public void onShow() { + super.onShow(); + + presenter.show(); } @Override - public void onSubMenuItemClicked(ToolbarMenuItem parent, FloatingMenuItem item) { - if (((Integer) item.getId()) == ADVANCED_SETTINGS) { - navigationController.pushController(new AdvancedSettingsController(context)); - } + public void setFiltersCount(int count) { + String filters = context.getResources().getQuantityString(R.plurals.filter, count, count); + filtersSetting.setDescription(filters); } @Override - public void onPreferenceChange(SettingView item) { - super.onPreferenceChange(item); - - if (item == imageAutoLoadView) { - updateVideoLoadModes(); - } else if (item == fontView || item == fontCondensed) { - EventBus.getDefault().post(new RefreshUIMessage("font")); - } else if (item == gridColumnsView) { - EventBus.getDefault().post(new RefreshUIMessage("gridcolumns")); - } else if (item == textOnly) { - EventBus.getDefault().post(new RefreshUIMessage("textonly")); - } + public void setSiteCount(int count) { + String sites = context.getResources().getQuantityString(R.plurals.site, count, count); + sitesSetting.setDescription(sites); } @Override - public void onWatchEnabledChanged(boolean enabled) { - watchLink.setDescription(enabled ? R.string.setting_watch_summary_enabled : R.string.setting_watch_summary_disabled); + public void setWatchEnabled(boolean enabled) { + watchLink.setDescription(enabled ? + R.string.setting_watch_summary_enabled : R.string.setting_watch_summary_disabled); } private void populatePreferences() { // General group - SettingsGroup general = new SettingsGroup(R.string.settings_group_general); - - watchLink = (LinkSettingView) general.add(new LinkSettingView(this, R.string.settings_watch, 0, new View.OnClickListener() { - @Override - public void onClick(View v) { - navigationController.pushController(new WatchSettingsController(context)); - } - })); - - groups.add(general); - - SettingsGroup appearance = new SettingsGroup(R.string.settings_group_appearance); - - appearance.add(new LinkSettingView(this, getString(R.string.settings_screen_theme), theme().displayName, new View.OnClickListener() { - @Override - public void onClick(View v) { - navigationController.pushController(new ThemeSettingsController(context)); - } - })); - - List layoutModes = new ArrayList<>(); - for (ChanSettings.LayoutMode mode : ChanSettings.LayoutMode.values()) { - int name = 0; - switch (mode) { - case AUTO: - name = R.string.setting_layout_mode_auto; - break; - case PHONE: - name = R.string.setting_layout_mode_phone; - break; - case SLIDE: - name = R.string.setting_layout_mode_slide; - break; - case SPLIT: - name = R.string.setting_layout_mode_split; - break; - } - layoutModes.add(new ListSettingView.Item<>(getString(name), mode)); - } - - layoutModeView = new ListSettingView<>(this, ChanSettings.layoutMode, R.string.setting_layout_mode, layoutModes); - appearance.add(layoutModeView); - - List fontSizes = new ArrayList<>(); - for (int size = 10; size <= 19; size++) { - String name = size + (String.valueOf(size).equals(ChanSettings.fontSize.getDefault()) ? " " + getString(R.string.setting_font_size_default) : ""); - fontSizes.add(new ListSettingView.Item<>(name, String.valueOf(size))); + { + SettingsGroup general = new SettingsGroup(R.string.settings_group_settings); + + watchLink = (LinkSettingView) general.add(new LinkSettingView(this, + R.string.settings_watch, 0, + v -> navigationController.pushController( + new WatchSettingsController(context)))); + + sitesSetting = (LinkSettingView) general.add(new LinkSettingView(this, + R.string.settings_sites, 0, + v -> navigationController.pushController( + new SitesSetupController(context)))); + + general.add(new LinkSettingView(this, + R.string.settings_appearance, R.string.settings_appearance_description, + v -> navigationController.pushController( + new AppearanceSettingsController(context)))); + + general.add(new LinkSettingView(this, + R.string.settings_behaviour, R.string.settings_behaviour_description, + v -> navigationController.pushController( + new BehaviourSettingsController(context)))); + + general.add(new LinkSettingView(this, + R.string.settings_media, R.string.settings_media_description, + v -> navigationController.pushController( + new MediaSettingsController(context)))); + + filtersSetting = (LinkSettingView) general.add(new LinkSettingView(this, + R.string.settings_filters, 0, + v -> navigationController.pushController(new FiltersController(context)))); + + groups.add(general); } - fontView = appearance.add(new ListSettingView<>(this, ChanSettings.fontSize, R.string.setting_font_size, fontSizes.toArray(new ListSettingView.Item[fontSizes.size()]))); - fontCondensed = appearance.add(new BooleanSettingView(this, ChanSettings.fontCondensed, R.string.setting_font_condensed, R.string.setting_font_condensed_description)); - - List gridColumns = new ArrayList<>(); - gridColumns.add(new ListSettingView.Item<>(getString(R.string.setting_board_grid_span_count_default), 0)); - for (int columns = 2; columns <= 5; columns++) { - gridColumns.add(new ListSettingView.Item<>(context.getString(R.string.setting_board_grid_span_count_item, columns), columns)); - } - gridColumnsView = appearance.add(new ListSettingView<>(this, ChanSettings.boardGridSpanCount, R.string.setting_board_grid_span_count, gridColumns)); - - groups.add(appearance); - - // Browsing group - SettingsGroup browsing = new SettingsGroup(R.string.settings_group_browsing); - - browsing.add(new LinkSettingView(this, R.string.filters_screen, 0, new View.OnClickListener() { - @Override - public void onClick(View v) { - navigationController.pushController(new FiltersController(context)); - } - })); - saveLocation = (LinkSettingView) browsing.add(new LinkSettingView(this, R.string.save_location_screen, 0, new View.OnClickListener() { - @Override - public void onClick(View v) { - navigationController.pushController(new SaveLocationController(context)); - } - })); - setSaveLocationDescription(); - browsing.add(new BooleanSettingView(this, ChanSettings.saveBoardFolder, R.string.setting_save_board_folder, R.string.setting_save_board_folder_description)); - browsing.add(new BooleanSettingView(this, ChanSettings.openLinkConfirmation, R.string.setting_open_link_confirmation, 0)); - browsing.add(new BooleanSettingView(this, ChanSettings.autoRefreshThread, R.string.setting_auto_refresh_thread, 0)); - - List imageAutoLoadTypes = new ArrayList<>(); - List videoAutoLoadTypes = new ArrayList<>(); - for (ChanSettings.MediaAutoLoadMode mode : ChanSettings.MediaAutoLoadMode.values()) { - int name = 0; - switch (mode) { - case ALL: - name = R.string.setting_image_auto_load_all; - break; - case WIFI: - name = R.string.setting_image_auto_load_wifi; - break; - case NONE: - name = R.string.setting_image_auto_load_none; - break; - } - - imageAutoLoadTypes.add(new ListSettingView.Item<>(getString(name), mode)); - videoAutoLoadTypes.add(new ListSettingView.Item<>(getString(name), mode)); - } - - imageAutoLoadView = new ListSettingView<>(this, ChanSettings.imageAutoLoadNetwork, R.string.setting_image_auto_load, imageAutoLoadTypes); - browsing.add(imageAutoLoadView); - videoAutoLoadView = new ListSettingView<>(this, ChanSettings.videoAutoLoadNetwork, R.string.setting_video_auto_load, videoAutoLoadTypes); - browsing.add(videoAutoLoadView); - updateVideoLoadModes(); - - browsing.add(new BooleanSettingView(this, ChanSettings.videoOpenExternal, R.string.setting_video_open_external, R.string.setting_video_open_external_description)); - textOnly = new BooleanSettingView(this, ChanSettings.textOnly, R.string.setting_text_only, R.string.setting_text_only_description); - browsing.add(textOnly); - browsing.add(new LinkSettingView(this, R.string.setting_clear_thread_hides, 0, new View.OnClickListener() { - @Override - public void onClick(View v) { - databaseManager.clearAllThreadHides(); - Toast.makeText(context, R.string.setting_cleared_thread_hides, Toast.LENGTH_LONG).show(); - EventBus.getDefault().post(new RefreshUIMessage("clearhides")); - } - })); + setupAboutGroup(); + } - groups.add(browsing); + private void setupAboutGroup() { + SettingsGroup about = new SettingsGroup(R.string.settings_group_about); - // Posting group - SettingsGroup posting = new SettingsGroup(R.string.settings_group_posting); + final String version = setupVersionSetting(about); - posting.add(new BooleanSettingView(this, ChanSettings.postPinThread, R.string.setting_post_pin, 0)); - posting.add(new StringSettingView(this, ChanSettings.postDefaultName, R.string.setting_post_default_name, R.string.setting_post_default_name)); + setupUpdateSetting(about); - groups.add(posting); + setupExtraAboutSettings(about, version); - // About group - SettingsGroup about = new SettingsGroup(R.string.settings_group_about); - String version = ""; - try { - version = context.getPackageManager().getPackageInfo(context.getPackageName(), 0).versionName; - } catch (PackageManager.NameNotFoundException e) { - e.printStackTrace(); - } - final String finalVersion = version; + about.add(new LinkSettingView(this, + R.string.settings_about_license, R.string.settings_about_license_description, + v -> navigationController.pushController( + new LicensesController(context, + getString(R.string.settings_about_license), + "file:///android_asset/html/license.html")))); - String userVersion = version + " " + getString(R.string.app_flavor_name); - about.add(new LinkSettingView(this, getString(R.string.app_name), userVersion, new View.OnClickListener() { - @Override - public void onClick(View v) { - if ((++clickCount) % 5 == 0) { - boolean developer = !ChanSettings.developer.get(); + about.add(new LinkSettingView(this, + R.string.settings_about_licenses, R.string.settings_about_licenses_description, + v -> navigationController.pushController( + new LicensesController(context, + getString(R.string.settings_about_licenses), + "file:///android_asset/html/licenses.html")))); - ChanSettings.developer.set(developer); + developerView = about.add(new LinkSettingView(this, + R.string.settings_developer, 0, + v -> navigationController.pushController( + new DeveloperSettingsController(context)))); - Toast.makeText(context, (developer ? "Enabled" : "Disabled") + " developer options", Toast.LENGTH_LONG).show(); + groups.add(about); + } - developerView.view.setVisibility(developer ? View.VISIBLE : View.GONE); - } - } - })); + private void setupExtraAboutSettings(SettingsGroup about, String version) { + int extraAbouts = context.getResources() + .getIdentifier("extra_abouts", "array", context.getPackageName()); - if (((StartActivity) context).getVersionHandler().isUpdatingAvailable()) { - about.add(new LinkSettingView(this, R.string.settings_update_check, 0, new View.OnClickListener() { - @Override - public void onClick(View v) { - ((StartActivity) context).getVersionHandler().manualUpdateCheck(); - } - })); - } - - int extraAbouts = context.getResources().getIdentifier("extra_abouts", "array", context.getPackageName()); if (extraAbouts != 0) { String[] abouts = context.getResources().getStringArray(extraAbouts); if (abouts.length % 3 == 0) { @@ -360,7 +196,7 @@ public class MainSettingsController extends SettingsController implements Toolba } final String finalAboutLink = aboutLink; - about.add(new LinkSettingView(this, aboutName, aboutDescription, new View.OnClickListener() { + View.OnClickListener clickListener = new View.OnClickListener() { @Override public void onClick(View v) { if (finalAboutLink != null) { @@ -370,7 +206,7 @@ public class MainSettingsController extends SettingsController implements Toolba intent.setData(Uri.parse("mailto:")); intent.putExtra(Intent.EXTRA_EMAIL, new String[]{email[0]}); String subject = email[1]; - subject = subject.replace("__VERSION__", finalVersion); + subject = subject.replace("__VERSION__", version); intent.putExtra(Intent.EXTRA_SUBJECT, subject); AndroidUtils.openIntent(intent); } else { @@ -378,59 +214,48 @@ public class MainSettingsController extends SettingsController implements Toolba } } } - })); + }; + + about.add(new LinkSettingView(this, + aboutName, aboutDescription, + clickListener)); } } } + } - about.add(new LinkSettingView(this, R.string.settings_about_license, R.string.settings_about_license_description, new View.OnClickListener() { - @Override - public void onClick(View v) { - navigationController.pushController(new LicensesController(context, - getString(R.string.settings_about_license), "file:///android_asset/html/license.html")); - } - })); + private String setupVersionSetting(SettingsGroup about) { + String version = ""; + try { + version = context.getPackageManager() + .getPackageInfo(context.getPackageName(), 0).versionName; + } catch (PackageManager.NameNotFoundException ignored) { + } - about.add(new LinkSettingView(this, R.string.settings_about_licenses, R.string.settings_about_licenses_description, new View.OnClickListener() { - @Override - public void onClick(View v) { - navigationController.pushController(new LicensesController(context, - getString(R.string.settings_about_licenses), "file:///android_asset/html/licenses.html")); - } - })); + String userVersion = version + " " + getString(R.string.app_flavor_name); + about.add(new LinkSettingView(this, + getString(R.string.app_name), userVersion, + v -> { + if ((++clickCount) % 5 == 0) { + boolean developer = !ChanSettings.developer.get(); - developerView = about.add(new LinkSettingView(this, R.string.settings_developer, 0, new View.OnClickListener() { - @Override - public void onClick(View v) { - navigationController.pushController(new DeveloperSettingsController(context)); - } - })); + ChanSettings.developer.set(developer); - groups.add(about); - } + Toast.makeText(context, (developer ? "Enabled" : "Disabled") + + " developer options", Toast.LENGTH_LONG).show(); + + developerView.view.setVisibility(developer ? View.VISIBLE : View.GONE); + } + })); - private void setSaveLocationDescription() { - saveLocation.setDescription(ChanSettings.saveLocation.get()); + return version; } - private void updateVideoLoadModes() { - ChanSettings.MediaAutoLoadMode currentImageLoadMode = ChanSettings.imageAutoLoadNetwork.get(); - ChanSettings.MediaAutoLoadMode[] modes = ChanSettings.MediaAutoLoadMode.values(); - boolean enabled = false; - boolean resetVideoMode = false; - for (int i = 0; i < modes.length; i++) { - if (modes[i].getName().equals(currentImageLoadMode.getName())) { - enabled = true; - if (resetVideoMode) { - ChanSettings.videoAutoLoadNetwork.set(modes[i]); - videoAutoLoadView.updateSelection(); - onPreferenceChange(videoAutoLoadView); - } - } - videoAutoLoadView.items.get(i).enabled = enabled; - if (!enabled && ChanSettings.videoAutoLoadNetwork.get().getName().equals(modes[i].getName())) { - resetVideoMode = true; - } + private void setupUpdateSetting(SettingsGroup about) { + if (((StartActivity) context).getVersionHandler().isUpdatingAvailable()) { + about.add(new LinkSettingView(this, + R.string.settings_update_check, 0, + v -> ((StartActivity) context).getVersionHandler().manualUpdateCheck())); } } } diff --git a/Clover/app/src/main/java/org/floens/chan/ui/controller/MediaSettingsController.java b/Clover/app/src/main/java/org/floens/chan/ui/controller/MediaSettingsController.java new file mode 100644 index 00000000..285ed2e4 --- /dev/null +++ b/Clover/app/src/main/java/org/floens/chan/ui/controller/MediaSettingsController.java @@ -0,0 +1,194 @@ +/* + * 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.controller; + +import android.content.Context; + +import org.floens.chan.R; +import org.floens.chan.core.settings.ChanSettings; +import org.floens.chan.ui.settings.BooleanSettingView; +import org.floens.chan.ui.settings.LinkSettingView; +import org.floens.chan.ui.settings.ListSettingView; +import org.floens.chan.ui.settings.SettingView; +import org.floens.chan.ui.settings.SettingsController; +import org.floens.chan.ui.settings.SettingsGroup; + +import java.util.ArrayList; +import java.util.List; + +import de.greenrobot.event.EventBus; + +import static org.floens.chan.utils.AndroidUtils.getString; + +public class MediaSettingsController extends SettingsController { + // Special setting views + private LinkSettingView saveLocation; + private ListSettingView imageAutoLoadView; + private ListSettingView videoAutoLoadView; + + public MediaSettingsController(Context context) { + super(context); + } + + @Override + public void onCreate() { + super.onCreate(); + + EventBus.getDefault().register(this); + + navigation.setTitle(R.string.settings_screen_media); + + setupLayout(); + + populatePreferences(); + + buildPreferences(); + + onPreferenceChange(imageAutoLoadView); + } + + @Override + public void onDestroy() { + super.onDestroy(); + + EventBus.getDefault().unregister(this); + } + + @Override + public void onPreferenceChange(SettingView item) { + super.onPreferenceChange(item); + + if (item == imageAutoLoadView) { + updateVideoLoadModes(); + } + } + + public void onEvent(ChanSettings.SettingChanged setting) { + if (setting.setting == ChanSettings.saveLocation) { + updateSaveLocationSetting(); + } + } + + private void populatePreferences() { + // Media group + { + SettingsGroup media = new SettingsGroup(R.string.settings_group_media); + + setupSaveLocationSetting(media); + + media.add(new BooleanSettingView(this, + ChanSettings.saveBoardFolder, + R.string.setting_save_board_folder, + R.string.setting_save_board_folder_description)); + + media.add(new BooleanSettingView(this, + ChanSettings.saveOriginalFilename, + R.string.setting_save_original_filename, 0)); + + media.add(new BooleanSettingView(this, ChanSettings.videoOpenExternal, + R.string.setting_video_open_external, + R.string.setting_video_open_external_description)); + + media.add(new BooleanSettingView(this, + ChanSettings.shareUrl, + R.string.setting_share_url, R.string.setting_share_url_description)); + + media.add(new BooleanSettingView(this, + ChanSettings.revealImageSpoilers, + R.string.settings_reveal_image_spoilers, 0)); + + groups.add(media); + } + + // Loading group + { + SettingsGroup loading = new SettingsGroup(R.string.settings_group_media_loading); + + setupMediaLoadTypesSetting(loading); + + groups.add(loading); + } + } + + private void setupMediaLoadTypesSetting(SettingsGroup loading) { + List imageAutoLoadTypes = new ArrayList<>(); + List videoAutoLoadTypes = new ArrayList<>(); + for (ChanSettings.MediaAutoLoadMode mode : ChanSettings.MediaAutoLoadMode.values()) { + int name = 0; + switch (mode) { + case ALL: + name = R.string.setting_image_auto_load_all; + break; + case WIFI: + name = R.string.setting_image_auto_load_wifi; + break; + case NONE: + name = R.string.setting_image_auto_load_none; + break; + } + + imageAutoLoadTypes.add(new ListSettingView.Item<>(getString(name), mode)); + videoAutoLoadTypes.add(new ListSettingView.Item<>(getString(name), mode)); + } + + imageAutoLoadView = new ListSettingView<>(this, + ChanSettings.imageAutoLoadNetwork, R.string.setting_image_auto_load, + imageAutoLoadTypes); + loading.add(imageAutoLoadView); + + videoAutoLoadView = new ListSettingView<>(this, + ChanSettings.videoAutoLoadNetwork, R.string.setting_video_auto_load, + videoAutoLoadTypes); + loading.add(videoAutoLoadView); + + updateVideoLoadModes(); + } + + private void updateVideoLoadModes() { + ChanSettings.MediaAutoLoadMode currentImageLoadMode = ChanSettings.imageAutoLoadNetwork.get(); + ChanSettings.MediaAutoLoadMode[] modes = ChanSettings.MediaAutoLoadMode.values(); + boolean enabled = false; + boolean resetVideoMode = false; + for (int i = 0; i < modes.length; i++) { + if (modes[i].getName().equals(currentImageLoadMode.getName())) { + enabled = true; + if (resetVideoMode) { + ChanSettings.videoAutoLoadNetwork.set(modes[i]); + videoAutoLoadView.updateSelection(); + onPreferenceChange(videoAutoLoadView); + } + } + videoAutoLoadView.items.get(i).enabled = enabled; + if (!enabled && ChanSettings.videoAutoLoadNetwork.get().getName() + .equals(modes[i].getName())) { + resetVideoMode = true; + } + } + } + + private void setupSaveLocationSetting(SettingsGroup media) { + saveLocation = (LinkSettingView) media.add(new LinkSettingView(this, + R.string.save_location_screen, 0, + v -> navigationController.pushController(new SaveLocationController(context)))); + updateSaveLocationSetting(); + } + + private void updateSaveLocationSetting() { + saveLocation.setDescription(ChanSettings.saveLocation.get()); + } +} diff --git a/Clover/app/src/main/java/org/floens/chan/ui/controller/SiteSetupController.java b/Clover/app/src/main/java/org/floens/chan/ui/controller/SiteSetupController.java index f8e7e332..e884196d 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/controller/SiteSetupController.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/controller/SiteSetupController.java @@ -87,7 +87,7 @@ public class SiteSetupController extends SettingsController implements SiteSetup public void setIsLoggedIn(boolean isLoggedIn) { String text = context.getString(isLoggedIn ? R.string.setup_site_login_description_enabled : - R.string.setup_site_login_description_enabled); + R.string.setup_site_login_description_disabled); loginLink.setDescription(text); } diff --git a/Clover/app/src/main/java/org/floens/chan/ui/controller/WatchSettingsController.java b/Clover/app/src/main/java/org/floens/chan/ui/controller/WatchSettingsController.java index b9bc0b01..bca5927f 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/controller/WatchSettingsController.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/controller/WatchSettingsController.java @@ -20,7 +20,6 @@ package org.floens.chan.ui.controller; import android.content.Context; import android.support.v7.widget.SwitchCompat; import android.widget.CompoundButton; -import android.widget.LinearLayout; import org.floens.chan.R; import org.floens.chan.core.settings.ChanSettings; @@ -81,9 +80,6 @@ public class WatchSettingsController extends SettingsController implements Compo @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { ChanSettings.watchEnabled.set(isChecked); - if (previousSiblingController instanceof WatchSettingControllerListener) { - ((WatchSettingControllerListener) previousSiblingController).onWatchEnabledChanged(isChecked); - } crossfadeView.toggle(isChecked, true); } @@ -142,8 +138,4 @@ public class WatchSettingsController extends SettingsController implements Compo groups.add(settings); } - - public interface WatchSettingControllerListener { - void onWatchEnabledChanged(boolean enabled); - } } 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 1fef6eef..63f7a3a8 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 @@ -27,18 +27,28 @@ import android.widget.TextView; import org.floens.chan.R; import org.floens.chan.controller.Controller; +import org.floens.chan.ui.activity.StartActivity; +import org.floens.chan.ui.helper.RefreshUIMessage; import org.floens.chan.utils.AndroidUtils; import java.util.ArrayList; import java.util.List; +import de.greenrobot.event.EventBus; + import static org.floens.chan.utils.AndroidUtils.dp; public class SettingsController extends Controller implements AndroidUtils.OnMeasuredCallback { protected LinearLayout content; protected List groups = new ArrayList<>(); - private boolean built = false; + protected List requiresUiRefresh = new ArrayList<>(); + + // Very user unfriendly. + @Deprecated + protected List requiresRestart = new ArrayList<>(); + + private boolean needRestart = false; public SettingsController(Context context) { super(context); @@ -51,6 +61,15 @@ public class SettingsController extends Controller implements AndroidUtils.OnMea AndroidUtils.waitForLayout(view, this); } + @Override + public void onDestroy() { + super.onDestroy(); + + if (needRestart) { + ((StartActivity) context).restart(); + } + } + @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); @@ -70,6 +89,12 @@ public class SettingsController extends Controller implements AndroidUtils.OnMea || (item instanceof LinkSettingView)) { setDescriptionText(item.view, item.getTopDescription(), item.getBottomDescription()); } + + if (requiresUiRefresh.contains(item)) { + EventBus.getDefault().post(new RefreshUIMessage("unknown")); + } else if (requiresRestart.contains(item)) { + needRestart = true; + } } private void setMargins() { @@ -107,6 +132,11 @@ public class SettingsController extends Controller implements AndroidUtils.OnMea } } + protected void setupLayout() { + view = inflateRes(R.layout.settings_layout); + content = view.findViewById(R.id.scrollview_content); + } + protected void buildPreferences() { LayoutInflater inf = LayoutInflater.from(context); boolean firstGroup = true; @@ -149,8 +179,6 @@ public class SettingsController extends Controller implements AndroidUtils.OnMea } } } - - built = true; } private void setDescriptionText(View view, String topText, String bottomText) { diff --git a/Clover/app/src/main/res/values/strings.xml b/Clover/app/src/main/res/values/strings.xml index 3d88b63e..987fa970 100644 --- a/Clover/app/src/main/res/values/strings.xml +++ b/Clover/app/src/main/res/values/strings.xml @@ -101,6 +101,16 @@ Re-enable this permission in the app settings if you permanently disabled it."%d bookmarks + + %d filter + %d filters + + + + %d site + %d sites + + %1$dR %2$dI View album @@ -137,6 +147,8 @@ Re-enable this permission in the app settings if you permanently disabled it."Open this thread? No applications found to open link + Confirm exit + Error 404 Failed to show image @@ -357,32 +369,152 @@ Re-enable this permission in the app settings if you permanently disabled it."Sites History + Settings - General + + + Settings Thread watcher - 4chan pass - Try the advanced settings! + Sites + Appearance + Theme, layout, fonts, etc. + Behaviour + Thread refresh, captcha, etc. + Media + Save location, auto loading, etc. + Filters + + + Watching pinned threads + Off - Appearance + Thread watcher settings + Settings + To watch pins for new posts, turn the thread watcher on. + Enable in the background + Watch pins when Clover is in the background + Background update interval + The time between updates in the background + Notify about + + All posts + Only posts quoting you + + Notification sound + + All posts + Only posts quoting you + + Heads-up notification on mentions + Show a heads-up notification on mentions + Notification light + + None + White + Red + Yellow + Green + Cyan + Blue + Purple + + + + About + Check for updates + Released under the GNU GPLv3 license + Tap to see license + Open Source Licenses + Legal information about licenses + Developer settings - Browsing + + + Appearance + Appearance Theme - Swipe to change the theme.\nTap the toolbar menu to change its color.\n - Click here to change the FAB color + + + Layout Layout mode Auto Phone layout Slide mode Split mode + Catalog mode columns + Auto + %1$d columns + Never hide the toolbar + Enable the reply FAB + Disabling replaces it with a menu option + + + Post Font size (default) Use condensed font Use a condensed font for the posts - Catalog mode columns - Auto - %1$d columns - Ask before opening links + Show the full date on posts + Show file info on posts + Show filename on posts + + + Behaviour + + + General Auto refresh threads + Confirm before exit + Allow screens to be swiped away + Clear all thread hides + Cleared all thread hides + + + Reply + Use the new captcha + Enable to use the newer recaptcha for thread replies. + Pin thread on post + Default post name + + + Text only mode + Hide images when in board and thread view + Reveal text spoilers + Makes the spoiler text appear clicked + Make everyone Anonymous + Hide IDs + Show Anonymous username + Reply buttons on the bottom + Volume keys scroll content + Tap the post number to reply + Ask before opening links + + + + HTTP Proxy + Enable proxy + Proxy server address + Proxy server port + + + + Media + + + Media + + Save images in a board folder + Create a folder for each board to store images in + Save original filename + Open videos external + Open videos in an external media player + Share url to image + Share the url to the image instead of the image itself + Reveal image spoilers + + + + Media loading Auto load images Always @@ -390,32 +522,9 @@ Re-enable this permission in the app settings if you permanently disabled it."Never Auto load videos - Depends on auto load images - Open videos external - Open videos in an external media player - Text only mode - Hide images when in board and thread view - Clear all thread hides - Cleared all thread hides - Posting - Default post name - Pin thread on post - About - Check for updates - Released under the GNU GPLv3 license - Tap to see license - Open Source Licenses - Legal information about licenses - Developer settings - View logs - Logs - Copy - Copied to clipboard - - Advanced settings - Advanced settings + Save location Storage permission required @@ -425,71 +534,18 @@ Re-enable this permission in the app settings if you permanently disabled it."File save folder Error creating save folder Choose - Use the new captcha - Enable to use the newer recaptcha for thread replies. - Save original filename - Save images in a board folder - Create a folder for each board to store images in - Share url to image - Share the url to the image instead of the image itself - Use HTTPS - Use HTTPS for all network requests - Enable the reply FAB - Disabling replaces it with a menu option - Make everyone Anonymous - Hide IDs - Show Anonymous username - Reveal image spoilers - Reveal text spoilers - Makes the spoiler text appear clicked - Reply buttons on the bottom - Confirm before exit - Confirm exit - Tap the post number to reply - Volume keys scroll content - Show the full date on posts - Show file info on posts - Show filename on posts - Never hide the toolbar - Allow screens to be swiped away - 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. - Watching pinned threads - Off - Enable in the background - Watch pins when Clover is in the background - Background update interval - The time between updates in the background - Notify about - - All posts - Only posts quoting you - - Notification sound - - All posts - Only posts quoting you - - Heads-up notification on mentions - Show a heads-up notification on mentions - Notification light - - None - White - Red - Yellow - Green - Cyan - Blue - Purple - + + Swipe to change the theme.\nTap the toolbar menu to change its color.\n + Click here to change the FAB color + + + View logs + Logs + Copy + Copied to clipboard + 4chan pass Token