this commit fixes #531 , fixes #516, fixes #502 , fixes #495.

this commit also adds opening releases from deeplinking, and uses nice checkboxes for checklist
This commit is contained in:
Kosh 2017-05-25 20:23:11 +08:00
parent 3c70ebc698
commit 4e4cd32329
71 changed files with 672 additions and 186 deletions

View File

@ -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}"

View File

@ -165,6 +165,17 @@
android:name="android.support.PARENT_ACTIVITY"
android:value=".ui.modules.repos.RepoPagerActivity"/>
</activity>
<activity android:name=".ui.modules.settings.SettingsActivity"/>
<activity android:name=".ui.modules.settings.category.SettingsCategoryActivity"/>
<activity
android:name=".ui.modules.repos.code.releases.ReleasesListActivity"
android:parentActivityName=".ui.modules.repos.RepoPagerActivity"
android:label="@string/releases">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value=".ui.modules.repos.RepoPagerActivity"/>
</activity>
<activity
android:name=".ui.modules.parser.LinksParserActivity"
android:configChanges="keyboard|orientation|screenSize"
@ -213,16 +224,13 @@
<service android:name=".provider.tasks.git.GithubActionService"/>
<service android:name=".provider.tasks.git.ReactionService"/>
<service android:name=".provider.tasks.slack.SlackInvitationService"/>
<service android:name=".provider.fcm.PushNotificationService">
<service
android:name=".provider.fcm.PushNotificationService"
android:exported="false">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT"/>
</intent-filter>
</service>
<activity android:name=".ui.modules.settings.SettingsActivity">
</activity>
<activity android:name=".ui.modules.settings.category.SettingsCategoryActivity">
</activity>
</application>
</manifest>

View File

@ -155,15 +155,16 @@ import lombok.Setter;
}
public static List<FragmentPagerAdapterModel> 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<FragmentPagerAdapterModel> 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<FragmentPagerAdapterModel> buildForMyIssues(@NonNull Context context) {

View File

@ -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<Intent> intentOptional = returnNonNull(userIntent, repoIssues, repoPulls, pullRequestIntent, commit, commits,
createIssueIntent, issueIntent, repoIntent, blob);
createIssueIntent, issueIntent, releasesIntent, repoIntent, blob);
Optional<Intent> 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<String> 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
*/

View File

@ -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<TaskStackBuilder> intentOptional = returnNonNull(userIntent, repoIssuesIntent, repoPullsIntent, pullRequestIntent, commit,
commits, createIssueIntent, issueIntent, repoIntent, blob);
commits, createIssueIntent, issueIntent, releasesIntent, repoIntent, blob);
Optional<TaskStackBuilder> 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<String> 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<String> 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<String> segments = uri.getPathSegments();
return segments != null && !segments.isEmpty() ? uri.getLastPathSegment() : null;

View File

@ -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());

View File

@ -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;

View File

@ -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<Event> {
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(" ")

View File

@ -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<TimelineModel> {
}
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<TimelineModel> {
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:

View File

@ -284,14 +284,17 @@ public abstract class BaseActivity<V extends BaseMvp.FAView, P extends BasePrese
startActivityForResult(new Intent(this, SettingsActivity.class), REFRESH_CODE);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == REFRESH_CODE)
if (resultCode == RESULT_OK)
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == REFRESH_CODE) {
if (resultCode == RESULT_OK) {
recreate();
}
}
super.onActivityResult(requestCode, resultCode, data);
}
@Override public void onScrollTop(int index) {}
protected void selectHome(boolean hideRepo) {
if (extraNav != null) {
if (hideRepo) {

View File

@ -153,4 +153,6 @@ public abstract class BaseDialogFragment<V extends BaseMvp.FAView, P extends Bas
super.onDestroyView();
if (unbinder != null) unbinder.unbind();
}
@Override public void onScrollTop(int index) {}
}

View File

@ -134,6 +134,8 @@ public abstract class BaseFragment<V extends BaseMvp.FAView, P extends BasePrese
callback.onOpenSettings();
}
@Override public void onScrollTop(int index) {}
protected boolean isSafe() {
return getView() != null && getActivity() != null && !getActivity().isFinishing();
}

View File

@ -20,7 +20,7 @@ import rx.functions.Action1;
public interface BaseMvp {
interface FAView extends TiView, MessageDialogView.MessageDialogViewActionCallback {
interface FAView extends TiView, MessageDialogView.MessageDialogViewActionCallback, OnScrollTopListener {
@CallOnMainThread void showProgress(@StringRes int resId);
@ -71,4 +71,8 @@ public interface BaseMvp {
void onCallApi(int page, @Nullable P parameter);
}
interface OnScrollTopListener {
void onScrollTop(int index);
}
}

View File

@ -77,7 +77,7 @@ public class GistsFragment extends BaseFragment<GistsMvp.View, GistsPresenter> 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());
}
}

