From c8c89345e9bfa1faea59793c1c3d2c2b6c3f5452 Mon Sep 17 00:00:00 2001 From: Floens Date: Mon, 23 Feb 2015 23:42:05 +0100 Subject: [PATCH] Some work on settings --- Clover/app/build.gradle | 4 + .../java/org/floens/chan/ChanApplication.java | 11 +- .../floens/chan/core/loader/ChanParser.java | 2 +- .../chan/core/manager/ThreadManager.java | 2 +- .../chan/core/manager/WatchManager.java | 2 +- .../{ => preferences}/ChanPreferences.java | 14 +- .../chan/core/preferences/Preference.java | 19 +++ .../core/preferences/StringPreference.java | 19 +++ .../chan/core/presenter/ThreadPresenter.java | 2 +- .../ui/activity/AdvancedSettingsActivity.java | 2 +- .../floens/chan/ui/activity/BoardEditor.java | 2 +- .../floens/chan/ui/activity/ChanActivity.java | 2 +- .../chan/ui/activity/ImageViewActivity.java | 2 +- .../ui/activity/PassSettingsActivity.java | 2 +- .../ui/activity/WatchSettingsActivity.java | 2 +- .../floens/chan/ui/adapter/PinnedAdapter.java | 2 +- .../chan/ui/controller/BrowseController.java | 48 +++--- .../ui/controller/MainSettingsController.java | 106 ++++++++++++++ .../ui/controller/SettingsController.java | 38 ----- .../chan/ui/fragment/ImageViewFragment.java | 2 +- .../chan/ui/fragment/PostRepliesFragment.java | 2 +- .../chan/ui/fragment/ReplyFragment.java | 2 +- .../chan/ui/fragment/SettingsFragment.java | 2 +- .../chan/ui/fragment/ThreadFragment.java | 2 +- .../floens/chan/ui/layout/ThreadLayout.java | 2 +- .../ui/preferences/BooleanPreference.java | 40 +++++ .../chan/ui/preferences/LinkPreference.java | 23 +++ .../chan/ui/preferences/ListPreference.java | 87 +++++++++++ .../chan/ui/preferences/PreferenceGroup.java | 14 ++ .../chan/ui/preferences/PreferenceItem.java | 29 ++++ .../ui/preferences/PreferencesController.java | 137 ++++++++++++++++++ .../floens/chan/ui/service/WatchNotifier.java | 2 +- .../chan/ui/toolbar/NavigationItem.java | 4 +- .../org/floens/chan/ui/toolbar/Toolbar.java | 3 +- .../chan/ui/toolbar/ToolbarMenuItem.java | 12 +- .../FloatingMenu.java} | 54 +++---- .../FloatingMenuItem.java} | 10 +- .../chan/ui/view/ThumbnailImageView.java | 2 +- .../org/floens/chan/utils/AndroidUtils.java | 25 ++++ .../org/floens/chan/utils/ImageSaver.java | 2 +- .../org/floens/chan/utils/ThemeHelper.java | 2 +- .../main/res/layout/preference_boolean.xml | 28 ++++ .../res/layout/preference_description.xml | 25 ++++ .../main/res/layout/preference_divider.xml | 6 + .../src/main/res/layout/preference_group.xml | 25 ++++ .../src/main/res/layout/preference_link.xml | 13 ++ .../app/src/main/res/layout/root_layout.xml | 2 +- .../src/main/res/layout/settings_layout.xml | 14 +- 48 files changed, 712 insertions(+), 140 deletions(-) rename Clover/app/src/main/java/org/floens/chan/core/{ => preferences}/ChanPreferences.java (93%) create mode 100644 Clover/app/src/main/java/org/floens/chan/core/preferences/Preference.java create mode 100644 Clover/app/src/main/java/org/floens/chan/core/preferences/StringPreference.java create mode 100644 Clover/app/src/main/java/org/floens/chan/ui/controller/MainSettingsController.java delete mode 100644 Clover/app/src/main/java/org/floens/chan/ui/controller/SettingsController.java create mode 100644 Clover/app/src/main/java/org/floens/chan/ui/preferences/BooleanPreference.java create mode 100644 Clover/app/src/main/java/org/floens/chan/ui/preferences/LinkPreference.java create mode 100644 Clover/app/src/main/java/org/floens/chan/ui/preferences/ListPreference.java create mode 100644 Clover/app/src/main/java/org/floens/chan/ui/preferences/PreferenceGroup.java create mode 100644 Clover/app/src/main/java/org/floens/chan/ui/preferences/PreferenceItem.java create mode 100644 Clover/app/src/main/java/org/floens/chan/ui/preferences/PreferencesController.java rename Clover/app/src/main/java/org/floens/chan/ui/{toolbar/ToolbarMenuSubMenu.java => view/FloatingMenu.java} (76%) rename Clover/app/src/main/java/org/floens/chan/ui/{toolbar/ToolbarMenuSubItem.java => view/FloatingMenuItem.java} (84%) create mode 100644 Clover/app/src/main/res/layout/preference_boolean.xml create mode 100644 Clover/app/src/main/res/layout/preference_description.xml create mode 100644 Clover/app/src/main/res/layout/preference_divider.xml create mode 100644 Clover/app/src/main/res/layout/preference_group.xml create mode 100644 Clover/app/src/main/res/layout/preference_link.xml diff --git a/Clover/app/build.gradle b/Clover/app/build.gradle index 1b32f719..d42dc79a 100644 --- a/Clover/app/build.gradle +++ b/Clover/app/build.gradle @@ -17,6 +17,10 @@ android { targetCompatibility JavaVersion.VERSION_1_7 } + lintOptions { + abortOnError false + } + /* If you want to sign releases, make a file in app/keys.properties with the following content: keystoreFile=yourkey.store diff --git a/Clover/app/src/main/java/org/floens/chan/ChanApplication.java b/Clover/app/src/main/java/org/floens/chan/ChanApplication.java index b6159857..47da5745 100644 --- a/Clover/app/src/main/java/org/floens/chan/ChanApplication.java +++ b/Clover/app/src/main/java/org/floens/chan/ChanApplication.java @@ -19,8 +19,6 @@ package org.floens.chan; import android.app.Application; import android.content.Context; -import android.content.SharedPreferences; -import android.preference.PreferenceManager; import android.view.ViewConfiguration; import com.android.volley.RequestQueue; @@ -31,11 +29,11 @@ import com.koushikdutta.ion.builder.Builders; import com.koushikdutta.ion.builder.LoadBuilder; import org.floens.chan.chan.ChanUrls; -import org.floens.chan.core.ChanPreferences; import org.floens.chan.core.manager.BoardManager; import org.floens.chan.core.manager.ReplyManager; import org.floens.chan.core.manager.WatchManager; import org.floens.chan.core.net.BitmapLruImageCache; +import org.floens.chan.core.preferences.ChanPreferences; import org.floens.chan.database.DatabaseManager; import org.floens.chan.utils.AndroidUtils; import org.floens.chan.utils.FileCache; @@ -71,6 +69,7 @@ public class ChanApplication extends Application { public ChanApplication() { instance = this; + con = this; } public static ChanApplication getInstance() { @@ -109,16 +108,10 @@ public class ChanApplication extends Application { return Ion.getDefault(getInstance()).build(getInstance()); } - public static SharedPreferences getPreferences() { - return PreferenceManager.getDefaultSharedPreferences(instance); - } - @Override public void onCreate() { super.onCreate(); - con = this; - // Force the overflow button to show, even on devices that have a // physical button. try { diff --git a/Clover/app/src/main/java/org/floens/chan/core/loader/ChanParser.java b/Clover/app/src/main/java/org/floens/chan/core/loader/ChanParser.java index 1d01934a..c86d26c6 100644 --- a/Clover/app/src/main/java/org/floens/chan/core/loader/ChanParser.java +++ b/Clover/app/src/main/java/org/floens/chan/core/loader/ChanParser.java @@ -31,7 +31,7 @@ import android.text.style.TypefaceSpan; import org.floens.chan.ChanApplication; import org.floens.chan.R; -import org.floens.chan.core.ChanPreferences; +import org.floens.chan.core.preferences.ChanPreferences; import org.floens.chan.core.model.Post; import org.floens.chan.core.model.PostLinkable; import org.floens.chan.utils.ThemeHelper; diff --git a/Clover/app/src/main/java/org/floens/chan/core/manager/ThreadManager.java b/Clover/app/src/main/java/org/floens/chan/core/manager/ThreadManager.java index df36acd7..8b819ad0 100644 --- a/Clover/app/src/main/java/org/floens/chan/core/manager/ThreadManager.java +++ b/Clover/app/src/main/java/org/floens/chan/core/manager/ThreadManager.java @@ -40,7 +40,7 @@ import com.android.volley.VolleyError; import org.floens.chan.ChanApplication; import org.floens.chan.R; import org.floens.chan.chan.ChanUrls; -import org.floens.chan.core.ChanPreferences; +import org.floens.chan.core.preferences.ChanPreferences; import org.floens.chan.core.loader.ChanLoader; import org.floens.chan.core.loader.LoaderPool; import org.floens.chan.core.manager.ReplyManager.DeleteListener; diff --git a/Clover/app/src/main/java/org/floens/chan/core/manager/WatchManager.java b/Clover/app/src/main/java/org/floens/chan/core/manager/WatchManager.java index 827268fc..334e102a 100644 --- a/Clover/app/src/main/java/org/floens/chan/core/manager/WatchManager.java +++ b/Clover/app/src/main/java/org/floens/chan/core/manager/WatchManager.java @@ -21,7 +21,7 @@ import android.content.Context; import android.content.Intent; import org.floens.chan.ChanApplication; -import org.floens.chan.core.ChanPreferences; +import org.floens.chan.core.preferences.ChanPreferences; import org.floens.chan.core.model.Loadable; import org.floens.chan.core.model.Pin; import org.floens.chan.core.model.Post; diff --git a/Clover/app/src/main/java/org/floens/chan/core/ChanPreferences.java b/Clover/app/src/main/java/org/floens/chan/core/preferences/ChanPreferences.java similarity index 93% rename from Clover/app/src/main/java/org/floens/chan/core/ChanPreferences.java rename to Clover/app/src/main/java/org/floens/chan/core/preferences/ChanPreferences.java index f4e4bdb2..174418a4 100644 --- a/Clover/app/src/main/java/org/floens/chan/core/ChanPreferences.java +++ b/Clover/app/src/main/java/org/floens/chan/core/preferences/ChanPreferences.java @@ -15,18 +15,28 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package org.floens.chan.core; +package org.floens.chan.core.preferences; import android.content.SharedPreferences; import android.os.Environment; import org.floens.chan.ChanApplication; +import org.floens.chan.utils.AndroidUtils; import java.io.File; public class ChanPreferences { + public static StringPreference defaultName; + public static StringPreference testTheme; + + static { + SharedPreferences p = AndroidUtils.getPreferences(); + defaultName = new StringPreference(p, "preference_default_name", ""); + testTheme = new StringPreference(p, "preference_test_theme", "dark"); + } + private static SharedPreferences p() { - return ChanApplication.getPreferences(); + return AndroidUtils.getPreferences(); } public static boolean getOpenLinkConfirmation() { diff --git a/Clover/app/src/main/java/org/floens/chan/core/preferences/Preference.java b/Clover/app/src/main/java/org/floens/chan/core/preferences/Preference.java new file mode 100644 index 00000000..0aeb521c --- /dev/null +++ b/Clover/app/src/main/java/org/floens/chan/core/preferences/Preference.java @@ -0,0 +1,19 @@ +package org.floens.chan.core.preferences; + +import android.content.SharedPreferences; + +public abstract class Preference { + protected final SharedPreferences sharedPreferences; + protected final String key; + protected final T def; + + public Preference(SharedPreferences sharedPreferences, String key, T def) { + this.sharedPreferences = sharedPreferences; + this.key = key; + this.def = def; + } + + public abstract T get(); + + public abstract void set(T value); +} diff --git a/Clover/app/src/main/java/org/floens/chan/core/preferences/StringPreference.java b/Clover/app/src/main/java/org/floens/chan/core/preferences/StringPreference.java new file mode 100644 index 00000000..7532a9ff --- /dev/null +++ b/Clover/app/src/main/java/org/floens/chan/core/preferences/StringPreference.java @@ -0,0 +1,19 @@ +package org.floens.chan.core.preferences; + +import android.content.SharedPreferences; + +public class StringPreference extends Preference { + public StringPreference(SharedPreferences sharedPreferences, String key, String def) { + super(sharedPreferences, key, def); + } + + @Override + public String get() { + return sharedPreferences.getString(key, def); + } + + @Override + public void set(String value) { + sharedPreferences.edit().putString(key, value).apply(); + } +} diff --git a/Clover/app/src/main/java/org/floens/chan/core/presenter/ThreadPresenter.java b/Clover/app/src/main/java/org/floens/chan/core/presenter/ThreadPresenter.java index 7ddf4af0..ec4c5aa2 100644 --- a/Clover/app/src/main/java/org/floens/chan/core/presenter/ThreadPresenter.java +++ b/Clover/app/src/main/java/org/floens/chan/core/presenter/ThreadPresenter.java @@ -25,7 +25,7 @@ import com.android.volley.VolleyError; import org.floens.chan.ChanApplication; import org.floens.chan.R; import org.floens.chan.chan.ChanUrls; -import org.floens.chan.core.ChanPreferences; +import org.floens.chan.core.preferences.ChanPreferences; import org.floens.chan.core.loader.ChanLoader; import org.floens.chan.core.loader.LoaderPool; import org.floens.chan.core.model.ChanThread; diff --git a/Clover/app/src/main/java/org/floens/chan/ui/activity/AdvancedSettingsActivity.java b/Clover/app/src/main/java/org/floens/chan/ui/activity/AdvancedSettingsActivity.java index 8425f0b2..564301f3 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/activity/AdvancedSettingsActivity.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/activity/AdvancedSettingsActivity.java @@ -24,7 +24,7 @@ import android.preference.PreferenceFragment; import org.floens.chan.R; import org.floens.chan.chan.ChanUrls; -import org.floens.chan.core.ChanPreferences; +import org.floens.chan.core.preferences.ChanPreferences; import org.floens.chan.ui.ThemeActivity; import org.floens.chan.ui.fragment.FolderPickFragment; diff --git a/Clover/app/src/main/java/org/floens/chan/ui/activity/BoardEditor.java b/Clover/app/src/main/java/org/floens/chan/ui/activity/BoardEditor.java index ab196bcd..26091c38 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/activity/BoardEditor.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/activity/BoardEditor.java @@ -47,7 +47,7 @@ import com.mobeta.android.dslv.DragSortListView; import org.floens.chan.ChanApplication; import org.floens.chan.R; -import org.floens.chan.core.ChanPreferences; +import org.floens.chan.core.preferences.ChanPreferences; import org.floens.chan.core.manager.BoardManager; import org.floens.chan.core.model.Board; import org.floens.chan.ui.SwipeDismissListViewTouchListener; diff --git a/Clover/app/src/main/java/org/floens/chan/ui/activity/ChanActivity.java b/Clover/app/src/main/java/org/floens/chan/ui/activity/ChanActivity.java index 63b64b74..7a4d0bb5 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/activity/ChanActivity.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/activity/ChanActivity.java @@ -43,7 +43,7 @@ import android.widget.TextView; import org.floens.chan.ChanApplication; import org.floens.chan.R; import org.floens.chan.chan.ChanUrls; -import org.floens.chan.core.ChanPreferences; +import org.floens.chan.core.preferences.ChanPreferences; import org.floens.chan.core.loader.ChanLoader; import org.floens.chan.core.manager.BoardManager; import org.floens.chan.core.manager.ThreadManager; diff --git a/Clover/app/src/main/java/org/floens/chan/ui/activity/ImageViewActivity.java b/Clover/app/src/main/java/org/floens/chan/ui/activity/ImageViewActivity.java index e7a0b1a7..4158f98e 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/activity/ImageViewActivity.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/activity/ImageViewActivity.java @@ -29,7 +29,7 @@ import android.widget.ProgressBar; import org.floens.chan.R; import org.floens.chan.chan.ImageSearch; -import org.floens.chan.core.ChanPreferences; +import org.floens.chan.core.preferences.ChanPreferences; import org.floens.chan.core.manager.ThreadManager; import org.floens.chan.core.model.Post; import org.floens.chan.ui.ThemeActivity; diff --git a/Clover/app/src/main/java/org/floens/chan/ui/activity/PassSettingsActivity.java b/Clover/app/src/main/java/org/floens/chan/ui/activity/PassSettingsActivity.java index 5396649f..b875d1ba 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/activity/PassSettingsActivity.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/activity/PassSettingsActivity.java @@ -37,7 +37,7 @@ import android.widget.TextView; import org.floens.chan.ChanApplication; import org.floens.chan.R; -import org.floens.chan.core.ChanPreferences; +import org.floens.chan.core.preferences.ChanPreferences; import org.floens.chan.core.manager.ReplyManager; import org.floens.chan.core.manager.ReplyManager.PassResponse; import org.floens.chan.core.model.Pass; diff --git a/Clover/app/src/main/java/org/floens/chan/ui/activity/WatchSettingsActivity.java b/Clover/app/src/main/java/org/floens/chan/ui/activity/WatchSettingsActivity.java index f308af37..21c6a219 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/activity/WatchSettingsActivity.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/activity/WatchSettingsActivity.java @@ -34,7 +34,7 @@ import android.widget.TextView; import org.floens.chan.ChanApplication; import org.floens.chan.R; -import org.floens.chan.core.ChanPreferences; +import org.floens.chan.core.preferences.ChanPreferences; import org.floens.chan.ui.ThemeActivity; public class WatchSettingsActivity extends ThemeActivity implements OnCheckedChangeListener { diff --git a/Clover/app/src/main/java/org/floens/chan/ui/adapter/PinnedAdapter.java b/Clover/app/src/main/java/org/floens/chan/ui/adapter/PinnedAdapter.java index bdce22ac..054aef3c 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/adapter/PinnedAdapter.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/adapter/PinnedAdapter.java @@ -32,7 +32,7 @@ import android.widget.TextView; import org.floens.chan.ChanApplication; import org.floens.chan.R; -import org.floens.chan.core.ChanPreferences; +import org.floens.chan.core.preferences.ChanPreferences; import org.floens.chan.core.model.Pin; import org.floens.chan.ui.view.CustomNetworkImageView; diff --git a/Clover/app/src/main/java/org/floens/chan/ui/controller/BrowseController.java b/Clover/app/src/main/java/org/floens/chan/ui/controller/BrowseController.java index edf1a3b3..c12582d0 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/controller/BrowseController.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/controller/BrowseController.java @@ -35,14 +35,14 @@ import org.floens.chan.core.model.Loadable; import org.floens.chan.ui.layout.ThreadLayout; import org.floens.chan.ui.toolbar.ToolbarMenu; import org.floens.chan.ui.toolbar.ToolbarMenuItem; -import org.floens.chan.ui.toolbar.ToolbarMenuSubItem; -import org.floens.chan.ui.toolbar.ToolbarMenuSubMenu; +import org.floens.chan.ui.view.FloatingMenu; +import org.floens.chan.ui.view.FloatingMenuItem; import org.floens.chan.utils.AndroidUtils; import java.util.ArrayList; import java.util.List; -public class BrowseController extends Controller implements ToolbarMenuItem.ToolbarMenuItemCallback, ThreadLayout.ThreadLayoutCallback, ToolbarMenuSubMenu.ToolbarMenuItemSubMenuCallback, BoardManager.BoardChangeListener { +public class BrowseController extends Controller implements ToolbarMenuItem.ToolbarMenuItemCallback, ThreadLayout.ThreadLayoutCallback, FloatingMenu.FloatingMenuCallback, BoardManager.BoardChangeListener { private static final int REFRESH_ID = 1; private static final int POST_ID = 2; private static final int SEARCH_ID = 101; @@ -50,7 +50,7 @@ public class BrowseController extends Controller implements ToolbarMenuItem.Tool private static final int SETTINGS_ID = 103; private ThreadLayout threadLayout; - private List boardItems; + private List boardItems; public BrowseController(Context context) { super(context); @@ -62,7 +62,7 @@ public class BrowseController extends Controller implements ToolbarMenuItem.Tool ChanApplication.getBoardManager().addListener(this); - navigationItem.middleMenu = new ToolbarMenuSubMenu(context); + navigationItem.middleMenu = new FloatingMenu(context); navigationItem.middleMenu.setCallback(this); loadBoards(); @@ -76,12 +76,12 @@ public class BrowseController extends Controller implements ToolbarMenuItem.Tool ToolbarMenuItem overflow = menu.createOverflow(this); - List items = new ArrayList<>(); - items.add(new ToolbarMenuSubItem(SEARCH_ID, context.getString(R.string.action_search))); - items.add(new ToolbarMenuSubItem(SHARE_ID, context.getString(R.string.action_share))); - items.add(new ToolbarMenuSubItem(SETTINGS_ID, context.getString(R.string.action_settings))); + List items = new ArrayList<>(); + items.add(new FloatingMenuItem(SEARCH_ID, context.getString(R.string.action_search))); + items.add(new FloatingMenuItem(SHARE_ID, context.getString(R.string.action_share))); + items.add(new FloatingMenuItem(SETTINGS_ID, context.getString(R.string.action_settings))); - overflow.setSubMenu(new ToolbarMenuSubMenu(context, overflow.getView(), items)); + overflow.setSubMenu(new FloatingMenu(context, overflow.getView(), items)); threadLayout = new ThreadLayout(context); threadLayout.setCallback(this); @@ -111,8 +111,8 @@ public class BrowseController extends Controller implements ToolbarMenuItem.Tool } @Override - public void onSubMenuItemClicked(ToolbarMenuItem parent, ToolbarMenuSubItem item) { - switch (item.getId()) { + public void onSubMenuItemClicked(ToolbarMenuItem parent, FloatingMenuItem item) { + switch ((Integer) item.getId()) { case SEARCH_ID: // TODO break; @@ -121,17 +121,17 @@ public class BrowseController extends Controller implements ToolbarMenuItem.Tool AndroidUtils.shareLink(link); break; case SETTINGS_ID: - SettingsController settingsController = new SettingsController(context); - navigationController.pushController(settingsController); + MainSettingsController mainSettingsController = new MainSettingsController(context); + navigationController.pushController(mainSettingsController); break; } } @Override - public void onSubMenuItemClicked(ToolbarMenuSubMenu menu, ToolbarMenuSubItem item) { + public void onFloatingMenuItemClicked(FloatingMenu menu, FloatingMenuItem item) { if (menu == navigationItem.middleMenu) { - if (item instanceof ToolbarMenuSubItemBoard) { - loadBoard(((ToolbarMenuSubItemBoard) item).board); + if (item instanceof FloatingMenuItemBoard) { + loadBoard(((FloatingMenuItemBoard) item).board); navigationController.toolbar.updateNavigation(); } else { // TODO start board editor @@ -161,8 +161,8 @@ public class BrowseController extends Controller implements ToolbarMenuItem.Tool threadLayout.getPresenter().bindLoadable(loadable); threadLayout.getPresenter().requestData(); - for (ToolbarMenuSubItem item : boardItems) { - if (((ToolbarMenuSubItemBoard) item).board == board) { + for (FloatingMenuItem item : boardItems) { + if (((FloatingMenuItemBoard) item).board == board) { navigationItem.middleMenu.setSelectedItem(item); } } @@ -172,7 +172,7 @@ public class BrowseController extends Controller implements ToolbarMenuItem.Tool List boards = ChanApplication.getBoardManager().getSavedBoards(); boardItems = new ArrayList<>(); for (Board board : boards) { - ToolbarMenuSubItem item = new ToolbarMenuSubItemBoard(board); + FloatingMenuItem item = new FloatingMenuItemBoard(board); boardItems.add(item); } @@ -180,10 +180,10 @@ public class BrowseController extends Controller implements ToolbarMenuItem.Tool navigationItem.middleMenu.setAdapter(new BoardsAdapter(context, boardItems)); } - private static class ToolbarMenuSubItemBoard extends ToolbarMenuSubItem { + private static class FloatingMenuItemBoard extends FloatingMenuItem { public Board board; - public ToolbarMenuSubItemBoard(Board board) { + public FloatingMenuItemBoard(Board board) { super(board.id, board.key); this.board = board; } @@ -191,9 +191,9 @@ public class BrowseController extends Controller implements ToolbarMenuItem.Tool private static class BoardsAdapter extends BaseAdapter { private final Context context; - private List items; + private List items; - public BoardsAdapter(Context context, List items) { + public BoardsAdapter(Context context, List items) { this.context = context; this.items = items; } 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 new file mode 100644 index 00000000..dda367d5 --- /dev/null +++ b/Clover/app/src/main/java/org/floens/chan/ui/controller/MainSettingsController.java @@ -0,0 +1,106 @@ +/* + * 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.app.AlertDialog; +import android.content.Context; +import android.view.View; +import android.widget.LinearLayout; + +import org.floens.chan.R; +import org.floens.chan.core.preferences.ChanPreferences; +import org.floens.chan.ui.preferences.LinkPreference; +import org.floens.chan.ui.preferences.ListPreference; +import org.floens.chan.ui.preferences.PreferenceGroup; +import org.floens.chan.ui.preferences.PreferenceItem; +import org.floens.chan.ui.preferences.PreferencesController; + +public class MainSettingsController extends PreferencesController { + private ListPreference theme; + private LinkPreference link; + + public MainSettingsController(Context context) { + super(context); + } + + @Override + public void onCreate() { + super.onCreate(); + + //TODO correct header colors, background, themeing + + navigationItem.title = context.getString(R.string.action_settings); + + view = inflateRes(R.layout.settings_layout); + content = (LinearLayout) view.findViewById(R.id.scrollview_content); + + populatePreferences(); + + buildPreferences(); + } + + @Override + public void onPreferenceChange(PreferenceItem item) { + super.onPreferenceChange(item); + + if (item == theme) { + link.setEnabled(((ListPreference)item).getPreference().get().equals("dark")); + } + } + + private void populatePreferences() { + PreferenceGroup settings = new PreferenceGroup("Settings"); + + ListPreference.Item[] themeItems = new ListPreference.Item[2]; + themeItems[0] = new ListPreference.Item<>("Light", "light"); + themeItems[1] = new ListPreference.Item<>("Dark", "dark"); + theme = new ListPreference(this, ChanPreferences.testTheme, "Theme", themeItems); + settings.preferenceItems.add(theme); + +// BooleanPreference bool = new BooleanPreference(p, "A name", "akey", false); +// settings.preferenceItems.add(bool); + + link = new LinkPreference(this, "A link", new View.OnClickListener() { + public void onClick(View v) { + new AlertDialog.Builder(context).setMessage("click").setPositiveButton(R.string.ok, null).show(); + } + }); + settings.preferenceItems.add(link); + + groups.add(settings); + + /*PreferenceGroup posting = new PreferenceGroup("Posting"); + + ListPreference.Item[] postItems = new ListPreference.Item[4]; + postItems[0] = new ListPreference.Item<>("Top", "one"); + postItems[1] = new ListPreference.Item<>("Top", "two"); + postItems[2] = new ListPreference.Item<>("Top", "three"); + postItems[3] = new ListPreference.Item<>("Top", "four"); + posting.preferenceItems.add(new ListPreference(p, "Something", "something", postItems)); + posting.preferenceItems.add(new ListPreference(p, "Something", "something", postItems)); + posting.preferenceItems.add(new ListPreference(p, "Something", "something", postItems)); + posting.preferenceItems.add(new ListPreference(p, "Something", "something", postItems)); + posting.preferenceItems.add(new ListPreference(p, "Something", "something", postItems)); + posting.preferenceItems.add(new ListPreference(p, "Something", "something", postItems)); + posting.preferenceItems.add(new ListPreference(p, "Something", "something", postItems)); + posting.preferenceItems.add(new ListPreference(p, "Something", "something", postItems)); + posting.preferenceItems.add(new ListPreference(p, "Something", "something", postItems)); + + groups.add(posting);*/ + } +} diff --git a/Clover/app/src/main/java/org/floens/chan/ui/controller/SettingsController.java b/Clover/app/src/main/java/org/floens/chan/ui/controller/SettingsController.java deleted file mode 100644 index 68f6194e..00000000 --- a/Clover/app/src/main/java/org/floens/chan/ui/controller/SettingsController.java +++ /dev/null @@ -1,38 +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 org.floens.chan.R; -import org.floens.chan.controller.Controller; - -public class SettingsController extends Controller { - public SettingsController(Context context) { - super(context); - } - - @Override - public void onCreate() { - super.onCreate(); - - navigationItem.title = context.getString(R.string.action_settings); - - view = inflateRes(R.layout.settings_layout); - } -} diff --git a/Clover/app/src/main/java/org/floens/chan/ui/fragment/ImageViewFragment.java b/Clover/app/src/main/java/org/floens/chan/ui/fragment/ImageViewFragment.java index c8e82bf3..7193c68a 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/fragment/ImageViewFragment.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/fragment/ImageViewFragment.java @@ -36,7 +36,7 @@ import android.widget.VideoView; import org.floens.chan.R; import org.floens.chan.chan.ImageSearch; -import org.floens.chan.core.ChanPreferences; +import org.floens.chan.core.preferences.ChanPreferences; import org.floens.chan.core.model.Post; import org.floens.chan.ui.activity.ImageViewActivity; import org.floens.chan.ui.adapter.ImageViewAdapter; diff --git a/Clover/app/src/main/java/org/floens/chan/ui/fragment/PostRepliesFragment.java b/Clover/app/src/main/java/org/floens/chan/ui/fragment/PostRepliesFragment.java index 1029dd3e..811eedfd 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/fragment/PostRepliesFragment.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/fragment/PostRepliesFragment.java @@ -30,7 +30,7 @@ import android.widget.ListView; import android.widget.TextView; import org.floens.chan.R; -import org.floens.chan.core.ChanPreferences; +import org.floens.chan.core.preferences.ChanPreferences; import org.floens.chan.core.model.Post; import org.floens.chan.core.presenter.ThreadPresenter; import org.floens.chan.ui.helper.PostPopupHelper; diff --git a/Clover/app/src/main/java/org/floens/chan/ui/fragment/ReplyFragment.java b/Clover/app/src/main/java/org/floens/chan/ui/fragment/ReplyFragment.java index c78fd297..bad66450 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/fragment/ReplyFragment.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/fragment/ReplyFragment.java @@ -53,7 +53,7 @@ import com.android.volley.toolbox.StringRequest; import org.floens.chan.ChanApplication; import org.floens.chan.R; import org.floens.chan.chan.ChanUrls; -import org.floens.chan.core.ChanPreferences; +import org.floens.chan.core.preferences.ChanPreferences; import org.floens.chan.core.manager.ReplyManager; import org.floens.chan.core.manager.ReplyManager.ReplyResponse; import org.floens.chan.core.model.Board; diff --git a/Clover/app/src/main/java/org/floens/chan/ui/fragment/SettingsFragment.java b/Clover/app/src/main/java/org/floens/chan/ui/fragment/SettingsFragment.java index 4c14e9b9..4844a2b1 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/fragment/SettingsFragment.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/fragment/SettingsFragment.java @@ -30,7 +30,7 @@ import android.widget.ListView; import android.widget.Toast; import org.floens.chan.R; -import org.floens.chan.core.ChanPreferences; +import org.floens.chan.core.preferences.ChanPreferences; import org.floens.chan.ui.activity.AboutActivity; import org.floens.chan.ui.activity.BaseActivity; import org.floens.chan.ui.activity.SettingsActivity; diff --git a/Clover/app/src/main/java/org/floens/chan/ui/fragment/ThreadFragment.java b/Clover/app/src/main/java/org/floens/chan/ui/fragment/ThreadFragment.java index 8e05f023..18fa5d63 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/fragment/ThreadFragment.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/fragment/ThreadFragment.java @@ -44,7 +44,7 @@ import com.android.volley.ServerError; import com.android.volley.VolleyError; import org.floens.chan.R; -import org.floens.chan.core.ChanPreferences; +import org.floens.chan.core.preferences.ChanPreferences; import org.floens.chan.core.loader.ChanLoader; import org.floens.chan.core.loader.EndOfLineException; import org.floens.chan.core.manager.ThreadManager; diff --git a/Clover/app/src/main/java/org/floens/chan/ui/layout/ThreadLayout.java b/Clover/app/src/main/java/org/floens/chan/ui/layout/ThreadLayout.java index 226285c2..0e700d92 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/layout/ThreadLayout.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/layout/ThreadLayout.java @@ -28,7 +28,7 @@ import android.widget.Toast; import com.android.volley.VolleyError; import org.floens.chan.R; -import org.floens.chan.core.ChanPreferences; +import org.floens.chan.core.preferences.ChanPreferences; import org.floens.chan.core.model.ChanThread; import org.floens.chan.core.model.Loadable; import org.floens.chan.core.model.Post; diff --git a/Clover/app/src/main/java/org/floens/chan/ui/preferences/BooleanPreference.java b/Clover/app/src/main/java/org/floens/chan/ui/preferences/BooleanPreference.java new file mode 100644 index 00000000..b14cedca --- /dev/null +++ b/Clover/app/src/main/java/org/floens/chan/ui/preferences/BooleanPreference.java @@ -0,0 +1,40 @@ +package org.floens.chan.ui.preferences; + +import android.support.v7.widget.SwitchCompat; +import android.view.View; +import android.widget.CompoundButton; + +import org.floens.chan.R; +import org.floens.chan.core.preferences.Preference; + +public class BooleanPreference extends PreferenceItem implements View.OnClickListener, CompoundButton.OnCheckedChangeListener { + private SwitchCompat switcher; + private Preference preference; + + public BooleanPreference(PreferencesController preferencesController, Preference preference, String name) { + super(preferencesController, name); + this.preference = preference; + } + + @Override + public void setView(View view) { + super.setView(view); + + view.setOnClickListener(this); + + switcher = (SwitchCompat) view.findViewById(R.id.switcher); + switcher.setOnCheckedChangeListener(this); + + switcher.setChecked(preference.get()); + } + + @Override + public void onClick(View v) { + switcher.toggle(); + } + + @Override + public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { + preference.set(isChecked); + } +} diff --git a/Clover/app/src/main/java/org/floens/chan/ui/preferences/LinkPreference.java b/Clover/app/src/main/java/org/floens/chan/ui/preferences/LinkPreference.java new file mode 100644 index 00000000..5ff48d5a --- /dev/null +++ b/Clover/app/src/main/java/org/floens/chan/ui/preferences/LinkPreference.java @@ -0,0 +1,23 @@ +package org.floens.chan.ui.preferences; + +import android.view.View; + +public class LinkPreference extends PreferenceItem { + private final View.OnClickListener clickListener; + + public LinkPreference(PreferencesController preferencesController, String name, View.OnClickListener clickListener) { + super(preferencesController, name); + this.clickListener = clickListener; + } + + @Override + public void setView(View view) { + super.setView(view); + view.setOnClickListener(clickListener); + } + + @Override + public void setEnabled(boolean enabled) { + + } +} diff --git a/Clover/app/src/main/java/org/floens/chan/ui/preferences/ListPreference.java b/Clover/app/src/main/java/org/floens/chan/ui/preferences/ListPreference.java new file mode 100644 index 00000000..166a3796 --- /dev/null +++ b/Clover/app/src/main/java/org/floens/chan/ui/preferences/ListPreference.java @@ -0,0 +1,87 @@ +package org.floens.chan.ui.preferences; + +import android.view.Gravity; +import android.view.View; + +import org.floens.chan.core.preferences.Preference; +import org.floens.chan.ui.view.FloatingMenu; +import org.floens.chan.ui.view.FloatingMenuItem; + +import java.util.ArrayList; +import java.util.List; + +import static org.floens.chan.utils.AndroidUtils.dp; + +public class ListPreference extends PreferenceItem implements FloatingMenu.FloatingMenuCallback, View.OnClickListener { + public final Item[] items; + + private Preference preference; + + private int selected; + + public ListPreference(PreferencesController preferencesController, Preference preference, String name, Item[] items) { + super(preferencesController, name); + this.preference = preference; + this.items = items; + + selectItem(); + } + + public String getBottomDescription() { + return items[selected].name; + } + + public Preference getPreference() { + return preference; + } + + @Override + public void setView(View view) { + super.setView(view); + view.setOnClickListener(this); + } + + @Override + public void onClick(View v) { + List menuItems = new ArrayList<>(2); + + for (Item item : items) { + menuItems.add(new FloatingMenuItem(item.key, item.name)); + } + + FloatingMenu menu = new FloatingMenu(v.getContext()); + menu.setAnchor(v, Gravity.LEFT, dp(5), dp(5)); + menu.setPopupWidth(FloatingMenu.POPUP_WIDTH_ANCHOR); + menu.setCallback(this); + menu.setItems(menuItems); + menu.show(); + } + + @Override + public void onFloatingMenuItemClicked(FloatingMenu menu, FloatingMenuItem item) { + String selectedKey = (String) item.getId(); + preference.set(selectedKey); + selectItem(); + preferencesController.onPreferenceChange(this); + } + + private void selectItem() { + String selectedKey = preference.get(); + for (int i = 0; i < items.length; i++) { + if (items[i].key.equals(selectedKey)) { + selected = i; + break; + } + } + } + + public static class Item { + public final String name; + public final T key; + + public Item(String name, T key) { + this.name = name; + this.key = key; + } + } +} diff --git a/Clover/app/src/main/java/org/floens/chan/ui/preferences/PreferenceGroup.java b/Clover/app/src/main/java/org/floens/chan/ui/preferences/PreferenceGroup.java new file mode 100644 index 00000000..c94c8bb0 --- /dev/null +++ b/Clover/app/src/main/java/org/floens/chan/ui/preferences/PreferenceGroup.java @@ -0,0 +1,14 @@ +package org.floens.chan.ui.preferences; + +import java.util.ArrayList; +import java.util.List; + +public class PreferenceGroup { + public final String name; + + public PreferenceGroup(String name) { + this.name = name; + } + + public List preferenceItems = new ArrayList<>(); +} diff --git a/Clover/app/src/main/java/org/floens/chan/ui/preferences/PreferenceItem.java b/Clover/app/src/main/java/org/floens/chan/ui/preferences/PreferenceItem.java new file mode 100644 index 00000000..bcd1ae20 --- /dev/null +++ b/Clover/app/src/main/java/org/floens/chan/ui/preferences/PreferenceItem.java @@ -0,0 +1,29 @@ +package org.floens.chan.ui.preferences; + +import android.view.View; + +public abstract class PreferenceItem { + public PreferencesController preferencesController; + public final String name; + public View view; + + public PreferenceItem(PreferencesController preferencesController, String name) { + this.preferencesController = preferencesController; + this.name = name; + } + + public void setView(View view) { + this.view = view; + } + + public void setEnabled(boolean enabled) { + } + + public String getTopDescription() { + return name; + } + + public String getBottomDescription() { + return null; + } +} diff --git a/Clover/app/src/main/java/org/floens/chan/ui/preferences/PreferencesController.java b/Clover/app/src/main/java/org/floens/chan/ui/preferences/PreferencesController.java new file mode 100644 index 00000000..348a5446 --- /dev/null +++ b/Clover/app/src/main/java/org/floens/chan/ui/preferences/PreferencesController.java @@ -0,0 +1,137 @@ +package org.floens.chan.ui.preferences; + +import android.content.Context; +import android.content.res.Configuration; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.LinearLayout; +import android.widget.TextView; + +import org.floens.chan.R; +import org.floens.chan.controller.Controller; +import org.floens.chan.utils.AndroidUtils; + +import java.util.ArrayList; +import java.util.List; + +import static org.floens.chan.utils.AndroidUtils.dp; + +public class PreferencesController extends Controller implements AndroidUtils.OnMeasuredCallback { + protected LinearLayout content; + protected List groups = new ArrayList<>(); + + public PreferencesController(Context context) { + super(context); + } + + @Override + public void onCreate() { + super.onCreate(); + } + + @Override + public void onShow() { + super.onShow(); + + AndroidUtils.waitForLayout(view, this); + } + + @Override + public void onConfigurationChanged(Configuration newConfig) { + super.onConfigurationChanged(newConfig); + AndroidUtils.waitForLayout(view, this); + } + + @Override + public void onMeasured(View view, int width, int height) { + setMargins(); + } + + public void onPreferenceChange(PreferenceItem item) { + if (item instanceof ListPreference) { + setDescriptionText(item.view, item.getTopDescription(), item.getBottomDescription()); + } + } + + private void setMargins() { + boolean tablet = view.getWidth() > dp(500); // TODO is tablet + + int margin = 0; + if (tablet) { + margin = (int) (view.getWidth() * 0.1); + } + + int itemMargin = 0; + if (tablet) { + itemMargin = dp(16); + } + + List groups = AndroidUtils.findViewsById(content, R.id.group); + for (View group : groups) { + LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) group.getLayoutParams(); + params.leftMargin = margin; + params.rightMargin = margin; + group.setLayoutParams(params); + } + + List items = AndroidUtils.findViewsById(content, R.id.preference_item); + for (View item : items) { + item.setPadding(itemMargin, item.getPaddingTop(), itemMargin, item.getPaddingBottom()); + } + } + + protected void buildPreferences() { + LayoutInflater inf = LayoutInflater.from(context); + boolean firstGroup = true; + for (PreferenceGroup group : groups) { + LinearLayout groupLayout = (LinearLayout) inf.inflate(R.layout.preference_group, content, false); + ((TextView) groupLayout.findViewById(R.id.header)).setText(group.name); + + if (firstGroup) { + firstGroup = false; + ((LinearLayout.LayoutParams) groupLayout.getLayoutParams()).topMargin = 0; + } + + content.addView(groupLayout); + + for (int i = 0; i < group.preferenceItems.size(); i++) { + PreferenceItem preferenceItem = group.preferenceItems.get(i); + + ViewGroup preferenceView = null; + String topValue = preferenceItem.getTopDescription(); + String bottomValue = preferenceItem.getBottomDescription(); + + if ((preferenceItem instanceof ListPreference) || (preferenceItem instanceof LinkPreference)) { + preferenceView = (ViewGroup) inf.inflate(R.layout.preference_link, groupLayout, false); + } else if (preferenceItem instanceof BooleanPreference) { + preferenceView = (ViewGroup) inf.inflate(R.layout.preference_boolean, groupLayout, false); + } + + setDescriptionText(preferenceView, topValue, bottomValue); + + groupLayout.addView(preferenceView); + + preferenceItem.setView(preferenceView); + + if (i < group.preferenceItems.size() - 1) { + inf.inflate(R.layout.preference_divider, groupLayout, true); + } + } + } + } + + private void setDescriptionText(View view, String topText, String bottomText) { + ((TextView) view.findViewById(R.id.top)).setText(topText); + + TextView bottom = ((TextView) view.findViewById(R.id.bottom)); + if (bottom != null) { + if (bottomText == null) { + ViewGroup parent = (ViewGroup) bottom.getParent(); + parent.removeView(bottom); + } else { + bottom.setText(bottomText); + } + } + } +} diff --git a/Clover/app/src/main/java/org/floens/chan/ui/service/WatchNotifier.java b/Clover/app/src/main/java/org/floens/chan/ui/service/WatchNotifier.java index 848bdd06..41b60526 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/service/WatchNotifier.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/service/WatchNotifier.java @@ -28,7 +28,7 @@ import android.support.v4.app.NotificationCompat; import org.floens.chan.ChanApplication; import org.floens.chan.R; -import org.floens.chan.core.ChanPreferences; +import org.floens.chan.core.preferences.ChanPreferences; import org.floens.chan.core.manager.WatchManager; import org.floens.chan.core.model.Pin; import org.floens.chan.core.model.Post; diff --git a/Clover/app/src/main/java/org/floens/chan/ui/toolbar/NavigationItem.java b/Clover/app/src/main/java/org/floens/chan/ui/toolbar/NavigationItem.java index a71618eb..790699da 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/toolbar/NavigationItem.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/toolbar/NavigationItem.java @@ -19,10 +19,12 @@ package org.floens.chan.ui.toolbar; import android.widget.LinearLayout; +import org.floens.chan.ui.view.FloatingMenu; + public class NavigationItem { public String title = ""; public ToolbarMenu menu; public boolean hasBack = true; public LinearLayout view; - public ToolbarMenuSubMenu middleMenu; + public FloatingMenu middleMenu; } diff --git a/Clover/app/src/main/java/org/floens/chan/ui/toolbar/Toolbar.java b/Clover/app/src/main/java/org/floens/chan/ui/toolbar/Toolbar.java index 99c4f992..d9a9fb55 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/toolbar/Toolbar.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/toolbar/Toolbar.java @@ -26,7 +26,6 @@ import android.content.Context; import android.content.res.Configuration; import android.graphics.drawable.Drawable; import android.os.Build; -import android.support.v4.view.GravityCompat; import android.util.AttributeSet; import android.view.Gravity; import android.view.LayoutInflater; @@ -228,7 +227,7 @@ public class Toolbar extends LinearLayout implements View.OnClickListener { // black: titleView.setTextColor(Color.argb((int)(0.87 * 255.0), 0, 0, 0)); if (item.middleMenu != null) { - item.middleMenu.setAnchor(titleView, GravityCompat.END | Gravity.TOP, dp(5), dp(5)); // TODO gravity left doesn't work + item.middleMenu.setAnchor(titleView, Gravity.LEFT, dp(5), dp(5)); Drawable drawable = new DropdownArrowDrawable(); titleView.setCompoundDrawablesWithIntrinsicBounds(null, null, drawable, null); diff --git a/Clover/app/src/main/java/org/floens/chan/ui/toolbar/ToolbarMenuItem.java b/Clover/app/src/main/java/org/floens/chan/ui/toolbar/ToolbarMenuItem.java index 08709e03..a6f2fef4 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/toolbar/ToolbarMenuItem.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/toolbar/ToolbarMenuItem.java @@ -25,14 +25,16 @@ import android.widget.ImageView; import android.widget.LinearLayout; import org.floens.chan.R; +import org.floens.chan.ui.view.FloatingMenu; +import org.floens.chan.ui.view.FloatingMenuItem; import static org.floens.chan.utils.AndroidUtils.dp; import static org.floens.chan.utils.AndroidUtils.getAttrDrawable; -public class ToolbarMenuItem implements View.OnClickListener, ToolbarMenuSubMenu.ToolbarMenuItemSubMenuCallback { +public class ToolbarMenuItem implements View.OnClickListener, FloatingMenu.FloatingMenuCallback { private ToolbarMenuItemCallback callback; private int id; - private ToolbarMenuSubMenu subMenu; + private FloatingMenu subMenu; private ImageView imageView; @@ -65,7 +67,7 @@ public class ToolbarMenuItem implements View.OnClickListener, ToolbarMenuSubMenu } } - public void setSubMenu(ToolbarMenuSubMenu subMenu) { + public void setSubMenu(FloatingMenu subMenu) { this.subMenu = subMenu; subMenu.setCallback(this); } @@ -91,13 +93,13 @@ public class ToolbarMenuItem implements View.OnClickListener, ToolbarMenuSubMenu } @Override - public void onSubMenuItemClicked(ToolbarMenuSubMenu menu, ToolbarMenuSubItem item) { + public void onFloatingMenuItemClicked(FloatingMenu menu, FloatingMenuItem item) { callback.onSubMenuItemClicked(this, item); } public interface ToolbarMenuItemCallback { public void onMenuItemClicked(ToolbarMenuItem item); - public void onSubMenuItemClicked(ToolbarMenuItem parent, ToolbarMenuSubItem item); + public void onSubMenuItemClicked(ToolbarMenuItem parent, FloatingMenuItem item); } } diff --git a/Clover/app/src/main/java/org/floens/chan/ui/toolbar/ToolbarMenuSubMenu.java b/Clover/app/src/main/java/org/floens/chan/ui/view/FloatingMenu.java similarity index 76% rename from Clover/app/src/main/java/org/floens/chan/ui/toolbar/ToolbarMenuSubMenu.java rename to Clover/app/src/main/java/org/floens/chan/ui/view/FloatingMenu.java index a59c8c49..e1984948 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/toolbar/ToolbarMenuSubMenu.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/view/FloatingMenu.java @@ -15,10 +15,9 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package org.floens.chan.ui.toolbar; +package org.floens.chan.ui.view; import android.content.Context; -import android.support.v4.view.GravityCompat; import android.support.v7.widget.ListPopupWindow; import android.view.Gravity; import android.view.LayoutInflater; @@ -39,31 +38,34 @@ import java.util.List; import static org.floens.chan.utils.AndroidUtils.dp; -public class ToolbarMenuSubMenu { +public class FloatingMenu { + public static final int POPUP_WIDTH_AUTO = -1; + public static final int POPUP_WIDTH_ANCHOR = -2; + private final Context context; private View anchor; - private int anchorGravity; + private int anchorGravity = Gravity.LEFT; private int anchorOffsetX; private int anchorOffsetY; - private int popupWidth = -1; - private List items; - private ToolbarMenuSubItem selectedItem; + private int popupWidth = POPUP_WIDTH_AUTO; + private List items; + private FloatingMenuItem selectedItem; private ListAdapter adapter; private ViewTreeObserver.OnGlobalLayoutListener globalLayoutListener; private ListPopupWindow popupWindow; - private ToolbarMenuItemSubMenuCallback callback; + private FloatingMenuCallback callback; - public ToolbarMenuSubMenu(Context context, View anchor, List items) { + public FloatingMenu(Context context, View anchor, List items) { this.context = context; this.anchor = anchor; - anchorGravity = Gravity.RIGHT | Gravity.TOP; anchorOffsetX = -dp(5); anchorOffsetY = dp(5); + anchorGravity = Gravity.RIGHT; this.items = items; } - public ToolbarMenuSubMenu(Context context) { + public FloatingMenu(Context context) { this.context = context; } @@ -81,14 +83,14 @@ public class ToolbarMenuSubMenu { } } - public void setItems(List items) { + public void setItems(List items) { this.items = items; if (popupWindow != null) { popupWindow.dismiss(); } } - public void setSelectedItem(ToolbarMenuSubItem item) { + public void setSelectedItem(FloatingMenuItem item) { this.selectedItem = item; } @@ -96,7 +98,7 @@ public class ToolbarMenuSubMenu { this.adapter = adapter; } - public void setCallback(ToolbarMenuItemSubMenuCallback callback) { + public void setCallback(FloatingMenuCallback callback) { this.callback = callback; } @@ -104,13 +106,15 @@ public class ToolbarMenuSubMenu { popupWindow = new ListPopupWindow(context); popupWindow.setAnchorView(anchor); popupWindow.setModal(true); - popupWindow.setDropDownGravity(GravityCompat.END | Gravity.TOP); + popupWindow.setDropDownGravity(anchorGravity); popupWindow.setVerticalOffset(-anchor.getHeight() + anchorOffsetY); popupWindow.setHorizontalOffset(anchorOffsetX); - if (popupWidth > 0) { - popupWindow.setContentWidth(popupWidth); - } else { + if (popupWidth == POPUP_WIDTH_ANCHOR) { + popupWindow.setContentWidth(Math.min(dp(4 * 56), anchor.getWidth())); + } else if (popupWidth == POPUP_WIDTH_AUTO) { popupWindow.setContentWidth(dp(3 * 56)); + } else { + popupWindow.setContentWidth(popupWidth); } List stringItems = new ArrayList<>(items.size()); @@ -125,17 +129,17 @@ public class ToolbarMenuSubMenu { if (adapter != null) { popupWindow.setAdapter(adapter); } else { - popupWindow.setAdapter(new SubMenuArrayAdapter(context, R.layout.toolbar_menu_item, stringItems)); + popupWindow.setAdapter(new FloatingMenuArrayAdapter(context, R.layout.toolbar_menu_item, stringItems)); } popupWindow.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView parent, View view, int position, long id) { if (position >= 0 && position < items.size()) { - callback.onSubMenuItemClicked(ToolbarMenuSubMenu.this, items.get(position)); + callback.onFloatingMenuItemClicked(FloatingMenu.this, items.get(position)); popupWindow.dismiss(); } else { - callback.onSubMenuItemClicked(ToolbarMenuSubMenu.this, null); + callback.onFloatingMenuItemClicked(FloatingMenu.this, null); } } }); @@ -166,12 +170,12 @@ public class ToolbarMenuSubMenu { popupWindow.setSelection(selectedPosition); } - public interface ToolbarMenuItemSubMenuCallback { - public void onSubMenuItemClicked(ToolbarMenuSubMenu menu, ToolbarMenuSubItem item); + public interface FloatingMenuCallback { + public void onFloatingMenuItemClicked(FloatingMenu menu, FloatingMenuItem item); } - private static class SubMenuArrayAdapter extends ArrayAdapter { - public SubMenuArrayAdapter(Context context, int resource, List objects) { + private static class FloatingMenuArrayAdapter extends ArrayAdapter { + public FloatingMenuArrayAdapter(Context context, int resource, List objects) { super(context, resource, objects); } diff --git a/Clover/app/src/main/java/org/floens/chan/ui/toolbar/ToolbarMenuSubItem.java b/Clover/app/src/main/java/org/floens/chan/ui/view/FloatingMenuItem.java similarity index 84% rename from Clover/app/src/main/java/org/floens/chan/ui/toolbar/ToolbarMenuSubItem.java rename to Clover/app/src/main/java/org/floens/chan/ui/view/FloatingMenuItem.java index 8c317b09..d50f430a 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/toolbar/ToolbarMenuSubItem.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/view/FloatingMenuItem.java @@ -15,18 +15,18 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package org.floens.chan.ui.toolbar; +package org.floens.chan.ui.view; -public class ToolbarMenuSubItem { - private int id; +public class FloatingMenuItem { + private Object id; private String text; - public ToolbarMenuSubItem(int id, String text) { + public FloatingMenuItem(Object id, String text) { this.id = id; this.text = text; } - public int getId() { + public Object getId() { return id; } diff --git a/Clover/app/src/main/java/org/floens/chan/ui/view/ThumbnailImageView.java b/Clover/app/src/main/java/org/floens/chan/ui/view/ThumbnailImageView.java index ad6bb938..5fe88f62 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/view/ThumbnailImageView.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/view/ThumbnailImageView.java @@ -37,7 +37,7 @@ import com.koushikdutta.async.future.Future; import org.floens.chan.ChanApplication; import org.floens.chan.R; -import org.floens.chan.core.ChanPreferences; +import org.floens.chan.core.preferences.ChanPreferences; import org.floens.chan.utils.AndroidUtils; import org.floens.chan.utils.FileCache; import org.floens.chan.utils.Logger; diff --git a/Clover/app/src/main/java/org/floens/chan/utils/AndroidUtils.java b/Clover/app/src/main/java/org/floens/chan/utils/AndroidUtils.java index 58e0bbdc..cf6afef0 100644 --- a/Clover/app/src/main/java/org/floens/chan/utils/AndroidUtils.java +++ b/Clover/app/src/main/java/org/floens/chan/utils/AndroidUtils.java @@ -21,6 +21,7 @@ import android.app.Dialog; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; +import android.content.SharedPreferences; import android.content.res.Resources; import android.content.res.TypedArray; import android.graphics.Typeface; @@ -28,6 +29,7 @@ import android.graphics.drawable.Drawable; import android.net.Uri; import android.os.Handler; import android.os.Looper; +import android.preference.PreferenceManager; import android.util.Log; import android.view.View; import android.view.ViewGroup; @@ -38,7 +40,9 @@ import android.widget.Toast; import org.floens.chan.ChanApplication; import org.floens.chan.R; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; public class AndroidUtils { public final static ViewGroup.LayoutParams MATCH_PARAMS = new ViewGroup.LayoutParams( @@ -67,6 +71,10 @@ public class AndroidUtils { return ChanApplication.con; } + public static SharedPreferences getPreferences() { + return PreferenceManager.getDefaultSharedPreferences(ChanApplication.con); + } + public static void openLink(String link) { Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(link)); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); @@ -209,4 +217,21 @@ public class AndroidUtils { arr.recycle(); view.setBackgroundDrawable(drawable); } + + public static List findViewsById(ViewGroup root, int id) { + List views = new ArrayList<>(); + int childCount = root.getChildCount(); + for (int i = 0; i < childCount; i++) { + View child = root.getChildAt(i); + if (child instanceof ViewGroup) { + views.addAll(findViewsById((ViewGroup) child, id)); + } + + if (child.getId() == id) { + views.add(child); + } + } + + return views; + } } diff --git a/Clover/app/src/main/java/org/floens/chan/utils/ImageSaver.java b/Clover/app/src/main/java/org/floens/chan/utils/ImageSaver.java index db95a2b8..b23876e5 100644 --- a/Clover/app/src/main/java/org/floens/chan/utils/ImageSaver.java +++ b/Clover/app/src/main/java/org/floens/chan/utils/ImageSaver.java @@ -32,7 +32,7 @@ import com.koushikdutta.async.future.Future; import org.floens.chan.ChanApplication; import org.floens.chan.R; -import org.floens.chan.core.ChanPreferences; +import org.floens.chan.core.preferences.ChanPreferences; import java.io.File; import java.io.FileInputStream; diff --git a/Clover/app/src/main/java/org/floens/chan/utils/ThemeHelper.java b/Clover/app/src/main/java/org/floens/chan/utils/ThemeHelper.java index 029cad93..fd235b2c 100644 --- a/Clover/app/src/main/java/org/floens/chan/utils/ThemeHelper.java +++ b/Clover/app/src/main/java/org/floens/chan/utils/ThemeHelper.java @@ -22,7 +22,7 @@ import android.content.Context; import android.content.res.TypedArray; import org.floens.chan.R; -import org.floens.chan.core.ChanPreferences; +import org.floens.chan.core.preferences.ChanPreferences; public class ThemeHelper { public enum Theme { diff --git a/Clover/app/src/main/res/layout/preference_boolean.xml b/Clover/app/src/main/res/layout/preference_boolean.xml new file mode 100644 index 00000000..b88c6fda --- /dev/null +++ b/Clover/app/src/main/res/layout/preference_boolean.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + diff --git a/Clover/app/src/main/res/layout/preference_description.xml b/Clover/app/src/main/res/layout/preference_description.xml new file mode 100644 index 00000000..fa01af11 --- /dev/null +++ b/Clover/app/src/main/res/layout/preference_description.xml @@ -0,0 +1,25 @@ + + + + + diff --git a/Clover/app/src/main/res/layout/preference_divider.xml b/Clover/app/src/main/res/layout/preference_divider.xml new file mode 100644 index 00000000..de9934e6 --- /dev/null +++ b/Clover/app/src/main/res/layout/preference_divider.xml @@ -0,0 +1,6 @@ + + diff --git a/Clover/app/src/main/res/layout/preference_group.xml b/Clover/app/src/main/res/layout/preference_group.xml new file mode 100644 index 00000000..d2cfc65e --- /dev/null +++ b/Clover/app/src/main/res/layout/preference_group.xml @@ -0,0 +1,25 @@ + + + + + + \ No newline at end of file diff --git a/Clover/app/src/main/res/layout/preference_link.xml b/Clover/app/src/main/res/layout/preference_link.xml new file mode 100644 index 00000000..4345bb5d --- /dev/null +++ b/Clover/app/src/main/res/layout/preference_link.xml @@ -0,0 +1,13 @@ + + + + + + diff --git a/Clover/app/src/main/res/layout/root_layout.xml b/Clover/app/src/main/res/layout/root_layout.xml index 63495dc3..aa7287a4 100644 --- a/Clover/app/src/main/res/layout/root_layout.xml +++ b/Clover/app/src/main/res/layout/root_layout.xml @@ -32,7 +32,7 @@ along with this program. If not, see . android:layout_width="match_parent" android:layout_height="56dp" android:background="@color/primary" - android:elevation="8dp" /> + android:elevation="4dp" /> . --> - + android:background="#ffe5e5e5"> - + android:layout_height="wrap_content" /> - +