Moved a fair bit of settings to the new pattern.

tempwork
Floens 11 years ago
parent c8c89345e9
commit 4bdc0b20e4
  1. 4
      Clover/app/src/main/java/org/floens/chan/ChanApplication.java
  2. 4
      Clover/app/src/main/java/org/floens/chan/controller/Controller.java
  3. 10
      Clover/app/src/main/java/org/floens/chan/controller/NavigationController.java
  4. 6
      Clover/app/src/main/java/org/floens/chan/core/loader/ChanParser.java
  5. 8
      Clover/app/src/main/java/org/floens/chan/core/manager/ThreadManager.java
  6. 10
      Clover/app/src/main/java/org/floens/chan/core/manager/WatchManager.java
  7. 4
      Clover/app/src/main/java/org/floens/chan/core/presenter/ThreadPresenter.java
  8. 19
      Clover/app/src/main/java/org/floens/chan/core/settings/BooleanSetting.java
  9. 33
      Clover/app/src/main/java/org/floens/chan/core/settings/ChanSettings.java
  10. 10
      Clover/app/src/main/java/org/floens/chan/core/settings/Setting.java
  11. 6
      Clover/app/src/main/java/org/floens/chan/core/settings/StringSetting.java
  12. 8
      Clover/app/src/main/java/org/floens/chan/ui/activity/AdvancedSettingsActivity.java
  13. 4
      Clover/app/src/main/java/org/floens/chan/ui/activity/BaseActivity.java
  14. 2
      Clover/app/src/main/java/org/floens/chan/ui/activity/BoardActivity.java
  15. 12
      Clover/app/src/main/java/org/floens/chan/ui/activity/BoardEditor.java
  16. 24
      Clover/app/src/main/java/org/floens/chan/ui/activity/ChanActivity.java
  17. 4
      Clover/app/src/main/java/org/floens/chan/ui/activity/ImageViewActivity.java
  18. 22
      Clover/app/src/main/java/org/floens/chan/ui/activity/PassSettingsActivity.java
  19. 8
      Clover/app/src/main/java/org/floens/chan/ui/activity/WatchSettingsActivity.java
  20. 6
      Clover/app/src/main/java/org/floens/chan/ui/adapter/PinnedAdapter.java
  21. 29
      Clover/app/src/main/java/org/floens/chan/ui/animation/HeightAnimation.java
  22. 2
      Clover/app/src/main/java/org/floens/chan/ui/animation/ScrollerRunnable.java
  23. 2
      Clover/app/src/main/java/org/floens/chan/ui/animation/SwipeDismissListViewTouchListener.java
  24. 2
      Clover/app/src/main/java/org/floens/chan/ui/animation/ViewFlipperAnimations.java
  25. 36
      Clover/app/src/main/java/org/floens/chan/ui/controller/AdvancedSettingsController.java
  26. 196
      Clover/app/src/main/java/org/floens/chan/ui/controller/MainSettingsController.java
  27. 2
      Clover/app/src/main/java/org/floens/chan/ui/controller/RootNavigationController.java
  28. 14
      Clover/app/src/main/java/org/floens/chan/ui/fragment/ImageViewFragment.java
  29. 4
      Clover/app/src/main/java/org/floens/chan/ui/fragment/PostRepliesFragment.java
  30. 14
      Clover/app/src/main/java/org/floens/chan/ui/fragment/ReplyFragment.java
  31. 12
      Clover/app/src/main/java/org/floens/chan/ui/fragment/SettingsFragment.java
  32. 4
      Clover/app/src/main/java/org/floens/chan/ui/fragment/ThreadFragment.java
  33. 4
      Clover/app/src/main/java/org/floens/chan/ui/layout/ThreadLayout.java
  34. 40
      Clover/app/src/main/java/org/floens/chan/ui/preferences/BooleanPreference.java
  35. 64
      Clover/app/src/main/java/org/floens/chan/ui/preferences/BooleanSettingView.java
  36. 23
      Clover/app/src/main/java/org/floens/chan/ui/preferences/LinkPreference.java
  37. 37
      Clover/app/src/main/java/org/floens/chan/ui/preferences/LinkSettingView.java
  38. 33
      Clover/app/src/main/java/org/floens/chan/ui/preferences/ListSettingView.java
  39. 14
      Clover/app/src/main/java/org/floens/chan/ui/preferences/PreferenceGroup.java
  40. 8
      Clover/app/src/main/java/org/floens/chan/ui/preferences/SettingView.java
  41. 75
      Clover/app/src/main/java/org/floens/chan/ui/preferences/SettingsController.java
  42. 18
      Clover/app/src/main/java/org/floens/chan/ui/preferences/SettingsGroup.java
  43. 64
      Clover/app/src/main/java/org/floens/chan/ui/preferences/StringSettingView.java
  44. 8
      Clover/app/src/main/java/org/floens/chan/ui/service/WatchNotifier.java
  45. 11
      Clover/app/src/main/java/org/floens/chan/ui/toolbar/NavigationItem.java
  46. 4
      Clover/app/src/main/java/org/floens/chan/ui/toolbar/Toolbar.java
  47. 16
      Clover/app/src/main/java/org/floens/chan/ui/toolbar/ToolbarMenu.java
  48. 6
      Clover/app/src/main/java/org/floens/chan/ui/toolbar/ToolbarMenuItem.java
  49. 15
      Clover/app/src/main/java/org/floens/chan/ui/view/FloatingMenu.java
  50. 4
      Clover/app/src/main/java/org/floens/chan/ui/view/ThumbnailImageView.java
  51. 25
      Clover/app/src/main/java/org/floens/chan/utils/AndroidUtils.java
  52. 6
      Clover/app/src/main/java/org/floens/chan/utils/ImageSaver.java
  53. 6
      Clover/app/src/main/java/org/floens/chan/utils/ThemeHelper.java
  54. 5
      Clover/app/src/main/res/drawable/preference_description_bottom.xml
  55. 5
      Clover/app/src/main/res/drawable/preference_description_top.xml
  56. 2
      Clover/app/src/main/res/layout/setting_boolean.xml
  57. 4
      Clover/app/src/main/res/layout/setting_description.xml
  58. 0
      Clover/app/src/main/res/layout/setting_divider.xml
  59. 2
      Clover/app/src/main/res/layout/setting_group.xml
  60. 2
      Clover/app/src/main/res/layout/setting_link.xml
  61. 2
      Clover/app/src/main/res/layout/settings_layout.xml
  62. 29
      Clover/app/src/main/res/values/strings.xml

