diff --git a/app/build.gradle b/app/build.gradle index f740dc6a..00280645 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,6 +1,6 @@ apply plugin: 'com.android.application' apply plugin: 'com.google.firebase.firebase-crash' -apply plugin: 'kotlin-android' +//apply plugin: 'kotlin-android' apply plugin: 'com.novoda.build-properties' apply plugin: 'jacoco-android' @@ -144,9 +144,9 @@ dependencies { implementation 'com.firebase:firebase-jobdispatcher:0.6.0' implementation "com.google.firebase:firebase-ads:${gms}" implementation "com.google.firebase:firebase-messaging:${gms}" - implementation "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version" releaseImplementation "com.google.firebase:firebase-crash:${gms}" implementation "com.google.android.gms:play-services-auth:${gms}" +// implementation "org.jetbrains.kotlin:kotlin-stdlib-jre7:${kotlin_version}" compileOnly "org.projectlombok:lombok:${lombokVersion}" annotationProcessor "io.requery:requery-processor:${requery}" annotationProcessor "org.projectlombok:lombok:${lombokVersion}" diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 5043cd88..b33cf9e0 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -165,6 +165,17 @@ android:name="android.support.PARENT_ACTIVITY" android:value=".ui.modules.repos.RepoPagerActivity"/> + + + + + + - + - - - - - \ No newline at end of file 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 5938e89c..c4af9cc9 100644 --- a/app/src/main/java/com/fastaccess/data/dao/FragmentPagerAdapterModel.java +++ b/app/src/main/java/com/fastaccess/data/dao/FragmentPagerAdapterModel.java @@ -155,15 +155,16 @@ import lombok.Setter; } public static List buildForNotifications(@NonNull Context context) { - return Stream.of(new FragmentPagerAdapterModel(context.getString(R.string.unread), new UnreadNotificationsFragment()), - new FragmentPagerAdapterModel(context.getString(R.string.all), new AllNotificationsFragment())).collect(Collectors.toList()); + new FragmentPagerAdapterModel(context.getString(R.string.all), AllNotificationsFragment.newInstance())) + .collect(Collectors.toList()); } public static List buildForGists(@NonNull Context context) { return Stream.of(new FragmentPagerAdapterModel(context.getString(R.string.my_gists), ProfileGistsFragment.newInstance(Login.getUser().getLogin())), - new FragmentPagerAdapterModel(context.getString(R.string.public_gists), GistsFragment.newInstance())).collect(Collectors.toList()); + new FragmentPagerAdapterModel(context.getString(R.string.public_gists), GistsFragment.newInstance())) + .collect(Collectors.toList()); } public static List buildForMyIssues(@NonNull Context context) { diff --git a/app/src/main/java/com/fastaccess/provider/scheme/SchemeParser.java b/app/src/main/java/com/fastaccess/provider/scheme/SchemeParser.java index 1a222745..88b413f1 100644 --- a/app/src/main/java/com/fastaccess/provider/scheme/SchemeParser.java +++ b/app/src/main/java/com/fastaccess/provider/scheme/SchemeParser.java @@ -17,6 +17,7 @@ import com.fastaccess.ui.modules.gists.gist.GistActivity; import com.fastaccess.ui.modules.repos.RepoPagerActivity; import com.fastaccess.ui.modules.repos.RepoPagerMvp; import com.fastaccess.ui.modules.repos.code.commit.details.CommitPagerActivity; +import com.fastaccess.ui.modules.repos.code.releases.ReleasesListActivity; import com.fastaccess.ui.modules.repos.issues.create.CreateIssueActivity; import com.fastaccess.ui.modules.repos.issues.issue.details.IssuePagerActivity; import com.fastaccess.ui.modules.repos.pull_requests.pull_request.details.PullRequestPagerActivity; @@ -108,12 +109,13 @@ public class SchemeParser { Intent createIssueIntent = getCreateIssueIntent(context, data); Intent pullRequestIntent = getPullRequestIntent(context, data, showRepoBtn); Intent issueIntent = getIssueIntent(context, data, showRepoBtn); + Intent releasesIntent = getReleases(context, data); Intent repoIntent = getRepo(context, data); Intent commit = getCommit(context, data, showRepoBtn); Intent commits = getCommits(context, data, showRepoBtn); Intent blob = getBlob(context, data); Optional intentOptional = returnNonNull(userIntent, repoIssues, repoPulls, pullRequestIntent, commit, commits, - createIssueIntent, issueIntent, repoIntent, blob); + createIssueIntent, issueIntent, releasesIntent, repoIntent, blob); Optional empty = Optional.empty(); if (intentOptional != null && intentOptional.isPresent() && intentOptional != empty) { return intentOptional.get(); @@ -300,6 +302,20 @@ public class SchemeParser { return null; } + @Nullable private static Intent getReleases(@NonNull Context context, @NonNull Uri uri) { + List segments = uri.getPathSegments(); + Logger.e(segments.size()); + if (segments != null && segments.size() > 2) { + if (uri.getPathSegments().get(2).equals("releases")) { + String owner = segments.get(0); + String repo = segments.get(1); + return ReleasesListActivity.getIntent(context, owner, repo); + } + return null; + } + return null; + } + /** * https://github.com/owner/repo/issues/new */ diff --git a/app/src/main/java/com/fastaccess/provider/scheme/StackBuilderSchemeParser.java b/app/src/main/java/com/fastaccess/provider/scheme/StackBuilderSchemeParser.java index 84cb25b8..2448eb6c 100644 --- a/app/src/main/java/com/fastaccess/provider/scheme/StackBuilderSchemeParser.java +++ b/app/src/main/java/com/fastaccess/provider/scheme/StackBuilderSchemeParser.java @@ -20,6 +20,7 @@ import com.fastaccess.ui.modules.repos.RepoPagerActivity; import com.fastaccess.ui.modules.repos.RepoPagerMvp; import com.fastaccess.ui.modules.repos.code.commit.details.CommitPagerActivity; import com.fastaccess.ui.modules.repos.code.files.activity.RepoFilesActivity; +import com.fastaccess.ui.modules.repos.code.releases.ReleasesListActivity; import com.fastaccess.ui.modules.repos.issues.create.CreateIssueActivity; import com.fastaccess.ui.modules.repos.issues.issue.details.IssuePagerActivity; import com.fastaccess.ui.modules.repos.pull_requests.pull_request.details.PullRequestPagerActivity; @@ -115,12 +116,13 @@ public class StackBuilderSchemeParser { TaskStackBuilder pullRequestIntent = getPullRequestIntent(context, data); TaskStackBuilder createIssueIntent = getCreateIssueIntent(context, data); TaskStackBuilder issueIntent = getIssueIntent(context, data); + TaskStackBuilder releasesIntent = getReleases(context, data); TaskStackBuilder repoIntent = getRepo(context, data); TaskStackBuilder commit = getCommit(context, data); TaskStackBuilder commits = getCommits(context, data); TaskStackBuilder blob = getBlob(context, data); Optional intentOptional = returnNonNull(userIntent, repoIssuesIntent, repoPullsIntent, pullRequestIntent, commit, - commits, createIssueIntent, issueIntent, repoIntent, blob); + commits, createIssueIntent, issueIntent, releasesIntent, repoIntent, blob); Optional empty = Optional.empty(); if (intentOptional != null && intentOptional.isPresent() && intentOptional != empty) { return intentOptional.get(); @@ -328,7 +330,6 @@ public class StackBuilderSchemeParser { @Nullable private static TaskStackBuilder getCreateIssueIntent(@NonNull Context context, @NonNull Uri uri) { List segments = uri.getPathSegments(); - Logger.e(segments); if (uri.getLastPathSegment() == null) return null; if (segments == null || segments.size() < 3 || !uri.getLastPathSegment().equalsIgnoreCase("new")) return null; if ("issues".equals(segments.get(2))) { @@ -355,6 +356,23 @@ public class StackBuilderSchemeParser { return null; } + @Nullable private static TaskStackBuilder getReleases(@NonNull Context context, @NonNull Uri uri) { + List segments = uri.getPathSegments(); + if (segments != null && segments.size() >= 2) { + if (uri.getPathSegments().get(2).equals("releases")) { + String owner = segments.get(0); + String repo = segments.get(1); + return TaskStackBuilder.create(context) + .addParentStack(MainActivity.class) + .addNextIntentWithParentStack(new Intent(context, MainActivity.class)) + .addNextIntentWithParentStack(RepoPagerActivity.createIntent(context, repo, owner, RepoPagerMvp.CODE)) + .addNextIntent(ReleasesListActivity.getIntent(context, owner, repo)); + } + return null; + } + return null; + } + @Nullable private static String getGistId(@NonNull Uri uri) { List segments = uri.getPathSegments(); return segments != null && !segments.isEmpty() ? uri.getLastPathSegment() : null; 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 a8637fed..0d3d82e4 100644 --- a/app/src/main/java/com/fastaccess/provider/timeline/HtmlHelper.java +++ b/app/src/main/java/com/fastaccess/provider/timeline/HtmlHelper.java @@ -2,6 +2,7 @@ package com.fastaccess.provider.timeline; import android.content.Context; import android.graphics.Point; +import android.graphics.drawable.Drawable; import android.net.Uri; import android.support.annotation.ColorInt; import android.support.annotation.NonNull; @@ -54,6 +55,8 @@ public class HtmlHelper { boolean isDark = AppHelper.isNightMode(textView.getResources()); @ColorInt int windowBackground = isDark ? ViewHelper.getWindowBackground(textView.getContext()) : ContextCompat.getColor(textView.getContext(), R.color.light_patch_ref_color); + Drawable checked = ContextCompat.getDrawable(textView.getContext(), R.drawable.ic_checkbox_small); + Drawable unchecked = ContextCompat.getDrawable(textView.getContext(), R.drawable.ic_checkbox_empty_small); HtmlSpanner mySpanner = new HtmlSpanner(); mySpanner.setStripExtraWhiteSpace(true); mySpanner.registerHandler("pre", new PreTagHandler(windowBackground, true, isDark)); @@ -67,7 +70,7 @@ public class HtmlHelper { mySpanner.registerHandler("em", new ItalicHandler()); mySpanner.registerHandler("ul", new MarginHandler()); mySpanner.registerHandler("ol", new MarginHandler()); - mySpanner.registerHandler("li", new ListsHandler()); + mySpanner.registerHandler("li", new ListsHandler(checked, unchecked)); mySpanner.registerHandler("u", new UnderlineHandler()); mySpanner.registerHandler("strike", new StrikethroughHandler()); mySpanner.registerHandler("ins", new UnderlineHandler()); 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 index 2ea4c7c0..400bb890 100644 --- a/app/src/main/java/com/fastaccess/provider/timeline/handler/ListsHandler.java +++ b/app/src/main/java/com/fastaccess/provider/timeline/handler/ListsHandler.java @@ -1,14 +1,23 @@ package com.fastaccess.provider.timeline.handler; +import android.graphics.drawable.Drawable; +import android.support.annotation.Nullable; import android.text.SpannableStringBuilder; import com.fastaccess.helper.Logger; +import com.fastaccess.ui.widgets.SpannableBuilder; import net.nightwhistler.htmlspanner.TagNodeHandler; import org.htmlcleaner.TagNode; -public class ListsHandler extends TagNodeHandler { +import lombok.AllArgsConstructor; +import lombok.NoArgsConstructor; + +@NoArgsConstructor @AllArgsConstructor public class ListsHandler extends TagNodeHandler { + + @Nullable private Drawable checked; + @Nullable private Drawable unchecked; private int getMyIndex(TagNode node) { if (node.getParent() == null) { @@ -35,31 +44,35 @@ public class ListsHandler extends TagNodeHandler { } @Override public void beforeChildren(TagNode node, SpannableStringBuilder builder) { - TodoItems todoItems = null; + TodoItems todoItem = 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; + for (TagNode tagNode : node.getChildTags()) { + Logger.e(tagNode.getName(), tagNode.getAttributes(), tagNode.getText()); + if (tagNode.getName() != null && tagNode.getName().equals("input")) { + todoItem = new TodoItems(); + todoItem.isChecked = tagNode.getAttributeByName("checked") != null; + break; + } } - 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 ? "☑ " : "☐ "); + if (todoItem != null) { + if (checked == null || unchecked == null) { + builder.append(todoItem.isChecked ? "☑" : "☐"); + } else { + builder.append(SpannableBuilder.builder() + .append(todoItem.isChecked ? checked : unchecked)) + .append(" "); + } } 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"); - } - } + public void handleTagNode(TagNode node, SpannableStringBuilder builder, int start, int end) {} static class TodoItems { boolean isChecked; diff --git a/app/src/main/java/com/fastaccess/ui/adapter/viewholder/FeedsViewHolder.java b/app/src/main/java/com/fastaccess/ui/adapter/viewholder/FeedsViewHolder.java index 9cec70ba..c4a9a0d3 100644 --- a/app/src/main/java/com/fastaccess/ui/adapter/viewholder/FeedsViewHolder.java +++ b/app/src/main/java/com/fastaccess/ui/adapter/viewholder/FeedsViewHolder.java @@ -3,7 +3,6 @@ package com.fastaccess.ui.adapter.viewholder; import android.net.Uri; import android.support.annotation.NonNull; import android.support.annotation.Nullable; -import android.text.Html; import android.view.Gravity; import android.view.View; import android.view.ViewGroup; @@ -77,7 +76,7 @@ public class FeedsViewHolder extends BaseViewHolder { spannableBuilder.bold(action != null ? action.toLowerCase() : "") .append(eventsModel.getPayload() != null && eventsModel.getPayload().getAction() != null ? " " : ""); if (type != EventsType.WatchEvent) { - if (type == EventsType.CreateEvent && !InputHelper.isEmpty(eventsModel.getPayload().getRefType())) { + if (type == EventsType.CreateEvent && !InputHelper.isEmpty(eventsModel.getPayload().getRef())) { spannableBuilder .bold(itemView.getResources().getString(type.getType()).toLowerCase()) .append(" ") diff --git a/app/src/main/java/com/fastaccess/ui/adapter/viewholder/TimelineCommentsViewHolder.java b/app/src/main/java/com/fastaccess/ui/adapter/viewholder/TimelineCommentsViewHolder.java index 7887f3e5..87471f7f 100644 --- a/app/src/main/java/com/fastaccess/ui/adapter/viewholder/TimelineCommentsViewHolder.java +++ b/app/src/main/java/com/fastaccess/ui/adapter/viewholder/TimelineCommentsViewHolder.java @@ -8,7 +8,6 @@ import android.view.View; import android.view.ViewGroup; import android.widget.TextView; -import com.fastaccess.App; import com.fastaccess.R; import com.fastaccess.data.dao.TimelineModel; import com.fastaccess.data.dao.model.Comment; @@ -113,7 +112,8 @@ public class TimelineCommentsViewHolder extends BaseViewHolder { } name.setText(commentsModel.getUser() != null ? commentsModel.getUser().getLogin() : "Anonymous"); if (commentsModel.getCreatedAt().before(commentsModel.getUpdatedAt())) { - date.setText(ParseDateFormat.getTimeAgo(commentsModel.getCreatedAt()) + " " + App.getInstance().getResources().getString(R.string.edited)); + date.setText(String.format("%s %s", ParseDateFormat.getTimeAgo(commentsModel.getCreatedAt()), itemView + .getResources().getString(R.string.edited))); } else { date.setText(ParseDateFormat.getTimeAgo(commentsModel.getCreatedAt())); } @@ -135,6 +135,7 @@ public class TimelineCommentsViewHolder extends BaseViewHolder { if (comment != null) { boolean isReacted = reactionsCallback == null || reactionsCallback.isPreviouslyReacted(comment.getId(), v.getId()); boolean isCallingApi = reactionsCallback != null && reactionsCallback.isCallingApi(comment.getId(), v.getId()); +// if (isCallingApi) return; ReactionsModel reactionsModel = comment.getReactions() != null ? comment.getReactions() : new ReactionsModel(); switch (v.getId()) { case R.id.heart: diff --git a/app/src/main/java/com/fastaccess/ui/base/BaseActivity.java b/app/src/main/java/com/fastaccess/ui/base/BaseActivity.java index c06672a2..46d92444 100644 --- a/app/src/main/java/com/fastaccess/ui/base/BaseActivity.java +++ b/app/src/main/java/com/fastaccess/ui/base/BaseActivity.java @@ -284,14 +284,17 @@ public abstract class BaseActivity i @Override public void showProgress(@StringRes int resId) { -refresh.setRefreshing(true); + refresh.setRefreshing(true); stateLayout.showProgress(); } @@ -97,11 +97,6 @@ refresh.setRefreshing(true); super.showMessage(titleRes, msgRes); } - private void showReload() { - hideProgress(); - stateLayout.showReload(adapter.getItemCount()); - } - @NonNull @Override public GistsPresenter providePresenter() { return new GistsPresenter(); } @@ -121,4 +116,14 @@ refresh.setRefreshing(true); @Override public void onClick(View view) { onRefresh(); } + + @Override public void onScrollTop(int index) { + super.onScrollTop(index); + if (recycler != null) recycler.scrollToPosition(0); + } + + private void showReload() { + hideProgress(); + stateLayout.showReload(adapter.getItemCount()); + } } diff --git a/app/src/main/java/com/fastaccess/ui/modules/gists/GistsListActivity.java b/app/src/main/java/com/fastaccess/ui/modules/gists/GistsListActivity.java index a934c101..240d2843 100644 --- a/app/src/main/java/com/fastaccess/ui/modules/gists/GistsListActivity.java +++ b/app/src/main/java/com/fastaccess/ui/modules/gists/GistsListActivity.java @@ -6,18 +6,18 @@ import android.os.Bundle; import android.support.annotation.NonNull; import android.support.design.widget.FloatingActionButton; import android.support.design.widget.TabLayout; +import android.support.v4.app.Fragment; import com.fastaccess.R; import com.fastaccess.data.dao.FragmentPagerAdapterModel; -import com.fastaccess.data.dao.model.Login; import com.fastaccess.helper.ActivityHelper; import com.fastaccess.helper.BundleConstant; import com.fastaccess.helper.Bundler; import com.fastaccess.ui.adapter.FragmentsPagerAdapter; import com.fastaccess.ui.base.BaseActivity; +import com.fastaccess.ui.base.BaseFragment; import com.fastaccess.ui.base.mvp.presenter.BasePresenter; import com.fastaccess.ui.modules.gists.create.CreateGistActivity; -import com.fastaccess.ui.modules.profile.gists.ProfileGistsFragment; import com.fastaccess.ui.widgets.ViewPagerView; import net.grandcentrix.thirtyinch.TiPresenter; @@ -72,6 +72,20 @@ public class GistsListActivity extends BaseActivity { setTitle(R.string.gists); setupTabs(); fab.show(); + tabs.addOnTabSelectedListener(new TabLayout.ViewPagerOnTabSelectedListener(pager) { + @Override public void onTabReselected(TabLayout.Tab tab) { + super.onTabReselected(tab); + onScrollTop(tab.getPosition()); + } + }); + } + + @Override public void onScrollTop(int index) { + if (pager == null || pager.getAdapter() == null) return; + Fragment fragment = (BaseFragment) pager.getAdapter().instantiateItem(pager, index); + if (fragment instanceof BaseFragment) { + ((BaseFragment) fragment).onScrollTop(index); + } } private void setupTabs() { diff --git a/app/src/main/java/com/fastaccess/ui/modules/gists/gist/GistActivity.java b/app/src/main/java/com/fastaccess/ui/modules/gists/gist/GistActivity.java index 19ceeabc..c85ee38e 100644 --- a/app/src/main/java/com/fastaccess/ui/modules/gists/gist/GistActivity.java +++ b/app/src/main/java/com/fastaccess/ui/modules/gists/gist/GistActivity.java @@ -7,6 +7,7 @@ import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.design.widget.FloatingActionButton; import android.support.design.widget.TabLayout; +import android.support.v4.app.Fragment; import android.support.v4.view.ViewPager; import android.text.format.Formatter; import android.view.Menu; @@ -25,6 +26,7 @@ import com.fastaccess.helper.ViewHelper; import com.fastaccess.provider.tasks.git.GithubActionService; import com.fastaccess.ui.adapter.FragmentsPagerAdapter; import com.fastaccess.ui.base.BaseActivity; +import com.fastaccess.ui.base.BaseFragment; import com.fastaccess.ui.modules.gists.gist.comments.GistCommentsFragment; import com.fastaccess.ui.widgets.AvatarLayout; import com.fastaccess.ui.widgets.FontTextView; @@ -207,7 +209,7 @@ public class GistActivity extends BaseActivity title.setText(gistsModel.getDisplayTitle(false, true)); detailsIcon.setVisibility(InputHelper.isEmpty(gistsModel.getDescription()) || !ViewHelper.isEllipsed(title) ? View.GONE : View.VISIBLE); if (gistsModel.getCreatedAt().before(gistsModel.getUpdatedAt())) { - date.setText(ParseDateFormat.getTimeAgo(gistsModel.getCreatedAt()) + " " + getString(R.string.edited)); + date.setText(String.format("%s %s", ParseDateFormat.getTimeAgo(gistsModel.getCreatedAt()), getString(R.string.edited))); } else { date.setText(ParseDateFormat.getTimeAgo(gistsModel.getCreatedAt())); } @@ -224,6 +226,20 @@ public class GistActivity extends BaseActivity onGistForked(getPresenter().isForked()); onGistStarred(getPresenter().isStarred()); hideShowFab(); + tabs.addOnTabSelectedListener(new TabLayout.ViewPagerOnTabSelectedListener(pager) { + @Override public void onTabReselected(TabLayout.Tab tab) { + super.onTabReselected(tab); + onScrollTop(tab.getPosition()); + } + }); + } + + @Override public void onScrollTop(int index) { + if (pager == null || pager.getAdapter() == null) return; + Fragment fragment = (BaseFragment) pager.getAdapter().instantiateItem(pager, index); + if (fragment instanceof BaseFragment) { + ((BaseFragment) fragment).onScrollTop(index); + } } private void hideShowFab() { diff --git a/app/src/main/java/com/fastaccess/ui/modules/gists/gist/comments/GistCommentsFragment.java b/app/src/main/java/com/fastaccess/ui/modules/gists/gist/comments/GistCommentsFragment.java index ef3138a1..1e854dc6 100644 --- a/app/src/main/java/com/fastaccess/ui/modules/gists/gist/comments/GistCommentsFragment.java +++ b/app/src/main/java/com/fastaccess/ui/modules/gists/gist/comments/GistCommentsFragment.java @@ -245,6 +245,11 @@ public class GistCommentsFragment extends BaseFragment impl } @Override public void onNavigationChanged(@MainMvp.NavigationType int navType) { + if (navType == MainMvp.PROFILE) { + getPresenter().onModuleChanged(getSupportFragmentManager(), navType); + bottomNavigation.setSelectedIndex(this.navType, true); + return; + } this.navType = navType; //noinspection WrongConstant if (bottomNavigation.getSelectedIndex() != navType) bottomNavigation.setSelectedIndex(navType, true); diff --git a/app/src/main/java/com/fastaccess/ui/modules/main/issues/MyIssuesFragment.java b/app/src/main/java/com/fastaccess/ui/modules/main/issues/MyIssuesFragment.java index f1625bb9..70d191be 100644 --- a/app/src/main/java/com/fastaccess/ui/modules/main/issues/MyIssuesFragment.java +++ b/app/src/main/java/com/fastaccess/ui/modules/main/issues/MyIssuesFragment.java @@ -92,7 +92,7 @@ public class MyIssuesFragment extends BaseFragment models) { Logger.e(models); ListDialogView dialogView = new ListDialogView<>(); @@ -163,32 +157,44 @@ refresh.setRefreshing(true); } @Override public void onHidePromptComplete() { - if(!dismissed[0]) - new MaterialTapTargetPrompt.Builder(getActivity()) - .setTarget(itemView) - .setPrimaryText(R.string.fork) - .setSecondaryText(R.string.feeds_fork_hint) - .setCaptureTouchEventOutsidePrompt(true) - .setBackgroundColourAlpha(244) - .setBackgroundColour(ViewHelper.getAccentColor(getContext())) - .setOnHidePromptListener(new MaterialTapTargetPrompt.OnHidePromptListener() { - @Override - public void onHidePrompt(MotionEvent motionEvent, boolean b) { - ActivityHelper.hideDismissHints(OrgFeedsFragment.this.getContext()); - } + if (!dismissed[0]) + new MaterialTapTargetPrompt.Builder(getActivity()) + .setTarget(itemView) + .setPrimaryText(R.string.fork) + .setSecondaryText(R.string.feeds_fork_hint) + .setCaptureTouchEventOutsidePrompt(true) + .setBackgroundColourAlpha(244) + .setBackgroundColour(ViewHelper.getAccentColor(getContext())) + .setOnHidePromptListener(new MaterialTapTargetPrompt.OnHidePromptListener() { + @Override + public void onHidePrompt(MotionEvent motionEvent, boolean b) { + ActivityHelper.hideDismissHints(OrgFeedsFragment.this.getContext()); + } - @Override - public void onHidePromptComplete() { + @Override + public void onHidePromptComplete() { - } - }) - .show(); + } + }) + .show(); ActivityHelper.bringDismissAllToFront(getContext()); } }) .setCaptureTouchEventOutsidePrompt(true) .show(); - ActivityHelper.showDismissHints(getContext(), () -> { dismissed[0] = true; }); + ActivityHelper.showDismissHints(getContext(), () -> { + dismissed[0] = true; + }); } } + + @Override public void onScrollTop(int index) { + super.onScrollTop(index); + if (recycler != null) recycler.scrollToPosition(0); + } + + private void showReload() { + hideProgress(); + stateLayout.showReload(adapter.getItemCount()); + } } diff --git a/app/src/main/java/com/fastaccess/ui/modules/profile/org/members/OrgMembersFragment.java b/app/src/main/java/com/fastaccess/ui/modules/profile/org/members/OrgMembersFragment.java index 2ce36ad7..1b4a40a9 100644 --- a/app/src/main/java/com/fastaccess/ui/modules/profile/org/members/OrgMembersFragment.java +++ b/app/src/main/java/com/fastaccess/ui/modules/profile/org/members/OrgMembersFragment.java @@ -115,6 +115,11 @@ refresh.setRefreshing(true); onRefresh(); } + @Override public void onScrollTop(int index) { + super.onScrollTop(index); + if (recycler != null) recycler.scrollToPosition(0); + } + private void showReload() { hideProgress(); stateLayout.showReload(adapter.getItemCount()); diff --git a/app/src/main/java/com/fastaccess/ui/modules/profile/org/repos/OrgReposFragment.java b/app/src/main/java/com/fastaccess/ui/modules/profile/org/repos/OrgReposFragment.java index 5d665c46..e06811a3 100644 --- a/app/src/main/java/com/fastaccess/ui/modules/profile/org/repos/OrgReposFragment.java +++ b/app/src/main/java/com/fastaccess/ui/modules/profile/org/repos/OrgReposFragment.java @@ -118,6 +118,11 @@ refresh.setRefreshing(true); onRefresh(); } + @Override public void onScrollTop(int index) { + super.onScrollTop(index); + if (recycler != null) recycler.scrollToPosition(0); + } + private void showReload() { hideProgress(); stateLayout.showReload(adapter.getItemCount()); diff --git a/app/src/main/java/com/fastaccess/ui/modules/profile/org/teams/OrgTeamFragment.java b/app/src/main/java/com/fastaccess/ui/modules/profile/org/teams/OrgTeamFragment.java index d0f98e05..a78875e5 100644 --- a/app/src/main/java/com/fastaccess/ui/modules/profile/org/teams/OrgTeamFragment.java +++ b/app/src/main/java/com/fastaccess/ui/modules/profile/org/teams/OrgTeamFragment.java @@ -81,7 +81,7 @@ public class OrgTeamFragment extends BaseFragment getLoadMore() { if (onLoadMore == null) { onLoadMore = new OnLoadMore<>(getPresenter(), getArguments().getString(BundleConstant.EXTRA)); @@ -119,4 +114,14 @@ refresh.setRefreshing(true); @Override public void onClick(View view) { onRefresh(); } + + @Override public void onScrollTop(int index) { + super.onScrollTop(index); + if (recycler != null) recycler.scrollToPosition(0); + } + + private void showReload() { + hideProgress(); + stateLayout.showReload(adapter.getItemCount()); + } } diff --git a/app/src/main/java/com/fastaccess/ui/modules/profile/org/teams/details/TeamPagerActivity.java b/app/src/main/java/com/fastaccess/ui/modules/profile/org/teams/details/TeamPagerActivity.java index 765add10..29dd6495 100644 --- a/app/src/main/java/com/fastaccess/ui/modules/profile/org/teams/details/TeamPagerActivity.java +++ b/app/src/main/java/com/fastaccess/ui/modules/profile/org/teams/details/TeamPagerActivity.java @@ -6,6 +6,7 @@ import android.os.Bundle; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.design.widget.TabLayout; +import android.support.v4.app.Fragment; import com.fastaccess.R; import com.fastaccess.data.dao.FragmentPagerAdapterModel; @@ -13,6 +14,7 @@ import com.fastaccess.helper.BundleConstant; import com.fastaccess.helper.Bundler; import com.fastaccess.ui.adapter.FragmentsPagerAdapter; import com.fastaccess.ui.base.BaseActivity; +import com.fastaccess.ui.base.BaseFragment; import com.fastaccess.ui.base.mvp.presenter.BasePresenter; import com.fastaccess.ui.widgets.ViewPagerView; @@ -81,5 +83,19 @@ public class TeamPagerActivity extends BaseActivity { tabs.setTabMode(TabLayout.MODE_FIXED); tabs.setupWithViewPager(pager); tabs.setPaddingRelative(0, 0, 0, 0); + tabs.addOnTabSelectedListener(new TabLayout.ViewPagerOnTabSelectedListener(pager) { + @Override public void onTabReselected(TabLayout.Tab tab) { + super.onTabReselected(tab); + onScrollTop(tab.getPosition()); + } + }); + } + + @Override public void onScrollTop(int index) { + if (pager == null || pager.getAdapter() == null) return; + Fragment fragment = (BaseFragment) pager.getAdapter().instantiateItem(pager, index); + if (fragment instanceof BaseFragment) { + ((BaseFragment) fragment).onScrollTop(index); + } } } diff --git a/app/src/main/java/com/fastaccess/ui/modules/profile/org/teams/details/members/TeamMembersFragment.java b/app/src/main/java/com/fastaccess/ui/modules/profile/org/teams/details/members/TeamMembersFragment.java index 5fd77db3..eda9cd41 100644 --- a/app/src/main/java/com/fastaccess/ui/modules/profile/org/teams/details/members/TeamMembersFragment.java +++ b/app/src/main/java/com/fastaccess/ui/modules/profile/org/teams/details/members/TeamMembersFragment.java @@ -81,7 +81,7 @@ public class TeamMembersFragment extends BaseFragment getLoadMore() { if (onLoadMore == null) { onLoadMore = new OnLoadMore<>(getPresenter(), getArguments().getLong(BundleConstant.EXTRA)); @@ -120,4 +115,14 @@ refresh.setRefreshing(true); @Override public void onClick(View view) { onRefresh(); } + + @Override public void onScrollTop(int index) { + super.onScrollTop(index); + if (recycler != null) recycler.scrollToPosition(0); + } + + private void showReload() { + hideProgress(); + stateLayout.showReload(adapter.getItemCount()); + } } diff --git a/app/src/main/java/com/fastaccess/ui/modules/profile/overview/ProfileOverviewFragment.java b/app/src/main/java/com/fastaccess/ui/modules/profile/overview/ProfileOverviewFragment.java index 52e48b1a..e82382d4 100644 --- a/app/src/main/java/com/fastaccess/ui/modules/profile/overview/ProfileOverviewFragment.java +++ b/app/src/main/java/com/fastaccess/ui/modules/profile/overview/ProfileOverviewFragment.java @@ -217,6 +217,10 @@ public class ProfileOverviewFragment extends BaseFragment items); void onInitOrgs(@Nullable List orgs); + + void onUserNotFound(); } interface Presenter extends BaseMvp.FAPresenter { diff --git a/app/src/main/java/com/fastaccess/ui/modules/profile/overview/ProfileOverviewPresenter.java b/app/src/main/java/com/fastaccess/ui/modules/profile/overview/ProfileOverviewPresenter.java index a52a78b5..32302908 100644 --- a/app/src/main/java/com/fastaccess/ui/modules/profile/overview/ProfileOverviewPresenter.java +++ b/app/src/main/java/com/fastaccess/ui/modules/profile/overview/ProfileOverviewPresenter.java @@ -61,6 +61,11 @@ class ProfileOverviewPresenter extends BasePresenter im } @Override public void onError(@NonNull Throwable throwable) { + int statusCode = RestProvider.getErrorCode(throwable); + if (statusCode == 404) { + sendToView(ProfileOverviewMvp.View::onUserNotFound); + return; + } if (!InputHelper.isEmpty(login)) { onWorkOffline(login); } diff --git a/app/src/main/java/com/fastaccess/ui/modules/profile/repos/ProfileReposFragment.java b/app/src/main/java/com/fastaccess/ui/modules/profile/repos/ProfileReposFragment.java index e78f978f..77819190 100644 --- a/app/src/main/java/com/fastaccess/ui/modules/profile/repos/ProfileReposFragment.java +++ b/app/src/main/java/com/fastaccess/ui/modules/profile/repos/ProfileReposFragment.java @@ -82,7 +82,7 @@ public class ProfileReposFragment extends BaseFragment getLoadMore() { if (onLoadMore == null) { onLoadMore = new OnLoadMore<>(getPresenter(), getArguments().getString(BundleConstant.EXTRA)); @@ -121,4 +116,14 @@ refresh.setRefreshing(true); @Override public void onClick(View view) { onRefresh(); } + + @Override public void onScrollTop(int index) { + super.onScrollTop(index); + if (recycler != null) recycler.scrollToPosition(0); + } + + private void showReload() { + hideProgress(); + stateLayout.showReload(adapter.getItemCount()); + } } diff --git a/app/src/main/java/com/fastaccess/ui/modules/profile/starred/ProfileStarredFragment.java b/app/src/main/java/com/fastaccess/ui/modules/profile/starred/ProfileStarredFragment.java index 5af5e0ee..7a82c0e9 100644 --- a/app/src/main/java/com/fastaccess/ui/modules/profile/starred/ProfileStarredFragment.java +++ b/app/src/main/java/com/fastaccess/ui/modules/profile/starred/ProfileStarredFragment.java @@ -82,7 +82,7 @@ public class ProfileStarredFragment extends BaseFragment getLoadMore() { if (onLoadMore == null) { onLoadMore = new OnLoadMore<>(getPresenter(), getArguments().getString(BundleConstant.EXTRA)); @@ -121,4 +116,14 @@ refresh.setRefreshing(true); @Override public void onClick(View view) { onRefresh(); } + + @Override public void onScrollTop(int index) { + super.onScrollTop(index); + if (recycler != null) recycler.scrollToPosition(0); + } + + private void showReload() { + hideProgress(); + stateLayout.showReload(adapter.getItemCount()); + } } diff --git a/app/src/main/java/com/fastaccess/ui/modules/repos/RepoPagerActivity.java b/app/src/main/java/com/fastaccess/ui/modules/repos/RepoPagerActivity.java index 768629a3..7632c923 100644 --- a/app/src/main/java/com/fastaccess/ui/modules/repos/RepoPagerActivity.java +++ b/app/src/main/java/com/fastaccess/ui/modules/repos/RepoPagerActivity.java @@ -300,11 +300,15 @@ public class RepoPagerActivity extends BaseActivity 0) { tabTwo.setText(getString(R.string.comments) + " (" + commit.getGitCommit().getCommentCount() + ")"); } + tabs.addOnTabSelectedListener(new TabLayout.ViewPagerOnTabSelectedListener(pager) { + @Override public void onTabReselected(TabLayout.Tab tab) { + super.onTabReselected(tab); + onScrollTop(tab.getPosition()); + } + }); + } + + @Override public void onScrollTop(int index) { + if (pager == null || pager.getAdapter() == null) return; + Fragment fragment = (BaseFragment) pager.getAdapter().instantiateItem(pager, index); + if (fragment instanceof BaseFragment) { + ((BaseFragment) fragment).onScrollTop(index); + } } @Override public void onFinishActivity() { diff --git a/app/src/main/java/com/fastaccess/ui/modules/repos/code/commit/details/comments/CommitCommentsFragments.java b/app/src/main/java/com/fastaccess/ui/modules/repos/code/commit/details/comments/CommitCommentsFragments.java index 55a4f4ef..77b4bc95 100644 --- a/app/src/main/java/com/fastaccess/ui/modules/repos/code/commit/details/comments/CommitCommentsFragments.java +++ b/app/src/main/java/com/fastaccess/ui/modules/repos/code/commit/details/comments/CommitCommentsFragments.java @@ -273,6 +273,11 @@ public class CommitCommentsFragments extends BaseFragment return getReactionsProvider().isCallingApi(id, vId); } - private ReactionsProvider getReactionsProvider() { + @NonNull private ReactionsProvider getReactionsProvider() { if (reactionsProvider == null) { reactionsProvider = new ReactionsProvider(); } diff --git a/app/src/main/java/com/fastaccess/ui/modules/repos/pull_requests/RepoPullRequestPagerFragment.java b/app/src/main/java/com/fastaccess/ui/modules/repos/pull_requests/RepoPullRequestPagerFragment.java index 2dffbada..3b4964a0 100644 --- a/app/src/main/java/com/fastaccess/ui/modules/repos/pull_requests/RepoPullRequestPagerFragment.java +++ b/app/src/main/java/com/fastaccess/ui/modules/repos/pull_requests/RepoPullRequestPagerFragment.java @@ -4,6 +4,7 @@ import android.os.Bundle; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.design.widget.TabLayout; +import android.support.v4.app.Fragment; import android.view.View; import android.widget.TextView; @@ -38,7 +39,6 @@ public class RepoPullRequestPagerFragment extends BaseFragment counts = new HashSet<>(); - public static RepoPullRequestPagerFragment newInstance(@NonNull String repoId, @NonNull String login) { RepoPullRequestPagerFragment view = new RepoPullRequestPagerFragment(); view.setArguments(Bundler.start() @@ -62,6 +62,20 @@ public class RepoPullRequestPagerFragment extends BaseFragment getAdapter() { if (adapter == null) adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, getPresenter().getHints()); return adapter; } + + private void setupTab() { + for (TabsCountStateModel model : tabsCountSet) { + int index = model.getTabIndex(); + int count = model.getCount(); + TextView textView = ViewHelper.getTabTextView(tabs, index); + if (index == 0) { + textView.setText(String.format("%s(%s)", getString(R.string.repos), numberFormat.format(count))); + } else if (index == 1) { + textView.setText(String.format("%s(%s)", getString(R.string.users), numberFormat.format(count))); + } else if (index == 2) { + textView.setText(String.format("%s(%s)", getString(R.string.issues), numberFormat.format(count))); + } else if (index == 3) { + textView.setText(String.format("%s(%s)", getString(R.string.code), numberFormat.format(count))); + } + } + } } diff --git a/app/src/main/java/com/fastaccess/ui/modules/search/code/SearchCodeFragment.java b/app/src/main/java/com/fastaccess/ui/modules/search/code/SearchCodeFragment.java index e86ba414..de765ef1 100644 --- a/app/src/main/java/com/fastaccess/ui/modules/search/code/SearchCodeFragment.java +++ b/app/src/main/java/com/fastaccess/ui/modules/search/code/SearchCodeFragment.java @@ -134,17 +134,15 @@ public class SearchCodeFragment extends BaseFragment + + diff --git a/app/src/main/res/drawable/ic_checkbox_small.xml b/app/src/main/res/drawable/ic_checkbox_small.xml new file mode 100644 index 00000000..9a7bf25c --- /dev/null +++ b/app/src/main/res/drawable/ic_checkbox_small.xml @@ -0,0 +1,9 @@ + + + diff --git a/build.gradle b/build.gradle index ca8f8dc7..280dc4ec 100644 --- a/build.gradle +++ b/build.gradle @@ -1,11 +1,7 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { - ext.kotlin_version = '1.1.2-4' ext { - // See http://stackoverflow.com/questions/27372828/access-project-extra-properties-in-buildscript-closure - taskRequests = getGradle().getStartParameter().getTaskRequests().toString() - butterKnifeVersion = '8.5.1' icepickVersion = '3.2.0' lombokVersion = '1.12.6' @@ -18,6 +14,7 @@ buildscript { assertjVersion = '2.5.0' espresseVersion = '2.2.2' requery = '1.3.2' +// kotlin_version = '1.1.2-4' } repositories { @@ -32,7 +29,7 @@ buildscript { } classpath 'com.novoda:gradle-build-properties-plugin:0.3' classpath 'com.dicedmelon.gradle:jacoco-android:0.1.1' - classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" +// classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" } }