From 24b30195ad43b925dea36ab7b365fe6bea69de22 Mon Sep 17 00:00:00 2001 From: Kosh Date: Sun, 30 Apr 2017 12:16:54 +0800 Subject: [PATCH] this commit fixes #361 and fixes #394 --- .../data/dao/FragmentPagerAdapterModel.java | 6 +- .../provider/rest/RestProvider.java | 46 +-- .../provider/timeline/HtmlHelper.java | 24 +- .../handler/CodeBackgroundRoundedSpan.java | 3 +- .../timeline/handler/ListsHandler.java | 67 ++++ .../timeline/handler/MarginHandler.java | 29 ++ .../timeline/handler/PreTagHandler.java | 12 +- .../handler/StrikethroughHandler.java | 16 + .../timeline/handler/SubScriptHandler.java | 17 + .../timeline/handler/SuperScriptHandler.java | 18 ++ .../timeline/handler/TableHandler.java | 298 ++++++++++++++++++ .../timeline/handler/UnderlineHandler.java | 15 + .../ui/modules/main/MainPresenter.java | 6 +- ...yIssuesView.java => MyIssuesFragment.java} | 16 +- .../main/issues/MyIssuesPresenter.java | 18 +- ...erView.java => MyIssuesPagerFragment.java} | 8 +- .../pullrequests/MyPullRequestsPresenter.java | 2 +- .../commit/details/CommitPagerPresenter.java | 12 +- .../code/prettifier/ViewerPresenter.java | 4 +- .../issues/create/CreateIssuePresenter.java | 2 +- .../RepoPullRequestPresenter.java | 4 +- .../details/PullRequestPagerPresenter.java | 10 +- .../commits/PullRequestCommitsPresenter.java | 2 +- .../files/PullRequestFilesPresenter.java | 2 +- .../PullRequestTimelinePresenter.java | 4 +- .../ui/modules/settings/SettingsFragment.java | 5 + app/src/main/res/xml/fasthub_settings.xml | 4 + build.gradle | 2 +- 28 files changed, 577 insertions(+), 75 deletions(-) create mode 100644 app/src/main/java/com/fastaccess/provider/timeline/handler/ListsHandler.java create mode 100644 app/src/main/java/com/fastaccess/provider/timeline/handler/MarginHandler.java create mode 100644 app/src/main/java/com/fastaccess/provider/timeline/handler/StrikethroughHandler.java create mode 100644 app/src/main/java/com/fastaccess/provider/timeline/handler/SubScriptHandler.java create mode 100644 app/src/main/java/com/fastaccess/provider/timeline/handler/SuperScriptHandler.java create mode 100644 app/src/main/java/com/fastaccess/provider/timeline/handler/TableHandler.java create mode 100644 app/src/main/java/com/fastaccess/provider/timeline/handler/UnderlineHandler.java rename app/src/main/java/com/fastaccess/ui/modules/main/issues/{MyIssuesView.java => MyIssuesFragment.java} (94%) rename app/src/main/java/com/fastaccess/ui/modules/main/issues/pager/{MyIssuesPagerView.java => MyIssuesPagerFragment.java} (88%) diff --git a/app/src/main/java/com/fastaccess/data/dao/FragmentPagerAdapterModel.java b/app/src/main/java/com/fastaccess/data/dao/FragmentPagerAdapterModel.java index a8922c12..f0dbcad1 100644 --- a/app/src/main/java/com/fastaccess/data/dao/FragmentPagerAdapterModel.java +++ b/app/src/main/java/com/fastaccess/data/dao/FragmentPagerAdapterModel.java @@ -14,7 +14,7 @@ import com.fastaccess.data.dao.model.PullRequest; import com.fastaccess.data.dao.types.IssueState; import com.fastaccess.ui.modules.gists.gist.comments.GistCommentsFragment; import com.fastaccess.ui.modules.gists.gist.files.GistFilesListFragment; -import com.fastaccess.ui.modules.main.issues.MyIssuesView; +import com.fastaccess.ui.modules.main.issues.MyIssuesFragment; import com.fastaccess.ui.modules.main.pullrequests.MyPullRequestFragment; import com.fastaccess.ui.modules.profile.followers.ProfileFollowersFragment; import com.fastaccess.ui.modules.profile.following.ProfileFollowingFragment; @@ -149,8 +149,8 @@ import lombok.Setter; } public static List buildForMyIssues(@NonNull Context context) { - return Stream.of(new FragmentPagerAdapterModel(context.getString(R.string.open), MyIssuesView.newInstance(IssueState.open)) - , new FragmentPagerAdapterModel(context.getString(R.string.closed), MyIssuesView.newInstance(IssueState.closed))) + return Stream.of(new FragmentPagerAdapterModel(context.getString(R.string.open), MyIssuesFragment.newInstance(IssueState.open)) + , new FragmentPagerAdapterModel(context.getString(R.string.closed), MyIssuesFragment.newInstance(IssueState.closed))) .collect(Collectors.toList()); } diff --git a/app/src/main/java/com/fastaccess/provider/rest/RestProvider.java b/app/src/main/java/com/fastaccess/provider/rest/RestProvider.java index c28d3142..f7be0903 100644 --- a/app/src/main/java/com/fastaccess/provider/rest/RestProvider.java +++ b/app/src/main/java/com/fastaccess/provider/rest/RestProvider.java @@ -69,39 +69,43 @@ public class RestProvider { return cache; } - private static OkHttpClient provideOkHttpClient() { + private static OkHttpClient provideOkHttpClient(boolean isRawString) { OkHttpClient.Builder client = new OkHttpClient.Builder(); if (BuildConfig.DEBUG) { client.addInterceptor(new HttpLoggingInterceptor() .setLevel(HttpLoggingInterceptor.Level.BODY)); } client.addInterceptor(new AuthenticationInterceptor(PrefGetter.getToken(), PrefGetter.getOtpCode())); - client.addInterceptor(new PaginationInterceptor()) - .addInterceptor(chain -> { - Request original = chain.request(); - if (original.url() != HttpUrl.get(URI.create(NotificationService.SUBSCRIPTION_URL))) { - Request.Builder requestBuilder = original.newBuilder(); - requestBuilder.addHeader("Accept", "application/vnd.github.v3+json") - .addHeader("Content-type", "application/vnd.github.v3+json"); - requestBuilder.method(original.method(), original.body()); - Request request = requestBuilder.build(); - return chain.proceed(request); - } - Logger.e(original.url()); - return chain.proceed(original); - }); + if (!isRawString) client.addInterceptor(new PaginationInterceptor()); + client.addInterceptor(chain -> { + Request original = chain.request(); + if (original.url() != HttpUrl.get(URI.create(NotificationService.SUBSCRIPTION_URL))) { + Request.Builder requestBuilder = original.newBuilder(); + requestBuilder.addHeader("Accept", "application/vnd.github.v3+json") + .addHeader("Content-type", "application/vnd.github.v3+json"); + requestBuilder.method(original.method(), original.body()); + Request request = requestBuilder.build(); + return chain.proceed(request); + } + Logger.e(original.url()); + return chain.proceed(original); + }); return client.build(); } - private static Retrofit provideRetrofit() { + private static Retrofit provideRetrofit(boolean isRawString) { return new Retrofit.Builder() .baseUrl(BuildConfig.REST_URL) - .client(provideOkHttpClient()) + .client(provideOkHttpClient(isRawString)) .addConverterFactory(new GithubResponseConverter(gson)) .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .build(); } + private static Retrofit provideRetrofit() { + return provideRetrofit(false); + } + public static void downloadFile(@NonNull Context context, @NonNull String url) { if (InputHelper.isEmpty(url)) return; Uri uri = Uri.parse(url); @@ -145,14 +149,18 @@ public class RestProvider { } @NonNull public static RepoService getRepoService() { - return provideRetrofit().create(RepoService.class); + return getRepoService(false); + } + + @NonNull public static RepoService getRepoService(boolean isRawString) { + return provideRetrofit(isRawString).create(RepoService.class); } @NonNull public static IssueService getIssueService() { return provideRetrofit().create(IssueService.class); } - @NonNull public static PullRequestService getPullRequestSerice() { + @NonNull public static PullRequestService getPullRequestService() { return provideRetrofit().create(PullRequestService.class); } diff --git a/app/src/main/java/com/fastaccess/provider/timeline/HtmlHelper.java b/app/src/main/java/com/fastaccess/provider/timeline/HtmlHelper.java index f6c80643..91cc7586 100644 --- a/app/src/main/java/com/fastaccess/provider/timeline/HtmlHelper.java +++ b/app/src/main/java/com/fastaccess/provider/timeline/HtmlHelper.java @@ -3,6 +3,7 @@ package com.fastaccess.provider.timeline; import android.content.Context; import android.graphics.Point; import android.net.Uri; +import android.support.annotation.ColorInt; import android.support.annotation.NonNull; import android.view.WindowManager; import android.widget.TextView; @@ -11,12 +12,18 @@ import com.fastaccess.helper.ViewHelper; import com.fastaccess.provider.scheme.SchemeParser; import com.fastaccess.provider.timeline.handler.BetterLinkMovementExtended; import com.fastaccess.provider.timeline.handler.DrawableHandler; +import com.fastaccess.provider.timeline.handler.ListsHandler; +import com.fastaccess.provider.timeline.handler.MarginHandler; import com.fastaccess.provider.timeline.handler.PreTagHandler; import com.fastaccess.provider.timeline.handler.QouteHandler; +import com.fastaccess.provider.timeline.handler.StrikethroughHandler; +import com.fastaccess.provider.timeline.handler.SubScriptHandler; +import com.fastaccess.provider.timeline.handler.SuperScriptHandler; +import com.fastaccess.provider.timeline.handler.TableHandler; +import com.fastaccess.provider.timeline.handler.UnderlineHandler; import net.nightwhistler.htmlspanner.HtmlSpanner; import net.nightwhistler.htmlspanner.handlers.BoldHandler; -import net.nightwhistler.htmlspanner.handlers.TableHandler; /** @@ -33,6 +40,11 @@ public class HtmlHelper { return true; }); int windowBackground = ViewHelper.getWindowBackground(textView.getContext()); + registerHandlers(textView, mySpanner, windowBackground); + textView.setText(mySpanner.fromHtml(html)); + } + + private static void registerHandlers(@NonNull TextView textView, @NonNull HtmlSpanner mySpanner, @ColorInt int windowBackground) { mySpanner.registerHandler("pre", new PreTagHandler(windowBackground, true)); mySpanner.registerHandler("code", new PreTagHandler(windowBackground, false)); mySpanner.registerHandler("img", new DrawableHandler(textView)); @@ -40,6 +52,15 @@ public class HtmlHelper { mySpanner.registerHandler("blockquote", new QouteHandler(windowBackground)); mySpanner.registerHandler("b", new BoldHandler()); mySpanner.registerHandler("strong", new BoldHandler()); + mySpanner.registerHandler("ul", new MarginHandler()); + mySpanner.registerHandler("ol", new MarginHandler()); + mySpanner.registerHandler("li", new ListsHandler()); + mySpanner.registerHandler("u", new UnderlineHandler()); + mySpanner.registerHandler("strike", new StrikethroughHandler()); + mySpanner.registerHandler("ins", new UnderlineHandler()); + mySpanner.registerHandler("del", new StrikethroughHandler()); + mySpanner.registerHandler("sub", new SubScriptHandler()); + mySpanner.registerHandler("sup", new SuperScriptHandler()); TableHandler tableHandler = new TableHandler(); tableHandler.setTextColor(ViewHelper.generateTextColor(windowBackground)); WindowManager windowManager = (WindowManager) textView.getContext().getSystemService(Context.WINDOW_SERVICE); @@ -48,6 +69,5 @@ public class HtmlHelper { tableHandler.setTableWidth((int) (point.x / 1.2)); tableHandler.setTextSize(18.0F); mySpanner.registerHandler("table", tableHandler); - textView.setText(mySpanner.fromHtml(html)); } } diff --git a/app/src/main/java/com/fastaccess/provider/timeline/handler/CodeBackgroundRoundedSpan.java b/app/src/main/java/com/fastaccess/provider/timeline/handler/CodeBackgroundRoundedSpan.java index ff0a110d..4a7a0e1c 100644 --- a/app/src/main/java/com/fastaccess/provider/timeline/handler/CodeBackgroundRoundedSpan.java +++ b/app/src/main/java/com/fastaccess/provider/timeline/handler/CodeBackgroundRoundedSpan.java @@ -12,7 +12,6 @@ import android.text.style.MetricAffectingSpan; public class CodeBackgroundRoundedSpan extends MetricAffectingSpan implements LeadingMarginSpan, LineBackgroundSpan { private final int color; - private final int padding = 30; private final RectF rect = new RectF(); @@ -45,7 +44,7 @@ public class CodeBackgroundRoundedSpan extends MetricAffectingSpan implements Le } @Override public int getLeadingMargin(boolean first) { - return padding; + return 30; } @Override public void drawLeadingMargin(Canvas c, Paint p, int x, int dir, int top, int baseline, int bottom, diff --git a/app/src/main/java/com/fastaccess/provider/timeline/handler/ListsHandler.java b/app/src/main/java/com/fastaccess/provider/timeline/handler/ListsHandler.java new file mode 100644 index 00000000..2ea4c7c0 --- /dev/null +++ b/app/src/main/java/com/fastaccess/provider/timeline/handler/ListsHandler.java @@ -0,0 +1,67 @@ +package com.fastaccess.provider.timeline.handler; + +import android.text.SpannableStringBuilder; + +import com.fastaccess.helper.Logger; + +import net.nightwhistler.htmlspanner.TagNodeHandler; + +import org.htmlcleaner.TagNode; + +public class ListsHandler extends TagNodeHandler { + + private int getMyIndex(TagNode node) { + if (node.getParent() == null) { + return -1; + } else { + int i = 1; + for (Object child : node.getParent().getChildren()) { + if (child == node) { + return i; + } + if (child instanceof TagNode) { + TagNode childNode = (TagNode) child; + if ("li".equals(childNode.getName())) { + ++i; + } + } + } + return -1; + } + } + + private String getParentName(TagNode node) { + return node.getParent() == null ? null : node.getParent().getName(); + } + + @Override public void beforeChildren(TagNode node, SpannableStringBuilder builder) { + TodoItems todoItems = null; + if (node.getChildTags() != null && node.getChildTags().length > 0) { + TagNode tagNode = node.getChildTags()[0]; + if (tagNode.getName() != null && "input".equalsIgnoreCase(tagNode.getName())) { + todoItems = new TodoItems(); + todoItems.isChecked = tagNode.getAttributeByName("checked") != null; + } + Logger.e(tagNode.getName(), tagNode.getAttributeByName("checked")); + } + if ("ol".equals(getParentName(node))) { + builder.append("").append(String.valueOf(getMyIndex(node))).append(". "); + } else if ("ul".equals(getParentName(node))) { + if (todoItems != null) { + builder.append(todoItems.isChecked ? "☑ " : "☐ "); + } else { + builder.append("\u2022 "); + } + } + } + + public void handleTagNode(TagNode node, SpannableStringBuilder builder, int start, int end) { + if (builder.length() > 0 && builder.charAt(builder.length() - 1) != '\n') { + builder.append("\n"); + } + } + + static class TodoItems { + boolean isChecked; + } +} diff --git a/app/src/main/java/com/fastaccess/provider/timeline/handler/MarginHandler.java b/app/src/main/java/com/fastaccess/provider/timeline/handler/MarginHandler.java new file mode 100644 index 00000000..f5435a08 --- /dev/null +++ b/app/src/main/java/com/fastaccess/provider/timeline/handler/MarginHandler.java @@ -0,0 +1,29 @@ +package com.fastaccess.provider.timeline.handler; + +import android.text.Spannable; +import android.text.SpannableStringBuilder; +import android.text.style.LeadingMarginSpan; + +import net.nightwhistler.htmlspanner.TagNodeHandler; + +import org.htmlcleaner.TagNode; + +/** + * Created by Kosh on 29 Apr 2017, 11:59 PM + */ + +public class MarginHandler extends TagNodeHandler { + + public void beforeChildren(TagNode node, SpannableStringBuilder builder) { + if (builder.length() > 0 && builder.charAt(builder.length() - 1) != 10) { //'10 = \n' + this.appendNewLine(builder); + } + } + + + public void handleTagNode(TagNode node, SpannableStringBuilder builder, int start, int end) { + builder.setSpan(new LeadingMarginSpan.Standard(30), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); + this.appendNewLine(builder); + this.appendNewLine(builder); + } +} diff --git a/app/src/main/java/com/fastaccess/provider/timeline/handler/PreTagHandler.java b/app/src/main/java/com/fastaccess/provider/timeline/handler/PreTagHandler.java index 9aeaea0e..2e25f22e 100644 --- a/app/src/main/java/com/fastaccess/provider/timeline/handler/PreTagHandler.java +++ b/app/src/main/java/com/fastaccess/provider/timeline/handler/PreTagHandler.java @@ -36,13 +36,20 @@ import static android.text.Spanned.SPAN_EXCLUSIVE_EXCLUSIVE; } private String replace(String text) { - return text.replaceAll(" ", " ") + return text.replaceAll(" ", "\u00A0") .replaceAll("&", "&") .replaceAll(""", "\"") .replaceAll("¢", "¢") .replaceAll("<", "<") .replaceAll(">", ">") - .replaceAll(">", "§"); + .replaceAll("§", "§") + .replaceAll("“", "“") + .replaceAll("”", "”") + .replaceAll("‘", "‘") + .replaceAll("’", "’") + .replaceAll("–", "\u2013") + .replaceAll("—", "\u2014") + .replaceAll("―", "\u2015"); } @Override public void handleTagNode(TagNode node, SpannableStringBuilder builder, int start, int end) { @@ -65,4 +72,5 @@ import static android.text.Spanned.SPAN_EXCLUSIVE_EXCLUSIVE; builder.setSpan(new BackgroundColorSpan(color), start + 1, builder.length() - 1, SPAN_EXCLUSIVE_EXCLUSIVE); } } + } diff --git a/app/src/main/java/com/fastaccess/provider/timeline/handler/StrikethroughHandler.java b/app/src/main/java/com/fastaccess/provider/timeline/handler/StrikethroughHandler.java new file mode 100644 index 00000000..51eb388a --- /dev/null +++ b/app/src/main/java/com/fastaccess/provider/timeline/handler/StrikethroughHandler.java @@ -0,0 +1,16 @@ +package com.fastaccess.provider.timeline.handler; + +import android.text.SpannableStringBuilder; +import android.text.style.StrikethroughSpan; + +import net.nightwhistler.htmlspanner.TagNodeHandler; + +import org.htmlcleaner.TagNode; + +public class StrikethroughHandler extends TagNodeHandler { + + @Override public void handleTagNode(TagNode node, SpannableStringBuilder builder, int start, int end) { + builder.setSpan(new StrikethroughSpan(), start, end, 33); + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/fastaccess/provider/timeline/handler/SubScriptHandler.java b/app/src/main/java/com/fastaccess/provider/timeline/handler/SubScriptHandler.java new file mode 100644 index 00000000..4b252c2e --- /dev/null +++ b/app/src/main/java/com/fastaccess/provider/timeline/handler/SubScriptHandler.java @@ -0,0 +1,17 @@ +package com.fastaccess.provider.timeline.handler; + +import android.text.SpannableStringBuilder; +import android.text.style.RelativeSizeSpan; +import android.text.style.SubscriptSpan; + +import net.nightwhistler.htmlspanner.TagNodeHandler; + +import org.htmlcleaner.TagNode; + +public class SubScriptHandler extends TagNodeHandler { + + @Override public void handleTagNode(TagNode node, SpannableStringBuilder builder, int start, int end) { + builder.setSpan(new SubscriptSpan(), start, end, 33); + builder.setSpan(new RelativeSizeSpan(0.8f), start, end, 33); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/fastaccess/provider/timeline/handler/SuperScriptHandler.java b/app/src/main/java/com/fastaccess/provider/timeline/handler/SuperScriptHandler.java new file mode 100644 index 00000000..1900bdf4 --- /dev/null +++ b/app/src/main/java/com/fastaccess/provider/timeline/handler/SuperScriptHandler.java @@ -0,0 +1,18 @@ +package com.fastaccess.provider.timeline.handler; + +import android.text.SpannableStringBuilder; +import android.text.style.RelativeSizeSpan; +import android.text.style.SuperscriptSpan; + +import net.nightwhistler.htmlspanner.TagNodeHandler; + +import org.htmlcleaner.TagNode; + +public class SuperScriptHandler extends TagNodeHandler { + + @Override public void handleTagNode(TagNode node, SpannableStringBuilder builder, int start, int end) { + builder.setSpan(new SuperscriptSpan(), start, end, 33); + builder.setSpan(new RelativeSizeSpan(0.8f), start, end, 33); + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/fastaccess/provider/timeline/handler/TableHandler.java b/app/src/main/java/com/fastaccess/provider/timeline/handler/TableHandler.java new file mode 100644 index 00000000..3c4a7ada --- /dev/null +++ b/app/src/main/java/com/fastaccess/provider/timeline/handler/TableHandler.java @@ -0,0 +1,298 @@ +package com.fastaccess.provider.timeline.handler; + +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.ColorFilter; +import android.graphics.Paint; +import android.graphics.Paint.Style; +import android.graphics.PixelFormat; +import android.graphics.Typeface; +import android.graphics.drawable.Drawable; +import android.support.annotation.NonNull; +import android.text.Layout.Alignment; +import android.text.Spannable; +import android.text.SpannableStringBuilder; +import android.text.Spanned; +import android.text.StaticLayout; +import android.text.TextPaint; +import android.text.style.AlignmentSpan; +import android.text.style.ImageSpan; + +import net.nightwhistler.htmlspanner.TagNodeHandler; + +import org.htmlcleaner.TagNode; + +import java.util.ArrayList; +import java.util.List; + +/** + * Handles simple HTML tables. + *

