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" />
-
+