From 622363c2c67cc11ebf31dd2b5a0431632d4c8b1f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pablo=20Rodr=C3=ADguez=20Caballero?= Date: Sun, 21 Mar 2021 20:38:34 +0100 Subject: [PATCH 1/3] fix(StoryViewerFragment): wrong viewModel superclass assigned on init --- .../fragments/StoryViewerFragment.java | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/awais/instagrabber/fragments/StoryViewerFragment.java b/app/src/main/java/awais/instagrabber/fragments/StoryViewerFragment.java index 4b2108a8..bfdeaaf3 100644 --- a/app/src/main/java/awais/instagrabber/fragments/StoryViewerFragment.java +++ b/app/src/main/java/awais/instagrabber/fragments/StoryViewerFragment.java @@ -304,11 +304,18 @@ public class StoryViewerFragment extends Fragment { // isNotification = fragmentArgs.getIsNotification(); final Type type = options.getType(); if (currentFeedStoryIndex >= 0) { - viewModel = type == Type.HIGHLIGHT - ? type == Type.STORY_ARCHIVE - ? new ViewModelProvider(fragmentActivity).get(ArchivesViewModel.class) - : new ViewModelProvider(fragmentActivity).get(HighlightsViewModel.class) - : new ViewModelProvider(fragmentActivity).get(FeedStoriesViewModel.class); + switch (type) { + case HIGHLIGHT: + viewModel = new ViewModelProvider(fragmentActivity).get(HighlightsViewModel.class); + break; + case STORY_ARCHIVE: + viewModel = new ViewModelProvider(fragmentActivity).get(ArchivesViewModel.class); + break; + default: + case FEED_STORY_POSITION: + viewModel = new ViewModelProvider(fragmentActivity).get(FeedStoriesViewModel.class); + break; + } } setupStories(); } From 0afe482b864b0b2b49c4a3ec48bed814a17d3963 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pablo=20Rodr=C3=ADguez=20Caballero?= Date: Sun, 21 Mar 2021 21:30:20 +0100 Subject: [PATCH 2/3] fix(StoryViewerFragment): crash when parsing unexpected Instagram id --- .../fragments/StoryViewerFragment.java | 20 ++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/awais/instagrabber/fragments/StoryViewerFragment.java b/app/src/main/java/awais/instagrabber/fragments/StoryViewerFragment.java index bfdeaaf3..c10e4384 100644 --- a/app/src/main/java/awais/instagrabber/fragments/StoryViewerFragment.java +++ b/app/src/main/java/awais/instagrabber/fragments/StoryViewerFragment.java @@ -65,6 +65,8 @@ import java.util.ArrayList; import java.util.Collections; import java.util.Date; import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import awais.instagrabber.BuildConfig; import awais.instagrabber.R; @@ -735,7 +737,7 @@ public class StoryViewerFragment extends Fragment { return; } final HighlightModel model = models.get(currentFeedStoryIndex); - currentStoryMediaId = model.getId(); + currentStoryMediaId = parseStoryMediaId(model.getId()); currentStoryUsername = model.getTitle(); fetchOptions = StoryViewerOptions.forUser(Long.parseLong(currentStoryMediaId), currentStoryUsername); break; @@ -1146,4 +1148,20 @@ public class StoryViewerFragment extends Fragment { resetView(); } } + + /** + * Parses the Story's media ID. For user stories this is a number, but for archive stories + * this is "archiveDay:" plus a number. + */ + private static String parseStoryMediaId(String rawId) { + final String regex = "(?:archiveDay:)?(.+)"; + final Pattern pattern = Pattern.compile(regex); + final Matcher matcher = pattern.matcher(rawId); + + if (matcher.matches() && matcher.groupCount() >= 1) { + return matcher.group(1); + } + + return rawId; + } } From 442903eaf9363738977eda47bf1298f29a7fc2d9 Mon Sep 17 00:00:00 2001 From: Austin Huang Date: Sun, 21 Mar 2021 19:11:33 -0400 Subject: [PATCH 3/3] make archives usable and also some marginal improvements --- .../fragments/StoryListViewerFragment.java | 2 +- .../fragments/StoryViewerFragment.java | 2 +- .../requests/StoryViewerOptions.java | 4 +-- .../instagrabber/utils/ResponseBodyUtils.java | 7 ++---- .../webservices/StoriesService.java | 25 ++++++++----------- 5 files changed, 16 insertions(+), 24 deletions(-) diff --git a/app/src/main/java/awais/instagrabber/fragments/StoryListViewerFragment.java b/app/src/main/java/awais/instagrabber/fragments/StoryListViewerFragment.java index 57a9d7be..ee997c86 100644 --- a/app/src/main/java/awais/instagrabber/fragments/StoryListViewerFragment.java +++ b/app/src/main/java/awais/instagrabber/fragments/StoryListViewerFragment.java @@ -79,7 +79,7 @@ public final class StoryListViewerFragment extends Fragment implements SwipeRefr public void onHighlightClick(final HighlightModel model, final int position) { if (model == null) return; final NavDirections action = StoryListViewerFragmentDirections - .actionStoryListFragmentToStoryViewerFragment(StoryViewerOptions.forStoryArchive(position)); + .actionStoryListFragmentToStoryViewerFragment(StoryViewerOptions.forStoryArchive(model.getId())); NavHostFragment.findNavController(StoryListViewerFragment.this).navigate(action); } diff --git a/app/src/main/java/awais/instagrabber/fragments/StoryViewerFragment.java b/app/src/main/java/awais/instagrabber/fragments/StoryViewerFragment.java index c10e4384..82438999 100644 --- a/app/src/main/java/awais/instagrabber/fragments/StoryViewerFragment.java +++ b/app/src/main/java/awais/instagrabber/fragments/StoryViewerFragment.java @@ -739,7 +739,7 @@ public class StoryViewerFragment extends Fragment { final HighlightModel model = models.get(currentFeedStoryIndex); currentStoryMediaId = parseStoryMediaId(model.getId()); currentStoryUsername = model.getTitle(); - fetchOptions = StoryViewerOptions.forUser(Long.parseLong(currentStoryMediaId), currentStoryUsername); + fetchOptions = StoryViewerOptions.forStoryArchive(model.getId()); break; } } diff --git a/app/src/main/java/awais/instagrabber/repositories/requests/StoryViewerOptions.java b/app/src/main/java/awais/instagrabber/repositories/requests/StoryViewerOptions.java index 2981d4ec..d8308c8a 100644 --- a/app/src/main/java/awais/instagrabber/repositories/requests/StoryViewerOptions.java +++ b/app/src/main/java/awais/instagrabber/repositories/requests/StoryViewerOptions.java @@ -57,8 +57,8 @@ public class StoryViewerOptions implements Serializable { return new StoryViewerOptions(position, Type.FEED_STORY_POSITION); } - public static StoryViewerOptions forStoryArchive(final int position) { - return new StoryViewerOptions(position, Type.STORY_ARCHIVE); + public static StoryViewerOptions forStoryArchive(final String id) { + return new StoryViewerOptions(id, Type.STORY_ARCHIVE); } public long getId() { diff --git a/app/src/main/java/awais/instagrabber/utils/ResponseBodyUtils.java b/app/src/main/java/awais/instagrabber/utils/ResponseBodyUtils.java index 7a5b8361..6c2f604a 100644 --- a/app/src/main/java/awais/instagrabber/utils/ResponseBodyUtils.java +++ b/app/src/main/java/awais/instagrabber/utils/ResponseBodyUtils.java @@ -962,8 +962,7 @@ public final class ResponseBodyUtils { // } public static StoryModel parseStoryItem(final JSONObject data, - final boolean isLoc, - final boolean isHashtag, + final boolean isLocOrHashtag, final String username) throws JSONException { final boolean isVideo = data.has("video_duration"); final StoryModel model = new StoryModel(data.getString("id"), @@ -971,9 +970,7 @@ public final class ResponseBodyUtils { .getString("url"), null, isVideo ? MediaItemType.MEDIA_TYPE_VIDEO : MediaItemType.MEDIA_TYPE_IMAGE, data.optLong("taken_at", 0), - (isLoc || isHashtag) - ? data.getJSONObject("user").getString("username") - : username, + isLocOrHashtag ? data.getJSONObject("user").getString("username") : username, data.getJSONObject("user").getLong("pk"), data.optBoolean("can_reply")); diff --git a/app/src/main/java/awais/instagrabber/webservices/StoriesService.java b/app/src/main/java/awais/instagrabber/webservices/StoriesService.java index fd05af17..9b47839b 100644 --- a/app/src/main/java/awais/instagrabber/webservices/StoriesService.java +++ b/app/src/main/java/awais/instagrabber/webservices/StoriesService.java @@ -95,7 +95,7 @@ public class StoriesService extends BaseService { } try { final JSONObject itemJson = new JSONObject(body).getJSONArray("items").getJSONObject(0); - callback.onSuccess(ResponseBodyUtils.parseStoryItem(itemJson, false, false, null)); + callback.onSuccess(ResponseBodyUtils.parseStoryItem(itemJson, false, null)); } catch (JSONException e) { callback.onFailure(e); } @@ -187,7 +187,7 @@ public class StoriesService extends BaseService { final boolean isBestie = node.optBoolean("has_besties_media", false); StoryModel firstStoryModel = null; if (itemJson != null) { - firstStoryModel = ResponseBodyUtils.parseStoryItem(itemJson, false, false, null); + firstStoryModel = ResponseBodyUtils.parseStoryItem(itemJson, false, null); } feedStoryModels.add(new FeedStoryModel(id, user, fullyRead, timestamp, firstStoryModel, mediaCount, false, isBestie)); } @@ -364,9 +364,8 @@ public class StoriesService extends BaseService { final ServiceCallback> callback) { final String url = buildUrl(options); final Call userStoryCall = repository.getUserStory(url); - final boolean isLoc = options.getType() == StoryViewerOptions.Type.LOCATION; - final boolean isHashtag = options.getType() == StoryViewerOptions.Type.HASHTAG; - final boolean isHighlight = options.getType() == StoryViewerOptions.Type.HIGHLIGHT; + final boolean isLocOrHashtag = options.getType() == StoryViewerOptions.Type.LOCATION || options.getType() == StoryViewerOptions.Type.HASHTAG; + final boolean isHighlight = options.getType() == StoryViewerOptions.Type.HIGHLIGHT || options.getType() == StoryViewerOptions.Type.STORY_ARCHIVE; userStoryCall.enqueue(new Callback() { @Override public void onResponse(@NonNull final Call call, @NonNull final Response response) { @@ -380,7 +379,7 @@ public class StoriesService extends BaseService { data = new JSONObject(body); if (!isHighlight) { - data = data.optJSONObject((isLoc || isHashtag) ? "story" : "reel"); + data = data.optJSONObject((isLocOrHashtag) ? "story" : "reel"); } else { data = data.getJSONObject("reels").optJSONObject(options.getName()); } @@ -388,8 +387,7 @@ public class StoriesService extends BaseService { String username = null; if (data != null // && localUsername == null - && !isLoc - && !isHashtag) { + && !isLocOrHashtag) { username = data.getJSONObject("user").getString("username"); } @@ -397,12 +395,11 @@ public class StoriesService extends BaseService { if (data != null && (media = data.optJSONArray("items")) != null && media.length() > 0 && media.optJSONObject(0) != null) { - final int mediaLen = media.length(); final List models = new ArrayList<>(); for (int i = 0; i < mediaLen; ++i) { data = media.getJSONObject(i); - models.add(ResponseBodyUtils.parseStoryItem(data, isLoc, isHashtag, username)); + models.add(ResponseBodyUtils.parseStoryItem(data, isLocOrHashtag, username)); } callback.onSuccess(models); } else { @@ -543,6 +540,7 @@ public class StoriesService extends BaseService { id = String.valueOf(options.getId()); break; case HIGHLIGHT: + case STORY_ARCHIVE: builder.append("feed/reels_media/?user_ids="); id = options.getName(); break; @@ -550,15 +548,12 @@ public class StoriesService extends BaseService { break; // case FEED_STORY_POSITION: // break; - // case STORY_ARCHIVE: - // break; } if (id == null) { return null; } - final String userId = id.replace(":", "%3A"); - builder.append(userId); - if (type != StoryViewerOptions.Type.HIGHLIGHT) { + builder.append(id); + if (type != StoryViewerOptions.Type.HIGHLIGHT && type != StoryViewerOptions.Type.STORY_ARCHIVE) { builder.append("/story/"); } return builder.toString();