mirror of
https://github.com/k0shk0sh/FastHub.git
synced 2026-01-25 14:47:05 +00:00
commit
de7f8be16d
@ -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<FragmentPagerAdapterModel> 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());
|
||||
}
|
||||
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
|
||||
@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
@ -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,
|
||||
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
@ -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.
|
||||
* <p>
|
||||
* 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.
|
||||
* <p>
|
||||
* Default is black.
|
||||
*
|
||||
* @param textColor
|
||||
*/
|
||||
public void setTextColor(int textColor) {
|
||||
this.textColor = textColor;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the font size to use.
|
||||
* <p>
|
||||
* Default is 16f.
|
||||
*
|
||||
* @param textSize
|
||||
*/
|
||||
public void setTextSize(float textSize) {
|
||||
this.textSize = textSize;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the TypeFace to use.
|
||||
* <p>
|
||||
* 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<Spanned> 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<Spanned> 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<Spanned>(), 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<Spanned> tableRow;
|
||||
|
||||
private int rowHeight;
|
||||
private boolean paintBorder;
|
||||
|
||||
TableRowDrawable(List<Spanned> 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<List<Spanned>> content = new ArrayList<>();
|
||||
|
||||
private Table(boolean drawBorder) {
|
||||
this.drawBorder = drawBorder;
|
||||
}
|
||||
|
||||
boolean isDrawBorder() {
|
||||
return drawBorder;
|
||||
}
|
||||
|
||||
void addRow() {
|
||||
content.add(new ArrayList<>());
|
||||
}
|
||||
|
||||
List<Spanned> getBottomRow() {
|
||||
return content.get(content.size() - 1);
|
||||
}
|
||||
|
||||
List<List<Spanned>> getRows() {
|
||||
return content;
|
||||
}
|
||||
|
||||
void addCell(Spanned text) {
|
||||
if (content.isEmpty()) {
|
||||
throw new IllegalStateException("No rows added yet");
|
||||
}
|
||||
|
||||
getBottomRow().add(text);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
@ -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<MainMvp.View> 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<MainMvp.View> 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);
|
||||
}
|
||||
|
||||
@ -28,7 +28,7 @@ import butterknife.BindView;
|
||||
* Created by Kosh on 25 Mar 2017, 11:48 PM
|
||||
*/
|
||||
|
||||
public class MyIssuesView extends BaseFragment<MyIssuesMvp.View, MyIssuesPresenter> implements MyIssuesMvp.View {
|
||||
public class MyIssuesFragment extends BaseFragment<MyIssuesMvp.View, MyIssuesPresenter> implements MyIssuesMvp.View {
|
||||
|
||||
@BindView(R.id.recycler) DynamicRecyclerView recycler;
|
||||
@BindView(R.id.refresh) SwipeRefreshLayout refresh;
|
||||
@ -38,8 +38,8 @@ public class MyIssuesView extends BaseFragment<MyIssuesMvp.View, MyIssuesPresent
|
||||
private IssueState issueState;
|
||||
private RepoPagerMvp.TabsBadgeListener tabsBadgeListener;
|
||||
|
||||
public static MyIssuesView newInstance(@NonNull IssueState issueState) {
|
||||
MyIssuesView view = new MyIssuesView();
|
||||
public static MyIssuesFragment newInstance(@NonNull IssueState issueState) {
|
||||
MyIssuesFragment view = new MyIssuesFragment();
|
||||
view.setArguments(Bundler.start().put(BundleConstant.EXTRA, issueState).end());
|
||||
return view;
|
||||
}
|
||||
@ -98,11 +98,6 @@ public class MyIssuesView extends BaseFragment<MyIssuesMvp.View, MyIssuesPresent
|
||||
super.showMessage(titleRes, msgRes);
|
||||
}
|
||||
|
||||
private void showReload() {
|
||||
hideProgress();
|
||||
stateLayout.showReload(adapter.getItemCount());
|
||||
}
|
||||
|
||||
@NonNull @Override public OnLoadMore<IssueState> getLoadMore() {
|
||||
if (onLoadMore == null) {
|
||||
onLoadMore = new OnLoadMore<>(getPresenter());
|
||||
@ -145,4 +140,9 @@ public class MyIssuesView extends BaseFragment<MyIssuesMvp.View, MyIssuesPresent
|
||||
}
|
||||
return issueState;
|
||||
}
|
||||
|
||||
private void showReload() {
|
||||
hideProgress();
|
||||
stateLayout.showReload(adapter.getItemCount());
|
||||
}
|
||||
}
|
||||
@ -71,14 +71,14 @@ public class MyIssuesPresenter extends BasePresenter<MyIssuesMvp.View> 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));
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@ -26,16 +26,16 @@ import icepick.State;
|
||||
* Created by Kosh on 26 Mar 2017, 12:14 AM
|
||||
*/
|
||||
|
||||
public class MyIssuesPagerView extends BaseFragment<MyIssuesPagerMvp.View, MyIssuesPagerPresenter> implements MyIssuesPagerMvp.View {
|
||||
public class MyIssuesPagerFragment extends BaseFragment<MyIssuesPagerMvp.View, MyIssuesPagerPresenter> 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<TabsCountStateModel> counts = new HashSet<>();
|
||||
|
||||
public static MyIssuesPagerView newInstance() {
|
||||
return new MyIssuesPagerView();
|
||||
public static MyIssuesPagerFragment newInstance() {
|
||||
return new MyIssuesPagerFragment();
|
||||
}
|
||||
|
||||
@Override protected int fragmentLayout() {
|
||||
@ -72,7 +72,7 @@ public class MyPullRequestsPresenter extends BasePresenter<MyPullRequestsMvp.Vie
|
||||
return;
|
||||
}
|
||||
setCurrentPage(page);
|
||||
makeRestCall(RestProvider.getPullRequestSerice().getPullsWithCount(RepoQueryProvider.getMyIssuesPullRequestQuery(Login.getUser().getLogin(),
|
||||
makeRestCall(RestProvider.getPullRequestService().getPullsWithCount(RepoQueryProvider.getMyIssuesPullRequestQuery(Login.getUser().getLogin(),
|
||||
parameter, true), page),
|
||||
response -> {
|
||||
lastPage = response.getLast();
|
||||
|
||||
@ -52,13 +52,11 @@ class CommitPagerPresenter extends BasePresenter<CommitPagerMvp.View> 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) -> {
|
||||
|
||||
@ -97,8 +97,8 @@ class ViewerPresenter extends BasePresenter<ViewerMvp.View> 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);
|
||||
|
||||
@ -72,7 +72,7 @@ public class CreateIssuePresenter extends BasePresenter<CreateIssueMvp.View> 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));
|
||||
|
||||
@ -69,7 +69,7 @@ class RepoPullRequestPresenter extends BasePresenter<RepoPullRequestMvp.View> 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<RepoPullRequestMvp.View> 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));
|
||||
|
||||
@ -70,7 +70,7 @@ class PullRequestPagerPresenter extends BasePresenter<PullRequestPagerMvp.View>
|
||||
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<PullRequestPagerMvp.View>
|
||||
@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<PullRequestPagerMvp.View>
|
||||
@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<PullRequestPagerMvp.View>
|
||||
ArrayList<String> 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<PullRequestPagerMvp.View>
|
||||
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()) {
|
||||
|
||||
@ -62,7 +62,7 @@ class PullRequestCommitsPresenter extends BasePresenter<PullRequestCommitsMvp.Vi
|
||||
return;
|
||||
}
|
||||
if (repoId == null || login == null) return;
|
||||
makeRestCall(RestProvider.getPullRequestSerice().getPullRequestCommits(login, repoId, number, page),
|
||||
makeRestCall(RestProvider.getPullRequestService().getPullRequestCommits(login, repoId, number, page),
|
||||
response -> {
|
||||
lastPage = response.getLast();
|
||||
if (getCurrentPage() == 1) {
|
||||
|
||||
@ -69,7 +69,7 @@ class PullRequestFilesPresenter extends BasePresenter<PullRequestFilesMvp.View>
|
||||
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));
|
||||
|
||||
@ -89,8 +89,8 @@ public class PullRequestTimelinePresenter extends BasePresenter<PullRequestTimel
|
||||
int number = getHeader().getNumber();
|
||||
Observable<List<TimelineModel>> 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());
|
||||
|
||||
@ -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("(")
|
||||
|
||||
@ -84,6 +84,10 @@
|
||||
|
||||
<PreferenceCategory android:title="@string/about">
|
||||
|
||||
<Preference
|
||||
android:key="showChangelog"
|
||||
android:title="@string/changelog"/>
|
||||
|
||||
<Preference
|
||||
android:key="about"
|
||||
android:title="@string/about">
|
||||
|
||||
@ -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) {
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user