View File

@ -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() {

View File

@ -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<GistMvp.View, GistPresenter>
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<GistMvp.View, GistPresenter>
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() {

View File

@ -245,6 +245,11 @@ public class GistCommentsFragment extends BaseFragment<GistCommentsMvp.View, Gis
}
}
@Override public void onScrollTop(int index) {
super.onScrollTop(index);
if (recycler != null) recycler.scrollToPosition(0);
}
private void showReload() {
hideProgress();
stateLayout.showReload(adapter.getItemCount());

View File

@ -95,4 +95,9 @@ public class GistFilesListFragment extends BaseFragment<GistFilesListMvp.View, G
}
}
}
@Override public void onScrollTop(int index) {
super.onScrollTop(index);
if (recycler != null) recycler.scrollToPosition(0);
}
}

View File

@ -105,6 +105,11 @@ public class MainActivity extends BaseActivity<MainMvp.View, MainPresenter> 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);

View File

@ -92,7 +92,7 @@ public class MyIssuesFragment extends BaseFragment<MyIssuesMvp.View, MyIssuesPre
@Override public void showProgress(@StringRes int resId) {
refresh.setRefreshing(true);
refresh.setRefreshing(true);
stateLayout.showProgress();
}
@ -169,6 +169,12 @@ refresh.setRefreshing(true);
}
}
@Override public void onScrollTop(int index) {
super.onScrollTop(index);
if (recycler != null) recycler.scrollToPosition(0);
}
private MyIssuesType getIssuesType() {
if (issuesType == null) {
issuesType = (MyIssuesType) getArguments().getSerializable(BundleConstant.EXTRA_TWO);

View File

@ -92,7 +92,7 @@ public class MyPullRequestFragment extends BaseFragment<MyPullRequestsMvp.View,
@Override public void showProgress(@StringRes int resId) {
refresh.setRefreshing(true);
refresh.setRefreshing(true);
stateLayout.showProgress();
}
@ -180,6 +180,11 @@ refresh.setRefreshing(true);
}
}
@Override public void onScrollTop(int index) {
super.onScrollTop(index);
if (recycler != null) recycler.scrollToPosition(0);
}
private void showReload() {
hideProgress();
stateLayout.showReload(adapter.getItemCount());

View File

@ -6,17 +6,15 @@ import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.design.widget.TabLayout;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentPagerAdapter;
import com.fastaccess.R;
import com.fastaccess.data.dao.FragmentPagerAdapterModel;
import com.fastaccess.helper.AppHelper;
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.main.MainActivity;
import com.fastaccess.ui.modules.notification.all.AllNotificationsFragment;
import com.fastaccess.ui.modules.notification.unread.UnreadNotificationsFragment;
import com.fastaccess.ui.widgets.ViewPagerView;
import net.grandcentrix.thirtyinch.TiPresenter;
@ -57,7 +55,21 @@ public class NotificationActivity extends BaseActivity {
super.onCreate(savedInstanceState);
AppHelper.cancelNotification(this);
onSelectNotifications();
setupTabs(savedInstanceState);
setupTabs();
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 onBackPressed() {
@ -67,7 +79,7 @@ public class NotificationActivity extends BaseActivity {
super.onBackPressed();
}
private void setupTabs(Bundle savedInstanceState) {
private void setupTabs() {
TabLayout.Tab tab1 = getTab(R.string.unread);
TabLayout.Tab tab2 = getTab(R.string.all);
tabs.addTab(tab1);
@ -75,38 +87,6 @@ public class NotificationActivity extends BaseActivity {
pager.setAdapter(new FragmentsPagerAdapter(getSupportFragmentManager(),
FragmentPagerAdapterModel.buildForNotifications(this)));
tabs.setupWithViewPager(pager);
/*if (savedInstanceState == null) {
replaceWithAll(0);
}
tabs.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
@Override public void onTabSelected(TabLayout.Tab tab) {
int position = tab.getPosition();
if (AppHelper.getFragmentByTag(getSupportFragmentManager(), String.valueOf(position)) == null) {
replaceWithAll(position);
}
}
@Override public void onTabUnselected(TabLayout.Tab tab) {
}
@Override public void onTabReselected(TabLayout.Tab tab) {
}
});*/
}
private void replaceWithAll(int position) {
Fragment fragment;
if (position == 0) {
fragment = new UnreadNotificationsFragment();
} else {
fragment = new AllNotificationsFragment();
}
getSupportFragmentManager()
.beginTransaction()
.replace(R.id.fragmentContainer, fragment, String.valueOf(position))
.commit();
}
private TabLayout.Tab getTab(int titleId) {

View File

@ -147,6 +147,11 @@ public class AllNotificationsFragment extends BaseFragment<AllNotificationsMvp.V
super.onPrepareOptionsMenu(menu);
}
@Override public void onScrollTop(int index) {
super.onScrollTop(index);
if (recycler != null) recycler.scrollToPosition(0);
}
private void showReload() {
hideProgress();
stateLayout.showReload(adapter.getItemCount());

View File

@ -93,7 +93,7 @@ public class UnreadNotificationsFragment extends BaseFragment<UnreadNotification
@Override public void showProgress(@StringRes int resId) {
refresh.setRefreshing(true);
refresh.setRefreshing(true);
stateLayout.showProgress();
}
@ -138,6 +138,11 @@ refresh.setRefreshing(true);
getPresenter().onCallApi();
}
@Override public void onScrollTop(int index) {
super.onScrollTop(index);
if (recycler != null) recycler.scrollToPosition(0);
}
private void invalidateMenu() {
if (isSafe()) getActivity().supportInvalidateOptionsMenu();
}

View File

@ -117,6 +117,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());

View File

@ -116,6 +116,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());

View File

@ -137,6 +137,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());

View File

@ -22,7 +22,6 @@ import com.fastaccess.provider.rest.loadmore.OnLoadMore;
import com.fastaccess.provider.scheme.SchemeParser;
import com.fastaccess.ui.adapter.FeedsAdapter;
import com.fastaccess.ui.base.BaseFragment;
import com.fastaccess.ui.modules.repos.RepoPagerActivity;
import com.fastaccess.ui.widgets.StateLayout;
import com.fastaccess.ui.widgets.dialog.ListDialogView;
import com.fastaccess.ui.widgets.recyclerview.DynamicRecyclerView;
@ -91,7 +90,7 @@ public class OrgFeedsFragment extends BaseFragment<OrgFeedsMvp.View, OrgFeedsPre
@Override public void showProgress(@StringRes int resId) {
refresh.setRefreshing(true);
refresh.setRefreshing(true);
stateLayout.showProgress();
}
@ -111,11 +110,6 @@ refresh.setRefreshing(true);
super.showMessage(titleRes, msgRes);
}
private void showReload() {
hideProgress();
stateLayout.showReload(adapter.getItemCount());
}
@Override public void onOpenRepoChooser(@NonNull ArrayList<SimpleUrlsModel> models) {
Logger.e(models);
ListDialogView<SimpleUrlsModel> 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());
}
}

