diff options
5 files changed, 238 insertions, 3 deletions
diff --git a/app/build.gradle b/app/build.gradle index 6cba6549b..ebbc355e2 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -123,7 +123,6 @@ dependencies { implementation "com.joanzapata.iconify:android-iconify-fontawesome:$iconifyVersion" implementation "com.joanzapata.iconify:android-iconify-material:$iconifyVersion" - implementation 'com.github.shts:TriangleLabelView:1.1.2' implementation 'com.leinardi.android:speed-dial:3.2.0' implementation "com.github.AntennaPod:AntennaPod-AudioPlayer:$audioPlayerVersion" implementation 'com.github.ByteHamster:SearchPreference:v2.0.0' diff --git a/app/src/main/java/de/danoeh/antennapod/adapter/SubscriptionsRecyclerAdapter.java b/app/src/main/java/de/danoeh/antennapod/adapter/SubscriptionsRecyclerAdapter.java index a7986e144..4ebfcff5b 100644 --- a/app/src/main/java/de/danoeh/antennapod/adapter/SubscriptionsRecyclerAdapter.java +++ b/app/src/main/java/de/danoeh/antennapod/adapter/SubscriptionsRecyclerAdapter.java @@ -39,7 +39,7 @@ import de.danoeh.antennapod.core.storage.NavDrawerData; import de.danoeh.antennapod.fragment.FeedItemlistFragment; import de.danoeh.antennapod.fragment.SubscriptionFragment; import de.danoeh.antennapod.model.feed.Feed; -import jp.shts.android.library.TriangleLabelView; +import de.danoeh.antennapod.ui.common.TriangleLabelView; /** * Adapter for subscriptions diff --git a/app/src/main/res/layout/subscription_item.xml b/app/src/main/res/layout/subscription_item.xml index 8fb7a4b7b..50cb9745f 100644 --- a/app/src/main/res/layout/subscription_item.xml +++ b/app/src/main/res/layout/subscription_item.xml @@ -33,7 +33,7 @@ android:textColor="?android:attr/textColorPrimary" tools:text="@string/app_name" /> - <jp.shts.android.library.TriangleLabelView + <de.danoeh.antennapod.ui.common.TriangleLabelView android:id="@+id/triangleCountView" android:layout_width="match_parent" android:layout_height="match_parent" diff --git a/ui/common/src/main/java/de/danoeh/antennapod/ui/common/TriangleLabelView.java b/ui/common/src/main/java/de/danoeh/antennapod/ui/common/TriangleLabelView.java new file mode 100644 index 000000000..ff6342655 --- /dev/null +++ b/ui/common/src/main/java/de/danoeh/antennapod/ui/common/TriangleLabelView.java @@ -0,0 +1,218 @@ +/* + * Copyright (C) 2016 Shota Saito + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Source: https://github.com/shts/TriangleLabelView + * Modified for our need; see AntennaPod #5925 for context + */ + +package de.danoeh.antennapod.ui.common; + +import android.annotation.SuppressLint; +import android.annotation.TargetApi; +import android.content.Context; +import android.content.res.TypedArray; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.Paint; +import android.graphics.Path; +import android.graphics.Rect; +import android.graphics.Typeface; +import android.os.Build; +import android.util.AttributeSet; +import android.view.View; + +public class TriangleLabelView extends View { + + private static final int DEGREES_LEFT = -45; + private static final int DEGREES_RIGHT = 45; + private final PaintHolder primary = new PaintHolder(); + private float topPadding; + private float bottomPadding; + private float centerPadding; + private Paint trianglePaint; + private int width; + private int height; + private Corner corner; + + public TriangleLabelView(final Context context) { + this(context, null); + } + + public TriangleLabelView(final Context context, final AttributeSet attrs) { + this(context, attrs, 0); + } + + public TriangleLabelView(final Context context, final AttributeSet attrs, + final int defStyleAttr) { + super(context, attrs, defStyleAttr); + init(context, attrs); + } + + @TargetApi(Build.VERSION_CODES.LOLLIPOP) + public TriangleLabelView(final Context context, final AttributeSet attrs, + final int defStyleAttr, final int defStyleRes) { + super(context, attrs, defStyleAttr, defStyleRes); + init(context, attrs); + } + + private void init(final Context context, final AttributeSet attrs) { + final TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.TriangleLabelView); + + this.topPadding = ta.getDimension(R.styleable.TriangleLabelView_labelTopPadding, dp2px(7)); + this.centerPadding = ta.getDimension(R.styleable.TriangleLabelView_labelCenterPadding, dp2px(3)); + this.bottomPadding = ta.getDimension(R.styleable.TriangleLabelView_labelBottomPadding, dp2px(3)); + + final int backgroundColor = ta.getColor(R.styleable.TriangleLabelView_backgroundColor, + Color.parseColor("#66000000")); + this.primary.color = ta.getColor(R.styleable.TriangleLabelView_primaryTextColor, Color.WHITE); + + this.primary.size = ta.getDimension(R.styleable.TriangleLabelView_primaryTextSize, sp2px(11)); + + final String primary = ta.getString(R.styleable.TriangleLabelView_primaryText); + if (primary != null) { + this.primary.text = primary; + } + + this.corner = Corner.from(ta.getInt(R.styleable.TriangleLabelView_corner, 1)); + + ta.recycle(); + + this.primary.initPaint(); + + trianglePaint = new Paint(Paint.ANTI_ALIAS_FLAG); + trianglePaint.setColor(backgroundColor); + + this.primary.resetStatus(); + } + + public void setPrimaryText(final String text) { + primary.text = text; + primary.resetStatus(); + relayout(); + } + + public Corner getCorner() { + return corner; + } + + public void setCorner(final Corner corner) { + this.corner = corner; + relayout(); + } + + @Override + protected void onDraw(final Canvas canvas) { + super.onDraw(canvas); + canvas.save(); + + // translate + canvas.translate(0, (float) ((height * Math.sqrt(2)) - height)); + + // rotate + if (corner.left()) { + canvas.rotate(DEGREES_LEFT, 0, height); + } else { + canvas.rotate(DEGREES_RIGHT, width, height); + } + + // draw triangle + @SuppressLint("DrawAllocation") + final Path path = new Path(); + path.moveTo(0, height); + path.lineTo(width / 2f, 0); + path.lineTo(width, height); + path.close(); + canvas.drawPath(path, trianglePaint); + + // draw primaryText + canvas.drawText(primary.text, (width) / 2f, + (topPadding + centerPadding + primary.height), primary.paint); + canvas.restore(); + } + + @Override + protected void onMeasure(final int widthMeasureSpec, final int heightMeasureSpec) { + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + height = (int) (topPadding + centerPadding + bottomPadding + primary.height); + width = 2 * height; + final int realHeight = (int) (height * Math.sqrt(2)); + setMeasuredDimension(width, realHeight); + } + + public int dp2px(final float dpValue) { + final float scale = getContext().getResources().getDisplayMetrics().density; + return (int) (dpValue * scale + 0.5f); + } + + public float sp2px(final float spValue) { + final float scale = getContext().getResources().getDisplayMetrics().scaledDensity; + return spValue * scale; + } + + /** + * Should be called whenever what we're displaying could have changed. + */ + private void relayout() { + invalidate(); + requestLayout(); + } + + public enum Corner { + TOP_LEFT(1), + TOP_RIGHT(2); + private final int type; + + Corner(final int type) { + this.type = type; + } + + private static Corner from(final int type) { + for (final Corner c : values()) { + if (c.type == type) { + return c; + } + } + return Corner.TOP_LEFT; + } + + private boolean left() { + return this == TOP_LEFT; + } + } + + private static class PaintHolder { + String text = ""; + Paint paint; + int color; + float size; + float height; + float width; + + void initPaint() { + paint = new Paint(Paint.ANTI_ALIAS_FLAG); + paint.setColor(color); + paint.setTextAlign(Paint.Align.CENTER); + paint.setTextSize(size); + paint.setTypeface(Typeface.DEFAULT_BOLD); + } + + void resetStatus() { + final Rect rectText = new Rect(); + paint.getTextBounds(text, 0, text.length(), rectText); + width = rectText.width(); + height = rectText.height(); + } + } +} diff --git a/ui/common/src/main/res/values/attrs.xml b/ui/common/src/main/res/values/attrs.xml new file mode 100644 index 000000000..f3334fe77 --- /dev/null +++ b/ui/common/src/main/res/values/attrs.xml @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <declare-styleable name="TriangleLabelView"> + <attr name="backgroundColor" format="color" /> + <attr name="primaryTextColor" format="color" /> + <attr name="primaryText" format="string" /> + <attr name="primaryTextSize" format="dimension" /> + + <attr name="labelTopPadding" format="dimension" /> + <attr name="labelCenterPadding" format="dimension" /> + <attr name="labelBottomPadding" format="dimension" /> + + <attr name="corner"> + <enum name="leftTop" value="1" /> + <enum name="rightTop" value="2" /> + </attr> + </declare-styleable> +</resources> |