Skip to content

Commit 4f414ea

Browse files
Sending comments with a Giphy gif is available.
1 parent f042b89 commit 4f414ea

File tree

13 files changed

+247
-46
lines changed

13 files changed

+247
-46
lines changed

app/build.gradle

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,8 @@ dependencies {
191191

192192
implementation 'androidx.core:core-splashscreen:1.0.1'
193193

194+
implementation 'com.giphy.sdk:ui:2.3.15'
195+
194196

195197
/**** Builds and flavors ****/
196198
// debugImplementation because LeakCanary should only run in debug builds.

app/src/main/java/ml/docilealligator/infinityforreddit/activities/CommentActivity.java

Lines changed: 48 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,10 @@
2525
import com.bumptech.glide.Glide;
2626
import com.bumptech.glide.RequestManager;
2727
import com.bumptech.glide.request.RequestOptions;
28+
import com.giphy.sdk.core.models.Media;
29+
import com.giphy.sdk.ui.GPHContentType;
30+
import com.giphy.sdk.ui.Giphy;
31+
import com.giphy.sdk.ui.views.GiphyDialogFragment;
2832
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
2933
import com.google.android.material.snackbar.Snackbar;
3034

@@ -46,11 +50,9 @@
4650
import io.noties.markwon.MarkwonPlugin;
4751
import io.noties.markwon.core.MarkwonTheme;
4852
import jp.wasabeef.glide.transformations.RoundedCornersTransformation;
49-
import ml.docilealligator.infinityforreddit.network.AnyAccountAccessTokenAuthenticator;
5053
import ml.docilealligator.infinityforreddit.Infinity;
5154
import ml.docilealligator.infinityforreddit.R;
5255
import ml.docilealligator.infinityforreddit.RedditDataRoomDatabase;
53-
import ml.docilealligator.infinityforreddit.thing.UploadedImage;
5456
import ml.docilealligator.infinityforreddit.account.Account;
5557
import ml.docilealligator.infinityforreddit.adapters.MarkdownBottomBarRecyclerViewAdapter;
5658
import ml.docilealligator.infinityforreddit.bottomsheetfragments.AccountChooserBottomSheetFragment;
@@ -69,13 +71,17 @@
6971
import ml.docilealligator.infinityforreddit.markdown.ImageAndGifEntry;
7072
import ml.docilealligator.infinityforreddit.markdown.ImageAndGifPlugin;
7173
import ml.docilealligator.infinityforreddit.markdown.MarkdownUtils;
74+
import ml.docilealligator.infinityforreddit.network.AnyAccountAccessTokenAuthenticator;
75+
import ml.docilealligator.infinityforreddit.thing.GiphyGif;
76+
import ml.docilealligator.infinityforreddit.thing.UploadedImage;
77+
import ml.docilealligator.infinityforreddit.utils.APIUtils;
7278
import ml.docilealligator.infinityforreddit.utils.SharedPreferencesUtils;
7379
import ml.docilealligator.infinityforreddit.utils.Utils;
7480
import okhttp3.ConnectionPool;
7581
import okhttp3.OkHttpClient;
7682
import retrofit2.Retrofit;
7783

78-
public class CommentActivity extends BaseActivity implements UploadImageEnabledActivity, AccountChooserBottomSheetFragment.AccountChooserListener {
84+
public class CommentActivity extends BaseActivity implements UploadImageEnabledActivity, AccountChooserBottomSheetFragment.AccountChooserListener, GiphyDialogFragment.GifSelectionListener {
7985

8086
public static final String EXTRA_COMMENT_PARENT_TITLE_KEY = "ECPTK";
8187
public static final String EXTRA_COMMENT_PARENT_BODY_KEY = "ECPBK";
@@ -124,6 +130,7 @@ public class CommentActivity extends BaseActivity implements UploadImageEnabledA
124130
private boolean isReplying;
125131
private Uri capturedImageUri;
126132
private ArrayList<UploadedImage> uploadedImages = new ArrayList<>();
133+
private GiphyGif giphyGif;
127134
private Menu mMenu;
128135

129136
/**
@@ -282,7 +289,7 @@ public void configureTheme(@NonNull MarkwonTheme.Builder builder) {
282289
}
283290

284291
MarkdownBottomBarRecyclerViewAdapter adapter = new MarkdownBottomBarRecyclerViewAdapter(
285-
mCustomThemeWrapper, true,
292+
mCustomThemeWrapper, true, true,
286293
new MarkdownBottomBarRecyclerViewAdapter.ItemClickListener() {
287294
@Override
288295
public void onClick(int item) {
@@ -300,6 +307,11 @@ public void onUploadImage() {
300307
fragment.setArguments(arguments);
301308
fragment.show(getSupportFragmentManager(), fragment.getTag());
302309
}
310+
311+
@Override
312+
public void onSelectGiphyGif() {
313+
GiphyDialogFragment.Companion.newInstance().show(getSupportFragmentManager(), "giphy_dialog");
314+
}
303315
});
304316

305317
binding.commentMarkdownBottomBarRecyclerView.setLayoutManager(new LinearLayoutManagerBugFixed(this,
@@ -313,6 +325,8 @@ public void onUploadImage() {
313325

314326
binding.commentCommentEditText.requestFocus();
315327
Utils.showKeyboard(this, new Handler(), binding.commentCommentEditText);
328+
329+
Giphy.INSTANCE.configure(this, APIUtils.GIPHY_GIF_API_KEY);
316330
}
317331

318332
private void loadCurrentAccount() {
@@ -438,7 +452,7 @@ public void sendComment(@Nullable MenuItem item) {
438452
.build())
439453
.build();
440454
SendComment.sendComment(this, mExecutor, new Handler(), binding.commentCommentEditText.getText().toString(),
441-
parentFullname, parentDepth, uploadedImages, newAuthenticatorOauthRetrofit, selectedAccount,
455+
parentFullname, parentDepth, uploadedImages, giphyGif, newAuthenticatorOauthRetrofit, selectedAccount,
442456
new SendComment.SendCommentListener() {
443457
@Override
444458
public void sendCommentSuccess(Comment comment) {
@@ -599,4 +613,32 @@ public void onAccountSelected(Account account) {
599613
binding.commentAccountNameTextView.setText(selectedAccount.getAccountName());
600614
}
601615
}
602-
}
616+
617+
@Override
618+
public void didSearchTerm(@NonNull String s) {
619+
620+
}
621+
622+
@Override
623+
public void onGifSelected(@NonNull Media media, @Nullable String s, @NonNull GPHContentType gphContentType) {
624+
this.giphyGif = new GiphyGif(media.getId());
625+
626+
int start = Math.max(binding.commentCommentEditText.getSelectionStart(), 0);
627+
int end = Math.max(binding.commentCommentEditText.getSelectionEnd(), 0);
628+
int realStart = Math.min(start, end);
629+
if (realStart > 0 && binding.commentCommentEditText.getText().toString().charAt(realStart - 1) != '\n') {
630+
binding.commentCommentEditText.getText().replace(realStart, Math.max(start, end),
631+
"\n![gif](" + giphyGif.id + ")\n",
632+
0, "\n![gif]()\n".length() + giphyGif.id.length());
633+
} else {
634+
binding.commentCommentEditText.getText().replace(realStart, Math.max(start, end),
635+
"![gif](" + giphyGif.id + ")\n",
636+
0, "![gif]()\n".length() + giphyGif.id.length());
637+
}
638+
}
639+
640+
@Override
641+
public void onDismissed(@NonNull GPHContentType gphContentType) {
642+
643+
}
644+
}

app/src/main/java/ml/docilealligator/infinityforreddit/activities/PostPollActivity.java

Lines changed: 0 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -620,41 +620,6 @@ private void submitPost(MenuItem item) {
620620

621621
mPostingSnackbar.show();
622622

623-
/*Intent intent = new Intent(this, SubmitPostService.class);
624-
intent.putExtra(SubmitPostService.EXTRA_ACCOUNT, selectedAccount);
625-
intent.putExtra(SubmitPostService.EXTRA_SUBREDDIT_NAME, subredditName);
626-
intent.putExtra(SubmitPostService.EXTRA_POST_TYPE, SubmitPostService.EXTRA_POST_TYPE_POLL);
627-
628-
PollPayload payload;
629-
if (!binding.postContentEditTextPostPollActivity.getText().toString().isEmpty()) {
630-
if (uploadedImages.isEmpty()) {
631-
payload = new PollPayload(subredditName, binding.postTitleEditTextPostPollActivity.getText().toString(),
632-
optionList.toArray(new String[0]), (int) binding.votingLengthSliderPostPollActivity.getValue(), isNSFW, isSpoiler, flair,
633-
null, binding.postContentEditTextPostPollActivity.getText().toString(),
634-
binding.receivePostReplyNotificationsSwitchMaterialPostPollActivity.isChecked(),
635-
subredditIsUser ? "profile" : "subreddit");
636-
} else {
637-
try {
638-
payload = new PollPayload(subredditName, binding.postTitleEditTextPostPollActivity.getText().toString(),
639-
optionList.toArray(new String[0]), (int) binding.votingLengthSliderPostPollActivity.getValue(), isNSFW, isSpoiler, flair,
640-
new RichTextJSONConverter().constructRichTextJSON(this, binding.postContentEditTextPostPollActivity.getText().toString(), uploadedImages),
641-
null, binding.receivePostReplyNotificationsSwitchMaterialPostPollActivity.isChecked(),
642-
subredditIsUser ? "profile" : "subreddit");
643-
} catch (JSONException e) {
644-
Snackbar.make(binding.coordinatorLayoutPostPollActivity, R.string.convert_to_richtext_json_failed, Snackbar.LENGTH_SHORT).show();
645-
return;
646-
}
647-
}
648-
} else {
649-
payload = new PollPayload(subredditName, binding.postTitleEditTextPostPollActivity.getText().toString(),
650-
optionList.toArray(new String[0]), (int) binding.votingLengthSliderPostPollActivity.getValue(), isNSFW, isSpoiler, flair,
651-
binding.receivePostReplyNotificationsSwitchMaterialPostPollActivity.isChecked(),
652-
subredditIsUser ? "profile" : "subreddit");
653-
}
654-
intent.putExtra(SubmitPostService.EXTRA_POLL_PAYLOAD, new Gson().toJson(payload));
655-
656-
ContextCompat.startForegroundService(this, intent);*/
657-
658623
PersistableBundle extras = new PersistableBundle();
659624
extras.putString(SubmitPostService.EXTRA_ACCOUNT, selectedAccount.getJSONModel());
660625
extras.putString(SubmitPostService.EXTRA_SUBREDDIT_NAME, subredditName);

app/src/main/java/ml/docilealligator/infinityforreddit/adapters/MarkdownBottomBarRecyclerViewAdapter.java

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,28 +31,38 @@ public class MarkdownBottomBarRecyclerViewAdapter extends RecyclerView.Adapter<R
3131
public static final int QUOTE = 9;
3232
public static final int CODE_BLOCK = 10;
3333
public static final int UPLOAD_IMAGE = 11;
34+
public static final int GIPHY_GIF = 12;
3435

3536
private static final int ITEM_COUNT = 11;
3637

3738
private final CustomThemeWrapper customThemeWrapper;
3839
private final boolean canUploadImage;
40+
private final boolean canSendGiphyGIf;
3941
private final ItemClickListener itemClickListener;
4042

4143
public interface ItemClickListener {
4244
void onClick(int item);
4345
void onUploadImage();
46+
default void onSelectGiphyGif() {}
4447
}
4548

4649
public MarkdownBottomBarRecyclerViewAdapter(CustomThemeWrapper customThemeWrapper,
4750
ItemClickListener itemClickListener) {
48-
this(customThemeWrapper, false, itemClickListener);
51+
this(customThemeWrapper, false, false, itemClickListener);
4952
}
5053

5154
public MarkdownBottomBarRecyclerViewAdapter(CustomThemeWrapper customThemeWrapper,
5255
boolean canUploadImage,
5356
ItemClickListener itemClickListener) {
57+
this(customThemeWrapper, canUploadImage, false, itemClickListener);
58+
}
59+
60+
public MarkdownBottomBarRecyclerViewAdapter(CustomThemeWrapper customThemeWrapper,
61+
boolean canUploadImage, boolean canSendGiphyGif,
62+
ItemClickListener itemClickListener) {
5463
this.customThemeWrapper = customThemeWrapper;
5564
this.canUploadImage = canUploadImage;
65+
this.canSendGiphyGIf = canSendGiphyGif;
5666
this.itemClickListener = itemClickListener;
5767
}
5868

@@ -102,13 +112,16 @@ public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int positi
102112
case UPLOAD_IMAGE:
103113
((MarkdownBottomBarItemViewHolder) holder).imageView.setImageResource(R.drawable.ic_image_day_night_24dp);
104114
break;
115+
case GIPHY_GIF:
116+
((MarkdownBottomBarItemViewHolder) holder).imageView.setImageResource(R.drawable.ic_gif_24dp);
117+
break;
105118
}
106119
}
107120
}
108121

