From 2a972785d2e756881ad7f78ce3dbe6f0c18136d0 Mon Sep 17 00:00:00 2001 From: Kosh Date: Wed, 29 Mar 2017 22:36:35 +0800 Subject: [PATCH] changed how comments are handled such as delete, edit & reply, now you can add reactions to comments, left issue,pr & commits descriptions. #194. probably this will be closed tomorrow. --- app/src/main/AndroidManifest.xml | 2 +- .../data/dao/PostReactionModel.java | 30 ++++ .../data/dao/model/ReactionsModel.java | 9 +- .../data/dao/types/ReactionTypes.java | 23 +++ .../data/service/ReactionsService.java | 32 +++++ .../java/com/fastaccess/helper/RxHelper.java | 2 +- .../provider/rest/RestProvider.java | 5 + .../provider/tasks/git/ReactionService.java | 105 ++++++++++++++ .../NotificationSchedulerJobTask.java | 2 +- .../ui/adapter/CommentsAdapter.java | 11 +- .../ui/adapter/CommitFilesAdapter.java | 14 +- .../ui/adapter/callback/OnToggleView.java | 7 + .../viewholder/CommentsViewHolder.java | 69 ++++++++- .../viewholder/CommitFilesViewHolder.java | 16 +-- .../gists/gist/comments/GistCommentsMvp.java | 3 +- .../gist/comments/GistCommentsPresenter.java | 1 - .../gists/gist/comments/GistCommentsView.java | 23 ++- .../details/comments/CommitCommentsMvp.java | 3 +- .../comments/CommitCommentsPresenter.java | 52 +++++-- .../details/comments/CommitCommentsView.java | 23 ++- .../commit/details/files/CommitFilesMvp.java | 4 +- .../details/comments/IssueCommentsMvp.java | 3 +- .../comments/IssueCommentsPresenter.java | 54 +++++-- .../details/comments/IssueCommentsView.java | 26 +++- .../layout/comments_dropdown_layout.xml | 132 ++++++++++++++++++ .../row_layouts/layout/comments_row_item.xml | 110 ++------------- app/src/main/res/values/strings.xml | 1 + 27 files changed, 601 insertions(+), 161 deletions(-) create mode 100644 app/src/main/java/com/fastaccess/data/dao/PostReactionModel.java create mode 100644 app/src/main/java/com/fastaccess/data/dao/types/ReactionTypes.java create mode 100644 app/src/main/java/com/fastaccess/data/service/ReactionsService.java create mode 100644 app/src/main/java/com/fastaccess/provider/tasks/git/ReactionService.java create mode 100644 app/src/main/java/com/fastaccess/ui/adapter/callback/OnToggleView.java create mode 100644 app/src/main/res/layouts/row_layouts/layout/comments_dropdown_layout.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 8429ca4e..d2dc3f96 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -197,9 +197,9 @@ - + \ No newline at end of file diff --git a/app/src/main/java/com/fastaccess/data/dao/PostReactionModel.java b/app/src/main/java/com/fastaccess/data/dao/PostReactionModel.java new file mode 100644 index 00000000..0a513f9a --- /dev/null +++ b/app/src/main/java/com/fastaccess/data/dao/PostReactionModel.java @@ -0,0 +1,30 @@ +package com.fastaccess.data.dao; + +import android.os.Parcel; +import android.os.Parcelable; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +/** + * Created by Kosh on 29 Mar 2017, 9:50 PM + */ + +@Getter @Setter @NoArgsConstructor @AllArgsConstructor public class PostReactionModel implements Parcelable { + + private String content; + + @Override public int describeContents() { return 0; } + + @Override public void writeToParcel(Parcel dest, int flags) {dest.writeString(this.content);} + + protected PostReactionModel(Parcel in) {this.content = in.readString();} + + public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { + @Override public PostReactionModel createFromParcel(Parcel source) {return new PostReactionModel(source);} + + @Override public PostReactionModel[] newArray(int size) {return new PostReactionModel[size];} + }; +} diff --git a/app/src/main/java/com/fastaccess/data/dao/model/ReactionsModel.java b/app/src/main/java/com/fastaccess/data/dao/model/ReactionsModel.java index 396fa156..9240422b 100644 --- a/app/src/main/java/com/fastaccess/data/dao/model/ReactionsModel.java +++ b/app/src/main/java/com/fastaccess/data/dao/model/ReactionsModel.java @@ -14,6 +14,7 @@ import lombok.Setter; @Getter @Setter public class ReactionsModel implements Parcelable { + private long id; private String url; private int total_count; @SerializedName("+1") private int plusOne; // FIXME check this code @@ -23,9 +24,12 @@ import lombok.Setter; private int confused; private int heart; + public ReactionsModel() {} + @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel dest, int flags) { + dest.writeLong(this.id); dest.writeString(this.url); dest.writeInt(this.total_count); dest.writeInt(this.plusOne); @@ -36,9 +40,8 @@ import lombok.Setter; dest.writeInt(this.heart); } - public ReactionsModel() {} - protected ReactionsModel(Parcel in) { + this.id = in.readLong(); this.url = in.readString(); this.total_count = in.readInt(); this.plusOne = in.readInt(); @@ -49,7 +52,7 @@ import lombok.Setter; this.heart = in.readInt(); } - public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { + public static final Creator CREATOR = new Creator() { @Override public ReactionsModel createFromParcel(Parcel source) {return new ReactionsModel(source);} @Override public ReactionsModel[] newArray(int size) {return new ReactionsModel[size];} diff --git a/app/src/main/java/com/fastaccess/data/dao/types/ReactionTypes.java b/app/src/main/java/com/fastaccess/data/dao/types/ReactionTypes.java new file mode 100644 index 00000000..8108de23 --- /dev/null +++ b/app/src/main/java/com/fastaccess/data/dao/types/ReactionTypes.java @@ -0,0 +1,23 @@ +package com.fastaccess.data.dao.types; + +/** + * Created by Kosh on 29 Mar 2017, 10:11 PM + */ + +public enum ReactionTypes { + + HEART("heart"), + HOORAY("hooray"), + PLUS_ONE("+1"), + MINUS_ONE("-1"), + CONFUSED("confused"), + LAUGH("laugh"); + + private String content; + + ReactionTypes(String content) {this.content = content;} + + public String getContent() { + return content; + } +} diff --git a/app/src/main/java/com/fastaccess/data/service/ReactionsService.java b/app/src/main/java/com/fastaccess/data/service/ReactionsService.java new file mode 100644 index 00000000..30ffe2e6 --- /dev/null +++ b/app/src/main/java/com/fastaccess/data/service/ReactionsService.java @@ -0,0 +1,32 @@ +package com.fastaccess.data.service; + +import android.support.annotation.NonNull; + +import com.fastaccess.data.dao.PostReactionModel; + +import retrofit2.http.Body; +import retrofit2.http.Headers; +import retrofit2.http.POST; +import retrofit2.http.Path; +import rx.Observable; + +/** + * Created by Kosh on 29 Mar 2017, 9:48 PM + */ +public interface ReactionsService { + + @POST("/repos/{owner}/{repo}/issues/comments/{id}/reactions") + @Headers("Accept: application/vnd.github.squirrel-girl-preview") + Observable postIssueReaction(@NonNull @Body PostReactionModel body, + @NonNull @Path("owner") String owner, + @Path("repo") @NonNull String repo, + @Path("id") long id); + + @POST("/repos/{owner}/{repo}/comments/{id}/reactions") + @Headers("Accept: application/vnd.github.squirrel-girl-preview") + Observable postCommitReaction(@NonNull @Body PostReactionModel body, + @NonNull @Path("owner") String owner, + @Path("repo") @NonNull String repo, + @Path("id") long id); +} + diff --git a/app/src/main/java/com/fastaccess/helper/RxHelper.java b/app/src/main/java/com/fastaccess/helper/RxHelper.java index b3ed821f..9b52fe78 100644 --- a/app/src/main/java/com/fastaccess/helper/RxHelper.java +++ b/app/src/main/java/com/fastaccess/helper/RxHelper.java @@ -23,7 +23,7 @@ public class RxHelper { .observeOn(AndroidSchedulers.mainThread()); } - public static Observable saveObserable(@NonNull Observable observable) { + public static Observable safeObservable(@NonNull Observable observable) { return getObserver(observable).onErrorReturn(throwable -> null); } } diff --git a/app/src/main/java/com/fastaccess/provider/rest/RestProvider.java b/app/src/main/java/com/fastaccess/provider/rest/RestProvider.java index c0d85a4e..fb5fc62c 100644 --- a/app/src/main/java/com/fastaccess/provider/rest/RestProvider.java +++ b/app/src/main/java/com/fastaccess/provider/rest/RestProvider.java @@ -16,6 +16,7 @@ import com.fastaccess.data.service.GistService; import com.fastaccess.data.service.IssueService; import com.fastaccess.data.service.NotificationService; import com.fastaccess.data.service.PullRequestService; +import com.fastaccess.data.service.ReactionsService; import com.fastaccess.data.service.RepoService; import com.fastaccess.data.service.SearchService; import com.fastaccess.data.service.UserRestService; @@ -157,6 +158,10 @@ public class RestProvider { return provideRetrofit().create(NotificationService.class); } + @NonNull public static ReactionsService getReactionsService() { + return provideRetrofit().create(ReactionsService.class); + } + @Nullable public static GitHubErrorResponse getErrorResponse(@NonNull Throwable throwable) { ResponseBody body = null; if (throwable instanceof HttpException) { diff --git a/app/src/main/java/com/fastaccess/provider/tasks/git/ReactionService.java b/app/src/main/java/com/fastaccess/provider/tasks/git/ReactionService.java new file mode 100644 index 00000000..c90a1457 --- /dev/null +++ b/app/src/main/java/com/fastaccess/provider/tasks/git/ReactionService.java @@ -0,0 +1,105 @@ +package com.fastaccess.provider.tasks.git; + +import android.app.IntentService; +import android.app.NotificationManager; +import android.content.Context; +import android.content.Intent; +import android.os.Bundle; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; +import android.support.v4.app.NotificationCompat; + +import com.fastaccess.R; +import com.fastaccess.data.dao.PostReactionModel; +import com.fastaccess.data.dao.types.ReactionTypes; +import com.fastaccess.helper.BundleConstant; +import com.fastaccess.helper.Bundler; +import com.fastaccess.helper.InputHelper; +import com.fastaccess.helper.RxHelper; +import com.fastaccess.provider.rest.RestProvider; + +/** + * Created by Kosh on 29 Mar 2017, 9:59 PM + */ + +public class ReactionService extends IntentService { + + private NotificationCompat.Builder notification; + private NotificationManager notificationManager; + + public static void start(@NonNull Context context, @NonNull String login, @NonNull String repo, + long commentId, ReactionTypes reactionType, boolean isCommit) { + Intent intent = new Intent(context, ReactionService.class); + intent.putExtras(Bundler.start() + .put(BundleConstant.EXTRA, isCommit) + .put(BundleConstant.EXTRA_TWO, login) + .put(BundleConstant.EXTRA_THREE, repo) + .put(BundleConstant.ID, commentId) + .put(BundleConstant.EXTRA_TYPE, reactionType) + .end()); + context.startService(intent); + } + + public ReactionService() { + super(ReactionService.class.getSimpleName()); + } + + @Override protected void onHandleIntent(@Nullable Intent intent) { + if (intent != null && intent.getExtras() != null) { + Bundle bundle = intent.getExtras(); + ReactionTypes reactionType = (ReactionTypes) bundle.getSerializable(BundleConstant.EXTRA_TYPE); + boolean isCommit = bundle.getBoolean(BundleConstant.EXTRA); + String login = bundle.getString(BundleConstant.EXTRA_TWO); + String repo = bundle.getString(BundleConstant.EXTRA_THREE); + long commentId = bundle.getLong(BundleConstant.ID); + if (InputHelper.isEmpty(login) || InputHelper.isEmpty(repo) || reactionType == null) { + stopSelf(); + return; + } + if (isCommit) { + postCommit(reactionType, login, repo, commentId); + } else { + post(reactionType, login, repo, commentId); + } + } + } + + private void post(@NonNull ReactionTypes reactionType, @NonNull String login, @NonNull String repo, long commentId) { + RxHelper.safeObservable(RestProvider.getReactionsService() + .postIssueReaction(new PostReactionModel(reactionType.getContent()), login, repo, commentId)) + .doOnSubscribe(() -> showNotificatin(getNotification(reactionType), (int) commentId)) + .subscribe(response -> hideNotificat((int) commentId), throwable -> hideNotificat((int) commentId)); + } + + private void postCommit(@NonNull ReactionTypes reactionType, @NonNull String login, @NonNull String repo, long commentId) { + RxHelper.safeObservable(RestProvider.getReactionsService() + .postCommitReaction(new PostReactionModel(reactionType.getContent()), login, repo, commentId)) + .doOnSubscribe(() -> showNotificatin(getNotification(reactionType), (int) commentId)) + .subscribe(response -> hideNotificat((int) commentId), throwable -> hideNotificat((int) commentId)); + } + + public NotificationCompat.Builder getNotification(@NonNull ReactionTypes reactionTypes) { + if (notification == null) { + notification = new NotificationCompat.Builder(this) + .setSmallIcon(R.drawable.ic_sync) + .setProgress(0, 100, true); + } + notification.setContentTitle(getString(R.string.posting_reaction, reactionTypes.getContent())); + return notification; + } + + public NotificationManager getNotificationManager() { + if (notificationManager == null) { + notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); + } + return notificationManager; + } + + private void showNotificatin(@NonNull NotificationCompat.Builder builder, int id) { + getNotificationManager().notify(id, builder.build()); + } + + private void hideNotificat(int id) { + getNotificationManager().cancel(id); + } +} diff --git a/app/src/main/java/com/fastaccess/provider/tasks/notification/NotificationSchedulerJobTask.java b/app/src/main/java/com/fastaccess/provider/tasks/notification/NotificationSchedulerJobTask.java index 5ff9e49b..b936b5eb 100644 --- a/app/src/main/java/com/fastaccess/provider/tasks/notification/NotificationSchedulerJobTask.java +++ b/app/src/main/java/com/fastaccess/provider/tasks/notification/NotificationSchedulerJobTask.java @@ -91,7 +91,7 @@ public class NotificationSchedulerJobTask extends JobService { private void onSave(@Nullable List notificationThreadModels) { if (notificationThreadModels != null) { - RxHelper.saveObserable(Notification.save(notificationThreadModels)).subscribe(); + RxHelper.safeObservable(Notification.save(notificationThreadModels)).subscribe(); onNotifyUser(notificationThreadModels); } } diff --git a/app/src/main/java/com/fastaccess/ui/adapter/CommentsAdapter.java b/app/src/main/java/com/fastaccess/ui/adapter/CommentsAdapter.java index c51c0645..a077925c 100644 --- a/app/src/main/java/com/fastaccess/ui/adapter/CommentsAdapter.java +++ b/app/src/main/java/com/fastaccess/ui/adapter/CommentsAdapter.java @@ -4,6 +4,8 @@ import android.support.annotation.NonNull; import android.view.ViewGroup; import com.fastaccess.data.dao.model.Comment; +import com.fastaccess.data.dao.model.Login; +import com.fastaccess.ui.adapter.callback.OnToggleView; import com.fastaccess.ui.adapter.viewholder.CommentsViewHolder; import com.fastaccess.ui.widgets.recyclerview.BaseRecyclerAdapter; import com.fastaccess.ui.widgets.recyclerview.BaseViewHolder; @@ -16,12 +18,17 @@ import java.util.ArrayList; public class CommentsAdapter extends BaseRecyclerAdapter> { - public CommentsAdapter(@NonNull ArrayList eventsModels) { + private final OnToggleView onToggleView; + private final String login; + + public CommentsAdapter(@NonNull ArrayList eventsModels, @NonNull OnToggleView onToggleView) { super(eventsModels); + this.onToggleView = onToggleView; + this.login = Login.getUser().getLogin(); } @Override protected CommentsViewHolder viewHolder(ViewGroup parent, int viewType) { - return CommentsViewHolder.newInstance(parent, this); + return CommentsViewHolder.newInstance(parent, this, login, onToggleView); } @Override protected void onBindView(CommentsViewHolder holder, int position) { diff --git a/app/src/main/java/com/fastaccess/ui/adapter/CommitFilesAdapter.java b/app/src/main/java/com/fastaccess/ui/adapter/CommitFilesAdapter.java index 43fc1ffb..fe1f8e16 100644 --- a/app/src/main/java/com/fastaccess/ui/adapter/CommitFilesAdapter.java +++ b/app/src/main/java/com/fastaccess/ui/adapter/CommitFilesAdapter.java @@ -4,6 +4,7 @@ import android.support.annotation.NonNull; import android.view.ViewGroup; import com.fastaccess.data.dao.CommitFileModel; +import com.fastaccess.ui.adapter.callback.OnToggleView; import com.fastaccess.ui.adapter.viewholder.CommitFilesViewHolder; import com.fastaccess.ui.widgets.recyclerview.BaseRecyclerAdapter; import com.fastaccess.ui.widgets.recyclerview.BaseViewHolder; @@ -17,21 +18,16 @@ import java.util.ArrayList; public class CommitFilesAdapter extends BaseRecyclerAdapter> { - public interface OnTogglePatch { - void onToggle(int position, boolean isCollapsed); - boolean isCollapsed(int position); - } + @NonNull private OnToggleView onToggleView; - @NonNull private OnTogglePatch onTogglePatch; - - public CommitFilesAdapter(@NonNull ArrayList eventsModels, @NonNull OnTogglePatch onTogglePatch) { + public CommitFilesAdapter(@NonNull ArrayList eventsModels, @NonNull OnToggleView onToggleView) { super(eventsModels); - this.onTogglePatch = onTogglePatch; + this.onToggleView = onToggleView; } @Override protected CommitFilesViewHolder viewHolder(ViewGroup parent, int viewType) { - return CommitFilesViewHolder.newInstance(parent, this, onTogglePatch); + return CommitFilesViewHolder.newInstance(parent, this, onToggleView); } @Override protected void onBindView(CommitFilesViewHolder holder, int position) { diff --git a/app/src/main/java/com/fastaccess/ui/adapter/callback/OnToggleView.java b/app/src/main/java/com/fastaccess/ui/adapter/callback/OnToggleView.java new file mode 100644 index 00000000..eb92df92 --- /dev/null +++ b/app/src/main/java/com/fastaccess/ui/adapter/callback/OnToggleView.java @@ -0,0 +1,7 @@ +package com.fastaccess.ui.adapter.callback; + +public interface OnToggleView { + void onToggle(int position, boolean isCollapsed); + + boolean isCollapsed(int position); +} \ No newline at end of file diff --git a/app/src/main/java/com/fastaccess/ui/adapter/viewholder/CommentsViewHolder.java b/app/src/main/java/com/fastaccess/ui/adapter/viewholder/CommentsViewHolder.java index 6f31bb01..9ebccbc3 100644 --- a/app/src/main/java/com/fastaccess/ui/adapter/viewholder/CommentsViewHolder.java +++ b/app/src/main/java/com/fastaccess/ui/adapter/viewholder/CommentsViewHolder.java @@ -2,6 +2,8 @@ package com.fastaccess.ui.adapter.viewholder; import android.support.annotation.NonNull; import android.support.annotation.Nullable; +import android.support.v7.widget.AppCompatImageView; +import android.text.TextUtils; import android.view.View; import android.view.ViewGroup; @@ -10,6 +12,7 @@ import com.fastaccess.data.dao.model.Comment; import com.fastaccess.data.dao.model.ReactionsModel; import com.fastaccess.helper.InputHelper; import com.fastaccess.helper.ParseDateFormat; +import com.fastaccess.ui.adapter.callback.OnToggleView; import com.fastaccess.ui.widgets.AvatarLayout; import com.fastaccess.ui.widgets.FontTextView; import com.fastaccess.ui.widgets.recyclerview.BaseRecyclerAdapter; @@ -32,24 +35,71 @@ public class CommentsViewHolder extends BaseViewHolder { @BindView(R.id.thumbsDown) FontTextView thumbsDown; @BindView(R.id.laugh) FontTextView laugh; @BindView(R.id.sad) FontTextView sad; - @BindView(R.id.hurray) FontTextView hurray; + @BindView(R.id.hurray) FontTextView hooray; @BindView(R.id.heart) FontTextView heart; + @BindView(R.id.toggle) View toggle; + @BindView(R.id.delete) AppCompatImageView delete; + @BindView(R.id.reply) AppCompatImageView reply; + @BindView(R.id.edit) AppCompatImageView edit; + @BindView(R.id.commentOptions) View commentOptions; + @BindView(R.id.toggleHolder) View toggleHolder; + private String login; + private OnToggleView onToggleView; @Override public void onClick(View v) { - super.onClick(v); + if (v.getId() == R.id.toggle || v.getId() == R.id.toggleHolder) { + if (onToggleView != null) { + int position = getAdapterPosition(); + onToggleView.onToggle(position, !onToggleView.isCollapsed(position)); + } + } else { + switch (v.getId()) { + case R.id.heart: + break; + case R.id.sad: + break; + case R.id.thumbsDown: + break; + case R.id.thumbsUp: + break; + case R.id.laugh: + break; + case R.id.hurray: + break; + } + super.onClick(v); + } } - private CommentsViewHolder(@NonNull View itemView, @Nullable BaseRecyclerAdapter adapter) { + private CommentsViewHolder(@NonNull View itemView, @Nullable BaseRecyclerAdapter adapter, + @NonNull String login, @NonNull OnToggleView onToggleView) { super(itemView, adapter); + this.login = login; + this.onToggleView = onToggleView; + itemView.setOnClickListener(null); + itemView.setOnLongClickListener(null); + reply.setOnClickListener(this); + edit.setOnClickListener(this); + delete.setOnClickListener(this); + toggleHolder.setOnClickListener(this); + laugh.setOnClickListener(this); + sad.setOnClickListener(this); + thumbsDown.setOnClickListener(this); + thumbsUp.setOnClickListener(this); + hooray.setOnClickListener(this); + heart.setOnClickListener(this); } - public static CommentsViewHolder newInstance(@NonNull ViewGroup viewGroup, @Nullable BaseRecyclerAdapter adapter) { - return new CommentsViewHolder(getView(viewGroup, R.layout.comments_row_item), adapter); + public static CommentsViewHolder newInstance(@NonNull ViewGroup viewGroup, @Nullable BaseRecyclerAdapter adapter, + @NonNull String login, @NonNull OnToggleView onToggleView) { + return new CommentsViewHolder(getView(viewGroup, R.layout.comments_row_item), adapter, login, onToggleView); } @Override public void bind(@NonNull Comment commentsModel) { if (commentsModel.getUser() != null) { avatar.setUrl(commentsModel.getUser().getAvatarUrl(), commentsModel.getUser().getLogin()); + delete.setVisibility(TextUtils.equals(commentsModel.getUser().getLogin(), login) ? View.VISIBLE : View.GONE); + edit.setVisibility(TextUtils.equals(commentsModel.getUser().getLogin(), login) ? View.VISIBLE : View.GONE); } else { avatar.setUrl(null, null); } @@ -65,8 +115,15 @@ public class CommentsViewHolder extends BaseViewHolder { thumbsDown.setText(String.valueOf(reaction.getMinusOne())); sad.setText(String.valueOf(reaction.getConfused())); laugh.setText(String.valueOf(reaction.getLaugh())); - hurray.setText(String.valueOf(reaction.getHooray())); + hooray.setText(String.valueOf(reaction.getHooray())); heart.setText(String.valueOf(reaction.getHeart())); } + if (onToggleView != null) onToggle(onToggleView.isCollapsed(getAdapterPosition())); } + + private void onToggle(boolean expanded) { + toggle.setRotation(!expanded ? 0.0F : 180F); + commentOptions.setVisibility(!expanded ? View.GONE : View.VISIBLE); + } + } diff --git a/app/src/main/java/com/fastaccess/ui/adapter/viewholder/CommitFilesViewHolder.java b/app/src/main/java/com/fastaccess/ui/adapter/viewholder/CommitFilesViewHolder.java index 96e14a79..80de51ca 100644 --- a/app/src/main/java/com/fastaccess/ui/adapter/viewholder/CommitFilesViewHolder.java +++ b/app/src/main/java/com/fastaccess/ui/adapter/viewholder/CommitFilesViewHolder.java @@ -12,7 +12,7 @@ import android.view.ViewGroup; import com.fastaccess.R; import com.fastaccess.data.dao.CommitFileModel; -import com.fastaccess.ui.adapter.CommitFilesAdapter; +import com.fastaccess.ui.adapter.callback.OnToggleView; import com.fastaccess.ui.widgets.DiffLineSpan; import com.fastaccess.ui.widgets.FontTextView; import com.fastaccess.ui.widgets.SpannableBuilder; @@ -44,11 +44,11 @@ public class CommitFilesViewHolder extends BaseViewHolder { @BindColor(R.color.patch_ref_color) int patchRefColor; private String pathText; - private CommitFilesAdapter.OnTogglePatch onTogglePatch; + private OnToggleView onToggleView; @Override public void onClick(View v) { int position = getAdapterPosition(); - onTogglePatch.onToggle(position, !onTogglePatch.isCollapsed(position)); + onToggleView.onToggle(position, !onToggleView.isCollapsed(position)); } private void onToggle(boolean expanded) { @@ -64,14 +64,14 @@ public class CommitFilesViewHolder extends BaseViewHolder { } private CommitFilesViewHolder(@NonNull View itemView, @Nullable BaseRecyclerAdapter adapter, - @NonNull CommitFilesAdapter.OnTogglePatch onTogglePatch) { + @NonNull OnToggleView onToggleView) { super(itemView, adapter); - this.onTogglePatch = onTogglePatch; + this.onToggleView = onToggleView; } public static CommitFilesViewHolder newInstance(ViewGroup viewGroup, BaseRecyclerAdapter adapter, - @NonNull CommitFilesAdapter.OnTogglePatch onTogglePatch) { - return new CommitFilesViewHolder(getView(viewGroup, R.layout.commit_file_row_item), adapter, onTogglePatch); + @NonNull OnToggleView onToggleView) { + return new CommitFilesViewHolder(getView(viewGroup, R.layout.commit_file_row_item), adapter, onToggleView); } @Override public void bind(@NonNull CommitFileModel commit) { @@ -94,7 +94,7 @@ public class CommitFilesViewHolder extends BaseViewHolder { .append("\n") .bold(String.valueOf(commit.getStatus()))); - onToggle(onTogglePatch.isCollapsed(getAdapterPosition())); + onToggle(onToggleView.isCollapsed(getAdapterPosition())); } private void setPatchText(@NonNull String text) { diff --git a/app/src/main/java/com/fastaccess/ui/modules/gists/gist/comments/GistCommentsMvp.java b/app/src/main/java/com/fastaccess/ui/modules/gists/gist/comments/GistCommentsMvp.java index e28c3e3d..d419941f 100644 --- a/app/src/main/java/com/fastaccess/ui/modules/gists/gist/comments/GistCommentsMvp.java +++ b/app/src/main/java/com/fastaccess/ui/modules/gists/gist/comments/GistCommentsMvp.java @@ -8,6 +8,7 @@ import android.support.v4.widget.SwipeRefreshLayout; import com.fastaccess.data.dao.model.Comment; import com.fastaccess.data.dao.model.User; import com.fastaccess.provider.rest.loadmore.OnLoadMore; +import com.fastaccess.ui.adapter.callback.OnToggleView; import com.fastaccess.ui.base.mvp.BaseMvp; import com.fastaccess.ui.widgets.recyclerview.BaseViewHolder; @@ -20,7 +21,7 @@ import java.util.ArrayList; interface GistCommentsMvp { interface View extends BaseMvp.FAView, SwipeRefreshLayout.OnRefreshListener, - android.view.View.OnClickListener { + android.view.View.OnClickListener, OnToggleView { void onNotifyAdapter(); diff --git a/app/src/main/java/com/fastaccess/ui/modules/gists/gist/comments/GistCommentsPresenter.java b/app/src/main/java/com/fastaccess/ui/modules/gists/gist/comments/GistCommentsPresenter.java index b726222c..a2182513 100644 --- a/app/src/main/java/com/fastaccess/ui/modules/gists/gist/comments/GistCommentsPresenter.java +++ b/app/src/main/java/com/fastaccess/ui/modules/gists/gist/comments/GistCommentsPresenter.java @@ -76,7 +76,6 @@ class GistCommentsPresenter extends BasePresenter implemen return comments; } - @Override public void onHandleDeletion(@Nullable Bundle bundle) { if (bundle != null) { long commId = bundle.getLong(BundleConstant.EXTRA, 0); diff --git a/app/src/main/java/com/fastaccess/ui/modules/gists/gist/comments/GistCommentsView.java b/app/src/main/java/com/fastaccess/ui/modules/gists/gist/comments/GistCommentsView.java index 5fb83456..1f96b729 100644 --- a/app/src/main/java/com/fastaccess/ui/modules/gists/gist/comments/GistCommentsView.java +++ b/app/src/main/java/com/fastaccess/ui/modules/gists/gist/comments/GistCommentsView.java @@ -10,6 +10,7 @@ import android.support.v4.widget.SwipeRefreshLayout; import android.view.View; import com.fastaccess.R; +import com.fastaccess.data.dao.SparseBooleanArrayParcelable; import com.fastaccess.data.dao.model.Comment; import com.fastaccess.data.dao.model.User; import com.fastaccess.helper.BundleConstant; @@ -23,6 +24,7 @@ import com.fastaccess.ui.widgets.dialog.MessageDialogView; import com.fastaccess.ui.widgets.recyclerview.DynamicRecyclerView; import butterknife.BindView; +import icepick.State; import static com.fastaccess.helper.BundleConstant.ExtraTYpe.EDIT_GIST_COMMENT_EXTRA; import static com.fastaccess.helper.BundleConstant.ExtraTYpe.NEW_GIST_COMMENT_EXTRA; @@ -36,7 +38,7 @@ public class GistCommentsView extends BaseFragment onLoadMore; @@ -59,13 +61,14 @@ public class GistCommentsView extends BaseFragment impl } @Override public void onItemClick(int position, View v, Comment item) { + Login login = Login.getUser(); if (getView() != null) { - if (item.getUser() != null) { - Login login = Login.getUser(); + if (v.getId() == R.id.delete) { + if (login != null && item.getUser().getLogin().equals(login.getLogin())) { + if (getView() != null) getView().onShowDeleteMsg(item.getId()); + } + } else if (v.getId() == R.id.reply) { + getView().onTagUser(item.getUser()); + } else if (v.getId() == R.id.edit) { if (login != null && item.getUser().getLogin().equals(login.getLogin())) { getView().onEditComment(item); - } else { - getView().onTagUser(item.getUser()); } } else { - getView().onTagUser(item.getUser()); + handleReactions(v.getId(), item.getId(), v.getContext()); } } } - @Override public void onItemLongClick(int position, View v, Comment item) { - if (item.getUser() != null && TextUtils.equals(item.getUser().getLogin(), Login.getUser().getLogin())) { - if (getView() != null) getView().onShowDeleteMsg(item.getId()); - } else { - onItemClick(position, v, item); + private void handleReactions(@IdRes int id, long commentId, @NonNull Context context) { + ReactionTypes type = null; + switch (id) { + case R.id.heart: + type = ReactionTypes.HEART; + break; + case R.id.sad: + type = ReactionTypes.CONFUSED; + break; + case R.id.thumbsDown: + type = ReactionTypes.PLUS_ONE; + break; + case R.id.thumbsUp: + type = ReactionTypes.MINUS_ONE; + break; + case R.id.laugh: + type = ReactionTypes.LAUGH; + break; + case R.id.hurray: + type = ReactionTypes.HOORAY; + break; + } + if (type != null) { + ReactionService.start(context, login, repoId, commentId, type, true); } } + + @Override public void onItemLongClick(int position, View v, Comment item) { + onItemClick(position, v, item); + } } diff --git a/app/src/main/java/com/fastaccess/ui/modules/repos/code/commit/details/comments/CommitCommentsView.java b/app/src/main/java/com/fastaccess/ui/modules/repos/code/commit/details/comments/CommitCommentsView.java index d4107579..696dd2ca 100644 --- a/app/src/main/java/com/fastaccess/ui/modules/repos/code/commit/details/comments/CommitCommentsView.java +++ b/app/src/main/java/com/fastaccess/ui/modules/repos/code/commit/details/comments/CommitCommentsView.java @@ -10,6 +10,7 @@ import android.support.v4.widget.SwipeRefreshLayout; import android.view.View; import com.fastaccess.R; +import com.fastaccess.data.dao.SparseBooleanArrayParcelable; import com.fastaccess.data.dao.model.Comment; import com.fastaccess.data.dao.model.User; import com.fastaccess.helper.BundleConstant; @@ -23,6 +24,7 @@ import com.fastaccess.ui.widgets.dialog.MessageDialogView; import com.fastaccess.ui.widgets.recyclerview.DynamicRecyclerView; import butterknife.BindView; +import icepick.State; /** * Created by Kosh on 11 Nov 2016, 12:36 PM @@ -33,6 +35,8 @@ public class CommitCommentsView extends BaseFragment implem } @Override public void onItemClick(int position, View v, Comment item) { + Login login = Login.getUser(); if (getView() != null) { - if (item.getUser() != null) { - Login userModel = Login.getUser(); - if (userModel != null && item.getUser().getLogin().equals(userModel.getLogin())) { + if (v.getId() == R.id.delete) { + if (login != null && item.getUser().getLogin().equals(login.getLogin())) { + if (getView() != null) getView().onShowDeleteMsg(item.getId()); + } + } else if (v.getId() == R.id.reply) { + getView().onTagUser(item.getUser()); + } else if (v.getId() == R.id.edit) { + if (login != null && item.getUser().getLogin().equals(login.getLogin())) { getView().onEditComment(item); - } else { - getView().onTagUser(item.getUser()); } } else { - getView().onTagUser(item.getUser()); + handleReactions(v.getId(), item.getId(), v.getContext()); } } } - @Override public void onItemLongClick(int position, View v, Comment item) { - if (item.getUser() != null && TextUtils.equals(item.getUser().getLogin(), Login.getUser().getLogin())) { - if (getView() != null) getView().onShowDeleteMsg(item.getId()); - } else { - onItemClick(position, v, item); + private void handleReactions(@IdRes int id, long commentId, @NonNull Context context) { + ReactionTypes type = null; + switch (id) { + case R.id.heart: + type = ReactionTypes.HEART; + break; + case R.id.sad: + type = ReactionTypes.CONFUSED; + break; + case R.id.thumbsDown: + type = ReactionTypes.PLUS_ONE; + break; + case R.id.thumbsUp: + type = ReactionTypes.MINUS_ONE; + break; + case R.id.laugh: + type = ReactionTypes.LAUGH; + break; + case R.id.hurray: + type = ReactionTypes.HOORAY; + break; + } + if (type != null) { + ReactionService.start(context, login, repoId, commentId, type, false); } } + + @Override public void onItemLongClick(int position, View v, Comment item) { + onItemClick(position, v, item); + } } diff --git a/app/src/main/java/com/fastaccess/ui/modules/repos/issues/issue/details/comments/IssueCommentsView.java b/app/src/main/java/com/fastaccess/ui/modules/repos/issues/issue/details/comments/IssueCommentsView.java index e43aa58d..fa00e03b 100644 --- a/app/src/main/java/com/fastaccess/ui/modules/repos/issues/issue/details/comments/IssueCommentsView.java +++ b/app/src/main/java/com/fastaccess/ui/modules/repos/issues/issue/details/comments/IssueCommentsView.java @@ -10,6 +10,7 @@ import android.support.v4.widget.SwipeRefreshLayout; import android.view.View; import com.fastaccess.R; +import com.fastaccess.data.dao.SparseBooleanArrayParcelable; import com.fastaccess.data.dao.model.Comment; import com.fastaccess.data.dao.model.User; import com.fastaccess.helper.BundleConstant; @@ -24,6 +25,7 @@ import com.fastaccess.ui.widgets.dialog.MessageDialogView; import com.fastaccess.ui.widgets.recyclerview.DynamicRecyclerView; import butterknife.BindView; +import icepick.State; import uk.co.samuelwall.materialtaptargetprompt.MaterialTapTargetPrompt; /** @@ -35,6 +37,7 @@ public class IssueCommentsView extends BaseFragment + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layouts/row_layouts/layout/comments_row_item.xml b/app/src/main/res/layouts/row_layouts/layout/comments_row_item.xml index f1c055a0..bcd24988 100644 --- a/app/src/main/res/layouts/row_layouts/layout/comments_row_item.xml +++ b/app/src/main/res/layouts/row_layouts/layout/comments_row_item.xml @@ -7,7 +7,6 @@ android:layout_height="wrap_content" android:layout_margin="@dimen/grid_spacing" android:background="@color/card_background" - android:foreground="?android:selectableItemBackground" android:paddingBottom="@dimen/spacing_normal" android:paddingEnd="@dimen/spacing_xs_large" android:paddingTop="@dimen/spacing_normal" @@ -19,6 +18,7 @@ android:orientation="vertical"> @@ -39,7 +39,7 @@ android:layout_marginEnd="@dimen/spacing_normal" android:layout_weight="1" android:ellipsize="end" - android:maxLines="1" + android:maxLines="2" android:textColor="?android:textColorPrimary" tools:text="When one acquires"/> @@ -51,7 +51,17 @@ android:layout_gravity="center" android:maxLines="1" android:textColor="?android:attr/textColorSecondary" - tools:text="50 minutes ago"/> + tools:text="50 minutes"/> + + - - - - - - - - - - - - - - - - - - + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index d8733b95..ddf034c6 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -321,4 +321,5 @@ My Gists Changelog Click to open notifications list or swipe to dismiss + Posting reaction %s \ No newline at end of file