View File

@ -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());

View File

@ -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());

View File

@ -81,7 +81,7 @@ public class OrgTeamFragment extends BaseFragment<OrgTeamMvp.View, OrgTeamPresen
@Override public void showProgress(@StringRes int resId) {
refresh.setRefreshing(true);
refresh.setRefreshing(true);
stateLayout.showProgress();
}
@ -100,11 +100,6 @@ refresh.setRefreshing(true);
super.showMessage(titleRes, msgRes);
}
private void showReload() {
hideProgress();
stateLayout.showReload(adapter.getItemCount());
}
@NonNull @Override public OnLoadMore<String> 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());
}
}

View File

@ -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);
}
}
}

View File

@ -81,7 +81,7 @@ public class TeamMembersFragment extends BaseFragment<TeamMembersMvp.View, TeamM
@Override public void showProgress(@StringRes int resId) {
refresh.setRefreshing(true);
refresh.setRefreshing(true);
stateLayout.showProgress();
}
@ -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());

View File

@ -81,7 +81,7 @@ public class TeamReposFragment extends BaseFragment<TeamReposMvp.View, TeamRepos
@Override public void showProgress(@StringRes int resId) {
refresh.setRefreshing(true);
refresh.setRefreshing(true);
stateLayout.showProgress();
}
@ -101,11 +101,6 @@ refresh.setRefreshing(true);
super.showMessage(titleRes, msgRes);
}
private void showReload() {
hideProgress();
stateLayout.showReload(adapter.getItemCount());
}
@NonNull @Override public OnLoadMore<Long> 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());
}
}

View File