+ * Since it renders these tables itself, it needs to know things like font size + * and text colour to use. + * + * @author Alex Kuiper + */ +public class TableHandler extends TagNodeHandler { + + private int tableWidth = 400; + private Typeface typeFace = Typeface.DEFAULT; + private float textSize = 16f; + private int textColor = Color.BLACK; + + private static final int PADDING = 5; + + /** + * Sets how wide the table should be. + * + * @param tableWidth + */ + public void setTableWidth(int tableWidth) { + this.tableWidth = tableWidth; + } + + /** + * Sets the text colour to use. + *

+ * Default is black. + * + * @param textColor + */ + public void setTextColor(int textColor) { + this.textColor = textColor; + } + + /** + * Sets the font size to use. + *

+ * Default is 16f. + * + * @param textSize + */ + public void setTextSize(float textSize) { + this.textSize = textSize; + } + + /** + * Sets the TypeFace to use. + *

+ * Default is Typeface.DEFAULT + * + * @param typeFace + */ + public void setTypeFace(Typeface typeFace) { + this.typeFace = typeFace; + } + + @Override + public boolean rendersContent() { + return true; + } + + private void readNode(Object node, Table table) { + if (node instanceof TagNode) { + TagNode tagNode = (TagNode) node; + if (tagNode.getName().equals("td") || tagNode.getName().equals("th")) { + Spanned result = this.getSpanner().fromTagNode(tagNode); + table.addCell(result); + return; + } + if (tagNode.getName().equals("tr")) { + table.addRow(); + } + for (Object child : tagNode.getChildTags()) { + readNode(child, table); + } + } + + } + + private Table getTable(TagNode node) { + + String border = node.getAttributeByName("border"); + + boolean drawBorder = !"0".equals(border); + + Table result = new Table(drawBorder); + + readNode(node, result); + + return result; + } + + private TextPaint getTextPaint() { + TextPaint textPaint = new TextPaint(); + textPaint.setColor(this.textColor); + textPaint.linkColor = this.textColor; + textPaint.setAntiAlias(true); + textPaint.setTextSize(this.textSize); + textPaint.setTypeface(this.typeFace); + + return textPaint; + } + + private int calculateRowHeight(List row) { + + if (row.size() == 0) { + return 0; + } + + TextPaint textPaint = getTextPaint(); + + int columnWidth = tableWidth / row.size(); + + int rowHeight = 0; + + for (Spanned cell : row) { + + StaticLayout layout = new StaticLayout(cell, textPaint, columnWidth + - 2 * PADDING, Alignment.ALIGN_NORMAL, 1f, 0f, true); + + if (layout.getHeight() > rowHeight) { + rowHeight = layout.getHeight(); + } + } + + return rowHeight; + } + + @Override public void handleTagNode(TagNode node, SpannableStringBuilder builder, int start, int end) { + Table table = getTable(node); + for (int i = 0; i < table.getRows().size(); i++) { + List row = table.getRows().get(i); + builder.append("\uFFFC"); + TableRowDrawable drawable = new TableRowDrawable(row, table.isDrawBorder()); + drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), + drawable.getIntrinsicHeight()); + builder.setSpan(new ImageSpan(drawable), start + i, builder.length(), 33); + + } + + /* + We add an empty last row to work around a rendering issue where + the last row would appear detached. + */ + builder.append("\uFFFC"); + Drawable drawable = new TableRowDrawable(new ArrayList(), table.isDrawBorder()); + drawable.setBounds(0, 0, tableWidth, 1); + builder.setSpan(new ImageSpan(drawable), builder.length() - 1, builder.length(), + Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); + builder.setSpan((AlignmentSpan) () -> Alignment.ALIGN_CENTER, start, builder.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); + builder.append("\n"); + } + + /** + * Drawable of the table, which does the actual rendering. + * + * @author Alex Kuiper. + */ + private class TableRowDrawable extends Drawable { + + private List tableRow; + + private int rowHeight; + private boolean paintBorder; + + TableRowDrawable(List tableRow, boolean paintBorder) { + this.tableRow = tableRow; + this.rowHeight = calculateRowHeight(tableRow); + this.paintBorder = paintBorder; + } + + @Override public void draw(@NonNull Canvas canvas) { + Paint paint = new Paint(); + paint.setColor(textColor); + paint.setStyle(Style.STROKE); + + int numberOfColumns = tableRow.size(); + + if (numberOfColumns == 0) { + return; + } + + int columnWidth = tableWidth / numberOfColumns; + + int offset; + + for (int i = 0; i < numberOfColumns; i++) { + + offset = i * columnWidth; + + if (paintBorder) { + // The rect is open at the bottom, so there's a single line + // between rows. + canvas.drawRect(offset, 0, offset + columnWidth, rowHeight, paint); + } + + StaticLayout layout = new StaticLayout(tableRow.get(i), + getTextPaint(), (columnWidth - 2 * PADDING), + Alignment.ALIGN_NORMAL, 1f, 0f, true); + + canvas.translate(offset + PADDING, 0); + layout.draw(canvas); + canvas.translate(-1 * (offset + PADDING), 0); + + } + } + + @Override + public int getIntrinsicHeight() { + return rowHeight; + } + + @Override + public int getIntrinsicWidth() { + return tableWidth; + } + + @Override + public int getOpacity() { + return PixelFormat.OPAQUE; + } + + @Override + public void setAlpha(int alpha) { + + } + + @Override + public void setColorFilter(ColorFilter cf) { + + } + } + + private class Table { + + private boolean drawBorder; + private List> content = new ArrayList<>(); + + private Table(boolean drawBorder) { + this.drawBorder = drawBorder; + } + + boolean isDrawBorder() { + return drawBorder; + } + + void addRow() { + content.add(new ArrayList<>()); + } + + List getBottomRow() { + return content.get(content.size() - 1); + } + + List> getRows() { + return content; + } + + void addCell(Spanned text) { + if (content.isEmpty()) { + throw new IllegalStateException("No rows added yet"); + } + + getBottomRow().add(text); + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/fastaccess/provider/timeline/handler/UnderlineHandler.java b/app/src/main/java/com/fastaccess/provider/timeline/handler/UnderlineHandler.java new file mode 100644 index 00000000..1f7ab595 --- /dev/null +++ b/app/src/main/java/com/fastaccess/provider/timeline/handler/UnderlineHandler.java @@ -0,0 +1,15 @@ +package com.fastaccess.provider.timeline.handler; + +import android.text.SpannableStringBuilder; +import android.text.style.UnderlineSpan; + +import net.nightwhistler.htmlspanner.TagNodeHandler; + +import org.htmlcleaner.TagNode; + +public class UnderlineHandler extends TagNodeHandler { + + @Override public void handleTagNode(TagNode tagNode, SpannableStringBuilder spannableStringBuilder, int start, int end) { + spannableStringBuilder.setSpan(new UnderlineSpan(), start, end, 33); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/fastaccess/ui/modules/main/MainPresenter.java b/app/src/main/java/com/fastaccess/ui/modules/main/MainPresenter.java index 5b04c6b5..6270681d 100644 --- a/app/src/main/java/com/fastaccess/ui/modules/main/MainPresenter.java +++ b/app/src/main/java/com/fastaccess/ui/modules/main/MainPresenter.java @@ -10,7 +10,7 @@ import android.support.v4.widget.DrawerLayout; import com.fastaccess.R; import com.fastaccess.ui.base.mvp.presenter.BasePresenter; import com.fastaccess.ui.modules.feeds.FeedsFragment; -import com.fastaccess.ui.modules.main.issues.pager.MyIssuesPagerView; +import com.fastaccess.ui.modules.main.issues.pager.MyIssuesPagerFragment; import com.fastaccess.ui.modules.main.pullrequests.pager.MyPullsPagerFragment; import static com.fastaccess.helper.ActivityHelper.getVisibleFragment; @@ -31,7 +31,7 @@ class MainPresenter extends BasePresenter implements MainMvp.Prese Fragment currentVisible = getVisibleFragment(fragmentManager); FeedsFragment homeView = (FeedsFragment) getFragmentByTag(fragmentManager, FeedsFragment.TAG); MyPullsPagerFragment pullRequestView = (MyPullsPagerFragment) getFragmentByTag(fragmentManager, MyPullsPagerFragment.TAG); - MyIssuesPagerView issuesView = (MyIssuesPagerView) getFragmentByTag(fragmentManager, MyIssuesPagerView.TAG); + MyIssuesPagerFragment issuesView = (MyIssuesPagerFragment) getFragmentByTag(fragmentManager, MyIssuesPagerFragment.TAG); switch (type) { case MainMvp.FEEDS: if (homeView == null) { @@ -49,7 +49,7 @@ class MainPresenter extends BasePresenter implements MainMvp.Prese break; case MainMvp.ISSUES: if (issuesView == null) { - onAddAndHide(fragmentManager, MyIssuesPagerView.newInstance(), currentVisible); + onAddAndHide(fragmentManager, MyIssuesPagerFragment.newInstance(), currentVisible); } else { onShowHideFragment(fragmentManager, issuesView, currentVisible); } diff --git a/app/src/main/java/com/fastaccess/ui/modules/main/issues/MyIssuesView.java b/app/src/main/java/com/fastaccess/ui/modules/main/issues/MyIssuesFragment.java similarity index 94% rename from app/src/main/java/com/fastaccess/ui/modules/main/issues/MyIssuesView.java rename to app/src/main/java/com/fastaccess/ui/modules/main/issues/MyIssuesFragment.java index 6020db1b..80e46ea0 100644 --- a/app/src/main/java/com/fastaccess/ui/modules/main/issues/MyIssuesView.java +++ b/app/src/main/java/com/fastaccess/ui/modules/main/issues/MyIssuesFragment.java @@ -28,7 +28,7 @@ import butterknife.BindView; * Created by Kosh on 25 Mar 2017, 11:48 PM */ -public class MyIssuesView extends BaseFragment implements MyIssuesMvp.View { +public class MyIssuesFragment extends BaseFragment implements MyIssuesMvp.View { @BindView(R.id.recycler) DynamicRecyclerView recycler; @BindView(R.id.refresh) SwipeRefreshLayout refresh; @@ -38,8 +38,8 @@ public class MyIssuesView extends BaseFragment getLoadMore() { if (onLoadMore == null) { onLoadMore = new OnLoadMore<>(getPresenter()); @@ -145,4 +140,9 @@ public class MyIssuesView extends BaseFragment implement return; } setCurrentPage(page); - makeRestCall(RestProvider.getIssueService().getIssuesWithCount(RepoQueryProvider.getMyIssuesPullRequestQuery(Login.getUser().getLogin(), - parameter, false), page), - issues -> { - lastPage = issues.getLast(); - if (getCurrentPage() == 1) { - sendToView(view -> view.onSetCount(issues.getTotalCount())); - } - sendToView(view -> view.onNotifyAdapter(issues.getItems(), page)); - }); + String searchQuery = RepoQueryProvider.getMyIssuesPullRequestQuery(Login.getUser().getLogin(), + parameter, false); + makeRestCall(RestProvider.getIssueService().getIssuesWithCount(searchQuery, page), issues -> { + lastPage = issues.getLast(); + if (getCurrentPage() == 1) { + sendToView(view -> view.onSetCount(issues.getTotalCount())); + } + sendToView(view -> view.onNotifyAdapter(issues.getItems(), page)); + }); } } diff --git a/app/src/main/java/com/fastaccess/ui/modules/main/issues/pager/MyIssuesPagerView.java b/app/src/main/java/com/fastaccess/ui/modules/main/issues/pager/MyIssuesPagerFragment.java similarity index 88% rename from app/src/main/java/com/fastaccess/ui/modules/main/issues/pager/MyIssuesPagerView.java rename to app/src/main/java/com/fastaccess/ui/modules/main/issues/pager/MyIssuesPagerFragment.java index 42b48b1e..a67eddcd 100644 --- a/app/src/main/java/com/fastaccess/ui/modules/main/issues/pager/MyIssuesPagerView.java +++ b/app/src/main/java/com/fastaccess/ui/modules/main/issues/pager/MyIssuesPagerFragment.java @@ -26,16 +26,16 @@ import icepick.State; * Created by Kosh on 26 Mar 2017, 12:14 AM */ -public class MyIssuesPagerView extends BaseFragment implements MyIssuesPagerMvp.View { +public class MyIssuesPagerFragment extends BaseFragment implements MyIssuesPagerMvp.View { - public static final String TAG = MyIssuesPagerView.class.getSimpleName(); + public static final String TAG = MyIssuesPagerFragment.class.getSimpleName(); @BindView(R.id.tabs) TabLayout tabs; @BindView(R.id.pager) ViewPagerView pager; @State HashSet counts = new HashSet<>(); - public static MyIssuesPagerView newInstance() { - return new MyIssuesPagerView(); + public static MyIssuesPagerFragment newInstance() { + return new MyIssuesPagerFragment(); } @Override protected int fragmentLayout() { diff --git a/app/src/main/java/com/fastaccess/ui/modules/main/pullrequests/MyPullRequestsPresenter.java b/app/src/main/java/com/fastaccess/ui/modules/main/pullrequests/MyPullRequestsPresenter.java index 9b8cb68c..9d9934bc 100644 --- a/app/src/main/java/com/fastaccess/ui/modules/main/pullrequests/MyPullRequestsPresenter.java +++ b/app/src/main/java/com/fastaccess/ui/modules/main/pullrequests/MyPullRequestsPresenter.java @@ -72,7 +72,7 @@ public class MyPullRequestsPresenter extends BasePresenter { lastPage = response.getLast(); diff --git a/app/src/main/java/com/fastaccess/ui/modules/repos/code/commit/details/CommitPagerPresenter.java b/app/src/main/java/com/fastaccess/ui/modules/repos/code/commit/details/CommitPagerPresenter.java index d9f92bb2..6041990f 100644 --- a/app/src/main/java/com/fastaccess/ui/modules/repos/code/commit/details/CommitPagerPresenter.java +++ b/app/src/main/java/com/fastaccess/ui/modules/repos/code/commit/details/CommitPagerPresenter.java @@ -52,13 +52,11 @@ class CommitPagerPresenter extends BasePresenter implements .getCommit(login, repoId, sha) .flatMap(commit -> { if (commit.getGitCommit() != null && commit.getGitCommit().getMessage() != null) { - if (commit.getGitCommit().getMessage().contains("#")) { - MarkdownModel markdownModel = new MarkdownModel(); - markdownModel.setContext(login + "/" + repoId); - markdownModel.setText(commit.getGitCommit().getMessage()); - return RestProvider.getRepoService().convertReadmeToHtml(markdownModel) - .onErrorReturn(throwable -> null); - } + MarkdownModel markdownModel = new MarkdownModel(); + markdownModel.setContext(login + "/" + repoId); + markdownModel.setText(commit.getGitCommit().getMessage()); + return RestProvider.getRepoService().convertReadmeToHtml(markdownModel) + .onErrorReturn(throwable -> null); } return Observable.just(commit); }, (commit, u) -> { diff --git a/app/src/main/java/com/fastaccess/ui/modules/repos/code/prettifier/ViewerPresenter.java b/app/src/main/java/com/fastaccess/ui/modules/repos/code/prettifier/ViewerPresenter.java index 3f24ffeb..049f51da 100644 --- a/app/src/main/java/com/fastaccess/ui/modules/repos/code/prettifier/ViewerPresenter.java +++ b/app/src/main/java/com/fastaccess/ui/modules/repos/code/prettifier/ViewerPresenter.java @@ -97,8 +97,8 @@ class ViewerPresenter extends BasePresenter implements ViewerMvp sendToView(view -> view.onSetImageUrl(url)); return; } - makeRestCall(isRepo ? RestProvider.getRepoService().getReadmeHtml(url) - : RestProvider.getRepoService().getFileAsStream(url), content -> { + makeRestCall(isRepo ? RestProvider.getRepoService(true).getReadmeHtml(url) + : RestProvider.getRepoService(true).getFileAsStream(url), content -> { downloadedStream = content; ViewerFile fileModel = new ViewerFile(); fileModel.setContent(downloadedStream); diff --git a/app/src/main/java/com/fastaccess/ui/modules/repos/issues/create/CreateIssuePresenter.java b/app/src/main/java/com/fastaccess/ui/modules/repos/issues/create/CreateIssuePresenter.java index 1f643020..fbe98c41 100644 --- a/app/src/main/java/com/fastaccess/ui/modules/repos/issues/create/CreateIssuePresenter.java +++ b/app/src/main/java/com/fastaccess/ui/modules/repos/issues/create/CreateIssuePresenter.java @@ -72,7 +72,7 @@ public class CreateIssuePresenter extends BasePresenter imp pullRequestModel.setBody(InputHelper.toString(description)); pullRequestModel.setTitle(title); IssueRequestModel requestModel = IssueRequestModel.clone(pullRequestModel, false); - makeRestCall(RestProvider.getPullRequestSerice().editPullRequest(login, repo, number, requestModel), + makeRestCall(RestProvider.getPullRequestService().editPullRequest(login, repo, number, requestModel), pr -> { if (pr != null) { sendToView(view -> view.onSuccessSubmission(pr)); diff --git a/app/src/main/java/com/fastaccess/ui/modules/repos/pull_requests/pull_request/RepoPullRequestPresenter.java b/app/src/main/java/com/fastaccess/ui/modules/repos/pull_requests/pull_request/RepoPullRequestPresenter.java index 01bf1235..47f245da 100644 --- a/app/src/main/java/com/fastaccess/ui/modules/repos/pull_requests/pull_request/RepoPullRequestPresenter.java +++ b/app/src/main/java/com/fastaccess/ui/modules/repos/pull_requests/pull_request/RepoPullRequestPresenter.java @@ -69,7 +69,7 @@ class RepoPullRequestPresenter extends BasePresenter im return; } if (repoId == null || login == null) return; - makeRestCall(RestProvider.getPullRequestSerice().getPullRequests(login, repoId, parameter.name(), page), response -> { + makeRestCall(RestProvider.getPullRequestService().getPullRequests(login, repoId, parameter.name(), page), response -> { lastPage = response.getLast(); if (getCurrentPage() == 1) { manageSubscription(PullRequest.save(response.getItems(), login, repoId).subscribe()); @@ -89,7 +89,7 @@ class RepoPullRequestPresenter extends BasePresenter im } private void onCallCountApi(@NonNull IssueState issueState) { - manageSubscription(RxHelper.getObserver(RestProvider.getPullRequestSerice() + manageSubscription(RxHelper.getObserver(RestProvider.getPullRequestService() .getPullsWithCount(RepoQueryProvider.getIssuesPullRequestQuery(login, repoId, issueState, true), 0)) .subscribe(pullRequestPageable -> sendToView(view -> view.onUpdateCount(pullRequestPageable.getTotalCount())), Throwable::printStackTrace)); diff --git a/app/src/main/java/com/fastaccess/ui/modules/repos/pull_requests/pull_request/details/PullRequestPagerPresenter.java b/app/src/main/java/com/fastaccess/ui/modules/repos/pull_requests/pull_request/details/PullRequestPagerPresenter.java index 41cc3f15..132619e5 100644 --- a/app/src/main/java/com/fastaccess/ui/modules/repos/pull_requests/pull_request/details/PullRequestPagerPresenter.java +++ b/app/src/main/java/com/fastaccess/ui/modules/repos/pull_requests/pull_request/details/PullRequestPagerPresenter.java @@ -70,7 +70,7 @@ class PullRequestPagerPresenter extends BasePresenter sendToView(PullRequestPagerMvp.View::onSetupIssue); return; } else if (issueNumber > 0 && !InputHelper.isEmpty(login) && !InputHelper.isEmpty(repoId)) { - makeRestCall(RestProvider.getPullRequestSerice().getPullRequest(login, repoId, issueNumber) + makeRestCall(RestProvider.getPullRequestService().getPullRequest(login, repoId, issueNumber) , pullRequestModelResponse -> { pullRequest = pullRequestModelResponse; pullRequest.setRepoId(repoId); @@ -160,7 +160,7 @@ class PullRequestPagerPresenter extends BasePresenter @Override public void onOpenCloseIssue() { if (getPullRequest() != null) { IssueRequestModel requestModel = IssueRequestModel.clone(getPullRequest(), true); - manageSubscription(RxHelper.getObserver(RestProvider.getPullRequestSerice().editPullRequest(login, repoId, + manageSubscription(RxHelper.getObserver(RestProvider.getPullRequestService().editPullRequest(login, repoId, issueNumber, requestModel)) .doOnSubscribe(() -> sendToView(view -> view.showProgress(0))) .doOnNext(issue -> { @@ -230,7 +230,7 @@ class PullRequestPagerPresenter extends BasePresenter @Override public void onPutMilestones(@NonNull MilestoneModel milestone) { pullRequest.setMilestone(milestone); IssueRequestModel issueRequestModel = IssueRequestModel.clone(pullRequest, false); - makeRestCall(RestProvider.getPullRequestSerice().editIssue(login, repoId, issueNumber, issueRequestModel), + makeRestCall(RestProvider.getPullRequestService().editIssue(login, repoId, issueNumber, issueRequestModel), pr -> { this.pullRequest = pr; pullRequest.setLogin(login); @@ -246,7 +246,7 @@ class PullRequestPagerPresenter extends BasePresenter ArrayList assignees = new ArrayList<>(); Stream.of(users).forEach(userModel -> assignees.add(userModel.getLogin())); assigneesRequestModel.setAssignees(assignees); - makeRestCall(RestProvider.getPullRequestSerice().putAssignees(login, repoId, issueNumber, assigneesRequestModel), + makeRestCall(RestProvider.getPullRequestService().putAssignees(login, repoId, issueNumber, assigneesRequestModel), issue -> { this.pullRequest = issue; pullRequest.setLogin(login); @@ -267,7 +267,7 @@ class PullRequestPagerPresenter extends BasePresenter mergeRequestModel.setSha(getPullRequest().getHead().getSha()); mergeRequestModel.setCommitMessage(msg); manageSubscription( - RxHelper.getObserver(RestProvider.getPullRequestSerice().mergePullRequest(login, repoId, issueNumber, mergeRequestModel)) + RxHelper.getObserver(RestProvider.getPullRequestService().mergePullRequest(login, repoId, issueNumber, mergeRequestModel)) .doOnSubscribe(() -> sendToView(view -> view.showProgress(0))) .doOnNext(mergeResponseModel -> { if (mergeResponseModel.isMerged()) { diff --git a/app/src/main/java/com/fastaccess/ui/modules/repos/pull_requests/pull_request/details/commits/PullRequestCommitsPresenter.java b/app/src/main/java/com/fastaccess/ui/modules/repos/pull_requests/pull_request/details/commits/PullRequestCommitsPresenter.java index 9b7a330a..a026cd80 100644 --- a/app/src/main/java/com/fastaccess/ui/modules/repos/pull_requests/pull_request/details/commits/PullRequestCommitsPresenter.java +++ b/app/src/main/java/com/fastaccess/ui/modules/repos/pull_requests/pull_request/details/commits/PullRequestCommitsPresenter.java @@ -62,7 +62,7 @@ class PullRequestCommitsPresenter extends BasePresenter { lastPage = response.getLast(); if (getCurrentPage() == 1) { diff --git a/app/src/main/java/com/fastaccess/ui/modules/repos/pull_requests/pull_request/details/files/PullRequestFilesPresenter.java b/app/src/main/java/com/fastaccess/ui/modules/repos/pull_requests/pull_request/details/files/PullRequestFilesPresenter.java index da5d50f6..7f08d01e 100644 --- a/app/src/main/java/com/fastaccess/ui/modules/repos/pull_requests/pull_request/details/files/PullRequestFilesPresenter.java +++ b/app/src/main/java/com/fastaccess/ui/modules/repos/pull_requests/pull_request/details/files/PullRequestFilesPresenter.java @@ -69,7 +69,7 @@ class PullRequestFilesPresenter extends BasePresenter return; } if (repoId == null || login == null) return; - makeRestCall(RestProvider.getPullRequestSerice().getPullRequestFiles(login, repoId, number, page), + makeRestCall(RestProvider.getPullRequestService().getPullRequestFiles(login, repoId, number, page), response -> { lastPage = response.getLast(); sendToView(view -> view.onNotifyAdapter(response.getItems(), page)); diff --git a/app/src/main/java/com/fastaccess/ui/modules/repos/pull_requests/pull_request/details/timeline/timeline/PullRequestTimelinePresenter.java b/app/src/main/java/com/fastaccess/ui/modules/repos/pull_requests/pull_request/details/timeline/timeline/PullRequestTimelinePresenter.java index cf4639d8..1a48e60b 100644 --- a/app/src/main/java/com/fastaccess/ui/modules/repos/pull_requests/pull_request/details/timeline/timeline/PullRequestTimelinePresenter.java +++ b/app/src/main/java/com/fastaccess/ui/modules/repos/pull_requests/pull_request/details/timeline/timeline/PullRequestTimelinePresenter.java @@ -89,8 +89,8 @@ public class PullRequestTimelinePresenter extends BasePresenter> observable = Observable.zip(RestProvider.getIssueService().getTimeline(login, repoId, number), RestProvider.getIssueService().getIssueComments(login, repoId, number), - RestProvider.getPullRequestSerice().getPullStatus(login, repoId, getHeader().getHead().getSha()), - RestProvider.getPullRequestSerice().getReviews(login, repoId, number), + RestProvider.getPullRequestService().getPullStatus(login, repoId, getHeader().getHead().getSha()), + RestProvider.getPullRequestService().getReviews(login, repoId, number), (issueEventPageable, commentPageable, statuses, reviews) -> { if (statuses != null) { statuses.setMergable(getHeader().isMergeable()); diff --git a/app/src/main/java/com/fastaccess/ui/modules/settings/SettingsFragment.java b/app/src/main/java/com/fastaccess/ui/modules/settings/SettingsFragment.java index ebbab7f7..7eb4b01b 100644 --- a/app/src/main/java/com/fastaccess/ui/modules/settings/SettingsFragment.java +++ b/app/src/main/java/com/fastaccess/ui/modules/settings/SettingsFragment.java @@ -11,6 +11,7 @@ import com.fastaccess.R; import com.fastaccess.helper.PrefGetter; import com.fastaccess.provider.tasks.notification.NotificationSchedulerJobTask; import com.fastaccess.ui.base.mvp.BaseMvp; +import com.fastaccess.ui.modules.changelog.ChangelogBottomSheetDialog; import com.fastaccess.ui.widgets.SpannableBuilder; import es.dmoral.toasty.Toasty; @@ -43,6 +44,10 @@ public class SettingsFragment extends PreferenceFragmentCompat implements Prefer findPreference("rect_avatar").setOnPreferenceChangeListener(this); findPreference("appTheme").setOnPreferenceChangeListener(this); findPreference("app_language").setOnPreferenceChangeListener(this); + findPreference("showChangelog").setOnPreferenceClickListener(preference -> { + new ChangelogBottomSheetDialog().show(getChildFragmentManager(), "ChangelogBottomSheetDialog"); + return true; + }); findPreference("currentVersion").setSummary(SpannableBuilder.builder() .append(getString(R.string.current_version)) .append("(") diff --git a/app/src/main/res/xml/fasthub_settings.xml b/app/src/main/res/xml/fasthub_settings.xml index 78302a78..d4855ff3 100644 --- a/app/src/main/res/xml/fasthub_settings.xml +++ b/app/src/main/res/xml/fasthub_settings.xml @@ -84,6 +84,10 @@ + + diff --git a/build.gradle b/build.gradle index 6c8de215..3c3c539f 100644 --- a/build.gradle +++ b/build.gradle @@ -5,7 +5,7 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:2.4.0-alpha6' + classpath 'com.android.tools.build:gradle:2.4.0-alpha7' def taskRequests = getGradle().getStartParameter().getTaskRequests().toString() def isGms = taskRequests.contains("Gms") || taskRequests.contains("gms") if (isGms) {