From 837b2652b50bcc042283aa96dbf793ef0c17b7dc Mon Sep 17 00:00:00 2001 From: Kosh Date: Sun, 5 Mar 2017 12:39:50 +0800 Subject: [PATCH] this fixes #13 where now one can add assignees and milestones to issue/pull. --- app/build.gradle | 1 + app/src/main/assets/2.sql | 1 + .../data/dao/AssigneesRequestModel.java | 16 +++ .../fastaccess/data/dao/PullRequestModel.java | 33 ++--- .../fastaccess/data/service/IssueService.java | 5 + .../data/service/PullRequestService.java | 7 ++ .../com/fastaccess/ui/AssigneesAdapter.java | 39 ++++++ .../viewholder/AssigneesViewHolder.java | 50 ++++++++ .../ui/modules/gists/gist/GistView.java | 8 +- .../ui/modules/login/LoginView.java | 2 +- .../repos/extras/assignees/AssigneesMvp.java | 24 ++++ .../extras/assignees/AssigneesPresenter.java | 9 ++ .../repos/extras/assignees/AssigneesView.java | 119 ++++++++++++++++++ .../repos/{ => extras}/labels/LabelsMvp.java | 2 +- .../repos/extras/labels/LabelsPresenter.java | 9 ++ .../repos/{ => extras}/labels/LabelsView.java | 4 +- .../repos/extras/milestone/MilestoneView.java | 2 + .../issues/issue/details/IssuePagerMvp.java | 13 +- .../issue/details/IssuePagerPresenter.java | 32 +++++ .../issues/issue/details/IssuePagerView.java | 22 +++- .../modules/repos/labels/LabelsPresenter.java | 9 -- .../details/PullRequestPagerMvp.java | 14 ++- .../details/PullRequestPagerPresenter.java | 32 +++++ .../details/PullRequestPagerView.java | 23 +++- app/src/main/res/menu/issue_menu.xml | 24 ++-- app/src/main/res/menu/pull_request_menu.xml | 23 ++-- app/src/main/res/values/strings.xml | 1 + 27 files changed, 461 insertions(+), 63 deletions(-) create mode 100644 app/src/main/assets/2.sql create mode 100644 app/src/main/java/com/fastaccess/data/dao/AssigneesRequestModel.java create mode 100644 app/src/main/java/com/fastaccess/ui/AssigneesAdapter.java create mode 100644 app/src/main/java/com/fastaccess/ui/adapter/viewholder/AssigneesViewHolder.java create mode 100644 app/src/main/java/com/fastaccess/ui/modules/repos/extras/assignees/AssigneesMvp.java create mode 100644 app/src/main/java/com/fastaccess/ui/modules/repos/extras/assignees/AssigneesPresenter.java create mode 100644 app/src/main/java/com/fastaccess/ui/modules/repos/extras/assignees/AssigneesView.java rename app/src/main/java/com/fastaccess/ui/modules/repos/{ => extras}/labels/LabelsMvp.java (90%) create mode 100644 app/src/main/java/com/fastaccess/ui/modules/repos/extras/labels/LabelsPresenter.java rename app/src/main/java/com/fastaccess/ui/modules/repos/{ => extras}/labels/LabelsView.java (97%) delete mode 100644 app/src/main/java/com/fastaccess/ui/modules/repos/labels/LabelsPresenter.java diff --git a/app/build.gradle b/app/build.gradle index e3f67773..0eaeedee 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -26,6 +26,7 @@ android { buildConfigField "String", "GITHUB_SECRET", "\"${GITHUB_SECRET}\"" buildConfigField "String", "REDIRECT_URL", "\"${REDIRECT_URL}\"" buildConfigField "String", "REST_URL", '"https://api.github.com/"' + buildConfigField "int", "DB_VERSION", "2" } buildTypes { release { diff --git a/app/src/main/assets/2.sql b/app/src/main/assets/2.sql new file mode 100644 index 00000000..5706b2a2 --- /dev/null +++ b/app/src/main/assets/2.sql @@ -0,0 +1 @@ +ALTER TABLE pull_request_model ADD COLUMN assignees TEXT \ No newline at end of file diff --git a/app/src/main/java/com/fastaccess/data/dao/AssigneesRequestModel.java b/app/src/main/java/com/fastaccess/data/dao/AssigneesRequestModel.java new file mode 100644 index 00000000..bd6e44a8 --- /dev/null +++ b/app/src/main/java/com/fastaccess/data/dao/AssigneesRequestModel.java @@ -0,0 +1,16 @@ +package com.fastaccess.data.dao; + +import java.util.List; + +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +/** + * Created by Kosh on 05 Mar 2017, 12:01 PM + */ + +@Getter @Setter @NoArgsConstructor +public class AssigneesRequestModel { + private List assignees; +} diff --git a/app/src/main/java/com/fastaccess/data/dao/PullRequestModel.java b/app/src/main/java/com/fastaccess/data/dao/PullRequestModel.java index fc7e7d01..8000159c 100644 --- a/app/src/main/java/com/fastaccess/data/dao/PullRequestModel.java +++ b/app/src/main/java/com/fastaccess/data/dao/PullRequestModel.java @@ -10,7 +10,6 @@ import com.fastaccess.data.dao.types.IssueState; import com.fastaccess.helper.ParseDateFormat; import com.fastaccess.ui.widgets.SpannableBuilder; import com.siimkinks.sqlitemagic.Delete; -import com.siimkinks.sqlitemagic.PullRequestModelTable; import com.siimkinks.sqlitemagic.Select; import com.siimkinks.sqlitemagic.annotation.Column; import com.siimkinks.sqlitemagic.annotation.Id; @@ -25,6 +24,8 @@ import lombok.Setter; import rx.Completable; import rx.Observable; +import static com.siimkinks.sqlitemagic.PullRequestModelTable.PULL_REQUEST_MODEL; + /** * Created by Kosh on 08 Dec 2016, 8:51 PM */ @@ -68,14 +69,15 @@ public class PullRequestModel implements Parcelable { @Column int reviewComments; @Column String repoId; @Column String login; + @Column UsersListModel assignees; public Completable save() { return persist().observe().toCompletable(); } public static Completable save(@NonNull List models, @NonNull String repoId, @NonNull String login) { - return Delete.from(PullRequestModelTable.PULL_REQUEST_MODEL) - .where(PullRequestModelTable.PULL_REQUEST_MODEL.REPO_ID.is(repoId)) + return Delete.from(PULL_REQUEST_MODEL) + .where(PULL_REQUEST_MODEL.REPO_ID.is(repoId)) .observe() .toCompletable() .andThen(Observable.from(models) @@ -88,19 +90,19 @@ public class PullRequestModel implements Parcelable { } public static Observable> getPullRequests(@NonNull String repoId, @NonNull String login, @NonNull IssueState issueState) { - return Select.from(PullRequestModelTable.PULL_REQUEST_MODEL) - .where(PullRequestModelTable.PULL_REQUEST_MODEL.REPO_ID.is(repoId) - .and(PullRequestModelTable.PULL_REQUEST_MODEL.LOGIN.is(login)) - .and(PullRequestModelTable.PULL_REQUEST_MODEL.STATE.is(issueState))) - .orderBy(PullRequestModelTable.PULL_REQUEST_MODEL.UPDATED_AT.desc()) + return Select.from(PULL_REQUEST_MODEL) + .where(PULL_REQUEST_MODEL.REPO_ID.is(repoId) + .and(PULL_REQUEST_MODEL.LOGIN.is(login)) + .and(PULL_REQUEST_MODEL.STATE.is(issueState))) + .orderBy(PULL_REQUEST_MODEL.UPDATED_AT.desc()) .queryDeep() .observe() .runQuery(); } public static Observable getPullRequest(long id) { - return Select.from(PullRequestModelTable.PULL_REQUEST_MODEL) - .where(PullRequestModelTable.PULL_REQUEST_MODEL.ID.is(id)) + return Select.from(PULL_REQUEST_MODEL) + .where(PULL_REQUEST_MODEL.ID.is(id)) .queryDeep() .takeFirst() .observe() @@ -108,10 +110,10 @@ public class PullRequestModel implements Parcelable { } public static Observable getPullRequest(int number, @NonNull String repoId, @NonNull String login) { - return Select.from(PullRequestModelTable.PULL_REQUEST_MODEL) - .where(PullRequestModelTable.PULL_REQUEST_MODEL.NUMBER.is(number) - .and(PullRequestModelTable.PULL_REQUEST_MODEL.LOGIN.is(login)) - .and(PullRequestModelTable.PULL_REQUEST_MODEL.REPO_ID.is(repoId))) + return Select.from(PULL_REQUEST_MODEL) + .where(PULL_REQUEST_MODEL.NUMBER.is(number) + .and(PULL_REQUEST_MODEL.LOGIN.is(login)) + .and(PULL_REQUEST_MODEL.REPO_ID.is(repoId))) .queryDeep() .takeFirst() .observe() @@ -177,6 +179,7 @@ public class PullRequestModel implements Parcelable { dest.writeInt(this.reviewComments); dest.writeString(this.repoId); dest.writeString(this.login); + dest.writeList(this.assignees); } protected PullRequestModel(Parcel in) { @@ -223,6 +226,8 @@ public class PullRequestModel implements Parcelable { this.reviewComments = in.readInt(); this.repoId = in.readString(); this.login = in.readString(); + this.assignees = new UsersListModel(); + in.readList(this.assignees, this.assignees.getClass().getClassLoader()); } public static final Creator CREATOR = new Creator() { diff --git a/app/src/main/java/com/fastaccess/data/service/IssueService.java b/app/src/main/java/com/fastaccess/data/service/IssueService.java index d47b92f0..81ebb976 100644 --- a/app/src/main/java/com/fastaccess/data/service/IssueService.java +++ b/app/src/main/java/com/fastaccess/data/service/IssueService.java @@ -3,6 +3,7 @@ package com.fastaccess.data.service; import android.support.annotation.NonNull; +import com.fastaccess.data.dao.AssigneesRequestModel; import com.fastaccess.data.dao.CommentRequestModel; import com.fastaccess.data.dao.CommentsModel; import com.fastaccess.data.dao.CreateIssueModel; @@ -87,4 +88,8 @@ public interface IssueService { @POST("repos/{owner}/{repo}/issues/{number}/labels") Observable> putLabels(@Path("owner") String owner, @Path("repo") String repo, @Path("number") int number, @Body @NonNull List labels); + + @POST("repos/{owner}/{repo}/issues/{number}/assignees") + Observable putAssignees(@Path("owner") String owner, @Path("repo") String repo, + @Path("number") int number, @Body AssigneesRequestModel body); } \ No newline at end of file diff --git a/app/src/main/java/com/fastaccess/data/service/PullRequestService.java b/app/src/main/java/com/fastaccess/data/service/PullRequestService.java index a4813276..fd8db2eb 100644 --- a/app/src/main/java/com/fastaccess/data/service/PullRequestService.java +++ b/app/src/main/java/com/fastaccess/data/service/PullRequestService.java @@ -1,5 +1,6 @@ package com.fastaccess.data.service; +import com.fastaccess.data.dao.AssigneesRequestModel; import com.fastaccess.data.dao.CommitModel; import com.fastaccess.data.dao.IssueRequestModel; import com.fastaccess.data.dao.MergeRequestModel; @@ -12,6 +13,7 @@ import retrofit2.Response; import retrofit2.http.Body; import retrofit2.http.GET; import retrofit2.http.PATCH; +import retrofit2.http.POST; import retrofit2.http.PUT; import retrofit2.http.Path; import retrofit2.http.Query; @@ -53,8 +55,13 @@ public interface PullRequestService { Observable editPullRequest(@Path("owner") String owner, @Path("repo") String repo, @Path("number") int number, @Body IssueRequestModel issue); + @PATCH("repos/{owner}/{repo}/issues/{number}") Observable editIssue(@Path("owner") String owner, @Path("repo") String repo, @Path("number") int number, @Body IssueRequestModel issue); + + @POST("repos/{owner}/{repo}/issues/{number}/assignees") + Observable putAssignees(@Path("owner") String owner, @Path("repo") String repo, + @Path("number") int number, @Body AssigneesRequestModel body); } diff --git a/app/src/main/java/com/fastaccess/ui/AssigneesAdapter.java b/app/src/main/java/com/fastaccess/ui/AssigneesAdapter.java new file mode 100644 index 00000000..952e16ec --- /dev/null +++ b/app/src/main/java/com/fastaccess/ui/AssigneesAdapter.java @@ -0,0 +1,39 @@ +package com.fastaccess.ui; + +import android.support.annotation.NonNull; +import android.view.ViewGroup; + +import com.fastaccess.data.dao.UserModel; +import com.fastaccess.ui.adapter.viewholder.AssigneesViewHolder; +import com.fastaccess.ui.widgets.recyclerview.BaseRecyclerAdapter; +import com.fastaccess.ui.widgets.recyclerview.BaseViewHolder; + +import java.util.List; + +/** + * Created by Kosh on 11 Nov 2016, 2:07 PM + */ + +public class AssigneesAdapter extends BaseRecyclerAdapter> { + + public interface OnSelectAssignee { + boolean isAssigneeSelected(int position); + + void onToggleSelection(int position, boolean select); + } + + private OnSelectAssignee onSelectAssignee; + + public AssigneesAdapter(@NonNull List data, OnSelectAssignee onSelectAssignee) { + super(data); + this.onSelectAssignee = onSelectAssignee; + } + + @Override protected AssigneesViewHolder viewHolder(ViewGroup parent, int viewType) { + return AssigneesViewHolder.newInstance(parent, onSelectAssignee); + } + + @Override protected void onBindView(AssigneesViewHolder holder, int position) { + holder.bind(getItem(position)); + } +} diff --git a/app/src/main/java/com/fastaccess/ui/adapter/viewholder/AssigneesViewHolder.java b/app/src/main/java/com/fastaccess/ui/adapter/viewholder/AssigneesViewHolder.java new file mode 100644 index 00000000..025f219b --- /dev/null +++ b/app/src/main/java/com/fastaccess/ui/adapter/viewholder/AssigneesViewHolder.java @@ -0,0 +1,50 @@ +package com.fastaccess.ui.adapter.viewholder; + +import android.support.annotation.NonNull; +import android.view.View; +import android.view.ViewGroup; + +import com.fastaccess.R; +import com.fastaccess.data.dao.UserModel; +import com.fastaccess.ui.AssigneesAdapter; +import com.fastaccess.ui.widgets.AvatarLayout; +import com.fastaccess.ui.widgets.FontTextView; +import com.fastaccess.ui.widgets.recyclerview.BaseViewHolder; + +import butterknife.BindColor; +import butterknife.BindView; + +/** + * Created by Kosh on 11 Nov 2016, 2:08 PM + */ + +public class AssigneesViewHolder extends BaseViewHolder { + + @BindView(R.id.avatarLayout) AvatarLayout avatar; + @BindView(R.id.title) FontTextView title; + @BindView(R.id.date) FontTextView date; + @BindColor(R.color.windowBackground) int windowBackground; + @BindColor(R.color.light_gray) int lightGray; + private AssigneesAdapter.OnSelectAssignee onSelectAssignee; + + @Override public void onClick(View v) { + int position = getAdapterPosition(); + onSelectAssignee.onToggleSelection(position, !onSelectAssignee.isAssigneeSelected(position)); + } + + private AssigneesViewHolder(@NonNull View itemView, @NonNull AssigneesAdapter.OnSelectAssignee onSelectAssignee) { + super(itemView); + this.onSelectAssignee = onSelectAssignee; + } + + public static AssigneesViewHolder newInstance(@NonNull ViewGroup viewGroup, @NonNull AssigneesAdapter.OnSelectAssignee onSelectAssignee) { + return new AssigneesViewHolder(getView(viewGroup, R.layout.feeds_row_item), onSelectAssignee); + } + + @Override public void bind(@NonNull UserModel user) { + avatar.setUrl(user.getAvatarUrl(), user.getLogin()); + title.setText(user.getLogin()); + date.setVisibility(View.GONE); + itemView.setBackgroundColor(onSelectAssignee.isAssigneeSelected(getAdapterPosition()) ? lightGray : windowBackground); + } +} diff --git a/app/src/main/java/com/fastaccess/ui/modules/gists/gist/GistView.java b/app/src/main/java/com/fastaccess/ui/modules/gists/gist/GistView.java index a740b99f..c96a571e 100644 --- a/app/src/main/java/com/fastaccess/ui/modules/gists/gist/GistView.java +++ b/app/src/main/java/com/fastaccess/ui/modules/gists/gist/GistView.java @@ -57,9 +57,11 @@ public class GistView extends BaseActivity } @OnClick(R.id.fab) void onAddComment() { - GistCommentsView view = (GistCommentsView) pager.getAdapter().instantiateItem(pager, 1); - if (view != null) { - view.onStartNewComment(); + if (pager != null && pager.getAdapter() != null) { + GistCommentsView view = (GistCommentsView) pager.getAdapter().instantiateItem(pager, 1); + if (view != null) { + view.onStartNewComment(); + } } } diff --git a/app/src/main/java/com/fastaccess/ui/modules/login/LoginView.java b/app/src/main/java/com/fastaccess/ui/modules/login/LoginView.java index f79e7601..666c24ef 100644 --- a/app/src/main/java/com/fastaccess/ui/modules/login/LoginView.java +++ b/app/src/main/java/com/fastaccess/ui/modules/login/LoginView.java @@ -66,7 +66,7 @@ public class LoginView extends BaseActivity imple if (progress == 100) { refresh.setRefreshing(false); } else if (progress < 100) { - + refresh.setRefreshing(true); } } }); diff --git a/app/src/main/java/com/fastaccess/ui/modules/repos/extras/assignees/AssigneesMvp.java b/app/src/main/java/com/fastaccess/ui/modules/repos/extras/assignees/AssigneesMvp.java new file mode 100644 index 00000000..5e8a634c --- /dev/null +++ b/app/src/main/java/com/fastaccess/ui/modules/repos/extras/assignees/AssigneesMvp.java @@ -0,0 +1,24 @@ +package com.fastaccess.ui.modules.repos.extras.assignees; + +import android.support.annotation.NonNull; + +import com.fastaccess.data.dao.UserModel; +import com.fastaccess.ui.AssigneesAdapter; +import com.fastaccess.ui.base.mvp.BaseMvp; + +import java.util.ArrayList; + +/** + * Created by Kosh on 22 Feb 2017, 7:22 PM + */ + +public interface AssigneesMvp { + + interface SelectedAssigneesListener { + void onSelectedAssignees(@NonNull ArrayList users); + } + + interface View extends BaseMvp.FAView, AssigneesAdapter.OnSelectAssignee {} + + interface Presenter {} +} diff --git a/app/src/main/java/com/fastaccess/ui/modules/repos/extras/assignees/AssigneesPresenter.java b/app/src/main/java/com/fastaccess/ui/modules/repos/extras/assignees/AssigneesPresenter.java new file mode 100644 index 00000000..672657ef --- /dev/null +++ b/app/src/main/java/com/fastaccess/ui/modules/repos/extras/assignees/AssigneesPresenter.java @@ -0,0 +1,9 @@ +package com.fastaccess.ui.modules.repos.extras.assignees; + +import com.fastaccess.ui.base.mvp.presenter.BasePresenter; + +/** + * Created by Kosh on 05 Mar 2017, 11:52 AM + */ + +class AssigneesPresenter extends BasePresenter implements AssigneesMvp.Presenter {} diff --git a/app/src/main/java/com/fastaccess/ui/modules/repos/extras/assignees/AssigneesView.java b/app/src/main/java/com/fastaccess/ui/modules/repos/extras/assignees/AssigneesView.java new file mode 100644 index 00000000..10fa0278 --- /dev/null +++ b/app/src/main/java/com/fastaccess/ui/modules/repos/extras/assignees/AssigneesView.java @@ -0,0 +1,119 @@ +package com.fastaccess.ui.modules.repos.extras.assignees; + +import android.content.Context; +import android.os.Bundle; +import android.os.Parcelable; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; +import android.view.View; + +import com.annimon.stream.Collectors; +import com.annimon.stream.Stream; +import com.fastaccess.R; +import com.fastaccess.data.dao.UserModel; +import com.fastaccess.helper.BundleConstant; +import com.fastaccess.helper.Bundler; +import com.fastaccess.ui.AssigneesAdapter; +import com.fastaccess.ui.base.BaseDialogFragment; +import com.fastaccess.ui.widgets.FontTextView; +import com.fastaccess.ui.widgets.recyclerview.DynamicRecyclerView; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +import butterknife.BindView; +import butterknife.OnClick; +import icepick.State; + +/** + * Created by Kosh on 22 Feb 2017, 7:23 PM + */ + +public class AssigneesView extends BaseDialogFragment implements AssigneesMvp.View { + + @BindView(R.id.title) FontTextView title; + @BindView(R.id.recycler) DynamicRecyclerView recycler; + @State HashMap selectionMap; + private AssigneesAdapter adapter; + private AssigneesMvp.SelectedAssigneesListener callback; + + @Override public void onAttach(Context context) { + super.onAttach(context); + if (getParentFragment() instanceof AssigneesMvp.SelectedAssigneesListener) { + callback = (AssigneesMvp.SelectedAssigneesListener) getParentFragment(); + } else if (context instanceof AssigneesMvp.SelectedAssigneesListener) { + callback = (AssigneesMvp.SelectedAssigneesListener) context; + } else { + throw new IllegalArgumentException("Parent Fragment or Activity must implement AssigneesMvp.SelectedAssigneesListener"); + } + } + + @Override public void onDetach() { + super.onDetach(); + callback = null; + } + + public static AssigneesView newInstance(@NonNull List models) { + AssigneesView fragment = new AssigneesView(); + fragment.setArguments(Bundler.start().putParcelableArrayList(BundleConstant.ITEM, (ArrayList) models).end()); + return fragment; + } + + @Override protected int fragmentLayout() { + return R.layout.simple_footer_list_dialog; + } + + @Override protected void onFragmentCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + title.setText(R.string.assignees); + List list = getArguments().getParcelableArrayList(BundleConstant.ITEM); + if (list != null) { + adapter = new AssigneesAdapter(list, this); + recycler.setAdapter(adapter); + } + } + + @NonNull @Override public AssigneesPresenter providePresenter() { + return new AssigneesPresenter(); + } + + @Override public boolean isAssigneeSelected(int position) { + return getSelectionMap().get(position) != null; + } + + @Override public void onToggleSelection(int position, boolean select) { + if (select) { + getSelectionMap().put(position, adapter.getItem(position)); + } else { + getSelectionMap().remove(position); + } + adapter.notifyDataSetChanged(); + } + + @OnClick({R.id.cancel, R.id.ok}) public void onClick(View view) { + switch (view.getId()) { + case R.id.cancel: + dismiss(); + break; + case R.id.ok: + ArrayList labels = Stream.of(selectionMap) + .filter(value -> value.getValue() != null) + .map(Map.Entry::getValue) + .collect(Collectors.toCollection(ArrayList::new)); + if (labels != null && !labels.isEmpty()) { + callback.onSelectedAssignees(labels); + } + dismiss(); + break; + } + } + + public HashMap getSelectionMap() { + if (selectionMap == null) { + selectionMap = new LinkedHashMap<>(); + } + return selectionMap; + } +} diff --git a/app/src/main/java/com/fastaccess/ui/modules/repos/labels/LabelsMvp.java b/app/src/main/java/com/fastaccess/ui/modules/repos/extras/labels/LabelsMvp.java similarity index 90% rename from app/src/main/java/com/fastaccess/ui/modules/repos/labels/LabelsMvp.java rename to app/src/main/java/com/fastaccess/ui/modules/repos/extras/labels/LabelsMvp.java index 0c742053..3a7d5232 100644 --- a/app/src/main/java/com/fastaccess/ui/modules/repos/labels/LabelsMvp.java +++ b/app/src/main/java/com/fastaccess/ui/modules/repos/extras/labels/LabelsMvp.java @@ -1,4 +1,4 @@ -package com.fastaccess.ui.modules.repos.labels; +package com.fastaccess.ui.modules.repos.extras.labels; import android.support.annotation.NonNull; diff --git a/app/src/main/java/com/fastaccess/ui/modules/repos/extras/labels/LabelsPresenter.java b/app/src/main/java/com/fastaccess/ui/modules/repos/extras/labels/LabelsPresenter.java new file mode 100644 index 00000000..7e94210c --- /dev/null +++ b/app/src/main/java/com/fastaccess/ui/modules/repos/extras/labels/LabelsPresenter.java @@ -0,0 +1,9 @@ +package com.fastaccess.ui.modules.repos.extras.labels; + +import com.fastaccess.ui.base.mvp.presenter.BasePresenter; + +/** + * Created by Kosh on 22 Feb 2017, 7:23 PM + */ + +class LabelsPresenter extends BasePresenter implements LabelsMvp.Presenter {} diff --git a/app/src/main/java/com/fastaccess/ui/modules/repos/labels/LabelsView.java b/app/src/main/java/com/fastaccess/ui/modules/repos/extras/labels/LabelsView.java similarity index 97% rename from app/src/main/java/com/fastaccess/ui/modules/repos/labels/LabelsView.java rename to app/src/main/java/com/fastaccess/ui/modules/repos/extras/labels/LabelsView.java index 69df36c5..1e0784e0 100644 --- a/app/src/main/java/com/fastaccess/ui/modules/repos/labels/LabelsView.java +++ b/app/src/main/java/com/fastaccess/ui/modules/repos/extras/labels/LabelsView.java @@ -1,4 +1,4 @@ -package com.fastaccess.ui.modules.repos.labels; +package com.fastaccess.ui.modules.repos.extras.labels; import android.content.Context; import android.os.Bundle; @@ -89,7 +89,7 @@ public class LabelsView extends BaseDialogFragment onAddMilestone()); toolbar.inflateMenu(R.menu.add_menu); + toolbar.setNavigationIcon(R.drawable.ic_back); + toolbar.setNavigationOnClickListener(v -> getActivity().finish()); adapter = new MilestonesAdapter(getPresenter().getMilestones()); adapter.setListener(getPresenter()); recycler.setEmptyView(stateLayout, refresh); diff --git a/app/src/main/java/com/fastaccess/ui/modules/repos/issues/issue/details/IssuePagerMvp.java b/app/src/main/java/com/fastaccess/ui/modules/repos/issues/issue/details/IssuePagerMvp.java index 3a3476ff..d20abaee 100644 --- a/app/src/main/java/com/fastaccess/ui/modules/repos/issues/issue/details/IssuePagerMvp.java +++ b/app/src/main/java/com/fastaccess/ui/modules/repos/issues/issue/details/IssuePagerMvp.java @@ -8,8 +8,10 @@ import android.support.annotation.Nullable; import com.fastaccess.data.dao.IssueModel; import com.fastaccess.data.dao.LabelModel; import com.fastaccess.data.dao.MilestoneModel; +import com.fastaccess.data.dao.UserModel; import com.fastaccess.ui.base.mvp.BaseMvp; -import com.fastaccess.ui.modules.repos.labels.LabelsMvp; +import com.fastaccess.ui.modules.repos.extras.assignees.AssigneesMvp; +import com.fastaccess.ui.modules.repos.extras.labels.LabelsMvp; import java.util.ArrayList; import java.util.List; @@ -20,7 +22,8 @@ import java.util.List; interface IssuePagerMvp { - interface View extends BaseMvp.FAView, LabelsMvp.SelectedLabelsListener { + interface View extends BaseMvp.FAView, LabelsMvp.SelectedLabelsListener, + AssigneesMvp.SelectedAssigneesListener { void onSetupIssue(); void showSuccessIssueActionMsg(boolean isClose); @@ -32,6 +35,8 @@ interface IssuePagerMvp { void onUpdateTimeline(); void onUpdateMenu(); + + void onShowAssignees(@NonNull List items); } interface Presenter extends BaseMvp.FAPresenter { @@ -58,10 +63,14 @@ interface IssuePagerMvp { void onLoadLabels(); + void onLoadAssignees(); + void onPutMilestones(@NonNull MilestoneModel milestone); void onPutLabels(@NonNull ArrayList labels); + void onPutAssignees(@NonNull ArrayList users); + String getLogin(); String getRepoId(); diff --git a/app/src/main/java/com/fastaccess/ui/modules/repos/issues/issue/details/IssuePagerPresenter.java b/app/src/main/java/com/fastaccess/ui/modules/repos/issues/issue/details/IssuePagerPresenter.java index 2cf15a3c..5de3a37e 100644 --- a/app/src/main/java/com/fastaccess/ui/modules/repos/issues/issue/details/IssuePagerPresenter.java +++ b/app/src/main/java/com/fastaccess/ui/modules/repos/issues/issue/details/IssuePagerPresenter.java @@ -9,6 +9,7 @@ import android.text.TextUtils; import com.annimon.stream.Collectors; import com.annimon.stream.Stream; import com.fastaccess.R; +import com.fastaccess.data.dao.AssigneesRequestModel; import com.fastaccess.data.dao.IssueModel; import com.fastaccess.data.dao.IssueRequestModel; import com.fastaccess.data.dao.LabelListModel; @@ -17,6 +18,7 @@ import com.fastaccess.data.dao.LoginModel; import com.fastaccess.data.dao.MilestoneModel; import com.fastaccess.data.dao.PullsIssuesParser; import com.fastaccess.data.dao.UserModel; +import com.fastaccess.data.dao.UsersListModel; import com.fastaccess.data.dao.types.IssueState; import com.fastaccess.data.service.IssueService; import com.fastaccess.helper.BundleConstant; @@ -192,6 +194,17 @@ class IssuePagerPresenter extends BasePresenter implements I ); } + @Override public void onLoadAssignees() { + makeRestCall(RestProvider.getRepoService().getAssignees(login, repoId), + response -> { + if (response != null && response.getItems() != null && !response.getItems().isEmpty()) { + sendToView(view -> view.onShowAssignees(response.getItems())); + } else { + sendToView(view -> view.showMessage(R.string.error, R.string.no_assignees)); + } + }); + } + @Override public void onPutMilestones(@NonNull MilestoneModel milestone) { issueModel.setMilestone(milestone); IssueRequestModel issueRequestModel = IssueRequestModel.clone(issueModel, false); @@ -219,6 +232,25 @@ class IssuePagerPresenter extends BasePresenter implements I }); } + @Override public void onPutAssignees(@NonNull ArrayList users) { + AssigneesRequestModel assigneesRequestModel = new AssigneesRequestModel(); + ArrayList assignees = new ArrayList<>(); + Stream.of(users).forEach(userModel -> assignees.add(userModel.getLogin())); + assigneesRequestModel.setAssignees(assignees); + makeRestCall(RestProvider.getIssueService().putAssignees(login, repoId, issueNumber, assigneesRequestModel), + issue -> { + this.issueModel = issue; + issueModel.setLogin(login); + issueModel.setRepoId(repoId); + UsersListModel assignee = new UsersListModel(); + assignee.addAll(users); + issueModel.setAssignees(assignee); + manageSubscription(issueModel.save().subscribe()); + sendToView(IssuePagerMvp.View::onUpdateTimeline); + } + ); + } + @Override public String getLogin() { return login; } diff --git a/app/src/main/java/com/fastaccess/ui/modules/repos/issues/issue/details/IssuePagerView.java b/app/src/main/java/com/fastaccess/ui/modules/repos/issues/issue/details/IssuePagerView.java index a087c2b8..b6e1913a 100644 --- a/app/src/main/java/com/fastaccess/ui/modules/repos/issues/issue/details/IssuePagerView.java +++ b/app/src/main/java/com/fastaccess/ui/modules/repos/issues/issue/details/IssuePagerView.java @@ -27,11 +27,12 @@ import com.fastaccess.helper.Logger; import com.fastaccess.helper.ParseDateFormat; import com.fastaccess.ui.adapter.FragmentsPagerAdapter; import com.fastaccess.ui.base.BaseActivity; +import com.fastaccess.ui.modules.repos.extras.assignees.AssigneesView; +import com.fastaccess.ui.modules.repos.extras.labels.LabelsView; import com.fastaccess.ui.modules.repos.extras.milestone.create.MilestoneActivityView; import com.fastaccess.ui.modules.repos.issues.create.CreateIssueView; import com.fastaccess.ui.modules.repos.issues.issue.details.comments.IssueCommentsView; import com.fastaccess.ui.modules.repos.issues.issue.details.events.IssueDetailsView; -import com.fastaccess.ui.modules.repos.labels.LabelsView; import com.fastaccess.ui.widgets.AvatarLayout; import com.fastaccess.ui.widgets.FontTextView; import com.fastaccess.ui.widgets.ForegroundImageView; @@ -170,6 +171,10 @@ public class IssuePagerView extends BaseActivity items) { + hideProgress(); + AssigneesView.newInstance(items) + .show(getSupportFragmentManager(), "AssigneesView"); + } + @Override public void onMessageDialogActionClicked(boolean isOk, @Nullable Bundle bundle) { super.onMessageDialogActionClicked(isOk, bundle); if (isOk) { @@ -291,6 +301,10 @@ public class IssuePagerView extends BaseActivity users) { + getPresenter().onPutAssignees(users); + } + private void hideShowFab() { if (getPresenter().isLocked() && !getPresenter().isOwner()) { fab.hide(); diff --git a/app/src/main/java/com/fastaccess/ui/modules/repos/labels/LabelsPresenter.java b/app/src/main/java/com/fastaccess/ui/modules/repos/labels/LabelsPresenter.java deleted file mode 100644 index 7b8af30f..00000000 --- a/app/src/main/java/com/fastaccess/ui/modules/repos/labels/LabelsPresenter.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.fastaccess.ui.modules.repos.labels; - -import com.fastaccess.ui.base.mvp.presenter.BasePresenter; - -/** - * Created by Kosh on 22 Feb 2017, 7:23 PM - */ - -public class LabelsPresenter extends BasePresenter implements LabelsMvp.Presenter {} diff --git a/app/src/main/java/com/fastaccess/ui/modules/repos/pull_requests/pull_request/details/PullRequestPagerMvp.java b/app/src/main/java/com/fastaccess/ui/modules/repos/pull_requests/pull_request/details/PullRequestPagerMvp.java index 80ac9797..5c97fbb4 100644 --- a/app/src/main/java/com/fastaccess/ui/modules/repos/pull_requests/pull_request/details/PullRequestPagerMvp.java +++ b/app/src/main/java/com/fastaccess/ui/modules/repos/pull_requests/pull_request/details/PullRequestPagerMvp.java @@ -9,8 +9,10 @@ import android.support.annotation.Nullable; import com.fastaccess.data.dao.LabelModel; import com.fastaccess.data.dao.MilestoneModel; import com.fastaccess.data.dao.PullRequestModel; +import com.fastaccess.data.dao.UserModel; import com.fastaccess.ui.base.mvp.BaseMvp; -import com.fastaccess.ui.modules.repos.labels.LabelsMvp; +import com.fastaccess.ui.modules.repos.extras.assignees.AssigneesMvp; +import com.fastaccess.ui.modules.repos.extras.labels.LabelsMvp; import com.fastaccess.ui.widgets.SpannableBuilder; import java.util.ArrayList; @@ -22,8 +24,8 @@ import java.util.List; interface PullRequestPagerMvp { - interface - View extends BaseMvp.FAView, LabelsMvp.SelectedLabelsListener { + interface View extends BaseMvp.FAView, LabelsMvp.SelectedLabelsListener, + AssigneesMvp.SelectedAssigneesListener { void onSetupIssue(); @@ -36,6 +38,8 @@ interface PullRequestPagerMvp { void showErrorIssueActionMsg(boolean isClose); void onUpdateTimeline(); + + void onShowAssignees(@NonNull List items); } interface Presenter extends BaseMvp.FAPresenter { @@ -66,10 +70,14 @@ interface PullRequestPagerMvp { void onLoadLabels(); + void onLoadAssignees(); + void onPutLabels(@NonNull ArrayList labels); void onPutMilestones(@NonNull MilestoneModel milestone); + void onPutAssignees(@NonNull ArrayList users); + String getLogin(); String getRepoId(); diff --git a/app/src/main/java/com/fastaccess/ui/modules/repos/pull_requests/pull_request/details/PullRequestPagerPresenter.java b/app/src/main/java/com/fastaccess/ui/modules/repos/pull_requests/pull_request/details/PullRequestPagerPresenter.java index ff085bb0..b561a251 100644 --- a/app/src/main/java/com/fastaccess/ui/modules/repos/pull_requests/pull_request/details/PullRequestPagerPresenter.java +++ b/app/src/main/java/com/fastaccess/ui/modules/repos/pull_requests/pull_request/details/PullRequestPagerPresenter.java @@ -10,6 +10,7 @@ import android.text.TextUtils; import com.annimon.stream.Collectors; import com.annimon.stream.Stream; import com.fastaccess.R; +import com.fastaccess.data.dao.AssigneesRequestModel; import com.fastaccess.data.dao.IssueRequestModel; import com.fastaccess.data.dao.LabelListModel; import com.fastaccess.data.dao.LabelModel; @@ -19,6 +20,7 @@ import com.fastaccess.data.dao.MilestoneModel; import com.fastaccess.data.dao.PullRequestModel; import com.fastaccess.data.dao.PullsIssuesParser; import com.fastaccess.data.dao.UserModel; +import com.fastaccess.data.dao.UsersListModel; import com.fastaccess.data.dao.types.IssueState; import com.fastaccess.data.service.IssueService; import com.fastaccess.helper.BundleConstant; @@ -191,6 +193,17 @@ class PullRequestPagerPresenter extends BasePresenter ); } + @Override public void onLoadAssignees() { + makeRestCall(RestProvider.getRepoService().getAssignees(login, repoId), + response -> { + if (response != null && response.getItems() != null && !response.getItems().isEmpty()) { + sendToView(view -> view.onShowAssignees(response.getItems())); + } else { + sendToView(view -> view.showMessage(R.string.error, R.string.no_assignees)); + } + }); + } + @Override public void onPutLabels(@NonNull ArrayList labels) { makeRestCall(RestProvider.getIssueService().putLabels(login, repoId, issueNumber, Stream.of(labels).filter(value -> value != null && value.getName() != null) @@ -218,6 +231,25 @@ class PullRequestPagerPresenter extends BasePresenter } + @Override public void onPutAssignees(@NonNull ArrayList users) { + AssigneesRequestModel assigneesRequestModel = new AssigneesRequestModel(); + ArrayList assignees = new ArrayList<>(); + Stream.of(users).forEach(userModel -> assignees.add(userModel.getLogin())); + assigneesRequestModel.setAssignees(assignees); + makeRestCall(RestProvider.getPullRequestSerice().putAssignees(login, repoId, issueNumber, assigneesRequestModel), + issue -> { + this.pullRequest = issue; + pullRequest.setLogin(login); + pullRequest.setRepoId(repoId); + UsersListModel assignee = new UsersListModel(); + assignee.addAll(users); + pullRequest.setAssignees(assignee); + manageSubscription(pullRequest.save().subscribe()); + sendToView(PullRequestPagerMvp.View::onUpdateTimeline); + } + ); + } + @Override public void onMerge() { if (isMergeable() && (isCollaborator() || isRepoOwner())) {//double the checking MergeRequestModel mergeRequestModel = new MergeRequestModel(); diff --git a/app/src/main/java/com/fastaccess/ui/modules/repos/pull_requests/pull_request/details/PullRequestPagerView.java b/app/src/main/java/com/fastaccess/ui/modules/repos/pull_requests/pull_request/details/PullRequestPagerView.java index 4c8b8605..f9015f5a 100644 --- a/app/src/main/java/com/fastaccess/ui/modules/repos/pull_requests/pull_request/details/PullRequestPagerView.java +++ b/app/src/main/java/com/fastaccess/ui/modules/repos/pull_requests/pull_request/details/PullRequestPagerView.java @@ -26,10 +26,11 @@ import com.fastaccess.helper.InputHelper; import com.fastaccess.helper.Logger; import com.fastaccess.ui.adapter.FragmentsPagerAdapter; import com.fastaccess.ui.base.BaseActivity; +import com.fastaccess.ui.modules.repos.extras.assignees.AssigneesView; +import com.fastaccess.ui.modules.repos.extras.labels.LabelsView; import com.fastaccess.ui.modules.repos.extras.milestone.create.MilestoneActivityView; import com.fastaccess.ui.modules.repos.issues.create.CreateIssueView; import com.fastaccess.ui.modules.repos.issues.issue.details.comments.IssueCommentsView; -import com.fastaccess.ui.modules.repos.labels.LabelsView; import com.fastaccess.ui.modules.repos.pull_requests.pull_request.details.events.PullRequestDetailsView; import com.fastaccess.ui.widgets.AvatarLayout; import com.fastaccess.ui.widgets.FontTextView; @@ -165,6 +166,10 @@ public class PullRequestPagerView extends BaseActivity users) { + getPresenter().onPutAssignees(users); + } + @Override public void showSuccessIssueActionMsg(boolean isClose) { hideProgress(); if (isClose) { @@ -280,6 +289,12 @@ public class PullRequestPagerView extends BaseActivity items) { + hideProgress(); + AssigneesView.newInstance(items) + .show(getSupportFragmentManager(), "AssigneesView"); + } + private void hideShowFab() { if (getPresenter().isLocked() && !getPresenter().isOwner()) { fab.hide(); diff --git a/app/src/main/res/menu/issue_menu.xml b/app/src/main/res/menu/issue_menu.xml index 37066f75..2a011d1a 100644 --- a/app/src/main/res/menu/issue_menu.xml +++ b/app/src/main/res/menu/issue_menu.xml @@ -10,10 +10,24 @@ android:title="@string/action" app:showAsAction="always"> + + + + + + - - - - \ No newline at end of file diff --git a/app/src/main/res/menu/pull_request_menu.xml b/app/src/main/res/menu/pull_request_menu.xml index e67fa646..568cdf30 100644 --- a/app/src/main/res/menu/pull_request_menu.xml +++ b/app/src/main/res/menu/pull_request_menu.xml @@ -10,10 +10,23 @@ android:title="@string/action" app:showAsAction="always"> + + + + + - - - - \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 5a724480..584d6afd 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -226,4 +226,5 @@ Create Milestone Error creating milestone Due On + No Assignees