@ -217,6 +217,10 @@ public class ProfileOverviewFragment extends BaseFragment<ProfileOverviewMvp.Vie
}
}
@Override public void onUserNotFound() {
if (isSafe()) getActivity().finish();
}
@Override public void showProgress(@StringRes int resId) {
progress.setVisibility(View.VISIBLE);
}
@ -235,6 +239,10 @@ public class ProfileOverviewFragment extends BaseFragment<ProfileOverviewMvp.Vie
super.showMessage(titleRes, msgRes);
}
@Override public void onScrollTop(int index) {
super.onScrollTop(index);
}
private void onHideProgress() {
hideProgress();
}

View File

@ -25,6 +25,8 @@ interface ProfileOverviewMvp {
void onInitContributions(@Nullable List<ContributionsDay> items);
void onInitOrgs(@Nullable List<User> orgs);
void onUserNotFound();
}
interface Presenter extends BaseMvp.FAPresenter {

View File

@ -61,6 +61,11 @@ class ProfileOverviewPresenter extends BasePresenter<ProfileOverviewMvp.View> 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);
}

View File

@ -82,7 +82,7 @@ public class ProfileReposFragment extends BaseFragment<ProfileReposMvp.View, Pro
@Override public void showProgress(@StringRes int resId) {
refresh.setRefreshing(true);
refresh.setRefreshing(true);
stateLayout.showProgress();
}
@ -102,11 +102,6 @@ refresh.setRefreshing(true);
super.showMessage(titleRes, msgRes);
}
private void showReload() {
hideProgress();
stateLayout.showReload(adapter.getItemCount());
}
@NonNull @Override public OnLoadMore<String> 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());
}
}

View File

@ -82,7 +82,7 @@ public class ProfileStarredFragment extends BaseFragment<ProfileStarredMvp.View,
@Override public void showProgress(@StringRes int resId) {
refresh.setRefreshing(true);
refresh.setRefreshing(true);
stateLayout.showProgress();
}
@ -102,11 +102,6 @@ refresh.setRefreshing(true);
super.showMessage(titleRes, msgRes);
}
private void showReload() {
hideProgress();
stateLayout.showReload(adapter.getItemCount());
}
@NonNull @Override public OnLoadMore<String> 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());
}
}

View File

@ -300,11 +300,15 @@ public class RepoPagerActivity extends BaseActivity<RepoPagerMvp.View, RepoPager
}
@Override public void onNavigationChanged(@RepoPagerMvp.RepoNavigationType int navType) {
if (navType == RepoPagerMvp.PROFILE) {
getPresenter().onModuleChanged(getSupportFragmentManager(), navType);
bottomNavigation.setSelectedIndex(this.navType, true);
return;
}
this.navType = navType;
showHideFab();
//noinspection WrongConstant
if (bottomNavigation.getSelectedIndex() != navType) bottomNavigation.setSelectedIndex(navType, true);
showHideFab();
getPresenter().onModuleChanged(getSupportFragmentManager(), navType);
}

View File

@ -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;
@ -72,6 +73,20 @@ public class RepoCodePagerFragment extends BaseFragment<RepoCodePagerMvp.View, R
if (savedInstanceState != null && !counts.isEmpty()) {
Stream.of(counts).forEach(this::updateCount);
}
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);
}
}
@NonNull @Override public RepoCodePagerPresenter providePresenter() {

View File

@ -197,6 +197,11 @@ refresh.setRefreshing(true);
onRefresh();
}
@Override public void onScrollTop(int index) {
super.onScrollTop(index);
if (recycler != null) recycler.scrollToPosition(0);
}
private void showReload() {
hideBranchesProgress();
hideProgress();

View File

@ -8,6 +8,7 @@ import android.support.annotation.NonNull;
import android.support.design.widget.CoordinatorLayout;
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.view.Menu;
import android.view.MenuItem;
@ -26,6 +27,7 @@ import com.fastaccess.provider.scheme.SchemeParser;
import com.fastaccess.provider.timeline.HtmlHelper;
import com.fastaccess.ui.adapter.FragmentsPagerAdapter;
import com.fastaccess.ui.base.BaseActivity;
import com.fastaccess.ui.base.BaseFragment;
import com.fastaccess.ui.modules.repos.RepoPagerActivity;
import com.fastaccess.ui.modules.repos.code.commit.details.comments.CommitCommentsFragments;
import com.fastaccess.ui.widgets.AvatarLayout;
@ -182,6 +184,20 @@ public class CommitPagerActivity extends BaseActivity<CommitPagerMvp.View, Commi
if (tabTwo != null && commit.getGitCommit() != null && commit.getGitCommit().getCommentCount() > 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() {

View File

@ -273,6 +273,11 @@ public class CommitCommentsFragments extends BaseFragment<CommitCommentsMvp.View
return getPresenter().isCallingApi(id, vId);
}
@Override public void onScrollTop(int index) {
super.onScrollTop(index);
if (recycler != null) recycler.scrollToPosition(0);
}
private void showReload() {
hideProgress();
stateLayout.showReload(adapter.getItemCount());

View File

@ -84,4 +84,9 @@ public class CommitFilesFragment extends BaseFragment<CommitFilesMvp.View, Commi
Boolean toggle = toggleMap.get(position);
return toggle != null && toggle;
}
@Override public void onScrollTop(int index) {
super.onScrollTop(index);
if (recycler != null) recycler.scrollToPosition(0);
}
}

View File

@ -121,6 +121,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());

