Theming support.

Light, dark & black theme available. Not all are done yet.
The switcher in settings smoothly transitions the different themes.
ThemeHelper added with helper function ThemeHelper.setTheme(Activity) to
be used in Activity.onCreate to set the theme.
captchafix
Florens Douwes 11 years ago
parent d6b49e76b0
commit 9b415d84e0
  1. 44
      Clover/app/src/main/java/org/floens/chan/core/ChanPreferences.java
  2. 4
      Clover/app/src/main/java/org/floens/chan/ui/activity/AboutActivity.java
  3. 11
      Clover/app/src/main/java/org/floens/chan/ui/activity/BaseActivity.java
  4. 3
      Clover/app/src/main/java/org/floens/chan/ui/activity/BoardEditor.java
  5. 3
      Clover/app/src/main/java/org/floens/chan/ui/activity/DeveloperActivity.java
  6. 3
      Clover/app/src/main/java/org/floens/chan/ui/activity/ImageViewActivity.java
  7. 3
      Clover/app/src/main/java/org/floens/chan/ui/activity/PassSettingsActivity.java
  8. 3
      Clover/app/src/main/java/org/floens/chan/ui/activity/ReplyActivity.java
  9. 42
      Clover/app/src/main/java/org/floens/chan/ui/activity/SettingsActivity.java
  10. 3
      Clover/app/src/main/java/org/floens/chan/ui/activity/WatchSettingsActivity.java
  11. 51
      Clover/app/src/main/java/org/floens/chan/ui/fragment/SettingsFragment.java
  12. 26
      Clover/app/src/main/java/org/floens/chan/ui/view/PostView.java
  13. 41
      Clover/app/src/main/java/org/floens/chan/utils/ThemeHelper.java
  14. 4
      Clover/app/src/main/res/layout/activity_base.xml
  15. 19
      Clover/app/src/main/res/values/attrs.xml
  16. 13
      Clover/app/src/main/res/values/strings.xml
  17. 64
      Clover/app/src/main/res/values/styles.xml
  18. 8
      Clover/app/src/main/res/xml/preference.xml

