From 7f7a90aa8077b5f4db6241bf2177c90c0f768bce Mon Sep 17 00:00:00 2001 From: Florens Douwes Date: Mon, 26 May 2014 00:52:18 +0200 Subject: [PATCH] Finished dark theme and added black theme. --- .../java/org/floens/chan/ChanApplication.java | 2 + .../java/org/floens/chan/core/model/Post.java | 53 ++------------- .../floens/chan/core/model/PostLinkable.java | 11 ++-- .../floens/chan/ui/activity/BaseActivity.java | 1 + .../chan/ui/activity/BoardActivity.java | 10 ++- .../chan/ui/activity/SettingsActivity.java | 8 +-- .../chan/ui/fragment/SettingsFragment.java | 2 +- .../chan/ui/fragment/ThreadFragment.java | 2 + .../org/floens/chan/ui/view/PostView.java | 60 ++++++++++++++++- .../org/floens/chan/utils/ThemeHelper.java | 44 ++++++++++++- .../src/main/res/layout/board_edit_item.xml | 2 +- Clover/app/src/main/res/values/attrs.xml | 11 ++++ Clover/app/src/main/res/values/styles.xml | 64 ++++++++++++++++++- 13 files changed, 197 insertions(+), 73 deletions(-) diff --git a/Clover/app/src/main/java/org/floens/chan/ChanApplication.java b/Clover/app/src/main/java/org/floens/chan/ChanApplication.java index 83e702b2..d52fd04e 100644 --- a/Clover/app/src/main/java/org/floens/chan/ChanApplication.java +++ b/Clover/app/src/main/java/org/floens/chan/ChanApplication.java @@ -35,6 +35,7 @@ import org.floens.chan.core.net.BitmapLruImageCache; import org.floens.chan.database.DatabaseManager; import org.floens.chan.service.WatchService; import org.floens.chan.utils.IconCache; +import org.floens.chan.utils.ThemeHelper; import java.lang.reflect.Field; @@ -46,6 +47,7 @@ public class ChanApplication extends Application implements PinListener { private static PinnedManager pinnedManager; private static ReplyManager replyManager; private static DatabaseManager databaseManager; + private static ThemeHelper themeHelper; public ChanApplication() { instance = this; diff --git a/Clover/app/src/main/java/org/floens/chan/core/model/Post.java b/Clover/app/src/main/java/org/floens/chan/core/model/Post.java index 51aa9a31..2cf1e039 100644 --- a/Clover/app/src/main/java/org/floens/chan/core/model/Post.java +++ b/Clover/app/src/main/java/org/floens/chan/core/model/Post.java @@ -20,8 +20,6 @@ package org.floens.chan.core.model; import android.graphics.Color; import android.text.SpannableString; import android.text.TextUtils; -import android.text.style.AbsoluteSizeSpan; -import android.text.style.BackgroundColorSpan; import android.text.style.ForegroundColorSpan; import org.floens.chan.chan.ChanUrls; @@ -83,16 +81,17 @@ public class Post { public List repliesFrom = new ArrayList(); public final ArrayList linkables = new ArrayList(); - /** - * The PostView the Post is currently bound to. - */ + public boolean parsedSpans = false; public SpannableString subjectSpan; public SpannableString nameSpan; public SpannableString tripcodeSpan; public SpannableString idSpan; public SpannableString capcodeSpan; + /** + * The PostView the Post is currently bound to. + */ private PostView linkableListener; private String rawComment; @@ -156,53 +155,9 @@ public class Post { e.printStackTrace(); } - parseSpans(); - return true; } - private void parseSpans() { - if (!TextUtils.isEmpty(subject)) { - subjectSpan = new SpannableString(subject); - subjectSpan.setSpan(new ForegroundColorSpan(Color.argb(255, 15, 12, 93)), 0, subjectSpan.length(), 0); - } - - if (!TextUtils.isEmpty(name)) { - nameSpan = new SpannableString(name); - nameSpan.setSpan(new ForegroundColorSpan(Color.argb(255, 17, 119, 67)), 0, nameSpan.length(), 0); - } - - if (!TextUtils.isEmpty(tripcode)) { - tripcodeSpan = new SpannableString(tripcode); - tripcodeSpan.setSpan(new ForegroundColorSpan(Color.argb(255, 17, 119, 67)), 0, tripcodeSpan.length(), 0); - tripcodeSpan.setSpan(new AbsoluteSizeSpan(10, true), 0, tripcodeSpan.length(), 0); - } - - if (!TextUtils.isEmpty(id)) { - idSpan = new SpannableString(" ID: " + id + " "); - - // Stolen from the 4chan extension - int hash = id.hashCode(); - - int r = (hash >> 24) & 0xff; - int g = (hash >> 16) & 0xff; - int b = (hash >> 8) & 0xff; - - int idColor = (0xff << 24) + (r << 16) + (g << 8) + b; - int idBgColor = ((r * 0.299f) + (g * 0.587f) + (b * 0.114f)) > 125f ? 0xff636363 : 0x00000000; - - idSpan.setSpan(new ForegroundColorSpan(idColor), 0, idSpan.length(), 0); - idSpan.setSpan(new BackgroundColorSpan(idBgColor), 0, idSpan.length(), 0); - idSpan.setSpan(new AbsoluteSizeSpan(10, true), 0, idSpan.length(), 0); - } - - if (!TextUtils.isEmpty(capcode)) { - capcodeSpan = new SpannableString("Capcode: " + capcode); - capcodeSpan.setSpan(new ForegroundColorSpan(Color.argb(255, 255, 0, 0)), 0, capcodeSpan.length(), 0); - capcodeSpan.setSpan(new AbsoluteSizeSpan(10, true), 0, capcodeSpan.length(), 0); - } - } - private CharSequence parseComment(String commentRaw, boolean simpleMode) { if (simpleMode) return ""; diff --git a/Clover/app/src/main/java/org/floens/chan/core/model/PostLinkable.java b/Clover/app/src/main/java/org/floens/chan/core/model/PostLinkable.java index 6bb17767..01581113 100644 --- a/Clover/app/src/main/java/org/floens/chan/core/model/PostLinkable.java +++ b/Clover/app/src/main/java/org/floens/chan/core/model/PostLinkable.java @@ -17,11 +17,12 @@ */ package org.floens.chan.core.model; -import android.graphics.Color; import android.text.TextPaint; import android.text.style.ClickableSpan; import android.view.View; +import org.floens.chan.utils.ThemeHelper; + /** * Anything that links to something in a post uses this entity. */ @@ -30,8 +31,6 @@ public class PostLinkable extends ClickableSpan { QUOTE, LINK, SPOILER } - ; - public final Post post; public final String key; public final String value; @@ -54,11 +53,11 @@ public class PostLinkable extends ClickableSpan { @Override public void updateDrawState(TextPaint ds) { if (type == Type.QUOTE || type == Type.LINK) { - ds.setColor(type == Type.QUOTE ? Color.argb(255, 221, 0, 0) : Color.argb(255, 0, 0, 180)); + ds.setColor(type == Type.QUOTE ? ThemeHelper.getInstance().getQuoteColor() : ThemeHelper.getInstance().getLinkColor()); ds.setUnderlineText(true); } else if (type == Type.SPOILER) { - ds.setColor(0x00000000); - ds.bgColor = 0xff000000; + ds.setColor(ThemeHelper.getInstance().getSpoilerColor()); + ds.bgColor = ThemeHelper.getInstance().getSpoilerColor(); ds.setUnderlineText(false); } } diff --git a/Clover/app/src/main/java/org/floens/chan/ui/activity/BaseActivity.java b/Clover/app/src/main/java/org/floens/chan/ui/activity/BaseActivity.java index bc367d95..c173b196 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/activity/BaseActivity.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/activity/BaseActivity.java @@ -90,6 +90,7 @@ public abstract class BaseActivity extends Activity implements PanelSlideListene super.onCreate(savedInstanceState); ThemeHelper.setTheme(this); + ThemeHelper.getInstance().reloadPostViewColors(this); setContentView(R.layout.activity_base); diff --git a/Clover/app/src/main/java/org/floens/chan/ui/activity/BoardActivity.java b/Clover/app/src/main/java/org/floens/chan/ui/activity/BoardActivity.java index 8e16f3bc..80394edd 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/activity/BoardActivity.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/activity/BoardActivity.java @@ -48,17 +48,21 @@ import org.floens.chan.utils.Utils; import java.util.List; public class BoardActivity extends BaseActivity implements ActionBar.OnNavigationListener { - private Loadable boardLoadable = new Loadable(); - private Loadable threadLoadable = new Loadable(); + private Loadable boardLoadable; + private Loadable threadLoadable; private ThreadFragment boardFragment; private ThreadFragment threadFragment; - private boolean actionBarSetToListNavigation = false; + private boolean actionBarSetToListNavigation; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + actionBarSetToListNavigation = false; + boardLoadable = new Loadable(); + threadLoadable = new Loadable(); + boardFragment = ThreadFragment.newInstance(this); threadFragment = ThreadFragment.newInstance(this); diff --git a/Clover/app/src/main/java/org/floens/chan/ui/activity/SettingsActivity.java b/Clover/app/src/main/java/org/floens/chan/ui/activity/SettingsActivity.java index 2bd13673..4144c33d 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/activity/SettingsActivity.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/activity/SettingsActivity.java @@ -22,7 +22,6 @@ import android.content.Intent; import android.os.Bundle; import org.floens.chan.ui.fragment.SettingsFragment; -import org.floens.chan.utils.Logger; import org.floens.chan.utils.ThemeHelper; public class SettingsActivity extends Activity { @@ -34,7 +33,7 @@ public class SettingsActivity extends Activity { super.onCreate(savedInstanceState); if (!doingThemeRestart) { - lastTheme = ThemeHelper.getTheme(); + lastTheme = ThemeHelper.getInstance().getTheme(); } ThemeHelper.setTheme(this); @@ -58,9 +57,8 @@ public class SettingsActivity extends Activity { if (doingThemeRestart) { doingThemeRestart = false; } else { - if (ThemeHelper.getTheme() != lastTheme) { - lastTheme = ThemeHelper.getTheme(); - Logger.test("THEME CHANGED!"); + if (ThemeHelper.getInstance().getTheme() != lastTheme) { + lastTheme = ThemeHelper.getInstance().getTheme(); Intent intent = new Intent(this, BoardActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); diff --git a/Clover/app/src/main/java/org/floens/chan/ui/fragment/SettingsFragment.java b/Clover/app/src/main/java/org/floens/chan/ui/fragment/SettingsFragment.java index 535d0275..987125f5 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/fragment/SettingsFragment.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/fragment/SettingsFragment.java @@ -107,7 +107,7 @@ public class SettingsFragment extends PreferenceFragment { 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)) { + if (!newValue.toString().equals(ThemeHelper.getInstance().getTheme().name)) { Intent intent = new Intent(getActivity(), SettingsActivity.class); intent.putExtra("pos", getListView().getFirstVisiblePosition()); diff --git a/Clover/app/src/main/java/org/floens/chan/ui/fragment/ThreadFragment.java b/Clover/app/src/main/java/org/floens/chan/ui/fragment/ThreadFragment.java index 7dfd3590..402a01c7 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/fragment/ThreadFragment.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/fragment/ThreadFragment.java @@ -106,6 +106,8 @@ public class ThreadFragment extends Fragment implements ThreadManager.ThreadMana if (threadManager != null) { threadManager.onDestroy(); } + threadManager = null; + loadable = null; } @Override diff --git a/Clover/app/src/main/java/org/floens/chan/ui/view/PostView.java b/Clover/app/src/main/java/org/floens/chan/ui/view/PostView.java index 00abdef7..39b5200f 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/view/PostView.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/view/PostView.java @@ -21,7 +21,6 @@ import android.app.Activity; import android.content.Context; import android.content.res.Resources; import android.content.res.TypedArray; -import android.graphics.Color; import android.text.Layout; import android.text.Selection; import android.text.Spannable; @@ -30,6 +29,7 @@ import android.text.TextUtils; import android.text.format.DateUtils; import android.text.method.LinkMovementMethod; import android.text.style.AbsoluteSizeSpan; +import android.text.style.BackgroundColorSpan; import android.text.style.ClickableSpan; import android.text.style.ForegroundColorSpan; import android.util.AttributeSet; @@ -83,6 +83,7 @@ public class PostView extends LinearLayout implements View.OnClickListener, View private int savedReplyColor; private int highlightedColor; private int replyCountColor; + private int dateColor; /** * Represents a post. Use setPost(Post ThreadManager) to fill it with data. @@ -121,6 +122,13 @@ public class PostView extends LinearLayout implements View.OnClickListener, View this.post = post; this.manager = manager; + post.setLinkableListener(null); + + if (!post.parsedSpans) { + post.parsedSpans = true; + parseSpans(post); + } + buildView(context); if (post.hasImage) { @@ -157,7 +165,7 @@ public class PostView extends LinearLayout implements View.OnClickListener, View DateUtils.SECOND_IN_MILLIS, 0); SpannableString date = new SpannableString("No." + post.no + " " + relativeTime); - date.setSpan(new ForegroundColorSpan(Color.argb(255, 100, 100, 100)), 0, date.length(), 0); + date.setSpan(new ForegroundColorSpan(dateColor), 0, date.length(), 0); date.setSpan(new AbsoluteSizeSpan(10, true), 0, date.length(), 0); total = TextUtils.concat(total, date, " "); @@ -261,6 +269,54 @@ public class PostView extends LinearLayout implements View.OnClickListener, View 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); + dateColor = ta.getColor(R.styleable.PostView_date_color, 0); + ta.recycle(); + } + + private void parseSpans(Post post) { + TypedArray ta = context.obtainStyledAttributes(null, R.styleable.PostView, R.attr.post_style, 0); + + if (!TextUtils.isEmpty(post.subject)) { + post.subjectSpan = new SpannableString(post.subject); + post.subjectSpan.setSpan(new ForegroundColorSpan(ta.getColor(R.styleable.PostView_subject_color, 0)), 0, post.subjectSpan.length(), 0); + } + + if (!TextUtils.isEmpty(post.name)) { + post.nameSpan = new SpannableString(post.name); + post.nameSpan.setSpan(new ForegroundColorSpan(ta.getColor(R.styleable.PostView_name_color, 0)), 0, post.nameSpan.length(), 0); + } + + if (!TextUtils.isEmpty(post.tripcode)) { + post.tripcodeSpan = new SpannableString(post.tripcode); + post.tripcodeSpan.setSpan(new ForegroundColorSpan(ta.getColor(R.styleable.PostView_name_color, 0)), 0, post.tripcodeSpan.length(), 0); + post.tripcodeSpan.setSpan(new AbsoluteSizeSpan(10, true), 0, post.tripcodeSpan.length(), 0); + } + + if (!TextUtils.isEmpty(post.id)) { + post.idSpan = new SpannableString(" ID: " + post.id + " "); + + // Stolen from the 4chan extension + int hash = post.id.hashCode(); + + int r = (hash >> 24) & 0xff; + int g = (hash >> 16) & 0xff; + int b = (hash >> 8) & 0xff; + + int idColor = (0xff << 24) + (r << 16) + (g << 8) + b; + boolean lightColor = (r * 0.299f) + (g * 0.587f) + (b * 0.114f) > 125f; + int idBgColor = lightColor ? ta.getColor(R.styleable.PostView_id_background_light, 0) : ta.getColor(R.styleable.PostView_id_background_dark, 0); + + post.idSpan.setSpan(new ForegroundColorSpan(idColor), 0, post.idSpan.length(), 0); + post.idSpan.setSpan(new BackgroundColorSpan(idBgColor), 0, post.idSpan.length(), 0); + post.idSpan.setSpan(new AbsoluteSizeSpan(10, true), 0, post.idSpan.length(), 0); + } + + if (!TextUtils.isEmpty(post.capcode)) { + post.capcodeSpan = new SpannableString("Capcode: " + post.capcode); + post.capcodeSpan.setSpan(new ForegroundColorSpan(ta.getColor(R.styleable.PostView_capcode_color, 0)), 0, post.capcodeSpan.length(), 0); + post.capcodeSpan.setSpan(new AbsoluteSizeSpan(10, true), 0, post.capcodeSpan.length(), 0); + } + ta.recycle(); } diff --git a/Clover/app/src/main/java/org/floens/chan/utils/ThemeHelper.java b/Clover/app/src/main/java/org/floens/chan/utils/ThemeHelper.java index f8155309..d1b4d8a6 100644 --- a/Clover/app/src/main/java/org/floens/chan/utils/ThemeHelper.java +++ b/Clover/app/src/main/java/org/floens/chan/utils/ThemeHelper.java @@ -1,6 +1,8 @@ package org.floens.chan.utils; import android.app.Activity; +import android.content.Context; +import android.content.res.TypedArray; import org.floens.chan.R; import org.floens.chan.core.ChanPreferences; @@ -9,7 +11,7 @@ public class ThemeHelper { public enum Theme { LIGHT("light", R.style.AppTheme), DARK("dark", R.style.AppTheme_Dark), - BLACK("black", R.style.AppTheme_Dark); + BLACK("black", R.style.AppTheme_Dark_Black); public String name; public int resValue; @@ -20,11 +22,27 @@ public class ThemeHelper { } } + private static ThemeHelper instance; + private int quoteColor; + private int linkColor; + private int spoilerColor; + + public static ThemeHelper getInstance() { + if (instance == null) { + instance = new ThemeHelper(); + } + + return instance; + } + public static void setTheme(Activity activity) { - activity.setTheme(getTheme().resValue); + activity.setTheme(ThemeHelper.getInstance().getTheme().resValue); + } + + public ThemeHelper() { } - public static Theme getTheme() { + public Theme getTheme() { String themeName = ChanPreferences.getTheme(); Theme theme = null; @@ -38,4 +56,24 @@ public class ThemeHelper { return theme; } + + public void reloadPostViewColors(Context context) { + TypedArray ta = context.obtainStyledAttributes(null, R.styleable.PostView, R.attr.post_style, 0); + quoteColor = ta.getColor(R.styleable.PostView_quote_color, 0); + linkColor = ta.getColor(R.styleable.PostView_link_color, 0); + spoilerColor = ta.getColor(R.styleable.PostView_spoiler_color, 0); + ta.recycle(); + } + + public int getQuoteColor() { + return quoteColor; + } + + public int getLinkColor() { + return linkColor; + } + + public int getSpoilerColor() { + return spoilerColor; + } } diff --git a/Clover/app/src/main/res/layout/board_edit_item.xml b/Clover/app/src/main/res/layout/board_edit_item.xml index 7261013b..e147e3f5 100644 --- a/Clover/app/src/main/res/layout/board_edit_item.xml +++ b/Clover/app/src/main/res/layout/board_edit_item.xml @@ -12,7 +12,7 @@ android:paddingBottom="12dp" android:paddingLeft="16dp" android:paddingTop="12dp" - android:color="#77111111" /> + style="?attr/board_edit_item_style"/> + + + + + + + + + + + diff --git a/Clover/app/src/main/res/values/styles.xml b/Clover/app/src/main/res/values/styles.xml index 7b4c3f2b..c1298223 100644 --- a/Clover/app/src/main/res/values/styles.xml +++ b/Clover/app/src/main/res/values/styles.xml @@ -9,14 +9,20 @@ #88000000 + + + + + + + + + + @@ -44,9 +64,23 @@ #FFBCBCBC #FFD6BAD0 #FF646464 + #ff117743 + #ff0F0C5D + #ff646464 + #ffDD0000 + #ff0000B4 + #ff000000 + #ffff0000 + #ff636363 + #00000000 + + + + @@ -61,8 +95,32 @@ + + + + + + + + + +