View File

@ -265,6 +265,11 @@ public class RepoFilePathFragment extends BaseFragment<RepoFilePathMvp.View, Rep
return repoFilesView;
}
@Override public void onScrollTop(int index) {
super.onScrollTop(index);
if (repoFilesView != null) repoFilesView.onScrollTop(index);
}
private void showReload() {
branchesProgress.setVisibility(View.GONE);
hideProgress();

View File

@ -176,4 +176,9 @@ public class ViewerFragment extends BaseFragment<ViewerMvp.View, ViewerPresenter
}
return super.onOptionsItemSelected(item);
}
@Override public void onScrollTop(int index) {
super.onScrollTop(index);
if (webView != null) webView.scrollTo(0, 0);
}
}

View File

@ -0,0 +1,67 @@
package com.fastaccess.ui.modules.repos.code.releases;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import com.fastaccess.R;
import com.fastaccess.helper.BundleConstant;
import com.fastaccess.helper.Bundler;
import com.fastaccess.ui.base.BaseActivity;
import net.grandcentrix.thirtyinch.TiPresenter;
/**
* Created by Kosh on 25 May 2017, 7:13 PM
*/
public class ReleasesListActivity extends BaseActivity {
public static Intent getIntent(@NonNull Context context, @NonNull String username, @NonNull String repoId) {
Intent intent = new Intent(context, ReleasesListActivity.class);
intent.putExtras(Bundler.start().put(BundleConstant.ID, repoId)
.put(BundleConstant.EXTRA, username)
.end());
return intent;
}
@Override protected int layout() {
return R.layout.activity_fragment_layout;
}
@Override protected boolean isTransparent() {
return true;
}
@Override protected boolean canBack() {
return true;
}
@Override protected boolean isSecured() {
return false;
}
@NonNull @Override public TiPresenter providePresenter() {
return new RepoReleasesPresenter();
}
@Override protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (savedInstanceState == null) {
if (getIntent() == null || getIntent().getExtras() == null) {
finish();
} else {
Bundle bundle = getIntent().getExtras();
//noinspection ConstantConditions
getSupportFragmentManager()
.beginTransaction()
.replace(R.id.container, RepoReleasesFragment.newInstance(bundle.getString(BundleConstant.ID),
bundle.getString(BundleConstant.EXTRA)))
.commit();
}
}
}
}

View File