@ -17,28 +17,36 @@
*/ */
package org.floens.chan.core; package org.floens.chan.core;
import android.content.SharedPreferences;
import org.floens.chan.ChanApplication; import org.floens.chan.ChanApplication;
import org.floens.chan.R;
import org.floens.chan.service.WatchService; import org.floens.chan.service.WatchService;
import org.floens.chan.utils.ThemeHelper;
public class ChanPreferences { public class ChanPreferences {
private static SharedPreferences p() {
return ChanApplication.getPreferences();
}
public static boolean getOpenLinkConfirmation() { public static boolean getOpenLinkConfirmation() {
return ChanApplication.getPreferences().getBoolean("preference_open_link_confirmation", true); return p().getBoolean("preference_open_link_confirmation", true);
} }
public static String getDefaultName() { public static String getDefaultName() {
return ChanApplication.getPreferences().getString("preference_default_name", ""); return p().getString("preference_default_name", "");
} }
public static String getDefaultEmail() { public static String getDefaultEmail() {
return ChanApplication.getPreferences().getString("preference_default_email", ""); return p().getString("preference_default_email", "");
} }
public static boolean getDeveloper() { public static boolean getDeveloper() {
return ChanApplication.getPreferences().getBoolean("preference_developer", false); return p().getBoolean("preference_developer", false);
} }
public static void setDeveloper(boolean developer) { public static void setDeveloper(boolean developer) {
ChanApplication.getPreferences().edit().putBoolean("preference_developer", developer).commit(); p().edit().putBoolean("preference_developer", developer).commit();
} }
public static String getImageSaveDirectory() { public static String getImageSaveDirectory() {
@ -46,7 +54,7 @@ public class ChanPreferences {
} }
public static boolean getWatchEnabled() { public static boolean getWatchEnabled() {
return ChanApplication.getPreferences().getBoolean("preference_watch_enabled", false); return p().getBoolean("preference_watch_enabled", false);
} }
/** /**
@ -57,48 +65,52 @@ public class ChanPreferences {
*/ */
public static void setWatchEnabled(boolean enabled) { public static void setWatchEnabled(boolean enabled) {
if (getWatchEnabled() != enabled) { if (getWatchEnabled() != enabled) {
ChanApplication.getPreferences().edit().putBoolean("preference_watch_enabled", enabled).commit(); p().edit().putBoolean("preference_watch_enabled", enabled).commit();
WatchService.updateRunningState(ChanApplication.getInstance()); WatchService.updateRunningState(ChanApplication.getInstance());
ChanApplication.getPinnedManager().onPinsChanged(); ChanApplication.getPinnedManager().onPinsChanged();
} }
} }
public static boolean getWatchBackgroundEnabled() { public static boolean getWatchBackgroundEnabled() {
return ChanApplication.getPreferences().getBoolean("preference_watch_background_enabled", true); return p().getBoolean("preference_watch_background_enabled", true);
} }
public static long getWatchBackgroundTimeout() { public static long getWatchBackgroundTimeout() {
String number = ChanApplication.getPreferences().getString("preference_watch_background_timeout", "0"); String number = p().getString("preference_watch_background_timeout", "0");
return Integer.parseInt(number) * 1000L; return Integer.parseInt(number) * 1000L;
} }
public static boolean getVideoAutoPlay() { public static boolean getVideoAutoPlay() {
return ChanApplication.getPreferences().getBoolean("preference_autoplay", false); return p().getBoolean("preference_autoplay", false);
} }
public static boolean getPassEnabled() { public static boolean getPassEnabled() {
return ChanApplication.getPreferences().getBoolean("preference_pass_enabled", false); return p().getBoolean("preference_pass_enabled", false);
} }
public static void setPassEnabled(boolean enabled) { public static void setPassEnabled(boolean enabled) {
if (getPassEnabled() != enabled) { if (getPassEnabled() != enabled) {
ChanApplication.getPreferences().edit().putBoolean("preference_pass_enabled", enabled).commit(); p().edit().putBoolean("preference_pass_enabled", enabled).commit();
} }
} }
public static String getPassToken() { public static String getPassToken() {
return ChanApplication.getPreferences().getString("preference_pass_token", ""); return p().getString("preference_pass_token", "");
} }
public static String getPassPin() { public static String getPassPin() {
return ChanApplication.getPreferences().getString("preference_pass_pin", ""); return p().getString("preference_pass_pin", "");
} }
public static void setPassId(String id) { public static void setPassId(String id) {
ChanApplication.getPreferences().edit().putString("preference_pass_id", id).commit(); p().edit().putString("preference_pass_id", id).commit();
} }
public static String getPassId() { public static String getPassId() {
return ChanApplication.getPreferences().getString("preference_pass_id", ""); return p().getString("preference_pass_id", "");
}
public static String getTheme() {
return p().getString("preference_theme", "light");
} }
} }

@ -21,11 +21,15 @@ import android.app.Activity;
import android.os.Bundle; import android.os.Bundle;
import android.webkit.WebView; import android.webkit.WebView;
import org.floens.chan.utils.ThemeHelper;
public class AboutActivity extends Activity { public class AboutActivity extends Activity {
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
ThemeHelper.setTheme(this);
WebView webView = new WebView(this); WebView webView = new WebView(this);
webView.loadUrl("file:///android_asset/html/licences.html"); webView.loadUrl("file:///android_asset/html/licences.html");

@ -21,6 +21,7 @@ import android.app.Activity;
import android.app.AlertDialog; import android.app.AlertDialog;
import android.content.DialogInterface; import android.content.DialogInterface;
import android.content.Intent; import android.content.Intent;
import android.content.res.TypedArray;
import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable;
import android.net.Uri; import android.net.Uri;
import android.nfc.NdefMessage; import android.nfc.NdefMessage;
@ -52,6 +53,7 @@ import org.floens.chan.ui.BadgeDrawable;
import org.floens.chan.ui.SwipeDismissListViewTouchListener; import org.floens.chan.ui.SwipeDismissListViewTouchListener;
import org.floens.chan.ui.SwipeDismissListViewTouchListener.DismissCallbacks; import org.floens.chan.ui.SwipeDismissListViewTouchListener.DismissCallbacks;
import org.floens.chan.ui.adapter.PinnedAdapter; import org.floens.chan.ui.adapter.PinnedAdapter;
import org.floens.chan.utils.ThemeHelper;
import org.floens.chan.utils.Utils; import org.floens.chan.utils.Utils;
import java.util.List; import java.util.List;
@ -87,6 +89,8 @@ public abstract class BaseActivity extends Activity implements PanelSlideListene
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
ThemeHelper.setTheme(this);
setContentView(R.layout.activity_base); setContentView(R.layout.activity_base);
pinDrawer = (DrawerLayout) findViewById(R.id.drawer_layout); pinDrawer = (DrawerLayout) findViewById(R.id.drawer_layout);
@ -111,7 +115,12 @@ public abstract class BaseActivity extends Activity implements PanelSlideListene
threadPane.setPanelSlideListener(this); threadPane.setPanelSlideListener(this);
threadPane.setParallaxDistance(200); threadPane.setParallaxDistance(200);
threadPane.setShadowResource(R.drawable.panel_shadow); threadPane.setShadowResource(R.drawable.panel_shadow);
threadPane.setSliderFadeColor(0xcce5e5e5);
TypedArray ta = obtainStyledAttributes(null, R.styleable.BoardPane, R.attr.board_pane_style, 0);
int color = ta.getColor(R.styleable.BoardPane_fade_color, 0);
ta.recycle();
threadPane.setSliderFadeColor(color);
threadPane.openPane(); threadPane.openPane();
} }

@ -49,6 +49,7 @@ import org.floens.chan.R;
import org.floens.chan.core.manager.BoardManager; import org.floens.chan.core.manager.BoardManager;
import org.floens.chan.core.model.Board; import org.floens.chan.core.model.Board;
import org.floens.chan.ui.SwipeDismissListViewTouchListener; import org.floens.chan.ui.SwipeDismissListViewTouchListener;
import org.floens.chan.utils.ThemeHelper;
import org.floens.chan.utils.Utils; import org.floens.chan.utils.Utils;
import java.util.ArrayList; import java.util.ArrayList;
@ -66,6 +67,8 @@ public class BoardEditor extends Activity {
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
ThemeHelper.setTheme(this);
list = boardManager.getSavedBoards(); list = boardManager.getSavedBoards();
adapter = new BoardEditAdapter(this, 0, list); adapter = new BoardEditAdapter(this, 0, list);

@ -25,12 +25,15 @@ import android.widget.LinearLayout;
import android.widget.TextView; import android.widget.TextView;
import org.floens.chan.ChanApplication; import org.floens.chan.ChanApplication;
import org.floens.chan.utils.ThemeHelper;
public class DeveloperActivity extends Activity { public class DeveloperActivity extends Activity {
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
ThemeHelper.setTheme(this);
LinearLayout wrapper = new LinearLayout(this); LinearLayout wrapper = new LinearLayout(this);
wrapper.setOrientation(LinearLayout.VERTICAL); wrapper.setOrientation(LinearLayout.VERTICAL);

@ -33,6 +33,7 @@ import org.floens.chan.ui.adapter.PostAdapter;
import org.floens.chan.ui.fragment.ImageViewFragment; import org.floens.chan.ui.fragment.ImageViewFragment;
import org.floens.chan.utils.ImageSaver; import org.floens.chan.utils.ImageSaver;
import org.floens.chan.utils.Logger; import org.floens.chan.utils.Logger;
import org.floens.chan.utils.ThemeHelper;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@ -70,6 +71,8 @@ public class ImageViewActivity extends Activity implements ViewPager.OnPageChang
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
ThemeHelper.setTheme(this);
if (postAdapter != null) { if (postAdapter != null) {
// Get the posts with images // Get the posts with images
ArrayList<Post> imagePosts = new ArrayList<Post>(); ArrayList<Post> imagePosts = new ArrayList<Post>();

@ -41,6 +41,7 @@ import org.floens.chan.core.ChanPreferences;
import org.floens.chan.core.manager.ReplyManager; import org.floens.chan.core.manager.ReplyManager;
import org.floens.chan.core.manager.ReplyManager.PassResponse; import org.floens.chan.core.manager.ReplyManager.PassResponse;
import org.floens.chan.core.model.Pass; import org.floens.chan.core.model.Pass;
import org.floens.chan.utils.ThemeHelper;
import org.floens.chan.utils.Utils; import org.floens.chan.utils.Utils;
public class PassSettingsActivity extends Activity implements OnCheckedChangeListener { public class PassSettingsActivity extends Activity implements OnCheckedChangeListener {
@ -52,6 +53,8 @@ public class PassSettingsActivity extends Activity implements OnCheckedChangeLis
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
ThemeHelper.setTheme(this);
instance = this; instance = this;
setFragment(ChanPreferences.getPassEnabled()); setFragment(ChanPreferences.getPassEnabled());

@ -25,6 +25,7 @@ import android.view.MenuItem;
import org.floens.chan.core.model.Loadable; import org.floens.chan.core.model.Loadable;
import org.floens.chan.ui.fragment.ReplyFragment; import org.floens.chan.ui.fragment.ReplyFragment;
import org.floens.chan.utils.Logger; import org.floens.chan.utils.Logger;
import org.floens.chan.utils.ThemeHelper;
public class ReplyActivity extends Activity { public class ReplyActivity extends Activity {
private static final String TAG = "ReplyActivity"; private static final String TAG = "ReplyActivity";
@ -39,6 +40,8 @@ public class ReplyActivity extends Activity {
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
ThemeHelper.setTheme(this);
if (loadable != null) { if (loadable != null) {
getActionBar().setDisplayHomeAsUpEnabled(true); getActionBar().setDisplayHomeAsUpEnabled(true);

@ -18,15 +18,55 @@
package org.floens.chan.ui.activity; package org.floens.chan.ui.activity;
import android.app.Activity; import android.app.Activity;
import android.content.Intent;
import android.os.Bundle; import android.os.Bundle;
import org.floens.chan.ui.fragment.SettingsFragment; import org.floens.chan.ui.fragment.SettingsFragment;
import org.floens.chan.utils.Logger;
import org.floens.chan.utils.ThemeHelper;
public class SettingsActivity extends Activity { public class SettingsActivity extends Activity {
private static boolean doingThemeRestart = false;
private static ThemeHelper.Theme lastTheme;
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
getFragmentManager().beginTransaction().replace(android.R.id.content, new SettingsFragment()).commit(); if (!doingThemeRestart) {
lastTheme = ThemeHelper.getTheme();
}
ThemeHelper.setTheme(this);
SettingsFragment frag = new SettingsFragment();
frag.setArguments(getIntent().getExtras());
getFragmentManager().beginTransaction().replace(android.R.id.content, frag).commit();
}
public void restart(Intent intent) {
doingThemeRestart = true;
startActivity(intent);
finish();
overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out);
}
@Override
protected void onDestroy() {
super.onDestroy();
if (doingThemeRestart) {
doingThemeRestart = false;
} else {
if (ThemeHelper.getTheme() != lastTheme) {
lastTheme = ThemeHelper.getTheme();
Logger.test("THEME CHANGED!");
Intent intent = new Intent(this, BoardActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
}
}
} }
} }

@ -40,6 +40,7 @@ import android.widget.TextView;
import org.floens.chan.R; import org.floens.chan.R;
import org.floens.chan.core.ChanPreferences; import org.floens.chan.core.ChanPreferences;
import org.floens.chan.utils.ThemeHelper;
import org.floens.chan.utils.Utils; import org.floens.chan.utils.Utils;
public class WatchSettingsActivity extends Activity implements OnCheckedChangeListener { public class WatchSettingsActivity extends Activity implements OnCheckedChangeListener {
@ -49,6 +50,8 @@ public class WatchSettingsActivity extends Activity implements OnCheckedChangeLi
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
ThemeHelper.setTheme(this);
setFragment(ChanPreferences.getWatchEnabled()); setFragment(ChanPreferences.getWatchEnabled());
} }

@ -20,15 +20,20 @@ package org.floens.chan.ui.fragment;
import android.content.Intent; import android.content.Intent;
import android.content.pm.PackageManager.NameNotFoundException; import android.content.pm.PackageManager.NameNotFoundException;
import android.os.Bundle; import android.os.Bundle;
import android.preference.ListPreference;
import android.preference.Preference; import android.preference.Preference;
import android.preference.Preference.OnPreferenceClickListener; import android.preference.Preference.OnPreferenceClickListener;
import android.preference.PreferenceFragment; import android.preference.PreferenceFragment;
import android.preference.PreferenceGroup; import android.preference.PreferenceGroup;
import android.view.View;
import android.widget.ListView;
import android.widget.Toast; import android.widget.Toast;
import org.floens.chan.R; import org.floens.chan.R;
import org.floens.chan.core.ChanPreferences; import org.floens.chan.core.ChanPreferences;
import org.floens.chan.ui.activity.AboutActivity; import org.floens.chan.ui.activity.AboutActivity;
import org.floens.chan.ui.activity.SettingsActivity;
import org.floens.chan.utils.ThemeHelper;
public class SettingsFragment extends PreferenceFragment { public class SettingsFragment extends PreferenceFragment {
private int clickCount = 0; private int clickCount = 0;
@ -87,6 +92,43 @@ public class SettingsFragment extends PreferenceFragment {
developerPreference = findPreference("about_developer"); developerPreference = findPreference("about_developer");
((PreferenceGroup) findPreference("group_about")).removePreference(developerPreference); ((PreferenceGroup) findPreference("group_about")).removePreference(developerPreference);
updateDeveloperPreference(); updateDeveloperPreference();
final ListPreference theme = (ListPreference) findPreference("preference_theme");
String currentValue = theme.getValue();
if (currentValue == null) {
theme.setValue((String) theme.getEntryValues()[0]);
currentValue = theme.getValue();
}
updateThemeSummary(theme, currentValue.toString());
theme.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
updateThemeSummary(theme, newValue.toString());
// Thanks! https://github.com/CyanogenMod/android_packages_apps_Calculator/blob/cm-10.2/src/com/android/calculator2/view/PreferencesFragment.java
if (!newValue.toString().equals(ThemeHelper.getTheme().name)) {
Intent intent = new Intent(getActivity(), SettingsActivity.class);
intent.putExtra("pos", getListView().getFirstVisiblePosition());
View child = getListView().getChildAt(0);
intent.putExtra("off", child != null ? child.getTop() : 0);
((SettingsActivity) getActivity()).restart(intent);
}
return true;
}
});
}
public void onStart() {
super.onStart();
final Bundle args = getArguments();
if (args != null) {
getListView().setSelectionFromTop(args.getInt("pos", 0), args.getInt("off", 0));
}
} }
@Override @Override
@ -106,6 +148,10 @@ public class SettingsFragment extends PreferenceFragment {
} }
} }
private ListView getListView() {
return (ListView) getView().findViewById(android.R.id.list);
}
private void updateDeveloperPreference() { private void updateDeveloperPreference() {
if (ChanPreferences.getDeveloper()) { if (ChanPreferences.getDeveloper()) {
((PreferenceGroup) findPreference("group_about")).addPreference(developerPreference); ((PreferenceGroup) findPreference("group_about")).addPreference(developerPreference);
@ -113,4 +159,9 @@ public class SettingsFragment extends PreferenceFragment {
((PreferenceGroup) findPreference("group_about")).removePreference(developerPreference); ((PreferenceGroup) findPreference("group_about")).removePreference(developerPreference);
} }
} }
private void updateThemeSummary(ListPreference list, String value) {
int index = list.findIndexOfValue(value);
list.setSummary(list.getEntries()[index]);
}
} }

@ -20,6 +20,7 @@ package org.floens.chan.ui.view;
import android.app.Activity; import android.app.Activity;
import android.content.Context; import android.content.Context;
import android.content.res.Resources; import android.content.res.Resources;
import android.content.res.TypedArray;
import android.graphics.Color; import android.graphics.Color;
import android.text.Layout; import android.text.Layout;
import android.text.Selection; import android.text.Selection;
@ -78,6 +79,11 @@ public class PostView extends LinearLayout implements View.OnClickListener, View
private NetworkImageView countryView; private NetworkImageView countryView;
private View lastSeen; private View lastSeen;
private int thumbnailBackground;
private int savedReplyColor;
private int highlightedColor;
private int replyCountColor;
/** /**
* Represents a post. Use setPost(Post ThreadManager) to fill it with data. * Represents a post. Use setPost(Post ThreadManager) to fill it with data.
* setPost can be called multiple times (useful for ListView). * setPost can be called multiple times (useful for ListView).
@ -87,16 +93,19 @@ public class PostView extends LinearLayout implements View.OnClickListener, View
public PostView(Context activity) { public PostView(Context activity) {
super(activity); super(activity);
context = (Activity) activity; context = (Activity) activity;
init();
} }
public PostView(Context activity, AttributeSet attbs) { public PostView(Context activity, AttributeSet attbs) {
super(activity, attbs); super(activity, attbs);
context = (Activity) activity; context = (Activity) activity;
init();
} }
public PostView(Context activity, AttributeSet attbs, int style) { public PostView(Context activity, AttributeSet attbs, int style) {
super(activity, attbs, style); super(activity, attbs, style);
context = (Activity) activity; context = (Activity) activity;
init();
} }
@Override @Override
@ -228,9 +237,9 @@ public class PostView extends LinearLayout implements View.OnClickListener, View
} }
if (post.isSavedReply) { if (post.isSavedReply) {
full.setBackgroundColor(0xFFBCBCBC); full.setBackgroundColor(savedReplyColor);
} else if (manager.isPostHightlighted(post)) { } else if (manager.isPostHightlighted(post)) {
full.setBackgroundColor(0xFFD6BAD0); full.setBackgroundColor(highlightedColor);
} else { } else {
full.setBackgroundColor(0x00000000); full.setBackgroundColor(0x00000000);
} }
@ -246,6 +255,15 @@ public class PostView extends LinearLayout implements View.OnClickListener, View
} }
} }
private void init() {
TypedArray ta = context.obtainStyledAttributes(null, R.styleable.PostView, R.attr.post_style, 0);
thumbnailBackground = ta.getColor(R.styleable.PostView_thumbnail_background, 0);
savedReplyColor = ta.getColor(R.styleable.PostView_saved_reply_color, 0);
highlightedColor = ta.getColor(R.styleable.PostView_highlighted_color, 0);
replyCountColor = ta.getColor(R.styleable.PostView_reply_count_color, 0);
ta.recycle();
}
private void buildView(final Context context) { private void buildView(final Context context) {
if (isBuild) if (isBuild)
return; return;
@ -277,7 +295,7 @@ public class PostView extends LinearLayout implements View.OnClickListener, View
LinearLayout left = new LinearLayout(context); LinearLayout left = new LinearLayout(context);
left.setOrientation(VERTICAL); left.setOrientation(VERTICAL);
left.setBackgroundColor(0xffdddddd); left.setBackgroundColor(thumbnailBackground);
left.addView(imageView, new LinearLayout.LayoutParams(imageSize, imageSize)); left.addView(imageView, new LinearLayout.LayoutParams(imageSize, imageSize));
@ -326,7 +344,7 @@ public class PostView extends LinearLayout implements View.OnClickListener, View
// This behavior differs with 4.4 / 4.1 // This behavior differs with 4.4 / 4.1
Utils.setPressedDrawable(repliesCountView); Utils.setPressedDrawable(repliesCountView);
repliesCountView.setTextColor(Color.argb(255, 100, 100, 100)); repliesCountView.setTextColor(replyCountColor);
repliesCountView.setPadding(postPadding, postPadding, postPadding, postPadding); repliesCountView.setPadding(postPadding, postPadding, postPadding, postPadding);
repliesCountView.setTextSize(14); repliesCountView.setTextSize(14);

@ -0,0 +1,41 @@
package org.floens.chan.utils;
import android.app.Activity;
import org.floens.chan.R;
import org.floens.chan.core.ChanPreferences;
public class ThemeHelper {
public enum Theme {
LIGHT("light", R.style.AppTheme),
DARK("dark", R.style.AppTheme_Dark),
BLACK("black", R.style.AppTheme_Dark);
public String name;
public int resValue;
private Theme(String name, int resValue) {
this.name = name;
this.resValue = resValue;
}
}
public static void setTheme(Activity activity) {
activity.setTheme(getTheme().resValue);
}
public static Theme getTheme() {
String themeName = ChanPreferences.getTheme();
Theme theme = null;
if (themeName.equals("light")) {
theme = Theme.LIGHT;
} else if (themeName.equals("dark")) {
theme = Theme.DARK;
} else if (themeName.equals("black")) {
theme = Theme.BLACK;
}
return theme;
}
}

@ -12,14 +12,14 @@
android:id="@+id/left_pane" android:id="@+id/left_pane"
android:layout_width="100dp" android:layout_width="100dp"
android:layout_height="match_parent" android:layout_height="match_parent"
android:background="#FFFFFFFF" /> style="?board_pane_left_style" />
<FrameLayout <FrameLayout
android:id="@+id/right_pane" android:id="@+id/right_pane"
android:layout_width="100dp" android:layout_width="100dp"
android:layout_height="match_parent" android:layout_height="match_parent"
android:layout_weight="1" android:layout_weight="1"
android:background="#FFE5E5E5" /> style="?board_pane_right_style"/>
</android.support.v4.widget.SlidingPaneLayout> </android.support.v4.widget.SlidingPaneLayout>
<ListView <ListView

@ -1,7 +1,5 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources> <resources>
<color name="image_list_background">#88000000</color>
<declare-styleable name="FloatLabelEditText"> <declare-styleable name="FloatLabelEditText">
<attr name="hint" format="string"/> <attr name="hint" format="string"/>
<attr name="text" format="string"/> <attr name="text" format="string"/>
@ -13,4 +11,21 @@
<enum name="half" value="2"/> <enum name="half" value="2"/>
</attr> </attr>
</declare-styleable> </declare-styleable>
<attr name="board_pane_style" format="reference"></attr>
<attr name="board_pane_left_style" format="reference" />
<attr name="board_pane_right_style" format="reference" />
<declare-styleable name="BoardPane">
<attr name="fade_color" format="color"/>
</declare-styleable>
<attr name="post_style" format="reference" />
<declare-styleable name="PostView">
<attr name="thumbnail_background" format="color"/>
<attr name="saved_reply_color" format="color"/>
<attr name="highlighted_color" format="color"/>
<attr name="reply_count_color" format="color"/>
</declare-styleable>
</resources> </resources>

@ -100,6 +100,19 @@
<string name="preference_pass_settings">4chan pass</string> <string name="preference_pass_settings">4chan pass</string>
<string name="preference_general">General</string> <string name="preference_general">General</string>
<string name="preference_theme">Theme</string>
<string-array name="preference_themes">
<item>Light</item>
<item>Dark</item>
<item>Black</item>
</string-array>
<string-array name="preference_themes_values">
<item>light</item>
<item>dark</item>
<item>black</item>
</string-array>
<string name="preference_open_link_confirmation">Ask before opening links</string> <string name="preference_open_link_confirmation">Ask before opening links</string>
<string name="preference_autoplay">Start playing videos directly</string> <string name="preference_autoplay">Start playing videos directly</string>

@ -1,18 +1,68 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"> <?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="Theme.ImageList" parent="AppTheme">
<item name="android:windowIsTranslucent">true</item>
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:backgroundDimEnabled">true</item>
</style>
<color name="image_list_background">#88000000</color>
<style name="AppTheme" parent="android:Theme.Holo.Light.DarkActionBar"> <style name="AppTheme" parent="android:Theme.Holo.Light.DarkActionBar">
<item name="board_pane_style">@style/BoardPane</item>
<item name="board_pane_left_style">@style/BoardLeftPane</item>
<item name="board_pane_right_style">@style/BoardRightPane</item>
<item name="post_style">@style/PostView</item>
</style> </style>
<style name="Theme.ImageList" parent="AppTheme"> <style name="AppTheme.Dark" parent="android:Theme.Holo">
<item name="android:windowIsTranslucent">true</item> <item name="android:actionBarStyle">@android:style/Widget.Holo.ActionBar.Solid</item>
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:backgroundDimEnabled">true</item>
</style>
</resources> <item name="board_pane_style">@style/BoardPane.Dark</item>
<item name="board_pane_left_style">@style/BoardLeftPane.Dark</item>
<item name="board_pane_right_style">@style/BoardRightPane.Dark</item>
<item name="post_style">@style/PostView.Dark</item>
</style>
<style name="BoardPane">
<item name="fade_color">#CCE5E5E5</item>
</style>
<style name="BoardLeftPane">
<item name="android:background">#FFFFFFFF</item>
</style>
<style name="BoardRightPane">
<item name="android:background">#FFE5E5E5</item>
</style>
<style name="PostView">
<item name="thumbnail_background">#FFDDDDDD</item>
<item name="saved_reply_color">#FFBCBCBC</item>
<item name="highlighted_color">#FFD6BAD0</item>
<item name="reply_count_color">#FF646464</item>
</style>
<style name="BoardPane.Dark">
<item name="fade_color">#a5323232</item>
</style>
<style name="BoardLeftPane.Dark">
<item name="android:background">#ff232323</item>
</style>
<style name="BoardRightPane.Dark">
<item name="android:background">#ff232323</item>
</style>
<style name="PostView.Dark">
<item name="thumbnail_background">#00000000</item>
<item name="saved_reply_color">#ff5c5c5c</item>
<item name="highlighted_color">#ff858585</item>
<item name="reply_count_color">#ff737373</item>
</style>
</resources>

@ -27,6 +27,14 @@
</Preference> </Preference>
<PreferenceCategory android:title="@string/preference_general" > <PreferenceCategory android:title="@string/preference_general" >
<ListPreference
android:key="preference_theme"
android:defaultValue="light"
android:dialogTitle="@string/preference_theme"
android:entries="@array/preference_themes"
android:entryValues="@array/preference_themes_values"
android:title="@string/preference_theme" />
<CheckBoxPreference <CheckBoxPreference
android:defaultValue="true" android:defaultValue="true"
android:key="preference_open_link_confirmation" android:key="preference_open_link_confirmation"

Loading…
Cancel
Save