109122
@Override
110123
public int getItemCount() {
111-
return canUploadImage ? ITEM_COUNT + 1 : ITEM_COUNT;
124+
return canUploadImage ? (canSendGiphyGIf ? ITEM_COUNT + 2 : ITEM_COUNT + 1) : ITEM_COUNT;
112125
}
113126

114127
public static void bindEditTextWithItemClickListener(Activity activity, EditText commentEditText, int item) {
@@ -324,6 +337,8 @@ public MarkdownBottomBarItemViewHolder(@NonNull View itemView) {
324337
int position = getBindingAdapterPosition();
325338
if (position == UPLOAD_IMAGE) {
326339
itemClickListener.onUploadImage();
340+
} else if (position == GIPHY_GIF) {
341+
itemClickListener.onSelectGiphyGif();
327342
} else {
328343
itemClickListener.onClick(position);
329344
}

app/src/main/java/ml/docilealligator/infinityforreddit/comment/SendComment.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import java.util.concurrent.Executor;
1515

1616
import ml.docilealligator.infinityforreddit.R;
17+
import ml.docilealligator.infinityforreddit.thing.GiphyGif;
1718
import ml.docilealligator.infinityforreddit.thing.UploadedImage;
1819
import ml.docilealligator.infinityforreddit.account.Account;
1920
import ml.docilealligator.infinityforreddit.apis.RedditAPI;
@@ -27,16 +28,16 @@
2728
public class SendComment {
2829
public static void sendComment(Context context, Executor executor, Handler handler,
2930
String commentMarkdown, String thingFullname, int parentDepth,
30-
List<UploadedImage> uploadedImages,
31+
List<UploadedImage> uploadedImages, @Nullable GiphyGif giphyGif,
3132
Retrofit newAuthenticatorOauthRetrofit, Account account,
3233
SendCommentListener sendCommentListener) {
3334
Map<String, String> headers = APIUtils.getOAuthHeader(account.getAccessToken());
3435
Map<String, String> params = new HashMap<>();
3536
params.put(APIUtils.API_TYPE_KEY, "json");
3637
params.put(APIUtils.RETURN_RTJSON_KEY, "true");
37-
if (!uploadedImages.isEmpty()) {
38+
if (!uploadedImages.isEmpty() || giphyGif != null) {
3839
try {
39-
params.put(APIUtils.RICHTEXT_JSON_KEY, new RichTextJSONConverter().constructRichTextJSON(context, commentMarkdown, uploadedImages));
40+
params.put(APIUtils.RICHTEXT_JSON_KEY, new RichTextJSONConverter().constructRichTextJSON(context, commentMarkdown, uploadedImages, giphyGif));
4041
params.put(APIUtils.TEXT_KEY, "");
4142
} catch (JSONException e) {
4243
sendCommentListener.sendCommentFailed(context.getString(R.string.convert_to_richtext_json_failed));
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package ml.docilealligator.infinityforreddit.markdown;
2+
3+
import org.commonmark.node.CustomBlock;
4+
5+
import ml.docilealligator.infinityforreddit.thing.GiphyGif;
6+
7+
public class GiphyGifBlock extends CustomBlock {
8+
public GiphyGif giphyGif;
9+
10+
public GiphyGifBlock(GiphyGif giphyGif) {
11+
this.giphyGif = giphyGif;
12+
}
13+
}
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
package ml.docilealligator.infinityforreddit.markdown;
2+
3+
import androidx.annotation.Nullable;
4+
5+
import org.commonmark.node.Block;
6+
import org.commonmark.parser.block.AbstractBlockParser;
7+
import org.commonmark.parser.block.AbstractBlockParserFactory;
8+
import org.commonmark.parser.block.BlockContinue;
9+
import org.commonmark.parser.block.BlockStart;
10+
import org.commonmark.parser.block.MatchedBlockParser;
11+
import org.commonmark.parser.block.ParserState;
12+
13+
import java.util.regex.Matcher;
14+
import java.util.regex.Pattern;
15+
16+
import ml.docilealligator.infinityforreddit.thing.GiphyGif;
17+
18+
public class GiphyGifBlockParser extends AbstractBlockParser {
19+
private final GiphyGifBlock giphyGifBlock;
20+
21+
GiphyGifBlockParser(GiphyGif giphyGif) {
22+
this.giphyGifBlock = new GiphyGifBlock(giphyGif);
23+
}
24+
25+
@Override
26+
public Block getBlock() {
27+
return giphyGifBlock;
28+
}
29+
30+
@Override
31+
public BlockContinue tryContinue(ParserState parserState) {
32+
return null;
33+
}
34+
35+
public static class Factory extends AbstractBlockParserFactory {
36+
private final Pattern pattern = Pattern.compile("!\\[gif]\\(giphy\\|\\w+\\|downsized\\)");
37+
@Nullable
38+
private GiphyGif giphyGif;
39+
40+
public Factory(@Nullable GiphyGif giphyGif) {
41+
this.giphyGif = giphyGif;
42+
}
43+
44+
@Override
45+
public BlockStart tryStart(ParserState state, MatchedBlockParser matchedBlockParser) {
46+
if (giphyGif == null) {
47+
return BlockStart.none();
48+
}
49+
50+
String line = state.getLine().toString();
51+
Matcher matcher = pattern.matcher(line);
52+
if (matcher.find()) {
53+
int startIndex = line.lastIndexOf('(');
54+
if (startIndex > 0) {
55+
int endIndex = line.indexOf(')', startIndex);
56+
String id = line.substring(startIndex + 1, endIndex);
57+
if (giphyGif.id.equals(id)) {
58+
return BlockStart.of(new GiphyGifBlockParser(giphyGif));
59+
}
60+
}
61+
}
62+
return BlockStart.none();
63+
}
64+
}
65+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package ml.docilealligator.infinityforreddit.markdown;
2+
3+
import androidx.annotation.NonNull;
4+
import androidx.annotation.Nullable;
5+
6+
import org.commonmark.parser.Parser;
7+
8+
import io.noties.markwon.AbstractMarkwonPlugin;
9+
import ml.docilealligator.infinityforreddit.thing.GiphyGif;
10+
11+
public class GiphyGifPlugin extends AbstractMarkwonPlugin {
12+
private final GiphyGifBlockParser.Factory factory;
13+
14+
public GiphyGifPlugin(@Nullable GiphyGif giphyGif) {
15+
this.factory = new GiphyGifBlockParser.Factory(giphyGif);
16+
}
17+
18+
@NonNull
19+
@Override
20+
public String processMarkdown(@NonNull String markdown) {
21+
return super.processMarkdown(markdown);
22+
}
23+
24+
@Override
25+
public void configureParser(@NonNull Parser.Builder builder) {
26+
builder.customBlockParserFactory(factory);
27+
}
28+
}

0 commit comments

Comments
 (0)