@ -204,6 +204,11 @@ public class RepoReleasesFragment extends BaseFragment<RepoReleasesMvp.View, Rep
}
}
@Override public void onScrollTop(int index) {
super.onScrollTop(index);
if (recycler != null) recycler.scrollToPosition(0);
}
private void showReload() {
hideProgress();
stateLayout.showReload(adapter.getItemCount());

View File

@ -15,6 +15,7 @@ import com.fastaccess.data.dao.MilestoneModel;
import com.fastaccess.helper.BundleConstant;
import com.fastaccess.helper.Bundler;
import com.fastaccess.ui.adapter.MilestonesAdapter;
import com.fastaccess.ui.base.BaseDialogFragment;
import com.fastaccess.ui.base.BaseFragment;
import com.fastaccess.ui.modules.repos.extras.milestone.create.CreateMilestoneDialogFragment;
import com.fastaccess.ui.widgets.AppbarRefreshLayout;
@ -76,6 +77,9 @@ public class MilestoneDialogFragment extends BaseFragment<MilestoneMvp.View, Mil
@Override public void onMilestoneSelected(@NonNull MilestoneModel milestoneModel) {
onMilestoneSelected.onMilestoneSelected(milestoneModel);
if (getParentFragment() instanceof BaseDialogFragment) {
((BaseDialogFragment) getParentFragment()).dismiss();
}
}
@Override protected int fragmentLayout() {
@ -112,7 +116,7 @@ public class MilestoneDialogFragment extends BaseFragment<MilestoneMvp.View, Mil
@Override public void showProgress(@StringRes int resId) {
refresh.setRefreshing(true);
refresh.setRefreshing(true);
stateLayout.showProgress();
}

View File

@ -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;
@ -60,6 +61,12 @@ public class RepoIssuesPagerFragment extends BaseFragment<RepoIssuesPagerMvp.Vie
if (savedInstanceState != null && !counts.isEmpty()) {
Stream.of(counts).forEach(this::updateCount);
}
tabs.addOnTabSelectedListener(new TabLayout.ViewPagerOnTabSelectedListener(pager) {
@Override public void onTabReselected(TabLayout.Tab tab) {
super.onTabReselected(tab);
onScrollTop(tab.getPosition());
}
});
}
@NonNull @Override public RepoIssuesPagerPresenter providePresenter() {
@ -106,6 +113,14 @@ public class RepoIssuesPagerFragment extends BaseFragment<RepoIssuesPagerMvp.Vie
if (openedIssues != null) openedIssues.onRefresh(isLastUpdated);
}
@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 updateCount(@NonNull TabsCountStateModel model) {
TextView tv = ViewHelper.getTabTextView(tabs, model.getTabIndex());
tv.setText(SpannableBuilder.builder()

View File

@ -136,7 +136,7 @@ public class RepoClosedIssuesFragment extends BaseFragment<RepoIssuesMvp.View, R
@Override public void showProgress(@StringRes int resId) {
refresh.setRefreshing(true);
refresh.setRefreshing(true);
stateLayout.showProgress();
}
@ -184,6 +184,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());

View File

@ -196,6 +196,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());

View File

@ -208,7 +208,7 @@ public class IssueTimelinePresenter extends BasePresenter<IssueTimelineMvp.View>
return getReactionsProvider().isCallingApi(id, vId);
}
private ReactionsProvider getReactionsProvider() {
@NonNull private ReactionsProvider getReactionsProvider() {
if (reactionsProvider == null) {
reactionsProvider = new ReactionsProvider();
}

View File

@ -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<RepoPullRequestPa
@State HashSet<TabsCountStateModel> 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<RepoPullRequestPa
if (savedInstanceState != null && !counts.isEmpty()) {
Stream.of(counts).forEach(this::updateCount);
}
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);
}
}
@NonNull @Override public RepoPullRequestPagerPresenter providePresenter() {

View File

@ -127,7 +127,7 @@ public class RepoPullRequestFragment extends BaseFragment<RepoPullRequestMvp.Vie
@Override public void showProgress(@StringRes int resId) {
refresh.setRefreshing(true);
refresh.setRefreshing(true);
stateLayout.showProgress();
}
@ -167,6 +167,11 @@ refresh.setRefreshing(true);
onRefresh();
}
@Override public void onScrollTop(int index) {
super.onScrollTop(index);
if (recycler != null) recycler.scrollToPosition(0);
}
private IssueState getIssueState() {
return ((IssueState) getArguments().getSerializable(BundleConstant.EXTRA_TWO));
}

View File

