Skip to content

Commit 0b5e152

Browse files
Editing comments with Giphy gif is available.
1 parent 232fdd5 commit 0b5e152

File tree

7 files changed

+133
-16
lines changed

7 files changed

+133
-16
lines changed

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

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,8 @@
8181
import okhttp3.OkHttpClient;
8282
import retrofit2.Retrofit;
8383

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

8687
public static final String EXTRA_COMMENT_PARENT_TITLE_KEY = "ECPTK";
8788
public static final String EXTRA_COMMENT_PARENT_BODY_KEY = "ECPBK";
@@ -99,6 +100,7 @@ public class CommentActivity extends BaseActivity implements UploadImageEnabledA
99100

100101
private static final String SELECTED_ACCOUNT_STATE = "SAS";
101102
private static final String UPLOADED_IMAGES_STATE = "UIS";
103+
private static final String GIPHY_GIF_STATE = "GGS";
102104

103105
@Inject
104106
@Named("no_oauth")
@@ -272,6 +274,7 @@ public void configureTheme(@NonNull MarkwonTheme.Builder builder) {
272274
if (savedInstanceState != null) {
273275
selectedAccount = savedInstanceState.getParcelable(SELECTED_ACCOUNT_STATE);
274276
uploadedImages = savedInstanceState.getParcelableArrayList(UPLOADED_IMAGES_STATE);
277+
giphyGif = savedInstanceState.getParcelable(GIPHY_GIF_STATE);
275278

276279
if (selectedAccount != null) {
277280
mGlide.load(selectedAccount.getProfileImageUrl())
@@ -353,6 +356,7 @@ protected void onSaveInstanceState(@NonNull Bundle outState) {
353356
super.onSaveInstanceState(outState);
354357
outState.putParcelable(SELECTED_ACCOUNT_STATE, selectedAccount);
355358
outState.putParcelableArrayList(UPLOADED_IMAGES_STATE, uploadedImages);
359+
outState.putParcelable(GIPHY_GIF_STATE, giphyGif);
356360
}
357361

358362
@Override
@@ -621,7 +625,7 @@ public void didSearchTerm(@NonNull String s) {
621625

622626
@Override
623627
public void onGifSelected(@NonNull Media media, @Nullable String s, @NonNull GPHContentType gphContentType) {
624-
this.giphyGif = new GiphyGif(media.getId());
628+
this.giphyGif = new GiphyGif(media.getId(), true);
625629

626630
int start = Math.max(binding.commentCommentEditText.getSelectionStart(), 0);
627631
int end = Math.max(binding.commentCommentEditText.getSelectionEnd(), 0);

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

Lines changed: 49 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,10 @@
1818
import androidx.core.content.FileProvider;
1919
import androidx.recyclerview.widget.LinearLayoutManager;
2020

21+
import com.giphy.sdk.core.models.Media;
22+
import com.giphy.sdk.ui.GPHContentType;
23+
import com.giphy.sdk.ui.Giphy;
24+
import com.giphy.sdk.ui.views.GiphyDialogFragment;
2125
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
2226
import com.google.android.material.snackbar.Snackbar;
2327

@@ -36,6 +40,7 @@
3640
import javax.inject.Named;
3741

3842
import ml.docilealligator.infinityforreddit.Infinity;
43+
import ml.docilealligator.infinityforreddit.thing.GiphyGif;
3944
import ml.docilealligator.infinityforreddit.thing.MediaMetadata;
4045
import ml.docilealligator.infinityforreddit.R;
4146
import ml.docilealligator.infinityforreddit.thing.UploadedImage;
@@ -55,7 +60,8 @@
5560
import retrofit2.Response;
5661
import retrofit2.Retrofit;
5762

58-
public class EditCommentActivity extends BaseActivity implements UploadImageEnabledActivity {
63+
public class EditCommentActivity extends BaseActivity implements UploadImageEnabledActivity,
64+
GiphyDialogFragment.GifSelectionListener {
5965

6066
public static final String EXTRA_CONTENT = "EC";
6167
public static final String EXTRA_FULLNAME = "EF";
@@ -69,6 +75,7 @@ public class EditCommentActivity extends BaseActivity implements UploadImageEnab
6975
private static final int MARKDOWN_PREVIEW_REQUEST_CODE = 300;
7076

7177
private static final String UPLOADED_IMAGES_STATE = "UIS";
78+
private static final String GIPHY_GIF_STATE = "GGS";
7279

7380
@Inject
7481
@Named("oauth")
@@ -92,6 +99,7 @@ public class EditCommentActivity extends BaseActivity implements UploadImageEnab
9299
private boolean isSubmitting = false;
93100
private Uri capturedImageUri;
94101
private ArrayList<UploadedImage> uploadedImages = new ArrayList<>();
102+
private GiphyGif giphyGif;
95103
private ActivityEditCommentBinding binding;
96104

97105
@Override
@@ -141,10 +149,11 @@ protected void onCreate(Bundle savedInstanceState) {
141149

142150
if (savedInstanceState != null) {
143151
uploadedImages = savedInstanceState.getParcelableArrayList(UPLOADED_IMAGES_STATE);
152+
giphyGif = savedInstanceState.getParcelable(GIPHY_GIF_STATE);
144153
}
145154

146155
MarkdownBottomBarRecyclerViewAdapter adapter = new MarkdownBottomBarRecyclerViewAdapter(
147-
mCustomThemeWrapper, true, new MarkdownBottomBarRecyclerViewAdapter.ItemClickListener() {
156+
mCustomThemeWrapper, true, true, new MarkdownBottomBarRecyclerViewAdapter.ItemClickListener() {
148157
@Override
149158
public void onClick(int item) {
150159
MarkdownBottomBarRecyclerViewAdapter.bindEditTextWithItemClickListener(
@@ -161,6 +170,11 @@ public void onUploadImage() {
161170
fragment.setArguments(arguments);
162171
fragment.show(getSupportFragmentManager(), fragment.getTag());
163172
}
173+
174+
@Override
175+
public void onSelectGiphyGif() {
176+
GiphyDialogFragment.Companion.newInstance().show(getSupportFragmentManager(), "giphy_dialog");
177+
}
164178
});
165179

166180
binding.markdownBottomBarRecyclerViewEditCommentActivity.setLayoutManager(new LinearLayoutManagerBugFixed(this,
@@ -169,6 +183,8 @@ public void onUploadImage() {
169183

170184
binding.commentEditTextEditCommentActivity.requestFocus();
171185
Utils.showKeyboard(this, new Handler(), binding.commentEditTextEditCommentActivity);
186+
187+
Giphy.INSTANCE.configure(this, APIUtils.GIPHY_GIF_API_KEY);
172188
}
173189

174190
@Override
@@ -237,9 +253,9 @@ private void editComment() {
237253

238254
Map<String, String> params = new HashMap<>();
239255
params.put(APIUtils.THING_ID_KEY, mFullName);
240-
if (!uploadedImages.isEmpty()) {
256+
if (!uploadedImages.isEmpty() || giphyGif != null) {
241257
try {
242-
params.put(APIUtils.RICHTEXT_JSON_KEY, new RichTextJSONConverter().constructRichTextJSON(this, content, uploadedImages));
258+
params.put(APIUtils.RICHTEXT_JSON_KEY, new RichTextJSONConverter().constructRichTextJSON(this, content, uploadedImages, giphyGif));
243259
params.put(APIUtils.TEXT_KEY, "");
244260
} catch (JSONException e) {
245261
isSubmitting = false;
@@ -314,6 +330,7 @@ protected void onActivityResult(int requestCode, int resultCode, @Nullable Inten
314330
protected void onSaveInstanceState(@NonNull Bundle outState) {
315331
super.onSaveInstanceState(outState);
316332
outState.putParcelableArrayList(UPLOADED_IMAGES_STATE, uploadedImages);
333+
outState.putParcelable(GIPHY_GIF_STATE, giphyGif);
317334
}
318335

319336
@Override
@@ -379,4 +396,32 @@ public void insertImageUrl(UploadedImage uploadedImage) {
379396
0, "![]()\n".length() + uploadedImage.imageUrlOrKey.length());
380397
}
381398
}
399+
400+
@Override
401+
public void didSearchTerm(@NonNull String s) {
402+
403+
}
404+
405+
@Override
406+
public void onGifSelected(@NonNull Media media, @Nullable String s, @NonNull GPHContentType gphContentType) {
407+
this.giphyGif = new GiphyGif(media.getId(), true);
408+
409+
int start = Math.max(binding.commentEditTextEditCommentActivity.getSelectionStart(), 0);
410+
int end = Math.max(binding.commentEditTextEditCommentActivity.getSelectionEnd(), 0);
411+
int realStart = Math.min(start, end);
412+
if (realStart > 0 && binding.commentEditTextEditCommentActivity.getText().toString().charAt(realStart - 1) != '\n') {
413+
binding.commentEditTextEditCommentActivity.getText().replace(realStart, Math.max(start, end),
414+
"\n![gif](" + giphyGif.id + ")\n",
415+
0, "\n![gif]()\n".length() + giphyGif.id.length());
416+
} else {
417+
binding.commentEditTextEditCommentActivity.getText().replace(realStart, Math.max(start, end),
418+
"![gif](" + giphyGif.id + ")\n",
419+
0, "![gif]()\n".length() + giphyGif.id.length());
420+
}
421+
}
422+
423+
@Override
424+
public void onDismissed(@NonNull GPHContentType gphContentType) {
425+
426+
}
382427
}

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,8 @@ public static void sendComment(Context context, Executor executor, Handler handl
3737
params.put(APIUtils.RETURN_RTJSON_KEY, "true");
3838
if (!uploadedImages.isEmpty() || giphyGif != null) {
3939
try {
40-
params.put(APIUtils.RICHTEXT_JSON_KEY, new RichTextJSONConverter().constructRichTextJSON(context, commentMarkdown, uploadedImages, giphyGif));
40+
params.put(APIUtils.RICHTEXT_JSON_KEY, new RichTextJSONConverter().constructRichTextJSON(
41+
context, commentMarkdown, uploadedImages, giphyGif));
4142
params.put(APIUtils.TEXT_KEY, "");
4243
} catch (JSONException e) {
4344
sendCommentListener.sendCommentFailed(context.getString(R.string.convert_to_richtext_json_failed));

app/src/main/java/ml/docilealligator/infinityforreddit/markdown/GiphyGifBlockParser.java

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,14 @@
1010
import org.commonmark.parser.block.MatchedBlockParser;
1111
import org.commonmark.parser.block.ParserState;
1212

13+
import java.util.HashMap;
14+
import java.util.List;
15+
import java.util.Map;
1316
import java.util.regex.Matcher;
1417
import java.util.regex.Pattern;
1518

1619
import ml.docilealligator.infinityforreddit.thing.GiphyGif;
20+
import ml.docilealligator.infinityforreddit.thing.UploadedImage;
1721

1822
public class GiphyGifBlockParser extends AbstractBlockParser {
1923
private final GiphyGifBlock giphyGifBlock;
@@ -37,13 +41,26 @@ public static class Factory extends AbstractBlockParserFactory {
3741
@Nullable
3842
private GiphyGif giphyGif;
3943

40-
public Factory(@Nullable GiphyGif giphyGif) {
44+
// Only for editing comments with GiphyGif. No need to convert MediaMetadata to GiphyGif.
45+
@Nullable
46+
private Map<String, UploadedImage> uploadedImageMap;
47+
48+
public Factory(@Nullable GiphyGif giphyGif, @Nullable List<UploadedImage> uploadedImages) {
4149
this.giphyGif = giphyGif;
50+
51+
if (uploadedImages == null) {
52+
return;
53+
}
54+
55+
uploadedImageMap = new HashMap<>();
56+
for (UploadedImage u : uploadedImages) {
57+
uploadedImageMap.put(u.imageName, u);
58+
}
4259
}
4360

4461
@Override
4562
public BlockStart tryStart(ParserState state, MatchedBlockParser matchedBlockParser) {
46-
if (giphyGif == null) {
63+
if (giphyGif == null && (uploadedImageMap == null || uploadedImageMap.isEmpty())) {
4764
return BlockStart.none();
4865
}
4966

@@ -54,8 +71,10 @@ public BlockStart tryStart(ParserState state, MatchedBlockParser matchedBlockPar
5471
if (startIndex > 0) {
5572
int endIndex = line.indexOf(')', startIndex);
5673
String id = line.substring(startIndex + 1, endIndex);
57-
if (giphyGif.id.equals(id)) {
74+
if (giphyGif != null && giphyGif.id.equals(id)) {
5875
return BlockStart.of(new GiphyGifBlockParser(giphyGif));
76+
} else if (uploadedImageMap != null && uploadedImageMap.containsKey(id)) {
77+
return BlockStart.of(new GiphyGifBlockParser(new GiphyGif(id, false)));
5978
}
6079
}
6180
}

app/src/main/java/ml/docilealligator/infinityforreddit/markdown/GiphyGifPlugin.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,17 @@
55

66
import org.commonmark.parser.Parser;
77

8+
import java.util.List;
9+
810
import io.noties.markwon.AbstractMarkwonPlugin;
911
import ml.docilealligator.infinityforreddit.thing.GiphyGif;
12+
import ml.docilealligator.infinityforreddit.thing.UploadedImage;
1013

1114
public class GiphyGifPlugin extends AbstractMarkwonPlugin {
1215
private final GiphyGifBlockParser.Factory factory;
1316

14-
public GiphyGifPlugin(@Nullable GiphyGif giphyGif) {
15-
this.factory = new GiphyGifBlockParser.Factory(giphyGif);
17+
public GiphyGifPlugin(@Nullable GiphyGif giphyGif, @Nullable List<UploadedImage> uploadedImages) {
18+
this.factory = new GiphyGifBlockParser.Factory(giphyGif, uploadedImages);
1619
}
1720

1821
@NonNull

app/src/main/java/ml/docilealligator/infinityforreddit/markdown/RichTextJSONConverter.java

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,12 +128,22 @@ public String constructRichTextJSON(Context context, String markdown,
128128
return richText.toString();
129129
}
130130

131+
/**
132+
*
133+
* @param context
134+
* @param markdown
135+
* @param uploadedImages
136+
* @param giphyGif
137+
* @param uploadedImagesMap this is for editing comment with giphy gifs. Too lazy to convert UploadedImage to GiphyGif.
138+
* @return
139+
* @throws JSONException
140+
*/
131141
public String constructRichTextJSON(Context context, String markdown,
132142
List<UploadedImage> uploadedImages, @Nullable GiphyGif giphyGif) throws JSONException {
133143
UploadedImagePlugin uploadedImagePlugin = new UploadedImagePlugin();
134144
uploadedImagePlugin.setUploadedImages(uploadedImages);
135145
Markwon markwon = MarkdownUtils.createContentSubmissionRedditMarkwon(
136-
context, uploadedImagePlugin, new GiphyGifPlugin(giphyGif));
146+
context, uploadedImagePlugin, new GiphyGifPlugin(giphyGif, uploadedImages));
137147

138148
List<Node> nodes = MarkwonReducer.directChildren().reduce(markwon.parse(markdown));
139149

Lines changed: 38 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,43 @@
11
package ml.docilealligator.infinityforreddit.thing;
22

3-
public class GiphyGif {
3+
import android.os.Parcel;
4+
import android.os.Parcelable;
5+
6+
import androidx.annotation.NonNull;
7+
8+
public class GiphyGif implements Parcelable {
49
public final String id;
5-
public GiphyGif(String id) {
6-
this.id = "giphy|" + id + "|downsized";
10+
private GiphyGif(String id) {
11+
this.id = id;
12+
}
13+
14+
public GiphyGif(String id, boolean modifyId) {
15+
this(modifyId ? "giphy|" + id + "|downsized" : id);
16+
}
17+
18+
protected GiphyGif(Parcel in) {
19+
id = in.readString();
20+
}
21+
22+
public static final Creator<GiphyGif> CREATOR = new Creator<GiphyGif>() {
23+
@Override
24+
public GiphyGif createFromParcel(Parcel in) {
25+
return new GiphyGif(in);
26+
}
27+
28+
@Override
29+
public GiphyGif[] newArray(int size) {
30+
return new GiphyGif[size];
31+
}
32+
};
33+
34+
@Override
35+
public int describeContents() {
36+
return 0;
37+
}
38+
39+
@Override
40+
public void writeToParcel(@NonNull Parcel dest, int flags) {
41+
dest.writeString(id);
742
}
843
}

0 commit comments

Comments
 (0)