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