@ -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.view.Menu;
import android.view.MenuItem;
@ -27,6 +28,7 @@ import com.fastaccess.helper.Logger;
import com.fastaccess.helper.ViewHelper;
import com.fastaccess.ui.adapter.FragmentsPagerAdapter;
import com.fastaccess.ui.base.BaseActivity;
import com.fastaccess.ui.base.BaseFragment;
import com.fastaccess.ui.modules.repos.RepoPagerActivity;
import com.fastaccess.ui.modules.repos.RepoPagerMvp;
import com.fastaccess.ui.modules.repos.extras.assignees.AssigneesDialogFragment;
@ -264,10 +266,16 @@ public class PullRequestPagerActivity extends BaseActivity<PullRequestPagerMvp.V
pager.addOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
@Override public void onPageSelected(int position) {
super.onPageSelected(position);
hideShowFab();
}
});
}
tabs.addOnTabSelectedListener(new TabLayout.ViewPagerOnTabSelectedListener(pager) {
@Override public void onTabReselected(TabLayout.Tab tab) {
super.onTabReselected(tab);
onScrollTop(tab.getPosition());
}
});
if (tabs.getTabAt(2) != null) {
tabs.getTabAt(2)
.setText(SpannableBuilder.builder()
@ -298,6 +306,14 @@ public class PullRequestPagerActivity extends BaseActivity<PullRequestPagerMvp.V
hideShowFab();
}
@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 onMessageDialogActionClicked(boolean isOk, @Nullable Bundle bundle) {
super.onMessageDialogActionClicked(isOk, bundle);
if (isOk) {

View File

@ -123,6 +123,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());

View File

@ -138,6 +138,11 @@ public class PullRequestFilesFragment extends BaseFragment<PullRequestFilesMvp.V
return toggle != null && toggle;
}
@Override public void onScrollTop(int index) {
super.onScrollTop(index);
if (recycler != null) recycler.scrollToPosition(0);
}
private void showReload() {
hideProgress();
stateLayout.showReload(adapter.getItemCount());

View File

@ -338,6 +338,11 @@ public class PullRequestTimelineFragment extends BaseFragment<PullRequestTimelin
return getPresenter().isCallingApi(id, vId);
}
@Override public void onScrollTop(int index) {
super.onScrollTop(index);
if (recycler != null) recycler.scrollToPosition(0);
}
private View getFromView() {
return getActivity() != null && getActivity().findViewById(R.id.fab) != null ? getActivity().findViewById(R.id.fab) : recycler;
}

View File

@ -5,6 +5,7 @@ import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.design.widget.AppBarLayout;
import android.support.design.widget.TabLayout;
import android.support.v4.app.Fragment;
import android.text.Editable;
import android.view.KeyEvent;
import android.view.View;
@ -20,6 +21,7 @@ import com.fastaccess.helper.AnimHelper;
import com.fastaccess.helper.ViewHelper;
import com.fastaccess.ui.adapter.FragmentsPagerAdapter;
import com.fastaccess.ui.base.BaseActivity;
import com.fastaccess.ui.base.BaseFragment;
import com.fastaccess.ui.widgets.FontAutoCompleteEditText;
import com.fastaccess.ui.widgets.ForegroundImageView;
import com.fastaccess.ui.widgets.ViewPagerView;
@ -106,28 +108,17 @@ public class SearchActivity extends BaseActivity<SearchMvp.View, SearchPresenter
setupTab();
}
if(getIntent().hasExtra("search")){
if (getIntent().hasExtra("search")) {
searchEditText.setText(getIntent().getStringExtra("search"));
onTextChange(searchEditText.getEditableText());
getPresenter().onSearchClicked(pager, searchEditText);
}
}
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)));
tabs.addOnTabSelectedListener(new TabLayout.ViewPagerOnTabSelectedListener(pager) {
@Override public void onTabReselected(TabLayout.Tab tab) {
super.onTabReselected(tab);
onScrollTop(tab.getPosition());
}
}
});
}
@Override public void onNotifyAdapter(@Nullable SearchHistory query) {
@ -152,8 +143,33 @@ public class SearchActivity extends BaseActivity<SearchMvp.View, SearchPresenter
}
}
@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 ArrayAdapter<SearchHistory> 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)));
}
}
}
}

View File