@ -33,7 +33,7 @@ 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.core.settings.ChanSettings;
import org.floens.chan.database.DatabaseManager;
import org.floens.chan.utils.AndroidUtils;
import org.floens.chan.utils.FileCache;
@ -131,7 +131,7 @@ public class ChanApplication extends Application {
AndroidUtils.init();
ChanUrls.loadScheme(ChanPreferences.getNetworkHttps());
ChanUrls.loadScheme(ChanSettings.getNetworkHttps());
IconCache.createIcons(this);

@ -58,4 +58,8 @@ public abstract class Controller {
public boolean onBack() {
return false;
}
public String string(int id) {
return context.getString(id);
}
}

@ -46,7 +46,7 @@ public abstract class NavigationController extends Controller implements Control
public boolean pushController(final Controller to) {
if (blockingInput) return false;
if (this.controllerTransition != null) {
if (controllerTransition != null) {
throw new IllegalArgumentException("Cannot push controller while a transition is in progress.");
}
@ -64,7 +64,7 @@ public abstract class NavigationController extends Controller implements Control
container.addView(to.view, FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT);
AndroidUtils.waitForMeasure(to.view, new AndroidUtils.OnMeasuredCallback() {
@Override
public void onMeasured(View view, int width, int height) {
public void onMeasured(View view) {
to.onShow();
doTransition(true, from, to, controllerTransition);
@ -77,7 +77,7 @@ public abstract class NavigationController extends Controller implements Control
public boolean popController() {
if (blockingInput) return false;
if (this.controllerTransition != null) {
if (controllerTransition != null) {
throw new IllegalArgumentException("Cannot pop controller while a transition is in progress.");
}
@ -94,7 +94,7 @@ public abstract class NavigationController extends Controller implements Control
container.addView(to.view, 0, new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT));
AndroidUtils.waitForMeasure(to.view, new AndroidUtils.OnMeasuredCallback() {
@Override
public void onMeasured(View view, int width, int height) {
public void onMeasured(View view) {
to.onShow();
doTransition(false, from, to, controllerTransition);
@ -158,7 +158,7 @@ public abstract class NavigationController extends Controller implements Control
AndroidUtils.waitForMeasure(controller.view, new AndroidUtils.OnMeasuredCallback() {
@Override
public void onMeasured(View view, int width, int height) {
public void onMeasured(View view) {
onCreate();
onShow();

@ -31,7 +31,7 @@ import android.text.style.TypefaceSpan;
import org.floens.chan.ChanApplication;
import org.floens.chan.R;
import org.floens.chan.core.preferences.ChanPreferences;
import org.floens.chan.core.settings.ChanSettings;
import org.floens.chan.core.model.Post;
import org.floens.chan.core.model.PostLinkable;
import org.floens.chan.utils.ThemeHelper;
@ -88,8 +88,8 @@ public class ChanParser {
}
private void parseSpans(Post post, TypedArray ta) {
boolean anonymize = ChanPreferences.getAnonymize();
boolean anonymizeIds = ChanPreferences.getAnonymizeIds();
boolean anonymize = ChanSettings.getAnonymize();
boolean anonymizeIds = ChanSettings.getAnonymizeIds();
if (anonymize) {
post.name = ChanApplication.getInstance().getString(R.string.default_name);

@ -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.preferences.ChanPreferences;
import org.floens.chan.core.settings.ChanSettings;
import org.floens.chan.core.loader.ChanLoader;
import org.floens.chan.core.loader.LoaderPool;
import org.floens.chan.core.manager.ReplyManager.DeleteListener;
@ -148,7 +148,7 @@ public class ThreadManager implements ChanLoader.ChanLoaderCallback {
public boolean isWatching() {
if (!chanLoader.getLoadable().isThreadMode()) {
return false;
} else if (!ChanPreferences.getThreadAutoRefresh()) {
} else if (!ChanSettings.getThreadAutoRefresh()) {
return false;
} else if (chanLoader.getThread() != null && chanLoader.getThread().closed) {
return false;
@ -249,7 +249,7 @@ public class ThreadManager implements ChanLoader.ChanLoaderCallback {
menu.add(Menu.NONE, 7, Menu.NONE, activity.getString(R.string.delete));
}
if (ChanPreferences.getDeveloper()) {
if (ChanSettings.getDeveloper()) {
menu.add(Menu.NONE, 8, Menu.NONE, "Make this a saved reply");
}
@ -436,7 +436,7 @@ public class ThreadManager implements ChanLoader.ChanLoaderCallback {
showPostsRepliesFragment(l);
}
} else if (linkable.type == PostLinkable.Type.LINK) {
if (ChanPreferences.getOpenLinkConfirmation()) {
if (ChanSettings.getOpenLinkConfirmation()) {
new AlertDialog.Builder(activity)
.setNegativeButton(R.string.cancel, null)
.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {

@ -21,7 +21,7 @@ import android.content.Context;
import android.content.Intent;
import org.floens.chan.ChanApplication;
import org.floens.chan.core.preferences.ChanPreferences;
import org.floens.chan.core.settings.ChanSettings;
import org.floens.chan.core.model.Loadable;
import org.floens.chan.core.model.Pin;
import org.floens.chan.core.model.Post;
@ -92,7 +92,7 @@ public class WatchManager implements ChanApplication.ForegroundChangedListener {
}
public List<Pin> getWatchingPins() {
if (ChanPreferences.getWatchEnabled()) {
if (ChanSettings.getWatchEnabled()) {
List<Pin> l = new ArrayList<>();
for (Pin p : pins) {
@ -242,11 +242,11 @@ public class WatchManager implements ChanApplication.ForegroundChangedListener {
}
public boolean getWatchBackgroundEnabled() {
return ChanPreferences.getWatchBackgroundEnabled();
return ChanSettings.getWatchBackgroundEnabled();
}
private void updatePinWatchers() {
updatePinWatchers(ChanPreferences.getWatchEnabled());
updatePinWatchers(ChanSettings.getWatchEnabled());
}
private void updatePinWatchers(boolean watchEnabled) {
@ -282,7 +282,7 @@ public class WatchManager implements ChanApplication.ForegroundChangedListener {
setTimer(invokeLoadNow ? 1 : FOREGROUND_TIME);
} else {
if (backgroundEnabled) {
setTimer(ChanPreferences.getWatchBackgroundTimeout());
setTimer(ChanSettings.getWatchBackgroundTimeout());
} else {
if (pendingTimer != null) {
pendingTimer.cancel();

@ -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.preferences.ChanPreferences;
import org.floens.chan.core.settings.ChanSettings;
import org.floens.chan.core.loader.ChanLoader;
import org.floens.chan.core.loader.LoaderPool;
import org.floens.chan.core.model.ChanThread;
@ -161,7 +161,7 @@ public class ThreadPresenter implements ChanLoader.ChanLoaderCallback, PostAdapt
menu.add(Menu.NONE, 7, Menu.NONE, AndroidUtils.getRes().getString(R.string.delete));
}
if (ChanPreferences.getDeveloper()) {
if (ChanSettings.getDeveloper()) {
menu.add(Menu.NONE, 8, Menu.NONE, "Make this a saved reply");
}
}

@ -0,0 +1,19 @@
package org.floens.chan.core.settings;
import android.content.SharedPreferences;
public class BooleanSetting extends Setting<Boolean> {
public BooleanSetting(SharedPreferences sharedPreferences, String key, boolean def) {
super(sharedPreferences, key, def);
}
@Override
public Boolean get() {
return sharedPreferences.getBoolean(key, def);
}
@Override
public void set(Boolean value) {
sharedPreferences.edit().putBoolean(key, value).apply();
}
}

@ -15,7 +15,7 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.floens.chan.core.preferences;
package org.floens.chan.core.settings;
import android.content.SharedPreferences;
import android.os.Environment;
@ -25,14 +25,35 @@ import org.floens.chan.utils.AndroidUtils;
import java.io.File;
public class ChanPreferences {
public static StringPreference defaultName;
public static StringPreference testTheme;
public class ChanSettings {
public static StringSetting theme;
public static StringSetting fontSize;
public static BooleanSetting openLinkConfirmation;
public static BooleanSetting autoRefreshThread;
public static BooleanSetting imageAutoLoad;
public static BooleanSetting videoAutoLoad;
public static BooleanSetting videoOpenExternal;
public static StringSetting postDefaultName;
public static BooleanSetting postPinThread;
public static BooleanSetting developer;
static {
SharedPreferences p = AndroidUtils.getPreferences();
defaultName = new StringPreference(p, "preference_default_name", "");
testTheme = new StringPreference(p, "preference_test_theme", "dark");
theme = new StringSetting(p, "preference_theme", "light");
fontSize = new StringSetting(p, "preference_font", "14");
openLinkConfirmation = new BooleanSetting(p, "preference_open_link_confirmation", true);
autoRefreshThread = new BooleanSetting(p, "preference_auto_refresh_thread", true);
imageAutoLoad = new BooleanSetting(p, "preference_image_auto_load", true);
videoAutoLoad = new BooleanSetting(p, "preference_autoplay", false);
videoOpenExternal = new BooleanSetting(p, "preference_video_external", false);
postDefaultName = new StringSetting(p, "preference_default_name", "");
postPinThread = new BooleanSetting(p, "preference_pin_on_post", false);
developer = new BooleanSetting(p, "preference_developer", false);
}
private static SharedPreferences p() {

@ -1,13 +1,13 @@
package org.floens.chan.core.preferences;
package org.floens.chan.core.settings;
import android.content.SharedPreferences;
public abstract class Preference<T> {
public abstract class Setting<T> {
protected final SharedPreferences sharedPreferences;
protected final String key;
protected final T def;
public Preference(SharedPreferences sharedPreferences, String key, T def) {
public Setting(SharedPreferences sharedPreferences, String key, T def) {
this.sharedPreferences = sharedPreferences;
this.key = key;
this.def = def;
@ -16,4 +16,8 @@ public abstract class Preference<T> {
public abstract T get();
public abstract void set(T value);
public T getDefault() {
return def;
}
}

@ -1,9 +1,9 @@
package org.floens.chan.core.preferences;
package org.floens.chan.core.settings;
import android.content.SharedPreferences;
public class StringPreference extends Preference<String> {
public StringPreference(SharedPreferences sharedPreferences, String key, String def) {
public class StringSetting extends Setting<String> {
public StringSetting(SharedPreferences sharedPreferences, String key, String def) {
super(sharedPreferences, key, def);
}

@ -24,7 +24,7 @@ import android.preference.PreferenceFragment;
import org.floens.chan.R;
import org.floens.chan.chan.ChanUrls;
import org.floens.chan.core.preferences.ChanPreferences;
import org.floens.chan.core.settings.ChanSettings;
import org.floens.chan.ui.ThemeActivity;
import org.floens.chan.ui.fragment.FolderPickFragment;
@ -95,13 +95,13 @@ public class AdvancedSettingsActivity extends ThemeActivity {
saveLocation.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference) {
File dir = ChanPreferences.getImageSaveDirectory();
File dir = ChanSettings.getImageSaveDirectory();
dir.mkdirs();
FolderPickFragment frag = FolderPickFragment.newInstance(new FolderPickFragment.FolderPickListener() {
@Override
public void folderPicked(File path) {
ChanPreferences.setImageSaveDirectory(path);
ChanSettings.setImageSaveDirectory(path);
reloadSavePath();
}
}, dir);
@ -123,7 +123,7 @@ public class AdvancedSettingsActivity extends ThemeActivity {
private void reloadSavePath() {
Preference saveLocation = findPreference("preference_image_save_location");
saveLocation.setSummary(ChanPreferences.getImageSaveDirectory().getAbsolutePath());
saveLocation.setSummary(ChanSettings.getImageSaveDirectory().getAbsolutePath());
}
private void updateSummary(ListPreference list, String value) {

@ -50,8 +50,8 @@ import org.floens.chan.core.model.ChanThread;
import org.floens.chan.core.model.Loadable;
import org.floens.chan.core.model.Pin;
import org.floens.chan.core.model.Post;
import org.floens.chan.ui.SwipeDismissListViewTouchListener;
import org.floens.chan.ui.SwipeDismissListViewTouchListener.DismissCallbacks;
import org.floens.chan.ui.animation.SwipeDismissListViewTouchListener;
import org.floens.chan.ui.animation.SwipeDismissListViewTouchListener.DismissCallbacks;
import org.floens.chan.ui.ThemeActivity;
import org.floens.chan.ui.adapter.PinnedAdapter;
import org.floens.chan.utils.AndroidUtils;

@ -21,7 +21,6 @@ import android.app.Activity;
import android.content.res.Configuration;
import android.os.Bundle;
import org.floens.chan.controller.NavigationController;
import org.floens.chan.ui.controller.BrowseController;
import org.floens.chan.ui.controller.RootNavigationController;
import org.floens.chan.utils.ThemeHelper;
@ -34,7 +33,6 @@ public class BoardActivity extends Activity {
private static final String TAG = "StartActivity";
private RootNavigationController rootNavigationController;
private NavigationController navigationController;
@Override
protected void onCreate(Bundle savedInstanceState) {

@ -47,10 +47,10 @@ import com.mobeta.android.dslv.DragSortListView;
import org.floens.chan.ChanApplication;
import org.floens.chan.R;
import org.floens.chan.core.preferences.ChanPreferences;
import org.floens.chan.core.settings.ChanSettings;
import org.floens.chan.core.manager.BoardManager;
import org.floens.chan.core.model.Board;
import org.floens.chan.ui.SwipeDismissListViewTouchListener;
import org.floens.chan.ui.animation.SwipeDismissListViewTouchListener;
import org.floens.chan.ui.ThemeActivity;
import org.floens.chan.utils.AndroidUtils;
@ -173,7 +173,7 @@ public class BoardEditor extends ThemeActivity {
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.board_edit, menu);
menu.findItem(R.id.action_show_filler).setChecked(ChanPreferences.getBoardEditorFillerEnabled());
menu.findItem(R.id.action_show_filler).setChecked(ChanSettings.getBoardEditorFillerEnabled());
return true;
}
@ -185,8 +185,8 @@ public class BoardEditor extends ThemeActivity {
showAddBoardDialog();
return true;
case R.id.action_show_filler:
ChanPreferences.setBoardEditorFillerEnabled(!ChanPreferences.getBoardEditorFillerEnabled());
item.setChecked(ChanPreferences.getBoardEditorFillerEnabled());
ChanSettings.setBoardEditorFillerEnabled(!ChanSettings.getBoardEditorFillerEnabled());
item.setChecked(ChanSettings.getBoardEditorFillerEnabled());
return true;
case android.R.id.home:
finish();
@ -297,7 +297,7 @@ public class BoardEditor extends ThemeActivity {
protected void publishResults(CharSequence constraint, FilterResults results) {
filtered.clear();
if (ChanPreferences.getBoardEditorFillerEnabled()) {
if (ChanSettings.getBoardEditorFillerEnabled()) {
if (results.values != null) {
filtered.addAll((List<Board>) results.values);
} else {

@ -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.preferences.ChanPreferences;
import org.floens.chan.core.settings.ChanSettings;
import org.floens.chan.core.loader.ChanLoader;
import org.floens.chan.core.manager.BoardManager;
import org.floens.chan.core.manager.ThreadManager;
@ -303,7 +303,7 @@ public class ChanActivity extends BaseActivity implements AdapterView.OnItemSele
// Nexus 7 is 600 x 960 dp
// Nexus 10 is 800 x 1280 dp
if (ChanPreferences.getForcePhoneLayout()) {
if (ChanSettings.getForcePhoneLayout()) {
leftParams.width = width - dp(30);
rightParams.width = width;
isSlidable = true;
@ -425,9 +425,9 @@ public class ChanActivity extends BaseActivity implements AdapterView.OnItemSele
setMenuItemEnabled(menu.findItem(R.id.action_board_view_mode), !slidable || open);
if (ChanPreferences.getBoardViewMode().equals("list")) {
if (ChanSettings.getBoardViewMode().equals("list")) {
menu.findItem(R.id.action_board_view_mode_list).setChecked(true);
} else if (ChanPreferences.getBoardViewMode().equals("grid")) {
} else if (ChanSettings.getBoardViewMode().equals("grid")) {
menu.findItem(R.id.action_board_view_mode_grid).setChecked(true);
}
@ -504,15 +504,15 @@ public class ChanActivity extends BaseActivity implements AdapterView.OnItemSele
return true;
case R.id.action_board_view_mode_grid:
if (!ChanPreferences.getBoardViewMode().equals("grid")) {
ChanPreferences.setBoardViewMode("grid");
if (!ChanSettings.getBoardViewMode().equals("grid")) {
ChanSettings.setBoardViewMode("grid");
setBoardFragmentViewMode();
startLoadingBoard(boardLoadable);
}
return true;
case R.id.action_board_view_mode_list:
if (!ChanPreferences.getBoardViewMode().equals("list")) {
ChanPreferences.setBoardViewMode("list");
if (!ChanSettings.getBoardViewMode().equals("list")) {
ChanSettings.setBoardViewMode("list");
setBoardFragmentViewMode();
startLoadingBoard(boardLoadable);
}
@ -556,9 +556,9 @@ public class ChanActivity extends BaseActivity implements AdapterView.OnItemSele
boardLoadable = loadable;
if (ChanPreferences.getBoardMode().equals("catalog")) {
if (ChanSettings.getBoardMode().equals("catalog")) {
boardLoadable.mode = Loadable.Mode.CATALOG;
} else if (ChanPreferences.getBoardMode().equals("pages")) {
} else if (ChanSettings.getBoardMode().equals("pages")) {
boardLoadable.mode = Loadable.Mode.BOARD;
}
@ -667,9 +667,9 @@ public class ChanActivity extends BaseActivity implements AdapterView.OnItemSele
}
private void setBoardFragmentViewMode() {
if (ChanPreferences.getBoardViewMode().equals("list")) {
if (ChanSettings.getBoardViewMode().equals("list")) {
boardFragment.setViewMode(ThreadManager.ViewMode.LIST);
} else if (ChanPreferences.getBoardViewMode().equals("grid")) {
} else if (ChanSettings.getBoardViewMode().equals("grid")) {
boardFragment.setViewMode(ThreadManager.ViewMode.GRID);
}
}

@ -29,7 +29,7 @@ import android.widget.ProgressBar;
import org.floens.chan.R;
import org.floens.chan.chan.ImageSearch;
import org.floens.chan.core.preferences.ChanPreferences;
import org.floens.chan.core.settings.ChanSettings;
import org.floens.chan.core.manager.ThreadManager;
import org.floens.chan.core.model.Post;
import org.floens.chan.ui.ThemeActivity;
@ -213,7 +213,7 @@ public class ImageViewActivity extends ThemeActivity implements ViewPager.OnPage
String filename;
for (Post post : adapter.getList()) {
filename = (ChanPreferences.getImageSaveOriginalFilename() ? post.tim : post.filename) + "." + post.ext;
filename = (ChanSettings.getImageSaveOriginalFilename() ? post.tim : post.filename) + "." + post.ext;
list.add(new ImageSaver.DownloadPair(post.imageUrl, filename));
}

@ -37,7 +37,7 @@ import android.widget.TextView;
import org.floens.chan.ChanApplication;
import org.floens.chan.R;
import org.floens.chan.core.preferences.ChanPreferences;
import org.floens.chan.core.settings.ChanSettings;
import org.floens.chan.core.manager.ReplyManager;
import org.floens.chan.core.manager.ReplyManager.PassResponse;
import org.floens.chan.core.model.Pass;
@ -67,17 +67,17 @@ public class PassSettingsActivity extends ThemeActivity implements OnCheckedChan
toggleStatus = (TextView) findViewById(R.id.toggle_status);
onSwitch = (SwitchCompat) findViewById(R.id.toggle);
onSwitch.setOnCheckedChangeListener(this);
setSwitch(ChanPreferences.getPassEnabled());
setSwitch(ChanSettings.getPassEnabled());
setFragment(ChanPreferences.getPassEnabled());
setFragment(ChanSettings.getPassEnabled());
}
@Override
public void onPause() {
super.onPause();
if (TextUtils.isEmpty(ChanPreferences.getPassId())) {
ChanPreferences.setPassEnabled(false);
if (TextUtils.isEmpty(ChanSettings.getPassId())) {
ChanSettings.setPassEnabled(false);
setSwitch(false);
}
}
@ -92,7 +92,7 @@ public class PassSettingsActivity extends ThemeActivity implements OnCheckedChan
onSwitch.setChecked(enabled);
toggleStatus.setText(enabled ? R.string.on : R.string.off);
ChanPreferences.setPassEnabled(enabled);
ChanSettings.setPassEnabled(enabled);
}
private void setFragment(boolean enabled) {
@ -137,7 +137,7 @@ public class PassSettingsActivity extends ThemeActivity implements OnCheckedChan
login.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference) {
Pass pass = new Pass(ChanPreferences.getPassToken(), ChanPreferences.getPassPin());
Pass pass = new Pass(ChanSettings.getPassToken(), ChanSettings.getPassPin());
onLoginClick(pass);
return true;
@ -148,11 +148,11 @@ public class PassSettingsActivity extends ThemeActivity implements OnCheckedChan
}
private void updateLoginButton() {
findPreference("preference_pass_login").setTitle(TextUtils.isEmpty(ChanPreferences.getPassId()) ? R.string.pass_login : R.string.pass_logout);
findPreference("preference_pass_login").setTitle(TextUtils.isEmpty(ChanSettings.getPassId()) ? R.string.pass_login : R.string.pass_logout);
}
private void onLoginClick(Pass pass) {
if (TextUtils.isEmpty(ChanPreferences.getPassId())) {
if (TextUtils.isEmpty(ChanSettings.getPassId())) {
// Login
final ProgressDialog dialog = ProgressDialog.show(getActivity(), null, "Logging in");
@ -175,7 +175,7 @@ public class PassSettingsActivity extends ThemeActivity implements OnCheckedChan
} else {
new AlertDialog.Builder(getActivity()).setMessage(response.message)
.setNeutralButton(R.string.ok, null).show();
ChanPreferences.setPassId(response.passId);
ChanSettings.setPassId(response.passId);
}
updateLoginButton();
@ -183,7 +183,7 @@ public class PassSettingsActivity extends ThemeActivity implements OnCheckedChan
});
} else {
// Logout
ChanPreferences.setPassId("");
ChanSettings.setPassId("");
updateLoginButton();
}
}

@ -34,7 +34,7 @@ import android.widget.TextView;
import org.floens.chan.ChanApplication;
import org.floens.chan.R;
import org.floens.chan.core.preferences.ChanPreferences;
import org.floens.chan.core.settings.ChanSettings;
import org.floens.chan.ui.ThemeActivity;
public class WatchSettingsActivity extends ThemeActivity implements OnCheckedChangeListener {
@ -60,9 +60,9 @@ public class WatchSettingsActivity extends ThemeActivity implements OnCheckedCha
toggleStatus = (TextView) findViewById(R.id.toggle_status);
watchSwitch = (SwitchCompat) findViewById(R.id.toggle);
watchSwitch.setOnCheckedChangeListener(this);
setSwitch(ChanPreferences.getWatchEnabled());
setSwitch(ChanSettings.getWatchEnabled());
setFragment(ChanPreferences.getWatchEnabled());
setFragment(ChanSettings.getWatchEnabled());
}
@Override
@ -75,7 +75,7 @@ public class WatchSettingsActivity extends ThemeActivity implements OnCheckedCha
watchSwitch.setChecked(enabled);
toggleStatus.setText(enabled ? R.string.on : R.string.off);
ChanPreferences.setWatchEnabled(enabled);
ChanSettings.setWatchEnabled(enabled);
}
private void setFragment(boolean enabled) {

@ -32,7 +32,7 @@ import android.widget.TextView;
import org.floens.chan.ChanApplication;
import org.floens.chan.R;
import org.floens.chan.core.preferences.ChanPreferences;
import org.floens.chan.core.settings.ChanSettings;
import org.floens.chan.core.model.Pin;
import org.floens.chan.ui.view.CustomNetworkImageView;
@ -133,11 +133,11 @@ public class PinnedAdapter extends BaseAdapter {
FrameLayout timeContainer = (FrameLayout) convertView.findViewById(R.id.pin_time_container);
FrameLayout countContainer = (FrameLayout) convertView.findViewById(R.id.pin_count_container);
if (ChanPreferences.getWatchEnabled()) {
if (ChanSettings.getWatchEnabled()) {
countContainer.setVisibility(View.VISIBLE);
TextView timeView = (TextView) convertView.findViewById(R.id.pin_time);
if (pin.watching && pin.getPinWatcher() != null && ChanPreferences.getWatchCountdownVisibleEnabled()) {
if (pin.watching && pin.getPinWatcher() != null && ChanSettings.getWatchCountdownVisibleEnabled()) {
timeContainer.setVisibility(View.VISIBLE);
long timeRaw = pin.getPinWatcher().getTimeUntilNextLoad();
long time = 0;

@ -0,0 +1,29 @@
package org.floens.chan.ui.animation;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.Transformation;
public class HeightAnimation extends Animation {
final int startHeight;
final int targetHeight;
View view;
public HeightAnimation(View view, int startHeight, int targetHeight, int duration) {
this.view = view;
this.startHeight = startHeight;
this.targetHeight = targetHeight;
setDuration(duration);
}
@Override
protected void applyTransformation(float interpolatedTime, Transformation t) {
view.getLayoutParams().height = (int) (startHeight + (targetHeight - startHeight) * interpolatedTime);
view.requestLayout();
}
@Override
public boolean willChangeBounds() {
return true;
}
}

@ -15,7 +15,7 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.floens.chan.ui;
package org.floens.chan.ui.animation;
import android.view.View;
import android.view.ViewConfiguration;

@ -14,7 +14,7 @@
* limitations under the License.
*/
package org.floens.chan.ui;
package org.floens.chan.ui.animation;
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;

@ -15,7 +15,7 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.floens.chan.ui;
package org.floens.chan.ui.animation;
import android.view.animation.AccelerateDecelerateInterpolator;
import android.view.animation.Animation;

@ -0,0 +1,36 @@
package org.floens.chan.ui.controller;
import android.content.Context;
import android.widget.LinearLayout;
import org.floens.chan.R;
import org.floens.chan.ui.preferences.LinkSettingView;
import org.floens.chan.ui.preferences.SettingsGroup;
import org.floens.chan.ui.preferences.SettingsController;
public class AdvancedSettingsController extends SettingsController {
public AdvancedSettingsController(Context context) {
super(context);
}
@Override
public void onCreate() {
super.onCreate();
navigationItem.title = string(R.string.settings_advanced_label);
view = inflateRes(R.layout.settings_layout);
content = (LinearLayout) view.findViewById(R.id.scrollview_content);
populatePreferences();
buildPreferences();
}
private void populatePreferences() {
SettingsGroup settings = new SettingsGroup(string(R.string.settings_advanced_label));
settings.settingViews.add(new LinkSettingView(this, "Hallo", null, null));
groups.add(settings);
}
}

@ -17,22 +17,37 @@
*/
package org.floens.chan.ui.controller;
import android.app.AlertDialog;
import android.content.Context;
import android.content.pm.PackageManager;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.Toast;
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;
import org.floens.chan.core.settings.ChanSettings;
import org.floens.chan.ui.preferences.BooleanSettingView;
import org.floens.chan.ui.preferences.LinkSettingView;
import org.floens.chan.ui.preferences.ListSettingView;
import org.floens.chan.ui.preferences.SettingView;
import org.floens.chan.ui.preferences.SettingsController;
import org.floens.chan.ui.preferences.SettingsGroup;
import org.floens.chan.ui.preferences.StringSettingView;
import org.floens.chan.ui.toolbar.ToolbarMenu;
import org.floens.chan.ui.toolbar.ToolbarMenuItem;
import org.floens.chan.ui.view.FloatingMenuItem;
import org.floens.chan.utils.AndroidUtils;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class MainSettingsController extends SettingsController implements ToolbarMenuItem.ToolbarMenuItemCallback {
private static final int ADVANCED_SETTINGS = 1;
private SettingView imageAutoLoadView;
private SettingView videoAutoLoadView;
private int clickCount;
private SettingView developerView;
public MainSettingsController(Context context) {
super(context);
@ -42,9 +57,11 @@ public class MainSettingsController extends PreferencesController {
public void onCreate() {
super.onCreate();
//TODO correct header colors, background, themeing
navigationItem.title = context.getString(R.string.action_settings);
navigationItem.title = s(R.string.action_settings);
navigationItem.menu = new ToolbarMenu(context);
navigationItem.createOverflow(context, this, Arrays.asList(
new FloatingMenuItem(ADVANCED_SETTINGS, s(R.string.action_settings_advanced))
));
view = inflateRes(R.layout.settings_layout);
content = (LinearLayout) view.findViewById(R.id.scrollview_content);
@ -52,55 +69,134 @@ public class MainSettingsController extends PreferencesController {
populatePreferences();
buildPreferences();
onPreferenceChange(imageAutoLoadView);
if (!ChanSettings.developer.get()) {
developerView.view.getLayoutParams().height = 0;
}
}
@Override
public void onMenuItemClicked(ToolbarMenuItem item) {
}
@Override
public void onSubMenuItemClicked(ToolbarMenuItem parent, FloatingMenuItem item) {
if (((Integer) item.getId()) == ADVANCED_SETTINGS) {
navigationController.pushController(new AdvancedSettingsController(context));
}
}
@Override
public void onPreferenceChange(PreferenceItem item) {
public void onPreferenceChange(SettingView item) {
super.onPreferenceChange(item);
if (item == theme) {
link.setEnabled(((ListPreference)item).getPreference().get().equals("dark"));
if (item == imageAutoLoadView) {
videoAutoLoadView.setEnabled(ChanSettings.imageAutoLoad.get());
}
}
private void populatePreferences() {
PreferenceGroup settings = new PreferenceGroup("Settings");
// General group
SettingsGroup general = new SettingsGroup(s(R.string.settings_group_general));
general.add(new LinkSettingView(this, s(R.string.settings_board_edit), null, new View.OnClickListener() {
@Override
public void onClick(View v) {
}
}));
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);
general.add(new LinkSettingView(this, s(R.string.settings_watch), null, new View.OnClickListener() {
@Override
public void onClick(View v) {
// BooleanPreference bool = new BooleanPreference(p, "A name", "akey", false);
// settings.preferenceItems.add(bool);
}
}));
link = new LinkPreference(this, "A link", new View.OnClickListener() {
general.add(new LinkSettingView(this, s(R.string.settings_pass), null, new View.OnClickListener() {
@Override
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);*/
}));
groups.add(general);
// Browsing group
SettingsGroup browsing = new SettingsGroup(s(R.string.settings_group_browsing));
browsing.add(new ListSettingView(this, ChanSettings.theme, s(R.string.setting_theme), new ListSettingView.Item[]{
new ListSettingView.Item<>(s(R.string.setting_theme_light), "light"),
new ListSettingView.Item<>(s(R.string.setting_theme_dark), "dark"),
new ListSettingView.Item<>(s(R.string.setting_theme_black), "black")
}));
List<ListSettingView.Item> fontSizes = new ArrayList<>();
for (int size = 10; size <= 19; size++) {
String name = size + (String.valueOf(size).equals(ChanSettings.fontSize.getDefault()) ? " " + s(R.string.setting_font_size_default) : "");
fontSizes.add(new ListSettingView.Item<>(name, String.valueOf(size)));
}
browsing.add(new ListSettingView(this, ChanSettings.fontSize, s(R.string.setting_font_size), fontSizes.toArray(new ListSettingView.Item[fontSizes.size()])));
browsing.add(new BooleanSettingView(this, ChanSettings.openLinkConfirmation, s(R.string.setting_open_link_confirmation), null));
browsing.add(new BooleanSettingView(this, ChanSettings.autoRefreshThread, s(R.string.setting_auto_refresh_thread), null));
imageAutoLoadView = browsing.add(new BooleanSettingView(this, ChanSettings.imageAutoLoad, s(R.string.setting_image_auto_load), null));
videoAutoLoadView = browsing.add(new BooleanSettingView(this, ChanSettings.videoAutoLoad, s(R.string.setting_video_auto_load), null));
browsing.add(new BooleanSettingView(this, ChanSettings.videoOpenExternal, s(R.string.setting_video_open_external), s(R.string.setting_video_open_external_description)));
groups.add(browsing);
// Posting group
SettingsGroup posting = new SettingsGroup(s(R.string.settings_group_posting));
posting.add(new StringSettingView(this, ChanSettings.postDefaultName, s(R.string.setting_post_default_name), s(R.string.setting_post_default_name)));
posting.add(new BooleanSettingView(this, ChanSettings.postPinThread, s(R.string.setting_post_pin), null));
groups.add(posting);
// About group
SettingsGroup about = new SettingsGroup(s(R.string.settings_group_about));
about.add(new LinkSettingView(this, s(R.string.settings_about_licenses), s(R.string.settings_about_licences_description), new View.OnClickListener() {
@Override
public void onClick(View v) {
}
}));
String version = "";
try {
version = context.getPackageManager().getPackageInfo(context.getPackageName(), 0).versionName;
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
about.add(new LinkSettingView(this, s(R.string.app_name), version, new View.OnClickListener() {
@Override
public void onClick(View v) {
if ((++clickCount) % 5 == 0) {
boolean developer = !ChanSettings.developer.get();
ChanSettings.developer.set(developer);
Toast.makeText(context, (developer ? "Enabled" : "Disabled") + " developer options", Toast.LENGTH_LONG).show();
AndroidUtils.animateHeight(developerView.view, developer);
}
}
}));
developerView = about.add(new LinkSettingView(this, s(R.string.settings_developer), null, new View.OnClickListener() {
@Override
public void onClick(View v) {
}
}));
groups.add(about);
}
private String s(int id) {
return string(id);
}
}

@ -53,7 +53,7 @@ public class RootNavigationController extends NavigationController {
AndroidUtils.waitForLayout(drawer, new AndroidUtils.OnMeasuredCallback() {
@Override
public void onMeasured(View view, int width, int height) {
public void onMeasured(View view) {
setDrawerWidth();
}
});

@ -36,7 +36,7 @@ import android.widget.VideoView;
import org.floens.chan.R;
import org.floens.chan.chan.ImageSearch;
import org.floens.chan.core.preferences.ChanPreferences;
import org.floens.chan.core.settings.ChanSettings;
import org.floens.chan.core.model.Post;
import org.floens.chan.ui.activity.ImageViewActivity;
import org.floens.chan.ui.adapter.ImageViewAdapter;
@ -114,7 +114,7 @@ public class ImageViewFragment extends Fragment implements ThumbnailImageViewCal
imageView.setThumbnail(post.thumbnailUrl);
if (ChanPreferences.getImageAutoLoad() && !post.spoiler) {
if (ChanSettings.getImageAutoLoad() && !post.spoiler) {
load();
} else {
tapToLoad = true;
@ -187,7 +187,7 @@ public class ImageViewFragment extends Fragment implements ThumbnailImageViewCal
activity.invalidateActionBar();
if (isVideo && ChanPreferences.getVideoAutoPlay() && imageView != null) {
if (isVideo && ChanSettings.getVideoAutoPlay() && imageView != null) {
if (!videoVisible) {
startVideo();
} else {
@ -244,11 +244,11 @@ public class ImageViewFragment extends Fragment implements ThumbnailImageViewCal
break;
case R.id.action_image_save:
case R.id.action_share:
if (ChanPreferences.getImageShareUrl()) {
if (ChanSettings.getImageShareUrl()) {
shareImageUrl(post.imageUrl);
} else {
ImageSaver.getInstance().saveImage(context, post.imageUrl,
ChanPreferences.getImageSaveOriginalFilename() ? Long.toString(post.tim) : post.filename, post.ext,
ChanSettings.getImageSaveOriginalFilename() ? Long.toString(post.tim) : post.filename, post.ext,
item.getItemId() == R.id.action_share);
}
break;
@ -273,7 +273,7 @@ public class ImageViewFragment extends Fragment implements ThumbnailImageViewCal
}
public void onVideoError(File video) {
if (ChanPreferences.getVideoErrorIgnore()) {
if (ChanSettings.getVideoErrorIgnore()) {
Toast.makeText(context, R.string.image_open_failed, Toast.LENGTH_SHORT).show();
} else {
showVideoWarning();
@ -303,7 +303,7 @@ public class ImageViewFragment extends Fragment implements ThumbnailImageViewCal
@Override
public void onClick(DialogInterface dialog, int which) {
if (dontShowAgain.isChecked()) {
ChanPreferences.setVideoErrorIgnore(true);
ChanSettings.setVideoErrorIgnore(true);
}
}
})

@ -30,7 +30,7 @@ import android.widget.ListView;
import android.widget.TextView;
import org.floens.chan.R;
import org.floens.chan.core.preferences.ChanPreferences;
import org.floens.chan.core.settings.ChanSettings;
import org.floens.chan.core.model.Post;
import org.floens.chan.core.presenter.ThreadPresenter;
import org.floens.chan.ui.helper.PostPopupHelper;
@ -82,7 +82,7 @@ public class PostRepliesFragment extends DialogFragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup unused, Bundle savedInstanceState) {
View container;
if (ChanPreferences.getReplyButtonsBottom()) {
if (ChanSettings.getReplyButtonsBottom()) {
container = inflater.inflate(R.layout.post_replies_bottombuttons, null);
} else {
container = inflater.inflate(R.layout.post_replies, null);

@ -53,13 +53,13 @@ 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.preferences.ChanPreferences;
import org.floens.chan.core.settings.ChanSettings;
import org.floens.chan.core.manager.ReplyManager;
import org.floens.chan.core.manager.ReplyManager.ReplyResponse;
import org.floens.chan.core.model.Board;
import org.floens.chan.core.model.Loadable;
import org.floens.chan.core.model.Reply;
import org.floens.chan.ui.ViewFlipperAnimations;
import org.floens.chan.ui.animation.ViewFlipperAnimations;
import org.floens.chan.ui.view.LoadView;
import org.floens.chan.utils.AndroidUtils;
import org.floens.chan.utils.ImageDecoder;
@ -164,7 +164,7 @@ public class ReplyFragment extends DialogFragment {
Reply draft = ChanApplication.getReplyManager().getReplyDraft();
if (TextUtils.isEmpty(draft.name)) {
draft.name = ChanPreferences.getDefaultName();
draft.name = ChanSettings.getDefaultName();
}
nameView.setText(draft.name);
@ -275,7 +275,7 @@ public class ReplyFragment extends DialogFragment {
});
captchaInput = (TextView) container.findViewById(R.id.reply_captcha);
if (ChanPreferences.getPassEnabled()) {
if (ChanSettings.getPassEnabled()) {
((TextView) container.findViewById(R.id.reply_captcha_text)).setText(R.string.pass_using);
container.findViewById(R.id.reply_captcha_container).setVisibility(View.GONE);
container.findViewById(R.id.reply_captcha).setVisibility(View.GONE);
@ -590,9 +590,9 @@ public class ReplyFragment extends DialogFragment {
draft.resto = loadable.isThreadMode() ? loadable.no : -1;
draft.board = loadable.board;
if (ChanPreferences.getPassEnabled()) {
if (ChanSettings.getPassEnabled()) {
draft.usePass = true;
draft.passId = ChanPreferences.getPassId();
draft.passId = ChanSettings.getPassId();
}
Board b = ChanApplication.getBoardManager().getBoardByValue(loadable.board);
@ -630,7 +630,7 @@ public class ReplyFragment extends DialogFragment {
Toast.makeText(context, R.string.reply_success, Toast.LENGTH_SHORT).show();
// Pin thread on successful post
if (ChanPreferences.getPinOnPost() && loadable.isThreadMode()) {
if (ChanSettings.getPinOnPost() && loadable.isThreadMode()) {
ChanApplication.getWatchManager().addPin(loadable);
}

@ -30,7 +30,7 @@ import android.widget.ListView;
import android.widget.Toast;
import org.floens.chan.R;
import org.floens.chan.core.preferences.ChanPreferences;
import org.floens.chan.core.settings.ChanSettings;
import org.floens.chan.ui.activity.AboutActivity;
import org.floens.chan.ui.activity.BaseActivity;
import org.floens.chan.ui.activity.SettingsActivity;
@ -68,8 +68,8 @@ public class SettingsFragment extends PreferenceFragment {
if (++clickCount >= 5) {
clickCount = 0;
boolean enabled = !ChanPreferences.getDeveloper();
ChanPreferences.setDeveloper(enabled);
boolean enabled = !ChanSettings.getDeveloper();
ChanSettings.setDeveloper(enabled);
updateDeveloperPreference();
Toast.makeText(getActivity(), (enabled ? "Enabled " : "Disabled ") + "developer options",
@ -158,13 +158,13 @@ public class SettingsFragment extends PreferenceFragment {
final Preference watchPreference = findPreference("watch_settings");
if (watchPreference != null) {
watchPreference.setSummary(ChanPreferences.getWatchEnabled() ? R.string.watch_summary_enabled
watchPreference.setSummary(ChanSettings.getWatchEnabled() ? R.string.watch_summary_enabled
: R.string.watch_summary_disabled);
}
final Preference passPreference = findPreference("pass_settings");
if (passPreference != null) {
passPreference.setSummary(ChanPreferences.getPassEnabled() ? R.string.pass_summary_enabled
passPreference.setSummary(ChanSettings.getPassEnabled() ? R.string.pass_summary_enabled
: R.string.pass_summary_disabled);
}
}
@ -174,7 +174,7 @@ public class SettingsFragment extends PreferenceFragment {
}
private void updateDeveloperPreference() {
if (ChanPreferences.getDeveloper()) {
if (ChanSettings.getDeveloper()) {
((PreferenceGroup) findPreference("group_about")).addPreference(developerPreference);
} else {
((PreferenceGroup) findPreference("group_about")).removePreference(developerPreference);

@ -44,7 +44,7 @@ import com.android.volley.ServerError;
import com.android.volley.VolleyError;
import org.floens.chan.R;
import org.floens.chan.core.preferences.ChanPreferences;
import org.floens.chan.core.settings.ChanSettings;
import org.floens.chan.core.loader.ChanLoader;
import org.floens.chan.core.loader.EndOfLineException;
import org.floens.chan.core.manager.ThreadManager;
@ -219,7 +219,7 @@ public class ThreadFragment extends Fragment implements ThreadManager.ThreadMana
String filename;
for (Post post : imagePosts) {
filename = (ChanPreferences.getImageSaveOriginalFilename() ? post.tim : post.filename) + "." + post.ext;
filename = (ChanSettings.getImageSaveOriginalFilename() ? post.tim : post.filename) + "." + post.ext;
list.add(new ImageSaver.DownloadPair(post.imageUrl, filename));
}

@ -28,7 +28,7 @@ import android.widget.Toast;
import com.android.volley.VolleyError;
import org.floens.chan.R;
import org.floens.chan.core.preferences.ChanPreferences;
import org.floens.chan.core.settings.ChanSettings;
import org.floens.chan.core.model.ChanThread;
import org.floens.chan.core.model.Loadable;
import org.floens.chan.core.model.Post;
@ -135,7 +135,7 @@ public class ThreadLayout extends LoadView implements ThreadPresenter.ThreadPres
@Override
public void openLink(final String link) {
if (ChanPreferences.getOpenLinkConfirmation()) {
if (ChanSettings.getOpenLinkConfirmation()) {
new AlertDialog.Builder(getContext())
.setNegativeButton(R.string.cancel, null)
.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {

@ -1,40 +0,0 @@
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<Boolean> preference;
public BooleanPreference(PreferencesController preferencesController, Preference<Boolean> 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);
}
}

@ -0,0 +1,64 @@
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.settings.Setting;
public class BooleanSettingView extends SettingView implements View.OnClickListener, CompoundButton.OnCheckedChangeListener {
private SwitchCompat switcher;
private Setting<Boolean> setting;
private String description;
private boolean building = true;
public BooleanSettingView(SettingsController settingsController, Setting<Boolean> setting, String name, String description) {
super(settingsController, name);
this.setting = setting;
this.description = description;
}
@Override
public void setView(View view) {
super.setView(view);
view.setOnClickListener(this);
switcher = (SwitchCompat) view.findViewById(R.id.switcher);
switcher.setOnCheckedChangeListener(this);
switcher.setChecked(setting.get());
building = false;
}
@Override
public String getBottomDescription() {
return description;
}
@Override
public void setEnabled(boolean enabled) {
view.setEnabled(enabled);
view.findViewById(R.id.top).setEnabled(enabled);
View bottom = view.findViewById(R.id.bottom);
if (bottom != null) {
bottom.setEnabled(enabled);
}
switcher.setEnabled(enabled);
}
@Override
public void onClick(View v) {
switcher.toggle();
}
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (!building) {
setting.set(isChecked);
settingsController.onPreferenceChange(this);
}
}
}

@ -1,23 +0,0 @@
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) {
}
}

@ -0,0 +1,37 @@
package org.floens.chan.ui.preferences;
import android.view.View;
import org.floens.chan.R;
public class LinkSettingView extends SettingView {
private final View.OnClickListener clickListener;
private final String description;
public LinkSettingView(SettingsController settingsController, String name, String description, View.OnClickListener clickListener) {
super(settingsController, name);
this.description = description;
this.clickListener = clickListener;
}
@Override
public void setView(View view) {
super.setView(view);
view.setOnClickListener(clickListener);
}
@Override
public String getBottomDescription() {
return description;
}
@Override
public void setEnabled(boolean enabled) {
view.setEnabled(enabled);
view.findViewById(R.id.top).setEnabled(enabled);
View bottom = view.findViewById(R.id.bottom);
if (bottom != null) {
bottom.setEnabled(enabled);
}
}
}

@ -3,7 +3,8 @@ 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.R;
import org.floens.chan.core.settings.Setting;
import org.floens.chan.ui.view.FloatingMenu;
import org.floens.chan.ui.view.FloatingMenuItem;
@ -12,16 +13,16 @@ import java.util.List;
import static org.floens.chan.utils.AndroidUtils.dp;
public class ListPreference extends PreferenceItem implements FloatingMenu.FloatingMenuCallback, View.OnClickListener {
public class ListSettingView extends SettingView implements FloatingMenu.FloatingMenuCallback, View.OnClickListener {
public final Item[] items;
private Preference<String> preference;
private Setting<String> setting;
private int selected;
public ListPreference(PreferencesController preferencesController, Preference<String> preference, String name, Item[] items) {
super(preferencesController, name);
this.preference = preference;
public ListSettingView(SettingsController settingsController, Setting<String> setting, String name, Item[] items) {
super(settingsController, name);
this.setting = setting;
this.items = items;
selectItem();
@ -31,8 +32,8 @@ public class ListPreference extends PreferenceItem implements FloatingMenu.Float
return items[selected].name;
}
public Preference<String> getPreference() {
return preference;
public Setting<String> getSetting() {
return setting;
}
@Override
@ -41,6 +42,16 @@ public class ListPreference extends PreferenceItem implements FloatingMenu.Float
view.setOnClickListener(this);
}
@Override
public void setEnabled(boolean enabled) {
view.setEnabled(enabled);
view.findViewById(R.id.top).setEnabled(enabled);
View bottom = view.findViewById(R.id.bottom);
if (bottom != null) {
bottom.setEnabled(enabled);
}
}
@Override
public void onClick(View v) {
List<FloatingMenuItem> menuItems = new ArrayList<>(2);
@ -60,13 +71,13 @@ public class ListPreference extends PreferenceItem implements FloatingMenu.Float
@Override
public void onFloatingMenuItemClicked(FloatingMenu menu, FloatingMenuItem item) {
String selectedKey = (String) item.getId();
preference.set(selectedKey);
setting.set(selectedKey);
selectItem();
preferencesController.onPreferenceChange(this);
settingsController.onPreferenceChange(this);
}
private void selectItem() {
String selectedKey = preference.get();
String selectedKey = setting.get();
for (int i = 0; i < items.length; i++) {
if (items[i].key.equals(selectedKey)) {
selected = i;

@ -1,14 +0,0 @@
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<PreferenceItem> preferenceItems = new ArrayList<>();
}

@ -2,13 +2,13 @@ package org.floens.chan.ui.preferences;
import android.view.View;
public abstract class PreferenceItem {
public PreferencesController preferencesController;
public abstract class SettingView {
public SettingsController settingsController;
public final String name;
public View view;
public PreferenceItem(PreferencesController preferencesController, String name) {
this.preferencesController = preferencesController;
public SettingView(SettingsController settingsController, String name) {
this.settingsController = settingsController;
this.name = name;
}

@ -5,6 +5,7 @@ import android.content.res.Configuration;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.Animation;
import android.widget.LinearLayout;
import android.widget.TextView;
@ -17,17 +18,14 @@ import java.util.List;
import static org.floens.chan.utils.AndroidUtils.dp;
public class PreferencesController extends Controller implements AndroidUtils.OnMeasuredCallback {
public class SettingsController extends Controller implements AndroidUtils.OnMeasuredCallback {
protected LinearLayout content;
protected List<PreferenceGroup> groups = new ArrayList<>();
protected List<SettingsGroup> groups = new ArrayList<>();
public PreferencesController(Context context) {
super(context);
}
private boolean built = false;
@Override
public void onCreate() {
super.onCreate();
public SettingsController(Context context) {
super(context);
}
@Override
@ -44,12 +42,12 @@ public class PreferencesController extends Controller implements AndroidUtils.On
}
@Override
public void onMeasured(View view, int width, int height) {
public void onMeasured(View view) {
setMargins();
}
public void onPreferenceChange(PreferenceItem item) {
if (item instanceof ListPreference) {
public void onPreferenceChange(SettingView item) {
if ((item instanceof ListSettingView) || (item instanceof StringSettingView)) {
setDescriptionText(item.view, item.getTopDescription(), item.getBottomDescription());
}
}
@ -84,8 +82,8 @@ public class PreferencesController extends Controller implements AndroidUtils.On
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);
for (SettingsGroup group : groups) {
LinearLayout groupLayout = (LinearLayout) inf.inflate(R.layout.setting_group, content, false);
((TextView) groupLayout.findViewById(R.id.header)).setText(group.name);
if (firstGroup) {
@ -95,42 +93,63 @@ public class PreferencesController extends Controller implements AndroidUtils.On
content.addView(groupLayout);
for (int i = 0; i < group.preferenceItems.size(); i++) {
PreferenceItem preferenceItem = group.preferenceItems.get(i);
for (int i = 0; i < group.settingViews.size(); i++) {
SettingView settingView = group.settingViews.get(i);
ViewGroup preferenceView = null;
String topValue = preferenceItem.getTopDescription();
String bottomValue = preferenceItem.getBottomDescription();
String topValue = settingView.getTopDescription();
String bottomValue = settingView.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);
if ((settingView instanceof ListSettingView) || (settingView instanceof LinkSettingView) || (settingView instanceof StringSettingView)) {
preferenceView = (ViewGroup) inf.inflate(R.layout.setting_link, groupLayout, false);
} else if (settingView instanceof BooleanSettingView) {
preferenceView = (ViewGroup) inf.inflate(R.layout.setting_boolean, groupLayout, false);
}
setDescriptionText(preferenceView, topValue, bottomValue);
groupLayout.addView(preferenceView);
preferenceItem.setView(preferenceView);
settingView.setView(preferenceView);
if (i < group.preferenceItems.size() - 1) {
inf.inflate(R.layout.preference_divider, groupLayout, true);
if (i < group.settingViews.size() - 1) {
inf.inflate(R.layout.setting_divider, groupLayout, true);
}
}
}
built = 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));
final TextView bottom = ((TextView) view.findViewById(R.id.bottom));
if (bottom != null) {
if (bottomText == null) {
ViewGroup parent = (ViewGroup) bottom.getParent();
parent.removeView(bottom);
if (built) {
if (bottomText != null) {
bottom.setText(bottomText);
}
AndroidUtils.animateHeight(bottom, bottomText != null);
bottom.getAnimation().setAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
bottom.setVisibility(View.VISIBLE);
}
@Override
public void onAnimationEnd(Animation animation) {
}
@Override
public void onAnimationRepeat(Animation animation) {
}
});
} else {
bottom.setText(bottomText);
bottom.setVisibility(bottomText == null ? View.GONE : View.VISIBLE);
}
}
}

@ -0,0 +1,18 @@
package org.floens.chan.ui.preferences;
import java.util.ArrayList;
import java.util.List;
public class SettingsGroup {
public final String name;
public final List<SettingView> settingViews = new ArrayList<>();
public SettingsGroup(String name) {
this.name = name;
}
public SettingView add(SettingView settingView) {
settingViews.add(settingView);
return settingView;
}
}

@ -0,0 +1,64 @@
package org.floens.chan.ui.preferences;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.view.View;
import android.view.WindowManager;
import android.view.inputmethod.EditorInfo;
import android.widget.EditText;
import android.widget.LinearLayout;
import org.floens.chan.R;
import org.floens.chan.core.settings.Setting;
import static org.floens.chan.utils.AndroidUtils.dp;
public class StringSettingView extends SettingView implements View.OnClickListener {
private final Setting<String> setting;
private final String dialogTitle;
public StringSettingView(SettingsController settingsController, Setting<String> setting, String name, String dialogTitle) {
super(settingsController, name);
this.setting = setting;
this.dialogTitle = dialogTitle;
}
@Override
public void setView(View view) {
super.setView(view);
view.setOnClickListener(this);
}
@Override
public String getBottomDescription() {
return setting.get().length() > 0 ? setting.get() : null;
}
@Override
public void onClick(View v) {
LinearLayout container = new LinearLayout(v.getContext());
container.setPadding(dp(24), dp(8), dp(24), 0);
final EditText editText = new EditText(v.getContext());
editText.setImeOptions(EditorInfo.IME_FLAG_NO_FULLSCREEN);
editText.setText(setting.get());
editText.setSingleLine(true);
container.addView(editText, LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);
AlertDialog dialog = new AlertDialog.Builder(v.getContext())
.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface d, int which) {
setting.set(editText.getText().toString());
settingsController.onPreferenceChange(StringSettingView.this);
}
})
.setNegativeButton(R.string.cancel, null)
.setTitle(dialogTitle)
.setView(container)
.create();
dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
dialog.show();
}
}

@ -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.preferences.ChanPreferences;
import org.floens.chan.core.settings.ChanSettings;
import org.floens.chan.core.manager.WatchManager;
import org.floens.chan.core.model.Pin;
import org.floens.chan.core.model.Post;
@ -90,8 +90,8 @@ public class WatchNotifier extends Service {
}
private Notification createNotification() {
boolean notifyQuotesOnly = ChanPreferences.getWatchNotifyMode().equals("quotes");
boolean soundQuotesOnly = ChanPreferences.getWatchSound().equals("quotes");
boolean notifyQuotesOnly = ChanSettings.getWatchNotifyMode().equals("quotes");
boolean soundQuotesOnly = ChanSettings.getWatchSound().equals("quotes");
List<Post> list = new ArrayList<>();
List<Post> listQuoting = new ArrayList<>();
@ -229,7 +229,7 @@ public class WatchNotifier extends Service {
}
if (light) {
long watchLed = ChanPreferences.getWatchLed();
long watchLed = ChanSettings.getWatchLed();
if (watchLed >= 0) {
builder.setLights((int) watchLed, 1000, 1000);
}

@ -17,9 +17,13 @@
*/
package org.floens.chan.ui.toolbar;
import android.content.Context;
import android.widget.LinearLayout;
import org.floens.chan.ui.view.FloatingMenu;
import org.floens.chan.ui.view.FloatingMenuItem;
import java.util.List;
public class NavigationItem {
public String title = "";
@ -27,4 +31,11 @@ public class NavigationItem {
public boolean hasBack = true;
public LinearLayout view;
public FloatingMenu middleMenu;
public FloatingMenu createOverflow(Context context, ToolbarMenuItem.ToolbarMenuItemCallback callback, List<FloatingMenuItem> items) {
ToolbarMenuItem overflow = menu.createOverflow(callback);
FloatingMenu overflowMenu = new FloatingMenu(context, overflow.getView(), items);
overflow.setSubMenu(overflowMenu);
return overflowMenu;
}
}

@ -79,7 +79,7 @@ public class Toolbar extends LinearLayout implements View.OnClickListener {
if (item.menu != null) {
AndroidUtils.waitForMeasure(this, new AndroidUtils.OnMeasuredCallback() {
@Override
public void onMeasured(View view, int width, int height) {
public void onMeasured(View view) {
setNavigationItemView(animate, pushing, item);
}
});
@ -246,7 +246,7 @@ public class Toolbar extends LinearLayout implements View.OnClickListener {
AndroidUtils.waitForMeasure(titleView, new AndroidUtils.OnMeasuredCallback() {
@Override
public void onMeasured(View view, int width, int height) {
public void onMeasured(View view) {
if (item.middleMenu != null) {
item.middleMenu.setPopupWidth(Math.max(dp(150), titleView.getWidth()));
}

@ -51,18 +51,6 @@ public class ToolbarMenu extends LinearLayout {
private void init() {
setOrientation(HORIZONTAL);
setGravity(Gravity.CENTER_VERTICAL);
// overflowItem = new ToolbarMenuItem(getContext(), this, 100, R.drawable.ic_more_vert_white_24dp, 10 + 32);
//
// List<ToolbarMenuItemSubMenu.SubItem> subItems = new ArrayList<>();
// subItems.add(new ToolbarMenuItemSubMenu.SubItem(1, "Sub 1"));
// subItems.add(new ToolbarMenuItemSubMenu.SubItem(2, "Sub 2"));
// subItems.add(new ToolbarMenuItemSubMenu.SubItem(3, "Sub 3"));
//
// ToolbarMenuItemSubMenu sub = new ToolbarMenuItemSubMenu(getContext(), overflowItem.getView(), subItems);
// overflowItem.setSubMenu(sub);
//
// addItem(overflowItem);
}
public ToolbarMenuItem addItem(ToolbarMenuItem item) {
@ -78,10 +66,8 @@ public class ToolbarMenu extends LinearLayout {
public ToolbarMenuItem createOverflow(ToolbarMenuItem.ToolbarMenuItemCallback callback) {
ToolbarMenuItem overflow = addItem(new ToolbarMenuItem(getContext(), callback, 100, R.drawable.ic_more));
ImageView overflowImage = overflow.getView();
// 36dp
overflowImage.setLayoutParams(new LinearLayout.LayoutParams(dp(36), dp(54)));
int p = dp(16);
overflowImage.setPadding(0, 0, p, 0);
overflowImage.setPadding(0, 0, dp(16), 0);
return overflow;
}

@ -72,13 +72,9 @@ public class ToolbarMenuItem implements View.OnClickListener, FloatingMenu.Float
subMenu.setCallback(this);
}
public void showSubMenu() {
subMenu.show();
}
@Override
public void onClick(View v) {
if (subMenu != null) {
if (subMenu != null && !subMenu.isShowing()) {
subMenu.show();
}
callback.onMenuItemClicked(this);

@ -32,6 +32,7 @@ import android.widget.TextView;
import org.floens.chan.R;
import org.floens.chan.utils.AndroidUtils;
import org.floens.chan.utils.Logger;
import java.util.ArrayList;
import java.util.List;
@ -147,9 +148,13 @@ public class FloatingMenu {
globalLayoutListener = new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
if (popupWindow.isShowing()) {
// Recalculate anchor position
popupWindow.show();
if (popupWindow == null) {
Logger.w("FloatingMenu", "popupWindow null in layout listener");
} else {
if (popupWindow.isShowing()) {
// Recalculate anchor position
popupWindow.show();
}
}
}
};
@ -170,6 +175,10 @@ public class FloatingMenu {
popupWindow.setSelection(selectedPosition);
}
public boolean isShowing() {
return popupWindow != null && popupWindow.isShowing();
}
public interface FloatingMenuCallback {
public void onFloatingMenuItemClicked(FloatingMenu menu, FloatingMenuItem item);
}

@ -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.preferences.ChanPreferences;
import org.floens.chan.core.settings.ChanSettings;
import org.floens.chan.utils.AndroidUtils;
import org.floens.chan.utils.FileCache;
import org.floens.chan.utils.Logger;
@ -257,7 +257,7 @@ public class ThumbnailImageView extends LoadView implements View.OnClickListener
}
public void setVideoFile(final File file) {
if (ChanPreferences.getVideoExternal()) {
if (ChanSettings.getVideoExternal()) {
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(file), "video/*");

@ -39,6 +39,7 @@ import android.widget.Toast;
import org.floens.chan.ChanApplication;
import org.floens.chan.R;
import org.floens.chan.ui.animation.HeightAnimation;
import java.util.ArrayList;
import java.util.HashMap;
@ -166,7 +167,7 @@ public class AndroidUtils {
}
public interface OnMeasuredCallback {
void onMeasured(View view, int width, int height);
void onMeasured(View view);
}
/**
@ -187,7 +188,7 @@ public class AndroidUtils {
int height = view.getHeight();
if (returnIfZero && width > 0 && height > 0) {
callback.onMeasured(view, width, height);
callback.onMeasured(view);
} else {
view.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
@Override
@ -198,7 +199,7 @@ public class AndroidUtils {
}
try {
callback.onMeasured(view, view.getWidth(), view.getHeight());
callback.onMeasured(view);
} catch (Exception e) {
Log.i("AndroidUtils", "Exception in onMeasured", e);
}
@ -234,4 +235,22 @@ public class AndroidUtils {
return views;
}
public static void animateHeight(View view, boolean expand) {
if ((view.getHeight() > 0 && expand) || (view.getHeight() == 0 && !expand)) {
return;
}
view.clearAnimation();
HeightAnimation heightAnimation;
if (expand) {
view.measure(
View.MeasureSpec.makeMeasureSpec(view.getWidth(), View.MeasureSpec.EXACTLY),
View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));
heightAnimation = new HeightAnimation(view, 0, view.getMeasuredHeight(), 300);
} else {
heightAnimation = new HeightAnimation(view, view.getHeight(), 0, 300);
}
view.startAnimation(heightAnimation);
}
}

@ -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.preferences.ChanPreferences;
import org.floens.chan.core.settings.ChanSettings;
import java.io.File;
import java.io.FileInputStream;
@ -55,7 +55,7 @@ public class ImageSaver {
private BroadcastReceiver receiver;
public void saveAll(final Context context, String folderName, final List<DownloadPair> list) {
final File subFolder = new File(ChanPreferences.getImageSaveDirectory() + File.separator + filterName(folderName));
final File subFolder = new File(ChanSettings.getImageSaveDirectory() + File.separator + filterName(folderName));
String text = context.getString(R.string.download_confirm, Integer.toString(list.size()), subFolder.getAbsolutePath());
@ -99,7 +99,7 @@ public class ImageSaver {
new Thread(new Runnable() {
@Override
public void run() {
File saveDir = ChanPreferences.getImageSaveDirectory();
File saveDir = ChanSettings.getImageSaveDirectory();
if (!saveDir.isDirectory() && !saveDir.mkdirs()) {
showToast(context, context.getString(R.string.image_save_directory_error));

@ -22,7 +22,7 @@ import android.content.Context;
import android.content.res.TypedArray;
import org.floens.chan.R;
import org.floens.chan.core.preferences.ChanPreferences;
import org.floens.chan.core.settings.ChanSettings;
public class ThemeHelper {
public enum Theme {
@ -67,7 +67,7 @@ public class ThemeHelper {
}
public Theme getTheme() {
String themeName = ChanPreferences.getTheme();
String themeName = ChanSettings.getTheme();
Theme theme = null;
switch (themeName) {
@ -98,7 +98,7 @@ public class ThemeHelper {
spoilerColor = ta.getColor(R.styleable.PostView_spoiler_color, 0);
inlineQuoteColor = ta.getColor(R.styleable.PostView_inline_quote_color, 0);
codeTagSize = ta.getDimensionPixelSize(R.styleable.PostView_code_tag_size, 0);
fontSize = ChanPreferences.getFontSize();
fontSize = ChanSettings.getFontSize();
ta.recycle();
}

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_enabled="false" android:color="#55000000" />
<item android:color="#89000000" />
</selector>

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_enabled="false" android:color="#89000000" />
<item android:color="#ff000000" />
</selector>

@ -15,7 +15,7 @@
android:layout_weight="1"
android:orientation="vertical">
<include layout="@layout/preference_description" />
<include layout="@layout/setting_description" />
</LinearLayout>

@ -8,7 +8,7 @@
android:paddingLeft="16dp"
android:paddingRight="16dp"
android:singleLine="true"
android:textColor="#ff000000"
android:textColor="@drawable/preference_description_top"
android:textSize="16sp" />
<TextView
@ -20,6 +20,6 @@
android:paddingLeft="16dp"
android:paddingRight="16dp"
android:singleLine="true"
android:textColor="#89000000"
android:textColor="@drawable/preference_description_bottom"
android:textSize="14sp" />
</merge>

@ -22,4 +22,4 @@
android:textSize="16sp"
android:textColor="#89000000" />
</LinearLayout>
</LinearLayout>

@ -8,6 +8,6 @@
android:paddingTop="16dp"
android:paddingBottom="16dp">
<include layout="@layout/preference_description" />
<include layout="@layout/setting_description" />
</LinearLayout>

@ -23,7 +23,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
<LinearLayout
android:id="@+id/scrollview_content"
android:orientation="vertical"
android:layout_width="wrap_content"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</ScrollView>

@ -152,6 +152,35 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
<string name="folder_pick_ok">Choose</string>
<string name="settings_group_general">General</string>
<string name="settings_board_edit">Edit boards</string>
<string name="settings_watch">Thread watcher settings</string>
<string name="settings_pass">4chan pass settings</string>
<string name="settings_group_browsing">Browsing</string>
<string name="setting_theme">Theme</string>
<string name="setting_theme_light">Light</string>
<string name="setting_theme_dark">Dark</string>
<string name="setting_theme_black">Black</string>
<string name="setting_font_size">Font size</string>
<string name="setting_font_size_default">(default)</string>
<string name="setting_open_link_confirmation">Ask before opening links</string>
<string name="setting_auto_refresh_thread">Auto refresh threads</string>
<string name="setting_image_auto_load">Auto load images</string>
<string name="setting_video_auto_load">Auto load videos</string>
<string name="setting_video_open_external">Open videos external</string>
<string name="setting_video_open_external_description">Open videos in an external media player</string>
<string name="settings_group_posting">Posting</string>
<string name="setting_post_default_name">Default post name</string>
<string name="setting_post_pin">Pin thread on post</string>
<string name="settings_group_about">About</string>
<string name="settings_about_licenses">Open Source Licenses</string>
<string name="settings_about_licences_description">Legal information about licenses</string>
<string name="settings_developer">Developer settings</string>
<string name="preference_board_edit">Edit boards</string>
<string name="preference_board_edit_summary">Add or remove boards</string>
<string name="preference_watch_settings">Thread watcher</string>

Loading…
Cancel
Save