diff --git a/CHANGELOG.md b/CHANGELOG.md
index fd67d572f..b5a6f189c 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -8,6 +8,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
### Added
+- Icons for OP comments and up/downvote ([#305](https://github.com/Tunous/Dawn/pull/305))
- Support for reddit galleries ([#312](https://github.com/Tunous/Dawn/pull/312))
### Changed
diff --git a/app/src/main/java/me/saket/dank/ui/submission/SubmissionCommentTreeUiConstructor.java b/app/src/main/java/me/saket/dank/ui/submission/SubmissionCommentTreeUiConstructor.java
index 0a430890a..22f2f626c 100644
--- a/app/src/main/java/me/saket/dank/ui/submission/SubmissionCommentTreeUiConstructor.java
+++ b/app/src/main/java/me/saket/dank/ui/submission/SubmissionCommentTreeUiConstructor.java
@@ -8,6 +8,7 @@
import androidx.annotation.ColorRes;
import androidx.core.content.ContextCompat;
+import me.saket.dank.utils.*;
import net.dean.jraw.models.Comment;
import net.dean.jraw.models.Identifiable;
import net.dean.jraw.models.MoreChildren;
@@ -39,16 +40,7 @@
import me.saket.dank.ui.submission.adapter.SubmissionRemoteComment;
import me.saket.dank.ui.submission.adapter.SubmissionScreenUiModel;
import me.saket.dank.ui.user.UserSessionRepository;
-import me.saket.dank.utils.CombineLatestWithLog;
import me.saket.dank.utils.CombineLatestWithLog.O;
-import me.saket.dank.utils.DankSubmissionRequest;
-import me.saket.dank.utils.Dates;
-import me.saket.dank.utils.JrawUtils2;
-import me.saket.dank.utils.Optional;
-import me.saket.dank.utils.RxHashSet;
-import me.saket.dank.utils.Strings;
-import me.saket.dank.utils.Themes;
-import me.saket.dank.utils.Truss;
import me.saket.dank.utils.markdown.Markdown;
import me.saket.dank.vote.VotingManager;
import timber.log.Timber;
@@ -616,6 +608,7 @@ private CharSequence constructCommentByline(
boolean isCollapsed)
{
Truss bylineBuilder = new Truss();
+ int voteColor = color(context, Themes.voteColor(voteDirection));
if (isCollapsed) {
bylineBuilder.append(author);
bylineBuilder.append(context.getString(R.string.submission_comment_byline_item_separator));
@@ -625,6 +618,10 @@ private CharSequence constructCommentByline(
bylineBuilder.append(String.format(hiddenCommentsString, hiddenCommentsCount));
} else {
+ if (isAuthorOP) {
+ ColorReplicationIcons.pushOPCommentIcon(context, bylineBuilder);
+ }
+
bylineBuilder.pushSpan(new ForegroundColorSpan(color(context, isAuthorOP
? R.color.submission_comment_byline_author_op
: R.color.submission_comment_byline_author)
@@ -633,7 +630,7 @@ private CharSequence constructCommentByline(
bylineBuilder.popSpan();
bylineBuilder.append(context.getString(R.string.submission_comment_byline_item_separator));
- bylineBuilder.pushSpan(new ForegroundColorSpan(color(context, Themes.voteColor(voteDirection))));
+ bylineBuilder.pushSpan(new ForegroundColorSpan(voteColor));
String scoreText = optionalCommentScore
.map(score -> context.getResources().getQuantityString(
R.plurals.submission_comment_byline_item_score,
@@ -643,6 +640,8 @@ private CharSequence constructCommentByline(
bylineBuilder.append(scoreText);
bylineBuilder.popSpan();
+ ColorReplicationIcons.pushVoteIcon(context, bylineBuilder, voteDirection, voteColor, R.dimen.submission_comment_byline, 0);
+
optionalAuthorFlairText.ifPresent(flair -> {
bylineBuilder.append(context.getString(R.string.submission_comment_byline_item_separator));
bylineBuilder.append(markdown.get().parseAuthorFlair(flair));
diff --git a/app/src/main/java/me/saket/dank/ui/submission/adapter/SubmissionUiConstructor.kt b/app/src/main/java/me/saket/dank/ui/submission/adapter/SubmissionUiConstructor.kt
index ec3122604..371257a81 100644
--- a/app/src/main/java/me/saket/dank/ui/submission/adapter/SubmissionUiConstructor.kt
+++ b/app/src/main/java/me/saket/dank/ui/submission/adapter/SubmissionUiConstructor.kt
@@ -215,7 +215,8 @@ class SubmissionUiConstructor @Inject constructor(
swipeActions: SwipeActions
): SubmissionCommentsHeader.UiModel {
val pendingOrDefaultVote = votingManager.getPendingOrDefaultVote(submission, submission.vote)
- val voteDirectionColor = Themes.voteColor(pendingOrDefaultVote)
+ val voteDirectionColor = color(context, Themes.voteColor(pendingOrDefaultVote))
+ val titleLineSpacingExtra = context.getResources().getDimensionPixelSize(R.dimen.submission_title_extra_spacing);
val adapterId = JrawUtils2.generateAdapterId(submission)
@@ -250,9 +251,21 @@ class SubmissionUiConstructor @Inject constructor(
}
titleBuilder = titleBuilder
- .pushSpan(ForegroundColorSpan(color(context, voteDirectionColor)))
+ .pushSpan(ForegroundColorSpan(voteDirectionColor))
.append(Strings.abbreviateScore(vote.toFloat()))
.popSpan()
+
+ ColorReplicationIcons
+ .pushVoteIcon(
+ context,
+ titleBuilder,
+ pendingOrDefaultVote,
+ voteDirectionColor,
+ R.dimen.submission_title,
+ titleLineSpacingExtra
+ )
+
+ titleBuilder = titleBuilder
.append(" ")
.pushSpan(SubmissionTitleSpan)
.append(Html.fromHtml(submission.title))
diff --git a/app/src/main/java/me/saket/dank/ui/subreddit/uimodels/SubredditUiConstructor.java b/app/src/main/java/me/saket/dank/ui/subreddit/uimodels/SubredditUiConstructor.java
index ad768d502..66efb18c1 100644
--- a/app/src/main/java/me/saket/dank/ui/subreddit/uimodels/SubredditUiConstructor.java
+++ b/app/src/main/java/me/saket/dank/ui/subreddit/uimodels/SubredditUiConstructor.java
@@ -260,9 +260,20 @@ public SubredditSubmission.UiModel submissionUiModel(
int postedAndPendingCommentCount = submission.getCommentCount() + pendingSyncReplyCount;
Truss titleBuilder = new Truss();
- titleBuilder.pushSpan(new ForegroundColorSpan(ContextCompat.getColor(c, Themes.voteColor(voteDirection))));
+ int voteColor = ContextCompat.getColor(c, Themes.voteColor(voteDirection));
+ int titleLineSpacingExtra = c.getResources().getDimensionPixelSize(R.dimen.submission_title_extra_spacing);
+
+ titleBuilder.pushSpan(new ForegroundColorSpan(voteColor));
titleBuilder.append(Strings.abbreviateScore(submissionScore));
titleBuilder.popSpan();
+
+ ColorReplicationIcons.pushVoteIcon(c,
+ titleBuilder,
+ voteDirection,
+ voteColor,
+ R.dimen.subreddit_submission_title,
+ titleLineSpacingExtra);
+
titleBuilder.append(" ");
//noinspection deprecation
titleBuilder.append(Html.fromHtml(submission.getTitle()));
diff --git a/app/src/main/java/me/saket/dank/utils/ColorReplicationIcons.kt b/app/src/main/java/me/saket/dank/utils/ColorReplicationIcons.kt
new file mode 100644
index 000000000..8a1541ad8
--- /dev/null
+++ b/app/src/main/java/me/saket/dank/utils/ColorReplicationIcons.kt
@@ -0,0 +1,37 @@
+package me.saket.dank.utils
+
+import android.content.Context
+import androidx.core.content.ContextCompat
+import me.saket.dank.R
+import me.saket.dank.widgets.span.CenterAlignedImageSpan
+import net.dean.jraw.models.VoteDirection
+
+object ColorReplicationIcons {
+ @JvmStatic fun pushIcon(context: Context, builder: Truss, sizeDimenResId: Int,
+ drawableResId: Int, tintColor: Int, lineSpacingExtra: Int) {
+ val size = context.resources.getDimensionPixelSize(sizeDimenResId)
+ val icon = context.resources.getDrawable(drawableResId, null).mutate()
+ icon.setTint(tintColor)
+ icon.setBounds(0, 0, size, size)
+
+ builder
+ .pushSpan(CenterAlignedImageSpan(icon, lineSpacingExtra))
+ .append("icon")
+ .popSpan()
+ }
+
+ @JvmStatic fun pushVoteIcon(context: Context, builder: Truss, vote: VoteDirection?, color: Int, iconSizeResId: Int, lineSpacingExtra: Int) {
+ val icon = when (vote) {
+ VoteDirection.DOWN -> R.drawable.ic_arrow_downward_24dp
+ VoteDirection.UP -> R.drawable.ic_arrow_upward_24dp
+ VoteDirection.NONE, null -> return
+ }
+
+ pushIcon(context, builder, iconSizeResId, icon, color, lineSpacingExtra)
+ }
+
+ @JvmStatic fun pushOPCommentIcon(context: Context, builder: Truss) {
+ val color = ContextCompat.getColor(context, R.color.submission_comment_byline_author_op)
+ pushIcon(context, builder, R.dimen.submission_comment_byline, R.drawable.ic_person_12dp, color, 0)
+ }
+}
diff --git a/app/src/main/java/me/saket/dank/utils/Units.java b/app/src/main/java/me/saket/dank/utils/Units.java
index d9f81b7ff..6fe07f412 100644
--- a/app/src/main/java/me/saket/dank/utils/Units.java
+++ b/app/src/main/java/me/saket/dank/utils/Units.java
@@ -7,8 +7,18 @@
public class Units {
+ @Px
+ public static int unitToPx(float value, int unit, Context context) {
+ return (int) TypedValue.applyDimension(unit, value, context.getResources().getDisplayMetrics());
+ }
+
@Px
public static int dpToPx(float dpValue, Context context) {
- return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dpValue, context.getResources().getDisplayMetrics());
+ return unitToPx(dpValue, TypedValue.COMPLEX_UNIT_DIP, context);
+ }
+
+ @Px
+ public static int spToPx(float spValue, Context context) {
+ return unitToPx(spValue, TypedValue.COMPLEX_UNIT_SP, context);
}
}
diff --git a/app/src/main/java/me/saket/dank/widgets/span/CenterAlignedImageSpan.kt b/app/src/main/java/me/saket/dank/widgets/span/CenterAlignedImageSpan.kt
new file mode 100644
index 000000000..9ef7a810c
--- /dev/null
+++ b/app/src/main/java/me/saket/dank/widgets/span/CenterAlignedImageSpan.kt
@@ -0,0 +1,24 @@
+package me.saket.dank.widgets.span
+
+import android.graphics.Canvas
+import android.graphics.Paint
+import android.graphics.Paint.FontMetricsInt
+import android.graphics.drawable.Drawable
+import android.text.style.ImageSpan
+import java.lang.ref.WeakReference
+
+class CenterAlignedImageSpan(drawable: Drawable, private val lineSpacingExtra: Int): ImageSpan(drawable, ALIGN_BASELINE) {
+
+ override fun draw(canvas: Canvas, text: CharSequence?,
+ start: Int, end: Int, x: Float,
+ top: Int, y: Int, bottom: Int, paint: Paint) {
+ val drawableHeight = drawable.bounds.height()
+ val realExtraSpacing = if (canvas.clipBounds.bottom != bottom) lineSpacingExtra else 0 // extra line spacing is not applied to last line
+ val translationY = top + (bottom - top - drawableHeight - realExtraSpacing) / 2f
+
+ canvas.save()
+ canvas.translate(x, translationY)
+ drawable.draw(canvas)
+ canvas.restore()
+ }
+}
diff --git a/app/src/main/res/drawable/ic_arrow_upward_12dp.xml b/app/src/main/res/drawable/ic_arrow_upward_18dp.xml
similarity index 100%
rename from app/src/main/res/drawable/ic_arrow_upward_12dp.xml
rename to app/src/main/res/drawable/ic_arrow_upward_18dp.xml
diff --git a/app/src/main/res/layout/list_item_submission_comment.xml b/app/src/main/res/layout/list_item_submission_comment.xml
index cffb1fc94..39006a407 100644
--- a/app/src/main/res/layout/list_item_submission_comment.xml
+++ b/app/src/main/res/layout/list_item_submission_comment.xml
@@ -27,7 +27,7 @@
android:ellipsize="end"
android:textColor="@color/submission_comment_byline_default_color"
android:textIsSelectable="false"
- android:textSize="@dimen/textsize12"
+ android:textSize="@dimen/submission_comment_byline"
tools:text="nuckingfuts73 \u00b7 516 points \u00b7 i5 4690 + GTX 1060 / rip Athlon II (stolen) \u00b7 2 hr. ago" />
diff --git a/app/src/main/res/layout/list_item_submission_content.xml b/app/src/main/res/layout/list_item_submission_content.xml
index bca63e975..094e07acb 100644
--- a/app/src/main/res/layout/list_item_submission_content.xml
+++ b/app/src/main/res/layout/list_item_submission_content.xml
@@ -34,10 +34,10 @@
android:layout_marginStart="@dimen/subreddit_submission_padding"
android:layout_marginTop="@dimen/spacing12"
android:layout_marginEnd="@dimen/subreddit_submission_thumbnail_padding"
- android:lineSpacingExtra="@dimen/spacing2"
+ android:lineSpacingExtra="@dimen/submission_title_extra_spacing"
android:textColor="@color/gray_100"
android:textIsSelectable="false"
- android:textSize="@dimen/textsize16"
+ android:textSize="@dimen/subreddit_submission_title"
app:layout_constraintEnd_toStartOf="@+id/submission_item_icon"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/submission_item_image"
diff --git a/app/src/main/res/layout/list_item_submission_content_left.xml b/app/src/main/res/layout/list_item_submission_content_left.xml
index a1273c223..5ba7516af 100644
--- a/app/src/main/res/layout/list_item_submission_content_left.xml
+++ b/app/src/main/res/layout/list_item_submission_content_left.xml
@@ -52,7 +52,7 @@
android:layout_marginStart="@dimen/subreddit_submission_thumbnail_padding"
android:layout_marginTop="@dimen/spacing12"
android:layout_marginEnd="@dimen/subreddit_submission_padding"
- android:lineSpacingExtra="@dimen/spacing2"
+ android:lineSpacingExtra="@dimen/submission_title_extra_spacing"
android:textColor="@color/gray_100"
android:textIsSelectable="false"
android:textSize="@dimen/textsize16"
diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml
index 075cd7e36..e5f1257d7 100644
--- a/app/src/main/res/values/dimens.xml
+++ b/app/src/main/res/values/dimens.xml
@@ -27,6 +27,7 @@
10dp
366dp
20dp
+ @dimen/textsize16
@dimen/spacing16
@dimen/spacing24
52dp
@@ -36,6 +37,8 @@
6dp
+ @dimen/textsize16
+ @dimen/spacing2
76dp
100dp
@@ -44,6 +47,7 @@
@dimen/spacing16
32dp
+ @dimen/textsize12
@dimen/textsize14
1dp
@dimen/spacing8