@ -134,17 +134,15 @@ public class SearchCodeFragment extends BaseFragment<SearchCodeMvp.View, SearchC
}
}
@Override
public void onQueueSearch(@NonNull String query) {
@Override public void onQueueSearch(@NonNull String query) {
this.searchQuery = query;
if(getView()!=null)
if (getView() != null)
onSetSearchQuery(query, false);
}
@Override
public void onQueueSearch(@NonNull String query, boolean showRepoName) {
@Override public void onQueueSearch(@NonNull String query, boolean showRepoName) {
this.searchQuery = query;
if(getView()!=null)
if (getView() != null)
onSetSearchQuery(query, showRepoName);
}
@ -165,7 +163,7 @@ public class SearchCodeFragment extends BaseFragment<SearchCodeMvp.View, SearchC
}
@Override public void onRefresh() {
if(searchQuery.length()==0){
if (searchQuery.length() == 0) {
refresh.setRefreshing(false);
return;
}
@ -176,6 +174,11 @@ public class SearchCodeFragment extends BaseFragment<SearchCodeMvp.View, SearchC
onRefresh();
}
@Override public void onScrollTop(int index) {
super.onScrollTop(index);
if (recycler != null) recycler.scrollToPosition(0);
}
private void showReload() {
hideProgress();
stateLayout.showReload(adapter.getItemCount());

View File

@ -130,8 +130,7 @@ public class SearchIssuesFragment extends BaseFragment<SearchIssuesMvp.View, Sea
}
}
@Override
public void onQueueSearch(@NonNull String query) {
@Override public void onQueueSearch(@NonNull String query) {
this.searchQuery = query;
if(getView()!=null)
onSetSearchQuery(query);
@ -157,6 +156,11 @@ public class SearchIssuesFragment extends BaseFragment<SearchIssuesMvp.View, Sea
onRefresh();
}
@Override public void onScrollTop(int index) {
super.onScrollTop(index);
if (recycler != null) recycler.scrollToPosition(0);
}
private void showReload() {
hideProgress();
stateLayout.showReload(adapter.getItemCount());

View File

@ -131,10 +131,9 @@ public class SearchReposFragment extends BaseFragment<SearchReposMvp.View, Searc
}
}
@Override
public void onQueueSearch(@NonNull String query) {
@Override public void onQueueSearch(@NonNull String query) {
this.searchQuery = query;
if(getView()!=null)
if (getView() != null)
onSetSearchQuery(query);
}
@ -147,7 +146,7 @@ public class SearchReposFragment extends BaseFragment<SearchReposMvp.View, Searc
}
@Override public void onRefresh() {
if(searchQuery.length()==0){
if (searchQuery.length() == 0) {
refresh.setRefreshing(false);
return;
}
@ -158,6 +157,11 @@ public class SearchReposFragment extends BaseFragment<SearchReposMvp.View, Searc
onRefresh();
}
@Override public void onScrollTop(int index) {
super.onScrollTop(index);
if (recycler != null) recycler.scrollToPosition(0);
}
private void showReload() {
hideProgress();
stateLayout.showReload(adapter.getItemCount());

View File

@ -129,10 +129,9 @@ public class SearchUsersFragment extends BaseFragment<SearchUsersMvp.View, Searc
}
}
@Override
public void onQueueSearch(@NonNull String query) {
@Override public void onQueueSearch(@NonNull String query) {
this.searchQuery = query;
if(getView()!=null)
if (getView() != null)
onSetSearchQuery(query);
}
@ -145,7 +144,7 @@ public class SearchUsersFragment extends BaseFragment<SearchUsersMvp.View, Searc
}
@Override public void onRefresh() {
if(searchQuery.length()==0){
if (searchQuery.length() == 0) {
refresh.setRefreshing(false);
return;
}
@ -156,6 +155,11 @@ public class SearchUsersFragment extends BaseFragment<SearchUsersMvp.View, Searc
onRefresh();
}
@Override public void onScrollTop(int index) {
super.onScrollTop(index);
if (recycler != null) recycler.scrollToPosition(0);
}
private void showReload() {
hideProgress();
stateLayout.showReload(adapter.getItemCount());

View File

@ -5,6 +5,7 @@ import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.design.widget.TabLayout;
import android.support.v4.app.Fragment;
import com.fastaccess.R;
import com.fastaccess.data.dao.FragmentPagerAdapterModel;
@ -14,6 +15,7 @@ import com.fastaccess.helper.Bundler;
import com.fastaccess.helper.InputHelper;
import com.fastaccess.ui.adapter.FragmentsPagerAdapter;
import com.fastaccess.ui.base.BaseActivity;
import com.fastaccess.ui.base.BaseFragment;
import com.fastaccess.ui.modules.main.MainActivity;
import com.fastaccess.ui.widgets.ViewPagerView;
@ -110,6 +112,20 @@ public class UserPagerActivity extends BaseActivity<UserPagerMvp.View, UserPager
onInitOrg(getPresenter().isMember == 1);
}
}
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 hideProgress() {

View File

@ -95,7 +95,7 @@ public abstract class BaseRecyclerAdapter<M, VH extends BaseViewHolder,
public void addItem(M item, int position) {
data.add(position, item);
notifyItemInserted(data.size() - 1);
notifyItemInserted(position);
}
public void addItem(M item) {

View File

@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="16dp"
android:height="16dp"
android:viewportHeight="24.0"
android:viewportWidth="24.0">
<path
android:fillColor="@color/light_gray"
android:pathData="M19,5v14H5V5h14m0,-2H5c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2V5c0,-1.1 -0.9,-2 -2,-2z"/>
</vector>

View File

@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="16dp"
android:height="16dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
<path
android:fillColor="@color/material_blue_700"
android:pathData="M19,3L5,3c-1.11,0 -2,0.9 -2,2v14c0,1.1 0.89,2 2,2h14c1.11,0 2,-0.9 2,-2L21,5c0,-1.1 -0.89,-2 -2,-2zM10,17l-5,-5 1.41,-1.41L10,14.17l7.59,-7.59L19,8l-9,9z"/>
</vector>

View File

@ -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"
}
}