getTags() {
33 | return tags;
34 | }
35 |
36 | public String getUnicode() {
37 | return unicode;
38 | }
39 |
40 | @Override
41 | public boolean equals(Object o) {
42 | return o instanceof Emoji && unicode.equals(((Emoji) o).unicode);
43 | }
44 |
45 | @Override
46 | public int hashCode() {
47 | return unicode.hashCode();
48 | }
49 |
50 | @Override
51 | public String toString() {
52 | return "Emoji{" +
53 | "description='" + description + '\'' +
54 | ", aliases=" + aliases +
55 | ", tags=" + tags +
56 | ", unicode='" + unicode + '\'' +
57 | '}';
58 | }
59 | }
60 |
--------------------------------------------------------------------------------
/markdowntextview/src/main/java/com/tpb/mdtext/handlers/CodeClickHandler.java:
--------------------------------------------------------------------------------
1 | package com.tpb.mdtext.handlers;
2 |
3 | import android.support.annotation.Nullable;
4 |
5 | /**
6 | * Created by theo on 27/02/17.
7 | */
8 |
9 | public interface CodeClickHandler {
10 |
11 | void codeClicked(String code, @Nullable String language);
12 |
13 | }
14 |
--------------------------------------------------------------------------------
/markdowntextview/src/main/java/com/tpb/mdtext/handlers/ImageClickHandler.java:
--------------------------------------------------------------------------------
1 | package com.tpb.mdtext.handlers;
2 |
3 | import android.graphics.drawable.Drawable;
4 |
5 | /**
6 | * Created by theo on 27/02/17.
7 | */
8 |
9 | public interface ImageClickHandler {
10 |
11 | void imageClicked(Drawable drawable);
12 |
13 | }
14 |
--------------------------------------------------------------------------------
/markdowntextview/src/main/java/com/tpb/mdtext/handlers/LinkClickHandler.java:
--------------------------------------------------------------------------------
1 | package com.tpb.mdtext.handlers;
2 |
3 | /**
4 | * Created by theo on 27/02/17.
5 | */
6 |
7 | public interface LinkClickHandler {
8 |
9 | void onClick(String url);
10 |
11 | }
12 |
--------------------------------------------------------------------------------
/markdowntextview/src/main/java/com/tpb/mdtext/handlers/TableClickHandler.java:
--------------------------------------------------------------------------------
1 | package com.tpb.mdtext.handlers;
2 |
3 | /**
4 | * Created by theo on 08/04/17.
5 | */
6 |
7 | public interface TableClickHandler {
8 |
9 | public void onClick(String html);
10 |
11 | }
12 |
--------------------------------------------------------------------------------
/markdowntextview/src/main/java/com/tpb/mdtext/imagegetter/AssetsImageGetter.java:
--------------------------------------------------------------------------------
1 | package com.tpb.mdtext.imagegetter;
2 |
3 | import android.content.Context;
4 | import android.graphics.drawable.Drawable;
5 | import android.text.Html;
6 | import android.widget.TextView;
7 |
8 | import java.io.IOException;
9 | import java.io.InputStream;
10 |
11 | /**
12 | * Assets Image Getter
13 | *
14 | * Load image from assets folder
15 | *
16 | * @author Daniel Passos
17 | */
18 | class AssetsImageGetter implements Html.ImageGetter {
19 |
20 | private final Context context;
21 |
22 | public AssetsImageGetter(Context context) {
23 | this.context = context;
24 | }
25 |
26 | public AssetsImageGetter(TextView textView) {
27 | this.context = textView.getContext();
28 | }
29 |
30 | @Override
31 | public Drawable getDrawable(String source) {
32 |
33 | try {
34 | final InputStream inputStream = context.getAssets().open(source);
35 | final Drawable d = Drawable.createFromStream(inputStream, null);
36 | d.setBounds(0, 0, d.getIntrinsicWidth(), d.getIntrinsicHeight());
37 | return d;
38 | } catch(IOException e) {
39 | return null;
40 | }
41 |
42 | }
43 |
44 | }
45 |
--------------------------------------------------------------------------------
/markdowntextview/src/main/java/com/tpb/mdtext/imagegetter/ResImageGetter.java:
--------------------------------------------------------------------------------
1 | package com.tpb.mdtext.imagegetter;
2 |
3 | import android.content.Context;
4 | import android.graphics.drawable.Drawable;
5 | import android.text.Html;
6 | import android.widget.TextView;
7 |
8 | /**
9 | * Copied from http://stackoverflow.com/a/22298833
10 | */
11 | class ResImageGetter implements Html.ImageGetter {
12 | private final TextView container;
13 |
14 | public ResImageGetter(TextView textView) {
15 | this.container = textView;
16 | }
17 |
18 | public Drawable getDrawable(String source) {
19 | final Context context = container.getContext();
20 | int id = context.getResources().getIdentifier(source, "drawable", context.getPackageName());
21 |
22 | if(id == 0) {
23 | //Drawable not in this package, might be somewhere else
24 | id = context.getResources().getIdentifier(source, "drawable", "android");
25 | }
26 |
27 | if(id == 0) {
28 | return null;
29 | } else {
30 | final Drawable d = context.getResources().getDrawable(id);
31 | d.setBounds(0, 0, d.getIntrinsicWidth(), d.getIntrinsicHeight());
32 | return d;
33 | }
34 | }
35 |
36 | }
--------------------------------------------------------------------------------
/markdowntextview/src/main/java/com/tpb/mdtext/views/spans/ClickableImageSpan.java:
--------------------------------------------------------------------------------
1 | package com.tpb.mdtext.views.spans;
2 |
3 | import android.graphics.drawable.Drawable;
4 | import android.text.style.ImageSpan;
5 |
6 | import com.tpb.mdtext.handlers.ImageClickHandler;
7 | import com.tpb.mdtext.imagegetter.HttpImageGetter;
8 |
9 | import java.lang.ref.WeakReference;
10 |
11 | /**
12 | * Created by theo on 22/04/17.
13 | */
14 |
15 | public class ClickableImageSpan extends ImageSpan implements WrappingClickableSpan.WrappedClickableSpan {
16 |
17 | private WeakReference mImageClickHandler;
18 |
19 | public ClickableImageSpan(Drawable d, ImageClickHandler handler) {
20 | super(d);
21 | mImageClickHandler = new WeakReference<>(handler);
22 | }
23 |
24 | @Override
25 | public Drawable getDrawable() {
26 | if(super.getDrawable() instanceof HttpImageGetter.URLDrawable && ((HttpImageGetter.URLDrawable) super.getDrawable()).getDrawable() != null) {
27 | return ((HttpImageGetter.URLDrawable) super.getDrawable()).getDrawable();
28 | }
29 | return super.getDrawable();
30 | }
31 |
32 | @Override
33 | public void onClick() {
34 | if(mImageClickHandler.get() != null) {
35 | mImageClickHandler.get().imageClicked(getDrawable());
36 | }
37 | }
38 | }
39 |
--------------------------------------------------------------------------------
/markdowntextview/src/main/java/com/tpb/mdtext/views/spans/HorizontalRuleSpan.java:
--------------------------------------------------------------------------------
1 | package com.tpb.mdtext.views.spans;
2 |
3 | import android.graphics.Canvas;
4 | import android.graphics.Color;
5 | import android.graphics.Paint;
6 | import android.graphics.RectF;
7 | import android.support.annotation.NonNull;
8 | import android.text.style.ReplacementSpan;
9 |
10 | /**
11 | * Created by theo on 02/03/17.
12 | */
13 |
14 | public class HorizontalRuleSpan extends ReplacementSpan {
15 |
16 | private RectF mRectF;
17 |
18 | public HorizontalRuleSpan() {
19 | mRectF = new RectF();
20 | }
21 |
22 | @Override
23 | public int getSize(@NonNull Paint paint, CharSequence text, int start, int end, Paint.FontMetricsInt fm) {
24 | return 0;
25 | }
26 |
27 | @Override
28 | public void draw(@NonNull Canvas canvas, CharSequence text, int start, int end, float x, int top, int y, int bottom, @NonNull Paint paint) {
29 | final int mid = (top + bottom) / 2;
30 | final int quarter = (bottom - top) / 4;
31 | paint.setColor(Color.GRAY);
32 | mRectF.left = x;
33 | mRectF.top = mid - quarter;
34 | mRectF.right = x + canvas.getWidth();
35 | mRectF.bottom = mid + quarter;
36 | canvas.drawRect(mRectF, paint);
37 | final int eighth = quarter / 2;
38 | paint.setColor(Color.LTGRAY);
39 | mRectF.left += eighth;
40 | mRectF.right -= eighth;
41 | mRectF.top += eighth;
42 | mRectF.bottom -= eighth;
43 | canvas.drawRect(mRectF, paint);
44 | }
45 | }
46 |
--------------------------------------------------------------------------------
/markdowntextview/src/main/java/com/tpb/mdtext/views/spans/InlineCodeSpan.java:
--------------------------------------------------------------------------------
1 | package com.tpb.mdtext.views.spans;
2 |
3 | import android.graphics.Canvas;
4 | import android.graphics.Color;
5 | import android.graphics.Paint;
6 | import android.graphics.Typeface;
7 | import android.support.annotation.IntRange;
8 | import android.support.annotation.NonNull;
9 | import android.support.annotation.Nullable;
10 | import android.text.TextPaint;
11 | import android.text.style.ReplacementSpan;
12 |
13 | /**
14 | * Created by theo on 22/03/17.
15 | */
16 |
17 | public class InlineCodeSpan extends ReplacementSpan {
18 | private final float mTextSize;
19 |
20 | private float mPadding;
21 |
22 |
23 | public InlineCodeSpan(float textSize) {
24 | mTextSize = textSize;
25 | }
26 |
27 | @Override
28 | public void updateDrawState(TextPaint tp) {
29 | tp.setTextSize(mTextSize);
30 | tp.setTypeface(Typeface.MONOSPACE);
31 | }
32 |
33 | @Override
34 | public int getSize(@NonNull Paint paint,
35 | CharSequence text,
36 | @IntRange(from = 0) int start,
37 | @IntRange(from = 0) int end,
38 | @Nullable Paint.FontMetricsInt fm) {
39 | mPadding = paint.measureText("c");
40 | return (int) (paint.measureText(text, start, end) + mPadding * 2);
41 | }
42 |
43 | @Override
44 | public void draw(@NonNull Canvas canvas,
45 | CharSequence text,
46 | @IntRange(from = 0) int start,
47 | @IntRange(from = 0) int end,
48 | float x,
49 | int top,
50 | int y,
51 | int bottom,
52 | @NonNull Paint paint) {
53 | canvas.drawText(text, start, end, x + mPadding, y, paint);
54 | paint.setColor(Color.GRAY);
55 | paint.setAlpha(50);
56 | final int leading = paint.getFontMetricsInt().leading;
57 | canvas.drawRect((int) x, top - leading, (int) x + canvas.getWidth(), bottom + leading, paint);
58 | }
59 |
60 |
61 | }
--------------------------------------------------------------------------------
/markdowntextview/src/main/java/com/tpb/mdtext/views/spans/QuoteSpan.java:
--------------------------------------------------------------------------------
1 | package com.tpb.mdtext.views.spans;
2 |
3 | import android.graphics.Canvas;
4 | import android.graphics.Color;
5 | import android.graphics.Paint;
6 | import android.text.Layout;
7 | import android.text.TextPaint;
8 | import android.text.style.CharacterStyle;
9 | import android.text.style.LeadingMarginSpan;
10 |
11 | /**
12 | * Created by theo on 20/03/17.
13 | */
14 |
15 | public class QuoteSpan extends CharacterStyle implements LeadingMarginSpan {
16 | private static final int STRIPE_WIDTH = 4;
17 | private static final int GAP_WIDTH = 8;
18 | private final int mColor;
19 |
20 | public QuoteSpan() {
21 | super();
22 | mColor = Color.WHITE;
23 | }
24 |
25 | public QuoteSpan(int color) {
26 | super();
27 | mColor = color;
28 | }
29 |
30 | public int describeContents() {
31 | return 0;
32 | }
33 |
34 | @Override
35 | public void updateDrawState(TextPaint tp) {
36 | tp.setAlpha((tp.getColor() & 0x00FFFFFF) > 0x800000 ? 179 : 138);
37 | }
38 |
39 | @Override
40 | public int getLeadingMargin(boolean first) {
41 | return STRIPE_WIDTH + GAP_WIDTH;
42 | }
43 |
44 | @Override
45 | public void drawLeadingMargin(Canvas c, Paint p, int x, int dir,
46 | int top, int baseline, int bottom,
47 | CharSequence text, int start, int end,
48 | boolean first, Layout layout) {
49 | final Paint.Style style = p.getStyle();
50 | final int color = p.getColor();
51 | p.setStyle(Paint.Style.FILL);
52 | p.setColor(mColor);
53 | c.drawRect(x, top, x + dir * STRIPE_WIDTH, bottom, p);
54 | p.setStyle(style);
55 | p.setColor(color);
56 | }
57 | }
--------------------------------------------------------------------------------
/markdowntextview/src/main/java/com/tpb/mdtext/views/spans/RoundedBackgroundEndSpan.java:
--------------------------------------------------------------------------------
1 | package com.tpb.mdtext.views.spans;
2 |
3 | import android.graphics.Canvas;
4 | import android.graphics.Paint;
5 | import android.graphics.RectF;
6 | import android.support.annotation.NonNull;
7 | import android.text.style.ReplacementSpan;
8 |
9 | /**
10 | * Created by theo on 28/03/17.
11 | */
12 |
13 | public class RoundedBackgroundEndSpan extends ReplacementSpan {
14 |
15 | private int mCharacterWidth;
16 | private final int mBgColor;
17 | private final boolean mIsEndSpan;
18 |
19 | public RoundedBackgroundEndSpan(int bgColor, boolean isEndSpan) {
20 | mBgColor = bgColor;
21 | mIsEndSpan = isEndSpan;
22 | }
23 |
24 | @Override
25 | public int getSize(@NonNull Paint paint, CharSequence text, int start, int end, Paint.FontMetricsInt fm) {
26 | mCharacterWidth = (int) paint.measureText("t");
27 | return mCharacterWidth;
28 | }
29 |
30 | @Override
31 | public void draw(@NonNull Canvas canvas, CharSequence text, int start, int end, float x, int top, int y, int bottom, @NonNull Paint paint) {
32 | RectF rect = new RectF(x, top, x + mCharacterWidth, bottom);
33 | paint.setColor(mBgColor);
34 | canvas.drawRoundRect(rect, paint.getTextSize() / 6, paint.getTextSize() / 6, paint);
35 | if(mIsEndSpan) {
36 | rect = new RectF(x, top, (x + x + mCharacterWidth) / 2, bottom);
37 | } else {
38 | rect = new RectF((x + x + mCharacterWidth) / 2, top, x + mCharacterWidth, bottom);
39 | }
40 | canvas.drawRect(rect, paint);
41 | }
42 | }
43 |
--------------------------------------------------------------------------------
/markdowntextview/src/main/java/com/tpb/mdtext/views/spans/WrappingClickableSpan.java:
--------------------------------------------------------------------------------
1 | package com.tpb.mdtext.views.spans;
2 |
3 | import android.support.annotation.NonNull;
4 | import android.text.style.ClickableSpan;
5 | import android.view.View;
6 |
7 | /**
8 | * Created by theo on 11/04/17.
9 | */
10 |
11 | public class WrappingClickableSpan extends ClickableSpan {
12 |
13 | private final WrappedClickableSpan mWrappedClickableSpan;
14 |
15 | public WrappingClickableSpan(@NonNull WrappedClickableSpan child) {
16 | mWrappedClickableSpan = child;
17 | }
18 |
19 | @Override
20 | public void onClick(View widget) {
21 | mWrappedClickableSpan.onClick();
22 | }
23 |
24 | public interface WrappedClickableSpan {
25 |
26 | void onClick();
27 |
28 | }
29 |
30 | }
31 |
--------------------------------------------------------------------------------
/markdowntextview/src/main/res/drawable/ic_code.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
--------------------------------------------------------------------------------
/markdowntextview/src/main/res/drawable/ic_table.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/markdowntextview/src/main/res/layout/dialog_code.xml:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
12 |
13 |
--------------------------------------------------------------------------------
/markdowntextview/src/main/res/layout/dialog_image.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 |
7 |
13 |
14 |
--------------------------------------------------------------------------------
/markdowntextview/src/main/res/layout/dialog_table.xml:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
12 |
13 |
--------------------------------------------------------------------------------
/markdowntextview/src/main/res/values/strings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | %1$s code
5 | Code
6 | Table
7 |
8 |
--------------------------------------------------------------------------------
/project.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tpb1908/AndroidProjectsClient/19f874ca5cd17a9802101e92b2f1c3db94869b07/project.png
--------------------------------------------------------------------------------
/screenshots/assignment.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tpb1908/AndroidProjectsClient/19f874ca5cd17a9802101e92b2f1c3db94869b07/screenshots/assignment.png
--------------------------------------------------------------------------------
/screenshots/editing.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tpb1908/AndroidProjectsClient/19f874ca5cd17a9802101e92b2f1c3db94869b07/screenshots/editing.png
--------------------------------------------------------------------------------
/screenshots/issue.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tpb1908/AndroidProjectsClient/19f874ca5cd17a9802101e92b2f1c3db94869b07/screenshots/issue.png
--------------------------------------------------------------------------------
/screenshots/issues.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tpb1908/AndroidProjectsClient/19f874ca5cd17a9802101e92b2f1c3db94869b07/screenshots/issues.png
--------------------------------------------------------------------------------
/screenshots/license.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tpb1908/AndroidProjectsClient/19f874ca5cd17a9802101e92b2f1c3db94869b07/screenshots/license.png
--------------------------------------------------------------------------------
/screenshots/project.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tpb1908/AndroidProjectsClient/19f874ca5cd17a9802101e92b2f1c3db94869b07/screenshots/project.png
--------------------------------------------------------------------------------
/screenshots/repo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tpb1908/AndroidProjectsClient/19f874ca5cd17a9802101e92b2f1c3db94869b07/screenshots/repo.png
--------------------------------------------------------------------------------
/screenshots/repos.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tpb1908/AndroidProjectsClient/19f874ca5cd17a9802101e92b2f1c3db94869b07/screenshots/repos.png
--------------------------------------------------------------------------------
/screenshots/user.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tpb1908/AndroidProjectsClient/19f874ca5cd17a9802101e92b2f1c3db94869b07/screenshots/user.png
--------------------------------------------------------------------------------
/settings.gradle:
--------------------------------------------------------------------------------
1 | include ':app', ':animatingrecycler', ':markdowntextview', ':contributionsview', ':gitapi'
2 |
--------------------------------------------------------------------------------