From 0018cd0b7fce73c78658eb8a77ed69391c91d951 Mon Sep 17 00:00:00 2001 From: Ammar Githam Date: Thu, 7 Jan 2021 21:36:33 +0900 Subject: [PATCH] Migrate FeedModel and ProfileModel to Media and User --- .../activities/DirectDownload.java | 6 +- .../instagrabber/activities/MainActivity.java | 2 +- .../adapters/DirectItemsAdapter.java | 6 +- .../adapters/DirectUsersAdapter.java | 16 +- .../adapters/DiscoverTopicsAdapter.java | 4 +- .../instagrabber/adapters/FeedAdapterV2.java | 53 +- .../adapters/FeedItemCallbackAdapter.java | 17 +- .../instagrabber/adapters/LikesAdapter.java | 9 +- .../adapters/PostViewerChildAdapter.java | 206 ----- .../instagrabber/adapters/PostsAdapter.java | 45 -- .../adapters/SliderItemsAdapter.java | 22 +- .../adapters/UserSearchResultsAdapter.java | 14 +- .../viewholder/DirectInboxItemViewHolder.java | 18 +- .../viewholder/DirectUserViewHolder.java | 6 +- .../viewholder/FeedGridItemViewHolder.java | 186 +++-- .../viewholder/FeedStoryViewHolder.java | 6 +- .../viewholder/FollowsViewHolder.java | 11 +- .../adapters/viewholder/PostViewHolder.java | 43 - .../viewholder/SliderItemViewHolder.java | 4 +- .../viewholder/SliderPhotoViewHolder.java | 9 +- .../viewholder/SliderVideoViewHolder.java | 24 +- .../viewholder/StoryListViewHolder.java | 6 +- .../viewholder/TopicClusterViewHolder.java | 76 +- .../comments/ChildCommentViewHolder.java | 6 +- .../comments/ParentCommentViewHolder.java | 6 +- .../DirectItemActionLogViewHolder.java | 4 +- .../DirectItemAnimatedMediaViewHolder.java | 8 +- .../DirectItemDefaultViewHolder.java | 4 +- .../DirectItemLikeViewHolder.java | 7 +- .../DirectItemLinkViewHolder.java | 4 +- .../DirectItemMediaShareViewHolder.java | 15 +- .../DirectItemMediaViewHolder.java | 10 +- .../DirectItemPlaceholderViewHolder.java | 4 +- .../DirectItemProfileViewHolder.java | 19 +- .../DirectItemRavenMediaViewHolder.java | 14 +- .../DirectItemReelShareViewHolder.java | 15 +- .../DirectItemStoryShareViewHolder.java | 10 +- .../DirectItemTextViewHolder.java | 4 +- .../DirectItemVideoCallEventViewHolder.java | 4 +- .../directmessages/DirectItemViewHolder.java | 29 +- .../DirectItemVoiceMediaViewHolder.java | 10 +- .../viewholder/feed/FeedItemViewHolder.java | 71 +- .../viewholder/feed/FeedPhotoViewHolder.java | 21 +- .../viewholder/feed/FeedSliderViewHolder.java | 13 +- .../viewholder/feed/FeedVideoViewHolder.java | 36 +- .../instagrabber/asyncs/CommentsFetcher.java | 261 +++--- .../asyncs/DiscoverPostFetchService.java | 27 +- .../asyncs/DownloadedCheckerAsyncTask.java | 10 +- .../asyncs/FeedPostFetchService.java | 23 +- .../asyncs/GetActivityAsyncTask.java | 5 +- .../asyncs/HashtagPostFetchService.java | 6 +- .../instagrabber/asyncs/LocationFetcher.java | 4 +- .../asyncs/LocationPostFetchService.java | 6 +- .../instagrabber/asyncs/PostFetcher.java | 209 +++-- .../instagrabber/asyncs/ProfileFetcher.java | 104 ++- .../asyncs/ProfilePostFetchService.java | 16 +- .../asyncs/SavedPostFetchService.java | 8 +- .../instagrabber/asyncs/UsernameFetcher.java | 4 +- .../direct_messages/CreateThreadAction.java | 4 +- .../customviews/PostsRecyclerView.java | 40 +- .../customviews/RamboTextView.java | 6 +- .../customviews/helpers/PostFetcher.java | 26 +- .../helpers/VideoAwareRecyclerScroller.java | 10 +- .../db/repositories/AccountRepository.java | 10 +- .../dialogs/ProfilePicDialogFragment.java | 17 +- .../fragments/CommentsViewerFragment.java | 30 +- .../fragments/FollowViewerFragment.java | 69 +- .../fragments/HashTagFragment.java | 51 +- .../fragments/LikesViewerFragment.java | 45 +- .../fragments/LocationFragment.java | 52 +- .../NotificationsViewerFragment.java | 54 +- .../fragments/PostViewV2Fragment.java | 182 +++-- .../fragments/SavedViewerFragment.java | 43 +- .../fragments/StoryListViewerFragment.java | 34 +- .../fragments/StoryViewerFragment.java | 11 +- .../fragments/TopicPostsFragment.java | 39 +- .../fragments/UserSearchFragment.java | 8 +- .../DirectMessageSettingsFragment.java | 18 +- .../DirectMessageThreadFragment.java | 10 +- .../fragments/main/DiscoverFragment.java | 5 +- .../fragments/main/FeedFragment.java | 63 +- .../fragments/main/ProfileFragment.java | 261 +++--- .../settings/MorePreferencesFragment.java | 14 +- .../settings/SettingsPreferencesFragment.java | 14 +- .../instagrabber/interfaces/ItemGetter.java | 11 - .../interfaces/MentionClickListener.java | 1 + .../instagrabber/models/BasePostModel.java | 98 --- .../instagrabber/models/CommentModel.java | 7 +- .../models/DiscoverItemModel.java | 29 - .../models/DiscoverTopicModel.java | 26 - .../awais/instagrabber/models/FeedModel.java | 234 ------ .../instagrabber/models/FeedStoryModel.java | 15 +- .../instagrabber/models/FollowModel.java | 8 +- .../models/NotificationModel.java | 6 +- .../awais/instagrabber/models/PostChild.java | 132 ---- .../awais/instagrabber/models/PostModel.java | 64 -- .../instagrabber/models/ProfileModel.java | 118 --- .../awais/instagrabber/models/StoryModel.java | 6 +- .../instagrabber/models/TopicCluster.java | 20 +- .../instagrabber/models/ViewerPostModel.java | 219 ----- .../models/ViewerPostModelWrapper.java | 25 - .../models/enums/DownloadMethod.java | 10 - .../models/enums/InboxReadState.java | 8 - .../models/enums/UserInboxDirection.java | 16 - .../repositories/DiscoverRepository.java | 3 +- .../repositories/FeedRepository.java | 3 +- .../repositories/FriendshipRepository.java | 21 +- .../repositories/LocationRepository.java | 5 +- .../repositories/MediaRepository.java | 8 +- .../repositories/ProfileRepository.java | 9 +- .../repositories/StoriesRepository.java | 4 +- .../repositories/TagsRepository.java | 5 +- .../repositories/UserRepository.java | 3 +- .../AnimatedMediaFixedHeight.java | 2 +- .../AnimatedMediaImages.java | 2 +- .../responses/{directmessages => }/Audio.java | 5 +- .../repositories/responses/Caption.java | 72 ++ .../responses/EndOfFeedDemarcator.java | 21 + .../responses/EndOfFeedGroup.java | 34 + .../responses/EndOfFeedGroupSet.java | 51 ++ .../responses/FeedFetchResponse.java | 43 + .../responses/FriendshipChangeResponse.java | 31 + ....java => FriendshipListFetchResponse.java} | 16 +- ...hipRepoChangeResponseFriendshipStatus.java | 79 -- .../FriendshipRepoChangeRootResponse.java | 28 - ...pRepoRestrictResponseFriendshipStatus.java | 40 - ...iendshipRepoRestrictResponseUsersItem.java | 65 -- ...e.java => FriendshipRestrictResponse.java} | 12 +- ...dshipStatus.java => FriendshipStatus.java} | 45 +- .../GraphQLUserListFetchResponse.java | 9 +- .../{directmessages => }/ImageVersions2.java | 5 +- .../responses/LikersResponse.java | 27 + .../DirectItemLocation.java => Location.java} | 20 +- .../responses/LocationFeedResponse.java | 57 ++ .../repositories/responses/Media.java | 261 ++++++ .../{directmessages => }/MediaCandidate.java | 12 +- .../responses/MediaInfoResponse.java | 15 + .../responses/PostsFetchResponse.java | 12 +- .../responses/TagFeedResponse.java | 43 + .../repositories/responses/User.java | 219 +++++ .../responses/UserFeedResponse.java | 43 + .../repositories/responses/UserInfo.java | 6 +- .../responses/UserSearchResponse.java | 8 +- .../repositories/responses/UsertagIn.java | 22 + .../repositories/responses/Usertags.java | 16 + .../{directmessages => }/VideoVersion.java | 6 +- .../responses/directmessages/Caption.java | 25 - .../directmessages/DirectInboxResponse.java | 14 +- .../responses/directmessages/DirectItem.java | 33 +- .../DirectItemAnimatedMedia.java | 2 + .../directmessages/DirectItemClip.java | 10 +- .../directmessages/DirectItemFelixShare.java | 10 +- .../directmessages/DirectItemMedia.java | 115 --- .../directmessages/DirectItemReelShare.java | 8 +- .../directmessages/DirectItemStoryShare.java | 8 +- .../directmessages/DirectItemVisualMedia.java | 7 +- .../directmessages/DirectItemVoiceMedia.java | 8 +- .../directmessages/DirectThread.java | 20 +- .../responses/directmessages/DirectUser.java | 133 ---- .../discover/TopicalExploreFeedResponse.java | 59 ++ .../discover/TopicalExploreItem.java | 15 + .../awais/instagrabber/utils/CookieUtils.java | 14 +- .../instagrabber/utils/DirectItemFactory.java | 57 +- .../instagrabber/utils/DownloadUtils.java | 78 +- .../instagrabber/utils/ResponseBodyUtils.java | 745 ++++++++++-------- .../viewmodels/AppStateViewModel.java | 18 +- .../viewmodels/BasePostViewModel.java | 27 - .../viewmodels/DirectInboxViewModel.java | 10 +- .../viewmodels/DirectSettingsViewModel.java | 86 +- .../viewmodels/DirectThreadViewModel.java | 26 +- .../viewmodels/DiscoverItemViewModel.java | 7 - .../viewmodels/FeedViewModel.java | 7 - ...PostViewModel.java => MediaViewModel.java} | 10 +- .../viewmodels/PostsViewModel.java | 7 - .../viewmodels/UserSearchViewModel.java | 12 +- .../webservices/AddCookiesInterceptor.java | 8 +- .../instagrabber/webservices/BaseService.java | 2 + .../webservices/DirectMessagesService.java | 11 +- .../webservices/DiscoverService.java | 519 ++++++------ .../instagrabber/webservices/FeedService.java | 104 +-- .../webservices/FriendshipService.java | 89 ++- .../webservices/GraphQLService.java | 133 ++-- .../webservices/LocationService.java | 108 ++- .../webservices/MediaService.java | 92 +-- .../instagrabber/webservices/NewsService.java | 8 +- .../webservices/ProfileService.java | 231 +++--- .../webservices/StoriesService.java | 73 +- .../instagrabber/webservices/TagsService.java | 103 ++- .../instagrabber/webservices/UserService.java | 41 +- .../res/navigation/comments_nav_graph.xml | 6 +- .../navigation/direct_messages_nav_graph.xml | 10 +- .../res/navigation/discover_nav_graph.xml | 22 +- .../main/res/navigation/feed_nav_graph.xml | 6 +- .../main/res/navigation/hashtag_nav_graph.xml | 6 +- .../res/navigation/location_nav_graph.xml | 9 +- .../main/res/navigation/more_nav_graph.xml | 3 +- .../notification_viewer_nav_graph.xml | 3 +- .../main/res/navigation/profile_nav_graph.xml | 15 +- 198 files changed, 3976 insertions(+), 4540 deletions(-) delete mode 100644 app/src/main/java/awais/instagrabber/adapters/PostViewerChildAdapter.java delete mode 100755 app/src/main/java/awais/instagrabber/adapters/PostsAdapter.java delete mode 100755 app/src/main/java/awais/instagrabber/adapters/viewholder/PostViewHolder.java delete mode 100755 app/src/main/java/awais/instagrabber/interfaces/ItemGetter.java delete mode 100755 app/src/main/java/awais/instagrabber/models/BasePostModel.java delete mode 100755 app/src/main/java/awais/instagrabber/models/DiscoverItemModel.java delete mode 100755 app/src/main/java/awais/instagrabber/models/DiscoverTopicModel.java delete mode 100755 app/src/main/java/awais/instagrabber/models/FeedModel.java delete mode 100644 app/src/main/java/awais/instagrabber/models/PostChild.java delete mode 100755 app/src/main/java/awais/instagrabber/models/PostModel.java delete mode 100755 app/src/main/java/awais/instagrabber/models/ProfileModel.java delete mode 100755 app/src/main/java/awais/instagrabber/models/ViewerPostModel.java delete mode 100644 app/src/main/java/awais/instagrabber/models/ViewerPostModelWrapper.java delete mode 100755 app/src/main/java/awais/instagrabber/models/enums/DownloadMethod.java delete mode 100755 app/src/main/java/awais/instagrabber/models/enums/InboxReadState.java delete mode 100755 app/src/main/java/awais/instagrabber/models/enums/UserInboxDirection.java rename app/src/main/java/awais/instagrabber/repositories/responses/{directmessages => }/AnimatedMediaFixedHeight.java (91%) rename app/src/main/java/awais/instagrabber/repositories/responses/{directmessages => }/AnimatedMediaImages.java (82%) rename app/src/main/java/awais/instagrabber/repositories/responses/{directmessages => }/Audio.java (90%) create mode 100644 app/src/main/java/awais/instagrabber/repositories/responses/Caption.java create mode 100644 app/src/main/java/awais/instagrabber/repositories/responses/EndOfFeedDemarcator.java create mode 100644 app/src/main/java/awais/instagrabber/repositories/responses/EndOfFeedGroup.java create mode 100644 app/src/main/java/awais/instagrabber/repositories/responses/EndOfFeedGroupSet.java create mode 100644 app/src/main/java/awais/instagrabber/repositories/responses/FeedFetchResponse.java create mode 100644 app/src/main/java/awais/instagrabber/repositories/responses/FriendshipChangeResponse.java rename app/src/main/java/awais/instagrabber/repositories/responses/{FriendshipRepoListFetchResponse.java => FriendshipListFetchResponse.java} (73%) delete mode 100644 app/src/main/java/awais/instagrabber/repositories/responses/FriendshipRepoChangeResponseFriendshipStatus.java delete mode 100644 app/src/main/java/awais/instagrabber/repositories/responses/FriendshipRepoChangeRootResponse.java delete mode 100644 app/src/main/java/awais/instagrabber/repositories/responses/FriendshipRepoRestrictResponseFriendshipStatus.java delete mode 100644 app/src/main/java/awais/instagrabber/repositories/responses/FriendshipRepoRestrictResponseUsersItem.java rename app/src/main/java/awais/instagrabber/repositories/responses/{FriendshipRepoRestrictRootResponse.java => FriendshipRestrictResponse.java} (52%) rename app/src/main/java/awais/instagrabber/repositories/responses/{directmessages/DirectUserFriendshipStatus.java => FriendshipStatus.java} (53%) rename app/src/main/java/awais/instagrabber/repositories/responses/{directmessages => }/ImageVersions2.java (67%) create mode 100644 app/src/main/java/awais/instagrabber/repositories/responses/LikersResponse.java rename app/src/main/java/awais/instagrabber/repositories/responses/{directmessages/DirectItemLocation.java => Location.java} (65%) create mode 100644 app/src/main/java/awais/instagrabber/repositories/responses/LocationFeedResponse.java create mode 100644 app/src/main/java/awais/instagrabber/repositories/responses/Media.java rename app/src/main/java/awais/instagrabber/repositories/responses/{directmessages => }/MediaCandidate.java (60%) create mode 100644 app/src/main/java/awais/instagrabber/repositories/responses/MediaInfoResponse.java create mode 100644 app/src/main/java/awais/instagrabber/repositories/responses/TagFeedResponse.java create mode 100644 app/src/main/java/awais/instagrabber/repositories/responses/User.java create mode 100644 app/src/main/java/awais/instagrabber/repositories/responses/UserFeedResponse.java create mode 100644 app/src/main/java/awais/instagrabber/repositories/responses/UsertagIn.java create mode 100644 app/src/main/java/awais/instagrabber/repositories/responses/Usertags.java rename app/src/main/java/awais/instagrabber/repositories/responses/{directmessages => }/VideoVersion.java (83%) delete mode 100644 app/src/main/java/awais/instagrabber/repositories/responses/directmessages/Caption.java delete mode 100644 app/src/main/java/awais/instagrabber/repositories/responses/directmessages/DirectItemMedia.java delete mode 100644 app/src/main/java/awais/instagrabber/repositories/responses/directmessages/DirectUser.java create mode 100644 app/src/main/java/awais/instagrabber/repositories/responses/discover/TopicalExploreFeedResponse.java create mode 100644 app/src/main/java/awais/instagrabber/repositories/responses/discover/TopicalExploreItem.java delete mode 100644 app/src/main/java/awais/instagrabber/viewmodels/BasePostViewModel.java delete mode 100644 app/src/main/java/awais/instagrabber/viewmodels/DiscoverItemViewModel.java delete mode 100644 app/src/main/java/awais/instagrabber/viewmodels/FeedViewModel.java rename app/src/main/java/awais/instagrabber/viewmodels/{ViewerPostViewModel.java => MediaViewModel.java} (51%) delete mode 100644 app/src/main/java/awais/instagrabber/viewmodels/PostsViewModel.java diff --git a/app/src/main/java/awais/instagrabber/activities/DirectDownload.java b/app/src/main/java/awais/instagrabber/activities/DirectDownload.java index 448aab78..e2d30743 100644 --- a/app/src/main/java/awais/instagrabber/activities/DirectDownload.java +++ b/app/src/main/java/awais/instagrabber/activities/DirectDownload.java @@ -22,9 +22,9 @@ import androidx.core.content.ContextCompat; import awais.instagrabber.R; import awais.instagrabber.asyncs.PostFetcher; import awais.instagrabber.interfaces.FetchListener; -import awais.instagrabber.models.FeedModel; import awais.instagrabber.models.IntentModel; import awais.instagrabber.models.enums.IntentModelType; +import awais.instagrabber.repositories.responses.Media; import awais.instagrabber.utils.Constants; import awais.instagrabber.utils.CookieUtils; import awais.instagrabber.utils.DownloadUtils; @@ -123,7 +123,7 @@ public final class DirectDownload extends AppCompatActivity { return; } final String text = model.getText(); - new PostFetcher(text, new FetchListener() { + new PostFetcher(text, new FetchListener() { @Override public void doBefore() { if (notificationManager == null) return; @@ -138,7 +138,7 @@ public final class DirectDownload extends AppCompatActivity { } @Override - public void onResult(final FeedModel result) { + public void onResult(final Media result) { if (notificationManager != null) notificationManager.cancel(NOTIFICATION_ID); if (result == null) { finish(); diff --git a/app/src/main/java/awais/instagrabber/activities/MainActivity.java b/app/src/main/java/awais/instagrabber/activities/MainActivity.java index 705d415b..eeb721b1 100644 --- a/app/src/main/java/awais/instagrabber/activities/MainActivity.java +++ b/app/src/main/java/awais/instagrabber/activities/MainActivity.java @@ -388,7 +388,7 @@ public class MainActivity extends BaseLanguageActivity implements FragmentManage private void setupBottomNavigationBar(final boolean setDefaultFromSettings) { int main_nav_ids = R.array.main_nav_ids; final String cookie = settingsHelper.getString(Constants.COOKIE); - final boolean isLoggedIn = !TextUtils.isEmpty(cookie) && CookieUtils.getUserIdFromCookie(cookie) != null; + final boolean isLoggedIn = !TextUtils.isEmpty(cookie) && CookieUtils.getUserIdFromCookie(cookie) != 0; if (!isLoggedIn) { main_nav_ids = R.array.logged_out_main_nav_ids; final int selectedItemId = binding.bottomNavView.getSelectedItemId(); diff --git a/app/src/main/java/awais/instagrabber/adapters/DirectItemsAdapter.java b/app/src/main/java/awais/instagrabber/adapters/DirectItemsAdapter.java index 4fae3f5f..fa74d8d2 100644 --- a/app/src/main/java/awais/instagrabber/adapters/DirectItemsAdapter.java +++ b/app/src/main/java/awais/instagrabber/adapters/DirectItemsAdapter.java @@ -46,8 +46,8 @@ import awais.instagrabber.databinding.LayoutDmReelShareBinding; import awais.instagrabber.databinding.LayoutDmStoryShareBinding; import awais.instagrabber.databinding.LayoutDmTextBinding; import awais.instagrabber.databinding.LayoutDmVoiceMediaBinding; -import awais.instagrabber.models.ProfileModel; import awais.instagrabber.models.enums.DirectItemType; +import awais.instagrabber.repositories.responses.User; import awais.instagrabber.repositories.responses.directmessages.DirectItem; import awais.instagrabber.repositories.responses.directmessages.DirectThread; import awais.instagrabber.utils.DateUtils; @@ -55,7 +55,7 @@ import awais.instagrabber.utils.DateUtils; public final class DirectItemsAdapter extends RecyclerView.Adapter { private static final String TAG = DirectItemsAdapter.class.getSimpleName(); - private final ProfileModel currentUser; + private final User currentUser; private DirectThread thread; private final AsyncListDiffer differ; private List items; @@ -98,7 +98,7 @@ public final class DirectItemsAdapter extends RecyclerView.Adapter { @@ -71,13 +71,13 @@ public final class DirectUsersAdapter extends ListAdapter users, final List leftUsers) { + public void submitUsers(final List users, final List leftUsers) { if (users == null && leftUsers == null) return; final List userOrHeaders = combineLists(users, leftUsers); submitList(userOrHeaders); } - private List combineLists(final List users, final List leftUsers) { + private List combineLists(final List users, final List leftUsers) { final ImmutableList.Builder listBuilder = ImmutableList.builder(); if (users != null && !users.isEmpty()) { listBuilder.add(new DirectUserOrHeader(R.string.members)); @@ -116,7 +116,7 @@ public final class DirectUsersAdapter extends ListAdapter { private static final DiffUtil.ItemCallback DIFF_CALLBACK = new DiffUtil.ItemCallback() { @@ -21,7 +22,8 @@ public class DiscoverTopicsAdapter extends ListAdapter { +public final class FeedAdapterV2 extends ListAdapter { private static final String TAG = "FeedAdapterV2"; private final FeedItemCallback feedItemCallback; private final SelectionModeCallback selectionModeCallback; private final Set selectedPositions = new HashSet<>(); - private final Set selectedFeedModels = new HashSet<>(); + private final Set selectedFeedModels = new HashSet<>(); private PostsLayoutPreferences layoutPreferences; private boolean selectionModeActive = false; - private static final DiffUtil.ItemCallback DIFF_CALLBACK = new DiffUtil.ItemCallback() { + private static final DiffUtil.ItemCallback DIFF_CALLBACK = new DiffUtil.ItemCallback() { @Override - public boolean areItemsTheSame(@NonNull final FeedModel oldItem, @NonNull final FeedModel newItem) { - return oldItem.getPostId().equals(newItem.getPostId()); + public boolean areItemsTheSame(@NonNull final Media oldItem, @NonNull final Media newItem) { + return oldItem.getPk().equals(newItem.getPk()); } @Override - public boolean areContentsTheSame(@NonNull final FeedModel oldItem, @NonNull final FeedModel newItem) { - return oldItem.getPostId().equals(newItem.getPostId()) && oldItem.getPostCaption().equals(newItem.getPostCaption()); + public boolean areContentsTheSame(@NonNull final Media oldItem, @NonNull final Media newItem) { + final Caption oldItemCaption = oldItem.getCaption(); + final Caption newItemCaption = newItem.getCaption(); + return oldItem.getPk().equals(newItem.getPk()) && Objects.equals(getCaptionText(oldItemCaption), getCaptionText(newItemCaption)); + } + + private String getCaptionText(final Caption caption) { + if (caption == null) return null; + return caption.getText(); } }; private final AdapterSelectionCallback adapterSelectionCallback = new AdapterSelectionCallback() { @Override - public boolean onPostLongClick(final int position, final FeedModel feedModel) { + public boolean onPostLongClick(final int position, final Media feedModel) { if (!selectionModeActive) { selectionModeActive = true; notifyDataSetChanged(); @@ -69,7 +78,7 @@ public final class FeedAdapterV2 extends ListAdapter selectedFeedModels); + void onSelectionChange(final Set selectedFeedModels); void onSelectionEnd(); } diff --git a/app/src/main/java/awais/instagrabber/adapters/FeedItemCallbackAdapter.java b/app/src/main/java/awais/instagrabber/adapters/FeedItemCallbackAdapter.java index 67ac9cb9..535bb5ff 100644 --- a/app/src/main/java/awais/instagrabber/adapters/FeedItemCallbackAdapter.java +++ b/app/src/main/java/awais/instagrabber/adapters/FeedItemCallbackAdapter.java @@ -2,20 +2,21 @@ package awais.instagrabber.adapters; import android.view.View; -import awais.instagrabber.models.FeedModel; +import awais.instagrabber.repositories.responses.Media; + public class FeedItemCallbackAdapter implements FeedAdapterV2.FeedItemCallback { @Override - public void onPostClick(final FeedModel feedModel, final View profilePicView, final View mainPostImage) {} + public void onPostClick(final Media media, final View profilePicView, final View mainPostImage) {} @Override - public void onProfilePicClick(final FeedModel feedModel, final View profilePicView) {} + public void onProfilePicClick(final Media media, final View profilePicView) {} @Override - public void onNameClick(final FeedModel feedModel, final View profilePicView) {} + public void onNameClick(final Media media, final View profilePicView) {} @Override - public void onLocationClick(final FeedModel feedModel) {} + public void onLocationClick(final Media media) {} @Override public void onMentionClick(final String mention) {} @@ -24,10 +25,10 @@ public class FeedItemCallbackAdapter implements FeedAdapterV2.FeedItemCallback { public void onHashtagClick(final String hashtag) {} @Override - public void onCommentsClick(final FeedModel feedModel) {} + public void onCommentsClick(final Media media) {} @Override - public void onDownloadClick(final FeedModel feedModel, final int childPosition) {} + public void onDownloadClick(final Media media, final int childPosition) {} @Override public void onEmailClick(final String emailId) {} @@ -36,5 +37,5 @@ public class FeedItemCallbackAdapter implements FeedAdapterV2.FeedItemCallback { public void onURLClick(final String url) {} @Override - public void onSliderClick(final FeedModel feedModel, final int position) {} + public void onSliderClick(final Media media, final int position) {} } diff --git a/app/src/main/java/awais/instagrabber/adapters/LikesAdapter.java b/app/src/main/java/awais/instagrabber/adapters/LikesAdapter.java index 5592ee6d..ea509c5c 100755 --- a/app/src/main/java/awais/instagrabber/adapters/LikesAdapter.java +++ b/app/src/main/java/awais/instagrabber/adapters/LikesAdapter.java @@ -1,6 +1,5 @@ package awais.instagrabber.adapters; -import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -12,13 +11,13 @@ import java.util.List; import awais.instagrabber.adapters.viewholder.FollowsViewHolder; import awais.instagrabber.databinding.ItemFollowBinding; -import awais.instagrabber.models.ProfileModel; +import awais.instagrabber.repositories.responses.User; public final class LikesAdapter extends RecyclerView.Adapter { - private final List profileModels; + private final List profileModels; private final View.OnClickListener onClickListener; - public LikesAdapter(final List profileModels, + public LikesAdapter(final List profileModels, final View.OnClickListener onClickListener) { this.profileModels = profileModels; this.onClickListener = onClickListener; @@ -34,7 +33,7 @@ public final class LikesAdapter extends RecyclerView.Adapter @Override public void onBindViewHolder(@NonNull final FollowsViewHolder holder, final int position) { - final ProfileModel model = profileModels.get(position); + final User model = profileModels.get(position); holder.bind(model, null, onClickListener); } diff --git a/app/src/main/java/awais/instagrabber/adapters/PostViewerChildAdapter.java b/app/src/main/java/awais/instagrabber/adapters/PostViewerChildAdapter.java deleted file mode 100644 index d94f9ff3..00000000 --- a/app/src/main/java/awais/instagrabber/adapters/PostViewerChildAdapter.java +++ /dev/null @@ -1,206 +0,0 @@ -package awais.instagrabber.adapters; - -import android.net.Uri; -import android.view.Gravity; -import android.view.View; -import android.view.ViewGroup; - -import androidx.annotation.NonNull; -import androidx.appcompat.widget.AppCompatTextView; -import androidx.recyclerview.widget.DiffUtil; -import androidx.recyclerview.widget.ListAdapter; -import androidx.recyclerview.widget.RecyclerView; - -import com.facebook.drawee.backends.pipeline.Fresco; -import com.facebook.drawee.interfaces.DraweeController; -import com.facebook.imagepipeline.request.ImageRequest; -import com.facebook.imagepipeline.request.ImageRequestBuilder; -import com.google.android.exoplayer2.MediaItem; -import com.google.android.exoplayer2.Player; -import com.google.android.exoplayer2.SimpleExoPlayer; -import com.google.android.exoplayer2.source.ProgressiveMediaSource; -import com.google.android.exoplayer2.ui.PlayerView; -import com.google.android.exoplayer2.upstream.DefaultDataSourceFactory; - -import awais.instagrabber.customviews.drawee.ZoomableDraweeView; -import awais.instagrabber.models.ViewerPostModel; -import awais.instagrabber.models.enums.MediaItemType; -import awais.instagrabber.utils.Constants; -import awais.instagrabber.utils.Utils; - -public class PostViewerChildAdapter extends ListAdapter { - - private static final DiffUtil.ItemCallback diffCallback = new DiffUtil.ItemCallback() { - @Override - public boolean areItemsTheSame(@NonNull final ViewerPostModel oldItem, @NonNull final ViewerPostModel newItem) { - return oldItem.getPostId().equals(newItem.getPostId()) && oldItem.getShortCode().equals(newItem.getShortCode()); - } - - @Override - public boolean areContentsTheSame(@NonNull final ViewerPostModel oldItem, @NonNull final ViewerPostModel newItem) { - return oldItem.getPostId().equals(newItem.getPostId()) && oldItem.getShortCode().equals(newItem.getShortCode()); - } - }; - - public PostViewerChildAdapter() { - super(diffCallback); - } - - @NonNull - @Override - public ChildViewHolder onCreateViewHolder(@NonNull final ViewGroup parent, final int viewType) { - // final AppCompatTextView textView = new AppCompatTextView(parent.getContext()); - // textView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); - // return new ChildViewHolder(textView); - final MediaItemType mediaItemType = MediaItemType.valueOf(viewType); - if (mediaItemType == null) return getPlaceholder(parent); - switch (mediaItemType) { - case MEDIA_TYPE_IMAGE: - return getImageViewHolder(parent); - case MEDIA_TYPE_VIDEO: - return getVideoViewHolder(parent); - default: - return getPlaceholder(parent); - } - } - - private ChildViewHolder getImageViewHolder(final ViewGroup parent) { - final ZoomableDraweeView view = new ZoomableDraweeView(parent.getContext()); - view.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); - return new ChildViewHolder(view); - } - - private ChildViewHolder getVideoViewHolder(final ViewGroup parent) { - final PlayerView view = new PlayerView(parent.getContext()); - view.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); - return new ChildViewHolder(view); - } - - private ChildViewHolder getPlaceholder(final ViewGroup parent) { - final AppCompatTextView textView = new AppCompatTextView(parent.getContext()); - textView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); - textView.setGravity(Gravity.CENTER); - textView.setText("Placeholder"); - return new ChildViewHolder(textView); - } - - @Override - public void onBindViewHolder(@NonNull final ChildViewHolder holder, final int position) { - holder.bind(getItem(position)); - } - - @Override - public int getItemViewType(final int position) { - final ViewerPostModel item = getItem(position); - return item.getItemType().getId(); - } - - @Override - public void onViewDetachedFromWindow(@NonNull final ChildViewHolder holder) { - if (holder.itemView instanceof PlayerView) { - final Player player = ((PlayerView) holder.itemView).getPlayer(); - if (player != null) { - player.setPlayWhenReady(false); - } - } - } - - @Override - public void onViewRecycled(@NonNull final ChildViewHolder holder) { - if (holder.itemView instanceof PlayerView) { - final Player player = ((PlayerView) holder.itemView).getPlayer(); - if (player != null) { - player.release(); - } - return; - } - if (holder.itemView instanceof ZoomableDraweeView) { - ((ZoomableDraweeView) holder.itemView).setController(null); - } - } - - public static class ChildViewHolder extends RecyclerView.ViewHolder { - - public ChildViewHolder(@NonNull final View itemView) { - super(itemView); - } - - public void bind(final ViewerPostModel item) { - final MediaItemType mediaItemType = item.getItemType(); - switch (mediaItemType) { - case MEDIA_TYPE_IMAGE: - bindImage(item); - break; - case MEDIA_TYPE_VIDEO: - bindVideo(item); - break; - default: - } - } - - private void bindImage(final ViewerPostModel item) { - final ZoomableDraweeView imageView = (ZoomableDraweeView) itemView; - imageView.setController(null); - final ImageRequest requestBuilder = ImageRequestBuilder.newBuilderWithSource(Uri.parse(item.getDisplayUrl())) - .setLocalThumbnailPreviewsEnabled(true) - .setProgressiveRenderingEnabled(true) - .build(); - final DraweeController controller = Fresco.newDraweeControllerBuilder() - .setImageRequest(requestBuilder) - .setOldController(imageView.getController()) - // .setControllerListener(new BaseControllerListener() { - // - // @Override - // public void onFailure(final String id, final Throwable throwable) { - // // viewerBinding.progressView.setVisibility(View.GONE); - // } - // - // @Override - // public void onFinalImageSet(final String id, final ImageInfo imageInfo, final Animatable animatable) { - // // viewerBinding.progressView.setVisibility(View.GONE); - // } - // }) - .build(); - imageView.setController(controller); - } - - private void bindVideo(final ViewerPostModel item) { - final SimpleExoPlayer player = new SimpleExoPlayer.Builder(itemView.getContext()).build(); - final PlayerView playerView = (PlayerView) itemView; - playerView.setPlayer(player); - float vol = Utils.settingsHelper.getBoolean(Constants.MUTED_VIDEOS) ? 0f : 1f; - if (vol == 0f && Utils.sessionVolumeFull) vol = 1f; - player.setVolume(vol); - player.setPlayWhenReady(Utils.settingsHelper.getBoolean(Constants.AUTOPLAY_VIDEOS)); - final ProgressiveMediaSource mediaSource = new ProgressiveMediaSource.Factory( - new DefaultDataSourceFactory(itemView.getContext(), "instagram") - ).createMediaSource(MediaItem.fromUri(item.getDisplayUrl())); - // mediaSource.addEventListener(new Handler(), new MediaSourceEventListener() { - // @Override - // public void onLoadCompleted(final int windowIndex, @Nullable final MediaSource.MediaPeriodId mediaPeriodId, final LoadEventInfo loadEventInfo, final MediaLoadData mediaLoadData) { - // viewerBinding.progressView.setVisibility(View.GONE); - // } - // - // @Override - // public void onLoadStarted(final int windowIndex, @Nullable final MediaSource.MediaPeriodId mediaPeriodId, final LoadEventInfo loadEventInfo, final MediaLoadData mediaLoadData) { - // viewerBinding.progressView.setVisibility(View.VISIBLE); - // } - // - // @Override - // public void onLoadCanceled(final int windowIndex, @Nullable final MediaSource.MediaPeriodId mediaPeriodId, final LoadEventInfo loadEventInfo, final MediaLoadData mediaLoadData) { - // viewerBinding.progressView.setVisibility(View.GONE); - // } - // - // @Override - // public void onLoadError(final int windowIndex, @Nullable final MediaSource.MediaPeriodId mediaPeriodId, final LoadEventInfo loadEventInfo, final MediaLoadData mediaLoadData, final IOException error, final boolean wasCanceled) { - // viewerBinding.progressView.setVisibility(View.GONE); - // } - // }); - player.setMediaSource(mediaSource); - player.prepare(); - player.setVolume(vol); - // viewerBinding.bottomPanel.btnMute.setImageResource(vol == 0f ? R.drawable.ic_volume_up_24 : R.drawable.ic_volume_off_24); - // viewerBinding.bottomPanel.btnMute.setOnClickListener(onClickListener); - } - } -} diff --git a/app/src/main/java/awais/instagrabber/adapters/PostsAdapter.java b/app/src/main/java/awais/instagrabber/adapters/PostsAdapter.java deleted file mode 100755 index 521f261a..00000000 --- a/app/src/main/java/awais/instagrabber/adapters/PostsAdapter.java +++ /dev/null @@ -1,45 +0,0 @@ -package awais.instagrabber.adapters; - -import android.view.LayoutInflater; -import android.view.ViewGroup; - -import androidx.annotation.NonNull; -import androidx.recyclerview.widget.DiffUtil; - -import awais.instagrabber.adapters.viewholder.PostViewHolder; -import awais.instagrabber.databinding.ItemPostBinding; -import awais.instagrabber.models.PostModel; - -public final class PostsAdapter extends MultiSelectListAdapter { - - private static final DiffUtil.ItemCallback DIFF_CALLBACK = new DiffUtil.ItemCallback() { - @Override - public boolean areItemsTheSame(@NonNull final PostModel oldItem, @NonNull final PostModel newItem) { - return oldItem.getPostId().equals(newItem.getPostId()); - } - - @Override - public boolean areContentsTheSame(@NonNull final PostModel oldItem, @NonNull final PostModel newItem) { - return oldItem.getPostId().equals(newItem.getPostId()); - } - }; - - public PostsAdapter(final OnItemClickListener clickListener, - final OnItemLongClickListener longClickListener) { - super(DIFF_CALLBACK, clickListener, longClickListener); - } - - @NonNull - @Override - public PostViewHolder onCreateViewHolder(@NonNull final ViewGroup parent, final int viewType) { - final LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext()); - final ItemPostBinding binding = ItemPostBinding.inflate(layoutInflater, parent, false); - return new PostViewHolder(binding); - } - - @Override - public void onBindViewHolder(@NonNull final PostViewHolder holder, final int position) { - final PostModel postModel = getItem(position); - holder.bind(postModel, position, getInternalOnItemClickListener(), getInternalOnLongItemClickListener()); - } -} diff --git a/app/src/main/java/awais/instagrabber/adapters/SliderItemsAdapter.java b/app/src/main/java/awais/instagrabber/adapters/SliderItemsAdapter.java index a23b5d15..5d4092c0 100644 --- a/app/src/main/java/awais/instagrabber/adapters/SliderItemsAdapter.java +++ b/app/src/main/java/awais/instagrabber/adapters/SliderItemsAdapter.java @@ -14,25 +14,25 @@ import awais.instagrabber.customviews.VerticalDragHelper; import awais.instagrabber.databinding.ItemSliderPhotoBinding; import awais.instagrabber.databinding.LayoutExoCustomControlsBinding; import awais.instagrabber.databinding.LayoutVideoPlayerWithThumbnailBinding; -import awais.instagrabber.models.PostChild; import awais.instagrabber.models.enums.MediaItemType; +import awais.instagrabber.repositories.responses.Media; -public final class SliderItemsAdapter extends ListAdapter { +public final class SliderItemsAdapter extends ListAdapter { private final VerticalDragHelper.OnVerticalDragListener onVerticalDragListener; private final boolean loadVideoOnItemClick; private final SliderCallback sliderCallback; private final LayoutExoCustomControlsBinding controlsBinding; - private static final DiffUtil.ItemCallback DIFF_CALLBACK = new DiffUtil.ItemCallback() { + private static final DiffUtil.ItemCallback DIFF_CALLBACK = new DiffUtil.ItemCallback() { @Override - public boolean areItemsTheSame(@NonNull final PostChild oldItem, @NonNull final PostChild newItem) { - return oldItem.getPostId().equals(newItem.getPostId()); + public boolean areItemsTheSame(@NonNull final Media oldItem, @NonNull final Media newItem) { + return oldItem.getPk().equals(newItem.getPk()); } @Override - public boolean areContentsTheSame(@NonNull final PostChild oldItem, @NonNull final PostChild newItem) { - return oldItem.getPostId().equals(newItem.getPostId()); + public boolean areContentsTheSame(@NonNull final Media oldItem, @NonNull final Media newItem) { + return oldItem.getPk().equals(newItem.getPk()); } }; @@ -66,14 +66,14 @@ public final class SliderItemsAdapter extends ListAdapter { +public final class UserSearchResultsAdapter extends ListAdapter { - private static final DiffUtil.ItemCallback DIFF_CALLBACK = new DiffUtil.ItemCallback() { + private static final DiffUtil.ItemCallback DIFF_CALLBACK = new DiffUtil.ItemCallback() { @Override - public boolean areItemsTheSame(@NonNull final DirectUser oldItem, @NonNull final DirectUser newItem) { + public boolean areItemsTheSame(@NonNull final User oldItem, @NonNull final User newItem) { return oldItem.getPk() == newItem.getPk(); } @Override - public boolean areContentsTheSame(@NonNull final DirectUser oldItem, @NonNull final DirectUser newItem) { + public boolean areContentsTheSame(@NonNull final User oldItem, @NonNull final User newItem) { return oldItem.getUsername().equals(newItem.getUsername()) && oldItem.getFullName().equals(newItem.getFullName()); } @@ -54,7 +54,7 @@ public final class UserSearchResultsAdapter extends ListAdapter currentList = getCurrentList(); + final List currentList = getCurrentList(); for (int i = 0; i < currentList.size(); i++) { if (currentList.get(i).getPk() == userId) { position = i; diff --git a/app/src/main/java/awais/instagrabber/adapters/viewholder/DirectInboxItemViewHolder.java b/app/src/main/java/awais/instagrabber/adapters/viewholder/DirectInboxItemViewHolder.java index fb93b02b..b74ada34 100644 --- a/app/src/main/java/awais/instagrabber/adapters/viewholder/DirectInboxItemViewHolder.java +++ b/app/src/main/java/awais/instagrabber/adapters/viewholder/DirectInboxItemViewHolder.java @@ -22,13 +22,13 @@ import awais.instagrabber.adapters.DirectMessageInboxAdapter.OnItemClickListener import awais.instagrabber.databinding.LayoutDmInboxItemBinding; import awais.instagrabber.models.enums.DirectItemType; import awais.instagrabber.models.enums.MediaItemType; +import awais.instagrabber.repositories.responses.User; import awais.instagrabber.repositories.responses.directmessages.DirectItem; import awais.instagrabber.repositories.responses.directmessages.DirectItemReelShare; import awais.instagrabber.repositories.responses.directmessages.DirectItemVisualMedia; import awais.instagrabber.repositories.responses.directmessages.DirectThread; import awais.instagrabber.repositories.responses.directmessages.DirectThreadDirectStory; import awais.instagrabber.repositories.responses.directmessages.DirectThreadLastSeenAt; -import awais.instagrabber.repositories.responses.directmessages.DirectUser; import awais.instagrabber.repositories.responses.directmessages.RavenExpiringMediaActionSummary; import awais.instagrabber.utils.ResponseBodyUtils; import awais.instagrabber.utils.TextUtils; @@ -72,12 +72,12 @@ public final class DirectInboxItemViewHolder extends RecyclerView.ViewHolder { } private void setProfilePics(@NonNull final DirectThread thread) { - final List users = thread.getUsers(); + final List users = thread.getUsers(); if (users.size() > 1) { binding.profilePic.setVisibility(View.GONE); binding.multiPicContainer.setVisibility(View.VISIBLE); for (int i = 0; i < Math.min(3, users.size()); ++i) { - final DirectUser user = users.get(i); + final User user = users.get(i); final SimpleDraweeView view = multipleProfilePics.get(i); view.setVisibility(user == null ? View.GONE : View.VISIBLE); if (user == null) return; @@ -323,17 +323,17 @@ public final class DirectInboxItemViewHolder extends RecyclerView.ViewHolder { return subtitle; } - private String getUsername(final List users, + private String getUsername(final List users, final long userId, final long viewerId) { if (userId == viewerId) { return "You"; } - final Optional senderOptional = users.stream() - .filter(Objects::nonNull) - .filter(user -> user.getPk() == userId) - .findFirst(); - return senderOptional.map(DirectUser::getUsername).orElse(null); + final Optional senderOptional = users.stream() + .filter(Objects::nonNull) + .filter(user -> user.getPk() == userId) + .findFirst(); + return senderOptional.map(User::getUsername).orElse(null); } private void setDateTime(@NonNull final DirectItem item) { diff --git a/app/src/main/java/awais/instagrabber/adapters/viewholder/DirectUserViewHolder.java b/app/src/main/java/awais/instagrabber/adapters/viewholder/DirectUserViewHolder.java index 8dcdbeab..709a1f60 100644 --- a/app/src/main/java/awais/instagrabber/adapters/viewholder/DirectUserViewHolder.java +++ b/app/src/main/java/awais/instagrabber/adapters/viewholder/DirectUserViewHolder.java @@ -15,7 +15,7 @@ import awais.instagrabber.adapters.DirectUsersAdapter.OnDirectUserClickListener; import awais.instagrabber.adapters.DirectUsersAdapter.OnDirectUserLongClickListener; import awais.instagrabber.customviews.VerticalImageSpan; import awais.instagrabber.databinding.LayoutDmUserItemBinding; -import awais.instagrabber.repositories.responses.directmessages.DirectUser; +import awais.instagrabber.repositories.responses.User; import awais.instagrabber.utils.Utils; public class DirectUserViewHolder extends RecyclerView.ViewHolder { @@ -39,7 +39,7 @@ public class DirectUserViewHolder extends RecyclerView.ViewHolder { } public void bind(final int position, - final DirectUser user, + final User user, final boolean isAdmin, final boolean isInviter, final boolean showSelection, @@ -60,7 +60,7 @@ public class DirectUserViewHolder extends RecyclerView.ViewHolder { setSelection(showSelection, isSelected); } - private void setFullName(final DirectUser user) { + private void setFullName(final User user) { final SpannableStringBuilder sb = new SpannableStringBuilder(user.getFullName()); if (user.isVerified()) { if (verifiedSpan == null) { diff --git a/app/src/main/java/awais/instagrabber/adapters/viewholder/FeedGridItemViewHolder.java b/app/src/main/java/awais/instagrabber/adapters/viewholder/FeedGridItemViewHolder.java index bc15f8c3..81e60562 100644 --- a/app/src/main/java/awais/instagrabber/adapters/viewholder/FeedGridItemViewHolder.java +++ b/app/src/main/java/awais/instagrabber/adapters/viewholder/FeedGridItemViewHolder.java @@ -11,6 +11,7 @@ import androidx.recyclerview.widget.RecyclerView; import com.facebook.drawee.backends.pipeline.Fresco; import com.facebook.drawee.backends.pipeline.PipelineDraweeControllerBuilder; +import com.facebook.imagepipeline.common.ResizeOptions; import com.facebook.imagepipeline.request.ImageRequest; import com.facebook.imagepipeline.request.ImageRequestBuilder; @@ -20,9 +21,10 @@ import awais.instagrabber.R; import awais.instagrabber.adapters.FeedAdapterV2; import awais.instagrabber.asyncs.DownloadedCheckerAsyncTask; import awais.instagrabber.databinding.ItemFeedGridBinding; -import awais.instagrabber.models.FeedModel; -import awais.instagrabber.models.PostChild; import awais.instagrabber.models.PostsLayoutPreferences; +import awais.instagrabber.repositories.responses.Media; +import awais.instagrabber.repositories.responses.User; +import awais.instagrabber.utils.ResponseBodyUtils; import awais.instagrabber.utils.TextUtils; import static awais.instagrabber.models.PostsLayoutPreferences.PostsLayoutType.STAGGERED_GRID; @@ -36,7 +38,7 @@ public class FeedGridItemViewHolder extends RecyclerView.ViewHolder { } public void bind(final int position, - @NonNull final FeedModel feedModel, + @NonNull final Media media, @NonNull final PostsLayoutPreferences layoutPreferences, final FeedAdapterV2.FeedItemCallback feedItemCallback, final FeedAdapterV2.AdapterSelectionCallback adapterSelectionCallback, @@ -44,28 +46,117 @@ public class FeedGridItemViewHolder extends RecyclerView.ViewHolder { final boolean selected) { itemView.setOnClickListener(v -> { if (!selectionModeActive && feedItemCallback != null) { - feedItemCallback.onPostClick(feedModel, binding.profilePic, binding.postImage); + feedItemCallback.onPostClick(media, binding.profilePic, binding.postImage); return; } if (selectionModeActive && adapterSelectionCallback != null) { - adapterSelectionCallback.onPostClick(position, feedModel); + adapterSelectionCallback.onPostClick(position, media); } }); if (adapterSelectionCallback != null) { - itemView.setOnLongClickListener(v -> adapterSelectionCallback.onPostLongClick(position, feedModel)); + itemView.setOnLongClickListener(v -> adapterSelectionCallback.onPostLongClick(position, media)); } binding.selectedView.setVisibility(selected ? View.VISIBLE : View.GONE); // for rounded borders (clip view to background shape) itemView.setClipToOutline(layoutPreferences.getHasRoundedCorners()); if (layoutPreferences.getType() == STAGGERED_GRID) { - final float aspectRatio = (float) feedModel.getImageWidth() / feedModel.getImageHeight(); + final float aspectRatio = (float) media.getOriginalWidth() / media.getOriginalHeight(); binding.postImage.setAspectRatio(aspectRatio); } else { binding.postImage.setAspectRatio(1); } + setUserDetails(media, layoutPreferences); + String thumbnailUrl = null; + final int typeIconRes; + switch (media.getMediaType()) { + case MEDIA_TYPE_IMAGE: + typeIconRes = -1; + thumbnailUrl = ResponseBodyUtils.getThumbUrl(media); + break; + case MEDIA_TYPE_VIDEO: + thumbnailUrl = ResponseBodyUtils.getThumbUrl(media); + typeIconRes = R.drawable.exo_icon_play; + break; + case MEDIA_TYPE_SLIDER: + final List sliderItems = media.getCarouselMedia(); + if (sliderItems != null) { + final Media child = sliderItems.get(0); + if (child != null) { + thumbnailUrl = ResponseBodyUtils.getThumbUrl(child); + } + } + typeIconRes = R.drawable.ic_checkbox_multiple_blank_stroke; + break; + default: + typeIconRes = -1; + thumbnailUrl = null; + } + setThumbImage(thumbnailUrl); + if (typeIconRes <= 0) { + binding.typeIcon.setVisibility(View.GONE); + } else { + binding.typeIcon.setVisibility(View.VISIBLE); + binding.typeIcon.setImageResource(typeIconRes); + } + final DownloadedCheckerAsyncTask task = new DownloadedCheckerAsyncTask(result -> { + final List checkList = result.get(media.getPk()); + if (checkList == null || checkList.isEmpty()) { + return; + } + switch (media.getMediaType()) { + case MEDIA_TYPE_IMAGE: + case MEDIA_TYPE_VIDEO: + binding.downloaded.setVisibility(checkList.get(0) ? View.VISIBLE : View.GONE); + binding.downloaded.setImageTintList(ColorStateList.valueOf(itemView.getResources().getColor(R.color.green_A400))); + break; + case MEDIA_TYPE_SLIDER: + binding.downloaded.setVisibility(checkList.get(0) ? View.VISIBLE : View.GONE); + final List carouselMedia = media.getCarouselMedia(); + boolean allDownloaded = checkList.size() == (carouselMedia == null ? 0 : carouselMedia.size()); + if (allDownloaded) { + allDownloaded = checkList.stream().allMatch(downloaded -> downloaded); + } + binding.downloaded.setImageTintList(ColorStateList.valueOf(itemView.getResources().getColor( + allDownloaded ? R.color.green_A400 : R.color.yellow_400))); + break; + default: + } + }); + task.execute(media); + } + + private void setThumbImage(final String thumbnailUrl) { + if (TextUtils.isEmpty(thumbnailUrl)) { + binding.postImage.setController(null); + return; + } + final ImageRequest requestBuilder = ImageRequestBuilder.newBuilderWithSource(Uri.parse(thumbnailUrl)) + .setResizeOptions(ResizeOptions.forDimensions(binding.postImage.getWidth(), + binding.postImage.getHeight())) + .setLocalThumbnailPreviewsEnabled(true) + .setProgressiveRenderingEnabled(true) + .build(); + final PipelineDraweeControllerBuilder builder = Fresco.newDraweeControllerBuilder() + .setImageRequest(requestBuilder) + .setOldController(binding.postImage.getController()); + binding.postImage.setController(builder.build()); + } + + private void setUserDetails(@NonNull final Media media, + @NonNull final PostsLayoutPreferences layoutPreferences) { + final User user = media.getUser(); if (layoutPreferences.isAvatarVisible()) { - binding.profilePic.setVisibility(TextUtils.isEmpty(feedModel.getProfileModel().getSdProfilePic()) ? View.GONE : View.VISIBLE); - binding.profilePic.setImageURI(feedModel.getProfileModel().getSdProfilePic()); + if (user == null) { + binding.profilePic.setVisibility(View.GONE); + } else { + final String profilePicUrl = user.getProfilePicUrl(); + if (TextUtils.isEmpty(profilePicUrl)) { + binding.profilePic.setVisibility(View.GONE); + } else { + binding.profilePic.setVisibility(View.VISIBLE); + binding.profilePic.setImageURI(profilePicUrl); + } + } final ViewGroup.LayoutParams layoutParams = binding.profilePic.getLayoutParams(); @DimenRes final int dimenRes; switch (layoutPreferences.getProfilePicSize()) { @@ -88,74 +179,19 @@ public class FeedGridItemViewHolder extends RecyclerView.ViewHolder { binding.profilePic.setVisibility(View.GONE); } if (layoutPreferences.isNameVisible()) { - binding.name.setVisibility(TextUtils.isEmpty(feedModel.getProfileModel().getUsername()) ? View.GONE : View.VISIBLE); - binding.name.setText(feedModel.getProfileModel().getUsername()); + if (user == null) { + binding.name.setVisibility(View.GONE); + } else { + final String username = user.getUsername(); + if (username == null) { + binding.name.setVisibility(View.GONE); + } else { + binding.name.setVisibility(View.VISIBLE); + binding.name.setText(username); + } + } } else { binding.name.setVisibility(View.GONE); } - String thumbnailUrl = null; - final int typeIconRes; - switch (feedModel.getItemType()) { - case MEDIA_TYPE_IMAGE: - typeIconRes = -1; - thumbnailUrl = feedModel.getThumbnailUrl(); - break; - case MEDIA_TYPE_VIDEO: - thumbnailUrl = feedModel.getThumbnailUrl(); - typeIconRes = R.drawable.exo_icon_play; - break; - case MEDIA_TYPE_SLIDER: - final List sliderItems = feedModel.getSliderItems(); - if (sliderItems != null) { - thumbnailUrl = sliderItems.get(0).getThumbnailUrl(); - } - typeIconRes = R.drawable.ic_checkbox_multiple_blank_stroke; - break; - default: - typeIconRes = -1; - thumbnailUrl = null; - } - if (TextUtils.isEmpty(thumbnailUrl)) { - binding.postImage.setController(null); - return; - } - if (typeIconRes <= 0) { - binding.typeIcon.setVisibility(View.GONE); - } else { - binding.typeIcon.setVisibility(View.VISIBLE); - binding.typeIcon.setImageResource(typeIconRes); - } - final ImageRequest requestBuilder = ImageRequestBuilder.newBuilderWithSource(Uri.parse(thumbnailUrl)) - .setLocalThumbnailPreviewsEnabled(true) - .setProgressiveRenderingEnabled(true) - .build(); - final PipelineDraweeControllerBuilder builder = Fresco.newDraweeControllerBuilder() - .setImageRequest(requestBuilder) - .setOldController(binding.postImage.getController()); - binding.postImage.setController(builder.build()); - final DownloadedCheckerAsyncTask task = new DownloadedCheckerAsyncTask(result -> { - final List checkList = result.get(feedModel.getPostId()); - if (checkList == null || checkList.isEmpty()) { - return; - } - switch (feedModel.getItemType()) { - case MEDIA_TYPE_IMAGE: - case MEDIA_TYPE_VIDEO: - binding.downloaded.setVisibility(checkList.get(0) ? View.VISIBLE : View.GONE); - binding.downloaded.setImageTintList(ColorStateList.valueOf(itemView.getResources().getColor(R.color.green_A400))); - break; - case MEDIA_TYPE_SLIDER: - binding.downloaded.setVisibility(checkList.get(0) ? View.VISIBLE : View.GONE); - boolean allDownloaded = checkList.size() == feedModel.getSliderItems().size(); - if (allDownloaded) { - allDownloaded = checkList.stream().allMatch(downloaded -> downloaded); - } - binding.downloaded.setImageTintList(ColorStateList.valueOf(itemView.getResources().getColor( - allDownloaded ? R.color.green_A400 : R.color.yellow_400))); - break; - default: - } - }); - task.execute(feedModel); } } diff --git a/app/src/main/java/awais/instagrabber/adapters/viewholder/FeedStoryViewHolder.java b/app/src/main/java/awais/instagrabber/adapters/viewholder/FeedStoryViewHolder.java index 76b309e9..efc16e02 100644 --- a/app/src/main/java/awais/instagrabber/adapters/viewholder/FeedStoryViewHolder.java +++ b/app/src/main/java/awais/instagrabber/adapters/viewholder/FeedStoryViewHolder.java @@ -5,7 +5,7 @@ import androidx.recyclerview.widget.RecyclerView; import awais.instagrabber.adapters.FeedStoriesAdapter; import awais.instagrabber.databinding.ItemHighlightBinding; import awais.instagrabber.models.FeedStoryModel; -import awais.instagrabber.models.ProfileModel; +import awais.instagrabber.repositories.responses.User; public final class FeedStoryViewHolder extends RecyclerView.ViewHolder { @@ -28,10 +28,10 @@ public final class FeedStoryViewHolder extends RecyclerView.ViewHolder { if (listener != null) listener.onFeedStoryLongClick(model, position); return true; }); - final ProfileModel profileModel = model.getProfileModel(); + final User profileModel = model.getProfileModel(); binding.title.setText(profileModel.getUsername()); binding.title.setAlpha(model.isFullyRead() ? 0.5F : 1.0F); - binding.icon.setImageURI(profileModel.getSdProfilePic()); + binding.icon.setImageURI(profileModel.getProfilePicUrl()); binding.icon.setAlpha(model.isFullyRead() ? 0.5F : 1.0F); } } \ No newline at end of file diff --git a/app/src/main/java/awais/instagrabber/adapters/viewholder/FollowsViewHolder.java b/app/src/main/java/awais/instagrabber/adapters/viewholder/FollowsViewHolder.java index 1f38cecb..6f48be53 100755 --- a/app/src/main/java/awais/instagrabber/adapters/viewholder/FollowsViewHolder.java +++ b/app/src/main/java/awais/instagrabber/adapters/viewholder/FollowsViewHolder.java @@ -1,6 +1,5 @@ package awais.instagrabber.adapters.viewholder; -import android.util.Log; import android.view.View; import androidx.recyclerview.widget.RecyclerView; @@ -9,7 +8,7 @@ import java.util.List; import awais.instagrabber.databinding.ItemFollowBinding; import awais.instagrabber.models.FollowModel; -import awais.instagrabber.models.ProfileModel; +import awais.instagrabber.repositories.responses.User; public final class FollowsViewHolder extends RecyclerView.ViewHolder { @@ -20,18 +19,18 @@ public final class FollowsViewHolder extends RecyclerView.ViewHolder { this.binding = binding; } - public void bind(final ProfileModel model, + public void bind(final User model, final List admins, final View.OnClickListener onClickListener) { if (model == null) return; itemView.setTag(model); itemView.setOnClickListener(onClickListener); binding.tvUsername.setText(model.getUsername()); - binding.tvFullName.setText(model.getName()); - if (admins != null && admins.contains(Long.parseLong(model.getId()))) { + binding.tvFullName.setText(model.getFullName()); + if (admins != null && admins.contains(model.getPk())) { binding.isAdmin.setVisibility(View.VISIBLE); } - binding.ivProfilePic.setImageURI(model.getSdProfilePic()); + binding.ivProfilePic.setImageURI(model.getProfilePicUrl()); } public void bind(final FollowModel model, diff --git a/app/src/main/java/awais/instagrabber/adapters/viewholder/PostViewHolder.java b/app/src/main/java/awais/instagrabber/adapters/viewholder/PostViewHolder.java deleted file mode 100755 index 5900ebc1..00000000 --- a/app/src/main/java/awais/instagrabber/adapters/viewholder/PostViewHolder.java +++ /dev/null @@ -1,43 +0,0 @@ -package awais.instagrabber.adapters.viewholder; - -import android.view.View; - -import androidx.annotation.NonNull; -import androidx.recyclerview.widget.RecyclerView; - -import awais.instagrabber.R; -import awais.instagrabber.adapters.MultiSelectListAdapter.OnItemClickListener; -import awais.instagrabber.adapters.MultiSelectListAdapter.OnItemLongClickListener; -import awais.instagrabber.databinding.ItemPostBinding; -import awais.instagrabber.models.PostModel; -import awais.instagrabber.models.enums.MediaItemType; - -public final class PostViewHolder extends RecyclerView.ViewHolder { - private final ItemPostBinding binding; - - public PostViewHolder(@NonNull final ItemPostBinding binding) { - super(binding.getRoot()); - this.binding = binding; - } - - public void bind(final PostModel postModel, - final int position, - final OnItemClickListener clickListener, - final OnItemLongClickListener longClickListener) { - if (postModel == null) return; - // postModel.setPosition(position); - itemView.setOnClickListener(v -> clickListener.onItemClick(postModel, position)); - itemView.setOnLongClickListener(v -> longClickListener.onItemLongClick(postModel, position)); - - final MediaItemType itemType = postModel.getItemType(); - final boolean isSlider = itemType == MediaItemType.MEDIA_TYPE_SLIDER; - - binding.isDownloaded.setVisibility(postModel.isDownloaded() ? View.VISIBLE : View.GONE); - - binding.typeIcon.setVisibility(itemType == MediaItemType.MEDIA_TYPE_VIDEO || isSlider ? View.VISIBLE : View.GONE); - binding.typeIcon.setImageResource(isSlider ? R.drawable.ic_slider_24 : R.drawable.ic_video_24); - - binding.selectedView.setVisibility(postModel.isSelected() ? View.VISIBLE : View.GONE); - binding.postImage.setImageURI(postModel.getThumbnailUrl()); - } -} \ No newline at end of file diff --git a/app/src/main/java/awais/instagrabber/adapters/viewholder/SliderItemViewHolder.java b/app/src/main/java/awais/instagrabber/adapters/viewholder/SliderItemViewHolder.java index 64b00fb6..379e6c68 100644 --- a/app/src/main/java/awais/instagrabber/adapters/viewholder/SliderItemViewHolder.java +++ b/app/src/main/java/awais/instagrabber/adapters/viewholder/SliderItemViewHolder.java @@ -6,7 +6,7 @@ import androidx.annotation.NonNull; import androidx.recyclerview.widget.RecyclerView; import awais.instagrabber.adapters.SliderItemsAdapter; -import awais.instagrabber.models.PostChild; +import awais.instagrabber.repositories.responses.Media; public abstract class SliderItemViewHolder extends RecyclerView.ViewHolder { private static final String TAG = "FeedSliderItemViewHolder"; @@ -15,7 +15,7 @@ public abstract class SliderItemViewHolder extends RecyclerView.ViewHolder { super(itemView); } - public abstract void bind(final PostChild model, + public abstract void bind(final Media media, final int position, final SliderItemsAdapter.SliderCallback sliderCallback); } diff --git a/app/src/main/java/awais/instagrabber/adapters/viewholder/SliderPhotoViewHolder.java b/app/src/main/java/awais/instagrabber/adapters/viewholder/SliderPhotoViewHolder.java index e7d94974..37479a4f 100644 --- a/app/src/main/java/awais/instagrabber/adapters/viewholder/SliderPhotoViewHolder.java +++ b/app/src/main/java/awais/instagrabber/adapters/viewholder/SliderPhotoViewHolder.java @@ -17,7 +17,8 @@ import awais.instagrabber.adapters.SliderItemsAdapter; import awais.instagrabber.customviews.VerticalDragHelper; import awais.instagrabber.customviews.drawee.AnimatedZoomableController; import awais.instagrabber.databinding.ItemSliderPhotoBinding; -import awais.instagrabber.models.PostChild; +import awais.instagrabber.repositories.responses.Media; +import awais.instagrabber.utils.ResponseBodyUtils; public class SliderPhotoViewHolder extends SliderItemViewHolder { private static final String TAG = "FeedSliderPhotoViewHolder"; @@ -32,11 +33,11 @@ public class SliderPhotoViewHolder extends SliderItemViewHolder { this.onVerticalDragListener = onVerticalDragListener; } - public void bind(@NonNull final PostChild model, + public void bind(@NonNull final Media model, final int position, final SliderItemsAdapter.SliderCallback sliderCallback) { final ImageRequest requestBuilder = ImageRequestBuilder - .newBuilderWithSource(Uri.parse(model.getDisplayUrl())) + .newBuilderWithSource(Uri.parse(ResponseBodyUtils.getImageUrl(model))) .setLocalThumbnailPreviewsEnabled(true) .build(); binding.getRoot() @@ -59,7 +60,7 @@ public class SliderPhotoViewHolder extends SliderItemViewHolder { } } }) - .setLowResImageRequest(ImageRequest.fromUri(model.getThumbnailUrl())) + .setLowResImageRequest(ImageRequest.fromUri(ResponseBodyUtils.getThumbUrl(model))) .build()); // binding.getRoot().setOnClickListener(v -> { // if (sliderCallback != null) { diff --git a/app/src/main/java/awais/instagrabber/adapters/viewholder/SliderVideoViewHolder.java b/app/src/main/java/awais/instagrabber/adapters/viewholder/SliderVideoViewHolder.java index 613c2250..e91ab4b2 100644 --- a/app/src/main/java/awais/instagrabber/adapters/viewholder/SliderVideoViewHolder.java +++ b/app/src/main/java/awais/instagrabber/adapters/viewholder/SliderVideoViewHolder.java @@ -5,15 +5,19 @@ import android.view.ViewGroup; import androidx.annotation.NonNull; +import java.util.List; + import awais.instagrabber.adapters.SliderItemsAdapter; import awais.instagrabber.customviews.VerticalDragHelper; import awais.instagrabber.customviews.VideoPlayerCallbackAdapter; import awais.instagrabber.customviews.VideoPlayerViewHelper; import awais.instagrabber.databinding.LayoutExoCustomControlsBinding; import awais.instagrabber.databinding.LayoutVideoPlayerWithThumbnailBinding; -import awais.instagrabber.models.PostChild; +import awais.instagrabber.repositories.responses.Media; +import awais.instagrabber.repositories.responses.VideoVersion; import awais.instagrabber.utils.Constants; import awais.instagrabber.utils.NumberUtils; +import awais.instagrabber.utils.ResponseBodyUtils; import awais.instagrabber.utils.Utils; import static awais.instagrabber.utils.Utils.settingsHelper; @@ -57,7 +61,7 @@ public class SliderVideoViewHolder extends SliderItemViewHolder { } } - public void bind(@NonNull final PostChild model, + public void bind(@NonNull final Media media, final int position, final SliderItemsAdapter.SliderCallback sliderCallback) { final float vol = settingsHelper.getBoolean(Constants.MUTED_VIDEOS) ? 0f : 1f; @@ -82,7 +86,7 @@ public class SliderVideoViewHolder extends SliderItemViewHolder { // binding.itemFeedBottom.btnMute.setVisibility(View.VISIBLE); final ViewGroup.LayoutParams layoutParams = binding.playerView.getLayoutParams(); final int requiredWidth = Utils.displayMetrics.widthPixels; - final int resultingHeight = NumberUtils.getResultingHeight(requiredWidth, model.getHeight(), model.getWidth()); + final int resultingHeight = NumberUtils.getResultingHeight(requiredWidth, media.getOriginalHeight(), media.getOriginalWidth()); layoutParams.width = requiredWidth; layoutParams.height = resultingHeight; binding.playerView.requestLayout(); @@ -103,13 +107,21 @@ public class SliderVideoViewHolder extends SliderItemViewHolder { } } }; - final float aspectRatio = (float) model.getWidth() / model.getHeight(); + final float aspectRatio = (float) media.getOriginalWidth() / media.getOriginalHeight(); + String videoUrl = null; + final List videoVersions = media.getVideoVersions(); + if (videoVersions != null && !videoVersions.isEmpty()) { + final VideoVersion videoVersion = videoVersions.get(0); + if (videoVersion != null) { + videoUrl = videoVersion.getUrl(); + } + } videoPlayerViewHelper = new VideoPlayerViewHelper(binding.getRoot().getContext(), binding, - model.getDisplayUrl(), + videoUrl, vol, aspectRatio, - model.getThumbnailUrl(), + ResponseBodyUtils.getThumbUrl(media), loadVideoOnItemClick, controlsBinding, videoPlayerCallback); diff --git a/app/src/main/java/awais/instagrabber/adapters/viewholder/StoryListViewHolder.java b/app/src/main/java/awais/instagrabber/adapters/viewholder/StoryListViewHolder.java index b2bb5d17..9633e549 100644 --- a/app/src/main/java/awais/instagrabber/adapters/viewholder/StoryListViewHolder.java +++ b/app/src/main/java/awais/instagrabber/adapters/viewholder/StoryListViewHolder.java @@ -1,6 +1,5 @@ package awais.instagrabber.adapters.viewholder; -import android.text.TextUtils; import android.view.View; import androidx.recyclerview.widget.RecyclerView; @@ -34,7 +33,7 @@ public final class StoryListViewHolder extends RecyclerView.ViewHolder { binding.tvDate.setText(model.getDateTime()); binding.tvUsername.setText(model.getProfileModel().getUsername()); - binding.ivProfilePic.setImageURI(model.getProfileModel().getSdProfilePic()); + binding.ivProfilePic.setImageURI(model.getProfileModel().getProfilePicUrl()); binding.ivProfilePic.setOnClickListener(v -> { if (notificationClickListener == null) return; notificationClickListener.onProfileClick(model.getProfileModel().getUsername()); @@ -43,8 +42,7 @@ public final class StoryListViewHolder extends RecyclerView.ViewHolder { if (model.getFirstStoryModel() != null) { binding.ivPreviewPic.setVisibility(View.VISIBLE); binding.ivPreviewPic.setImageURI(model.getFirstStoryModel().getThumbnail()); - } - else binding.ivPreviewPic.setVisibility(View.INVISIBLE); + } else binding.ivPreviewPic.setVisibility(View.INVISIBLE); float alpha = model.isFullyRead() ? 0.5F : 1.0F; binding.ivProfilePic.setAlpha(alpha); diff --git a/app/src/main/java/awais/instagrabber/adapters/viewholder/TopicClusterViewHolder.java b/app/src/main/java/awais/instagrabber/adapters/viewholder/TopicClusterViewHolder.java index 6e7eaed3..b0fda576 100644 --- a/app/src/main/java/awais/instagrabber/adapters/viewholder/TopicClusterViewHolder.java +++ b/app/src/main/java/awais/instagrabber/adapters/viewholder/TopicClusterViewHolder.java @@ -27,6 +27,7 @@ import awais.instagrabber.R; import awais.instagrabber.adapters.DiscoverTopicsAdapter; import awais.instagrabber.databinding.ItemDiscoverTopicBinding; import awais.instagrabber.models.TopicCluster; +import awais.instagrabber.utils.ResponseBodyUtils; public class TopicClusterViewHolder extends RecyclerView.ViewHolder { private final ItemDiscoverTopicBinding binding; @@ -57,43 +58,48 @@ public class TopicClusterViewHolder extends RecyclerView.ViewHolder { } // binding.title.setTransitionName("title-" + topicCluster.getId()); binding.cover.setTransitionName("cover-" + topicCluster.getId()); - final ImageRequest imageRequest = ImageRequestBuilder - .newBuilderWithSource(Uri.parse(topicCluster.getCoverMedia().getDisplayUrl())) - .build(); - final ImagePipeline imagePipeline = Fresco.getImagePipeline(); - final DataSource> dataSource = imagePipeline - .fetchDecodedImage(imageRequest, CallerThreadExecutor.getInstance()); - dataSource.subscribe(new BaseBitmapDataSubscriber() { - @Override - public void onNewResultImpl(@Nullable Bitmap bitmap) { - if (dataSource.isFinished()) { + final String thumbUrl = ResponseBodyUtils.getThumbUrl(topicCluster.getCoverMedia()); + if (thumbUrl == null) { + binding.cover.setImageURI((String) null); + } else { + final ImageRequest imageRequest = ImageRequestBuilder + .newBuilderWithSource(Uri.parse(thumbUrl)) + .build(); + final ImagePipeline imagePipeline = Fresco.getImagePipeline(); + final DataSource> dataSource = imagePipeline + .fetchDecodedImage(imageRequest, CallerThreadExecutor.getInstance()); + dataSource.subscribe(new BaseBitmapDataSubscriber() { + @Override + public void onNewResultImpl(@Nullable Bitmap bitmap) { + if (dataSource.isFinished()) { + dataSource.close(); + } + if (bitmap != null) { + Palette.from(bitmap).generate(p -> { + final Palette.Swatch swatch = p.getDominantSwatch(); + final Resources resources = itemView.getResources(); + int titleTextColor = resources.getColor(R.color.white); + if (swatch != null) { + backgroundColor.set(swatch.getRgb()); + GradientDrawable gd = new GradientDrawable( + GradientDrawable.Orientation.TOP_BOTTOM, + new int[]{Color.TRANSPARENT, backgroundColor.get()}); + titleTextColor = swatch.getTitleTextColor(); + binding.background.setBackground(gd); + } + titleColor.set(titleTextColor); + binding.title.setTextColor(titleTextColor); + }); + } + } + + @Override + public void onFailureImpl(@NonNull DataSource dataSource) { dataSource.close(); } - if (bitmap != null) { - Palette.from(bitmap).generate(p -> { - final Palette.Swatch swatch = p.getDominantSwatch(); - final Resources resources = itemView.getResources(); - int titleTextColor = resources.getColor(R.color.white); - if (swatch != null) { - backgroundColor.set(swatch.getRgb()); - GradientDrawable gd = new GradientDrawable( - GradientDrawable.Orientation.TOP_BOTTOM, - new int[]{Color.TRANSPARENT, backgroundColor.get()}); - titleTextColor = swatch.getTitleTextColor(); - binding.background.setBackground(gd); - } - titleColor.set(titleTextColor); - binding.title.setTextColor(titleTextColor); - }); - } - } - - @Override - public void onFailureImpl(@NonNull DataSource dataSource) { - dataSource.close(); - } - }, CallerThreadExecutor.getInstance()); - binding.cover.setImageRequest(imageRequest); + }, CallerThreadExecutor.getInstance()); + binding.cover.setImageRequest(imageRequest); + } binding.title.setText(topicCluster.getTitle()); } } diff --git a/app/src/main/java/awais/instagrabber/adapters/viewholder/comments/ChildCommentViewHolder.java b/app/src/main/java/awais/instagrabber/adapters/viewholder/comments/ChildCommentViewHolder.java index 8e9a7941..fd4cfb12 100644 --- a/app/src/main/java/awais/instagrabber/adapters/viewholder/comments/ChildCommentViewHolder.java +++ b/app/src/main/java/awais/instagrabber/adapters/viewholder/comments/ChildCommentViewHolder.java @@ -9,7 +9,7 @@ import awais.instagrabber.R; import awais.instagrabber.adapters.CommentsAdapter.CommentCallback; import awais.instagrabber.databinding.ItemCommentSmallBinding; import awais.instagrabber.models.CommentModel; -import awais.instagrabber.models.ProfileModel; +import awais.instagrabber.repositories.responses.User; import awais.instagrabber.utils.Utils; public final class ChildCommentViewHolder extends RecyclerView.ViewHolder { @@ -75,10 +75,10 @@ public final class ChildCommentViewHolder extends RecyclerView.ViewHolder { } private void setUser(final CommentModel comment) { - final ProfileModel profileModel = comment.getProfileModel(); + final User profileModel = comment.getProfileModel(); if (profileModel == null) return; binding.tvUsername.setText(profileModel.getUsername()); - binding.ivProfilePic.setImageURI(profileModel.getSdProfilePic()); + binding.ivProfilePic.setImageURI(profileModel.getProfilePicUrl()); binding.isVerified.setVisibility(profileModel.isVerified() ? View.VISIBLE : View.GONE); } diff --git a/app/src/main/java/awais/instagrabber/adapters/viewholder/comments/ParentCommentViewHolder.java b/app/src/main/java/awais/instagrabber/adapters/viewholder/comments/ParentCommentViewHolder.java index 20637801..31edac56 100644 --- a/app/src/main/java/awais/instagrabber/adapters/viewholder/comments/ParentCommentViewHolder.java +++ b/app/src/main/java/awais/instagrabber/adapters/viewholder/comments/ParentCommentViewHolder.java @@ -9,7 +9,7 @@ import awais.instagrabber.R; import awais.instagrabber.adapters.CommentsAdapter.CommentCallback; import awais.instagrabber.databinding.ItemCommentBinding; import awais.instagrabber.models.CommentModel; -import awais.instagrabber.models.ProfileModel; +import awais.instagrabber.repositories.responses.User; import awais.instagrabber.utils.Utils; public final class ParentCommentViewHolder extends RecyclerView.ViewHolder { @@ -75,10 +75,10 @@ public final class ParentCommentViewHolder extends RecyclerView.ViewHolder { } private void setUser(final CommentModel comment) { - final ProfileModel profileModel = comment.getProfileModel(); + final User profileModel = comment.getProfileModel(); if (profileModel == null) return; binding.tvUsername.setText(profileModel.getUsername()); - binding.ivProfilePic.setImageURI(profileModel.getSdProfilePic()); + binding.ivProfilePic.setImageURI(profileModel.getProfilePicUrl()); binding.isVerified.setVisibility(profileModel.isVerified() ? View.VISIBLE : View.GONE); } diff --git a/app/src/main/java/awais/instagrabber/adapters/viewholder/directmessages/DirectItemActionLogViewHolder.java b/app/src/main/java/awais/instagrabber/adapters/viewholder/directmessages/DirectItemActionLogViewHolder.java index 600f224d..832a4546 100644 --- a/app/src/main/java/awais/instagrabber/adapters/viewholder/directmessages/DirectItemActionLogViewHolder.java +++ b/app/src/main/java/awais/instagrabber/adapters/viewholder/directmessages/DirectItemActionLogViewHolder.java @@ -16,7 +16,7 @@ import awais.instagrabber.R; import awais.instagrabber.databinding.LayoutDmActionLogBinding; import awais.instagrabber.databinding.LayoutDmBaseBinding; import awais.instagrabber.interfaces.MentionClickListener; -import awais.instagrabber.models.ProfileModel; +import awais.instagrabber.repositories.responses.User; import awais.instagrabber.repositories.responses.directmessages.DirectItem; import awais.instagrabber.repositories.responses.directmessages.DirectItemActionLog; import awais.instagrabber.repositories.responses.directmessages.DirectThread; @@ -28,7 +28,7 @@ public class DirectItemActionLogViewHolder extends DirectItemViewHolder { public DirectItemActionLogViewHolder(@NonNull final LayoutDmBaseBinding baseBinding, final LayoutDmActionLogBinding binding, - final ProfileModel currentUser, + final User currentUser, final DirectThread thread, final MentionClickListener mentionClickListener, final View.OnClickListener onClickListener) { diff --git a/app/src/main/java/awais/instagrabber/adapters/viewholder/directmessages/DirectItemAnimatedMediaViewHolder.java b/app/src/main/java/awais/instagrabber/adapters/viewholder/directmessages/DirectItemAnimatedMediaViewHolder.java index c4744ce6..bcd9de73 100644 --- a/app/src/main/java/awais/instagrabber/adapters/viewholder/directmessages/DirectItemAnimatedMediaViewHolder.java +++ b/app/src/main/java/awais/instagrabber/adapters/viewholder/directmessages/DirectItemAnimatedMediaViewHolder.java @@ -11,9 +11,9 @@ import com.facebook.drawee.backends.pipeline.Fresco; import awais.instagrabber.databinding.LayoutDmAnimatedMediaBinding; import awais.instagrabber.databinding.LayoutDmBaseBinding; import awais.instagrabber.interfaces.MentionClickListener; -import awais.instagrabber.models.ProfileModel; -import awais.instagrabber.repositories.responses.directmessages.AnimatedMediaFixedHeight; -import awais.instagrabber.repositories.responses.directmessages.AnimatedMediaImages; +import awais.instagrabber.repositories.responses.AnimatedMediaFixedHeight; +import awais.instagrabber.repositories.responses.AnimatedMediaImages; +import awais.instagrabber.repositories.responses.User; import awais.instagrabber.repositories.responses.directmessages.DirectItem; import awais.instagrabber.repositories.responses.directmessages.DirectItemAnimatedMedia; import awais.instagrabber.repositories.responses.directmessages.DirectThread; @@ -25,7 +25,7 @@ public class DirectItemAnimatedMediaViewHolder extends DirectItemViewHolder { public DirectItemAnimatedMediaViewHolder(@NonNull final LayoutDmBaseBinding baseBinding, @NonNull final LayoutDmAnimatedMediaBinding binding, - final ProfileModel currentUser, + final User currentUser, final DirectThread thread, final MentionClickListener mentionClickListener, final View.OnClickListener onClickListener) { diff --git a/app/src/main/java/awais/instagrabber/adapters/viewholder/directmessages/DirectItemDefaultViewHolder.java b/app/src/main/java/awais/instagrabber/adapters/viewholder/directmessages/DirectItemDefaultViewHolder.java index 72b32afa..ea51950e 100644 --- a/app/src/main/java/awais/instagrabber/adapters/viewholder/directmessages/DirectItemDefaultViewHolder.java +++ b/app/src/main/java/awais/instagrabber/adapters/viewholder/directmessages/DirectItemDefaultViewHolder.java @@ -9,7 +9,7 @@ import awais.instagrabber.R; import awais.instagrabber.databinding.LayoutDmBaseBinding; import awais.instagrabber.databinding.LayoutDmTextBinding; import awais.instagrabber.interfaces.MentionClickListener; -import awais.instagrabber.models.ProfileModel; +import awais.instagrabber.repositories.responses.User; import awais.instagrabber.repositories.responses.directmessages.DirectItem; import awais.instagrabber.repositories.responses.directmessages.DirectThread; @@ -19,7 +19,7 @@ public class DirectItemDefaultViewHolder extends DirectItemViewHolder { public DirectItemDefaultViewHolder(@NonNull final LayoutDmBaseBinding baseBinding, @NonNull final LayoutDmTextBinding binding, - final ProfileModel currentUser, + final User currentUser, final DirectThread thread, final MentionClickListener mentionClickListener, final View.OnClickListener onClickListener) { diff --git a/app/src/main/java/awais/instagrabber/adapters/viewholder/directmessages/DirectItemLikeViewHolder.java b/app/src/main/java/awais/instagrabber/adapters/viewholder/directmessages/DirectItemLikeViewHolder.java index 59690233..62ab7334 100644 --- a/app/src/main/java/awais/instagrabber/adapters/viewholder/directmessages/DirectItemLikeViewHolder.java +++ b/app/src/main/java/awais/instagrabber/adapters/viewholder/directmessages/DirectItemLikeViewHolder.java @@ -7,22 +7,19 @@ import androidx.annotation.NonNull; import awais.instagrabber.databinding.LayoutDmBaseBinding; import awais.instagrabber.databinding.LayoutDmLikeBinding; import awais.instagrabber.interfaces.MentionClickListener; -import awais.instagrabber.models.ProfileModel; +import awais.instagrabber.repositories.responses.User; import awais.instagrabber.repositories.responses.directmessages.DirectItem; import awais.instagrabber.repositories.responses.directmessages.DirectThread; public class DirectItemLikeViewHolder extends DirectItemViewHolder { - private final LayoutDmLikeBinding binding; - public DirectItemLikeViewHolder(@NonNull final LayoutDmBaseBinding baseBinding, @NonNull final LayoutDmLikeBinding binding, - final ProfileModel currentUser, + final User currentUser, final DirectThread thread, final View.OnClickListener onClickListener, final MentionClickListener mentionClickListener) { super(baseBinding, currentUser, thread, onClickListener); - this.binding = binding; setItemView(binding.getRoot()); } diff --git a/app/src/main/java/awais/instagrabber/adapters/viewholder/directmessages/DirectItemLinkViewHolder.java b/app/src/main/java/awais/instagrabber/adapters/viewholder/directmessages/DirectItemLinkViewHolder.java index b2f1df0f..49be9861 100644 --- a/app/src/main/java/awais/instagrabber/adapters/viewholder/directmessages/DirectItemLinkViewHolder.java +++ b/app/src/main/java/awais/instagrabber/adapters/viewholder/directmessages/DirectItemLinkViewHolder.java @@ -8,7 +8,7 @@ import androidx.annotation.NonNull; import awais.instagrabber.databinding.LayoutDmBaseBinding; import awais.instagrabber.databinding.LayoutDmLinkBinding; import awais.instagrabber.interfaces.MentionClickListener; -import awais.instagrabber.models.ProfileModel; +import awais.instagrabber.repositories.responses.User; import awais.instagrabber.repositories.responses.directmessages.DirectItem; import awais.instagrabber.repositories.responses.directmessages.DirectItemLink; import awais.instagrabber.repositories.responses.directmessages.DirectItemLinkContext; @@ -21,7 +21,7 @@ public class DirectItemLinkViewHolder extends DirectItemViewHolder { public DirectItemLinkViewHolder(@NonNull final LayoutDmBaseBinding baseBinding, final LayoutDmLinkBinding binding, - final ProfileModel currentUser, + final User currentUser, final DirectThread thread, final MentionClickListener mentionClickListener, final View.OnClickListener onClickListener) { diff --git a/app/src/main/java/awais/instagrabber/adapters/viewholder/directmessages/DirectItemMediaShareViewHolder.java b/app/src/main/java/awais/instagrabber/adapters/viewholder/directmessages/DirectItemMediaShareViewHolder.java index 5c5ab369..ba7d65a6 100644 --- a/app/src/main/java/awais/instagrabber/adapters/viewholder/directmessages/DirectItemMediaShareViewHolder.java +++ b/app/src/main/java/awais/instagrabber/adapters/viewholder/directmessages/DirectItemMediaShareViewHolder.java @@ -15,35 +15,32 @@ import awais.instagrabber.R; import awais.instagrabber.databinding.LayoutDmBaseBinding; import awais.instagrabber.databinding.LayoutDmMediaShareBinding; import awais.instagrabber.interfaces.MentionClickListener; -import awais.instagrabber.models.ProfileModel; import awais.instagrabber.models.enums.DirectItemType; import awais.instagrabber.models.enums.MediaItemType; -import awais.instagrabber.repositories.responses.directmessages.Caption; +import awais.instagrabber.repositories.responses.Caption; +import awais.instagrabber.repositories.responses.Media; +import awais.instagrabber.repositories.responses.User; import awais.instagrabber.repositories.responses.directmessages.DirectItem; import awais.instagrabber.repositories.responses.directmessages.DirectItemClip; import awais.instagrabber.repositories.responses.directmessages.DirectItemFelixShare; -import awais.instagrabber.repositories.responses.directmessages.DirectItemMedia; import awais.instagrabber.repositories.responses.directmessages.DirectThread; -import awais.instagrabber.repositories.responses.directmessages.DirectUser; import awais.instagrabber.utils.NumberUtils; import awais.instagrabber.utils.ResponseBodyUtils; public class DirectItemMediaShareViewHolder extends DirectItemViewHolder { private final LayoutDmMediaShareBinding binding; - private final int maxWidth; private final RoundingParams incomingRoundingParams; private final RoundingParams outgoingRoundingParams; public DirectItemMediaShareViewHolder(@NonNull final LayoutDmBaseBinding baseBinding, @NonNull final LayoutDmMediaShareBinding binding, - final ProfileModel currentUser, + final User currentUser, final DirectThread thread, final MentionClickListener mentionClickListener, final View.OnClickListener onClickListener) { super(baseBinding, currentUser, thread, onClickListener); this.binding = binding; - maxWidth = windowWidth - margin - dmRadiusSmall; incomingRoundingParams = RoundingParams.fromCornersRadii(dmRadiusSmall, dmRadius, dmRadius, dmRadius); outgoingRoundingParams = RoundingParams.fromCornersRadii(dmRadius, dmRadiusSmall, dmRadius, dmRadius); setItemView(binding.getRoot()); @@ -59,7 +56,7 @@ public class DirectItemMediaShareViewHolder extends DirectItemViewHolder { binding.topBg.setBackgroundResource(messageDirection == MessageDirection.INCOMING ? R.drawable.bg_media_share_top_incoming : R.drawable.bg_media_share_top_outgoing); - DirectItemMedia media = null; + Media media = null; if (item.getItemType() == DirectItemType.MEDIA_SHARE) { media = item.getMediaShare(); } else if (item.getItemType() == DirectItemType.CLIP) { @@ -72,7 +69,7 @@ public class DirectItemMediaShareViewHolder extends DirectItemViewHolder { media = felixShare.getVideo(); } if (media == null) return; - final DirectUser user = media.getUser(); + final User user = media.getUser(); if (user != null) { binding.username.setVisibility(View.VISIBLE); binding.profilePic.setVisibility(View.VISIBLE); diff --git a/app/src/main/java/awais/instagrabber/adapters/viewholder/directmessages/DirectItemMediaViewHolder.java b/app/src/main/java/awais/instagrabber/adapters/viewholder/directmessages/DirectItemMediaViewHolder.java index b8de49b1..ddf9ef94 100644 --- a/app/src/main/java/awais/instagrabber/adapters/viewholder/directmessages/DirectItemMediaViewHolder.java +++ b/app/src/main/java/awais/instagrabber/adapters/viewholder/directmessages/DirectItemMediaViewHolder.java @@ -13,12 +13,12 @@ import com.facebook.drawee.generic.RoundingParams; import awais.instagrabber.databinding.LayoutDmBaseBinding; import awais.instagrabber.databinding.LayoutDmMediaBinding; import awais.instagrabber.interfaces.MentionClickListener; -import awais.instagrabber.models.ProfileModel; import awais.instagrabber.models.enums.MediaItemType; +import awais.instagrabber.repositories.responses.ImageVersions2; +import awais.instagrabber.repositories.responses.Media; +import awais.instagrabber.repositories.responses.User; import awais.instagrabber.repositories.responses.directmessages.DirectItem; -import awais.instagrabber.repositories.responses.directmessages.DirectItemMedia; import awais.instagrabber.repositories.responses.directmessages.DirectThread; -import awais.instagrabber.repositories.responses.directmessages.ImageVersions2; import awais.instagrabber.utils.NumberUtils; import awais.instagrabber.utils.ResponseBodyUtils; @@ -30,7 +30,7 @@ public class DirectItemMediaViewHolder extends DirectItemViewHolder { public DirectItemMediaViewHolder(@NonNull final LayoutDmBaseBinding baseBinding, @NonNull final LayoutDmMediaBinding binding, - final ProfileModel currentUser, + final User currentUser, final DirectThread thread, final MentionClickListener mentionClickListener, final View.OnClickListener onClickListener) { @@ -48,7 +48,7 @@ public class DirectItemMediaViewHolder extends DirectItemViewHolder { .setRoundingParams(roundingParams) .setActualImageScaleType(ScalingUtils.ScaleType.CENTER_CROP) .build()); - final DirectItemMedia media = directItemModel.getMedia(); + final Media media = directItemModel.getMedia(); final MediaItemType modelMediaType = media.getMediaType(); binding.typeIcon.setVisibility(modelMediaType == MediaItemType.MEDIA_TYPE_VIDEO || modelMediaType == MediaItemType.MEDIA_TYPE_SLIDER ? View.VISIBLE diff --git a/app/src/main/java/awais/instagrabber/adapters/viewholder/directmessages/DirectItemPlaceholderViewHolder.java b/app/src/main/java/awais/instagrabber/adapters/viewholder/directmessages/DirectItemPlaceholderViewHolder.java index b6a293a7..39667cd5 100644 --- a/app/src/main/java/awais/instagrabber/adapters/viewholder/directmessages/DirectItemPlaceholderViewHolder.java +++ b/app/src/main/java/awais/instagrabber/adapters/viewholder/directmessages/DirectItemPlaceholderViewHolder.java @@ -7,7 +7,7 @@ import androidx.annotation.NonNull; import awais.instagrabber.databinding.LayoutDmBaseBinding; import awais.instagrabber.databinding.LayoutDmTextBinding; import awais.instagrabber.interfaces.MentionClickListener; -import awais.instagrabber.models.ProfileModel; +import awais.instagrabber.repositories.responses.User; import awais.instagrabber.repositories.responses.directmessages.DirectItem; import awais.instagrabber.repositories.responses.directmessages.DirectThread; @@ -17,7 +17,7 @@ public class DirectItemPlaceholderViewHolder extends DirectItemViewHolder { public DirectItemPlaceholderViewHolder(@NonNull final LayoutDmBaseBinding baseBinding, final LayoutDmTextBinding binding, - final ProfileModel currentUser, + final User currentUser, final DirectThread thread, final MentionClickListener mentionClickListener, final View.OnClickListener onClickListener) { diff --git a/app/src/main/java/awais/instagrabber/adapters/viewholder/directmessages/DirectItemProfileViewHolder.java b/app/src/main/java/awais/instagrabber/adapters/viewholder/directmessages/DirectItemProfileViewHolder.java index 5997a982..c98a0eab 100644 --- a/app/src/main/java/awais/instagrabber/adapters/viewholder/directmessages/DirectItemProfileViewHolder.java +++ b/app/src/main/java/awais/instagrabber/adapters/viewholder/directmessages/DirectItemProfileViewHolder.java @@ -16,14 +16,13 @@ import awais.instagrabber.R; import awais.instagrabber.databinding.LayoutDmBaseBinding; import awais.instagrabber.databinding.LayoutDmProfileBinding; import awais.instagrabber.interfaces.MentionClickListener; -import awais.instagrabber.models.ProfileModel; import awais.instagrabber.models.enums.DirectItemType; +import awais.instagrabber.repositories.responses.ImageVersions2; +import awais.instagrabber.repositories.responses.Location; +import awais.instagrabber.repositories.responses.Media; +import awais.instagrabber.repositories.responses.User; import awais.instagrabber.repositories.responses.directmessages.DirectItem; -import awais.instagrabber.repositories.responses.directmessages.DirectItemLocation; -import awais.instagrabber.repositories.responses.directmessages.DirectItemMedia; import awais.instagrabber.repositories.responses.directmessages.DirectThread; -import awais.instagrabber.repositories.responses.directmessages.DirectUser; -import awais.instagrabber.repositories.responses.directmessages.ImageVersions2; import awais.instagrabber.utils.ResponseBodyUtils; import awais.instagrabber.utils.TextUtils; @@ -34,7 +33,7 @@ public class DirectItemProfileViewHolder extends DirectItemViewHolder { public DirectItemProfileViewHolder(@NonNull final LayoutDmBaseBinding baseBinding, @NonNull final LayoutDmProfileBinding binding, - final ProfileModel currentUser, + final User currentUser, final DirectThread thread, final MentionClickListener mentionClickListener, final View.OnClickListener onClickListener) { @@ -74,7 +73,7 @@ public class DirectItemProfileViewHolder extends DirectItemViewHolder { for (final SimpleDraweeView previewView : previewViews) { previewView.setImageURI((String) null); } - final List previewMedias = item.getPreviewMedias(); + final List previewMedias = item.getPreviewMedias(); if (previewMedias.size() <= 0) { binding.firstRow.setVisibility(View.GONE); binding.secondRow.setVisibility(View.GONE); @@ -85,7 +84,7 @@ public class DirectItemProfileViewHolder extends DirectItemViewHolder { binding.secondRow.setVisibility(View.GONE); } for (int i = 0; i < previewMedias.size(); i++) { - final DirectItemMedia previewMedia = previewMedias.get(i); + final Media previewMedia = previewMedias.get(i); if (previewMedia == null) continue; final ImageVersions2 imageVersions2 = previewMedia.getImageVersions2(); final String url = ResponseBodyUtils.getThumbUrl(imageVersions2); @@ -95,7 +94,7 @@ public class DirectItemProfileViewHolder extends DirectItemViewHolder { } private void setProfile(@NonNull final DirectItem item) { - final DirectUser profile = item.getProfile(); + final User profile = item.getProfile(); if (profile == null) return; binding.profilePic.setImageURI(profile.getProfilePicUrl()); binding.username.setText(profile.getUsername()); @@ -104,7 +103,7 @@ public class DirectItemProfileViewHolder extends DirectItemViewHolder { } private void setLocation(@NonNull final DirectItem item) { - final DirectItemLocation location = item.getLocation(); + final Location location = item.getLocation(); if (location == null) return; binding.profilePic.setVisibility(View.GONE); binding.username.setText(location.getName()); diff --git a/app/src/main/java/awais/instagrabber/adapters/viewholder/directmessages/DirectItemRavenMediaViewHolder.java b/app/src/main/java/awais/instagrabber/adapters/viewholder/directmessages/DirectItemRavenMediaViewHolder.java index 5df62cc9..c7abd1f7 100644 --- a/app/src/main/java/awais/instagrabber/adapters/viewholder/directmessages/DirectItemRavenMediaViewHolder.java +++ b/app/src/main/java/awais/instagrabber/adapters/viewholder/directmessages/DirectItemRavenMediaViewHolder.java @@ -14,14 +14,14 @@ import com.facebook.drawee.generic.RoundingParams; import awais.instagrabber.databinding.LayoutDmBaseBinding; import awais.instagrabber.databinding.LayoutDmRavenMediaBinding; import awais.instagrabber.interfaces.MentionClickListener; -import awais.instagrabber.models.ProfileModel; import awais.instagrabber.models.enums.MediaItemType; import awais.instagrabber.models.enums.RavenMediaViewMode; +import awais.instagrabber.repositories.responses.ImageVersions2; +import awais.instagrabber.repositories.responses.Media; +import awais.instagrabber.repositories.responses.User; import awais.instagrabber.repositories.responses.directmessages.DirectItem; -import awais.instagrabber.repositories.responses.directmessages.DirectItemMedia; import awais.instagrabber.repositories.responses.directmessages.DirectItemVisualMedia; import awais.instagrabber.repositories.responses.directmessages.DirectThread; -import awais.instagrabber.repositories.responses.directmessages.ImageVersions2; import awais.instagrabber.utils.NumberUtils; import awais.instagrabber.utils.ResponseBodyUtils; @@ -32,7 +32,7 @@ public class DirectItemRavenMediaViewHolder extends DirectItemViewHolder { public DirectItemRavenMediaViewHolder(@NonNull final LayoutDmBaseBinding baseBinding, @NonNull final LayoutDmRavenMediaBinding binding, - final ProfileModel currentUser, + final User currentUser, final DirectThread thread, final MentionClickListener mentionClickListener, final View.OnClickListener onClickListener) { @@ -47,7 +47,7 @@ public class DirectItemRavenMediaViewHolder extends DirectItemViewHolder { public void bindItem(final DirectItem directItemModel, final MessageDirection messageDirection) { removeBg(); final DirectItemVisualMedia visualMedia = directItemModel.getVisualMedia(); - final DirectItemMedia media = visualMedia.getMedia(); + final Media media = visualMedia.getMedia(); if (media == null) return; setExpiryInfo(visualMedia); setPreview(visualMedia, messageDirection); @@ -114,7 +114,7 @@ public class DirectItemRavenMediaViewHolder extends DirectItemViewHolder { } private void setExpiryInfo(final DirectItemVisualMedia visualMedia) { - final DirectItemMedia media = visualMedia.getMedia(); + final Media media = visualMedia.getMedia(); final RavenMediaViewMode viewMode = visualMedia.getViewMode(); if (viewMode != RavenMediaViewMode.PERMANENT) { final MediaItemType mediaType = media.getMediaType(); @@ -152,7 +152,7 @@ public class DirectItemRavenMediaViewHolder extends DirectItemViewHolder { private void setPreview(final DirectItemVisualMedia visualMedia, final MessageDirection messageDirection) { - final DirectItemMedia media = visualMedia.getMedia(); + final Media media = visualMedia.getMedia(); final boolean expired = media.getPk() == null; if (expired) { binding.preview.setVisibility(View.GONE); diff --git a/app/src/main/java/awais/instagrabber/adapters/viewholder/directmessages/DirectItemReelShareViewHolder.java b/app/src/main/java/awais/instagrabber/adapters/viewholder/directmessages/DirectItemReelShareViewHolder.java index f0faf3c3..7d0e2aaf 100644 --- a/app/src/main/java/awais/instagrabber/adapters/viewholder/directmessages/DirectItemReelShareViewHolder.java +++ b/app/src/main/java/awais/instagrabber/adapters/viewholder/directmessages/DirectItemReelShareViewHolder.java @@ -13,14 +13,13 @@ import awais.instagrabber.R; import awais.instagrabber.databinding.LayoutDmBaseBinding; import awais.instagrabber.databinding.LayoutDmReelShareBinding; import awais.instagrabber.interfaces.MentionClickListener; -import awais.instagrabber.models.ProfileModel; import awais.instagrabber.models.enums.MediaItemType; +import awais.instagrabber.repositories.responses.ImageVersions2; +import awais.instagrabber.repositories.responses.Media; +import awais.instagrabber.repositories.responses.User; import awais.instagrabber.repositories.responses.directmessages.DirectItem; -import awais.instagrabber.repositories.responses.directmessages.DirectItemMedia; import awais.instagrabber.repositories.responses.directmessages.DirectItemReelShare; import awais.instagrabber.repositories.responses.directmessages.DirectThread; -import awais.instagrabber.repositories.responses.directmessages.DirectUser; -import awais.instagrabber.repositories.responses.directmessages.ImageVersions2; import awais.instagrabber.utils.ResponseBodyUtils; import awais.instagrabber.utils.TextUtils; @@ -30,7 +29,7 @@ public class DirectItemReelShareViewHolder extends DirectItemViewHolder { public DirectItemReelShareViewHolder(@NonNull final LayoutDmBaseBinding baseBinding, @NonNull final LayoutDmReelShareBinding binding, - final ProfileModel currentUser, + final User currentUser, final DirectThread thread, final MentionClickListener mentionClickListener, final View.OnClickListener onClickListener) { @@ -46,9 +45,9 @@ public class DirectItemReelShareViewHolder extends DirectItemViewHolder { final String type = reelShare.getType(); if (type == null) return; final boolean isSelf = isSelf(item); - final DirectItemMedia media = reelShare.getMedia(); + final Media media = reelShare.getMedia(); if (media == null) return; - final DirectUser user = media.getUser(); + final User user = media.getUser(); if (user == null) return; final boolean expired = media.getMediaType() == null; if (expired) { @@ -155,7 +154,7 @@ public class DirectItemReelShareViewHolder extends DirectItemViewHolder { binding.message.setText(text); } - private void setPreview(final DirectItemMedia media) { + private void setPreview(final Media media) { final MediaItemType mediaType = media.getMediaType(); if (mediaType == null) return; binding.typeIcon.setVisibility(mediaType == MediaItemType.MEDIA_TYPE_VIDEO || mediaType == MediaItemType.MEDIA_TYPE_SLIDER diff --git a/app/src/main/java/awais/instagrabber/adapters/viewholder/directmessages/DirectItemStoryShareViewHolder.java b/app/src/main/java/awais/instagrabber/adapters/viewholder/directmessages/DirectItemStoryShareViewHolder.java index d7931c80..cddae1d2 100644 --- a/app/src/main/java/awais/instagrabber/adapters/viewholder/directmessages/DirectItemStoryShareViewHolder.java +++ b/app/src/main/java/awais/instagrabber/adapters/viewholder/directmessages/DirectItemStoryShareViewHolder.java @@ -13,13 +13,13 @@ import com.facebook.drawee.generic.RoundingParams; import awais.instagrabber.databinding.LayoutDmBaseBinding; import awais.instagrabber.databinding.LayoutDmStoryShareBinding; import awais.instagrabber.interfaces.MentionClickListener; -import awais.instagrabber.models.ProfileModel; import awais.instagrabber.models.enums.MediaItemType; +import awais.instagrabber.repositories.responses.ImageVersions2; +import awais.instagrabber.repositories.responses.Media; +import awais.instagrabber.repositories.responses.User; import awais.instagrabber.repositories.responses.directmessages.DirectItem; -import awais.instagrabber.repositories.responses.directmessages.DirectItemMedia; import awais.instagrabber.repositories.responses.directmessages.DirectItemStoryShare; import awais.instagrabber.repositories.responses.directmessages.DirectThread; -import awais.instagrabber.repositories.responses.directmessages.ImageVersions2; import awais.instagrabber.utils.NumberUtils; import awais.instagrabber.utils.ResponseBodyUtils; import awais.instagrabber.utils.TextUtils; @@ -31,7 +31,7 @@ public class DirectItemStoryShareViewHolder extends DirectItemViewHolder { public DirectItemStoryShareViewHolder(@NonNull final LayoutDmBaseBinding baseBinding, @NonNull final LayoutDmStoryShareBinding binding, - final ProfileModel currentUser, + final User currentUser, final DirectThread thread, final MentionClickListener mentionClickListener, final View.OnClickListener onClickListener) { @@ -64,7 +64,7 @@ public class DirectItemStoryShareViewHolder extends DirectItemViewHolder { binding.text.setVisibility(View.VISIBLE); return; } - final DirectItemMedia storyShareMedia = storyShare.getMedia(); + final Media storyShareMedia = storyShare.getMedia(); final MediaItemType mediaType = storyShareMedia.getMediaType(); binding.typeIcon.setVisibility(mediaType == MediaItemType.MEDIA_TYPE_VIDEO ? View.VISIBLE : View.GONE); final RoundingParams roundingParams = messageDirection == MessageDirection.INCOMING diff --git a/app/src/main/java/awais/instagrabber/adapters/viewholder/directmessages/DirectItemTextViewHolder.java b/app/src/main/java/awais/instagrabber/adapters/viewholder/directmessages/DirectItemTextViewHolder.java index 75473e8a..d67eba7c 100644 --- a/app/src/main/java/awais/instagrabber/adapters/viewholder/directmessages/DirectItemTextViewHolder.java +++ b/app/src/main/java/awais/instagrabber/adapters/viewholder/directmessages/DirectItemTextViewHolder.java @@ -7,7 +7,7 @@ import androidx.annotation.NonNull; import awais.instagrabber.databinding.LayoutDmBaseBinding; import awais.instagrabber.databinding.LayoutDmTextBinding; import awais.instagrabber.interfaces.MentionClickListener; -import awais.instagrabber.models.ProfileModel; +import awais.instagrabber.repositories.responses.User; import awais.instagrabber.repositories.responses.directmessages.DirectItem; import awais.instagrabber.repositories.responses.directmessages.DirectThread; @@ -17,7 +17,7 @@ public class DirectItemTextViewHolder extends DirectItemViewHolder { public DirectItemTextViewHolder(@NonNull final LayoutDmBaseBinding baseBinding, @NonNull final LayoutDmTextBinding binding, - final ProfileModel currentUser, + final User currentUser, final DirectThread thread, final View.OnClickListener onClickListener, final MentionClickListener mentionClickListener) { diff --git a/app/src/main/java/awais/instagrabber/adapters/viewholder/directmessages/DirectItemVideoCallEventViewHolder.java b/app/src/main/java/awais/instagrabber/adapters/viewholder/directmessages/DirectItemVideoCallEventViewHolder.java index d9d567da..68e88402 100644 --- a/app/src/main/java/awais/instagrabber/adapters/viewholder/directmessages/DirectItemVideoCallEventViewHolder.java +++ b/app/src/main/java/awais/instagrabber/adapters/viewholder/directmessages/DirectItemVideoCallEventViewHolder.java @@ -14,7 +14,7 @@ import awais.instagrabber.R; import awais.instagrabber.databinding.LayoutDmActionLogBinding; import awais.instagrabber.databinding.LayoutDmBaseBinding; import awais.instagrabber.interfaces.MentionClickListener; -import awais.instagrabber.models.ProfileModel; +import awais.instagrabber.repositories.responses.User; import awais.instagrabber.repositories.responses.directmessages.DirectItem; import awais.instagrabber.repositories.responses.directmessages.DirectItemActionLog; import awais.instagrabber.repositories.responses.directmessages.DirectItemVideoCallEvent; @@ -27,7 +27,7 @@ public class DirectItemVideoCallEventViewHolder extends DirectItemViewHolder { public DirectItemVideoCallEventViewHolder(@NonNull final LayoutDmBaseBinding baseBinding, final LayoutDmActionLogBinding binding, - final ProfileModel currentUser, + final User currentUser, final DirectThread thread, final MentionClickListener mentionClickListener, final View.OnClickListener onClickListener) { diff --git a/app/src/main/java/awais/instagrabber/adapters/viewholder/directmessages/DirectItemViewHolder.java b/app/src/main/java/awais/instagrabber/adapters/viewholder/directmessages/DirectItemViewHolder.java index 481fc155..1c0b1805 100644 --- a/app/src/main/java/awais/instagrabber/adapters/viewholder/directmessages/DirectItemViewHolder.java +++ b/app/src/main/java/awais/instagrabber/adapters/viewholder/directmessages/DirectItemViewHolder.java @@ -20,22 +20,21 @@ import java.util.stream.Collectors; import awais.instagrabber.R; import awais.instagrabber.databinding.LayoutDmBaseBinding; -import awais.instagrabber.models.ProfileModel; import awais.instagrabber.models.enums.DirectItemType; import awais.instagrabber.models.enums.MediaItemType; +import awais.instagrabber.repositories.responses.Media; +import awais.instagrabber.repositories.responses.User; import awais.instagrabber.repositories.responses.directmessages.DirectItem; import awais.instagrabber.repositories.responses.directmessages.DirectItemEmojiReaction; -import awais.instagrabber.repositories.responses.directmessages.DirectItemMedia; import awais.instagrabber.repositories.responses.directmessages.DirectItemReactions; import awais.instagrabber.repositories.responses.directmessages.DirectThread; -import awais.instagrabber.repositories.responses.directmessages.DirectUser; import awais.instagrabber.utils.ResponseBodyUtils; public abstract class DirectItemViewHolder extends RecyclerView.ViewHolder { private static final String TAG = DirectItemViewHolder.class.getSimpleName(); private final LayoutDmBaseBinding binding; - private final DirectUser currentUser; + private final User currentUser; private final DirectThread thread; protected final int margin; protected final int dmRadius; @@ -48,16 +47,16 @@ public abstract class DirectItemViewHolder extends RecyclerView.ViewHolder { protected final int mediaImageMaxWidth; public DirectItemViewHolder(@NonNull final LayoutDmBaseBinding binding, - @NonNull final ProfileModel currentUser, + @NonNull final User currentUser, @NonNull final DirectThread thread, @NonNull final View.OnClickListener onClickListener) { super(binding.getRoot()); this.binding = binding; - this.currentUser = DirectUser.fromProfileModel(currentUser); + this.currentUser = currentUser; this.thread = thread; userIds = thread.getUsers() .stream() - .map(DirectUser::getPk) + .map(User::getPk) .collect(Collectors.toList()); binding.ivProfilePic.setVisibility(thread.isGroup() ? View.VISIBLE : View.GONE); binding.ivProfilePic.setOnClickListener(thread.isGroup() ? onClickListener : null); @@ -91,7 +90,7 @@ public abstract class DirectItemViewHolder extends RecyclerView.ViewHolder { binding.ivProfilePic.setVisibility(messageDirection == MessageDirection.INCOMING && thread.isGroup() ? View.VISIBLE : View.GONE); binding.tvUsername.setVisibility(messageDirection == MessageDirection.INCOMING && thread.isGroup() ? View.VISIBLE : View.GONE); if (messageDirection == MessageDirection.INCOMING && thread.isGroup()) { - final DirectUser user = getUser(item.getUserId(), thread.getUsers()); + final User user = getUser(item.getUserId(), thread.getUsers()); if (user != null) { binding.tvUsername.setText(user.getUsername()); binding.ivProfilePic.setImageURI(user.getProfilePicUrl()); @@ -152,7 +151,7 @@ public abstract class DirectItemViewHolder extends RecyclerView.ViewHolder { private void setReply(final DirectItem item, final MessageDirection messageDirection, - final List users) { + final List users) { final DirectItem replied = item.getRepliedToMessage(); final DirectItemType itemType = replied.getItemType(); String text = null; @@ -177,7 +176,7 @@ public abstract class DirectItemViewHolder extends RecyclerView.ViewHolder { text = "Voice message"; break; case MEDIA_SHARE: - DirectItemMedia mediaShare = replied.getMediaShare(); + Media mediaShare = replied.getMediaShare(); if (mediaShare.getMediaType() == MediaItemType.MEDIA_TYPE_SLIDER) { mediaShare = mediaShare.getCarouselMedia().get(0); } @@ -236,7 +235,7 @@ public abstract class DirectItemViewHolder extends RecyclerView.ViewHolder { private String setReplyInfo(final DirectItem item, final DirectItem replied, - final List users) { + final List users) { final long repliedToUserId = replied.getUserId(); if (repliedToUserId == item.getUserId() && item.getUserId() == currentUser.getPk()) { // User replied to own message @@ -246,7 +245,7 @@ public abstract class DirectItemViewHolder extends RecyclerView.ViewHolder { // opposite user replied to their own message return "Replied to themself"; } - final DirectUser user = getUser(repliedToUserId, users); + final User user = getUser(repliedToUserId, users); final String repliedToUsername = user != null ? user.getUsername() : ""; if (item.getUserId() == currentUser.getPk()) { return !thread.isGroup() ? "You replied" : String.format("You replied to %s", repliedToUsername); @@ -275,7 +274,7 @@ public abstract class DirectItemViewHolder extends RecyclerView.ViewHolder { replyInfoLayoutParams.endToStart = isIncoming ? ConstraintLayout.LayoutParams.UNSET : quoteLineId; } - private void setReactions(final DirectItem item, final List users) { + private void setReactions(final DirectItem item, final List users) { final DirectItemReactions reactions = item.getReactions(); final List emojis = reactions != null ? reactions.getEmojis() : null; if (emojis == null || emojis.isEmpty()) { @@ -313,12 +312,12 @@ public abstract class DirectItemViewHolder extends RecyclerView.ViewHolder { public abstract void bindItem(final DirectItem directItemModel, final MessageDirection messageDirection); @Nullable - protected DirectUser getUser(final long userId, final List users) { + protected User getUser(final long userId, final List users) { if (userId == currentUser.getPk()) { return currentUser; } if (users == null) return null; - for (final DirectUser user : users) { + for (final User user : users) { if (userId != user.getPk()) continue; return user; } diff --git a/app/src/main/java/awais/instagrabber/adapters/viewholder/directmessages/DirectItemVoiceMediaViewHolder.java b/app/src/main/java/awais/instagrabber/adapters/viewholder/directmessages/DirectItemVoiceMediaViewHolder.java index 49e73a0d..9ddbd6e9 100644 --- a/app/src/main/java/awais/instagrabber/adapters/viewholder/directmessages/DirectItemVoiceMediaViewHolder.java +++ b/app/src/main/java/awais/instagrabber/adapters/viewholder/directmessages/DirectItemVoiceMediaViewHolder.java @@ -20,10 +20,10 @@ import awais.instagrabber.R; import awais.instagrabber.databinding.LayoutDmBaseBinding; import awais.instagrabber.databinding.LayoutDmVoiceMediaBinding; import awais.instagrabber.interfaces.MentionClickListener; -import awais.instagrabber.models.ProfileModel; -import awais.instagrabber.repositories.responses.directmessages.Audio; +import awais.instagrabber.repositories.responses.Audio; +import awais.instagrabber.repositories.responses.Media; +import awais.instagrabber.repositories.responses.User; import awais.instagrabber.repositories.responses.directmessages.DirectItem; -import awais.instagrabber.repositories.responses.directmessages.DirectItemMedia; import awais.instagrabber.repositories.responses.directmessages.DirectItemVoiceMedia; import awais.instagrabber.repositories.responses.directmessages.DirectThread; import awais.instagrabber.utils.TextUtils; @@ -43,7 +43,7 @@ public class DirectItemVoiceMediaViewHolder extends DirectItemViewHolder { public DirectItemVoiceMediaViewHolder(@NonNull final LayoutDmBaseBinding baseBinding, @NonNull final LayoutDmVoiceMediaBinding binding, - final ProfileModel currentUser, + final User currentUser, final DirectThread thread, final MentionClickListener mentionClickListener, final View.OnClickListener onClickListener) { @@ -59,7 +59,7 @@ public class DirectItemVoiceMediaViewHolder extends DirectItemViewHolder { removeBg(); final DirectItemVoiceMedia voiceMedia = directItemModel.getVoiceMedia(); if (voiceMedia == null) return; - final DirectItemMedia media = voiceMedia.getMedia(); + final Media media = voiceMedia.getMedia(); if (media == null) return; final Audio audio = media.getAudio(); if (audio == null) return; diff --git a/app/src/main/java/awais/instagrabber/adapters/viewholder/feed/FeedItemViewHolder.java b/app/src/main/java/awais/instagrabber/adapters/viewholder/feed/FeedItemViewHolder.java index 8e70cdeb..9184b895 100644 --- a/app/src/main/java/awais/instagrabber/adapters/viewholder/feed/FeedItemViewHolder.java +++ b/app/src/main/java/awais/instagrabber/adapters/viewholder/feed/FeedItemViewHolder.java @@ -11,9 +11,11 @@ import androidx.recyclerview.widget.RecyclerView; import awais.instagrabber.adapters.FeedAdapterV2; import awais.instagrabber.databinding.ItemFeedBottomBinding; import awais.instagrabber.databinding.ItemFeedTopBinding; -import awais.instagrabber.models.FeedModel; -import awais.instagrabber.models.ProfileModel; import awais.instagrabber.models.enums.MediaItemType; +import awais.instagrabber.repositories.responses.Caption; +import awais.instagrabber.repositories.responses.Location; +import awais.instagrabber.repositories.responses.Media; +import awais.instagrabber.repositories.responses.User; import awais.instagrabber.utils.TextUtils; import static android.text.TextUtils.TruncateAt.END; @@ -35,52 +37,60 @@ public abstract class FeedItemViewHolder extends RecyclerView.ViewHolder { this.feedItemCallback = feedItemCallback; } - public void bind(final FeedModel feedModel) { - if (feedModel == null) { + public void bind(final Media media) { + if (media == null) { return; } - setupProfilePic(feedModel); - setupLocation(feedModel); - bottomBinding.tvPostDate.setText(feedModel.getPostDate()); - setupComments(feedModel); - setupCaption(feedModel); - if (feedModel.getItemType() != MediaItemType.MEDIA_TYPE_SLIDER) { - bottomBinding.btnDownload.setOnClickListener(v -> feedItemCallback.onDownloadClick(feedModel, -1)); + setupProfilePic(media); + setupLocation(media); + bottomBinding.tvPostDate.setText(media.getDate()); + setupComments(media); + setupCaption(media); + if (media.getMediaType() != MediaItemType.MEDIA_TYPE_SLIDER) { + bottomBinding.btnDownload.setOnClickListener(v -> feedItemCallback.onDownloadClick(media, -1)); } - bindItem(feedModel); + bindItem(media); } - private void setupComments(final FeedModel feedModel) { - final long commentsCount = feedModel.getCommentsCount(); + private void setupComments(@NonNull final Media feedModel) { + final long commentsCount = feedModel.getCommentCount(); bottomBinding.commentsCount.setText(String.valueOf(commentsCount)); bottomBinding.commentsCount.setOnClickListener(v -> feedItemCallback.onCommentsClick(feedModel)); } - private void setupProfilePic(final FeedModel feedModel) { - final ProfileModel profileModel = feedModel.getProfileModel(); - if (profileModel != null) { - topBinding.ivProfilePic.setOnClickListener(v -> feedItemCallback.onProfilePicClick(feedModel, topBinding.ivProfilePic)); - topBinding.ivProfilePic.setImageURI(profileModel.getSdProfilePic()); - setupTitle(feedModel); + private void setupProfilePic(@NonNull final Media media) { + final User user = media.getUser(); + if (user == null) { + topBinding.ivProfilePic.setVisibility(View.GONE); + topBinding.title.setVisibility(View.GONE); + return; } + topBinding.ivProfilePic.setOnClickListener(v -> feedItemCallback.onProfilePicClick(media, topBinding.ivProfilePic)); + topBinding.ivProfilePic.setImageURI(user.getProfilePicUrl()); + setupTitle(media); } - private void setupTitle(final FeedModel feedModel) { + private void setupTitle(@NonNull final Media media) { // final int titleLen = profileModel.getUsername().length() + 1; // final SpannableString spannableString = new SpannableString(); // spannableString.setSpan(new CommentMentionClickSpan(), 0, titleLen, 0); - final ProfileModel profileModel = feedModel.getProfileModel(); - final String title = "@" + profileModel.getUsername(); + final User user = media.getUser(); + final String title = "@" + user.getUsername(); topBinding.title.setText(title); - topBinding.title.setOnClickListener(v -> feedItemCallback.onNameClick(feedModel, topBinding.ivProfilePic)); + topBinding.title.setOnClickListener(v -> feedItemCallback.onNameClick(media, topBinding.ivProfilePic)); } - private void setupCaption(final FeedModel feedModel) { + private void setupCaption(final Media media) { bottomBinding.viewerCaption.clearOnMentionClickListeners(); bottomBinding.viewerCaption.clearOnHashtagClickListeners(); bottomBinding.viewerCaption.clearOnURLClickListeners(); bottomBinding.viewerCaption.clearOnEmailClickListeners(); - final CharSequence postCaption = feedModel.getPostCaption(); + final Caption caption = media.getCaption(); + if (caption == null) { + bottomBinding.viewerCaption.setVisibility(View.GONE); + return; + } + final CharSequence postCaption = caption.getText(); final boolean captionEmpty = TextUtils.isEmpty(postCaption); bottomBinding.viewerCaption.setVisibility(captionEmpty ? View.GONE : View.VISIBLE); if (captionEmpty) return; @@ -103,8 +113,9 @@ public abstract class FeedItemViewHolder extends RecyclerView.ViewHolder { bottomBinding.viewerCaption.addOnURLClickListener(autoLinkItem -> feedItemCallback.onURLClick(autoLinkItem.getOriginalText())); } - private void setupLocation(final FeedModel feedModel) { - final String locationName = feedModel.getLocationName(); + private void setupLocation(@NonNull final Media media) { + final Location location = media.getLocation(); + final String locationName = location.getName(); if (TextUtils.isEmpty(locationName)) { topBinding.location.setVisibility(View.GONE); topBinding.title.setLayoutParams(new RelativeLayout.LayoutParams( @@ -116,9 +127,9 @@ public abstract class FeedItemViewHolder extends RecyclerView.ViewHolder { topBinding.title.setLayoutParams(new RelativeLayout.LayoutParams( RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.WRAP_CONTENT )); - topBinding.location.setOnClickListener(v -> feedItemCallback.onLocationClick(feedModel)); + topBinding.location.setOnClickListener(v -> feedItemCallback.onLocationClick(media)); } } - public abstract void bindItem(final FeedModel feedModel); + public abstract void bindItem(final Media media); } \ No newline at end of file diff --git a/app/src/main/java/awais/instagrabber/adapters/viewholder/feed/FeedPhotoViewHolder.java b/app/src/main/java/awais/instagrabber/adapters/viewholder/feed/FeedPhotoViewHolder.java index 633886a4..c77e96e9 100644 --- a/app/src/main/java/awais/instagrabber/adapters/viewholder/feed/FeedPhotoViewHolder.java +++ b/app/src/main/java/awais/instagrabber/adapters/viewholder/feed/FeedPhotoViewHolder.java @@ -16,7 +16,8 @@ import com.facebook.imagepipeline.request.ImageRequestBuilder; import awais.instagrabber.adapters.FeedAdapterV2; import awais.instagrabber.databinding.ItemFeedPhotoBinding; -import awais.instagrabber.models.FeedModel; +import awais.instagrabber.repositories.responses.Media; +import awais.instagrabber.utils.ResponseBodyUtils; import awais.instagrabber.utils.TextUtils; public class FeedPhotoViewHolder extends FeedItemViewHolder { @@ -40,14 +41,12 @@ public class FeedPhotoViewHolder extends FeedItemViewHolder { } @Override - public void bindItem(final FeedModel feedModel) { - if (feedModel == null) { - return; - } + public void bindItem(final Media media) { + if (media == null) return; binding.getRoot().post(() -> { - setDimensions(feedModel); - final String thumbnailUrl = feedModel.getThumbnailUrl(); - String url = feedModel.getDisplayUrl(); + setDimensions(media); + final String thumbnailUrl = ResponseBodyUtils.getThumbUrl(media); + String url = ResponseBodyUtils.getImageUrl(media); if (TextUtils.isEmpty(url)) url = thumbnailUrl; final ImageRequest requestBuilder = ImageRequestBuilder.newBuilderWithSource(Uri.parse(url)) // .setLocalThumbnailPreviewsEnabled(true) @@ -62,7 +61,7 @@ public class FeedPhotoViewHolder extends FeedItemViewHolder { @Override public boolean onSingleTapConfirmed(final MotionEvent e) { if (feedItemCallback != null) { - feedItemCallback.onPostClick(feedModel, binding.itemFeedTop.ivProfilePic, binding.imageViewer); + feedItemCallback.onPostClick(media, binding.itemFeedTop.ivProfilePic, binding.imageViewer); return true; } return false; @@ -71,8 +70,8 @@ public class FeedPhotoViewHolder extends FeedItemViewHolder { }); } - private void setDimensions(final FeedModel feedModel) { - final float aspectRatio = (float) feedModel.getImageWidth() / feedModel.getImageHeight(); + private void setDimensions(final Media feedModel) { + final float aspectRatio = (float) feedModel.getOriginalWidth() / feedModel.getOriginalHeight(); binding.imageViewer.setAspectRatio(aspectRatio); } } diff --git a/app/src/main/java/awais/instagrabber/adapters/viewholder/feed/FeedSliderViewHolder.java b/app/src/main/java/awais/instagrabber/adapters/viewholder/feed/FeedSliderViewHolder.java index 889b4d28..22f3c898 100644 --- a/app/src/main/java/awais/instagrabber/adapters/viewholder/feed/FeedSliderViewHolder.java +++ b/app/src/main/java/awais/instagrabber/adapters/viewholder/feed/FeedSliderViewHolder.java @@ -13,8 +13,7 @@ import awais.instagrabber.adapters.FeedAdapterV2; import awais.instagrabber.adapters.SliderCallbackAdapter; import awais.instagrabber.adapters.SliderItemsAdapter; import awais.instagrabber.databinding.ItemFeedSliderBinding; -import awais.instagrabber.models.FeedModel; -import awais.instagrabber.models.PostChild; +import awais.instagrabber.repositories.responses.Media; import awais.instagrabber.utils.NumberUtils; import awais.instagrabber.utils.Utils; @@ -39,8 +38,8 @@ public class FeedSliderViewHolder extends FeedItemViewHolder { } @Override - public void bindItem(final FeedModel feedModel) { - final List sliderItems = feedModel.getSliderItems(); + public void bindItem(final Media feedModel) { + final List sliderItems = feedModel.getCarouselMedia(); final int sliderItemLen = sliderItems != null ? sliderItems.size() : 0; if (sliderItemLen <= 0) return; final String text = "1/" + sliderItemLen; @@ -68,7 +67,7 @@ public class FeedSliderViewHolder extends FeedItemViewHolder { adapter.submitList(sliderItems); } - private void setDimensions(final View view, final PostChild model) { + private void setDimensions(final View view, final Media model) { final ViewGroup.LayoutParams layoutParams = binding.mediaList.getLayoutParams(); int requiredWidth = layoutParams.width; if (requiredWidth <= 0) { @@ -86,10 +85,10 @@ public class FeedSliderViewHolder extends FeedItemViewHolder { setLayoutParamDimens(binding.mediaList, model); } - private void setLayoutParamDimens(final View view, final PostChild model) { + private void setLayoutParamDimens(final View view, final Media model) { final int requiredWidth = view.getMeasuredWidth(); final ViewGroup.LayoutParams layoutParams = view.getLayoutParams(); - final int spanHeight = NumberUtils.getResultingHeight(requiredWidth, model.getHeight(), model.getWidth()); + final int spanHeight = NumberUtils.getResultingHeight(requiredWidth, model.getOriginalHeight(), model.getOriginalWidth()); layoutParams.height = spanHeight == 0 ? requiredWidth + 1 : spanHeight; view.requestLayout(); } diff --git a/app/src/main/java/awais/instagrabber/adapters/viewholder/feed/FeedVideoViewHolder.java b/app/src/main/java/awais/instagrabber/adapters/viewholder/feed/FeedVideoViewHolder.java index c6ddb9a0..dd37e6e1 100644 --- a/app/src/main/java/awais/instagrabber/adapters/viewholder/feed/FeedVideoViewHolder.java +++ b/app/src/main/java/awais/instagrabber/adapters/viewholder/feed/FeedVideoViewHolder.java @@ -12,13 +12,17 @@ import com.google.android.exoplayer2.upstream.DefaultDataSourceFactory; import com.google.android.exoplayer2.upstream.cache.CacheDataSourceFactory; import com.google.android.exoplayer2.upstream.cache.SimpleCache; +import java.util.List; + import awais.instagrabber.adapters.FeedAdapterV2; import awais.instagrabber.customviews.VideoPlayerCallbackAdapter; import awais.instagrabber.customviews.VideoPlayerViewHelper; import awais.instagrabber.databinding.ItemFeedVideoBinding; -import awais.instagrabber.models.FeedModel; +import awais.instagrabber.repositories.responses.Media; +import awais.instagrabber.repositories.responses.VideoVersion; import awais.instagrabber.utils.Constants; import awais.instagrabber.utils.NumberUtils; +import awais.instagrabber.utils.ResponseBodyUtils; import awais.instagrabber.utils.Utils; import static awais.instagrabber.utils.Utils.settingsHelper; @@ -32,7 +36,7 @@ public class FeedVideoViewHolder extends FeedItemViewHolder { private final DefaultDataSourceFactory dataSourceFactory; private CacheDataSourceFactory cacheDataSourceFactory; - private FeedModel feedModel; + private Media media; // private final Runnable loadRunnable = new Runnable() { // @Override @@ -57,40 +61,46 @@ public class FeedVideoViewHolder extends FeedItemViewHolder { } @Override - public void bindItem(final FeedModel feedModel) { + public void bindItem(final Media media) { // Log.d(TAG, "Binding post: " + feedModel.getPostId()); - this.feedModel = feedModel; - binding.itemFeedBottom.tvVideoViews.setText(String.valueOf(feedModel.getViewCount())); + this.media = media; + binding.itemFeedBottom.tvVideoViews.setText(String.valueOf(media.getViewCount())); final float vol = settingsHelper.getBoolean(Constants.MUTED_VIDEOS) ? 0f : 1f; final VideoPlayerViewHelper.VideoPlayerCallback videoPlayerCallback = new VideoPlayerCallbackAdapter() { @Override public void onThumbnailClick() { - feedItemCallback.onPostClick(feedModel, binding.itemFeedTop.ivProfilePic, binding.videoPost.thumbnail); + feedItemCallback.onPostClick(media, binding.itemFeedTop.ivProfilePic, binding.videoPost.thumbnail); } @Override public void onPlayerViewLoaded() { final ViewGroup.LayoutParams layoutParams = binding.videoPost.playerView.getLayoutParams(); final int requiredWidth = Utils.displayMetrics.widthPixels; - final int resultingHeight = NumberUtils.getResultingHeight(requiredWidth, feedModel.getImageHeight(), feedModel.getImageWidth()); + final int resultingHeight = NumberUtils.getResultingHeight(requiredWidth, media.getOriginalHeight(), media.getOriginalWidth()); layoutParams.width = requiredWidth; layoutParams.height = resultingHeight; binding.videoPost.playerView.requestLayout(); } }; - final float aspectRatio = (float) feedModel.getImageWidth() / feedModel.getImageHeight(); + final float aspectRatio = (float) media.getOriginalWidth() / media.getOriginalHeight(); + String videoUrl = null; + final List videoVersions = media.getVideoVersions(); + if (videoVersions != null && !videoVersions.isEmpty()) { + final VideoVersion videoVersion = videoVersions.get(0); + videoUrl = videoVersion.getUrl(); + } final VideoPlayerViewHelper videoPlayerViewHelper = new VideoPlayerViewHelper(binding.getRoot().getContext(), binding.videoPost, - feedModel.getDisplayUrl(), + videoUrl, vol, aspectRatio, - feedModel.getThumbnailUrl(), + ResponseBodyUtils.getThumbUrl(media), false, null, videoPlayerCallback); binding.videoPost.thumbnail.post(() -> { - if (feedModel.getImageHeight() > 0.8 * Utils.displayMetrics.heightPixels) { + if (media.getOriginalHeight() > 0.8 * Utils.displayMetrics.heightPixels) { final ViewGroup.LayoutParams layoutParams = binding.videoPost.thumbnail.getLayoutParams(); layoutParams.height = (int) (0.8 * Utils.displayMetrics.heightPixels); binding.videoPost.thumbnail.requestLayout(); @@ -98,8 +108,8 @@ public class FeedVideoViewHolder extends FeedItemViewHolder { }); } - public FeedModel getCurrentFeedModel() { - return feedModel; + public Media getCurrentFeedModel() { + return media; } // public void stopPlaying() { diff --git a/app/src/main/java/awais/instagrabber/asyncs/CommentsFetcher.java b/app/src/main/java/awais/instagrabber/asyncs/CommentsFetcher.java index d9f3cb65..3d1516e6 100755 --- a/app/src/main/java/awais/instagrabber/asyncs/CommentsFetcher.java +++ b/app/src/main/java/awais/instagrabber/asyncs/CommentsFetcher.java @@ -17,7 +17,8 @@ import java.util.List; import awais.instagrabber.BuildConfig; import awais.instagrabber.interfaces.FetchListener; import awais.instagrabber.models.CommentModel; -import awais.instagrabber.models.ProfileModel; +import awais.instagrabber.repositories.responses.FriendshipStatus; +import awais.instagrabber.repositories.responses.User; import awais.instagrabber.utils.Constants; import awais.instagrabber.utils.NetworkUtils; import awais.instagrabber.utils.TextUtils; @@ -106,33 +107,22 @@ public final class CommentsFetcher extends AsyncTask getParentComments() { final List commentModels = new ArrayList<>(); - final String url = "https://www.instagram.com/graphql/query/?query_hash=bc3296d1ce80a24b1b6e40b1e72903f5&variables=" + - "{\"shortcode\":\"" + shortCode + "\",\"first\":50,\"after\":\"" + endCursor.replace("\"", "\\\"") + "\"}"; + final String url = "https://www.instagram.com/graphql/query/?query_hash=bc3296d1ce80a24b1b6e40b1e72903f5&variables=" + + "{\"shortcode\":\"" + shortCode + "\",\"first\":50,\"after\":\"" + endCursor.replace("\"", "\\\"") + "\"}"; try { - final HttpURLConnection conn = (HttpURLConnection) new URL(url).openConnection(); - conn.setUseCaches(false); - conn.connect(); + final HttpURLConnection conn = (HttpURLConnection) new URL(url).openConnection(); + conn.setUseCaches(false); + conn.connect(); - if (conn.getResponseCode() != HttpURLConnection.HTTP_OK) return null; - else { - final JSONObject parentComments = new JSONObject(NetworkUtils.readFromConnection(conn)).getJSONObject("data") - .getJSONObject("shortcode_media") - .getJSONObject( - "edge_media_to_parent_comment"); + if (conn.getResponseCode() != HttpURLConnection.HTTP_OK) return null; + else { + final JSONObject parentComments = new JSONObject(NetworkUtils.readFromConnection(conn)).getJSONObject("data") + .getJSONObject("shortcode_media") + .getJSONObject( + "edge_media_to_parent_comment"); - final JSONObject pageInfo = parentComments.getJSONObject("page_info"); - final String foundEndCursor = pageInfo.optString("end_cursor"); - final boolean hasNextPage = pageInfo.optBoolean("has_next_page", !TextUtils.isEmpty(foundEndCursor)); + final JSONObject pageInfo = parentComments.getJSONObject("page_info"); + final String foundEndCursor = pageInfo.optString("end_cursor"); + final boolean hasNextPage = pageInfo.optBoolean("has_next_page", !TextUtils.isEmpty(foundEndCursor)); - // final boolean containsToken = endCursor.contains("bifilter_token"); - // if (!Utils.isEmpty(endCursor) && (containsToken || endCursor.contains("cached_comments_cursor"))) { - // final JSONObject endCursorObject = new JSONObject(endCursor); - // endCursor = endCursorObject.optString("cached_comments_cursor"); - // - // if (!Utils.isEmpty(endCursor)) - // endCursor = "{\\\"cached_comments_cursor\\\": \\\"" + endCursor + "\\\", "; - // else - // endCursor = "{"; - // - // endCursor = endCursor + "\\\"bifilter_token\\\": \\\"" + endCursorObject.getString("bifilter_token") + "\\\"}"; - // } - // else if (containsToken) endCursor = null; + // final boolean containsToken = endCursor.contains("bifilter_token"); + // if (!Utils.isEmpty(endCursor) && (containsToken || endCursor.contains("cached_comments_cursor"))) { + // final JSONObject endCursorObject = new JSONObject(endCursor); + // endCursor = endCursorObject.optString("cached_comments_cursor"); + // + // if (!Utils.isEmpty(endCursor)) + // endCursor = "{\\\"cached_comments_cursor\\\": \\\"" + endCursor + "\\\", "; + // else + // endCursor = "{"; + // + // endCursor = endCursor + "\\\"bifilter_token\\\": \\\"" + endCursorObject.getString("bifilter_token") + "\\\"}"; + // } + // else if (containsToken) endCursor = null; - final JSONArray comments = parentComments.getJSONArray("edges"); - final int commentsLen = comments.length(); - for (int i = 0; i < commentsLen; ++i) { - final JSONObject comment = comments.getJSONObject(i).getJSONObject("node"); + final JSONArray comments = parentComments.getJSONArray("edges"); + final int commentsLen = comments.length(); + for (int i = 0; i < commentsLen; ++i) { + final JSONObject comment = comments.getJSONObject(i).getJSONObject("node"); - final JSONObject owner = comment.getJSONObject("owner"); - final ProfileModel profileModel = new ProfileModel(false, - false, - owner.optBoolean("is_verified"), - owner.getString(Constants.EXTRAS_ID), - owner.getString(Constants.EXTRAS_USERNAME), - null, - null, - null, - owner.getString("profile_pic_url"), - null, - 0, - 0, - 0, - false, - false, - false, - false, - false); + final JSONObject owner = comment.getJSONObject("owner"); + final User user = new User( + owner.optLong(Constants.EXTRAS_ID, 0), + owner.getString(Constants.EXTRAS_USERNAME), + null, + false, + owner.getString("profile_pic_url"), + null, + new FriendshipStatus(false, false, false, false, false, false, false, false, false, false), + owner.optBoolean("is_verified"), + false, false, false, false, null, null, 0, 0, 0, 0, null, null, 0, null); + final JSONObject likedBy = comment.optJSONObject("edge_liked_by"); + final String commentId = comment.getString(Constants.EXTRAS_ID); + final CommentModel commentModel = new CommentModel(commentId, + comment.getString("text"), + comment.getLong("created_at"), + likedBy != null ? likedBy.optLong("count", 0) : 0, + comment.getBoolean("viewer_has_liked"), + user); + if (i == 0 && !foundEndCursor.contains("tao_cursor")) + commentModel.setPageCursor(hasNextPage, TextUtils.isEmpty(foundEndCursor) ? null : foundEndCursor); + JSONObject tempJsonObject; + final JSONArray childCommentsArray; + final int childCommentsLen; + if ((tempJsonObject = comment.optJSONObject("edge_threaded_comments")) != null && + (childCommentsArray = tempJsonObject.optJSONArray("edges")) != null + && (childCommentsLen = childCommentsArray.length()) > 0) { - final JSONObject likedBy = comment.optJSONObject("edge_liked_by"); - final String commentId = comment.getString(Constants.EXTRAS_ID); - final CommentModel commentModel = new CommentModel(commentId, - comment.getString("text"), - comment.getLong("created_at"), - likedBy != null ? likedBy.optLong("count", 0) : 0, - comment.getBoolean("viewer_has_liked"), - profileModel); - if (i == 0 && !foundEndCursor.contains("tao_cursor")) - commentModel.setPageCursor(hasNextPage, TextUtils.isEmpty(foundEndCursor) ? null : foundEndCursor); - JSONObject tempJsonObject; - final JSONArray childCommentsArray; - final int childCommentsLen; - if ((tempJsonObject = comment.optJSONObject("edge_threaded_comments")) != null && - (childCommentsArray = tempJsonObject.optJSONArray("edges")) != null - && (childCommentsLen = childCommentsArray.length()) > 0) { - - final String childEndCursor; - final boolean childHasNextPage; - if ((tempJsonObject = tempJsonObject.optJSONObject("page_info")) != null) { - childEndCursor = tempJsonObject.optString("end_cursor"); - childHasNextPage = tempJsonObject.optBoolean("has_next_page", !TextUtils.isEmpty(childEndCursor)); - } else { - childEndCursor = null; - childHasNextPage = false; - } - - final List childCommentModels = new ArrayList<>(); - for (int j = 0; j < childCommentsLen; ++j) { - final JSONObject childComment = childCommentsArray.getJSONObject(j).getJSONObject("node"); - - tempJsonObject = childComment.getJSONObject("owner"); - final ProfileModel childProfileModel = new ProfileModel(false, - false, - tempJsonObject.optBoolean("is_verified"), - tempJsonObject.getString(Constants.EXTRAS_ID), - tempJsonObject.getString(Constants.EXTRAS_USERNAME), - null, - null, - null, - tempJsonObject.getString("profile_pic_url"), - null, - 0, - 0, - 0, - false, - false, - false, - false, - false); - - tempJsonObject = childComment.optJSONObject("edge_liked_by"); - childCommentModels.add(new CommentModel(childComment.getString(Constants.EXTRAS_ID), - childComment.getString("text"), - childComment.getLong("created_at"), - tempJsonObject != null ? tempJsonObject.optLong("count", 0) : 0, - childComment.getBoolean("viewer_has_liked"), - childProfileModel)); - } - childCommentModels.get(childCommentsLen - 1).setPageCursor(childHasNextPage, childEndCursor); - commentModel.setChildCommentModels(childCommentModels); + final String childEndCursor; + final boolean childHasNextPage; + if ((tempJsonObject = tempJsonObject.optJSONObject("page_info")) != null) { + childEndCursor = tempJsonObject.optString("end_cursor"); + childHasNextPage = tempJsonObject.optBoolean("has_next_page", !TextUtils.isEmpty(childEndCursor)); + } else { + childEndCursor = null; + childHasNextPage = false; } - commentModels.add(commentModel); - } - } - conn.disconnect(); - } catch (final Exception e) { - if (logCollector != null) - logCollector.appendException(e, LogCollector.LogFile.ASYNC_COMMENTS_FETCHER, "getParentComments", - new Pair<>("commentModelsList.size", commentModels.size())); - if (BuildConfig.DEBUG) Log.e("AWAISKING_APP", "", e); - if (fetchListener != null) fetchListener.onFailure(e); - return null; + final List childCommentModels = new ArrayList<>(); + for (int j = 0; j < childCommentsLen; ++j) { + final JSONObject childComment = childCommentsArray.getJSONObject(j).getJSONObject("node"); + + tempJsonObject = childComment.getJSONObject("owner"); + final User childUser = new User( + tempJsonObject.optLong(Constants.EXTRAS_ID, 0), + tempJsonObject.getString(Constants.EXTRAS_USERNAME), + null, + false, + tempJsonObject.getString("profile_pic_url"), + null, + new FriendshipStatus(false, false, false, false, false, false, false, false, false, false), + tempJsonObject.optBoolean("is_verified"), false, false, false, false, null, null, 0, 0, 0, 0, null, null, 0, + null); + + tempJsonObject = childComment.optJSONObject("edge_liked_by"); + childCommentModels.add(new CommentModel(childComment.getString(Constants.EXTRAS_ID), + childComment.getString("text"), + childComment.getLong("created_at"), + tempJsonObject != null ? tempJsonObject.optLong("count", 0) : 0, + childComment.getBoolean("viewer_has_liked"), + childUser)); + } + childCommentModels.get(childCommentsLen - 1).setPageCursor(childHasNextPage, childEndCursor); + commentModel.setChildCommentModels(childCommentModels); + } + commentModels.add(commentModel); + } } + + conn.disconnect(); + } catch (final Exception e) { + if (logCollector != null) + logCollector.appendException(e, LogCollector.LogFile.ASYNC_COMMENTS_FETCHER, "getParentComments", + new Pair<>("commentModelsList.size", commentModels.size())); + if (BuildConfig.DEBUG) Log.e("AWAISKING_APP", "", e); + if (fetchListener != null) fetchListener.onFailure(e); + return null; + } return commentModels; } } diff --git a/app/src/main/java/awais/instagrabber/asyncs/DiscoverPostFetchService.java b/app/src/main/java/awais/instagrabber/asyncs/DiscoverPostFetchService.java index a8c83dc8..689b3566 100644 --- a/app/src/main/java/awais/instagrabber/asyncs/DiscoverPostFetchService.java +++ b/app/src/main/java/awais/instagrabber/asyncs/DiscoverPostFetchService.java @@ -1,10 +1,15 @@ package awais.instagrabber.asyncs; +import java.util.Collections; import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; import awais.instagrabber.customviews.helpers.PostFetcher; import awais.instagrabber.interfaces.FetchListener; -import awais.instagrabber.models.FeedModel; +import awais.instagrabber.repositories.responses.Media; +import awais.instagrabber.repositories.responses.discover.TopicalExploreFeedResponse; +import awais.instagrabber.repositories.responses.discover.TopicalExploreItem; import awais.instagrabber.webservices.DiscoverService; import awais.instagrabber.webservices.ServiceCallback; @@ -20,18 +25,28 @@ public class DiscoverPostFetchService implements PostFetcher.PostFetchService { } @Override - public void fetch(final FetchListener> fetchListener) { - discoverService.topicalExplore(topicalExploreRequest, new ServiceCallback() { + public void fetch(final FetchListener> fetchListener) { + discoverService.topicalExplore(topicalExploreRequest, new ServiceCallback() { @Override - public void onSuccess(final DiscoverService.TopicalExploreResponse result) { + public void onSuccess(final TopicalExploreFeedResponse result) { if (result == null) { onFailure(new RuntimeException("result is null")); return; } moreAvailable = result.isMoreAvailable(); topicalExploreRequest.setMaxId(result.getNextMaxId()); + final List items = result.getItems(); + final List posts; + if (items == null) { + posts = Collections.emptyList(); + } else { + posts = items.stream() + .map(TopicalExploreItem::getMedia) + .filter(Objects::nonNull) + .collect(Collectors.toList()); + } if (fetchListener != null) { - fetchListener.onResult(result.getItems()); + fetchListener.onResult(posts); } } @@ -46,7 +61,7 @@ public class DiscoverPostFetchService implements PostFetcher.PostFetchService { @Override public void reset() { - topicalExploreRequest.setMaxId(-1); + topicalExploreRequest.setMaxId(null); } @Override diff --git a/app/src/main/java/awais/instagrabber/asyncs/DownloadedCheckerAsyncTask.java b/app/src/main/java/awais/instagrabber/asyncs/DownloadedCheckerAsyncTask.java index 49e1ae0e..605bed3f 100644 --- a/app/src/main/java/awais/instagrabber/asyncs/DownloadedCheckerAsyncTask.java +++ b/app/src/main/java/awais/instagrabber/asyncs/DownloadedCheckerAsyncTask.java @@ -6,10 +6,10 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -import awais.instagrabber.models.FeedModel; +import awais.instagrabber.repositories.responses.Media; import awais.instagrabber.utils.DownloadUtils; -public final class DownloadedCheckerAsyncTask extends AsyncTask>> { +public final class DownloadedCheckerAsyncTask extends AsyncTask>> { private static final String TAG = "DownloadedCheckerAsyncTask"; private final OnCheckResultListener listener; @@ -19,13 +19,13 @@ public final class DownloadedCheckerAsyncTask extends AsyncTask> doInBackground(final FeedModel... feedModels) { + protected Map> doInBackground(final Media... feedModels) { if (feedModels == null) { return null; } final Map> map = new HashMap<>(); - for (final FeedModel feedModel : feedModels) { - map.put(feedModel.getPostId(), DownloadUtils.checkDownloaded(feedModel)); + for (final Media media : feedModels) { + map.put(media.getPk(), DownloadUtils.checkDownloaded(media)); } return map; } diff --git a/app/src/main/java/awais/instagrabber/asyncs/FeedPostFetchService.java b/app/src/main/java/awais/instagrabber/asyncs/FeedPostFetchService.java index b45a224a..14e57088 100644 --- a/app/src/main/java/awais/instagrabber/asyncs/FeedPostFetchService.java +++ b/app/src/main/java/awais/instagrabber/asyncs/FeedPostFetchService.java @@ -1,14 +1,11 @@ package awais.instagrabber.asyncs; -//import android.os.Handler; -//import android.util.Log; - import java.util.ArrayList; import java.util.List; import awais.instagrabber.customviews.helpers.PostFetcher; import awais.instagrabber.interfaces.FetchListener; -import awais.instagrabber.models.FeedModel; +import awais.instagrabber.repositories.responses.Media; import awais.instagrabber.repositories.responses.PostsFetchResponse; import awais.instagrabber.utils.Constants; import awais.instagrabber.utils.CookieUtils; @@ -21,18 +18,15 @@ public class FeedPostFetchService implements PostFetcher.PostFetchService { private static final String TAG = "FeedPostFetchService"; private final FeedService feedService; private String nextCursor; -// private final Handler handler; private boolean hasNextPage; -// private static final int DELAY_MILLIS = 500; public FeedPostFetchService() { feedService = FeedService.getInstance(); -// handler = new Handler(); } @Override - public void fetch(final FetchListener> fetchListener) { - final List feedModels = new ArrayList<>(); + public void fetch(final FetchListener> fetchListener) { + final List feedModels = new ArrayList<>(); final String cookie = settingsHelper.getString(Constants.COOKIE); final String csrfToken = CookieUtils.getCsrfTokenFromCookie(cookie); feedModels.clear(); @@ -42,18 +36,14 @@ public class FeedPostFetchService implements PostFetcher.PostFetchService { if (result == null && feedModels.size() > 0) { fetchListener.onResult(feedModels); return; - } - else if (result == null) return; + } else if (result == null) return; nextCursor = result.getNextCursor(); hasNextPage = result.hasNextPage(); feedModels.addAll(result.getFeedModels()); if (fetchListener != null) { if (feedModels.size() < 15 && hasNextPage) { -// handler.postDelayed(() -> { - feedService.fetch(csrfToken, nextCursor, this); -// }, DELAY_MILLIS); - } - else { + feedService.fetch(csrfToken, nextCursor, this); + } else { fetchListener.onResult(feedModels); } } @@ -61,7 +51,6 @@ public class FeedPostFetchService implements PostFetcher.PostFetchService { @Override public void onFailure(final Throwable t) { - // Log.e(TAG, "onFailure: ", t); if (fetchListener != null) { fetchListener.onFailure(t); } diff --git a/app/src/main/java/awais/instagrabber/asyncs/GetActivityAsyncTask.java b/app/src/main/java/awais/instagrabber/asyncs/GetActivityAsyncTask.java index 1987443b..9d8ca49c 100644 --- a/app/src/main/java/awais/instagrabber/asyncs/GetActivityAsyncTask.java +++ b/app/src/main/java/awais/instagrabber/asyncs/GetActivityAsyncTask.java @@ -3,6 +3,8 @@ package awais.instagrabber.asyncs; import android.os.AsyncTask; import android.util.Log; +import androidx.annotation.NonNull; + import org.json.JSONObject; import java.net.HttpURLConnection; @@ -35,7 +37,7 @@ public class GetActivityAsyncTask extends AsyncTask> fetchListener) { - final ServiceCallback cb = new ServiceCallback() { + public void fetch(final FetchListener> fetchListener) { + final ServiceCallback cb = new ServiceCallback() { @Override public void onSuccess(final PostsFetchResponse result) { if (result == null) return; diff --git a/app/src/main/java/awais/instagrabber/asyncs/LocationFetcher.java b/app/src/main/java/awais/instagrabber/asyncs/LocationFetcher.java index 7025c224..99c0c948 100644 --- a/app/src/main/java/awais/instagrabber/asyncs/LocationFetcher.java +++ b/app/src/main/java/awais/instagrabber/asyncs/LocationFetcher.java @@ -24,9 +24,9 @@ public final class LocationFetcher extends AsyncTask private static final String TAG = "LocationFetcher"; private final FetchListener fetchListener; - private final String id; + private final long id; - public LocationFetcher(final String id, final FetchListener fetchListener) { + public LocationFetcher(final long id, final FetchListener fetchListener) { // idSlug = id + "/" + slug UPDATE: slug can be ignored tbh this.id = id; this.fetchListener = fetchListener; diff --git a/app/src/main/java/awais/instagrabber/asyncs/LocationPostFetchService.java b/app/src/main/java/awais/instagrabber/asyncs/LocationPostFetchService.java index 7c7a12ce..7613c9d2 100644 --- a/app/src/main/java/awais/instagrabber/asyncs/LocationPostFetchService.java +++ b/app/src/main/java/awais/instagrabber/asyncs/LocationPostFetchService.java @@ -4,8 +4,8 @@ import java.util.List; import awais.instagrabber.customviews.helpers.PostFetcher; import awais.instagrabber.interfaces.FetchListener; -import awais.instagrabber.models.FeedModel; import awais.instagrabber.models.LocationModel; +import awais.instagrabber.repositories.responses.Media; import awais.instagrabber.repositories.responses.PostsFetchResponse; import awais.instagrabber.webservices.GraphQLService; import awais.instagrabber.webservices.LocationService; @@ -27,8 +27,8 @@ public class LocationPostFetchService implements PostFetcher.PostFetchService { } @Override - public void fetch(final FetchListener> fetchListener) { - final ServiceCallback cb = new ServiceCallback() { + public void fetch(final FetchListener> fetchListener) { + final ServiceCallback cb = new ServiceCallback() { @Override public void onSuccess(final PostsFetchResponse result) { if (result == null) return; diff --git a/app/src/main/java/awais/instagrabber/asyncs/PostFetcher.java b/app/src/main/java/awais/instagrabber/asyncs/PostFetcher.java index 2a721a61..c22954b5 100755 --- a/app/src/main/java/awais/instagrabber/asyncs/PostFetcher.java +++ b/app/src/main/java/awais/instagrabber/asyncs/PostFetcher.java @@ -3,40 +3,32 @@ package awais.instagrabber.asyncs; import android.os.AsyncTask; import android.util.Log; -import org.json.JSONArray; import org.json.JSONObject; import java.net.HttpURLConnection; import java.net.URL; -import java.util.ArrayList; -import java.util.List; import awais.instagrabber.interfaces.FetchListener; -import awais.instagrabber.models.FeedModel; -import awais.instagrabber.models.PostChild; -import awais.instagrabber.models.ProfileModel; -import awais.instagrabber.models.enums.MediaItemType; -import awais.instagrabber.utils.Constants; +import awais.instagrabber.repositories.responses.Media; import awais.instagrabber.utils.NetworkUtils; import awais.instagrabber.utils.ResponseBodyUtils; -import awais.instagrabber.utils.TextUtils; import awaisomereport.LogCollector; import static awais.instagrabber.utils.Utils.logCollector; -public final class PostFetcher extends AsyncTask { +public final class PostFetcher extends AsyncTask { private static final String TAG = "PostFetcher"; private final String shortCode; - private final FetchListener fetchListener; + private final FetchListener fetchListener; - public PostFetcher(final String shortCode, final FetchListener fetchListener) { + public PostFetcher(final String shortCode, final FetchListener fetchListener) { this.shortCode = shortCode; this.fetchListener = fetchListener; } @Override - protected FeedModel doInBackground(final Void... voids) { + protected Media doInBackground(final Void... voids) { HttpURLConnection conn = null; try { conn = (HttpURLConnection) new URL("https://www.instagram.com/p/" + shortCode + "/?__a=1").openConnection(); @@ -47,100 +39,101 @@ public final class PostFetcher extends AsyncTask { final JSONObject media = new JSONObject(NetworkUtils.readFromConnection(conn)).getJSONObject("graphql") .getJSONObject("shortcode_media"); - ProfileModel profileModel = null; - if (media.has("owner")) { - final JSONObject owner = media.getJSONObject("owner"); - profileModel = new ProfileModel( - owner.optBoolean("is_private"), - owner.optBoolean("is_private"), - owner.optBoolean("is_verified"), - owner.optString("id"), - owner.optString("username"), - owner.optString("full_name"), - null, - null, - owner.optString("profile_pic_url"), - owner.optString("profile_pic_url"), - owner.optInt("edge_owner_to_timeline_media"), - owner.optInt("edge_followed_by"), - -1, - owner.optBoolean("followed_by_viewer"), - false, - owner.optBoolean("restricted_by_viewer"), - owner.optBoolean("blocked_by_viewer"), - owner.optBoolean("requested_by_viewer") - ); - } - final long timestamp = media.getLong("taken_at_timestamp"); - - final boolean isVideo = media.has("is_video") && media.optBoolean("is_video"); - final boolean isSlider = media.has("edge_sidecar_to_children"); - - final MediaItemType mediaItemType; - if (isSlider) mediaItemType = MediaItemType.MEDIA_TYPE_SLIDER; - else if (isVideo) mediaItemType = MediaItemType.MEDIA_TYPE_VIDEO; - else mediaItemType = MediaItemType.MEDIA_TYPE_IMAGE; - - final String postCaption; - final JSONObject mediaToCaption = media.optJSONObject("edge_media_to_caption"); - if (mediaToCaption == null) postCaption = null; - else { - final JSONArray captions = mediaToCaption.optJSONArray("edges"); - postCaption = captions != null && captions.length() > 0 ? - captions.getJSONObject(0).getJSONObject("node").optString("text") : null; - } - - JSONObject commentObject = media.optJSONObject("edge_media_to_parent_comment"); - final long commentsCount = commentObject != null ? commentObject.optLong("count") : 0; - final FeedModel.Builder feedModelBuilder = new FeedModel.Builder() - .setItemType(mediaItemType) - .setPostId(media.getString(Constants.EXTRAS_ID)) - .setDisplayUrl(isVideo ? media.getString("video_url") - : ResponseBodyUtils.getHighQualityImage(media)) - .setThumbnailUrl(media.getString("display_url")) - .setImageHeight(media.getJSONObject("dimensions").getInt("height")) - .setImageWidth(media.getJSONObject("dimensions").getInt("width")) - .setShortCode(shortCode) - .setPostCaption(TextUtils.isEmpty(postCaption) ? null : postCaption) - .setProfileModel(profileModel) - .setViewCount(isVideo && media.has("video_view_count") - ? media.getLong("video_view_count") - : -1) - .setTimestamp(timestamp) - .setLiked(media.getBoolean("viewer_has_liked")) - .setBookmarked(media.getBoolean("viewer_has_saved")) - .setLikesCount(media.getJSONObject("edge_media_preview_like") - .getLong("count")) - .setLocationName(media.isNull("location") - ? null - : media.getJSONObject("location").optString("name")) - .setLocationId(media.isNull("location") - ? null - : media.getJSONObject("location").optString("id")) - .setCommentsCount(commentsCount); - if (isSlider) { - final JSONArray children = media.getJSONObject("edge_sidecar_to_children").getJSONArray("edges"); - final List postModels = new ArrayList<>(); - for (int i = 0; i < children.length(); ++i) { - final JSONObject childNode = children.getJSONObject(i).getJSONObject("node"); - final boolean isChildVideo = childNode.getBoolean("is_video"); - postModels.add(new PostChild.Builder() - .setItemType(isChildVideo ? MediaItemType.MEDIA_TYPE_VIDEO - : MediaItemType.MEDIA_TYPE_IMAGE) - .setDisplayUrl(isChildVideo ? childNode.getString("video_url") - : childNode.getString("display_url")) - .setShortCode(media.getString(Constants.EXTRAS_SHORTCODE)) - .setVideoViews(isChildVideo && childNode.has("video_view_count") - ? childNode.getLong("video_view_count") - : -1) - .setThumbnailUrl(childNode.getString("display_url")) - .setHeight(childNode.getJSONObject("dimensions").getInt("height")) - .setWidth(childNode.getJSONObject("dimensions").getInt("width")) - .build()); - } - feedModelBuilder.setSliderItems(postModels); - } - return feedModelBuilder.build(); + // ProfileModel profileModel = null; + // if (media.has("owner")) { + // final JSONObject owner = media.getJSONObject("owner"); + // profileModel = new ProfileModel( + // owner.optBoolean("is_private"), + // owner.optBoolean("is_private"), + // owner.optBoolean("is_verified"), + // owner.optString("id"), + // owner.optString("username"), + // owner.optString("full_name"), + // null, + // null, + // owner.optString("profile_pic_url"), + // owner.optString("profile_pic_url"), + // owner.optInt("edge_owner_to_timeline_media"), + // owner.optInt("edge_followed_by"), + // -1, + // owner.optBoolean("followed_by_viewer"), + // false, + // owner.optBoolean("restricted_by_viewer"), + // owner.optBoolean("blocked_by_viewer"), + // owner.optBoolean("requested_by_viewer") + // ); + // } + // final long timestamp = media.getLong("taken_at_timestamp"); + // + // final boolean isVideo = media.has("is_video") && media.optBoolean("is_video"); + // final boolean isSlider = media.has("edge_sidecar_to_children"); + // + // final MediaItemType mediaItemType; + // if (isSlider) mediaItemType = MediaItemType.MEDIA_TYPE_SLIDER; + // else if (isVideo) mediaItemType = MediaItemType.MEDIA_TYPE_VIDEO; + // else mediaItemType = MediaItemType.MEDIA_TYPE_IMAGE; + // + // final String postCaption; + // final JSONObject mediaToCaption = media.optJSONObject("edge_media_to_caption"); + // if (mediaToCaption == null) postCaption = null; + // else { + // final JSONArray captions = mediaToCaption.optJSONArray("edges"); + // postCaption = captions != null && captions.length() > 0 ? + // captions.getJSONObject(0).getJSONObject("node").optString("text") : null; + // } + // + // JSONObject commentObject = media.optJSONObject("edge_media_to_parent_comment"); + // final long commentsCount = commentObject != null ? commentObject.optLong("count") : 0; + // final FeedModel.Builder feedModelBuilder = new FeedModel.Builder() + // .setItemType(mediaItemType) + // .setPostId(media.getString(Constants.EXTRAS_ID)) + // .setDisplayUrl(isVideo ? media.getString("video_url") + // : ResponseBodyUtils.getHighQualityImage(media)) + // .setThumbnailUrl(media.getString("display_url")) + // .setImageHeight(media.getJSONObject("dimensions").getInt("height")) + // .setImageWidth(media.getJSONObject("dimensions").getInt("width")) + // .setShortCode(shortCode) + // .setPostCaption(TextUtils.isEmpty(postCaption) ? null : postCaption) + // .setProfileModel(profileModel) + // .setViewCount(isVideo && media.has("video_view_count") + // ? media.getLong("video_view_count") + // : -1) + // .setTimestamp(timestamp) + // .setLiked(media.getBoolean("viewer_has_liked")) + // .setBookmarked(media.getBoolean("viewer_has_saved")) + // .setLikesCount(media.getJSONObject("edge_media_preview_like") + // .getLong("count")) + // .setLocationName(media.isNull("location") + // ? null + // : media.getJSONObject("location").optString("name")) + // .setLocationId(media.isNull("location") + // ? null + // : media.getJSONObject("location").optString("id")) + // .setCommentsCount(commentsCount); + // if (isSlider) { + // final JSONArray children = media.getJSONObject("edge_sidecar_to_children").getJSONArray("edges"); + // final List postModels = new ArrayList<>(); + // for (int i = 0; i < children.length(); ++i) { + // final JSONObject childNode = children.getJSONObject(i).getJSONObject("node"); + // final boolean isChildVideo = childNode.getBoolean("is_video"); + // postModels.add(new PostChild.Builder() + // .setItemType(isChildVideo ? MediaItemType.MEDIA_TYPE_VIDEO + // : MediaItemType.MEDIA_TYPE_IMAGE) + // .setDisplayUrl(isChildVideo ? childNode.getString("video_url") + // : childNode.getString("display_url")) + // .setShortCode(media.getString(Constants.EXTRAS_SHORTCODE)) + // .setVideoViews(isChildVideo && childNode.has("video_view_count") + // ? childNode.getLong("video_view_count") + // : -1) + // .setThumbnailUrl(childNode.getString("display_url")) + // .setHeight(childNode.getJSONObject("dimensions").getInt("height")) + // .setWidth(childNode.getJSONObject("dimensions").getInt("width")) + // .build()); + // } + // feedModelBuilder.setSliderItems(postModels); + // } + // return feedModelBuilder.build(); + return ResponseBodyUtils.parseGraphQLItem(media); } } catch (Exception e) { if (logCollector != null) { @@ -161,7 +154,7 @@ public final class PostFetcher extends AsyncTask { } @Override - protected void onPostExecute(final FeedModel feedModel) { + protected void onPostExecute(final Media feedModel) { if (fetchListener != null) fetchListener.onResult(feedModel); } } diff --git a/app/src/main/java/awais/instagrabber/asyncs/ProfileFetcher.java b/app/src/main/java/awais/instagrabber/asyncs/ProfileFetcher.java index 7e78b0b2..394fd9a0 100755 --- a/app/src/main/java/awais/instagrabber/asyncs/ProfileFetcher.java +++ b/app/src/main/java/awais/instagrabber/asyncs/ProfileFetcher.java @@ -5,7 +5,6 @@ import android.util.Log; import androidx.annotation.Nullable; -import org.json.JSONArray; import org.json.JSONObject; import java.net.HttpURLConnection; @@ -13,7 +12,8 @@ import java.net.URL; import awais.instagrabber.BuildConfig; import awais.instagrabber.interfaces.FetchListener; -import awais.instagrabber.models.ProfileModel; +import awais.instagrabber.repositories.responses.FriendshipStatus; +import awais.instagrabber.repositories.responses.User; import awais.instagrabber.utils.Constants; import awais.instagrabber.utils.CookieUtils; import awais.instagrabber.utils.NetworkUtils; @@ -23,19 +23,21 @@ import awaisomereport.LogCollector; import static awais.instagrabber.utils.Utils.logCollector; import static awais.instagrabber.utils.Utils.settingsHelper; -public final class ProfileFetcher extends AsyncTask { - private final FetchListener fetchListener; +public final class ProfileFetcher extends AsyncTask { + private static final String TAG = ProfileFetcher.class.getSimpleName(); + + private final FetchListener fetchListener; private final String userName; - public ProfileFetcher(String userName, FetchListener fetchListener) { + public ProfileFetcher(String userName, FetchListener fetchListener) { this.userName = userName; this.fetchListener = fetchListener; } @Nullable @Override - protected ProfileModel doInBackground(final Void... voids) { - ProfileModel result = null; + protected User doInBackground(final Void... voids) { + User result = null; try { final HttpURLConnection conn = (HttpURLConnection) new URL("https://www.instagram.com/" + userName + "/?__a=1").openConnection(); @@ -43,39 +45,77 @@ public final class ProfileFetcher extends AsyncTask { conn.connect(); if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) { - final JSONObject user = new JSONObject(NetworkUtils.readFromConnection(conn)).getJSONObject("graphql").getJSONObject(Constants.EXTRAS_USER); + final String json = NetworkUtils.readFromConnection(conn); + Log.d(TAG, "doInBackground: " + json); + final JSONObject userJson = new JSONObject(json).getJSONObject("graphql") + .getJSONObject(Constants.EXTRAS_USER); final String cookie = settingsHelper.getString(Constants.COOKIE); - boolean isPrivate = user.getBoolean("is_private"); - final String id = user.getString(Constants.EXTRAS_ID); - final String uid = CookieUtils.getUserIdFromCookie(cookie); - final JSONObject timelineMedia = user.getJSONObject("edge_owner_to_timeline_media"); - if (timelineMedia.has("edges")) { - final JSONArray edges = timelineMedia.getJSONArray("edges"); - } + boolean isPrivate = userJson.getBoolean("is_private"); + final long id = userJson.optLong(Constants.EXTRAS_ID, 0); + final long uid = CookieUtils.getUserIdFromCookie(cookie); + final JSONObject timelineMedia = userJson.getJSONObject("edge_owner_to_timeline_media"); + // if (timelineMedia.has("edges")) { + // final JSONArray edges = timelineMedia.getJSONArray("edges"); + // } - String url = user.optString("external_url"); + String url = userJson.optString("external_url"); if (TextUtils.isEmpty(url)) url = null; - result = new ProfileModel(isPrivate, - user.optBoolean("followed_by_viewer") ? false : (id.equals(uid) ? false : isPrivate), - user.getBoolean("is_verified"), + return new User( id, userName, - user.getString("full_name"), - user.getString("biography"), - url, - user.getString("profile_pic_url"), - user.getString("profile_pic_url_hd"), + userJson.getString("full_name"), + isPrivate, + userJson.getString("profile_pic_url_hd"), + null, + new FriendshipStatus( + userJson.optBoolean("followed_by_viewer"), + userJson.optBoolean("follows_viewer"), + userJson.optBoolean("blocked_by_viewer"), + false, + isPrivate, + false, + userJson.optBoolean("restricted_by_viewer"), + false, + userJson.optBoolean("restricted_by_viewer"), + false + ), + userJson.getBoolean("is_verified"), + false, + false, + false, + false, + null, + null, timelineMedia.getLong("count"), - user.getJSONObject("edge_followed_by").getLong("count"), - user.getJSONObject("edge_follow").getLong("count"), - user.optBoolean("followed_by_viewer"), - user.optBoolean("follows_viewer"), - user.optBoolean("restricted_by_viewer"), - user.optBoolean("blocked_by_viewer"), - user.optBoolean("requested_by_viewer")); + userJson.getJSONObject("edge_followed_by").getLong("count"), + userJson.getJSONObject("edge_follow").getLong("count"), + 0, + userJson.getString("biography"), + url, + 0, + null); + + // result = new ProfileModel(isPrivate, + // !user.optBoolean("followed_by_viewer") && (id != uid && isPrivate), + // user.getBoolean("is_verified"), + // id, + // userName, + // user.getString("full_name"), + // user.getString("biography"), + // url, + // user.getString("profile_pic_url"), + // user.getString("profile_pic_url_hd"), + // timelineMedia.getLong("count"), + // user.getJSONObject("edge_followed_by").getLong("count"), + // user.getJSONObject("edge_follow").getLong("count"), + // user.optBoolean("followed_by_viewer"), + // user.optBoolean("follows_viewer"), + // user.optBoolean("restricted_by_viewer"), + // user.optBoolean("blocked_by_viewer"), + // user.optBoolean("requested_by_viewer")); } conn.disconnect(); @@ -89,7 +129,7 @@ public final class ProfileFetcher extends AsyncTask { } @Override - protected void onPostExecute(final ProfileModel result) { + protected void onPostExecute(final User result) { if (fetchListener != null) fetchListener.onResult(result); } } diff --git a/app/src/main/java/awais/instagrabber/asyncs/ProfilePostFetchService.java b/app/src/main/java/awais/instagrabber/asyncs/ProfilePostFetchService.java index 649d28d8..e2cfa10c 100644 --- a/app/src/main/java/awais/instagrabber/asyncs/ProfilePostFetchService.java +++ b/app/src/main/java/awais/instagrabber/asyncs/ProfilePostFetchService.java @@ -4,9 +4,9 @@ import java.util.List; import awais.instagrabber.customviews.helpers.PostFetcher; import awais.instagrabber.interfaces.FetchListener; -import awais.instagrabber.models.FeedModel; -import awais.instagrabber.models.ProfileModel; +import awais.instagrabber.repositories.responses.Media; import awais.instagrabber.repositories.responses.PostsFetchResponse; +import awais.instagrabber.repositories.responses.User; import awais.instagrabber.webservices.GraphQLService; import awais.instagrabber.webservices.ProfileService; import awais.instagrabber.webservices.ServiceCallback; @@ -15,12 +15,12 @@ public class ProfilePostFetchService implements PostFetcher.PostFetchService { private static final String TAG = "ProfilePostFetchService"; private final ProfileService profileService; private final GraphQLService graphQLService; - private final ProfileModel profileModel; + private final User profileModel; private final boolean isLoggedIn; private String nextMaxId; private boolean moreAvailable; - public ProfilePostFetchService(final ProfileModel profileModel, final boolean isLoggedIn) { + public ProfilePostFetchService(final User profileModel, final boolean isLoggedIn) { this.profileModel = profileModel; this.isLoggedIn = isLoggedIn; graphQLService = isLoggedIn ? null : GraphQLService.getInstance(); @@ -28,8 +28,8 @@ public class ProfilePostFetchService implements PostFetcher.PostFetchService { } @Override - public void fetch(final FetchListener> fetchListener) { - final ServiceCallback cb = new ServiceCallback() { + public void fetch(final FetchListener> fetchListener) { + final ServiceCallback cb = new ServiceCallback() { @Override public void onSuccess(final PostsFetchResponse result) { if (result == null) return; @@ -48,8 +48,8 @@ public class ProfilePostFetchService implements PostFetcher.PostFetchService { } } }; - if (isLoggedIn) profileService.fetchPosts(profileModel.getId(), nextMaxId, cb); - else graphQLService.fetchProfilePosts(profileModel.getId(), 30, nextMaxId, cb); + if (isLoggedIn) profileService.fetchPosts(profileModel.getPk(), nextMaxId, cb); + else graphQLService.fetchProfilePosts(profileModel.getPk(), 30, nextMaxId, cb); } @Override diff --git a/app/src/main/java/awais/instagrabber/asyncs/SavedPostFetchService.java b/app/src/main/java/awais/instagrabber/asyncs/SavedPostFetchService.java index b13d842d..e59defcb 100644 --- a/app/src/main/java/awais/instagrabber/asyncs/SavedPostFetchService.java +++ b/app/src/main/java/awais/instagrabber/asyncs/SavedPostFetchService.java @@ -4,8 +4,8 @@ import java.util.List; import awais.instagrabber.customviews.helpers.PostFetcher; import awais.instagrabber.interfaces.FetchListener; -import awais.instagrabber.models.FeedModel; import awais.instagrabber.models.enums.PostItemType; +import awais.instagrabber.repositories.responses.Media; import awais.instagrabber.repositories.responses.PostsFetchResponse; import awais.instagrabber.webservices.GraphQLService; import awais.instagrabber.webservices.ProfileService; @@ -14,14 +14,14 @@ import awais.instagrabber.webservices.ServiceCallback; public class SavedPostFetchService implements PostFetcher.PostFetchService { private final ProfileService profileService; private final GraphQLService graphQLService; - private final String profileId; + private final long profileId; private final PostItemType type; private final boolean isLoggedIn; private String nextMaxId; private boolean moreAvailable; - public SavedPostFetchService(final String profileId, final PostItemType type, final boolean isLoggedIn) { + public SavedPostFetchService(final long profileId, final PostItemType type, final boolean isLoggedIn) { this.profileId = profileId; this.type = type; this.isLoggedIn = isLoggedIn; @@ -30,7 +30,7 @@ public class SavedPostFetchService implements PostFetcher.PostFetchService { } @Override - public void fetch(final FetchListener> fetchListener) { + public void fetch(final FetchListener> fetchListener) { final ServiceCallback callback = new ServiceCallback() { @Override public void onSuccess(final PostsFetchResponse result) { diff --git a/app/src/main/java/awais/instagrabber/asyncs/UsernameFetcher.java b/app/src/main/java/awais/instagrabber/asyncs/UsernameFetcher.java index 6b7b3bd8..9ae937d4 100755 --- a/app/src/main/java/awais/instagrabber/asyncs/UsernameFetcher.java +++ b/app/src/main/java/awais/instagrabber/asyncs/UsernameFetcher.java @@ -17,9 +17,9 @@ import awais.instagrabber.utils.NetworkUtils; public final class UsernameFetcher extends AsyncTask { private final FetchListener fetchListener; - private final String uid; + private final long uid; - public UsernameFetcher(final String uid, final FetchListener fetchListener) { + public UsernameFetcher(final long uid, final FetchListener fetchListener) { this.uid = uid; this.fetchListener = fetchListener; } diff --git a/app/src/main/java/awais/instagrabber/asyncs/direct_messages/CreateThreadAction.java b/app/src/main/java/awais/instagrabber/asyncs/direct_messages/CreateThreadAction.java index cda2ef34..821ca206 100644 --- a/app/src/main/java/awais/instagrabber/asyncs/direct_messages/CreateThreadAction.java +++ b/app/src/main/java/awais/instagrabber/asyncs/direct_messages/CreateThreadAction.java @@ -20,10 +20,10 @@ public class CreateThreadAction extends AsyncTask { private static final String TAG = "CommentAction"; private final String cookie; - private final String userId; + private final long userId; private final OnTaskCompleteListener onTaskCompleteListener; - public CreateThreadAction(final String cookie, final String userId, final OnTaskCompleteListener onTaskCompleteListener) { + public CreateThreadAction(final String cookie, final long userId, final OnTaskCompleteListener onTaskCompleteListener) { this.cookie = cookie; this.userId = userId; this.onTaskCompleteListener = onTaskCompleteListener; diff --git a/app/src/main/java/awais/instagrabber/customviews/PostsRecyclerView.java b/app/src/main/java/awais/instagrabber/customviews/PostsRecyclerView.java index 3e0d8e14..48306e27 100644 --- a/app/src/main/java/awais/instagrabber/customviews/PostsRecyclerView.java +++ b/app/src/main/java/awais/instagrabber/customviews/PostsRecyclerView.java @@ -30,11 +30,11 @@ import awais.instagrabber.customviews.helpers.GridSpacingItemDecoration; import awais.instagrabber.customviews.helpers.PostFetcher; import awais.instagrabber.customviews.helpers.RecyclerLazyLoaderAtEdge; import awais.instagrabber.interfaces.FetchListener; -import awais.instagrabber.models.FeedModel; -import awais.instagrabber.models.PostChild; import awais.instagrabber.models.PostsLayoutPreferences; +import awais.instagrabber.repositories.responses.Media; +import awais.instagrabber.utils.ResponseBodyUtils; import awais.instagrabber.utils.Utils; -import awais.instagrabber.viewmodels.FeedViewModel; +import awais.instagrabber.viewmodels.MediaViewModel; import awais.instagrabber.workers.DownloadWorker; public class PostsRecyclerView extends RecyclerView { @@ -48,7 +48,7 @@ public class PostsRecyclerView extends RecyclerView { private ViewModelStoreOwner viewModelStoreOwner; private FeedAdapterV2 feedAdapter; private LifecycleOwner lifeCycleOwner; - private FeedViewModel feedViewModel; + private MediaViewModel mediaViewModel; private boolean initCalled = false; private GridSpacingItemDecoration gridSpacingItemDecoration; private RecyclerLazyLoaderAtEdge lazyLoader; @@ -58,20 +58,20 @@ public class PostsRecyclerView extends RecyclerView { private final List fetchStatusChangeListeners = new ArrayList<>(); - private final FetchListener> fetchListener = new FetchListener>() { + private final FetchListener> fetchListener = new FetchListener>() { @Override - public void onResult(final List result) { + public void onResult(final List result) { final int currentPage = lazyLoader.getCurrentPage(); if (currentPage == 0) { - feedViewModel.getList().postValue(result); + mediaViewModel.getList().postValue(result); shouldScrollToTop = true; dispatchFetchStatus(); return; } - final List models = feedViewModel.getList().getValue(); - final List modelsCopy = models == null ? new ArrayList<>() : new ArrayList<>(models); + final List models = mediaViewModel.getList().getValue(); + final List modelsCopy = models == null ? new ArrayList<>() : new ArrayList<>(models); modelsCopy.addAll(result); - feedViewModel.getList().postValue(modelsCopy); + mediaViewModel.getList().postValue(modelsCopy); dispatchFetchStatus(); } @@ -182,8 +182,8 @@ public class PostsRecyclerView extends RecyclerView { } private void initSelf() { - feedViewModel = new ViewModelProvider(viewModelStoreOwner).get(FeedViewModel.class); - feedViewModel.getList().observe(lifeCycleOwner, list -> { + mediaViewModel = new ViewModelProvider(viewModelStoreOwner).get(MediaViewModel.class); + mediaViewModel.getList().observe(lifeCycleOwner, list -> { if (list.size() > 0) feedAdapter.submitList(list, () -> { if (!shouldScrollToTop) return; smoothScrollToPosition(0); @@ -217,10 +217,10 @@ public class PostsRecyclerView extends RecyclerView { final float progressPercent = progress.getFloat(DownloadWorker.PROGRESS, 0); if (progressPercent != 100) continue; final String url = progress.getString(DownloadWorker.URL); - final List feedModels = feedViewModel.getList().getValue(); + final List feedModels = mediaViewModel.getList().getValue(); if (feedModels == null) continue; for (int i = 0; i < feedModels.size(); i++) { - final FeedModel feedModel = feedModels.get(i); + final Media feedModel = feedModels.get(i); final List displayUrls = getDisplayUrl(feedModel); if (displayUrls.contains(url)) { feedAdapter.notifyItemChanged(i); @@ -231,19 +231,19 @@ public class PostsRecyclerView extends RecyclerView { }); } - private List getDisplayUrl(final FeedModel feedModel) { + private List getDisplayUrl(final Media feedModel) { List urls = Collections.emptyList(); - switch (feedModel.getItemType()) { + switch (feedModel.getMediaType()) { case MEDIA_TYPE_IMAGE: case MEDIA_TYPE_VIDEO: - urls = Collections.singletonList(feedModel.getDisplayUrl()); + urls = Collections.singletonList(ResponseBodyUtils.getImageUrl(feedModel)); break; case MEDIA_TYPE_SLIDER: - final List sliderItems = feedModel.getSliderItems(); + final List sliderItems = feedModel.getCarouselMedia(); if (sliderItems != null) { final ImmutableList.Builder builder = ImmutableList.builder(); - for (final PostChild child : sliderItems) { - builder.add(child.getDisplayUrl()); + for (final Media child : sliderItems) { + builder.add(ResponseBodyUtils.getImageUrl(child)); } urls = builder.build(); } diff --git a/app/src/main/java/awais/instagrabber/customviews/RamboTextView.java b/app/src/main/java/awais/instagrabber/customviews/RamboTextView.java index b4b85673..2d7f236c 100755 --- a/app/src/main/java/awais/instagrabber/customviews/RamboTextView.java +++ b/app/src/main/java/awais/instagrabber/customviews/RamboTextView.java @@ -24,9 +24,9 @@ import androidx.appcompat.widget.AppCompatTextView; import awais.instagrabber.R; import awais.instagrabber.interfaces.MentionClickListener; -import awais.instagrabber.models.FeedModel; import awais.instagrabber.utils.TextUtils; +@Deprecated public final class RamboTextView extends AppCompatTextView { private static final String TAG = "RamboTextView"; private static final int highlightBackgroundSpanKey = R.id.tvComment; @@ -90,8 +90,8 @@ public final class RamboTextView extends AppCompatTextView { // if (isExpandable && !touchStartedOverAClickableSpan) // return !isExpanded | super.onTouchEvent(event); // short operator, because we want two shits to work - final Object tag = getTag(); - final FeedModel feedModel = tag instanceof FeedModel ? (FeedModel) tag : null; + // final Object tag = getTag(); + // final FeedModel feedModel = tag instanceof FeedModel ? (FeedModel) tag : null; switch (action) { case MotionEvent.ACTION_DOWN: diff --git a/app/src/main/java/awais/instagrabber/customviews/helpers/PostFetcher.java b/app/src/main/java/awais/instagrabber/customviews/helpers/PostFetcher.java index 22145bfa..367b6544 100644 --- a/app/src/main/java/awais/instagrabber/customviews/helpers/PostFetcher.java +++ b/app/src/main/java/awais/instagrabber/customviews/helpers/PostFetcher.java @@ -1,17 +1,21 @@ package awais.instagrabber.customviews.helpers; +import android.util.Log; + import java.util.List; import awais.instagrabber.interfaces.FetchListener; -import awais.instagrabber.models.FeedModel; +import awais.instagrabber.repositories.responses.Media; public class PostFetcher { + private static final String TAG = PostFetcher.class.getSimpleName(); + private final PostFetchService postFetchService; - private final FetchListener> fetchListener; + private final FetchListener> fetchListener; private boolean fetching; public PostFetcher(final PostFetchService postFetchService, - final FetchListener> fetchListener) { + final FetchListener> fetchListener) { this.postFetchService = postFetchService; this.fetchListener = fetchListener; } @@ -19,9 +23,17 @@ public class PostFetcher { public void fetch() { if (!fetching) { fetching = true; - postFetchService.fetch(result -> { - fetching = false; - fetchListener.onResult(result); + postFetchService.fetch(new FetchListener>() { + @Override + public void onResult(final List result) { + fetching = false; + fetchListener.onResult(result); + } + + @Override + public void onFailure(final Throwable t) { + Log.e(TAG, "onFailure: ", t); + } }); } } @@ -39,7 +51,7 @@ public class PostFetcher { } public interface PostFetchService { - void fetch(FetchListener> fetchListener); + void fetch(FetchListener> fetchListener); void reset(); diff --git a/app/src/main/java/awais/instagrabber/customviews/helpers/VideoAwareRecyclerScroller.java b/app/src/main/java/awais/instagrabber/customviews/helpers/VideoAwareRecyclerScroller.java index 263052b8..a7ec7022 100755 --- a/app/src/main/java/awais/instagrabber/customviews/helpers/VideoAwareRecyclerScroller.java +++ b/app/src/main/java/awais/instagrabber/customviews/helpers/VideoAwareRecyclerScroller.java @@ -12,7 +12,7 @@ import com.google.android.exoplayer2.SimpleExoPlayer; import awais.instagrabber.R; import awais.instagrabber.adapters.viewholder.feed.FeedVideoViewHolder; -import awais.instagrabber.models.FeedModel; +import awais.instagrabber.repositories.responses.Media; import static androidx.recyclerview.widget.RecyclerView.SCROLL_STATE_DRAGGING; import static androidx.recyclerview.widget.RecyclerView.SCROLL_STATE_IDLE; @@ -75,8 +75,8 @@ public class VideoAwareRecyclerScroller extends RecyclerView.OnScrollListener { } return; } - if (currentlyPlayingViewHolder != null && currentlyPlayingViewHolder.getCurrentFeedModel().getPostId() - .equals(videoHolder.getCurrentFeedModel().getPostId())) { + if (currentlyPlayingViewHolder != null && currentlyPlayingViewHolder.getCurrentFeedModel().getPk() + .equals(videoHolder.getCurrentFeedModel().getPk())) { return; } if (currentlyPlayingViewHolder != null) { @@ -203,10 +203,10 @@ public class VideoAwareRecyclerScroller extends RecyclerView.OnScrollListener { final boolean result = viewSwitcher.getGlobalVisibleRect(visibleItemRect, offset); if (!result) continue; final FeedVideoViewHolder viewHolder = (FeedVideoViewHolder) recyclerView.getChildViewHolder(view); - final FeedModel currentFeedModel = viewHolder.getCurrentFeedModel(); + final Media currentFeedModel = viewHolder.getCurrentFeedModel(); visibleItemRect.offset(-offset.x, -offset.y); final int visibleHeight = visibleItemRect.height(); - if (visibleHeight < currentFeedModel.getImageHeight()) { + if (visibleHeight < currentFeedModel.getOriginalHeight()) { continue; } // Log.d(TAG, "post:" + currentFeedModel.getPostId() + ", visibleHeight: " + visibleHeight + ", post height: " + currentFeedModel.getImageHeight()); diff --git a/app/src/main/java/awais/instagrabber/db/repositories/AccountRepository.java b/app/src/main/java/awais/instagrabber/db/repositories/AccountRepository.java index bb7c48fd..1079712c 100644 --- a/app/src/main/java/awais/instagrabber/db/repositories/AccountRepository.java +++ b/app/src/main/java/awais/instagrabber/db/repositories/AccountRepository.java @@ -28,11 +28,11 @@ public class AccountRepository { return instance; } - public void getAccount(final String uid, + public void getAccount(final long uid, final RepositoryCallback callback) { // request on the I/O thread appExecutors.diskIO().execute(() -> { - final Account account = accountDataSource.getAccount(uid); + final Account account = accountDataSource.getAccount(String.valueOf(uid)); // notify on the main thread appExecutors.mainThread().execute(() -> { if (callback == null) return; @@ -81,7 +81,7 @@ public class AccountRepository { }); } - public void insertOrUpdateAccount(final String uid, + public void insertOrUpdateAccount(final long uid, final String username, final String cookie, final String fullName, @@ -89,8 +89,8 @@ public class AccountRepository { final RepositoryCallback callback) { // request on the I/O thread appExecutors.diskIO().execute(() -> { - accountDataSource.insertOrUpdateAccount(uid, username, cookie, fullName, profilePicUrl); - final Account updated = accountDataSource.getAccount(uid); + accountDataSource.insertOrUpdateAccount(String.valueOf(uid), username, cookie, fullName, profilePicUrl); + final Account updated = accountDataSource.getAccount(String.valueOf(uid)); // notify on the main thread appExecutors.mainThread().execute(() -> { if (callback == null) return; diff --git a/app/src/main/java/awais/instagrabber/dialogs/ProfilePicDialogFragment.java b/app/src/main/java/awais/instagrabber/dialogs/ProfilePicDialogFragment.java index 61ef457c..e57e1f86 100644 --- a/app/src/main/java/awais/instagrabber/dialogs/ProfilePicDialogFragment.java +++ b/app/src/main/java/awais/instagrabber/dialogs/ProfilePicDialogFragment.java @@ -28,7 +28,7 @@ import java.io.File; import awais.instagrabber.R; import awais.instagrabber.databinding.DialogProfilepicBinding; -import awais.instagrabber.repositories.responses.UserInfo; +import awais.instagrabber.repositories.responses.User; import awais.instagrabber.utils.Constants; import awais.instagrabber.utils.CookieUtils; import awais.instagrabber.utils.DownloadUtils; @@ -41,7 +41,7 @@ import static awais.instagrabber.utils.Utils.settingsHelper; public class ProfilePicDialogFragment extends DialogFragment { private static final String TAG = "ProfilePicDlgFragment"; - private final String id; + private final long id; private final String name; private final String fallbackUrl; @@ -49,7 +49,7 @@ public class ProfilePicDialogFragment extends DialogFragment { private DialogProfilepicBinding binding; private String url; - public ProfilePicDialogFragment(final String id, final String name, final String fallbackUrl) { + public ProfilePicDialogFragment(final long id, final String name, final String fallbackUrl) { this.id = id; this.name = name; this.fallbackUrl = fallbackUrl; @@ -61,7 +61,7 @@ public class ProfilePicDialogFragment extends DialogFragment { final Bundle savedInstanceState) { binding = DialogProfilepicBinding.inflate(inflater, container, false); final String cookie = settingsHelper.getString(Constants.COOKIE); - isLoggedIn = !TextUtils.isEmpty(cookie) && CookieUtils.getUserIdFromCookie(cookie) != null; + isLoggedIn = !TextUtils.isEmpty(cookie) && CookieUtils.getUserIdFromCookie(cookie) > 0; return binding.getRoot(); } @@ -116,11 +116,11 @@ public class ProfilePicDialogFragment extends DialogFragment { private void fetchAvatar() { if (isLoggedIn) { final UserService userService = UserService.getInstance(); - userService.getUserInfo(id, new ServiceCallback() { + userService.getUserInfo(id, new ServiceCallback() { @Override - public void onSuccess(final UserInfo result) { + public void onSuccess(final User result) { if (result != null) { - setupPhoto(result.getHDProfilePicUrl()); + setupPhoto(result.getProfilePicUrl()); } } @@ -131,8 +131,7 @@ public class ProfilePicDialogFragment extends DialogFragment { getDialog().dismiss(); } }); - } - else setupPhoto(fallbackUrl); + } else setupPhoto(fallbackUrl); } private void setupPhoto(final String result) { diff --git a/app/src/main/java/awais/instagrabber/fragments/CommentsViewerFragment.java b/app/src/main/java/awais/instagrabber/fragments/CommentsViewerFragment.java index 500ad96b..e438523e 100644 --- a/app/src/main/java/awais/instagrabber/fragments/CommentsViewerFragment.java +++ b/app/src/main/java/awais/instagrabber/fragments/CommentsViewerFragment.java @@ -22,8 +22,6 @@ import androidx.annotation.Nullable; import androidx.appcompat.app.AlertDialog; import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.widget.LinearLayoutCompat; -import androidx.fragment.app.FragmentManager; -import androidx.fragment.app.FragmentTransaction; import androidx.lifecycle.ViewModelProvider; import androidx.navigation.NavController; import androidx.navigation.NavDirections; @@ -43,10 +41,9 @@ import awais.instagrabber.adapters.CommentsAdapter; import awais.instagrabber.asyncs.CommentsFetcher; import awais.instagrabber.customviews.helpers.RecyclerLazyLoader; import awais.instagrabber.databinding.FragmentCommentsBinding; -import awais.instagrabber.dialogs.ProfilePicDialogFragment; import awais.instagrabber.interfaces.FetchListener; import awais.instagrabber.models.CommentModel; -import awais.instagrabber.models.ProfileModel; +import awais.instagrabber.repositories.responses.User; import awais.instagrabber.utils.Constants; import awais.instagrabber.utils.CookieUtils; import awais.instagrabber.utils.TextUtils; @@ -66,7 +63,9 @@ public final class CommentsViewerFragment extends BottomSheetDialogFragment impl private FragmentCommentsBinding binding; private LinearLayoutManager layoutManager; private RecyclerLazyLoader lazyLoader; - private String shortCode, userId, endCursor = null; + private String shortCode; + private long userId; + private String endCursor = null; private Resources resources; private InputMethodManager imm; private AppCompatActivity fragmentActivity; @@ -141,8 +140,8 @@ public final class CommentsViewerFragment extends BottomSheetDialogFragment impl Toast.makeText(context, R.string.comment_send_empty_comment, Toast.LENGTH_SHORT).show(); return; } - final String userId = CookieUtils.getUserIdFromCookie(cookie); - if (userId == null) return; + final long userId = CookieUtils.getUserIdFromCookie(cookie); + if (userId == 0) return; String replyToId = null; final CommentModel commentModel = commentsAdapter.getSelected(); if (commentModel != null) { @@ -280,7 +279,7 @@ public final class CommentsViewerFragment extends BottomSheetDialogFragment impl // final ActionBar actionBar = fragmentActivity.getSupportActionBar(); // if (actionBar == null) return; // actionBar.setTitle(R.string.title_comments); - // actionBar.setSubtitle(shortCode); + // actionBar.setSubtitle(shortCode); // } private void onCommentClick(final CommentModel commentModel) { @@ -290,10 +289,10 @@ public final class CommentsViewerFragment extends BottomSheetDialogFragment impl String[] commentDialogList; - final String userIdFromCookie = CookieUtils.getUserIdFromCookie(cookie); + final long userIdFromCookie = CookieUtils.getUserIdFromCookie(cookie); if (!TextUtils.isEmpty(cookie) - && userIdFromCookie != null - && (userIdFromCookie.equals(commentModel.getProfileModel().getId()) || userIdFromCookie.equals(userId))) { + && userIdFromCookie != 0 + && (userIdFromCookie == commentModel.getProfileModel().getPk() || userIdFromCookie == userId)) { commentDialogList = new String[]{ resources.getString(R.string.open_profile), resources.getString(R.string.comment_viewer_copy_comment), @@ -324,7 +323,7 @@ public final class CommentsViewerFragment extends BottomSheetDialogFragment impl final Context context = getContext(); if (context == null) return; final DialogInterface.OnClickListener profileDialogListener = (dialog, which) -> { - final ProfileModel profileModel = commentModel.getProfileModel(); + final User profileModel = commentModel.getProfileModel(); final String csrfToken = CookieUtils.getCsrfTokenFromCookie(cookie); switch (which) { case 0: // open profile @@ -340,8 +339,7 @@ public final class CommentsViewerFragment extends BottomSheetDialogFragment impl bundle.putString("postId", commentModel.getId()); bundle.putBoolean("isComment", true); navController.navigate(R.id.action_global_likesViewerFragment, bundle); - } - else Toast.makeText(context, R.string.downloader_unknown_error, Toast.LENGTH_SHORT).show(); + } else Toast.makeText(context, R.string.downloader_unknown_error, Toast.LENGTH_SHORT).show(); break; case 3: // reply to comment commentsAdapter.setSelected(commentModel); @@ -418,8 +416,8 @@ public final class CommentsViewerFragment extends BottomSheetDialogFragment impl }); break; case 6: // delete comment - final String userId = CookieUtils.getUserIdFromCookie(cookie); - if (userId == null) return; + final long userId = CookieUtils.getUserIdFromCookie(cookie); + if (userId == 0) return; mediaService.deleteComment( postId, userId, commentModel.getId(), csrfToken, new ServiceCallback() { diff --git a/app/src/main/java/awais/instagrabber/fragments/FollowViewerFragment.java b/app/src/main/java/awais/instagrabber/fragments/FollowViewerFragment.java index 2512cca0..631d1ebe 100644 --- a/app/src/main/java/awais/instagrabber/fragments/FollowViewerFragment.java +++ b/app/src/main/java/awais/instagrabber/fragments/FollowViewerFragment.java @@ -30,7 +30,7 @@ import awais.instagrabber.adapters.FollowAdapter; import awais.instagrabber.customviews.helpers.RecyclerLazyLoader; import awais.instagrabber.databinding.FragmentFollowersViewerBinding; import awais.instagrabber.models.FollowModel; -import awais.instagrabber.repositories.responses.FriendshipRepoListFetchResponse; +import awais.instagrabber.repositories.responses.FriendshipListFetchResponse; import awais.instagrabber.utils.TextUtils; import awais.instagrabber.webservices.FriendshipService; import awais.instagrabber.webservices.ServiceCallback; @@ -45,7 +45,11 @@ public final class FollowViewerFragment extends Fragment implements SwipeRefresh private final ArrayList allFollowing = new ArrayList<>(); private boolean moreAvailable = true, isFollowersList, isCompare = false, loading = false, shouldRefresh = true; - private String profileId, username, namePost, type, endCursor; + private long profileId; + private String username; + private String namePost; + private String type; + private String endCursor; private Resources resources; private LinearLayoutManager layoutManager; private RecyclerLazyLoader lazyLoader; @@ -58,9 +62,9 @@ public final class FollowViewerFragment extends Fragment implements SwipeRefresh private FriendshipService friendshipService; private AppCompatActivity fragmentActivity; - final ServiceCallback followingFetchCb = new ServiceCallback() { + final ServiceCallback followingFetchCb = new ServiceCallback() { @Override - public void onSuccess(final FriendshipRepoListFetchResponse result) { + public void onSuccess(final FriendshipListFetchResponse result) { if (result != null) { followingModels.addAll(result.getItems()); if (!isFollowersList) followModels.addAll(result.getItems()); @@ -84,9 +88,9 @@ public final class FollowViewerFragment extends Fragment implements SwipeRefresh Log.e(TAG, "Error fetching list (double, following)", t); } }; - final ServiceCallback followersFetchCb = new ServiceCallback() { + final ServiceCallback followersFetchCb = new ServiceCallback() { @Override - public void onSuccess(final FriendshipRepoListFetchResponse result) { + public void onSuccess(final FriendshipListFetchResponse result) { if (result != null) { followersModels.addAll(result.getItems()); if (isFollowersList) followModels.addAll(result.getItems()); @@ -195,27 +199,24 @@ public final class FollowViewerFragment extends Fragment implements SwipeRefresh private void listFollows() { type = resources.getString(isFollowersList ? R.string.followers_type_followers : R.string.followers_type_following); setSubtitle(type); - final ServiceCallback cb = new ServiceCallback() { + final ServiceCallback cb = new ServiceCallback() { @Override - public void onSuccess(final FriendshipRepoListFetchResponse result) { + public void onSuccess(final FriendshipListFetchResponse result) { if (result == null) { binding.swipeRefreshLayout.setRefreshing(false); return; } - else { - int oldSize = followModels.size() == 0 ? 0 : followModels.size() - 1; - followModels.addAll(result.getItems()); - if (result.isMoreAvailable()) { - moreAvailable = true; - endCursor = result.getNextMaxId(); - } - else moreAvailable = false; - binding.swipeRefreshLayout.setRefreshing(false); - if (isFollowersList) followersModels.addAll(result.getItems()); - else followingModels.addAll(result.getItems()); - refreshAdapter(followModels, null, null, null); - layoutManager.scrollToPosition(oldSize); - } + int oldSize = followModels.size() == 0 ? 0 : followModels.size() - 1; + followModels.addAll(result.getItems()); + if (result.isMoreAvailable()) { + moreAvailable = true; + endCursor = result.getNextMaxId(); + } else moreAvailable = false; + binding.swipeRefreshLayout.setRefreshing(false); + if (isFollowersList) followersModels.addAll(result.getItems()); + else followingModels.addAll(result.getItems()); + refreshAdapter(followModels, null, null, null); + layoutManager.scrollToPosition(oldSize); } @Override @@ -239,8 +240,7 @@ public final class FollowViewerFragment extends Fragment implements SwipeRefresh if (moreAvailable) { binding.swipeRefreshLayout.setRefreshing(true); friendshipService.getList(isFollowersList, profileId, endCursor, cb); - } - else { + } else { refreshAdapter(followModels, null, null, null); layoutManager.scrollToPosition(0); } @@ -256,19 +256,17 @@ public final class FollowViewerFragment extends Fragment implements SwipeRefresh binding.swipeRefreshLayout.setRefreshing(true); Toast.makeText(getContext(), R.string.follower_start_compare, Toast.LENGTH_LONG).show(); friendshipService.getList(isFollowersList, - profileId, - endCursor, - isFollowersList ? followersFetchCb : followingFetchCb); - } - else if (followersModels.size() == 0 || followingModels.size() == 0) { + profileId, + endCursor, + isFollowersList ? followersFetchCb : followingFetchCb); + } else if (followersModels.size() == 0 || followingModels.size() == 0) { binding.swipeRefreshLayout.setRefreshing(true); Toast.makeText(getContext(), R.string.follower_start_compare, Toast.LENGTH_LONG).show(); friendshipService.getList(!isFollowersList, - profileId, - null, - isFollowersList ? followingFetchCb : followersFetchCb); - } - else showCompare(); + profileId, + null, + isFollowersList ? followingFetchCb : followersFetchCb); + } else showCompare(); } private void showCompare() { @@ -383,8 +381,7 @@ public final class FollowViewerFragment extends Fragment implements SwipeRefresh else if (isCompare) { isCompare = !isCompare; listFollows(); - } - else { + } else { isCompare = !isCompare; listCompare(); } diff --git a/app/src/main/java/awais/instagrabber/fragments/HashTagFragment.java b/app/src/main/java/awais/instagrabber/fragments/HashTagFragment.java index 10fc0482..8f37df9f 100644 --- a/app/src/main/java/awais/instagrabber/fragments/HashTagFragment.java +++ b/app/src/main/java/awais/instagrabber/fragments/HashTagFragment.java @@ -55,11 +55,12 @@ import awais.instagrabber.db.repositories.FavoriteRepository; import awais.instagrabber.db.repositories.RepositoryCallback; import awais.instagrabber.dialogs.PostsLayoutPreferencesDialogFragment; import awais.instagrabber.interfaces.FetchListener; -import awais.instagrabber.models.FeedModel; import awais.instagrabber.models.HashtagModel; import awais.instagrabber.models.PostsLayoutPreferences; import awais.instagrabber.models.StoryModel; import awais.instagrabber.models.enums.FavoriteType; +import awais.instagrabber.repositories.responses.Location; +import awais.instagrabber.repositories.responses.Media; import awais.instagrabber.utils.Constants; import awais.instagrabber.utils.CookieUtils; import awais.instagrabber.utils.DownloadUtils; @@ -96,8 +97,8 @@ public class HashTagFragment extends Fragment implements SwipeRefreshLayout.OnRe private boolean isLoggedIn; private TagsService tagsService; private boolean storiesFetching; - private Set selectedFeedModels; - private FeedModel downloadFeedModel; + private Set selectedFeedModels; + private Media downloadFeedModel; private int downloadChildPosition = -1; private PostsLayoutPreferences layoutPreferences = Utils.getPostsLayoutPreferences(Constants.PREF_HASHTAG_POSTS_LAYOUT); private LayoutHashtagDetailsBinding hashtagDetailsBinding; @@ -135,27 +136,27 @@ public class HashTagFragment extends Fragment implements SwipeRefreshLayout.OnRe }); private final FeedAdapterV2.FeedItemCallback feedItemCallback = new FeedAdapterV2.FeedItemCallback() { @Override - public void onPostClick(final FeedModel feedModel, final View profilePicView, final View mainPostImage) { + public void onPostClick(final Media feedModel, final View profilePicView, final View mainPostImage) { openPostDialog(feedModel, profilePicView, mainPostImage, -1); } @Override - public void onSliderClick(final FeedModel feedModel, final int position) { + public void onSliderClick(final Media feedModel, final int position) { openPostDialog(feedModel, null, null, position); } @Override - public void onCommentsClick(final FeedModel feedModel) { + public void onCommentsClick(final Media feedModel) { final NavDirections commentsAction = HashTagFragmentDirections.actionGlobalCommentsViewerFragment( - feedModel.getShortCode(), - feedModel.getPostId(), - feedModel.getProfileModel().getId() + feedModel.getCode(), + feedModel.getCode(), + feedModel.getUser().getPk() ); NavHostFragment.findNavController(HashTagFragment.this).navigate(commentsAction); } @Override - public void onDownloadClick(final FeedModel feedModel, final int childPosition) { + public void onDownloadClick(final Media feedModel, final int childPosition) { final Context context = getContext(); if (context == null) return; if (checkSelfPermission(context, WRITE_PERMISSION) == PermissionChecker.PERMISSION_GRANTED) { @@ -174,8 +175,10 @@ public class HashTagFragment extends Fragment implements SwipeRefreshLayout.OnRe } @Override - public void onLocationClick(final FeedModel feedModel) { - final NavDirections action = HashTagFragmentDirections.actionGlobalLocationFragment(feedModel.getLocationId()); + public void onLocationClick(final Media media) { + final Location location = media.getLocation(); + if (location == null) return; + final NavDirections action = HashTagFragmentDirections.actionGlobalLocationFragment(location.getPk()); NavHostFragment.findNavController(HashTagFragment.this).navigate(action); } @@ -185,13 +188,13 @@ public class HashTagFragment extends Fragment implements SwipeRefreshLayout.OnRe } @Override - public void onNameClick(final FeedModel feedModel, final View profilePicView) { - navigateToProfile("@" + feedModel.getProfileModel().getUsername()); + public void onNameClick(final Media feedModel, final View profilePicView) { + navigateToProfile("@" + feedModel.getUser().getUsername()); } @Override - public void onProfilePicClick(final FeedModel feedModel, final View profilePicView) { - navigateToProfile("@" + feedModel.getProfileModel().getUsername()); + public void onProfilePicClick(final Media feedModel, final View profilePicView) { + navigateToProfile("@" + feedModel.getUser().getUsername()); } @Override @@ -204,14 +207,14 @@ public class HashTagFragment extends Fragment implements SwipeRefreshLayout.OnRe Utils.openEmailAddress(getContext(), emailId); } - private void openPostDialog(@NonNull final FeedModel feedModel, + private void openPostDialog(@NonNull final Media feedModel, final View profilePicView, final View mainPostImage, final int position) { if (opening) return; - if (TextUtils.isEmpty(feedModel.getProfileModel().getUsername())) { + if (TextUtils.isEmpty(feedModel.getUser().getUsername())) { opening = true; - new PostFetcher(feedModel.getShortCode(), newFeedModel -> { + new PostFetcher(feedModel.getCode(), newFeedModel -> { opening = false; if (newFeedModel == null) return; openPostDialog(newFeedModel, profilePicView, mainPostImage, position); @@ -246,7 +249,7 @@ public class HashTagFragment extends Fragment implements SwipeRefreshLayout.OnRe } @Override - public void onSelectionChange(final Set selectedFeedModels) { + public void onSelectionChange(final Set selectedFeedModels) { final String title = getString(R.string.number_selected, selectedFeedModels.size()); if (actionMode != null) { actionMode.setTitle(title); @@ -355,7 +358,7 @@ public class HashTagFragment extends Fragment implements SwipeRefreshLayout.OnRe private void init() { if (getArguments() == null) return; final String cookie = settingsHelper.getString(Constants.COOKIE); - isLoggedIn = !TextUtils.isEmpty(cookie) && CookieUtils.getUserIdFromCookie(cookie) != null; + isLoggedIn = !TextUtils.isEmpty(cookie) && CookieUtils.getUserIdFromCookie(cookie) > 0; final HashTagFragmentArgs fragmentArgs = HashTagFragmentArgs.fromBundle(getArguments()); hashtag = fragmentArgs.getHashtag(); fetchHashtagModel(); @@ -544,8 +547,10 @@ public class HashTagFragment extends Fragment implements SwipeRefreshLayout.OnRe hashtagDetailsBinding.mainHashtagImage.setImageURI(hashtagModel.getSdProfilePic()); final String postCount = String.valueOf(hashtagModel.getPostCount()); final SpannableStringBuilder span = new SpannableStringBuilder(getResources().getQuantityString(R.plurals.main_posts_count_inline, - hashtagModel.getPostCount() > 2000000000L ? 2000000000 : hashtagModel.getPostCount().intValue(), - postCount)); + hashtagModel.getPostCount() > 2000000000L + ? 2000000000 + : hashtagModel.getPostCount().intValue(), + postCount)); span.setSpan(new RelativeSizeSpan(1.2f), 0, postCount.length(), 0); span.setSpan(new StyleSpan(Typeface.BOLD), 0, postCount.length(), 0); hashtagDetailsBinding.mainTagPostCount.setText(span); diff --git a/app/src/main/java/awais/instagrabber/fragments/LikesViewerFragment.java b/app/src/main/java/awais/instagrabber/fragments/LikesViewerFragment.java index 157222b8..3bf8eccf 100644 --- a/app/src/main/java/awais/instagrabber/fragments/LikesViewerFragment.java +++ b/app/src/main/java/awais/instagrabber/fragments/LikesViewerFragment.java @@ -1,8 +1,6 @@ package awais.instagrabber.fragments; import android.content.Context; -import android.content.res.Resources; -import android.os.AsyncTask; import android.os.Bundle; import android.util.Log; import android.view.LayoutInflater; @@ -12,8 +10,6 @@ import android.widget.Toast; import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import androidx.appcompat.app.AppCompatActivity; -import androidx.appcompat.widget.LinearLayoutCompat; import androidx.navigation.fragment.NavHostFragment; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; @@ -26,12 +22,11 @@ import awais.instagrabber.R; import awais.instagrabber.adapters.LikesAdapter; import awais.instagrabber.customviews.helpers.RecyclerLazyLoader; import awais.instagrabber.databinding.FragmentLikesBinding; -import awais.instagrabber.models.ProfileModel; import awais.instagrabber.repositories.responses.GraphQLUserListFetchResponse; +import awais.instagrabber.repositories.responses.User; import awais.instagrabber.utils.Constants; import awais.instagrabber.utils.CookieUtils; import awais.instagrabber.utils.TextUtils; -import awais.instagrabber.utils.Utils; import awais.instagrabber.webservices.GraphQLService; import awais.instagrabber.webservices.MediaService; import awais.instagrabber.webservices.ServiceCallback; @@ -41,14 +36,7 @@ import static awais.instagrabber.utils.Utils.settingsHelper; public final class LikesViewerFragment extends BottomSheetDialogFragment implements SwipeRefreshLayout.OnRefreshListener { private static final String TAG = "LikesViewerFragment"; - private final String cookie = Utils.settingsHelper.getString(Constants.COOKIE); - - private LikesAdapter likesAdapter; private FragmentLikesBinding binding; - private LinearLayoutManager layoutManager; - private Resources resources; - private AppCompatActivity fragmentActivity; - private LinearLayoutCompat root; private RecyclerLazyLoader lazyLoader; private MediaService mediaService; private GraphQLService graphQLService; @@ -56,13 +44,13 @@ public final class LikesViewerFragment extends BottomSheetDialogFragment impleme private String postId, endCursor; private boolean isComment; - private final ServiceCallback> cb = new ServiceCallback>() { + private final ServiceCallback> cb = new ServiceCallback>() { @Override - public void onSuccess(final List result) { + public void onSuccess(final List result) { final LikesAdapter likesAdapter = new LikesAdapter(result, v -> { final Object tag = v.getTag(); - if (tag instanceof ProfileModel) { - ProfileModel model = (ProfileModel) tag; + if (tag instanceof User) { + User model = (User) tag; final Bundle bundle = new Bundle(); bundle.putString("username", "@" + model.getUsername()); NavHostFragment.findNavController(LikesViewerFragment.this).navigate(R.id.action_global_profileFragment, bundle); @@ -79,8 +67,7 @@ public final class LikesViewerFragment extends BottomSheetDialogFragment impleme try { final Context context = getContext(); Toast.makeText(context, t.getMessage(), Toast.LENGTH_SHORT).show(); - } - catch (Exception e) {} + } catch (Exception ignored) {} } }; @@ -90,8 +77,8 @@ public final class LikesViewerFragment extends BottomSheetDialogFragment impleme endCursor = result.getNextMaxId(); final LikesAdapter likesAdapter = new LikesAdapter(result.getItems(), v -> { final Object tag = v.getTag(); - if (tag instanceof ProfileModel) { - ProfileModel model = (ProfileModel) tag; + if (tag instanceof User) { + User model = (User) tag; final Bundle bundle = new Bundle(); bundle.putString("username", "@" + model.getUsername()); NavHostFragment.findNavController(LikesViewerFragment.this).navigate(R.id.action_global_profileFragment, bundle); @@ -107,8 +94,7 @@ public final class LikesViewerFragment extends BottomSheetDialogFragment impleme try { final Context context = getContext(); Toast.makeText(context, t.getMessage(), Toast.LENGTH_SHORT).show(); - } - catch (Exception e) {} + } catch (Exception ignored) {} } }; @@ -116,8 +102,8 @@ public final class LikesViewerFragment extends BottomSheetDialogFragment impleme public void onCreate(@Nullable final Bundle savedInstanceState) { super.onCreate(savedInstanceState); final String cookie = settingsHelper.getString(Constants.COOKIE); - isLoggedIn = !TextUtils.isEmpty(cookie) && CookieUtils.getUserIdFromCookie(cookie) != null; - fragmentActivity = (AppCompatActivity) getActivity(); + isLoggedIn = !TextUtils.isEmpty(cookie) && CookieUtils.getUserIdFromCookie(cookie) > 0; + // final AppCompatActivity fragmentActivity = (AppCompatActivity) getActivity(); mediaService = isLoggedIn ? MediaService.getInstance() : null; graphQLService = isLoggedIn ? null : GraphQLService.getInstance(); // setHasOptionsMenu(true); @@ -129,8 +115,7 @@ public final class LikesViewerFragment extends BottomSheetDialogFragment impleme binding = FragmentLikesBinding.inflate(getLayoutInflater()); binding.swipeRefreshLayout.setEnabled(false); binding.swipeRefreshLayout.setNestedScrollingEnabled(false); - root = binding.getRoot(); - return root; + return binding.getRoot(); } @Override @@ -143,8 +128,7 @@ public final class LikesViewerFragment extends BottomSheetDialogFragment impleme if (isComment && !isLoggedIn) { lazyLoader.resetState(); graphQLService.fetchCommentLikers(postId, null, acb); - } - else mediaService.fetchLikes(postId, isComment, cb); + } else mediaService.fetchLikes(postId, isComment, cb); } private void init() { @@ -154,9 +138,8 @@ public final class LikesViewerFragment extends BottomSheetDialogFragment impleme isComment = fragmentArgs.getIsComment(); binding.swipeRefreshLayout.setOnRefreshListener(this); binding.swipeRefreshLayout.setRefreshing(true); - resources = getResources(); if (isComment && !isLoggedIn) { - layoutManager = new LinearLayoutManager(getContext()); + final LinearLayoutManager layoutManager = new LinearLayoutManager(getContext()); binding.rvLikes.setLayoutManager(layoutManager); lazyLoader = new RecyclerLazyLoader(layoutManager, (page, totalItemsCount) -> { if (!TextUtils.isEmpty(endCursor)) diff --git a/app/src/main/java/awais/instagrabber/fragments/LocationFragment.java b/app/src/main/java/awais/instagrabber/fragments/LocationFragment.java index c48d4939..9e1b3121 100644 --- a/app/src/main/java/awais/instagrabber/fragments/LocationFragment.java +++ b/app/src/main/java/awais/instagrabber/fragments/LocationFragment.java @@ -57,11 +57,11 @@ import awais.instagrabber.db.entities.Favorite; import awais.instagrabber.db.repositories.FavoriteRepository; import awais.instagrabber.db.repositories.RepositoryCallback; import awais.instagrabber.dialogs.PostsLayoutPreferencesDialogFragment; -import awais.instagrabber.models.FeedModel; import awais.instagrabber.models.LocationModel; import awais.instagrabber.models.PostsLayoutPreferences; import awais.instagrabber.models.StoryModel; import awais.instagrabber.models.enums.FavoriteType; +import awais.instagrabber.repositories.responses.Media; import awais.instagrabber.utils.Constants; import awais.instagrabber.utils.CookieUtils; import awais.instagrabber.utils.DownloadUtils; @@ -87,15 +87,15 @@ public class LocationFragment extends Fragment implements SwipeRefreshLayout.OnR private boolean shouldRefresh = true; private boolean hasStories = false; private boolean opening = false; - private String locationId; + private long locationId; private LocationModel locationModel; private ActionMode actionMode; private StoriesService storiesService; private AsyncTask currentlyExecuting; private boolean isLoggedIn; private boolean storiesFetching; - private Set selectedFeedModels; - private FeedModel downloadFeedModel; + private Set selectedFeedModels; + private Media downloadFeedModel; private int downloadChildPosition = -1; private PostsLayoutPreferences layoutPreferences = Utils.getPostsLayoutPreferences(Constants.PREF_LOCATION_POSTS_LAYOUT); private LayoutLocationDetailsBinding locationDetailsBinding; @@ -132,27 +132,27 @@ public class LocationFragment extends Fragment implements SwipeRefreshLayout.OnR }); private final FeedAdapterV2.FeedItemCallback feedItemCallback = new FeedAdapterV2.FeedItemCallback() { @Override - public void onPostClick(final FeedModel feedModel, final View profilePicView, final View mainPostImage) { + public void onPostClick(final Media feedModel, final View profilePicView, final View mainPostImage) { openPostDialog(feedModel, profilePicView, mainPostImage, -1); } @Override - public void onSliderClick(final FeedModel feedModel, final int position) { + public void onSliderClick(final Media feedModel, final int position) { openPostDialog(feedModel, null, null, position); } @Override - public void onCommentsClick(final FeedModel feedModel) { + public void onCommentsClick(final Media feedModel) { final NavDirections commentsAction = LocationFragmentDirections.actionGlobalCommentsViewerFragment( - feedModel.getShortCode(), - feedModel.getPostId(), - feedModel.getProfileModel().getId() + feedModel.getCode(), + feedModel.getPk(), + feedModel.getUser().getPk() ); NavHostFragment.findNavController(LocationFragment.this).navigate(commentsAction); } @Override - public void onDownloadClick(final FeedModel feedModel, final int childPosition) { + public void onDownloadClick(final Media feedModel, final int childPosition) { final Context context = getContext(); if (context == null) return; if (checkSelfPermission(context, WRITE_PERMISSION) == PermissionChecker.PERMISSION_GRANTED) { @@ -171,8 +171,8 @@ public class LocationFragment extends Fragment implements SwipeRefreshLayout.OnR } @Override - public void onLocationClick(final FeedModel feedModel) { - final NavDirections action = LocationFragmentDirections.actionGlobalLocationFragment(feedModel.getLocationId()); + public void onLocationClick(final Media feedModel) { + final NavDirections action = LocationFragmentDirections.actionGlobalLocationFragment(feedModel.getLocation().getPk()); NavHostFragment.findNavController(LocationFragment.this).navigate(action); } @@ -182,13 +182,13 @@ public class LocationFragment extends Fragment implements SwipeRefreshLayout.OnR } @Override - public void onNameClick(final FeedModel feedModel, final View profilePicView) { - navigateToProfile("@" + feedModel.getProfileModel().getUsername()); + public void onNameClick(final Media feedModel, final View profilePicView) { + navigateToProfile("@" + feedModel.getUser().getUsername()); } @Override - public void onProfilePicClick(final FeedModel feedModel, final View profilePicView) { - navigateToProfile("@" + feedModel.getProfileModel().getUsername()); + public void onProfilePicClick(final Media feedModel, final View profilePicView) { + navigateToProfile("@" + feedModel.getUser().getUsername()); } @Override @@ -201,14 +201,14 @@ public class LocationFragment extends Fragment implements SwipeRefreshLayout.OnR Utils.openEmailAddress(getContext(), emailId); } - private void openPostDialog(@NonNull final FeedModel feedModel, + private void openPostDialog(@NonNull final Media feedModel, final View profilePicView, final View mainPostImage, final int position) { if (opening) return; - if (TextUtils.isEmpty(feedModel.getProfileModel().getUsername())) { + if (TextUtils.isEmpty(feedModel.getUser().getUsername())) { opening = true; - new PostFetcher(feedModel.getShortCode(), newFeedModel -> { + new PostFetcher(feedModel.getCode(), newFeedModel -> { opening = false; if (newFeedModel == null) return; openPostDialog(newFeedModel, profilePicView, mainPostImage, position); @@ -244,7 +244,7 @@ public class LocationFragment extends Fragment implements SwipeRefreshLayout.OnR } @Override - public void onSelectionChange(final Set selectedFeedModels) { + public void onSelectionChange(final Set selectedFeedModels) { final String title = getString(R.string.number_selected, selectedFeedModels.size()); if (actionMode != null) { actionMode.setTitle(title); @@ -354,7 +354,7 @@ public class LocationFragment extends Fragment implements SwipeRefreshLayout.OnR private void init() { if (getArguments() == null) return; final String cookie = settingsHelper.getString(Constants.COOKIE); - isLoggedIn = !TextUtils.isEmpty(cookie) && CookieUtils.getUserIdFromCookie(cookie) != null; + isLoggedIn = !TextUtils.isEmpty(cookie) && CookieUtils.getUserIdFromCookie(cookie) > 0; final LocationFragmentArgs fragmentArgs = LocationFragmentArgs.fromBundle(getArguments()); locationId = fragmentArgs.getLocationId(); locationDetailsBinding.favChip.setVisibility(View.GONE); @@ -401,8 +401,10 @@ public class LocationFragment extends Fragment implements SwipeRefreshLayout.OnR locationDetailsBinding.mainLocationImage.setImageURI(locationModel.getSdProfilePic()); final String postCount = String.valueOf(locationModel.getPostCount()); final SpannableStringBuilder span = new SpannableStringBuilder(getResources().getQuantityString(R.plurals.main_posts_count_inline, - locationModel.getPostCount() > 2000000000L ? 2000000000 : locationModel.getPostCount().intValue(), - postCount)); + locationModel.getPostCount() > 2000000000L + ? 2000000000 + : locationModel.getPostCount().intValue(), + postCount)); span.setSpan(new RelativeSizeSpan(1.2f), 0, postCount.length(), 0); span.setSpan(new StyleSpan(Typeface.BOLD), 0, postCount.length(), 0); locationDetailsBinding.mainLocPostCount.setText(span); @@ -540,7 +542,7 @@ public class LocationFragment extends Fragment implements SwipeRefreshLayout.OnR private void fetchStories() { if (isLoggedIn) { storiesFetching = true; - storiesService.getUserStory(locationId, + storiesService.getUserStory(String.valueOf(locationId), null, true, false, diff --git a/app/src/main/java/awais/instagrabber/fragments/NotificationsViewerFragment.java b/app/src/main/java/awais/instagrabber/fragments/NotificationsViewerFragment.java index 34559f0e..27b43b79 100644 --- a/app/src/main/java/awais/instagrabber/fragments/NotificationsViewerFragment.java +++ b/app/src/main/java/awais/instagrabber/fragments/NotificationsViewerFragment.java @@ -18,8 +18,6 @@ import androidx.annotation.Nullable; import androidx.appcompat.app.AlertDialog; import androidx.core.app.NotificationManagerCompat; import androidx.fragment.app.Fragment; -import androidx.fragment.app.FragmentManager; -import androidx.fragment.app.FragmentTransaction; import androidx.lifecycle.ViewModelProvider; import androidx.navigation.NavDirections; import androidx.navigation.fragment.NavHostFragment; @@ -32,16 +30,14 @@ import awais.instagrabber.R; import awais.instagrabber.adapters.NotificationsAdapter; import awais.instagrabber.adapters.NotificationsAdapter.OnNotificationClickListener; import awais.instagrabber.asyncs.NotificationsFetcher; -import awais.instagrabber.asyncs.PostFetcher; import awais.instagrabber.databinding.FragmentNotificationsViewerBinding; -import awais.instagrabber.dialogs.ProfilePicDialogFragment; import awais.instagrabber.fragments.settings.MorePreferencesFragmentDirections; import awais.instagrabber.interfaces.FetchListener; import awais.instagrabber.interfaces.MentionClickListener; -import awais.instagrabber.models.FeedModel; import awais.instagrabber.models.NotificationModel; import awais.instagrabber.models.enums.NotificationType; -import awais.instagrabber.repositories.responses.FriendshipRepoChangeRootResponse; +import awais.instagrabber.repositories.responses.FriendshipChangeResponse; +import awais.instagrabber.repositories.responses.Media; import awais.instagrabber.utils.Constants; import awais.instagrabber.utils.CookieUtils; import awais.instagrabber.utils.TextUtils; @@ -63,8 +59,9 @@ public final class NotificationsViewerFragment extends Fragment implements Swipe private NotificationViewModel notificationViewModel; private FriendshipService friendshipService; private MediaService mediaService; - private NewsService newsService; - private String userId, csrfToken, type; + private long userId; + private String csrfToken; + private String type; private Context context; private final OnNotificationClickListener clickListener = new OnNotificationClickListener() { @@ -79,11 +76,10 @@ public final class NotificationsViewerFragment extends Fragment implements Swipe final NavDirections action = NotificationsViewerFragmentDirections.actionNotificationsViewerFragmentToStoryViewerFragment( -1, null, false, false, model.getPostId(), model.getUsername(), false, true); NavHostFragment.findNavController(NotificationsViewerFragment.this).navigate(action); - } - else { - mediaService.fetch(model.getPostId(), new ServiceCallback() { + } else { + mediaService.fetch(model.getPostId(), new ServiceCallback() { @Override - public void onSuccess(final FeedModel feedModel) { + public void onSuccess(final Media feedModel) { final PostViewV2Fragment fragment = PostViewV2Fragment .builder(feedModel) .build(); @@ -104,8 +100,7 @@ public final class NotificationsViewerFragment extends Fragment implements Swipe final String username = model.getUsername(); if (model.getType() == NotificationType.FOLLOW || model.getType() == NotificationType.AYML) { openProfile(username); - } - else { + } else { final SpannableString title = new SpannableString(username + (TextUtils.isEmpty(model.getText()) ? "" : (":\n" + model.getText()))); title.setSpan(new RelativeSizeSpan(1.23f), 0, username.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE); @@ -115,21 +110,18 @@ public final class NotificationsViewerFragment extends Fragment implements Swipe getString(R.string.open_profile), getString(R.string.view_story) }; - } - else if (model.getPostId() != null) { + } else if (model.getPostId() != null) { commentDialogList = new String[]{ getString(R.string.open_profile), getString(R.string.view_post) }; - } - else if (model.getType() == NotificationType.REQUEST) { + } else if (model.getType() == NotificationType.REQUEST) { commentDialogList = new String[]{ getString(R.string.open_profile), getString(R.string.request_approve), getString(R.string.request_reject) }; - } - else commentDialogList = null; // shouldn't happen + } else commentDialogList = null; // shouldn't happen final Context context = getContext(); if (context == null) return; final DialogInterface.OnClickListener profileDialogListener = (dialog, which) -> { @@ -139,9 +131,9 @@ public final class NotificationsViewerFragment extends Fragment implements Swipe break; case 1: if (model.getType() == NotificationType.REQUEST) { - friendshipService.approve(userId, model.getUserId(), csrfToken, new ServiceCallback() { + friendshipService.approve(userId, model.getUserId(), csrfToken, new ServiceCallback() { @Override - public void onSuccess(final FriendshipRepoChangeRootResponse result) { + public void onSuccess(final FriendshipChangeResponse result) { onRefresh(); Log.e(TAG, "approve: status was not ok!"); } @@ -152,10 +144,10 @@ public final class NotificationsViewerFragment extends Fragment implements Swipe } }); return; - } - else if (model.getType() == NotificationType.RESPONDED_STORY) { - final NavDirections action = NotificationsViewerFragmentDirections.actionNotificationsViewerFragmentToStoryViewerFragment( - -1, null, false, false, model.getPostId(), model.getUsername(), false, true); + } else if (model.getType() == NotificationType.RESPONDED_STORY) { + final NavDirections action = NotificationsViewerFragmentDirections + .actionNotificationsViewerFragmentToStoryViewerFragment( + -1, null, false, false, model.getPostId(), model.getUsername(), false, true); NavHostFragment.findNavController(NotificationsViewerFragment.this).navigate(action); return; } @@ -164,9 +156,9 @@ public final class NotificationsViewerFragment extends Fragment implements Swipe .setView(R.layout.dialog_opening_post) .create(); alertDialog.show(); - mediaService.fetch(model.getPostId(), new ServiceCallback() { + mediaService.fetch(model.getPostId(), new ServiceCallback() { @Override - public void onSuccess(final FeedModel feedModel) { + public void onSuccess(final Media feedModel) { final PostViewV2Fragment fragment = PostViewV2Fragment .builder(feedModel) .build(); @@ -181,9 +173,9 @@ public final class NotificationsViewerFragment extends Fragment implements Swipe }); break; case 2: - friendshipService.ignore(userId, model.getUserId(), csrfToken, new ServiceCallback() { + friendshipService.ignore(userId, model.getUserId(), csrfToken, new ServiceCallback() { @Override - public void onSuccess(final FriendshipRepoChangeRootResponse result) { + public void onSuccess(final FriendshipChangeResponse result) { onRefresh(); } @@ -283,7 +275,7 @@ public final class NotificationsViewerFragment extends Fragment implements Swipe }).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); break; case "ayml": - newsService = NewsService.getInstance(); + final NewsService newsService = NewsService.getInstance(); newsService.fetchSuggestions(csrfToken, new ServiceCallback>() { @Override public void onSuccess(final List notificationModels) { diff --git a/app/src/main/java/awais/instagrabber/fragments/PostViewV2Fragment.java b/app/src/main/java/awais/instagrabber/fragments/PostViewV2Fragment.java index 65350702..4cfcfacb 100644 --- a/app/src/main/java/awais/instagrabber/fragments/PostViewV2Fragment.java +++ b/app/src/main/java/awais/instagrabber/fragments/PostViewV2Fragment.java @@ -61,7 +61,7 @@ import com.google.android.material.snackbar.BaseTransientBottomBar; import com.google.android.material.snackbar.Snackbar; import java.io.Serializable; -import java.util.Date; +import java.util.List; import awais.instagrabber.R; import awais.instagrabber.activities.MainActivity; @@ -74,14 +74,17 @@ import awais.instagrabber.customviews.VideoPlayerCallbackAdapter; import awais.instagrabber.customviews.VideoPlayerViewHelper; import awais.instagrabber.customviews.drawee.AnimatedZoomableController; import awais.instagrabber.databinding.DialogPostViewBinding; -import awais.instagrabber.models.FeedModel; -import awais.instagrabber.models.PostChild; -import awais.instagrabber.models.ProfileModel; import awais.instagrabber.models.enums.MediaItemType; +import awais.instagrabber.repositories.responses.Caption; +import awais.instagrabber.repositories.responses.Location; +import awais.instagrabber.repositories.responses.Media; +import awais.instagrabber.repositories.responses.User; +import awais.instagrabber.repositories.responses.VideoVersion; import awais.instagrabber.utils.Constants; import awais.instagrabber.utils.CookieUtils; import awais.instagrabber.utils.DownloadUtils; import awais.instagrabber.utils.NumberUtils; +import awais.instagrabber.utils.ResponseBodyUtils; import awais.instagrabber.utils.TextUtils; import awais.instagrabber.utils.Utils; import awais.instagrabber.webservices.MediaService; @@ -100,10 +103,9 @@ public class PostViewV2Fragment extends SharedElementTransitionDialogFragment { private static final String ARG_SLIDER_POSITION = "position"; private static final int STORAGE_PERM_REQUEST_CODE = 8020; - private FeedModel feedModel; + private Media feedModel; private View sharedProfilePicElement; private View sharedMainPostElement; - private MainActivity fragmentActivity; private DialogPostViewBinding binding; private MediaService mediaService; private Context context; @@ -166,7 +168,7 @@ public class PostViewV2Fragment extends SharedElementTransitionDialogFragment { } public static class Builder { - private final FeedModel feedModel; + private final Media feedModel; private View profilePicElement; private View mainPostElement; private int position; @@ -190,12 +192,12 @@ public class PostViewV2Fragment extends SharedElementTransitionDialogFragment { return PostViewV2Fragment.newInstance(feedModel, profilePicElement, mainPostElement, position); } - public Builder(final FeedModel feedModel) { + public Builder(final Media feedModel) { this.feedModel = feedModel; } } - private static PostViewV2Fragment newInstance(final FeedModel feedModel, + private static PostViewV2Fragment newInstance(final Media feedModel, final View profilePicElement, final View mainPostElement, final int position) { @@ -209,7 +211,7 @@ public class PostViewV2Fragment extends SharedElementTransitionDialogFragment { return f; } - public static Builder builder(final FeedModel feedModel) { + public static Builder builder(final Media feedModel) { return new Builder(feedModel); } @@ -226,7 +228,7 @@ public class PostViewV2Fragment extends SharedElementTransitionDialogFragment { public void onCreate(@Nullable final Bundle savedInstanceState) { super.onCreate(savedInstanceState); setStyle(DialogFragment.STYLE_NO_FRAME, R.style.PostViewV2Style); - fragmentActivity = (MainActivity) getActivity(); + final MainActivity fragmentActivity = (MainActivity) getActivity(); mediaService = MediaService.getInstance(); final Bundle arguments = getArguments(); if (arguments == null) return; @@ -235,12 +237,12 @@ public class PostViewV2Fragment extends SharedElementTransitionDialogFragment { Log.e(TAG, "onCreate: feedModelSerializable is null"); return; } - if (!(feedModelSerializable instanceof FeedModel)) { + if (!(feedModelSerializable instanceof Media)) { return; } - feedModel = (FeedModel) feedModelSerializable; + feedModel = (Media) feedModelSerializable; if (feedModel == null) return; - if (feedModel.getItemType() == MediaItemType.MEDIA_TYPE_SLIDER) { + if (feedModel.getMediaType() == MediaItemType.MEDIA_TYPE_SLIDER) { sliderPosition = arguments.getInt(ARG_SLIDER_POSITION, 0); } } @@ -312,7 +314,7 @@ public class PostViewV2Fragment extends SharedElementTransitionDialogFragment { public void onDestroyView() { super.onDestroyView(); if (feedModel == null) return; - switch (feedModel.getItemType()) { + switch (feedModel.getMediaType()) { case MEDIA_TYPE_VIDEO: if (videoPlayerViewHelper != null) { videoPlayerViewHelper.releasePlayer(); @@ -330,7 +332,7 @@ public class PostViewV2Fragment extends SharedElementTransitionDialogFragment { public void onSaveInstanceState(@NonNull final Bundle outState) { super.onSaveInstanceState(outState); if (feedModel == null) return; - if (feedModel.getItemType() == MediaItemType.MEDIA_TYPE_SLIDER) { + if (feedModel.getMediaType() == MediaItemType.MEDIA_TYPE_SLIDER) { outState.putInt(ARG_SLIDER_POSITION, sliderPosition); } } @@ -420,7 +422,7 @@ public class PostViewV2Fragment extends SharedElementTransitionDialogFragment { private void init() { if (feedModel == null) return; - isLoggedIn = !TextUtils.isEmpty(COOKIE) && CookieUtils.getUserIdFromCookie(COOKIE) != null; + isLoggedIn = !TextUtils.isEmpty(COOKIE) && CookieUtils.getUserIdFromCookie(COOKIE) > 0; if (!wasPaused && (sharedProfilePicElement != null || sharedMainPostElement != null)) { binding.getRoot().getBackground().mutate().setAlpha(0); } @@ -441,14 +443,14 @@ public class PostViewV2Fragment extends SharedElementTransitionDialogFragment { private void setupComment() { binding.comment.setOnClickListener(v -> { - final ProfileModel profileModel = feedModel.getProfileModel(); + final User profileModel = feedModel.getUser(); if (profileModel == null) return; final NavController navController = getNavController(); if (navController == null) return; final Bundle bundle = new Bundle(); - bundle.putString("shortCode", feedModel.getShortCode()); - bundle.putString("postId", feedModel.getPostId()); - bundle.putString("postUserId", profileModel.getId()); + bundle.putString("shortCode", feedModel.getCode()); + bundle.putString("postId", feedModel.getPk()); + bundle.putLong("postUserId", profileModel.getPk()); navController.navigate(R.id.action_global_commentsViewerFragment, bundle); }); binding.comment.setOnLongClickListener(v -> { @@ -477,23 +479,23 @@ public class PostViewV2Fragment extends SharedElementTransitionDialogFragment { return; } if (mediaService == null) return; - setLikedResources(feedModel.getLike()); + setLikedResources(feedModel.hasLiked()); final ServiceCallback likeCallback = new ServiceCallback() { @Override public void onSuccess(final Boolean result) { binding.like.setEnabled(true); if (result) { - setLikedResources(!feedModel.getLike()); - final long currentLikesCount = feedModel.getLikesCount(); + setLikedResources(!feedModel.hasLiked()); + final long currentLikesCount = feedModel.getLikeCount(); final long updatedCount; - if (!feedModel.getLike()) { + if (!feedModel.hasLiked()) { updatedCount = currentLikesCount + 1; - feedModel.setLiked(true); + feedModel.setHasLiked(true); } else { updatedCount = currentLikesCount - 1; - feedModel.setLiked(false); + feedModel.setHasLiked(false); } - feedModel.setLikesCount(updatedCount); + feedModel.setLikeCount(updatedCount); setupCounts(); return; } @@ -509,21 +511,21 @@ public class PostViewV2Fragment extends SharedElementTransitionDialogFragment { private void unsuccessfulLike() { final int errorTextResId; - if (!feedModel.getLike()) { + if (!feedModel.hasLiked()) { Log.e(TAG, "like unsuccessful!"); errorTextResId = R.string.like_unsuccessful; } else { Log.e(TAG, "unlike unsuccessful!"); errorTextResId = R.string.unlike_unsuccessful; } - setLikedResources(feedModel.getLike()); + setLikedResources(feedModel.hasLiked()); final Snackbar snackbar = Snackbar.make(binding.getRoot(), errorTextResId, BaseTransientBottomBar.LENGTH_INDEFINITE); snackbar.setAction(R.string.ok, null); snackbar.show(); } }; binding.like.setOnClickListener(v -> { - final String userId = CookieUtils.getUserIdFromCookie(COOKIE); + final long userId = CookieUtils.getUserIdFromCookie(COOKIE); final String csrfToken = CookieUtils.getCsrfTokenFromCookie(COOKIE); v.setEnabled(false); // final int textRes; @@ -532,17 +534,17 @@ public class PostViewV2Fragment extends SharedElementTransitionDialogFragment { // } else { // textRes = R.string.unliking; // } - if (!feedModel.getLike()) { - mediaService.like(feedModel.getPostId(), userId, csrfToken, likeCallback); + if (!feedModel.hasLiked()) { + mediaService.like(feedModel.getPk(), userId, csrfToken, likeCallback); } else { - mediaService.unlike(feedModel.getPostId(), userId, csrfToken, likeCallback); + mediaService.unlike(feedModel.getPk(), userId, csrfToken, likeCallback); } }); binding.like.setOnLongClickListener(v -> { final NavController navController = getNavController(); if (navController != null && isLoggedIn) { final Bundle bundle = new Bundle(); - bundle.putString("postId", feedModel.getPostId()); + bundle.putString("postId", feedModel.getPk()); bundle.putBoolean("isComment", false); navController.navigate(R.id.action_global_likesViewerFragment, bundle); } else { @@ -576,14 +578,14 @@ public class PostViewV2Fragment extends SharedElementTransitionDialogFragment { return; } if (mediaService == null) return; - setSavedResources(feedModel.isSaved()); + setSavedResources(feedModel.hasViewerSaved()); final ServiceCallback saveCallback = new ServiceCallback() { @Override public void onSuccess(final Boolean result) { binding.save.setEnabled(true); if (result) { - setSavedResources(!feedModel.isSaved()); - feedModel.setSaved(!feedModel.isSaved()); + setSavedResources(!feedModel.hasViewerSaved()); + feedModel.setHasViewerSaved(!feedModel.hasViewerSaved()); return; } unsuccessfulSave(); @@ -591,14 +593,14 @@ public class PostViewV2Fragment extends SharedElementTransitionDialogFragment { private void unsuccessfulSave() { final int errorTextResId; - if (!feedModel.isSaved()) { + if (!feedModel.hasViewerSaved()) { Log.e(TAG, "save unsuccessful!"); errorTextResId = R.string.save_unsuccessful; } else { Log.e(TAG, "save remove unsuccessful!"); errorTextResId = R.string.save_remove_unsuccessful; } - setSavedResources(feedModel.isSaved()); + setSavedResources(feedModel.hasViewerSaved()); final Snackbar snackbar = Snackbar.make(binding.getRoot(), errorTextResId, BaseTransientBottomBar.LENGTH_INDEFINITE); snackbar.setAction(R.string.ok, null); snackbar.show(); @@ -612,7 +614,7 @@ public class PostViewV2Fragment extends SharedElementTransitionDialogFragment { } }; binding.save.setOnClickListener(v -> { - final String userId = CookieUtils.getUserIdFromCookie(COOKIE); + final long userId = CookieUtils.getUserIdFromCookie(COOKIE); final String csrfToken = CookieUtils.getCsrfTokenFromCookie(COOKIE); binding.save.setEnabled(false); // final int textRes; @@ -621,10 +623,10 @@ public class PostViewV2Fragment extends SharedElementTransitionDialogFragment { // } else { // textRes = R.string.removing; // } - if (!feedModel.isSaved()) { - mediaService.save(feedModel.getPostId(), userId, csrfToken, saveCallback); + if (!feedModel.hasViewerSaved()) { + mediaService.save(feedModel.getPk(), userId, csrfToken, saveCallback); } else { - mediaService.unsave(feedModel.getPostId(), userId, csrfToken, saveCallback); + mediaService.unsave(feedModel.getPk(), userId, csrfToken, saveCallback); } }); binding.save.setOnLongClickListener(v -> { @@ -655,12 +657,12 @@ public class PostViewV2Fragment extends SharedElementTransitionDialogFragment { if (!wasPaused && sharedProfilePicElement != null) { addSharedElement(sharedProfilePicElement, binding.profilePic); } - final ProfileModel profileModel = feedModel.getProfileModel(); + final User profileModel = feedModel.getUser(); if (profileModel == null) { binding.profilePic.setVisibility(View.GONE); return; } - final String uri = profileModel.getSdProfilePic(); + final String uri = profileModel.getProfilePicUrl(); final ImageRequest requestBuilder = ImageRequestBuilder.newBuilderWithSource(Uri.parse(uri)).build(); final DraweeController controller = Fresco .newDraweeControllerBuilder() @@ -685,7 +687,7 @@ public class PostViewV2Fragment extends SharedElementTransitionDialogFragment { } private void setupTitles() { - final ProfileModel profileModel = feedModel.getProfileModel(); + final User profileModel = feedModel.getUser(); if (profileModel == null) { binding.title.setVisibility(View.GONE); binding.righttitle.setVisibility(View.GONE); @@ -693,11 +695,12 @@ public class PostViewV2Fragment extends SharedElementTransitionDialogFragment { return; } binding.title.setText(profileModel.getUsername()); - binding.righttitle.setText(profileModel.getName()); + binding.righttitle.setText(profileModel.getFullName()); binding.isVerified.setVisibility(profileModel.isVerified() ? View.VISIBLE : View.GONE); binding.title.setOnClickListener(v -> navigateToProfile("@" + profileModel.getUsername())); binding.righttitle.setOnClickListener(v -> navigateToProfile("@" + profileModel.getUsername())); - final String locationName = feedModel.getLocationName(); + final Location location = feedModel.getLocation(); + final String locationName = location != null ? location.getName() : ""; if (!TextUtils.isEmpty(locationName)) { binding.subtitle.setText(locationName); binding.subtitle.setVisibility(View.VISIBLE); @@ -705,7 +708,7 @@ public class PostViewV2Fragment extends SharedElementTransitionDialogFragment { final NavController navController = getNavController(); if (navController == null) return; final Bundle bundle = new Bundle(); - bundle.putString("locationId", feedModel.getLocationId()); + bundle.putLong("locationId", location.getPk()); navController.navigate(R.id.action_global_locationFragment, bundle); }); return; @@ -714,15 +717,17 @@ public class PostViewV2Fragment extends SharedElementTransitionDialogFragment { } private void setupCaption() { - postCaption = feedModel.getPostCaption(); - binding.date.setText(Utils.datetimeParser.format(new Date(feedModel.getTimestamp() * 1000L))); - if (!feedModel.getProfileModel().getId().equals(CookieUtils.getUserIdFromCookie(COOKIE)) && TextUtils.isEmpty(postCaption)) { + final Caption caption = feedModel.getCaption(); + postCaption = caption != null ? caption.getText() : null; + binding.date.setText(feedModel.getDate()); + final long userId = CookieUtils.getUserIdFromCookie(COOKIE); + if (feedModel.getUser().getPk() != userId && TextUtils.isEmpty(postCaption)) { binding.caption.setVisibility(View.GONE); binding.translateTitle.setVisibility(View.GONE); binding.captionToggle.setVisibility(View.GONE); return; } - if (feedModel.getProfileModel().getId().equals(CookieUtils.getUserIdFromCookie(COOKIE))) { + if (feedModel.getUser().getPk() == userId) { binding.editCaption.setVisibility(View.VISIBLE); binding.editCaption.setOnClickListener(v -> { final EditText input = new EditText(context); @@ -733,8 +738,8 @@ public class PostViewV2Fragment extends SharedElementTransitionDialogFragment { .setPositiveButton(R.string.confirm, (d, w) -> { binding.editCaption.setVisibility(View.GONE); mediaService.editCaption( - feedModel.getPostId(), - CookieUtils.getUserIdFromCookie(COOKIE), + feedModel.getPk(), + userId, input.getText().toString(), CookieUtils.getCsrfTokenFromCookie(COOKIE), new ServiceCallback() { @@ -793,10 +798,10 @@ public class PostViewV2Fragment extends SharedElementTransitionDialogFragment { if (bottomSheetBehavior.getState() == BottomSheetBehavior.STATE_EXPANDED) return; bottomSheetBehavior.setState(BottomSheetBehavior.STATE_EXPANDED); }); - if (TextUtils.isEmpty(feedModel.getCaptionId())) + if (caption.getPk() <= 0) binding.translateTitle.setVisibility(View.GONE); else binding.translateTitle.setOnClickListener(v -> { - mediaService.translate(feedModel.getCaptionId(), "1", new ServiceCallback() { + mediaService.translate(String.valueOf(caption.getPk()), "1", new ServiceCallback() { @Override public void onSuccess(final String result) { if (TextUtils.isEmpty(result)) { @@ -854,14 +859,14 @@ public class PostViewV2Fragment extends SharedElementTransitionDialogFragment { return true; }); binding.share.setOnClickListener(v -> { - final ProfileModel profileModel = feedModel.getProfileModel(); + final User profileModel = feedModel.getUser(); if (profileModel == null) return; final boolean isPrivate = profileModel.isPrivate(); if (isPrivate) Toast.makeText(context, R.string.share_private_post, Toast.LENGTH_LONG).show(); Intent sharingIntent = new Intent(android.content.Intent.ACTION_SEND); sharingIntent.setType("text/plain"); - sharingIntent.putExtra(android.content.Intent.EXTRA_TEXT, "https://instagram.com/p/" + feedModel.getShortCode()); + sharingIntent.putExtra(android.content.Intent.EXTRA_TEXT, "https://instagram.com/p/" + feedModel.getCode()); startActivity(Intent.createChooser(sharingIntent, isPrivate ? getString(R.string.share_private_post) : getString(R.string.share_public_post))); }); @@ -869,17 +874,17 @@ public class PostViewV2Fragment extends SharedElementTransitionDialogFragment { private void setupCounts() { try { - final int commentsCount = (int) feedModel.getCommentsCount(); - final String commentsString = getResources().getQuantityString(R.plurals.comments_count, commentsCount, commentsCount); + final long commentsCount = (int) feedModel.getCommentCount(); + final String commentsString = getResources().getQuantityString(R.plurals.comments_count, (int) commentsCount, (int) commentsCount); binding.commentsCount.setText(commentsString); - final int likesCount = (int) feedModel.getLikesCount(); + final int likesCount = (int) feedModel.getLikeCount(); final String likesString = getResources().getQuantityString(R.plurals.likes_count, likesCount, likesCount); binding.likesCount.setText(likesString); } catch (IllegalStateException ignored) {} } private void setupPostTypeLayout() { - switch (feedModel.getItemType()) { + switch (feedModel.getMediaType()) { case MEDIA_TYPE_IMAGE: setupPostImage(); break; @@ -904,12 +909,12 @@ public class PostViewV2Fragment extends SharedElementTransitionDialogFragment { binding.postImage.getHierarchy().setActualImageScaleType(ScalingUtils.ScaleType.CENTER_CROP); addSharedElement(sharedMainPostElement, binding.postImage); } - final ImageRequest requestBuilder = ImageRequestBuilder.newBuilderWithSource(Uri.parse(feedModel.getDisplayUrl())) + final ImageRequest requestBuilder = ImageRequestBuilder.newBuilderWithSource(Uri.parse(ResponseBodyUtils.getImageUrl(feedModel))) .setLocalThumbnailPreviewsEnabled(true) .build(); final DraweeController controller = Fresco .newDraweeControllerBuilder() - .setLowResImageRequest(ImageRequest.fromUri(feedModel.getThumbnailUrl())) + .setLowResImageRequest(ImageRequest.fromUri(ResponseBodyUtils.getThumbUrl(feedModel))) .setImageRequest(requestBuilder) .setControllerListener(new BaseControllerListener() { @Override @@ -951,13 +956,13 @@ public class PostViewV2Fragment extends SharedElementTransitionDialogFragment { if (!wasPaused && sharedMainPostElement != null) { addSharedElement(sharedMainPostElement, binding.sliderParent); } - final boolean hasVideo = feedModel.getSliderItems() + final boolean hasVideo = feedModel.getCarouselMedia() .stream() - .anyMatch(postChild -> postChild.getItemType() == MediaItemType.MEDIA_TYPE_VIDEO); + .anyMatch(postChild -> postChild.getMediaType() == MediaItemType.MEDIA_TYPE_VIDEO); if (hasVideo) { final View child = binding.sliderParent.getChildAt(0); if (child instanceof RecyclerView) { - ((RecyclerView) child).setItemViewCacheSize(feedModel.getSliderItems().size()); + ((RecyclerView) child).setItemViewCacheSize(feedModel.getCarouselMedia().size()); ((RecyclerView) child).addRecyclerListener(holder -> { if (holder instanceof SliderVideoViewHolder) { ((SliderVideoViewHolder) holder).releasePlayer(); @@ -990,7 +995,7 @@ public class PostViewV2Fragment extends SharedElementTransitionDialogFragment { } }); binding.sliderParent.setAdapter(sliderItemsAdapter); - if (sliderPosition >= 0 && sliderPosition < feedModel.getSliderItems().size()) { + if (sliderPosition >= 0 && sliderPosition < feedModel.getCarouselMedia().size()) { binding.sliderParent.setCurrentItem(sliderPosition); } binding.sliderParent.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() { @@ -1012,12 +1017,12 @@ public class PostViewV2Fragment extends SharedElementTransitionDialogFragment { @Override public void onPageSelected(final int position) { - final int size = feedModel.getSliderItems().size(); + final int size = feedModel.getCarouselMedia().size(); if (position < 0 || position >= size) return; sliderPosition = position; final String text = (position + 1) + "/" + size; binding.mediaCounter.setText(text); - final PostChild postChild = feedModel.getSliderItems().get(position); + final Media postChild = feedModel.getCarouselMedia().get(position); final View view = binding.sliderParent.getChildAt(0); if (prevPosition != -1) { if (view instanceof RecyclerView) { @@ -1027,7 +1032,7 @@ public class PostViewV2Fragment extends SharedElementTransitionDialogFragment { } } } - if (postChild.getItemType() == MediaItemType.MEDIA_TYPE_VIDEO) { + if (postChild.getMediaType() == MediaItemType.MEDIA_TYPE_VIDEO) { if (view instanceof RecyclerView) { final RecyclerView.ViewHolder viewHolder = ((RecyclerView) view).findViewHolderForAdapterPosition(position); if (viewHolder instanceof SliderVideoViewHolder) { @@ -1047,9 +1052,9 @@ public class PostViewV2Fragment extends SharedElementTransitionDialogFragment { } } }); - final String text = "1/" + feedModel.getSliderItems().size(); + final String text = "1/" + feedModel.getCarouselMedia().size(); binding.mediaCounter.setText(text); - sliderItemsAdapter.submitList(feedModel.getSliderItems()); + sliderItemsAdapter.submitList(feedModel.getCarouselMedia()); } private void releaseAllSliderPlayers() { @@ -1078,8 +1083,8 @@ public class PostViewV2Fragment extends SharedElementTransitionDialogFragment { binding.videoPost.root.setVisibility(View.VISIBLE); final VerticalDragHelper thumbnailVerticalDragHelper = new VerticalDragHelper(binding.videoPost.thumbnailParent); final VerticalDragHelper playerVerticalDragHelper = new VerticalDragHelper(binding.videoPost.playerView); - thumbnailVerticalDragHelper.setOnVerticalDragListener(onVerticalDragListener); - playerVerticalDragHelper.setOnVerticalDragListener(onVerticalDragListener); + // thumbnailVerticalDragHelper.setOnVerticalDragListener(onVerticalDragListener); + // playerVerticalDragHelper.setOnVerticalDragListener(onVerticalDragListener); enablePlayerControls(true); binding.videoPost.thumbnailParent.setOnTouchListener((v, event) -> { final boolean onDragTouch = thumbnailVerticalDragHelper.onDragTouch(event); @@ -1108,7 +1113,8 @@ public class PostViewV2Fragment extends SharedElementTransitionDialogFragment { binding.playerControls.getRoot().setVisibility(View.VISIBLE); final ViewGroup.LayoutParams layoutParams = binding.videoPost.playerView.getLayoutParams(); final int requiredWidth = Utils.displayMetrics.widthPixels; - final int resultingHeight = NumberUtils.getResultingHeight(requiredWidth, feedModel.getImageHeight(), feedModel.getImageWidth()); + final int resultingHeight = NumberUtils + .getResultingHeight(requiredWidth, feedModel.getOriginalHeight(), feedModel.getOriginalWidth()); layoutParams.width = requiredWidth; layoutParams.height = resultingHeight; binding.videoPost.playerView.requestLayout(); @@ -1121,14 +1127,22 @@ public class PostViewV2Fragment extends SharedElementTransitionDialogFragment { } } }; - final float aspectRatio = (float) feedModel.getImageWidth() / feedModel.getImageHeight(); + final float aspectRatio = (float) feedModel.getOriginalWidth() / feedModel.getOriginalHeight(); + String videoUrl = null; + final List videoVersions = feedModel.getVideoVersions(); + if (videoVersions != null && !videoVersions.isEmpty()) { + final VideoVersion videoVersion = videoVersions.get(0); + if (videoVersion != null) { + videoUrl = videoVersion.getUrl(); + } + } videoPlayerViewHelper = new VideoPlayerViewHelper( binding.getRoot().getContext(), binding.videoPost, - feedModel.getDisplayUrl(), + videoUrl, vol, aspectRatio, - feedModel.getThumbnailUrl(), + ResponseBodyUtils.getThumbUrl(feedModel), true, binding.playerControls, videoPlayerCallback); @@ -1255,8 +1269,8 @@ public class PostViewV2Fragment extends SharedElementTransitionDialogFragment { } binding.profilePic.setVisibility(View.VISIBLE); binding.title.setVisibility(View.VISIBLE); - binding.isVerified.setVisibility(feedModel.getProfileModel() != null - ? feedModel.getProfileModel().isVerified() ? View.VISIBLE : View.GONE + binding.isVerified.setVisibility(feedModel.getUser() != null + ? feedModel.getUser().isVerified() ? View.VISIBLE : View.GONE : View.GONE); binding.righttitle.setVisibility(View.VISIBLE); binding.topBg.setVisibility(View.VISIBLE); @@ -1282,7 +1296,7 @@ public class PostViewV2Fragment extends SharedElementTransitionDialogFragment { if (wasControlsVisible) { showPlayerControls(); } - if (feedModel.getItemType() == MediaItemType.MEDIA_TYPE_SLIDER) { + if (feedModel.getMediaType() == MediaItemType.MEDIA_TYPE_SLIDER) { binding.mediaCounter.setVisibility(View.VISIBLE); } detailsVisible = true; diff --git a/app/src/main/java/awais/instagrabber/fragments/SavedViewerFragment.java b/app/src/main/java/awais/instagrabber/fragments/SavedViewerFragment.java index ed16f43c..3874256c 100644 --- a/app/src/main/java/awais/instagrabber/fragments/SavedViewerFragment.java +++ b/app/src/main/java/awais/instagrabber/fragments/SavedViewerFragment.java @@ -36,9 +36,9 @@ import awais.instagrabber.customviews.PrimaryActionModeCallback; import awais.instagrabber.databinding.FragmentSavedBinding; import awais.instagrabber.dialogs.PostsLayoutPreferencesDialogFragment; import awais.instagrabber.fragments.main.ProfileFragmentDirections; -import awais.instagrabber.models.FeedModel; import awais.instagrabber.models.PostsLayoutPreferences; import awais.instagrabber.models.enums.PostItemType; +import awais.instagrabber.repositories.responses.Media; import awais.instagrabber.utils.Constants; import awais.instagrabber.utils.CookieUtils; import awais.instagrabber.utils.DownloadUtils; @@ -54,14 +54,15 @@ public final class SavedViewerFragment extends Fragment implements SwipeRefreshL private static final int STORAGE_PERM_REQUEST_CODE_FOR_SELECTION = 8030; private FragmentSavedBinding binding; - private String username, cookie, profileId; + private String username; + private long profileId; private ActionMode actionMode; private SwipeRefreshLayout root; private AppCompatActivity fragmentActivity; private boolean isLoggedIn, shouldRefresh = true; private PostItemType type; - private Set selectedFeedModels; - private FeedModel downloadFeedModel; + private Set selectedFeedModels; + private Media downloadFeedModel; private int downloadChildPosition = -1; private PostsLayoutPreferences layoutPreferences; @@ -97,27 +98,27 @@ public final class SavedViewerFragment extends Fragment implements SwipeRefreshL }); private final FeedAdapterV2.FeedItemCallback feedItemCallback = new FeedAdapterV2.FeedItemCallback() { @Override - public void onPostClick(final FeedModel feedModel, final View profilePicView, final View mainPostImage) { + public void onPostClick(final Media feedModel, final View profilePicView, final View mainPostImage) { openPostDialog(feedModel, profilePicView, mainPostImage, -1); } @Override - public void onSliderClick(final FeedModel feedModel, final int position) { + public void onSliderClick(final Media feedModel, final int position) { openPostDialog(feedModel, null, null, position); } @Override - public void onCommentsClick(final FeedModel feedModel) { + public void onCommentsClick(final Media feedModel) { final NavDirections commentsAction = ProfileFragmentDirections.actionGlobalCommentsViewerFragment( - feedModel.getShortCode(), - feedModel.getPostId(), - feedModel.getProfileModel().getId() + feedModel.getCode(), + feedModel.getPk(), + feedModel.getUser().getPk() ); NavHostFragment.findNavController(SavedViewerFragment.this).navigate(commentsAction); } @Override - public void onDownloadClick(final FeedModel feedModel, final int childPosition) { + public void onDownloadClick(final Media feedModel, final int childPosition) { final Context context = getContext(); if (context == null) return; if (checkSelfPermission(context, WRITE_PERMISSION) == PermissionChecker.PERMISSION_GRANTED) { @@ -136,8 +137,8 @@ public final class SavedViewerFragment extends Fragment implements SwipeRefreshL } @Override - public void onLocationClick(final FeedModel feedModel) { - final NavDirections action = ProfileFragmentDirections.actionGlobalLocationFragment(feedModel.getLocationId()); + public void onLocationClick(final Media feedModel) { + final NavDirections action = ProfileFragmentDirections.actionGlobalLocationFragment(feedModel.getLocation().getPk()); NavHostFragment.findNavController(SavedViewerFragment.this).navigate(action); } @@ -147,13 +148,13 @@ public final class SavedViewerFragment extends Fragment implements SwipeRefreshL } @Override - public void onNameClick(final FeedModel feedModel, final View profilePicView) { - navigateToProfile("@" + feedModel.getProfileModel().getUsername()); + public void onNameClick(final Media feedModel, final View profilePicView) { + navigateToProfile("@" + feedModel.getUser().getUsername()); } @Override - public void onProfilePicClick(final FeedModel feedModel, final View profilePicView) { - navigateToProfile("@" + feedModel.getProfileModel().getUsername()); + public void onProfilePicClick(final Media feedModel, final View profilePicView) { + navigateToProfile("@" + feedModel.getUser().getUsername()); } @Override @@ -166,7 +167,7 @@ public final class SavedViewerFragment extends Fragment implements SwipeRefreshL Utils.openEmailAddress(getContext(), emailId); } - private void openPostDialog(final FeedModel feedModel, + private void openPostDialog(final Media feedModel, final View profilePicView, final View mainPostImage, final int position) { @@ -197,7 +198,7 @@ public final class SavedViewerFragment extends Fragment implements SwipeRefreshL } @Override - public void onSelectionChange(final Set selectedFeedModels) { + public void onSelectionChange(final Set selectedFeedModels) { final String title = getString(R.string.number_selected, selectedFeedModels.size()); if (actionMode != null) { actionMode.setTitle(title); @@ -227,8 +228,8 @@ public final class SavedViewerFragment extends Fragment implements SwipeRefreshL @Override public View onCreateView(@NonNull final LayoutInflater inflater, @Nullable final ViewGroup container, @Nullable final Bundle savedInstanceState) { - cookie = settingsHelper.getString(Constants.COOKIE); - isLoggedIn = !TextUtils.isEmpty(cookie) && CookieUtils.getUserIdFromCookie(cookie) != null; + final String cookie = settingsHelper.getString(Constants.COOKIE); + isLoggedIn = !TextUtils.isEmpty(cookie) && CookieUtils.getUserIdFromCookie(cookie) > 0; if (root != null) { shouldRefresh = false; return root; diff --git a/app/src/main/java/awais/instagrabber/fragments/StoryListViewerFragment.java b/app/src/main/java/awais/instagrabber/fragments/StoryListViewerFragment.java index dd851198..95dbdce0 100644 --- a/app/src/main/java/awais/instagrabber/fragments/StoryListViewerFragment.java +++ b/app/src/main/java/awais/instagrabber/fragments/StoryListViewerFragment.java @@ -29,21 +29,16 @@ import awais.instagrabber.adapters.HighlightStoriesListAdapter; import awais.instagrabber.adapters.HighlightStoriesListAdapter.OnHighlightStoryClickListener; import awais.instagrabber.customviews.helpers.RecyclerLazyLoader; import awais.instagrabber.databinding.FragmentStoryListViewerBinding; -import awais.instagrabber.fragments.main.FeedFragment; import awais.instagrabber.fragments.settings.MorePreferencesFragmentDirections; import awais.instagrabber.models.FeedStoryModel; import awais.instagrabber.models.HighlightModel; -import awais.instagrabber.utils.Constants; -import awais.instagrabber.utils.CookieUtils; import awais.instagrabber.utils.TextUtils; -import awais.instagrabber.viewmodels.FeedStoriesViewModel; import awais.instagrabber.viewmodels.ArchivesViewModel; +import awais.instagrabber.viewmodels.FeedStoriesViewModel; import awais.instagrabber.webservices.ServiceCallback; import awais.instagrabber.webservices.StoriesService; import awais.instagrabber.webservices.StoriesService.ArchiveFetchResponse; -import static awais.instagrabber.utils.Utils.settingsHelper; - public final class StoryListViewerFragment extends Fragment implements SwipeRefreshLayout.OnRefreshListener { private static final String TAG = "StoryListViewerFragment"; @@ -56,14 +51,14 @@ public final class StoryListViewerFragment extends Fragment implements SwipeRefr private StoriesService storiesService; private Context context; private String type, endCursor = null; - private RecyclerLazyLoader lazyLoader; private FeedStoriesListAdapter adapter; private final OnFeedStoryClickListener clickListener = new OnFeedStoryClickListener() { @Override public void onFeedStoryClick(final FeedStoryModel model, final int position) { if (model == null) return; - final NavDirections action = StoryListViewerFragmentDirections.actionStoryListFragmentToStoryViewerFragment(position, null, false, false, null, null, false, false); + final NavDirections action = StoryListViewerFragmentDirections + .actionStoryListFragmentToStoryViewerFragment(position, null, false, false, null, null, false, false); NavHostFragment.findNavController(StoryListViewerFragment.this).navigate(action); } @@ -105,8 +100,7 @@ public final class StoryListViewerFragment extends Fragment implements SwipeRefr try { final Context context = getContext(); Toast.makeText(context, t.getMessage(), Toast.LENGTH_SHORT).show(); - } - catch (Exception e) {} + } catch (Exception ignored) {} } }; @@ -142,7 +136,7 @@ public final class StoryListViewerFragment extends Fragment implements SwipeRefr public void onResume() { super.onResume(); final ActionBar actionBar = fragmentActivity.getSupportActionBar(); - if (actionBar != null) actionBar.setTitle(type == "feed" ? R.string.feed_stories : R.string.action_archive); + if (actionBar != null) actionBar.setTitle(type.equals("feed") ? R.string.feed_stories : R.string.action_archive); } @Override @@ -159,17 +153,16 @@ public final class StoryListViewerFragment extends Fragment implements SwipeRefr binding.swipeRefreshLayout.setOnRefreshListener(this); final LinearLayoutManager layoutManager = new LinearLayoutManager(context); final ActionBar actionBar = fragmentActivity.getSupportActionBar(); - if (type == "feed") { + if (type.equals("feed")) { if (actionBar != null) actionBar.setTitle(R.string.feed_stories); feedStoriesViewModel = new ViewModelProvider(fragmentActivity).get(FeedStoriesViewModel.class); adapter = new FeedStoriesListAdapter(clickListener); binding.rvStories.setLayoutManager(layoutManager); binding.rvStories.setAdapter(adapter); feedStoriesViewModel.getList().observe(getViewLifecycleOwner(), adapter::submitList); - } - else { + } else { if (actionBar != null) actionBar.setTitle(R.string.action_archive); - lazyLoader = new RecyclerLazyLoader(layoutManager, (page, totalItemsCount) -> { + final RecyclerLazyLoader lazyLoader = new RecyclerLazyLoader(layoutManager, (page, totalItemsCount) -> { if (!TextUtils.isEmpty(endCursor)) onRefresh(); endCursor = null; }); @@ -186,14 +179,12 @@ public final class StoryListViewerFragment extends Fragment implements SwipeRefr @Override public void onRefresh() { binding.swipeRefreshLayout.setRefreshing(true); - if (type == "feed" && firstRefresh) { + if (type.equals("feed") && firstRefresh) { binding.swipeRefreshLayout.setRefreshing(false); adapter.submitList(feedStoriesViewModel.getList().getValue()); firstRefresh = false; - } - else if (type == "feed") { - final String cookie = settingsHelper.getString(Constants.COOKIE); - storiesService.getFeedStories(CookieUtils.getCsrfTokenFromCookie(cookie), new ServiceCallback>() { + } else if (type.equals("feed")) { + storiesService.getFeedStories(new ServiceCallback>() { @Override public void onSuccess(final List result) { feedStoriesViewModel.getList().postValue(result); @@ -206,8 +197,7 @@ public final class StoryListViewerFragment extends Fragment implements SwipeRefr Toast.makeText(context, t.getMessage(), Toast.LENGTH_SHORT).show(); } }); - } - else if (type == "archive") { + } else if (type.equals("archive")) { storiesService.fetchArchive(endCursor, cb); } } diff --git a/app/src/main/java/awais/instagrabber/fragments/StoryViewerFragment.java b/app/src/main/java/awais/instagrabber/fragments/StoryViewerFragment.java index 946034a4..82ddb5f3 100644 --- a/app/src/main/java/awais/instagrabber/fragments/StoryViewerFragment.java +++ b/app/src/main/java/awais/instagrabber/fragments/StoryViewerFragment.java @@ -146,7 +146,7 @@ public class StoryViewerFragment extends Fragment { private final String cookie = settingsHelper.getString(Constants.COOKIE); private final String csrfToken = CookieUtils.getCsrfTokenFromCookie(cookie); - private final String userIdFromCookie = CookieUtils.getUserIdFromCookie(cookie); + private final long userIdFromCookie = CookieUtils.getUserIdFromCookie(cookie); private final String deviceId = settingsHelper.getString(Constants.DEVICE_UUID); @Override @@ -214,7 +214,7 @@ public class StoryViewerFragment extends Fragment { .broadcastStoryReply(BroadcastOptions.ThreadIdOrUserIds.of(threadId), input.getText().toString(), currentStory.getStoryMediaId(), - currentStory.getUserId()); + String.valueOf(currentStory.getUserId())); request.enqueue(new Callback() { @Override public void onResponse(@NonNull final Call call, @@ -682,8 +682,8 @@ public class StoryViewerFragment extends Fragment { currentStoryMediaId = model.getStoryMediaId(); currentStoryUsername = model.getProfileModel().getUsername(); } - } else if (!TextUtils.isEmpty(fragmentArgs.getProfileId()) && !TextUtils.isEmpty(fragmentArgs.getUsername())) { - currentStoryMediaId = fragmentArgs.getProfileId(); + } else if (fragmentArgs.getProfileId() > 0 && !TextUtils.isEmpty(fragmentArgs.getUsername())) { + currentStoryMediaId = String.valueOf(fragmentArgs.getProfileId()); currentStoryUsername = fragmentArgs.getUsername(); } isHashtag = fragmentArgs.getIsHashtag(); @@ -965,7 +965,8 @@ public class StoryViewerFragment extends Fragment { final NavDirections action = HashTagFragmentDirections.actionGlobalHashTagFragment(username.substring(1)); NavHostFragment.findNavController(this).navigate(action); } else { - final NavDirections action = ProfileFragmentDirections.actionGlobalLocationFragment(username.split(" \\(")[1].replace(")", "")); + final NavDirections action = ProfileFragmentDirections + .actionGlobalLocationFragment(Long.parseLong(username.split(" \\(")[1].replace(")", ""))); NavHostFragment.findNavController(this).navigate(action); } } diff --git a/app/src/main/java/awais/instagrabber/fragments/TopicPostsFragment.java b/app/src/main/java/awais/instagrabber/fragments/TopicPostsFragment.java index 81830779..011ed776 100644 --- a/app/src/main/java/awais/instagrabber/fragments/TopicPostsFragment.java +++ b/app/src/main/java/awais/instagrabber/fragments/TopicPostsFragment.java @@ -50,11 +50,12 @@ import awais.instagrabber.customviews.PrimaryActionModeCallback; import awais.instagrabber.databinding.FragmentTopicPostsBinding; import awais.instagrabber.dialogs.PostsLayoutPreferencesDialogFragment; import awais.instagrabber.fragments.main.DiscoverFragmentDirections; -import awais.instagrabber.models.FeedModel; import awais.instagrabber.models.PostsLayoutPreferences; import awais.instagrabber.models.TopicCluster; +import awais.instagrabber.repositories.responses.Media; import awais.instagrabber.utils.Constants; import awais.instagrabber.utils.DownloadUtils; +import awais.instagrabber.utils.ResponseBodyUtils; import awais.instagrabber.utils.Utils; import awais.instagrabber.webservices.DiscoverService; @@ -71,8 +72,8 @@ public class TopicPostsFragment extends Fragment implements SwipeRefreshLayout.O private boolean shouldRefresh = true; private TopicCluster topicCluster; private ActionMode actionMode; - private Set selectedFeedModels; - private FeedModel downloadFeedModel; + private Set selectedFeedModels; + private Media downloadFeedModel; private int downloadChildPosition = -1; private PostsLayoutPreferences layoutPreferences = Utils.getPostsLayoutPreferences(Constants.PREF_TOPIC_POSTS_LAYOUT); @@ -108,27 +109,27 @@ public class TopicPostsFragment extends Fragment implements SwipeRefreshLayout.O }); private final FeedAdapterV2.FeedItemCallback feedItemCallback = new FeedAdapterV2.FeedItemCallback() { @Override - public void onPostClick(final FeedModel feedModel, final View profilePicView, final View mainPostImage) { + public void onPostClick(final Media feedModel, final View profilePicView, final View mainPostImage) { openPostDialog(feedModel, profilePicView, mainPostImage, -1); } @Override - public void onSliderClick(final FeedModel feedModel, final int position) { + public void onSliderClick(final Media feedModel, final int position) { openPostDialog(feedModel, null, null, position); } @Override - public void onCommentsClick(final FeedModel feedModel) { + public void onCommentsClick(final Media feedModel) { final NavDirections commentsAction = DiscoverFragmentDirections.actionGlobalCommentsViewerFragment( - feedModel.getShortCode(), - feedModel.getPostId(), - feedModel.getProfileModel().getId() + feedModel.getCode(), + feedModel.getPk(), + feedModel.getUser().getPk() ); NavHostFragment.findNavController(TopicPostsFragment.this).navigate(commentsAction); } @Override - public void onDownloadClick(final FeedModel feedModel, final int childPosition) { + public void onDownloadClick(final Media feedModel, final int childPosition) { final Context context = getContext(); if (context == null) return; if (checkSelfPermission(context, WRITE_PERMISSION) == PermissionChecker.PERMISSION_GRANTED) { @@ -147,8 +148,8 @@ public class TopicPostsFragment extends Fragment implements SwipeRefreshLayout.O } @Override - public void onLocationClick(final FeedModel feedModel) { - final NavDirections action = DiscoverFragmentDirections.actionGlobalLocationFragment(feedModel.getLocationId()); + public void onLocationClick(final Media feedModel) { + final NavDirections action = DiscoverFragmentDirections.actionGlobalLocationFragment(feedModel.getLocation().getPk()); NavHostFragment.findNavController(TopicPostsFragment.this).navigate(action); } @@ -158,13 +159,13 @@ public class TopicPostsFragment extends Fragment implements SwipeRefreshLayout.O } @Override - public void onNameClick(final FeedModel feedModel, final View profilePicView) { - navigateToProfile("@" + feedModel.getProfileModel().getUsername()); + public void onNameClick(final Media feedModel, final View profilePicView) { + navigateToProfile("@" + feedModel.getUser().getUsername()); } @Override - public void onProfilePicClick(final FeedModel feedModel, final View profilePicView) { - navigateToProfile("@" + feedModel.getProfileModel().getUsername()); + public void onProfilePicClick(final Media feedModel, final View profilePicView) { + navigateToProfile("@" + feedModel.getUser().getUsername()); } @Override @@ -177,7 +178,7 @@ public class TopicPostsFragment extends Fragment implements SwipeRefreshLayout.O Utils.openEmailAddress(getContext(), emailId); } - private void openPostDialog(final FeedModel feedModel, + private void openPostDialog(final Media feedModel, final View profilePicView, final View mainPostImage, final int position) { @@ -208,7 +209,7 @@ public class TopicPostsFragment extends Fragment implements SwipeRefreshLayout.O } @Override - public void onSelectionChange(final Set selectedFeedModels) { + public void onSelectionChange(final Set selectedFeedModels) { final String title = getString(R.string.number_selected, selectedFeedModels.size()); if (actionMode != null) { actionMode.setTitle(title); @@ -370,7 +371,7 @@ public class TopicPostsFragment extends Fragment implements SwipeRefreshLayout.O } private void setupCover() { - final String coverUrl = topicCluster.getCoverMedia().getDisplayUrl(); + final String coverUrl = ResponseBodyUtils.getImageUrl(topicCluster.getCoverMedia()); final DraweeController controller = Fresco .newDraweeControllerBuilder() .setOldController(binding.cover.getController()) diff --git a/app/src/main/java/awais/instagrabber/fragments/UserSearchFragment.java b/app/src/main/java/awais/instagrabber/fragments/UserSearchFragment.java index 70e0a96d..68b2fe26 100644 --- a/app/src/main/java/awais/instagrabber/fragments/UserSearchFragment.java +++ b/app/src/main/java/awais/instagrabber/fragments/UserSearchFragment.java @@ -27,7 +27,7 @@ import awais.instagrabber.activities.MainActivity; import awais.instagrabber.adapters.UserSearchResultsAdapter; import awais.instagrabber.customviews.helpers.TextWatcherAdapter; import awais.instagrabber.databinding.FragmentUserSearchBinding; -import awais.instagrabber.repositories.responses.directmessages.DirectUser; +import awais.instagrabber.repositories.responses.User; import awais.instagrabber.utils.TextUtils; import awais.instagrabber.utils.Utils; import awais.instagrabber.utils.ViewUtils; @@ -193,7 +193,7 @@ public class UserSearchFragment extends Fragment { viewModel.showAction().observe(getViewLifecycleOwner(), showAction -> binding.done.setVisibility(showAction ? View.VISIBLE : View.GONE)); } - private void createUserChip(final DirectUser user) { + private void createUserChip(final User user) { final Context context = getContext(); if (context == null) return; final Chip chip = new Chip(context); @@ -210,7 +210,7 @@ public class UserSearchFragment extends Fragment { } private void removeSelectedUser(final View chip) { - final DirectUser user = (DirectUser) chip.getTag(); + final User user = (User) chip.getTag(); if (user == null) return; viewModel.setSelectedUser(user, false); resultsAdapter.setSelectedUser(user.getPk(), false); @@ -225,7 +225,7 @@ public class UserSearchFragment extends Fragment { for (int i = childCount - 1; i >= 0; i--) { final View child = binding.group.getChildAt(i); if (child == null) continue; - final DirectUser user = (DirectUser) child.getTag(); + final User user = (User) child.getTag(); if (user != null && user.getPk() == userId) { return child; } diff --git a/app/src/main/java/awais/instagrabber/fragments/directmessages/DirectMessageSettingsFragment.java b/app/src/main/java/awais/instagrabber/fragments/directmessages/DirectMessageSettingsFragment.java index 84574194..fdac2d8c 100644 --- a/app/src/main/java/awais/instagrabber/fragments/directmessages/DirectMessageSettingsFragment.java +++ b/app/src/main/java/awais/instagrabber/fragments/directmessages/DirectMessageSettingsFragment.java @@ -39,8 +39,8 @@ import awais.instagrabber.databinding.FragmentDirectMessagesSettingsBinding; import awais.instagrabber.dialogs.MultiOptionDialogFragment; import awais.instagrabber.dialogs.MultiOptionDialogFragment.Option; import awais.instagrabber.models.Resource; +import awais.instagrabber.repositories.responses.User; import awais.instagrabber.repositories.responses.directmessages.DirectThread; -import awais.instagrabber.repositories.responses.directmessages.DirectUser; import awais.instagrabber.viewmodels.DirectInboxViewModel; import awais.instagrabber.viewmodels.DirectSettingsViewModel; @@ -50,7 +50,7 @@ public class DirectMessageSettingsFragment extends Fragment { private FragmentDirectMessagesSettingsBinding binding; private DirectSettingsViewModel viewModel; private DirectUsersAdapter usersAdapter; - private List> options; + // private List> options; @Override public void onCreate(@Nullable final Bundle savedInstanceState) { @@ -171,14 +171,14 @@ public class DirectMessageSettingsFragment extends Fragment { final MutableLiveData resultLiveData = backStackEntry.getSavedStateHandle().getLiveData("result"); resultLiveData.observe(getViewLifecycleOwner(), result -> { LiveData> detailsChangeResourceLiveData = null; - if ((result instanceof DirectUser)) { + if ((result instanceof User)) { // Log.d(TAG, "result: " + result); - detailsChangeResourceLiveData = viewModel.addMembers(Collections.singleton((DirectUser) result)); + detailsChangeResourceLiveData = viewModel.addMembers(Collections.singleton((User) result)); } else if ((result instanceof Set)) { try { // Log.d(TAG, "result: " + result); //noinspection unchecked - detailsChangeResourceLiveData = viewModel.addMembers((Set) result); + detailsChangeResourceLiveData = viewModel.addMembers((Set) result); } catch (Exception e) { Log.e(TAG, "search users result: ", e); } @@ -221,12 +221,12 @@ public class DirectMessageSettingsFragment extends Fragment { final NavDestination currentDestination = navController.getCurrentDestination(); if (currentDestination == null) return; if (currentDestination.getId() != R.id.directMessagesSettingsFragment) return; - final Pair, List> users = viewModel.getUsers().getValue(); + final Pair, List> users = viewModel.getUsers().getValue(); final long[] currentUserIds; if (users != null && users.first != null) { - final List currentMembers = users.first; + final List currentMembers = users.first; currentUserIds = currentMembers.stream() - .mapToLong(DirectUser::getPk) + .mapToLong(User::getPk) .sorted() .toArray(); } else { @@ -246,7 +246,7 @@ public class DirectMessageSettingsFragment extends Fragment { final Context context = getContext(); if (context == null) return; binding.users.setLayoutManager(new LinearLayoutManager(context)); - final DirectUser inviter = viewModel.getThread().getInviter(); + final User inviter = viewModel.getThread().getInviter(); usersAdapter = new DirectUsersAdapter( inviter != null ? inviter.getPk() : -1, (position, user, selected) -> { diff --git a/app/src/main/java/awais/instagrabber/fragments/directmessages/DirectMessageThreadFragment.java b/app/src/main/java/awais/instagrabber/fragments/directmessages/DirectMessageThreadFragment.java index 7f07931c..07e1661a 100644 --- a/app/src/main/java/awais/instagrabber/fragments/directmessages/DirectMessageThreadFragment.java +++ b/app/src/main/java/awais/instagrabber/fragments/directmessages/DirectMessageThreadFragment.java @@ -68,8 +68,8 @@ import awais.instagrabber.customviews.helpers.RecyclerLazyLoaderAtEdge; import awais.instagrabber.customviews.helpers.TextWatcherAdapter; import awais.instagrabber.databinding.FragmentDirectMessagesThreadBinding; import awais.instagrabber.dialogs.MediaPickerBottomDialogFragment; -import awais.instagrabber.models.ProfileModel; import awais.instagrabber.models.Resource; +import awais.instagrabber.repositories.responses.User; import awais.instagrabber.repositories.responses.directmessages.DirectItem; import awais.instagrabber.repositories.responses.directmessages.DirectThread; import awais.instagrabber.utils.AppExecutors; @@ -584,7 +584,7 @@ public class DirectMessageThreadFragment extends Fragment { }); } - private void setupItemsAdapter(final ProfileModel currentUser, final DirectThread thread) { + private void setupItemsAdapter(final User currentUser, final DirectThread thread) { if (itemsAdapter != null) { if (itemsAdapter.getThread() == thread) return; itemsAdapter.setThread(thread); @@ -1105,11 +1105,11 @@ public class DirectMessageThreadFragment extends Fragment { animatorSet.start(); } - public static class ItemsAdapterDataMerger extends MediatorLiveData> { - private ProfileModel user; + public static class ItemsAdapterDataMerger extends MediatorLiveData> { + private User user; private DirectThread thread; - public ItemsAdapterDataMerger(final LiveData userLiveData, + public ItemsAdapterDataMerger(final LiveData userLiveData, final LiveData threadLiveData) { addSource(userLiveData, user -> { this.user = user; diff --git a/app/src/main/java/awais/instagrabber/fragments/main/DiscoverFragment.java b/app/src/main/java/awais/instagrabber/fragments/main/DiscoverFragment.java index adc6fe43..8ec7444a 100644 --- a/app/src/main/java/awais/instagrabber/fragments/main/DiscoverFragment.java +++ b/app/src/main/java/awais/instagrabber/fragments/main/DiscoverFragment.java @@ -19,6 +19,7 @@ import awais.instagrabber.activities.MainActivity; import awais.instagrabber.adapters.DiscoverTopicsAdapter; import awais.instagrabber.customviews.helpers.GridSpacingItemDecoration; import awais.instagrabber.databinding.FragmentDiscoverBinding; +import awais.instagrabber.repositories.responses.discover.TopicalExploreFeedResponse; import awais.instagrabber.utils.Utils; import awais.instagrabber.viewmodels.TopicClusterViewModel; import awais.instagrabber.webservices.DiscoverService; @@ -88,9 +89,9 @@ public class DiscoverFragment extends Fragment implements SwipeRefreshLayout.OnR private void fetchTopics() { binding.swipeRefreshLayout.setRefreshing(true); - discoverService.topicalExplore(new DiscoverService.TopicalExploreRequest(), new ServiceCallback() { + discoverService.topicalExplore(new DiscoverService.TopicalExploreRequest(), new ServiceCallback() { @Override - public void onSuccess(final DiscoverService.TopicalExploreResponse result) { + public void onSuccess(final TopicalExploreFeedResponse result) { if (result == null) return; topicClusterViewModel.getList().postValue(result.getClusters()); binding.swipeRefreshLayout.setRefreshing(false); diff --git a/app/src/main/java/awais/instagrabber/fragments/main/FeedFragment.java b/app/src/main/java/awais/instagrabber/fragments/main/FeedFragment.java index 832977c8..6460a69b 100644 --- a/app/src/main/java/awais/instagrabber/fragments/main/FeedFragment.java +++ b/app/src/main/java/awais/instagrabber/fragments/main/FeedFragment.java @@ -44,11 +44,10 @@ import awais.instagrabber.customviews.PrimaryActionModeCallback; import awais.instagrabber.databinding.FragmentFeedBinding; import awais.instagrabber.dialogs.PostsLayoutPreferencesDialogFragment; import awais.instagrabber.fragments.PostViewV2Fragment; -import awais.instagrabber.models.FeedModel; import awais.instagrabber.models.FeedStoryModel; import awais.instagrabber.models.PostsLayoutPreferences; +import awais.instagrabber.repositories.responses.Media; import awais.instagrabber.utils.Constants; -import awais.instagrabber.utils.CookieUtils; import awais.instagrabber.utils.DownloadUtils; import awais.instagrabber.utils.Utils; import awais.instagrabber.viewmodels.FeedStoriesViewModel; @@ -72,8 +71,8 @@ public class FeedFragment extends Fragment implements SwipeRefreshLayout.OnRefre private FeedStoriesViewModel feedStoriesViewModel; private boolean storiesFetching; private ActionMode actionMode; - private Set selectedFeedModels; - private FeedModel downloadFeedModel; + private Set selectedFeedModels; + private Media downloadFeedModel; private int downloadChildPosition = -1; private PostsLayoutPreferences layoutPreferences = Utils.getPostsLayoutPreferences(Constants.PREF_POSTS_LAYOUT); private RecyclerView storiesRecyclerView; @@ -81,27 +80,27 @@ public class FeedFragment extends Fragment implements SwipeRefreshLayout.OnRefre private final FeedAdapterV2.FeedItemCallback feedItemCallback = new FeedAdapterV2.FeedItemCallback() { @Override - public void onPostClick(final FeedModel feedModel, final View profilePicView, final View mainPostImage) { + public void onPostClick(final Media feedModel, final View profilePicView, final View mainPostImage) { openPostDialog(feedModel, profilePicView, mainPostImage, -1); } @Override - public void onSliderClick(final FeedModel feedModel, final int position) { + public void onSliderClick(final Media feedModel, final int position) { openPostDialog(feedModel, null, null, position); } @Override - public void onCommentsClick(final FeedModel feedModel) { + public void onCommentsClick(final Media feedModel) { final NavDirections commentsAction = FeedFragmentDirections.actionGlobalCommentsViewerFragment( - feedModel.getShortCode(), - feedModel.getPostId(), - feedModel.getProfileModel().getId() + feedModel.getCode(), + feedModel.getPk(), + feedModel.getUser().getPk() ); NavHostFragment.findNavController(FeedFragment.this).navigate(commentsAction); } @Override - public void onDownloadClick(final FeedModel feedModel, final int childPosition) { + public void onDownloadClick(final Media feedModel, final int childPosition) { final Context context = getContext(); if (context == null) return; if (checkSelfPermission(context, WRITE_PERMISSION) == PermissionChecker.PERMISSION_GRANTED) { @@ -120,8 +119,8 @@ public class FeedFragment extends Fragment implements SwipeRefreshLayout.OnRefre } @Override - public void onLocationClick(final FeedModel feedModel) { - final NavDirections action = FeedFragmentDirections.actionGlobalLocationFragment(feedModel.getLocationId()); + public void onLocationClick(final Media feedModel) { + final NavDirections action = FeedFragmentDirections.actionGlobalLocationFragment(feedModel.getLocation().getPk()); NavHostFragment.findNavController(FeedFragment.this).navigate(action); } @@ -131,13 +130,13 @@ public class FeedFragment extends Fragment implements SwipeRefreshLayout.OnRefre } @Override - public void onNameClick(final FeedModel feedModel, final View profilePicView) { - navigateToProfile("@" + feedModel.getProfileModel().getUsername()); + public void onNameClick(final Media feedModel, final View profilePicView) { + navigateToProfile("@" + feedModel.getUser().getUsername()); } @Override - public void onProfilePicClick(final FeedModel feedModel, final View profilePicView) { - navigateToProfile("@" + feedModel.getProfileModel().getUsername()); + public void onProfilePicClick(final Media feedModel, final View profilePicView) { + navigateToProfile("@" + feedModel.getUser().getUsername()); } @Override @@ -150,7 +149,7 @@ public class FeedFragment extends Fragment implements SwipeRefreshLayout.OnRefre Utils.openEmailAddress(getContext(), emailId); } - private void openPostDialog(final FeedModel feedModel, + private void openPostDialog(final Media feedModel, final View profilePicView, final View mainPostImage, final int position) { @@ -212,7 +211,7 @@ public class FeedFragment extends Fragment implements SwipeRefreshLayout.OnRefre } @Override - public void onSelectionChange(final Set selectedFeedModels) { + public void onSelectionChange(final Set selectedFeedModels) { final String title = getString(R.string.number_selected, selectedFeedModels.size()); if (actionMode != null) { actionMode.setTitle(title); @@ -285,8 +284,7 @@ public class FeedFragment extends Fragment implements SwipeRefreshLayout.OnRefre if (item.getItemId() == R.id.storyList) { final NavDirections action = FeedFragmentDirections.actionGlobalStoryListViewerFragment("feed"); NavHostFragment.findNavController(FeedFragment.this).navigate(action); - } - else if (item.getItemId() == R.id.layout) { + } else if (item.getItemId() == R.id.layout) { showPostsLayoutPreferences(); return true; } @@ -354,18 +352,19 @@ public class FeedFragment extends Fragment implements SwipeRefreshLayout.OnRefre if (storyListMenu != null) storyListMenu.setVisible(false); feedStoriesViewModel = new ViewModelProvider(fragmentActivity).get(FeedStoriesViewModel.class); final FeedStoriesAdapter feedStoriesAdapter = new FeedStoriesAdapter( - new FeedStoriesAdapter.OnFeedStoryClickListener() { - @Override - public void onFeedStoryClick(FeedStoryModel model, int position) { - final NavDirections action = FeedFragmentDirections.actionFeedFragmentToStoryViewerFragment(position, null, false, false, null, null, false, false); - NavHostFragment.findNavController(FeedFragment.this).navigate(action); - } + new FeedStoriesAdapter.OnFeedStoryClickListener() { + @Override + public void onFeedStoryClick(FeedStoryModel model, int position) { + final NavDirections action = FeedFragmentDirections + .actionFeedFragmentToStoryViewerFragment(position, null, false, false, null, null, false, false); + NavHostFragment.findNavController(FeedFragment.this).navigate(action); + } - @Override - public void onFeedStoryLongClick(FeedStoryModel model, int position) { - navigateToProfile("@" + model.getProfileModel().getUsername()); + @Override + public void onFeedStoryLongClick(FeedStoryModel model, int position) { + navigateToProfile("@" + model.getProfileModel().getUsername()); + } } - } ); final Context context = getContext(); if (context == null) return; @@ -386,7 +385,7 @@ public class FeedFragment extends Fragment implements SwipeRefreshLayout.OnRefre final String cookie = settingsHelper.getString(Constants.COOKIE); storiesFetching = true; updateSwipeRefreshState(); - storiesService.getFeedStories(CookieUtils.getCsrfTokenFromCookie(cookie), new ServiceCallback>() { + storiesService.getFeedStories(new ServiceCallback>() { @Override public void onSuccess(final List result) { feedStoriesViewModel.getList().postValue(result); diff --git a/app/src/main/java/awais/instagrabber/fragments/main/ProfileFragment.java b/app/src/main/java/awais/instagrabber/fragments/main/ProfileFragment.java index d5ab821d..feb6d127 100644 --- a/app/src/main/java/awais/instagrabber/fragments/main/ProfileFragment.java +++ b/app/src/main/java/awais/instagrabber/fragments/main/ProfileFragment.java @@ -28,6 +28,7 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.appcompat.app.ActionBar; import androidx.appcompat.app.AlertDialog; +import androidx.appcompat.content.res.AppCompatResources; import androidx.coordinatorlayout.widget.CoordinatorLayout; import androidx.core.content.PermissionChecker; import androidx.fragment.app.Fragment; @@ -48,6 +49,7 @@ import com.google.common.collect.ImmutableList; import java.util.Collections; import java.util.Date; import java.util.List; +import java.util.Objects; import java.util.Set; import awais.instagrabber.R; @@ -73,15 +75,16 @@ import awais.instagrabber.dialogs.PostsLayoutPreferencesDialogFragment; import awais.instagrabber.dialogs.ProfilePicDialogFragment; import awais.instagrabber.fragments.PostViewV2Fragment; import awais.instagrabber.interfaces.FetchListener; -import awais.instagrabber.models.FeedModel; import awais.instagrabber.models.HighlightModel; import awais.instagrabber.models.PostsLayoutPreferences; -import awais.instagrabber.models.ProfileModel; import awais.instagrabber.models.StoryModel; import awais.instagrabber.models.enums.FavoriteType; import awais.instagrabber.models.enums.PostItemType; -import awais.instagrabber.repositories.responses.FriendshipRepoChangeRootResponse; -import awais.instagrabber.repositories.responses.FriendshipRepoRestrictRootResponse; +import awais.instagrabber.repositories.responses.FriendshipChangeResponse; +import awais.instagrabber.repositories.responses.FriendshipRestrictResponse; +import awais.instagrabber.repositories.responses.FriendshipStatus; +import awais.instagrabber.repositories.responses.Media; +import awais.instagrabber.repositories.responses.User; import awais.instagrabber.utils.Constants; import awais.instagrabber.utils.CookieUtils; import awais.instagrabber.utils.DownloadUtils; @@ -109,7 +112,7 @@ public class ProfileFragment extends Fragment implements SwipeRefreshLayout.OnRe private boolean isLoggedIn; private String cookie; private String username; - private ProfileModel profileModel; + private User profileModel; private ActionMode actionMode; private Handler usernameSettingHandler; private FriendshipService friendshipService; @@ -123,8 +126,8 @@ public class ProfileFragment extends Fragment implements SwipeRefreshLayout.OnRe private MenuItem restrictMenuItem; private boolean highlightsFetching; private boolean postsSetupDone = false; - private Set selectedFeedModels; - private FeedModel downloadFeedModel; + private Set selectedFeedModels; + private Media downloadFeedModel; private int downloadChildPosition = -1; private PostsLayoutPreferences layoutPreferences = Utils.getPostsLayoutPreferences(Constants.PREF_PROFILE_POSTS_LAYOUT); @@ -170,27 +173,27 @@ public class ProfileFragment extends Fragment implements SwipeRefreshLayout.OnRe }); private final FeedAdapterV2.FeedItemCallback feedItemCallback = new FeedAdapterV2.FeedItemCallback() { @Override - public void onPostClick(final FeedModel feedModel, final View profilePicView, final View mainPostImage) { + public void onPostClick(final Media feedModel, final View profilePicView, final View mainPostImage) { openPostDialog(feedModel, profilePicView, mainPostImage, -1); } @Override - public void onSliderClick(final FeedModel feedModel, final int position) { + public void onSliderClick(final Media feedModel, final int position) { openPostDialog(feedModel, null, null, position); } @Override - public void onCommentsClick(final FeedModel feedModel) { + public void onCommentsClick(final Media feedModel) { final NavDirections commentsAction = FeedFragmentDirections.actionGlobalCommentsViewerFragment( - feedModel.getShortCode(), - feedModel.getPostId(), - feedModel.getProfileModel().getId() + feedModel.getCode(), + feedModel.getPk(), + feedModel.getUser().getPk() ); NavHostFragment.findNavController(ProfileFragment.this).navigate(commentsAction); } @Override - public void onDownloadClick(final FeedModel feedModel, final int childPosition) { + public void onDownloadClick(final Media feedModel, final int childPosition) { final Context context = getContext(); if (context == null) return; if (checkSelfPermission(context, WRITE_PERMISSION) == PermissionChecker.PERMISSION_GRANTED) { @@ -209,8 +212,8 @@ public class ProfileFragment extends Fragment implements SwipeRefreshLayout.OnRe } @Override - public void onLocationClick(final FeedModel feedModel) { - final NavDirections action = FeedFragmentDirections.actionGlobalLocationFragment(feedModel.getLocationId()); + public void onLocationClick(final Media feedModel) { + final NavDirections action = FeedFragmentDirections.actionGlobalLocationFragment(feedModel.getLocation().getPk()); NavHostFragment.findNavController(ProfileFragment.this).navigate(action); } @@ -220,13 +223,13 @@ public class ProfileFragment extends Fragment implements SwipeRefreshLayout.OnRe } @Override - public void onNameClick(final FeedModel feedModel, final View profilePicView) { - navigateToProfile("@" + feedModel.getProfileModel().getUsername()); + public void onNameClick(final Media feedModel, final View profilePicView) { + navigateToProfile("@" + feedModel.getUser().getUsername()); } @Override - public void onProfilePicClick(final FeedModel feedModel, final View profilePicView) { - navigateToProfile("@" + feedModel.getProfileModel().getUsername()); + public void onProfilePicClick(final Media feedModel, final View profilePicView) { + navigateToProfile("@" + feedModel.getUser().getUsername()); } @Override @@ -239,7 +242,7 @@ public class ProfileFragment extends Fragment implements SwipeRefreshLayout.OnRe Utils.openEmailAddress(getContext(), emailId); } - private void openPostDialog(final FeedModel feedModel, + private void openPostDialog(final Media feedModel, final View profilePicView, final View mainPostImage, final int position) { @@ -270,7 +273,7 @@ public class ProfileFragment extends Fragment implements SwipeRefreshLayout.OnRe } @Override - public void onSelectionChange(final Set selectedFeedModels) { + public void onSelectionChange(final Set selectedFeedModels) { final String title = getString(R.string.number_selected, selectedFeedModels.size()); if (actionMode != null) { actionMode.setTitle(title); @@ -311,7 +314,7 @@ public class ProfileFragment extends Fragment implements SwipeRefreshLayout.OnRe final ViewGroup container, final Bundle savedInstanceState) { cookie = settingsHelper.getString(Constants.COOKIE); - isLoggedIn = !TextUtils.isEmpty(cookie) && CookieUtils.getUserIdFromCookie(cookie) != null; + isLoggedIn = !TextUtils.isEmpty(cookie) && CookieUtils.getUserIdFromCookie(cookie) > 0; if (root != null) { if (getArguments() != null) { final ProfileFragmentArgs fragmentArgs = ProfileFragmentArgs.fromBundle(getArguments()); @@ -373,14 +376,14 @@ public class ProfileFragment extends Fragment implements SwipeRefreshLayout.OnRe } if (item.getItemId() == R.id.restrict) { if (!isLoggedIn) return false; - final String action = profileModel.isRestricted() ? "Unrestrict" : "Restrict"; + final String action = profileModel.getFriendshipStatus().isRestricted() ? "Unrestrict" : "Restrict"; friendshipService.toggleRestrict( - profileModel.getId(), - !profileModel.isRestricted(), + profileModel.getPk(), + !profileModel.getFriendshipStatus().isRestricted(), CookieUtils.getCsrfTokenFromCookie(cookie), - new ServiceCallback() { + new ServiceCallback() { @Override - public void onSuccess(final FriendshipRepoRestrictRootResponse result) { + public void onSuccess(final FriendshipRestrictResponse result) { Log.d(TAG, action + " success: " + result); fetchProfileDetails(); } @@ -393,16 +396,16 @@ public class ProfileFragment extends Fragment implements SwipeRefreshLayout.OnRe return true; } if (item.getItemId() == R.id.block) { - final String userIdFromCookie = CookieUtils.getUserIdFromCookie(cookie); + final long userIdFromCookie = CookieUtils.getUserIdFromCookie(cookie); if (!isLoggedIn) return false; - if (profileModel.isBlocked()) { + if (profileModel.getFriendshipStatus().isBlocking()) { friendshipService.unblock( userIdFromCookie, - profileModel.getId(), + profileModel.getPk(), CookieUtils.getCsrfTokenFromCookie(cookie), - new ServiceCallback() { + new ServiceCallback() { @Override - public void onSuccess(final FriendshipRepoChangeRootResponse result) { + public void onSuccess(final FriendshipChangeResponse result) { Log.d(TAG, "Unblock success: " + result); fetchProfileDetails(); } @@ -416,11 +419,11 @@ public class ProfileFragment extends Fragment implements SwipeRefreshLayout.OnRe } friendshipService.block( userIdFromCookie, - profileModel.getId(), + profileModel.getPk(), CookieUtils.getCsrfTokenFromCookie(cookie), - new ServiceCallback() { + new ServiceCallback() { @Override - public void onSuccess(final FriendshipRepoChangeRootResponse result) { + public void onSuccess(final FriendshipChangeResponse result) { Log.d(TAG, "Block success: " + result); fetchProfileDetails(); } @@ -504,8 +507,8 @@ public class ProfileFragment extends Fragment implements SwipeRefreshLayout.OnRe } private void fetchUsername() { - final String uid = CookieUtils.getUserIdFromCookie(cookie); - if (TextUtils.isEmpty(username) && uid != null) { + final long uid = CookieUtils.getUserIdFromCookie(cookie); + if (TextUtils.isEmpty(username) && uid > 0) { final FetchListener fetchListener = username -> { if (TextUtils.isEmpty(username)) return; this.username = username; @@ -569,8 +572,8 @@ public class ProfileFragment extends Fragment implements SwipeRefreshLayout.OnRe binding.postsRecyclerView.refresh(); } profileDetailsBinding.isVerified.setVisibility(profileModel.isVerified() ? View.VISIBLE : View.GONE); - final String profileId = profileModel.getId(); - final String myId = CookieUtils.getUserIdFromCookie(cookie); + final long profileId = profileModel.getPk(); + final long myId = CookieUtils.getUserIdFromCookie(cookie); if (isLoggedIn) { fetchStoryAndHighlights(profileId); } @@ -586,8 +589,8 @@ public class ProfileFragment extends Fragment implements SwipeRefreshLayout.OnRe result.getId(), profileModel.getUsername(), FavoriteType.USER, - profileModel.getName(), - profileModel.getSdProfilePic(), + profileModel.getFullName(), + profileModel.getProfilePicUrl(), result.getDateAdded() ), new RepositoryCallback() { @Override @@ -627,8 +630,8 @@ public class ProfileFragment extends Fragment implements SwipeRefreshLayout.OnRe 0, profileModel.getUsername(), FavoriteType.USER, - profileModel.getName(), - profileModel.getSdProfilePic(), + profileModel.getFullName(), + profileModel.getProfilePicUrl(), new Date() ), new RepositoryCallback() { @Override @@ -643,17 +646,19 @@ public class ProfileFragment extends Fragment implements SwipeRefreshLayout.OnRe }); } })); - profileDetailsBinding.mainProfileImage.setImageURI(profileModel.getHdProfilePic()); + profileDetailsBinding.mainProfileImage.setImageURI(profileModel.getProfilePicUrl()); profileDetailsBinding.mainProfileImage.setVisibility(View.VISIBLE); - final Long followersCount = profileModel.getFollowersCount(); - final Long followingCount = profileModel.getFollowingCount(); + final long followersCount = profileModel.getFollowerCount(); + final long followingCount = profileModel.getFollowingCount(); - final String postCount = String.valueOf(profileModel.getPostCount()); + final String postCount = String.valueOf(profileModel.getMediaCount()); SpannableStringBuilder span = new SpannableStringBuilder(getResources().getQuantityString(R.plurals.main_posts_count_inline, - profileModel.getPostCount() > 2000000000L ? 2000000000 : profileModel.getPostCount().intValue(), - postCount)); + profileModel.getMediaCount() > 2000000000L + ? 2000000000 + : (int) profileModel.getMediaCount(), + postCount)); span.setSpan(new RelativeSizeSpan(1.2f), 0, postCount.length(), 0); span.setSpan(new StyleSpan(Typeface.BOLD), 0, postCount.length(), 0); profileDetailsBinding.mainPostCount.setText(span); @@ -662,8 +667,8 @@ public class ProfileFragment extends Fragment implements SwipeRefreshLayout.OnRe final String followersCountStr = String.valueOf(followersCount); final int followersCountStrLen = followersCountStr.length(); span = new SpannableStringBuilder(getResources().getQuantityString(R.plurals.main_posts_followers, - followersCount > 2000000000L ? 2000000000 : followersCount.intValue(), - followersCountStr)); + followersCount > 2000000000L ? 2000000000 : (int) followersCount, + followersCountStr)); span.setSpan(new RelativeSizeSpan(1.2f), 0, followersCountStrLen, 0); span.setSpan(new StyleSpan(Typeface.BOLD), 0, followersCountStrLen, 0); profileDetailsBinding.mainFollowers.setText(span); @@ -678,8 +683,8 @@ public class ProfileFragment extends Fragment implements SwipeRefreshLayout.OnRe profileDetailsBinding.mainFollowing.setText(span); profileDetailsBinding.mainFollowing.setVisibility(View.VISIBLE); - profileDetailsBinding.mainFullName.setText(TextUtils.isEmpty(profileModel.getName()) ? profileModel.getUsername() - : profileModel.getName()); + profileDetailsBinding.mainFullName.setText(TextUtils.isEmpty(profileModel.getFullName()) ? profileModel.getUsername() + : profileModel.getFullName()); final String biography = profileModel.getBiography(); if (!TextUtils.isEmpty(biography)) { @@ -713,13 +718,13 @@ public class ProfileFragment extends Fragment implements SwipeRefreshLayout.OnRe }; } new AlertDialog.Builder(context) - .setItems(commentDialogList, (d,w) -> { + .setItems(commentDialogList, (d, w) -> { switch (w) { case 0: Utils.copyText(context, biography); break; case 1: - mediaService.translate(profileModel.getId(), "3", new ServiceCallback() { + mediaService.translate(String.valueOf(profileModel.getPk()), "3", new ServiceCallback() { @Override public void onSuccess(final String result) { if (TextUtils.isEmpty(result)) { @@ -750,7 +755,7 @@ public class ProfileFragment extends Fragment implements SwipeRefreshLayout.OnRe return true; }); } - final String url = profileModel.getUrl(); + final String url = profileModel.getExternalUrl(); if (TextUtils.isEmpty(url)) { profileDetailsBinding.mainUrl.setVisibility(View.GONE); } else { @@ -762,7 +767,7 @@ public class ProfileFragment extends Fragment implements SwipeRefreshLayout.OnRe return true; }); } - if (!profileModel.isReallyPrivate()) { + if (!isReallyPrivate()) { if (isLoggedIn) { profileDetailsBinding.mainFollowing.setClickable(true); profileDetailsBinding.mainFollowers.setClickable(true); @@ -791,10 +796,10 @@ public class ProfileFragment extends Fragment implements SwipeRefreshLayout.OnRe } } - private void setupButtons(final String profileId, final String myId) { - profileDetailsBinding.btnTagged.setVisibility(profileModel.isReallyPrivate() ? View.GONE : View.VISIBLE); + private void setupButtons(final long profileId, final long myId) { + profileDetailsBinding.btnTagged.setVisibility(isReallyPrivate() ? View.GONE : View.VISIBLE); if (isLoggedIn) { - if (profileId.equals(myId)) { + if (Objects.equals(profileId, myId)) { profileDetailsBinding.btnTagged.setVisibility(View.VISIBLE); profileDetailsBinding.btnSaved.setVisibility(View.VISIBLE); profileDetailsBinding.btnLiked.setVisibility(View.VISIBLE); @@ -806,25 +811,25 @@ public class ProfileFragment extends Fragment implements SwipeRefreshLayout.OnRe profileDetailsBinding.btnLiked.setVisibility(View.GONE); profileDetailsBinding.btnDM.setVisibility(View.VISIBLE); // maybe there is a judgment mechanism? profileDetailsBinding.btnFollow.setVisibility(View.VISIBLE); - if (profileModel.isFollowing() || profileModel.isFollower()) { + final Context context = getContext(); + if (context == null) return; + if (profileModel.getFriendshipStatus().isFollowing() || profileModel.getFriendshipStatus().isFollowedBy()) { profileDetailsBinding.mainStatus.setVisibility(View.VISIBLE); - if (!profileModel.isFollowing()) { - profileDetailsBinding.mainStatus.setChipBackgroundColor(getResources().getColorStateList(R.color.blue_800)); + if (!profileModel.getFriendshipStatus().isFollowing()) { + profileDetailsBinding.mainStatus.setChipBackgroundColor(AppCompatResources.getColorStateList(context, R.color.blue_800)); profileDetailsBinding.mainStatus.setText(R.string.status_follower); - } - else if (!profileModel.isFollower()) { - profileDetailsBinding.mainStatus.setChipBackgroundColor(getResources().getColorStateList(R.color.deep_orange_800)); + } else if (!profileModel.getFriendshipStatus().isFollowedBy()) { + profileDetailsBinding.mainStatus.setChipBackgroundColor(AppCompatResources.getColorStateList(context, R.color.deep_orange_800)); profileDetailsBinding.mainStatus.setText(R.string.status_following); - } - else { - profileDetailsBinding.mainStatus.setChipBackgroundColor(getResources().getColorStateList(R.color.green_800)); + } else { + profileDetailsBinding.mainStatus.setChipBackgroundColor(AppCompatResources.getColorStateList(context, R.color.green_800)); profileDetailsBinding.mainStatus.setText(R.string.status_mutual); } } - if (profileModel.isFollowing()) { + if (profileModel.getFriendshipStatus().isFollowing()) { profileDetailsBinding.btnFollow.setText(R.string.unfollow); profileDetailsBinding.btnFollow.setIconResource(R.drawable.ic_outline_person_add_disabled_24); - } else if (profileModel.isRequested()) { + } else if (profileModel.getFriendshipStatus().isOutgoingRequest()) { profileDetailsBinding.btnFollow.setText(R.string.cancel); profileDetailsBinding.btnFollow.setIconResource(R.drawable.ic_outline_person_add_disabled_24); } else { @@ -833,7 +838,7 @@ public class ProfileFragment extends Fragment implements SwipeRefreshLayout.OnRe } if (restrictMenuItem != null) { restrictMenuItem.setVisible(true); - if (profileModel.isRestricted()) { + if (profileModel.getFriendshipStatus().isRestricted()) { restrictMenuItem.setTitle(R.string.unrestrict); } else { restrictMenuItem.setTitle(R.string.restrict); @@ -841,7 +846,7 @@ public class ProfileFragment extends Fragment implements SwipeRefreshLayout.OnRe } if (blockMenuItem != null) { blockMenuItem.setVisible(true); - if (profileModel.isBlocked()) { + if (profileModel.getFriendshipStatus().isBlocking()) { blockMenuItem.setTitle(R.string.unblock); } else { blockMenuItem.setTitle(R.string.block); @@ -849,9 +854,9 @@ public class ProfileFragment extends Fragment implements SwipeRefreshLayout.OnRe } return; } - if (!profileModel.isReallyPrivate() && restrictMenuItem != null) { + if (!isReallyPrivate() && restrictMenuItem != null) { restrictMenuItem.setVisible(true); - if (profileModel.isRestricted()) { + if (profileModel.getFriendshipStatus().isRestricted()) { restrictMenuItem.setTitle(R.string.unrestrict); } else { restrictMenuItem.setTitle(R.string.restrict); @@ -859,8 +864,8 @@ public class ProfileFragment extends Fragment implements SwipeRefreshLayout.OnRe } } - private void fetchStoryAndHighlights(final String profileId) { - storiesService.getUserStory(profileId, + private void fetchStoryAndHighlights(final long profileId) { + storiesService.getUserStory(String.valueOf(profileId), profileModel.getUsername(), false, false, @@ -880,61 +885,59 @@ public class ProfileFragment extends Fragment implements SwipeRefreshLayout.OnRe } }); storiesService.fetchHighlights(profileId, - new ServiceCallback>() { - @Override - public void onSuccess(final List result) { - highlightsFetching = false; - if (result != null) { - profileDetailsBinding.highlightsList.setVisibility(View.VISIBLE); - highlightsViewModel.getList().postValue(result); - } - else profileDetailsBinding.highlightsList.setVisibility(View.GONE); - } + new ServiceCallback>() { + @Override + public void onSuccess(final List result) { + highlightsFetching = false; + if (result != null) { + profileDetailsBinding.highlightsList.setVisibility(View.VISIBLE); + highlightsViewModel.getList().postValue(result); + } else profileDetailsBinding.highlightsList.setVisibility(View.GONE); + } - @Override - public void onFailure(final Throwable t) { - profileDetailsBinding.highlightsList.setVisibility(View.GONE); - Log.e(TAG, "Error", t); - } - }); + @Override + public void onFailure(final Throwable t) { + profileDetailsBinding.highlightsList.setVisibility(View.GONE); + Log.e(TAG, "Error", t); + } + }); } private void setupCommonListeners() { final Context context = getContext(); - final String userIdFromCookie = CookieUtils.getUserIdFromCookie(cookie); + final long userIdFromCookie = CookieUtils.getUserIdFromCookie(cookie); profileDetailsBinding.btnFollow.setOnClickListener(v -> { - if (profileModel.isFollowing() && profileModel.isPrivate()) { + if (profileModel.getFriendshipStatus().isFollowing() && profileModel.isPrivate()) { new AlertDialog.Builder(context) .setTitle(R.string.priv_acc) .setMessage(R.string.priv_acc_confirm) .setPositiveButton(R.string.confirm, (d, w) -> - friendshipService.unfollow( - userIdFromCookie, - profileModel.getId(), - CookieUtils.getCsrfTokenFromCookie(cookie), - new ServiceCallback() { - @Override - public void onSuccess(final FriendshipRepoChangeRootResponse result) { - // Log.d(TAG, "Unfollow success: " + result); - onRefresh(); - } + friendshipService.unfollow( + userIdFromCookie, + profileModel.getPk(), + CookieUtils.getCsrfTokenFromCookie(cookie), + new ServiceCallback() { + @Override + public void onSuccess(final FriendshipChangeResponse result) { + // Log.d(TAG, "Unfollow success: " + result); + onRefresh(); + } - @Override - public void onFailure(final Throwable t) { - Log.e(TAG, "Error unfollowing", t); - } - })) + @Override + public void onFailure(final Throwable t) { + Log.e(TAG, "Error unfollowing", t); + } + })) .setNegativeButton(R.string.cancel, null) .show(); - } - else if (profileModel.isFollowing() || profileModel.isRequested()) { + } else if (profileModel.getFriendshipStatus().isFollowing() || profileModel.getFriendshipStatus().isOutgoingRequest()) { friendshipService.unfollow( userIdFromCookie, - profileModel.getId(), + profileModel.getPk(), CookieUtils.getCsrfTokenFromCookie(cookie), - new ServiceCallback() { + new ServiceCallback() { @Override - public void onSuccess(final FriendshipRepoChangeRootResponse result) { + public void onSuccess(final FriendshipChangeResponse result) { // Log.d(TAG, "Unfollow success: " + result); onRefresh(); } @@ -947,11 +950,11 @@ public class ProfileFragment extends Fragment implements SwipeRefreshLayout.OnRe } else { friendshipService.follow( userIdFromCookie, - profileModel.getId(), + profileModel.getPk(), CookieUtils.getCsrfTokenFromCookie(cookie), - new ServiceCallback() { + new ServiceCallback() { @Override - public void onSuccess(final FriendshipRepoChangeRootResponse result) { + public void onSuccess(final FriendshipChangeResponse result) { // Log.d(TAG, "Follow success: " + result); onRefresh(); } @@ -965,25 +968,25 @@ public class ProfileFragment extends Fragment implements SwipeRefreshLayout.OnRe }); profileDetailsBinding.btnSaved.setOnClickListener(v -> { final NavDirections action = ProfileFragmentDirections.actionProfileFragmentToSavedViewerFragment(profileModel.getUsername(), - profileModel.getId(), + profileModel.getPk(), PostItemType.SAVED); NavHostFragment.findNavController(this).navigate(action); }); profileDetailsBinding.btnLiked.setOnClickListener(v -> { final NavDirections action = ProfileFragmentDirections.actionProfileFragmentToSavedViewerFragment(profileModel.getUsername(), - profileModel.getId(), + profileModel.getPk(), PostItemType.LIKED); NavHostFragment.findNavController(this).navigate(action); }); profileDetailsBinding.btnTagged.setOnClickListener(v -> { final NavDirections action = ProfileFragmentDirections.actionProfileFragmentToSavedViewerFragment(profileModel.getUsername(), - profileModel.getId(), + profileModel.getPk(), PostItemType.TAGGED); NavHostFragment.findNavController(this).navigate(action); }); profileDetailsBinding.btnDM.setOnClickListener(v -> { profileDetailsBinding.btnDM.setEnabled(false); - new CreateThreadAction(cookie, profileModel.getId(), threadId -> { + new CreateThreadAction(cookie, profileModel.getPk(), threadId -> { if (isAdded()) { final NavDirections action = ProfileFragmentDirections .actionProfileFragmentToDMThreadFragment(threadId, profileModel.getUsername()); @@ -1008,7 +1011,7 @@ public class ProfileFragment extends Fragment implements SwipeRefreshLayout.OnRe if (which == 1) { // show stories final NavDirections action = ProfileFragmentDirections - .actionProfileFragmentToStoryViewerFragment(-1, null, false, false, profileModel.getId(), username, false, false); + .actionProfileFragmentToStoryViewerFragment(-1, null, false, false, profileModel.getPk(), username, false, false); NavHostFragment.findNavController(this).navigate(action); return; } @@ -1033,7 +1036,7 @@ public class ProfileFragment extends Fragment implements SwipeRefreshLayout.OnRe private void showProfilePicDialog() { if (profileModel != null) { final FragmentManager fragmentManager = getParentFragmentManager(); - final ProfilePicDialogFragment fragment = new ProfilePicDialogFragment(profileModel.getId(), username, profileModel.getHdProfilePic()); + final ProfilePicDialogFragment fragment = new ProfilePicDialogFragment(profileModel.getPk(), username, profileModel.getProfilePicUrl()); final FragmentTransaction ft = fragmentManager.beginTransaction(); ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN) .add(fragment, "profilePicDialog") @@ -1069,7 +1072,7 @@ public class ProfileFragment extends Fragment implements SwipeRefreshLayout.OnRe highlightsViewModel = new ViewModelProvider(fragmentActivity).get(HighlightsViewModel.class); highlightsAdapter = new HighlightsAdapter((model, position) -> { final NavDirections action = ProfileFragmentDirections - .actionProfileFragmentToStoryViewerFragment(position, model.getTitle(), false, false, null, null, false, false); + .actionProfileFragmentToStoryViewerFragment(position, model.getTitle(), false, false, 0, null, false, false); NavHostFragment.findNavController(this).navigate(action); }); final Context context = getContext(); @@ -1104,4 +1107,10 @@ public class ProfileFragment extends Fragment implements SwipeRefreshLayout.OnRe }); fragment.show(getChildFragmentManager(), "posts_layout_preferences"); } + + private boolean isReallyPrivate() { + final long myId = CookieUtils.getUserIdFromCookie(cookie); + final FriendshipStatus friendshipStatus = profileModel.getFriendshipStatus(); + return !friendshipStatus.isFollowedBy() && (profileModel.getPk() != myId) && profileModel.isPrivate(); + } } diff --git a/app/src/main/java/awais/instagrabber/fragments/settings/MorePreferencesFragment.java b/app/src/main/java/awais/instagrabber/fragments/settings/MorePreferencesFragment.java index d111e54c..ad4d401b 100644 --- a/app/src/main/java/awais/instagrabber/fragments/settings/MorePreferencesFragment.java +++ b/app/src/main/java/awais/instagrabber/fragments/settings/MorePreferencesFragment.java @@ -32,7 +32,7 @@ import awais.instagrabber.db.entities.Account; import awais.instagrabber.db.repositories.AccountRepository; import awais.instagrabber.db.repositories.RepositoryCallback; import awais.instagrabber.dialogs.AccountSwitcherDialogFragment; -import awais.instagrabber.repositories.responses.UserInfo; +import awais.instagrabber.repositories.responses.User; import awais.instagrabber.utils.Constants; import awais.instagrabber.utils.CookieUtils; import awais.instagrabber.utils.FlavorTown; @@ -54,7 +54,7 @@ public class MorePreferencesFragment extends BasePreferencesFragment { @Override void setupPreferenceScreen(final PreferenceScreen screen) { final String cookie = settingsHelper.getString(Constants.COOKIE); - final boolean isLoggedIn = !TextUtils.isEmpty(cookie) && CookieUtils.getUserIdFromCookie(cookie) != null; + final boolean isLoggedIn = !TextUtils.isEmpty(cookie) && CookieUtils.getUserIdFromCookie(cookie) > 0; // screen.addPreference(new MoreHeaderPreference(getContext())); final Context context = getContext(); if (context == null) return; @@ -198,11 +198,11 @@ public class MorePreferencesFragment extends BasePreferencesFragment { // Toast.makeText(getContext(), R.string.login_success_loading_cookies, Toast.LENGTH_SHORT).show(); // adds cookies to database for quick access - final String uid = CookieUtils.getUserIdFromCookie(cookie); + final long uid = CookieUtils.getUserIdFromCookie(cookie); final UserService userService = UserService.getInstance(); - userService.getUserInfo(uid, new ServiceCallback() { + userService.getUserInfo(uid, new ServiceCallback() { @Override - public void onSuccess(final UserInfo result) { + public void onSuccess(final User result) { // Log.d(TAG, "adding userInfo: " + result); if (result != null) { accountRepository.insertOrUpdateAccount( @@ -321,8 +321,8 @@ public class MorePreferencesFragment extends BasePreferencesFragment { final View root = holder.itemView; if (onClickListener != null) root.setOnClickListener(onClickListener); final PrefAccountSwitcherBinding binding = PrefAccountSwitcherBinding.bind(root); - final String uid = CookieUtils.getUserIdFromCookie(cookie); - if (uid == null) return; + final long uid = CookieUtils.getUserIdFromCookie(cookie); + if (uid <= 0) return; accountRepository.getAccount(uid, new RepositoryCallback() { @Override public void onSuccess(final Account account) { diff --git a/app/src/main/java/awais/instagrabber/fragments/settings/SettingsPreferencesFragment.java b/app/src/main/java/awais/instagrabber/fragments/settings/SettingsPreferencesFragment.java index 64c49ed9..d5378739 100644 --- a/app/src/main/java/awais/instagrabber/fragments/settings/SettingsPreferencesFragment.java +++ b/app/src/main/java/awais/instagrabber/fragments/settings/SettingsPreferencesFragment.java @@ -40,7 +40,7 @@ public class SettingsPreferencesFragment extends BasePreferencesFragment { @Override void setupPreferenceScreen(final PreferenceScreen screen) { final String cookie = settingsHelper.getString(Constants.COOKIE); - isLoggedIn = !TextUtils.isEmpty(cookie) && CookieUtils.getUserIdFromCookie(cookie) != null; + isLoggedIn = !TextUtils.isEmpty(cookie) && CookieUtils.getUserIdFromCookie(cookie) > 0; final Context context = getContext(); if (context == null) return; final PreferenceCategory generalCategory = new PreferenceCategory(context); @@ -84,12 +84,12 @@ public class SettingsPreferencesFragment extends BasePreferencesFragment { loggedInUsersPreferenceCategory.addPreference(getMarkDMSeenPreference()); loggedInUsersPreferenceCategory.addPreference(getEnableActivityNotificationsPreference()); } -// else { -// final PreferenceCategory anonUsersPreferenceCategory = new PreferenceCategory(context); -// screen.addPreference(anonUsersPreferenceCategory); -// anonUsersPreferenceCategory.setIconSpaceReserved(false); -// anonUsersPreferenceCategory.setTitle(R.string.anonymous_settings); -// } + // else { + // final PreferenceCategory anonUsersPreferenceCategory = new PreferenceCategory(context); + // screen.addPreference(anonUsersPreferenceCategory); + // anonUsersPreferenceCategory.setIconSpaceReserved(false); + // anonUsersPreferenceCategory.setTitle(R.string.anonymous_settings); + // } } private Preference getLanguagePreference() { diff --git a/app/src/main/java/awais/instagrabber/interfaces/ItemGetter.java b/app/src/main/java/awais/instagrabber/interfaces/ItemGetter.java deleted file mode 100755 index 20534cbf..00000000 --- a/app/src/main/java/awais/instagrabber/interfaces/ItemGetter.java +++ /dev/null @@ -1,11 +0,0 @@ -package awais.instagrabber.interfaces; - -import java.io.Serializable; -import java.util.List; - -import awais.instagrabber.models.BasePostModel; -import awais.instagrabber.models.enums.PostItemType; - -public interface ItemGetter extends Serializable { - List get(final PostItemType postItemType); -} \ No newline at end of file diff --git a/app/src/main/java/awais/instagrabber/interfaces/MentionClickListener.java b/app/src/main/java/awais/instagrabber/interfaces/MentionClickListener.java index 09560dfc..c3b7c8b7 100755 --- a/app/src/main/java/awais/instagrabber/interfaces/MentionClickListener.java +++ b/app/src/main/java/awais/instagrabber/interfaces/MentionClickListener.java @@ -2,6 +2,7 @@ package awais.instagrabber.interfaces; import awais.instagrabber.customviews.RamboTextView; +@Deprecated public interface MentionClickListener { void onClick(final RamboTextView view, final String text, diff --git a/app/src/main/java/awais/instagrabber/models/BasePostModel.java b/app/src/main/java/awais/instagrabber/models/BasePostModel.java deleted file mode 100755 index 4f8486d3..00000000 --- a/app/src/main/java/awais/instagrabber/models/BasePostModel.java +++ /dev/null @@ -1,98 +0,0 @@ -package awais.instagrabber.models; - -import androidx.annotation.NonNull; -import androidx.core.util.ObjectsCompat; - -import java.io.Serializable; -import java.util.Date; - -import awais.instagrabber.adapters.MultiSelectListAdapter.Selectable; -import awais.instagrabber.models.enums.MediaItemType; -import awais.instagrabber.utils.Utils; - -public abstract class BasePostModel implements Serializable, Selectable { - protected String postId, displayUrl, shortCode, captionId; - protected CharSequence postCaption; - protected MediaItemType itemType; - protected boolean isSelected, isDownloaded; - protected long timestamp; - boolean liked, saved; - - public boolean getLike() { - return liked; - } - - public boolean isSaved() { - return saved; - } - - public MediaItemType getItemType() { - return itemType; - } - - public final String getPostId() { - return postId; - } - - public final String getDisplayUrl() { - return displayUrl; - } - - public final CharSequence getPostCaption() { - return postCaption; - } - - public final String getCaptionId() { - return captionId; - } - - public final String getShortCode() { - return shortCode; - } - - public final long getTimestamp() { - return timestamp; - } - - public boolean isSelected() { - return isSelected; - } - - public boolean isDownloaded() { - return isDownloaded; - } - - public void setItemType(final MediaItemType itemType) { - this.itemType = itemType; - } - - public void setPostId(final String postId) { - this.postId = postId; - } - - public void setSelected(final boolean selected) { - this.isSelected = selected; - } - - public void setDownloaded(final boolean downloaded) { - isDownloaded = downloaded; - } - - @NonNull - public final String getPostDate() { - return Utils.datetimeParser.format(new Date(timestamp * 1000L)); - } - - @Override - public boolean equals(final Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - final BasePostModel that = (BasePostModel) o; - return ObjectsCompat.equals(postId, that.postId) && ObjectsCompat.equals(shortCode, that.shortCode); - } - - @Override - public int hashCode() { - return ObjectsCompat.hash(postId, shortCode); - } -} \ No newline at end of file diff --git a/app/src/main/java/awais/instagrabber/models/CommentModel.java b/app/src/main/java/awais/instagrabber/models/CommentModel.java index c66f6916..3331cf87 100755 --- a/app/src/main/java/awais/instagrabber/models/CommentModel.java +++ b/app/src/main/java/awais/instagrabber/models/CommentModel.java @@ -5,10 +5,11 @@ import androidx.annotation.NonNull; import java.util.Date; import java.util.List; +import awais.instagrabber.repositories.responses.User; import awais.instagrabber.utils.Utils; public class CommentModel { - private final ProfileModel profileModel; + private final User profileModel; private final String id; private final String text; private long likes; @@ -22,7 +23,7 @@ public class CommentModel { final long timestamp, final long likes, final boolean liked, - final ProfileModel profileModel) { + final User profileModel) { this.id = id; this.text = text; this.likes = likes; @@ -57,7 +58,7 @@ public class CommentModel { this.liked = liked; } - public ProfileModel getProfileModel() { + public User getProfileModel() { return profileModel; } diff --git a/app/src/main/java/awais/instagrabber/models/DiscoverItemModel.java b/app/src/main/java/awais/instagrabber/models/DiscoverItemModel.java deleted file mode 100755 index 925763b8..00000000 --- a/app/src/main/java/awais/instagrabber/models/DiscoverItemModel.java +++ /dev/null @@ -1,29 +0,0 @@ -package awais.instagrabber.models; - -import awais.instagrabber.models.enums.MediaItemType; - -public final class DiscoverItemModel extends BasePostModel { - private boolean moreAvailable; - private String nextMaxId; - - public DiscoverItemModel(final MediaItemType mediaType, final String postId, final String shortCode, final String thumbnail) { - this.postId = postId; - this.itemType = mediaType; - this.shortCode = shortCode; - this.displayUrl = thumbnail; - } - - - public void setMore(final boolean moreAvailable, final String nextMaxId) { - this.moreAvailable = moreAvailable; - this.nextMaxId = nextMaxId; - } - - public boolean hasMore() { - return moreAvailable; - } - - public String getNextMaxId() { - return nextMaxId; - } -} \ No newline at end of file diff --git a/app/src/main/java/awais/instagrabber/models/DiscoverTopicModel.java b/app/src/main/java/awais/instagrabber/models/DiscoverTopicModel.java deleted file mode 100755 index 4cc33b17..00000000 --- a/app/src/main/java/awais/instagrabber/models/DiscoverTopicModel.java +++ /dev/null @@ -1,26 +0,0 @@ -package awais.instagrabber.models; - -import java.io.Serializable; - -public final class DiscoverTopicModel implements Serializable { - private final String[] id, name; - private final String rankToken; - - public DiscoverTopicModel(final String[] id, final String[] name, final String rankToken) { - this.id = id; - this.name = name; - this.rankToken = rankToken; - } - - public String[] getIds() { - return id; - } - - public String[] getNames() { - return name; - } - - public String getToken() { - return rankToken; - } -} \ No newline at end of file diff --git a/app/src/main/java/awais/instagrabber/models/FeedModel.java b/app/src/main/java/awais/instagrabber/models/FeedModel.java deleted file mode 100755 index f4e51664..00000000 --- a/app/src/main/java/awais/instagrabber/models/FeedModel.java +++ /dev/null @@ -1,234 +0,0 @@ -package awais.instagrabber.models; - -import java.util.List; - -import awais.instagrabber.models.enums.MediaItemType; - -public final class FeedModel extends PostModel { - private final ProfileModel profileModel; - private final long commentsCount; - private long likesCount; - private final long viewCount; - private final List sliderItems; - private final int imageWidth; - private final int imageHeight; - private final String locationName; - private final String locationId; - - public static class Builder { - - private ProfileModel profileModel; - private MediaItemType itemType; - private long viewCount; - private String postId; - private String displayUrl; - private String thumbnailUrl; - private String shortCode; - private String postCaption, captionId; - private long commentsCount; - private long timestamp; - private boolean liked; - private boolean bookmarked; - private long likesCount; - private String locationName; - private String locationId; - private List sliderItems; - private int imageWidth; - private int imageHeight; - - public Builder setProfileModel(final ProfileModel profileModel) { - this.profileModel = profileModel; - return this; - } - - public Builder setItemType(final MediaItemType itemType) { - this.itemType = itemType; - return this; - } - - public Builder setViewCount(final long viewCount) { - this.viewCount = viewCount; - return this; - } - - public Builder setPostId(final String postId) { - this.postId = postId; - return this; - } - - public Builder setDisplayUrl(final String displayUrl) { - this.displayUrl = displayUrl; - return this; - } - - public Builder setThumbnailUrl(final String thumbnailUrl) { - this.thumbnailUrl = thumbnailUrl; - return this; - } - - public Builder setShortCode(final String shortCode) { - this.shortCode = shortCode; - return this; - } - - public Builder setPostCaption(final String postCaption) { - this.postCaption = postCaption; - return this; - } - - public Builder setCaptionId(final String captionId) { - this.captionId = captionId; - return this; - } - - public Builder setCommentsCount(final long commentsCount) { - this.commentsCount = commentsCount; - return this; - } - - public Builder setTimestamp(final long timestamp) { - this.timestamp = timestamp; - return this; - } - - public Builder setLiked(final boolean liked) { - this.liked = liked; - return this; - } - - public Builder setBookmarked(final boolean bookmarked) { - this.bookmarked = bookmarked; - return this; - } - - public Builder setLikesCount(final long likesCount) { - this.likesCount = likesCount; - return this; - } - - public Builder setLocationName(final String locationName) { - this.locationName = locationName; - return this; - } - - public Builder setLocationId(final String locationId) { - this.locationId = locationId; - return this; - } - - public Builder setSliderItems(final List sliderItems) { - this.sliderItems = sliderItems; - return this; - } - - public Builder setImageHeight(final int imageHeight) { - this.imageHeight = imageHeight; - return this; - } - - public Builder setImageWidth(final int imageWidth) { - this.imageWidth = imageWidth; - return this; - } - - public FeedModel build() { - return new FeedModel(profileModel, itemType, viewCount, postId, displayUrl, thumbnailUrl, shortCode, postCaption, captionId, - commentsCount, timestamp, liked, bookmarked, likesCount, locationName, locationId, sliderItems, imageHeight, imageWidth); - } - } - - private FeedModel(final ProfileModel profileModel, - final MediaItemType itemType, - final long viewCount, - final String postId, - final String displayUrl, - final String thumbnailUrl, - final String shortCode, - final String postCaption, - final String captionId, - final long commentsCount, - final long timestamp, - final boolean liked, - final boolean bookmarked, - final long likesCount, - final String locationName, - final String locationId, - final List sliderItems, - final int imageHeight, - final int imageWidth) { - super(itemType, postId, displayUrl, thumbnailUrl, shortCode, postCaption, captionId, timestamp, liked, bookmarked); - this.profileModel = profileModel; - this.commentsCount = commentsCount; - this.likesCount = likesCount; - this.viewCount = viewCount; - this.locationName = locationName; - this.locationId = locationId; - this.sliderItems = sliderItems; - this.imageHeight = imageHeight; - this.imageWidth = imageWidth; - } - - public ProfileModel getProfileModel() { - return profileModel; - } - - public List getSliderItems() { - return sliderItems; - } - - public long getViewCount() { - return viewCount; - } - - public long getCommentsCount() { - return commentsCount; - } - - public long getLikesCount() { - return likesCount; - } - - public int getImageWidth() { - return imageWidth; - } - - public int getImageHeight() { - return imageHeight; - } - - public String getLocationName() { - return locationName; - } - - public String getLocationId() { - return locationId; - } - - public void setLiked(final boolean liked) { - this.liked = liked; - } - - public void setLikesCount(final long count) { - this.likesCount = count; - } - - public void setSaved(final boolean saved) { - this.saved = saved; - } - - @Override - public String toString() { - return "FeedModel{" + - "type=" + itemType + - ", displayUrl=" + displayUrl + - ", thumbnailUrl=" + thumbnailUrl + - ", commentsCount=" + commentsCount + - ", viewCount=" + viewCount + - // ", sliderItems=" + sliderItems + - ", imageWidth=" + imageWidth + - ", imageHeight=" + imageHeight + - ", locationName='" + locationName + '\'' + - ", locationId='" + locationId + '\'' + - '}'; - } -} \ No newline at end of file diff --git a/app/src/main/java/awais/instagrabber/models/FeedStoryModel.java b/app/src/main/java/awais/instagrabber/models/FeedStoryModel.java index 01ffac76..026c019c 100755 --- a/app/src/main/java/awais/instagrabber/models/FeedStoryModel.java +++ b/app/src/main/java/awais/instagrabber/models/FeedStoryModel.java @@ -1,23 +1,22 @@ package awais.instagrabber.models; -import android.util.Log; - import androidx.annotation.NonNull; import java.io.Serializable; import java.util.Date; +import awais.instagrabber.repositories.responses.User; import awais.instagrabber.utils.Utils; public final class FeedStoryModel implements Serializable { private final String storyMediaId; - private final ProfileModel profileModel; + private final User profileModel; private final StoryModel firstStoryModel; private Boolean fullyRead; private final long timestamp; private final int mediaCount; - public FeedStoryModel(final String storyMediaId, final ProfileModel profileModel, final boolean fullyRead, + public FeedStoryModel(final String storyMediaId, final User profileModel, final boolean fullyRead, final long timestamp, final StoryModel firstStoryModel, final int mediaCount) { this.storyMediaId = storyMediaId; this.profileModel = profileModel; @@ -44,13 +43,13 @@ public final class FeedStoryModel implements Serializable { return mediaCount; } - public ProfileModel getProfileModel() { + public User getProfileModel() { return profileModel; } -// public void setFirstStoryModel(final StoryModel firstStoryModel) { -// this.firstStoryModel = firstStoryModel; -// } + // public void setFirstStoryModel(final StoryModel firstStoryModel) { + // this.firstStoryModel = firstStoryModel; + // } public StoryModel getFirstStoryModel() { return firstStoryModel; diff --git a/app/src/main/java/awais/instagrabber/models/FollowModel.java b/app/src/main/java/awais/instagrabber/models/FollowModel.java index fd9cc7a4..62c1da79 100755 --- a/app/src/main/java/awais/instagrabber/models/FollowModel.java +++ b/app/src/main/java/awais/instagrabber/models/FollowModel.java @@ -5,9 +5,13 @@ import androidx.annotation.Nullable; import java.io.Serializable; public final class FollowModel implements Serializable { - private final String id, username, fullName, profilePicUrl; + private final String id; + private final String username; + private final String fullName; + private final String profilePicUrl; private String endCursor; - private boolean hasNextPage, isShown = true; + private boolean hasNextPage; + private boolean isShown = true; public FollowModel(final String id, final String username, final String fullName, final String profilePicUrl) { this.id = id; diff --git a/app/src/main/java/awais/instagrabber/models/NotificationModel.java b/app/src/main/java/awais/instagrabber/models/NotificationModel.java index a7b78b47..fde8c79e 100755 --- a/app/src/main/java/awais/instagrabber/models/NotificationModel.java +++ b/app/src/main/java/awais/instagrabber/models/NotificationModel.java @@ -10,7 +10,7 @@ import awais.instagrabber.utils.Utils; public final class NotificationModel { private final String id; - private final String userId; + private final long userId; private final String username; private final String profilePicUrl; private final String postId; @@ -22,7 +22,7 @@ public final class NotificationModel { public NotificationModel(final String id, final String text, final long timestamp, - final String userId, + final long userId, final String username, final String profilePicUrl, final String postId, @@ -56,7 +56,7 @@ public final class NotificationModel { return Utils.datetimeParser.format(new Date(timestamp * 1000L)); } - public String getUserId() { + public long getUserId() { return userId; } diff --git a/app/src/main/java/awais/instagrabber/models/PostChild.java b/app/src/main/java/awais/instagrabber/models/PostChild.java deleted file mode 100644 index 9a0b17ad..00000000 --- a/app/src/main/java/awais/instagrabber/models/PostChild.java +++ /dev/null @@ -1,132 +0,0 @@ -package awais.instagrabber.models; - -import java.io.Serializable; - -import awais.instagrabber.models.enums.MediaItemType; - -public final class PostChild implements Serializable { - private final String postId; - private final String displayUrl; - private final String shortCode; - private final MediaItemType itemType; - private final String thumbnailUrl; - private final long videoViews; - private final int width; - private final int height; - - public static class Builder { - private String postId, displayUrl, shortCode, thumbnailUrl; - private MediaItemType itemType; - private long videoViews; - private int width; - private int height; - - public Builder setPostId(final String postId) { - this.postId = postId; - return this; - } - - public Builder setShortCode(final String shortCode) { - this.shortCode = shortCode; - return this; - } - - public Builder setItemType(final MediaItemType itemType) { - this.itemType = itemType; - return this; - } - - public Builder setDisplayUrl(final String displayUrl) { - this.displayUrl = displayUrl; - return this; - } - - public Builder setVideoViews(final long videoViews) { - this.videoViews = videoViews; - return this; - } - - public Builder setHeight(final int height) { - this.height = height; - return this; - } - - public Builder setWidth(final int width) { - this.width = width; - return this; - } - - public Builder setThumbnailUrl(final String thumbnailUrl) { - this.thumbnailUrl = thumbnailUrl; - return this; - } - - public PostChild build() { - return new PostChild(postId, shortCode, itemType, displayUrl, thumbnailUrl, videoViews, height, width); - } - } - - public PostChild(final String postId, - final String shortCode, - final MediaItemType itemType, - final String displayUrl, - final String thumbnailUrl, - final long videoViews, - final int height, - final int width) { - this.postId = postId; - this.shortCode = shortCode; - this.itemType = itemType; - this.displayUrl = displayUrl; - this.thumbnailUrl = thumbnailUrl; - this.height = height; - this.width = width; - this.videoViews = videoViews; - } - - public String getPostId() { - return postId; - } - - public String getShortCode() { - return shortCode; - } - - public MediaItemType getItemType() { - return itemType; - } - - public String getDisplayUrl() { - return displayUrl; - } - - public String getThumbnailUrl() { - return thumbnailUrl; - } - - public long getVideoViews() { - return videoViews; - } - - public int getWidth() { - return width; - } - - public int getHeight() { - return height; - } - - @Override - public String toString() { - return "PostChild{" + - "postId='" + postId + '\'' + - ", shortCode=" + shortCode + - ", itemType=" + itemType + - ", displayUrl='" + displayUrl + '\'' + - ", thumbnailUrl='" + thumbnailUrl + '\'' + - ", videoViews=" + videoViews + - ", width=" + width + - ", height=" + height + - '}'; - } -} \ No newline at end of file diff --git a/app/src/main/java/awais/instagrabber/models/PostModel.java b/app/src/main/java/awais/instagrabber/models/PostModel.java deleted file mode 100755 index 75bb6753..00000000 --- a/app/src/main/java/awais/instagrabber/models/PostModel.java +++ /dev/null @@ -1,64 +0,0 @@ -package awais.instagrabber.models; - -import awais.instagrabber.models.enums.MediaItemType; - -public class PostModel extends BasePostModel { - protected final String thumbnailUrl; - protected String endCursor; - protected boolean hasNextPage; - - public PostModel(final String shortCode, final boolean isid) { - if (!isid) this.shortCode = shortCode; - else this.postId = shortCode; - this.thumbnailUrl = null; - } - - public PostModel(final MediaItemType itemType, - final String postId, - final String displayUrl, - final String thumbnailUrl, - final String shortCode, - final CharSequence postCaption, - final String captionId, - long timestamp, - boolean liked, - boolean bookmarked) { - this.itemType = itemType; - this.postId = postId; - this.displayUrl = displayUrl; - this.thumbnailUrl = thumbnailUrl; - this.shortCode = shortCode; - this.postCaption = postCaption; - this.captionId = captionId; - this.timestamp = timestamp; - this.liked = liked; - this.saved = bookmarked; - } - - public String getThumbnailUrl() { - return thumbnailUrl; - } - - public String getEndCursor() { - return endCursor; - } - - public boolean hasNextPage() { - return endCursor != null && hasNextPage; - } - - public void setPostCaption(final CharSequence postCaption) { - this.postCaption = postCaption; - } - - public void setTimestamp(final long timestamp) { - this.timestamp = timestamp; - } - - public void setPageCursor(final boolean hasNextPage, final String endCursor) { - this.endCursor = endCursor; - this.hasNextPage = hasNextPage; - } - - -} \ No newline at end of file diff --git a/app/src/main/java/awais/instagrabber/models/ProfileModel.java b/app/src/main/java/awais/instagrabber/models/ProfileModel.java deleted file mode 100755 index ffed64f7..00000000 --- a/app/src/main/java/awais/instagrabber/models/ProfileModel.java +++ /dev/null @@ -1,118 +0,0 @@ -package awais.instagrabber.models; - -import java.io.Serializable; - -public final class ProfileModel implements Serializable { - private final boolean isPrivate, reallyPrivate, isVerified, following, follower, restricted, blocked, requested; - private final long postCount, followersCount, followingCount; - private final String id, username, name, biography, url, sdProfilePic, hdProfilePic; - - public ProfileModel(final boolean isPrivate, final boolean reallyPrivate, - final boolean isVerified, final String id, final String username, final String name, final String biography, - final String url, final String sdProfilePic, final String hdProfilePic, final long postCount, - final long followersCount, final long followingCount, final boolean following, final boolean follower, - final boolean restricted, final boolean blocked, final boolean requested) { - this.isPrivate = isPrivate; - this.reallyPrivate = reallyPrivate; - this.isVerified = isVerified; - this.id = id; - this.url = url; - this.name = name; - this.username = username; - this.biography = biography; - this.sdProfilePic = sdProfilePic; - this.hdProfilePic = hdProfilePic; - this.postCount = postCount; - this.followersCount = followersCount; - this.followingCount = followingCount; - this.following = following; - this.follower = follower; - this.restricted = restricted; - this.blocked = blocked; - this.requested = requested; - } - - public static ProfileModel getDefaultProfileModel() { - return new ProfileModel(false, false, false, null, null, null, null, null, null, null, 0, 0, 0, false, false, false, false, false); - } - - public static ProfileModel getDefaultProfileModel(final String userId) { - return new ProfileModel(false, false, false, userId, null, null, null, null, null, null, 0, 0, 0, false, false, false, false, false); - } - - public static ProfileModel getDefaultProfileModel(final String userId, final String username) { - return new ProfileModel(false, false, false, userId, username, null, null, null, null, null, 0, 0, 0, false, false, false, false, false); - } - - public boolean isPrivate() { - return isPrivate; - } - - public boolean isReallyPrivate() { - return reallyPrivate; - } - - public boolean isVerified() { - return isVerified; - } - - public String getId() { - return id; - } - - public String getUsername() { - return username; - } - - public String getName() { - return name; - } - - public String getBiography() { - return biography; - } - - public String getUrl() { - return url; - } - - public String getSdProfilePic() { - return sdProfilePic; - } - - public String getHdProfilePic() { - return hdProfilePic; - } - - public Long getPostCount() { - return postCount; - } - - public Long getFollowersCount() { - return followersCount; - } - - public Long getFollowingCount() { - return followingCount; - } - - public boolean isFollowing() { - return following; - } - - public boolean isFollower() { - return follower; - } - - public boolean isRestricted() { - return restricted; - } - - public boolean isBlocked() { - return blocked; - } - - public boolean isRequested() { - return requested; - } -} \ No newline at end of file diff --git a/app/src/main/java/awais/instagrabber/models/StoryModel.java b/app/src/main/java/awais/instagrabber/models/StoryModel.java index 80b451c8..ab1def43 100755 --- a/app/src/main/java/awais/instagrabber/models/StoryModel.java +++ b/app/src/main/java/awais/instagrabber/models/StoryModel.java @@ -14,7 +14,7 @@ public final class StoryModel implements Serializable { private final String storyUrl; private String thumbnail; private final String username; - private final String userId; + private final long userId; private final MediaItemType itemType; private final long timestamp; private String videoUrl; @@ -32,7 +32,7 @@ public final class StoryModel implements Serializable { private final boolean canReply; public StoryModel(final String storyMediaId, final String storyUrl, final String thumbnail, final MediaItemType itemType, - final long timestamp, final String username, final String userId, final boolean canReply) { + final long timestamp, final String username, final long userId, final boolean canReply) { this.storyMediaId = storyMediaId; this.storyUrl = storyUrl; this.thumbnail = thumbnail; @@ -161,7 +161,7 @@ public final class StoryModel implements Serializable { return username; } - public String getUserId() { + public long getUserId() { return userId; } } \ No newline at end of file diff --git a/app/src/main/java/awais/instagrabber/models/TopicCluster.java b/app/src/main/java/awais/instagrabber/models/TopicCluster.java index 6356e8c0..21b3ca98 100644 --- a/app/src/main/java/awais/instagrabber/models/TopicCluster.java +++ b/app/src/main/java/awais/instagrabber/models/TopicCluster.java @@ -2,14 +2,16 @@ package awais.instagrabber.models; import java.io.Serializable; +import awais.instagrabber.repositories.responses.Media; + public class TopicCluster implements Serializable { - private String id; - private String title; - private String type; - private boolean canMute; - private boolean isMuted; - private int rankedPosition; - private FeedModel coverMedia; + private final String id; + private final String title; + private final String type; + private final boolean canMute; + private final boolean isMuted; + private final int rankedPosition; + private final Media coverMedia; public TopicCluster(final String id, final String title, @@ -17,7 +19,7 @@ public class TopicCluster implements Serializable { final boolean canMute, final boolean isMuted, final int rankedPosition, - final FeedModel coverMedia) { + final Media coverMedia) { this.id = id; this.title = title; this.type = type; @@ -51,7 +53,7 @@ public class TopicCluster implements Serializable { return rankedPosition; } - public FeedModel getCoverMedia() { + public Media getCoverMedia() { return coverMedia; } } diff --git a/app/src/main/java/awais/instagrabber/models/ViewerPostModel.java b/app/src/main/java/awais/instagrabber/models/ViewerPostModel.java deleted file mode 100755 index 5e9589ce..00000000 --- a/app/src/main/java/awais/instagrabber/models/ViewerPostModel.java +++ /dev/null @@ -1,219 +0,0 @@ -package awais.instagrabber.models; - -import awais.instagrabber.models.enums.MediaItemType; - -public final class ViewerPostModel extends BasePostModel { - protected final ProfileModel profileModel; - protected final String locationName; - protected final String location; - protected final long videoViews; - private final String thumbnailUrl; - protected long commentsCount; - protected long likes; - private int imageWidth; - private int imageHeight; - private boolean isCurrentSlide = false; - - public static class Builder { - private MediaItemType itemType; - private String postId; - private String displayUrl; - private String shortCode; - private String postCaption; - private ProfileModel profileModel; - private long videoViews; - private long timestamp; - private boolean liked; - private boolean bookmarked; - private long likes; - private String locationName; - private String location; - private String thumbnailUrl; - private int imageWidth; - private int imageHeight; - - public Builder setItemType(final MediaItemType itemType) { - this.itemType = itemType; - return this; - } - - public Builder setPostId(final String postId) { - this.postId = postId; - return this; - } - - public Builder setDisplayUrl(final String displayUrl) { - this.displayUrl = displayUrl; - return this; - } - - public Builder setShortCode(final String shortCode) { - this.shortCode = shortCode; - return this; - } - - // public Builder setPostCaption(final String postCaption) { - // this.postCaption = postCaption; - // return this; - // } - - // public Builder setProfileModel(final ProfileModel profileModel) { - // this.profileModel = profileModel; - // return this; - // } - - public Builder setVideoViews(final long videoViews) { - this.videoViews = videoViews; - return this; - } - - // public Builder setTimestamp(final long timestamp) { - // this.timestamp = timestamp; - // return this; - // } - // - // public Builder setLiked(final boolean liked) { - // this.liked = liked; - // return this; - // } - // - // public Builder setBookmarked(final boolean bookmarked) { - // this.bookmarked = bookmarked; - // return this; - // } - // - // public Builder setLikes(final long likes) { - // this.likes = likes; - // return this; - // } - - // public Builder setLocationName(final String locationName) { - // this.locationName = locationName; - // return this; - // } - // - // public Builder setLocation(final String location) { - // this.location = location; - // return this; - // } - - - public Builder setImageHeight(final int imageHeight) { - this.imageHeight = imageHeight; - return this; - } - - public Builder setImageWidth(final int imageWidth) { - this.imageWidth = imageWidth; - return this; - } - - public Builder setThumbnailUrl(final String thumbnailUrl) { - this.thumbnailUrl = thumbnailUrl; - return this; - } - - public ViewerPostModel build() { - return new ViewerPostModel(itemType, postId, displayUrl, thumbnailUrl, imageHeight, imageWidth, shortCode, postCaption, profileModel, - videoViews, timestamp, liked, bookmarked, likes, locationName, location); - } - } - - public ViewerPostModel(final MediaItemType itemType, - final String postId, - final String displayUrl, - final String thumbnailUrl, - final int imageHeight, - final int imageWidth, - final String shortCode, - final String postCaption, - final ProfileModel profileModel, - final long videoViews, - final long timestamp, - boolean liked, - boolean bookmarked, - long likes, - final String locationName, - final String location) { - this.itemType = itemType; - this.postId = postId; - this.displayUrl = displayUrl; - this.thumbnailUrl = thumbnailUrl; - this.imageHeight = imageHeight; - this.imageWidth = imageWidth; - this.postCaption = postCaption; - this.profileModel = profileModel; - this.shortCode = shortCode; - this.videoViews = videoViews; - this.timestamp = timestamp; - this.liked = liked; - this.likes = likes; - this.saved = bookmarked; - this.locationName = locationName; - this.location = location; - } - - public long getCommentsCount() { - return commentsCount; - } - - public ProfileModel getProfileModel() { - return profileModel; - } - - public String getLocationName() { - return locationName; - } - - public String getLocation() { - return location; - } - - public final long getVideoViews() { - return videoViews; - } - - public long getLikes() { - return likes; - } - - // setManualLike means user liked from InstaGrabber - public void setManualLike(final boolean like) { - liked = like; - likes = (like) ? (likes + 1) : (likes - 1); - } - - public boolean isCurrentSlide() { - return isCurrentSlide; - } - - public String getThumbnailUrl() { - return thumbnailUrl; - } - - public int getImageHeight() { - return imageHeight; - } - - public int getImageWidth() { - return imageWidth; - } - - @Override - public String toString() { - return "ViewerPostModel{" + - "type=" + itemType + - ", displayUrl=" + displayUrl + - ", thumbnailUrl=" + thumbnailUrl + - ", locationName='" + locationName + '\'' + - ", location='" + location + '\'' + - ", videoViews=" + videoViews + - ", thumbnailUrl='" + thumbnailUrl + '\'' + - ", commentsCount=" + commentsCount + - ", likes=" + likes + - ", imageWidth=" + imageWidth + - ", imageHeight=" + imageHeight + - ", isCurrentSlide=" + isCurrentSlide + - '}'; - } -} \ No newline at end of file diff --git a/app/src/main/java/awais/instagrabber/models/ViewerPostModelWrapper.java b/app/src/main/java/awais/instagrabber/models/ViewerPostModelWrapper.java deleted file mode 100644 index 69dfb088..00000000 --- a/app/src/main/java/awais/instagrabber/models/ViewerPostModelWrapper.java +++ /dev/null @@ -1,25 +0,0 @@ -package awais.instagrabber.models; - -import java.util.List; - -public class ViewerPostModelWrapper { - private int position; - private List viewerPostModels; - - public ViewerPostModelWrapper(final int position, final List viewerPostModels) { - this.position = position; - this.viewerPostModels = viewerPostModels; - } - - public int getPosition() { - return position; - } - - public List getViewerPostModels() { - return viewerPostModels; - } - - public void setViewerPostModels(final List viewerPostModels) { - this.viewerPostModels = viewerPostModels; - } -} diff --git a/app/src/main/java/awais/instagrabber/models/enums/DownloadMethod.java b/app/src/main/java/awais/instagrabber/models/enums/DownloadMethod.java deleted file mode 100755 index fc22241c..00000000 --- a/app/src/main/java/awais/instagrabber/models/enums/DownloadMethod.java +++ /dev/null @@ -1,10 +0,0 @@ -package awais.instagrabber.models.enums; - -public enum DownloadMethod { - DOWNLOAD_MAIN, - DOWNLOAD_DISCOVER, - DOWNLOAD_FEED, - DOWNLOAD_POST_VIEWER, - DOWNLOAD_DIRECT, - DOWNLOAD_SAVED; -} \ No newline at end of file diff --git a/app/src/main/java/awais/instagrabber/models/enums/InboxReadState.java b/app/src/main/java/awais/instagrabber/models/enums/InboxReadState.java deleted file mode 100755 index 0924b435..00000000 --- a/app/src/main/java/awais/instagrabber/models/enums/InboxReadState.java +++ /dev/null @@ -1,8 +0,0 @@ -package awais.instagrabber.models.enums; - -import java.io.Serializable; - -public enum InboxReadState implements Serializable { - STATE_READ, - STATE_UNREAD, -} \ No newline at end of file diff --git a/app/src/main/java/awais/instagrabber/models/enums/UserInboxDirection.java b/app/src/main/java/awais/instagrabber/models/enums/UserInboxDirection.java deleted file mode 100755 index dc6cf83a..00000000 --- a/app/src/main/java/awais/instagrabber/models/enums/UserInboxDirection.java +++ /dev/null @@ -1,16 +0,0 @@ -package awais.instagrabber.models.enums; - -public enum UserInboxDirection { - OLDER("older"), - NEWER("newer"); - - private final String value; - - UserInboxDirection(final String value) { - this.value = value; - } - - public String getValue() { - return value; - } -} \ No newline at end of file diff --git a/app/src/main/java/awais/instagrabber/repositories/DiscoverRepository.java b/app/src/main/java/awais/instagrabber/repositories/DiscoverRepository.java index 020884d0..aed6d4c2 100644 --- a/app/src/main/java/awais/instagrabber/repositories/DiscoverRepository.java +++ b/app/src/main/java/awais/instagrabber/repositories/DiscoverRepository.java @@ -2,11 +2,12 @@ package awais.instagrabber.repositories; import java.util.Map; +import awais.instagrabber.repositories.responses.discover.TopicalExploreFeedResponse; import retrofit2.Call; import retrofit2.http.GET; import retrofit2.http.QueryMap; public interface DiscoverRepository { @GET("/api/v1/discover/topical_explore/") - Call topicalExplore(@QueryMap Map queryParams); + Call topicalExplore(@QueryMap Map queryParams); } diff --git a/app/src/main/java/awais/instagrabber/repositories/FeedRepository.java b/app/src/main/java/awais/instagrabber/repositories/FeedRepository.java index 24ac5e01..bb7d036c 100644 --- a/app/src/main/java/awais/instagrabber/repositories/FeedRepository.java +++ b/app/src/main/java/awais/instagrabber/repositories/FeedRepository.java @@ -2,6 +2,7 @@ package awais.instagrabber.repositories; import java.util.Map; +import awais.instagrabber.repositories.responses.FeedFetchResponse; import retrofit2.Call; import retrofit2.http.FieldMap; import retrofit2.http.FormUrlEncoded; @@ -10,5 +11,5 @@ import retrofit2.http.POST; public interface FeedRepository { @FormUrlEncoded @POST("/api/v1/feed/timeline/") - Call fetch(@FieldMap final Map signedForm); + Call fetch(@FieldMap final Map signedForm); } diff --git a/app/src/main/java/awais/instagrabber/repositories/FriendshipRepository.java b/app/src/main/java/awais/instagrabber/repositories/FriendshipRepository.java index d01aa1ee..919efaaa 100644 --- a/app/src/main/java/awais/instagrabber/repositories/FriendshipRepository.java +++ b/app/src/main/java/awais/instagrabber/repositories/FriendshipRepository.java @@ -2,9 +2,8 @@ package awais.instagrabber.repositories; import java.util.Map; -import awais.instagrabber.repositories.responses.FriendshipRepoChangeRootResponse; -import awais.instagrabber.repositories.responses.FriendshipRepoListFetchResponse; -import awais.instagrabber.repositories.responses.FriendshipRepoRestrictRootResponse; +import awais.instagrabber.repositories.responses.FriendshipChangeResponse; +import awais.instagrabber.repositories.responses.FriendshipRestrictResponse; import retrofit2.Call; import retrofit2.http.FieldMap; import retrofit2.http.FormUrlEncoded; @@ -18,20 +17,20 @@ public interface FriendshipRepository { @FormUrlEncoded @POST("/api/v1/friendships/{action}/{id}/") - Call change(@Header("User-Agent") String userAgent, - @Path("action") String action, - @Path("id") String id, - @FieldMap Map form); + Call change(@Header("User-Agent") String userAgent, + @Path("action") String action, + @Path("id") long id, + @FieldMap Map form); @FormUrlEncoded @POST("/api/v1/restrict_action/{action}/") - Call toggleRestrict(@Header("User-Agent") String userAgent, - @Path("action") String action, - @FieldMap Map form); + Call toggleRestrict(@Header("User-Agent") String userAgent, + @Path("action") String action, + @FieldMap Map form); @GET("/api/v1/friendships/{userId}/{type}/") Call getList(@Header("User-Agent") String userAgent, - @Path("userId") String userId, + @Path("userId") long userId, @Path("type") String type, // following or followers @QueryMap(encoded = true) Map queryParams); } diff --git a/app/src/main/java/awais/instagrabber/repositories/LocationRepository.java b/app/src/main/java/awais/instagrabber/repositories/LocationRepository.java index 7cb5ca41..e36c9a21 100644 --- a/app/src/main/java/awais/instagrabber/repositories/LocationRepository.java +++ b/app/src/main/java/awais/instagrabber/repositories/LocationRepository.java @@ -2,6 +2,7 @@ package awais.instagrabber.repositories; import java.util.Map; +import awais.instagrabber.repositories.responses.LocationFeedResponse; import retrofit2.Call; import retrofit2.http.GET; import retrofit2.http.Path; @@ -10,6 +11,6 @@ import retrofit2.http.QueryMap; public interface LocationRepository { @GET("/api/v1/feed/location/{location}/") - Call fetchPosts(@Path("location") final String locationId, - @QueryMap Map queryParams); + Call fetchPosts(@Path("location") final String locationId, + @QueryMap Map queryParams); } diff --git a/app/src/main/java/awais/instagrabber/repositories/MediaRepository.java b/app/src/main/java/awais/instagrabber/repositories/MediaRepository.java index cff9cac3..1eed5398 100644 --- a/app/src/main/java/awais/instagrabber/repositories/MediaRepository.java +++ b/app/src/main/java/awais/instagrabber/repositories/MediaRepository.java @@ -2,6 +2,8 @@ package awais.instagrabber.repositories; import java.util.Map; +import awais.instagrabber.repositories.responses.LikersResponse; +import awais.instagrabber.repositories.responses.MediaInfoResponse; import retrofit2.Call; import retrofit2.http.FieldMap; import retrofit2.http.FormUrlEncoded; @@ -13,11 +15,11 @@ import retrofit2.http.QueryMap; public interface MediaRepository { @GET("/api/v1/media/{mediaId}/info/") - Call fetch(@Path("mediaId") final String mediaId); + Call fetch(@Path("mediaId") final String mediaId); @GET("/api/v1/media/{mediaId}/{action}/") - Call fetchLikes(@Path("mediaId") final String mediaId, - @Path("action") final String action); // one of "likers" or "comment_likers" + Call fetchLikes(@Path("mediaId") final String mediaId, + @Path("action") final String action); // one of "likers" or "comment_likers" @FormUrlEncoded @POST("/api/v1/media/{mediaId}/{action}/") diff --git a/app/src/main/java/awais/instagrabber/repositories/ProfileRepository.java b/app/src/main/java/awais/instagrabber/repositories/ProfileRepository.java index a35d759f..e8218101 100644 --- a/app/src/main/java/awais/instagrabber/repositories/ProfileRepository.java +++ b/app/src/main/java/awais/instagrabber/repositories/ProfileRepository.java @@ -2,6 +2,7 @@ package awais.instagrabber.repositories; import java.util.Map; +import awais.instagrabber.repositories.responses.UserFeedResponse; import retrofit2.Call; import retrofit2.http.GET; import retrofit2.http.Path; @@ -10,14 +11,14 @@ import retrofit2.http.QueryMap; public interface ProfileRepository { @GET("/api/v1/feed/user/{uid}/") - Call fetch(@Path("uid") final String uid, @QueryMap Map queryParams); + Call fetch(@Path("uid") final long uid, @QueryMap Map queryParams); @GET("/api/v1/feed/saved/") - Call fetchSaved(@QueryMap Map queryParams); + Call fetchSaved(@QueryMap Map queryParams); @GET("/api/v1/feed/liked/") - Call fetchLiked(@QueryMap Map queryParams); + Call fetchLiked(@QueryMap Map queryParams); @GET("/api/v1/usertags/{profileId}/feed/") - Call fetchTagged(@Path("profileId") final String profileId, @QueryMap Map queryParams); + Call fetchTagged(@Path("profileId") final long profileId, @QueryMap Map queryParams); } diff --git a/app/src/main/java/awais/instagrabber/repositories/StoriesRepository.java b/app/src/main/java/awais/instagrabber/repositories/StoriesRepository.java index 139ba352..7bdf31a1 100644 --- a/app/src/main/java/awais/instagrabber/repositories/StoriesRepository.java +++ b/app/src/main/java/awais/instagrabber/repositories/StoriesRepository.java @@ -8,8 +8,8 @@ import retrofit2.http.FieldMap; import retrofit2.http.FormUrlEncoded; import retrofit2.http.GET; import retrofit2.http.Header; -import retrofit2.http.Path; import retrofit2.http.POST; +import retrofit2.http.Path; import retrofit2.http.QueryMap; import retrofit2.http.Url; @@ -22,7 +22,7 @@ public interface StoriesRepository { Call getFeedStories(); @GET("/api/v1/highlights/{uid}/highlights_tray/") - Call fetchHighlights(@Path("uid") final String uid); + Call fetchHighlights(@Path("uid") final long uid); @GET("/api/v1/archive/reel/day_shells/") Call fetchArchive(@QueryMap Map queryParams); diff --git a/app/src/main/java/awais/instagrabber/repositories/TagsRepository.java b/app/src/main/java/awais/instagrabber/repositories/TagsRepository.java index 4db3efbd..5d316b97 100644 --- a/app/src/main/java/awais/instagrabber/repositories/TagsRepository.java +++ b/app/src/main/java/awais/instagrabber/repositories/TagsRepository.java @@ -2,6 +2,7 @@ package awais.instagrabber.repositories; import java.util.Map; +import awais.instagrabber.repositories.responses.TagFeedResponse; import retrofit2.Call; import retrofit2.http.GET; import retrofit2.http.Header; @@ -22,6 +23,6 @@ public interface TagsRepository { @Path("tag") String tag); @GET("/api/v1/feed/tag/{tag}/") - Call fetchPosts(@Path("tag") final String tag, - @QueryMap Map queryParams); + Call fetchPosts(@Path("tag") final String tag, + @QueryMap Map queryParams); } diff --git a/app/src/main/java/awais/instagrabber/repositories/UserRepository.java b/app/src/main/java/awais/instagrabber/repositories/UserRepository.java index 206f57b9..5812f5a6 100644 --- a/app/src/main/java/awais/instagrabber/repositories/UserRepository.java +++ b/app/src/main/java/awais/instagrabber/repositories/UserRepository.java @@ -1,5 +1,6 @@ package awais.instagrabber.repositories; +import awais.instagrabber.repositories.responses.User; import awais.instagrabber.repositories.responses.UserSearchResponse; import retrofit2.Call; import retrofit2.http.GET; @@ -9,7 +10,7 @@ import retrofit2.http.Query; public interface UserRepository { @GET("/api/v1/users/{uid}/info/") - Call getUserInfo(@Path("uid") final String uid); + Call getUserInfo(@Path("uid") final long uid); @GET("/api/v1/users/search/") Call search(@Query("timezone_offset") float timezoneOffset, diff --git a/app/src/main/java/awais/instagrabber/repositories/responses/directmessages/AnimatedMediaFixedHeight.java b/app/src/main/java/awais/instagrabber/repositories/responses/AnimatedMediaFixedHeight.java similarity index 91% rename from app/src/main/java/awais/instagrabber/repositories/responses/directmessages/AnimatedMediaFixedHeight.java rename to app/src/main/java/awais/instagrabber/repositories/responses/AnimatedMediaFixedHeight.java index 6c6521dd..e3ccd208 100644 --- a/app/src/main/java/awais/instagrabber/repositories/responses/directmessages/AnimatedMediaFixedHeight.java +++ b/app/src/main/java/awais/instagrabber/repositories/responses/AnimatedMediaFixedHeight.java @@ -1,4 +1,4 @@ -package awais.instagrabber.repositories.responses.directmessages; +package awais.instagrabber.repositories.responses; public class AnimatedMediaFixedHeight { private final int height; diff --git a/app/src/main/java/awais/instagrabber/repositories/responses/directmessages/AnimatedMediaImages.java b/app/src/main/java/awais/instagrabber/repositories/responses/AnimatedMediaImages.java similarity index 82% rename from app/src/main/java/awais/instagrabber/repositories/responses/directmessages/AnimatedMediaImages.java rename to app/src/main/java/awais/instagrabber/repositories/responses/AnimatedMediaImages.java index 3b4eee46..ce02d9bb 100644 --- a/app/src/main/java/awais/instagrabber/repositories/responses/directmessages/AnimatedMediaImages.java +++ b/app/src/main/java/awais/instagrabber/repositories/responses/AnimatedMediaImages.java @@ -1,4 +1,4 @@ -package awais.instagrabber.repositories.responses.directmessages; +package awais.instagrabber.repositories.responses; public class AnimatedMediaImages { private final AnimatedMediaFixedHeight fixedHeight; diff --git a/app/src/main/java/awais/instagrabber/repositories/responses/directmessages/Audio.java b/app/src/main/java/awais/instagrabber/repositories/responses/Audio.java similarity index 90% rename from app/src/main/java/awais/instagrabber/repositories/responses/directmessages/Audio.java rename to app/src/main/java/awais/instagrabber/repositories/responses/Audio.java index b81f7fd0..0e408442 100644 --- a/app/src/main/java/awais/instagrabber/repositories/responses/directmessages/Audio.java +++ b/app/src/main/java/awais/instagrabber/repositories/responses/Audio.java @@ -1,8 +1,9 @@ -package awais.instagrabber.repositories.responses.directmessages; +package awais.instagrabber.repositories.responses; +import java.io.Serializable; import java.util.List; -public class Audio { +public class Audio implements Serializable { private final String audioSrc; private final long duration; private final List waveformData; diff --git a/app/src/main/java/awais/instagrabber/repositories/responses/Caption.java b/app/src/main/java/awais/instagrabber/repositories/responses/Caption.java new file mode 100644 index 00000000..fe0b4c8b --- /dev/null +++ b/app/src/main/java/awais/instagrabber/repositories/responses/Caption.java @@ -0,0 +1,72 @@ +package awais.instagrabber.repositories.responses; + +import android.util.Log; + +import com.google.gson.Gson; +import com.google.gson.JsonDeserializationContext; +import com.google.gson.JsonDeserializer; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonParseException; + +import java.io.Serializable; +import java.lang.reflect.Type; + +public class Caption implements Serializable { + private long mPk; + private final long userId; + private String text; + + public Caption(final long userId, final String text) { + this.userId = userId; + this.text = text; + } + + public long getPk() { + return mPk; + } + + public void setPk(final long pk) { + this.mPk = pk; + } + + public long getUserId() { + return userId; + } + + public String getText() { + return text; + } + + public void setText(String text) { + this.text = text; + } + + public static class CaptionDeserializer implements JsonDeserializer { + + private static final String TAG = CaptionDeserializer.class.getSimpleName(); + + @Override + public Caption deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { + final Caption caption = new Gson().fromJson(json, Caption.class); + final JsonObject jsonObject = json.getAsJsonObject(); + if (jsonObject.has("pk")) { + JsonElement elem = jsonObject.get("pk"); + if (elem != null && !elem.isJsonNull()) { + if (!elem.isJsonPrimitive()) return caption; + String pkString = elem.getAsString(); + if (pkString.contains("_")) { + pkString = pkString.substring(0, pkString.indexOf("_")); + } + try { + caption.setPk(Long.parseLong(pkString)); + } catch (NumberFormatException e) { + Log.e(TAG, "deserialize: ", e); + } + } + } + return caption; + } + } + +} diff --git a/app/src/main/java/awais/instagrabber/repositories/responses/EndOfFeedDemarcator.java b/app/src/main/java/awais/instagrabber/repositories/responses/EndOfFeedDemarcator.java new file mode 100644 index 00000000..e50db021 --- /dev/null +++ b/app/src/main/java/awais/instagrabber/repositories/responses/EndOfFeedDemarcator.java @@ -0,0 +1,21 @@ +package awais.instagrabber.repositories.responses; + +import java.io.Serializable; + +public class EndOfFeedDemarcator implements Serializable { + private final long id; + private final EndOfFeedGroupSet groupSet; + + public EndOfFeedDemarcator(final long id, final EndOfFeedGroupSet groupSet) { + this.id = id; + this.groupSet = groupSet; + } + + public long getId() { + return id; + } + + public EndOfFeedGroupSet getGroupSet() { + return groupSet; + } +} diff --git a/app/src/main/java/awais/instagrabber/repositories/responses/EndOfFeedGroup.java b/app/src/main/java/awais/instagrabber/repositories/responses/EndOfFeedGroup.java new file mode 100644 index 00000000..6ff815d0 --- /dev/null +++ b/app/src/main/java/awais/instagrabber/repositories/responses/EndOfFeedGroup.java @@ -0,0 +1,34 @@ +package awais.instagrabber.repositories.responses; + +import java.io.Serializable; +import java.util.List; + +public class EndOfFeedGroup implements Serializable { + private final String id; + private final String title; + private final String nextMaxId; + private final List feedItems; + + public EndOfFeedGroup(final String id, final String title, final String nextMaxId, final List feedItems) { + this.id = id; + this.title = title; + this.nextMaxId = nextMaxId; + this.feedItems = feedItems; + } + + public String getId() { + return id; + } + + public String getTitle() { + return title; + } + + public String getNextMaxId() { + return nextMaxId; + } + + public List getFeedItems() { + return feedItems; + } +} diff --git a/app/src/main/java/awais/instagrabber/repositories/responses/EndOfFeedGroupSet.java b/app/src/main/java/awais/instagrabber/repositories/responses/EndOfFeedGroupSet.java new file mode 100644 index 00000000..f213eb86 --- /dev/null +++ b/app/src/main/java/awais/instagrabber/repositories/responses/EndOfFeedGroupSet.java @@ -0,0 +1,51 @@ +package awais.instagrabber.repositories.responses; + +import java.io.Serializable; +import java.util.List; + +public class EndOfFeedGroupSet implements Serializable { + private final long id; + private final String activeGroupId; + private final String connectedGroupId; + private final String nextMaxId; + private final String paginationSource; + private final List groups; + + public EndOfFeedGroupSet(final long id, + final String activeGroupId, + final String connectedGroupId, + final String nextMaxId, + final String paginationSource, + final List groups) { + this.id = id; + this.activeGroupId = activeGroupId; + this.connectedGroupId = connectedGroupId; + this.nextMaxId = nextMaxId; + this.paginationSource = paginationSource; + this.groups = groups; + } + + public long getId() { + return id; + } + + public String getActiveGroupId() { + return activeGroupId; + } + + public String getConnectedGroupId() { + return connectedGroupId; + } + + public String getNextMaxId() { + return nextMaxId; + } + + public String getPaginationSource() { + return paginationSource; + } + + public List getGroups() { + return groups; + } +} diff --git a/app/src/main/java/awais/instagrabber/repositories/responses/FeedFetchResponse.java b/app/src/main/java/awais/instagrabber/repositories/responses/FeedFetchResponse.java new file mode 100644 index 00000000..2d91a9f7 --- /dev/null +++ b/app/src/main/java/awais/instagrabber/repositories/responses/FeedFetchResponse.java @@ -0,0 +1,43 @@ +package awais.instagrabber.repositories.responses; + +import java.util.List; + +public class FeedFetchResponse { + private final List items; + private final int numResults; + private final boolean moreAvailable; + private final String nextMaxId; + private final String status; + + public FeedFetchResponse(final List items, + final int numResults, + final boolean moreAvailable, + final String nextMaxId, + final String status) { + this.items = items; + this.numResults = numResults; + this.moreAvailable = moreAvailable; + this.nextMaxId = nextMaxId; + this.status = status; + } + + public List getItems() { + return items; + } + + public int getNumResults() { + return numResults; + } + + public boolean isMoreAvailable() { + return moreAvailable; + } + + public String getNextMaxId() { + return nextMaxId; + } + + public String getStatus() { + return status; + } +} diff --git a/app/src/main/java/awais/instagrabber/repositories/responses/FriendshipChangeResponse.java b/app/src/main/java/awais/instagrabber/repositories/responses/FriendshipChangeResponse.java new file mode 100644 index 00000000..c6193136 --- /dev/null +++ b/app/src/main/java/awais/instagrabber/repositories/responses/FriendshipChangeResponse.java @@ -0,0 +1,31 @@ +package awais.instagrabber.repositories.responses; + +import androidx.annotation.NonNull; + +public class FriendshipChangeResponse { + private final FriendshipStatus friendshipStatus; + private final String status; + + public FriendshipChangeResponse(final FriendshipStatus friendshipStatus, + final String status) { + this.friendshipStatus = friendshipStatus; + this.status = status; + } + + public FriendshipStatus getFriendshipStatus() { + return friendshipStatus; + } + + public String getStatus() { + return status; + } + + @NonNull + @Override + public String toString() { + return "FriendshipChangeResponse{" + + "friendshipStatus=" + friendshipStatus + + ", status='" + status + '\'' + + '}'; + } +} diff --git a/app/src/main/java/awais/instagrabber/repositories/responses/FriendshipRepoListFetchResponse.java b/app/src/main/java/awais/instagrabber/repositories/responses/FriendshipListFetchResponse.java similarity index 73% rename from app/src/main/java/awais/instagrabber/repositories/responses/FriendshipRepoListFetchResponse.java rename to app/src/main/java/awais/instagrabber/repositories/responses/FriendshipListFetchResponse.java index 843db036..370dc913 100644 --- a/app/src/main/java/awais/instagrabber/repositories/responses/FriendshipRepoListFetchResponse.java +++ b/app/src/main/java/awais/instagrabber/repositories/responses/FriendshipListFetchResponse.java @@ -8,14 +8,14 @@ import java.util.Objects; import awais.instagrabber.models.FollowModel; import awais.instagrabber.utils.TextUtils; -public class FriendshipRepoListFetchResponse { +public class FriendshipListFetchResponse { private String nextMaxId; private String status; private List items; - public FriendshipRepoListFetchResponse(final String nextMaxId, - final String status, - final List items) { + public FriendshipListFetchResponse(final String nextMaxId, + final String status, + final List items) { this.nextMaxId = nextMaxId; this.status = status; this.items = items; @@ -29,7 +29,7 @@ public class FriendshipRepoListFetchResponse { return nextMaxId; } - public FriendshipRepoListFetchResponse setNextMaxId(final String nextMaxId) { + public FriendshipListFetchResponse setNextMaxId(final String nextMaxId) { this.nextMaxId = nextMaxId; return this; } @@ -38,7 +38,7 @@ public class FriendshipRepoListFetchResponse { return status; } - public FriendshipRepoListFetchResponse setStatus(final String status) { + public FriendshipListFetchResponse setStatus(final String status) { this.status = status; return this; } @@ -47,7 +47,7 @@ public class FriendshipRepoListFetchResponse { return items; } - public FriendshipRepoListFetchResponse setItems(final List items) { + public FriendshipListFetchResponse setItems(final List items) { this.items = items; return this; } @@ -56,7 +56,7 @@ public class FriendshipRepoListFetchResponse { public boolean equals(final Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; - final FriendshipRepoListFetchResponse that = (FriendshipRepoListFetchResponse) o; + final FriendshipListFetchResponse that = (FriendshipListFetchResponse) o; return Objects.equals(nextMaxId, that.nextMaxId) && Objects.equals(status, that.status) && Objects.equals(items, that.items); diff --git a/app/src/main/java/awais/instagrabber/repositories/responses/FriendshipRepoChangeResponseFriendshipStatus.java b/app/src/main/java/awais/instagrabber/repositories/responses/FriendshipRepoChangeResponseFriendshipStatus.java deleted file mode 100644 index cfaa8d17..00000000 --- a/app/src/main/java/awais/instagrabber/repositories/responses/FriendshipRepoChangeResponseFriendshipStatus.java +++ /dev/null @@ -1,79 +0,0 @@ -package awais.instagrabber.repositories.responses; - -import androidx.annotation.NonNull; - -public class FriendshipRepoChangeResponseFriendshipStatus { - private boolean following; - private boolean followedBy; - private boolean blocking; - private boolean muting; - private boolean isPrivate; - private boolean incomingRequest; - private boolean outgoingRequest; - private boolean isBestie; - - public FriendshipRepoChangeResponseFriendshipStatus(final boolean following, - final boolean followedBy, - final boolean blocking, - final boolean muting, - final boolean isPrivate, - final boolean incomingRequest, - final boolean outgoingRequest, - final boolean isBestie) { - this.following = following; - this.followedBy = followedBy; - this.blocking = blocking; - this.muting = muting; - this.isPrivate = isPrivate; - this.incomingRequest = incomingRequest; - this.outgoingRequest = outgoingRequest; - this.isBestie = isBestie; - } - - public boolean isFollowing() { - return following; - } - - public boolean isFollowedBy() { - return followedBy; - } - - public boolean isBlocking() { - return blocking; - } - - public boolean isMuting() { - return muting; - } - - public boolean isPrivate() { - return isPrivate; - } - - public boolean isIncomingRequest() { - return incomingRequest; - } - - public boolean isOutgoingRequest() { - return outgoingRequest; - } - - public boolean isBestie() { - return isBestie; - } - - @NonNull - @Override - public String toString() { - return "FriendshipRepositoryChangeResponseFriendshipStatus{" + - "following=" + following + - ", followedBy=" + followedBy + - ", blocking=" + blocking + - ", muting=" + muting + - ", isPrivate=" + isPrivate + - ", incomingRequest=" + incomingRequest + - ", outgoingRequest=" + outgoingRequest + - ", isBestie=" + isBestie + - '}'; - } -} diff --git a/app/src/main/java/awais/instagrabber/repositories/responses/FriendshipRepoChangeRootResponse.java b/app/src/main/java/awais/instagrabber/repositories/responses/FriendshipRepoChangeRootResponse.java deleted file mode 100644 index 0d0de816..00000000 --- a/app/src/main/java/awais/instagrabber/repositories/responses/FriendshipRepoChangeRootResponse.java +++ /dev/null @@ -1,28 +0,0 @@ -package awais.instagrabber.repositories.responses; - -public class FriendshipRepoChangeRootResponse { - private FriendshipRepoChangeResponseFriendshipStatus friendshipStatus; - private String status; - - public FriendshipRepoChangeRootResponse(final FriendshipRepoChangeResponseFriendshipStatus friendshipStatus, - final String status) { - this.friendshipStatus = friendshipStatus; - this.status = status; - } - - public FriendshipRepoChangeResponseFriendshipStatus getFriendshipStatus() { - return friendshipStatus; - } - - public String getStatus() { - return status; - } - - @Override - public String toString() { - return "FriendshipRepositoryChangeResponseRootObject{" + - "friendshipStatus=" + friendshipStatus + - ", status='" + status + '\'' + - '}'; - } -} diff --git a/app/src/main/java/awais/instagrabber/repositories/responses/FriendshipRepoRestrictResponseFriendshipStatus.java b/app/src/main/java/awais/instagrabber/repositories/responses/FriendshipRepoRestrictResponseFriendshipStatus.java deleted file mode 100644 index 2a84eed0..00000000 --- a/app/src/main/java/awais/instagrabber/repositories/responses/FriendshipRepoRestrictResponseFriendshipStatus.java +++ /dev/null @@ -1,40 +0,0 @@ -package awais.instagrabber.repositories.responses; - -import androidx.annotation.NonNull; - -public class FriendshipRepoRestrictResponseFriendshipStatus extends FriendshipRepoChangeResponseFriendshipStatus { - private boolean isRestricted; - - public FriendshipRepoRestrictResponseFriendshipStatus(final boolean following, - final boolean followedBy, - final boolean blocking, - final boolean muting, - final boolean isPrivate, - final boolean incomingRequest, - final boolean outgoingRequest, - final boolean isBestie, - final boolean isRestricted) { - super(following, followedBy, blocking, muting, isPrivate, incomingRequest, outgoingRequest, isBestie); - this.isRestricted = isRestricted; - } - - public boolean isRestricted() { - return isRestricted; - } - - @NonNull - @Override - public String toString() { - return "FriendshipRepoRestrictResponseFriendshipStatus{" + - "following=" + isFollowing() + - ", followedBy=" + isFollowedBy() + - ", blocking=" + isBlocking() + - ", muting=" + isMuting() + - ", isPrivate=" + isPrivate() + - ", incomingRequest=" + isIncomingRequest() + - ", outgoingRequest=" + isOutgoingRequest() + - ", isBestie=" + isBestie() + - ", isRestricted=" + isRestricted() + - '}'; - } -} diff --git a/app/src/main/java/awais/instagrabber/repositories/responses/FriendshipRepoRestrictResponseUsersItem.java b/app/src/main/java/awais/instagrabber/repositories/responses/FriendshipRepoRestrictResponseUsersItem.java deleted file mode 100644 index 3bb65d17..00000000 --- a/app/src/main/java/awais/instagrabber/repositories/responses/FriendshipRepoRestrictResponseUsersItem.java +++ /dev/null @@ -1,65 +0,0 @@ -package awais.instagrabber.repositories.responses; - -import androidx.annotation.NonNull; - -public class FriendshipRepoRestrictResponseUsersItem { - private long pk; - private String username; - private String fullName; - private boolean isPrivate; - private String profilePicUrl; - private FriendshipRepoRestrictResponseFriendshipStatus friendshipStatus; - private boolean isVerified; - - public FriendshipRepoRestrictResponseUsersItem(final long pk, final String username, final String fullName, final boolean isPrivate, final String profilePicUrl, final FriendshipRepoRestrictResponseFriendshipStatus friendshipStatus, final boolean isVerified) { - this.pk = pk; - this.username = username; - this.fullName = fullName; - this.isPrivate = isPrivate; - this.profilePicUrl = profilePicUrl; - this.friendshipStatus = friendshipStatus; - this.isVerified = isVerified; - } - - public long getPk() { - return pk; - } - - public String getUsername() { - return username; - } - - public String getFullName() { - return fullName; - } - - public boolean isPrivate() { - return isPrivate; - } - - public String getProfilePicUrl() { - return profilePicUrl; - } - - public FriendshipRepoRestrictResponseFriendshipStatus getFriendshipStatus() { - return friendshipStatus; - } - - public boolean isVerified() { - return isVerified; - } - - @NonNull - @Override - public String toString() { - return "FriendshipRepoRestrictResponseUsersItem{" + - "pk=" + pk + - ", username='" + username + '\'' + - ", fullName='" + fullName + '\'' + - ", isPrivate=" + isPrivate + - ", profilePicUrl='" + profilePicUrl + '\'' + - ", friendshipStatus=" + friendshipStatus + - ", isVerified=" + isVerified + - '}'; - } -} diff --git a/app/src/main/java/awais/instagrabber/repositories/responses/FriendshipRepoRestrictRootResponse.java b/app/src/main/java/awais/instagrabber/repositories/responses/FriendshipRestrictResponse.java similarity index 52% rename from app/src/main/java/awais/instagrabber/repositories/responses/FriendshipRepoRestrictRootResponse.java rename to app/src/main/java/awais/instagrabber/repositories/responses/FriendshipRestrictResponse.java index 51955f7a..20518d8d 100644 --- a/app/src/main/java/awais/instagrabber/repositories/responses/FriendshipRepoRestrictRootResponse.java +++ b/app/src/main/java/awais/instagrabber/repositories/responses/FriendshipRestrictResponse.java @@ -4,16 +4,16 @@ import androidx.annotation.NonNull; import java.util.List; -public class FriendshipRepoRestrictRootResponse { - private List users; - private String status; +public class FriendshipRestrictResponse { + private final List users; + private final String status; - public FriendshipRepoRestrictRootResponse(final List users, final String status) { + public FriendshipRestrictResponse(final List users, final String status) { this.users = users; this.status = status; } - public List getUsers() { + public List getUsers() { return users; } @@ -24,7 +24,7 @@ public class FriendshipRepoRestrictRootResponse { @NonNull @Override public String toString() { - return "FriendshipRepoRestrictRootResponse{" + + return "FriendshipRestrictResponse{" + "users=" + users + ", status='" + status + '\'' + '}'; diff --git a/app/src/main/java/awais/instagrabber/repositories/responses/directmessages/DirectUserFriendshipStatus.java b/app/src/main/java/awais/instagrabber/repositories/responses/FriendshipStatus.java similarity index 53% rename from app/src/main/java/awais/instagrabber/repositories/responses/directmessages/DirectUserFriendshipStatus.java rename to app/src/main/java/awais/instagrabber/repositories/responses/FriendshipStatus.java index 10d5089d..22833bfa 100644 --- a/app/src/main/java/awais/instagrabber/repositories/responses/directmessages/DirectUserFriendshipStatus.java +++ b/app/src/main/java/awais/instagrabber/repositories/responses/FriendshipStatus.java @@ -1,41 +1,59 @@ -package awais.instagrabber.repositories.responses.directmessages; +package awais.instagrabber.repositories.responses; import androidx.annotation.NonNull; import java.io.Serializable; -public class DirectUserFriendshipStatus implements Serializable { +public class FriendshipStatus implements Serializable { private final boolean following; + private final boolean followedBy; private final boolean blocking; + private final boolean muting; private final boolean isPrivate; private final boolean incomingRequest; private final boolean outgoingRequest; private final boolean isBestie; private final boolean isRestricted; + private final boolean isMutingReel; - public DirectUserFriendshipStatus(final boolean following, - final boolean blocking, - final boolean isPrivate, - final boolean incomingRequest, - final boolean outgoingRequest, - final boolean isBestie, final boolean isRestricted) { + public FriendshipStatus(final boolean following, + final boolean followedBy, + final boolean blocking, + final boolean muting, + final boolean isPrivate, + final boolean incomingRequest, + final boolean outgoingRequest, + final boolean isBestie, + final boolean isRestricted, + final boolean isMutingReel) { this.following = following; + this.followedBy = followedBy; this.blocking = blocking; + this.muting = muting; this.isPrivate = isPrivate; this.incomingRequest = incomingRequest; this.outgoingRequest = outgoingRequest; this.isBestie = isBestie; this.isRestricted = isRestricted; + this.isMutingReel = isMutingReel; } public boolean isFollowing() { return following; } + public boolean isFollowedBy() { + return followedBy; + } + public boolean isBlocking() { return blocking; } + public boolean isMuting() { + return muting; + } + public boolean isPrivate() { return isPrivate; } @@ -56,17 +74,24 @@ public class DirectUserFriendshipStatus implements Serializable { return isRestricted; } + public boolean isMutingReel() { + return isMutingReel; + } + @NonNull @Override public String toString() { - return "DirectInboxFeedResponseFriendshipStatus{" + + return "FriendshipStatus{" + "following=" + following + + ", followedBy=" + followedBy + ", blocking=" + blocking + + ", muting=" + muting + ", isPrivate=" + isPrivate + ", incomingRequest=" + incomingRequest + ", outgoingRequest=" + outgoingRequest + ", isBestie=" + isBestie + - ", isRestricted" + isRestricted + + ", isRestricted=" + isRestricted + + ", isMutingReel=" + isMutingReel + '}'; } } diff --git a/app/src/main/java/awais/instagrabber/repositories/responses/GraphQLUserListFetchResponse.java b/app/src/main/java/awais/instagrabber/repositories/responses/GraphQLUserListFetchResponse.java index ebcd93b6..5a0587a2 100644 --- a/app/src/main/java/awais/instagrabber/repositories/responses/GraphQLUserListFetchResponse.java +++ b/app/src/main/java/awais/instagrabber/repositories/responses/GraphQLUserListFetchResponse.java @@ -5,17 +5,16 @@ import androidx.annotation.NonNull; import java.util.List; import java.util.Objects; -import awais.instagrabber.models.ProfileModel; import awais.instagrabber.utils.TextUtils; public class GraphQLUserListFetchResponse { private String nextMaxId; private String status; - private List items; + private List items; public GraphQLUserListFetchResponse(final String nextMaxId, final String status, - final List items) { + final List items) { this.nextMaxId = nextMaxId; this.status = status; this.items = items; @@ -43,11 +42,11 @@ public class GraphQLUserListFetchResponse { return this; } - public List getItems() { + public List getItems() { return items; } - public GraphQLUserListFetchResponse setItems(final List items) { + public GraphQLUserListFetchResponse setItems(final List items) { this.items = items; return this; } diff --git a/app/src/main/java/awais/instagrabber/repositories/responses/directmessages/ImageVersions2.java b/app/src/main/java/awais/instagrabber/repositories/responses/ImageVersions2.java similarity index 67% rename from app/src/main/java/awais/instagrabber/repositories/responses/directmessages/ImageVersions2.java rename to app/src/main/java/awais/instagrabber/repositories/responses/ImageVersions2.java index 32fa2ec2..1dd3d743 100644 --- a/app/src/main/java/awais/instagrabber/repositories/responses/directmessages/ImageVersions2.java +++ b/app/src/main/java/awais/instagrabber/repositories/responses/ImageVersions2.java @@ -1,8 +1,9 @@ -package awais.instagrabber.repositories.responses.directmessages; +package awais.instagrabber.repositories.responses; +import java.io.Serializable; import java.util.List; -public class ImageVersions2 { +public class ImageVersions2 implements Serializable { private final List candidates; public ImageVersions2(final List candidates) { diff --git a/app/src/main/java/awais/instagrabber/repositories/responses/LikersResponse.java b/app/src/main/java/awais/instagrabber/repositories/responses/LikersResponse.java new file mode 100644 index 00000000..da750b04 --- /dev/null +++ b/app/src/main/java/awais/instagrabber/repositories/responses/LikersResponse.java @@ -0,0 +1,27 @@ +package awais.instagrabber.repositories.responses; + +import java.util.List; + +public class LikersResponse { + private final List users; + private final long userCount; + private final String status; + + public LikersResponse(final List users, final long userCount, final String status) { + this.users = users; + this.userCount = userCount; + this.status = status; + } + + public List getUsers() { + return users; + } + + public long getUserCount() { + return userCount; + } + + public String getStatus() { + return status; + } +} diff --git a/app/src/main/java/awais/instagrabber/repositories/responses/directmessages/DirectItemLocation.java b/app/src/main/java/awais/instagrabber/repositories/responses/Location.java similarity index 65% rename from app/src/main/java/awais/instagrabber/repositories/responses/directmessages/DirectItemLocation.java rename to app/src/main/java/awais/instagrabber/repositories/responses/Location.java index 27e1c9b3..e7a13362 100644 --- a/app/src/main/java/awais/instagrabber/repositories/responses/directmessages/DirectItemLocation.java +++ b/app/src/main/java/awais/instagrabber/repositories/responses/Location.java @@ -1,6 +1,8 @@ -package awais.instagrabber.repositories.responses.directmessages; +package awais.instagrabber.repositories.responses; -public class DirectItemLocation { +import java.io.Serializable; + +public class Location implements Serializable { private final long pk; private final String shortName; private final String name; @@ -9,13 +11,13 @@ public class DirectItemLocation { private final float lng; private final float lat; - public DirectItemLocation(final long pk, - final String shortName, - final String name, - final String address, - final String city, - final float lng, - final float lat) { + public Location(final long pk, + final String shortName, + final String name, + final String address, + final String city, + final float lng, + final float lat) { this.pk = pk; this.shortName = shortName; this.name = name; diff --git a/app/src/main/java/awais/instagrabber/repositories/responses/LocationFeedResponse.java b/app/src/main/java/awais/instagrabber/repositories/responses/LocationFeedResponse.java new file mode 100644 index 00000000..1138208d --- /dev/null +++ b/app/src/main/java/awais/instagrabber/repositories/responses/LocationFeedResponse.java @@ -0,0 +1,57 @@ +package awais.instagrabber.repositories.responses; + +import java.util.List; + +public class LocationFeedResponse { + private final int numResults; + private final String nextMaxId; + private final boolean moreAvailable; + private final long mediaCount; + private final String status; + private final List items; + private final Location location; + + public LocationFeedResponse(final int numResults, + final String nextMaxId, + final boolean moreAvailable, + final long mediaCount, + final String status, + final List items, + final Location location) { + this.numResults = numResults; + this.nextMaxId = nextMaxId; + this.moreAvailable = moreAvailable; + this.mediaCount = mediaCount; + this.status = status; + this.items = items; + this.location = location; + } + + public int getNumResults() { + return numResults; + } + + public String getNextMaxId() { + return nextMaxId; + } + + public boolean isMoreAvailable() { + return moreAvailable; + } + + public String getStatus() { + return status; + } + + public List getItems() { + return items; + } + + public long getMediaCount() { + return mediaCount; + } + + public Location getLocation() { + return location; + } +} diff --git a/app/src/main/java/awais/instagrabber/repositories/responses/Media.java b/app/src/main/java/awais/instagrabber/repositories/responses/Media.java new file mode 100644 index 00000000..a3c7bf12 --- /dev/null +++ b/app/src/main/java/awais/instagrabber/repositories/responses/Media.java @@ -0,0 +1,261 @@ +package awais.instagrabber.repositories.responses; + +import java.io.Serializable; +import java.util.Date; +import java.util.List; +import java.util.Map; + +import awais.instagrabber.models.enums.MediaItemType; +import awais.instagrabber.utils.Utils; + +public class Media implements Serializable { + private final String pk; + private final String id; + private final String code; + private final long takenAt; + private final User user; + private final MediaItemType mediaType; + private final boolean canViewerReshare; + private final boolean commentLikesEnabled; + private final long nextMaxId; + private final long commentCount; + private final ImageVersions2 imageVersions2; + private final int originalWidth; + private final int originalHeight; + private long likeCount; + private boolean hasLiked; + private final boolean isReelMedia; + private final List videoVersions; + private final boolean hasAudio; + private final double videoDuration; + private final long viewCount; + private final Caption caption; + private final boolean canViewerSave; + private final Audio audio; + private final String title; + private final Location location; + private final Usertags usertags; + private final List carouselMedia; + private boolean isSidecarChild; + private boolean hasViewerSaved; + private final Map injected; + private final EndOfFeedDemarcator endOfFeedDemarcator; + + private String dateString; + + public Media(final String pk, + final String id, + final String code, + final long takenAt, + final User user, + final boolean canViewerReshare, + final ImageVersions2 imageVersions2, + final int originalWidth, + final int originalHeight, + final MediaItemType mediaType, + final boolean commentLikesEnabled, + final long nextMaxId, + final long commentCount, + final long likeCount, + final boolean hasLiked, + final boolean isReelMedia, + final List videoVersions, + final boolean hasAudio, + final double videoDuration, + final long viewCount, + final Caption caption, + final boolean canViewerSave, + final Audio audio, + final String title, + final List carouselMedia, + final Location location, + final Usertags usertags, + final boolean isSidecarChild, + final boolean hasViewerSaved, + final Map injected, + final EndOfFeedDemarcator endOfFeedDemarcator) { + this.pk = pk; + this.id = id; + this.code = code; + this.takenAt = takenAt; + this.user = user; + this.canViewerReshare = canViewerReshare; + this.imageVersions2 = imageVersions2; + this.originalWidth = originalWidth; + this.originalHeight = originalHeight; + this.mediaType = mediaType; + this.commentLikesEnabled = commentLikesEnabled; + this.nextMaxId = nextMaxId; + this.commentCount = commentCount; + this.likeCount = likeCount; + this.hasLiked = hasLiked; + this.isReelMedia = isReelMedia; + this.videoVersions = videoVersions; + this.hasAudio = hasAudio; + this.videoDuration = videoDuration; + this.viewCount = viewCount; + this.caption = caption; + this.canViewerSave = canViewerSave; + this.audio = audio; + this.title = title; + this.carouselMedia = carouselMedia; + this.location = location; + this.usertags = usertags; + this.isSidecarChild = isSidecarChild; + this.hasViewerSaved = hasViewerSaved; + this.injected = injected; + this.endOfFeedDemarcator = endOfFeedDemarcator; + } + + public String getPk() { + return pk; + } + + public String getId() { + return id; + } + + public String getCode() { + return code; + } + + public long getTakenAt() { + return takenAt; + } + + public User getUser() { + return user; + } + + public boolean canViewerReshare() { + return canViewerReshare; + } + + public ImageVersions2 getImageVersions2() { + return imageVersions2; + } + + public int getOriginalWidth() { + return originalWidth; + } + + public int getOriginalHeight() { + return originalHeight; + } + + public MediaItemType getMediaType() { + return mediaType; + } + + public boolean isReelMedia() { + return isReelMedia; + } + + public List getVideoVersions() { + return videoVersions; + } + + public boolean isHasAudio() { + return hasAudio; + } + + public Caption getCaption() { + return caption; + } + + public Audio getAudio() { + return audio; + } + + public String getTitle() { + return title; + } + + public List getCarouselMedia() { + return carouselMedia; + } + + public boolean isCommentLikesEnabled() { + return commentLikesEnabled; + } + + public long getNextMaxId() { + return nextMaxId; + } + + public long getCommentCount() { + return commentCount; + } + + public long getLikeCount() { + return likeCount; + } + + public boolean hasLiked() { + return hasLiked; + } + + public double getVideoDuration() { + return videoDuration; + } + + public long getViewCount() { + return viewCount; + } + + public boolean canViewerSave() { + return canViewerSave; + } + + public Location getLocation() { + return location; + } + + public Usertags getUsertags() { + return usertags; + } + + public void setIsSidecarChild(boolean isSidecarChild) { + this.isSidecarChild = isSidecarChild; + } + + public boolean isSidecarChild() { + return isSidecarChild; + } + + public boolean hasViewerSaved() { + return hasViewerSaved; + } + + public boolean isInjected() { + return injected != null; + } + + public String getDate() { + if (dateString == null) { + dateString = Utils.datetimeParser.format(new Date(takenAt * 1000L)); + } + return dateString; + } + + public EndOfFeedDemarcator getEndOfFeedDemarcator() { + return endOfFeedDemarcator; + } + + public void setHasLiked(final boolean liked) { + this.hasLiked = liked; + } + + public void setLikeCount(final long likeCount) { + this.likeCount = likeCount; + } + + public void setHasViewerSaved(final boolean hasViewerSaved) { + this.hasViewerSaved = hasViewerSaved; + } + + public void setPostCaption(final String caption) { + final Caption caption1 = getCaption(); + caption1.setText(caption); + } +} diff --git a/app/src/main/java/awais/instagrabber/repositories/responses/directmessages/MediaCandidate.java b/app/src/main/java/awais/instagrabber/repositories/responses/MediaCandidate.java similarity index 60% rename from app/src/main/java/awais/instagrabber/repositories/responses/directmessages/MediaCandidate.java rename to app/src/main/java/awais/instagrabber/repositories/responses/MediaCandidate.java index f7d48d34..41d05a10 100644 --- a/app/src/main/java/awais/instagrabber/repositories/responses/directmessages/MediaCandidate.java +++ b/app/src/main/java/awais/instagrabber/repositories/responses/MediaCandidate.java @@ -1,9 +1,11 @@ -package awais.instagrabber.repositories.responses.directmessages; +package awais.instagrabber.repositories.responses; -public class MediaCandidate { - private int width; - private int height; - private String url; +import java.io.Serializable; + +public class MediaCandidate implements Serializable { + private final int width; + private final int height; + private final String url; public MediaCandidate(final int width, final int height, final String url) { this.width = width; diff --git a/app/src/main/java/awais/instagrabber/repositories/responses/MediaInfoResponse.java b/app/src/main/java/awais/instagrabber/repositories/responses/MediaInfoResponse.java new file mode 100644 index 00000000..2112f48c --- /dev/null +++ b/app/src/main/java/awais/instagrabber/repositories/responses/MediaInfoResponse.java @@ -0,0 +1,15 @@ +package awais.instagrabber.repositories.responses; + +import java.util.List; + +public class MediaInfoResponse { + private final List items; + + public MediaInfoResponse(final List items) { + this.items = items; + } + + public List getItems() { + return items; + } +} diff --git a/app/src/main/java/awais/instagrabber/repositories/responses/PostsFetchResponse.java b/app/src/main/java/awais/instagrabber/repositories/responses/PostsFetchResponse.java index 56ce0570..c5b24016 100644 --- a/app/src/main/java/awais/instagrabber/repositories/responses/PostsFetchResponse.java +++ b/app/src/main/java/awais/instagrabber/repositories/responses/PostsFetchResponse.java @@ -2,20 +2,18 @@ package awais.instagrabber.repositories.responses; import java.util.List; -import awais.instagrabber.models.FeedModel; - public class PostsFetchResponse { - private List feedModels; - private boolean hasNextPage; - private String nextCursor; + private final List feedModels; + private final boolean hasNextPage; + private final String nextCursor; - public PostsFetchResponse(final List feedModels, final boolean hasNextPage, final String nextCursor) { + public PostsFetchResponse(final List feedModels, final boolean hasNextPage, final String nextCursor) { this.feedModels = feedModels; this.hasNextPage = hasNextPage; this.nextCursor = nextCursor; } - public List getFeedModels() { + public List getFeedModels() { return feedModels; } diff --git a/app/src/main/java/awais/instagrabber/repositories/responses/TagFeedResponse.java b/app/src/main/java/awais/instagrabber/repositories/responses/TagFeedResponse.java new file mode 100644 index 00000000..f597beea --- /dev/null +++ b/app/src/main/java/awais/instagrabber/repositories/responses/TagFeedResponse.java @@ -0,0 +1,43 @@ +package awais.instagrabber.repositories.responses; + +import java.util.List; + +public class TagFeedResponse { + private final int numResults; + private final String nextMaxId; + private final boolean moreAvailable; + private final String status; + private final List items; + + public TagFeedResponse(final int numResults, + final String nextMaxId, + final boolean moreAvailable, + final String status, + final List items) { + this.numResults = numResults; + this.nextMaxId = nextMaxId; + this.moreAvailable = moreAvailable; + this.status = status; + this.items = items; + } + + public int getNumResults() { + return numResults; + } + + public String getNextMaxId() { + return nextMaxId; + } + + public boolean isMoreAvailable() { + return moreAvailable; + } + + public String getStatus() { + return status; + } + + public List getItems() { + return items; + } +} diff --git a/app/src/main/java/awais/instagrabber/repositories/responses/User.java b/app/src/main/java/awais/instagrabber/repositories/responses/User.java new file mode 100644 index 00000000..65646392 --- /dev/null +++ b/app/src/main/java/awais/instagrabber/repositories/responses/User.java @@ -0,0 +1,219 @@ +package awais.instagrabber.repositories.responses; + +import java.io.Serializable; +import java.util.Objects; + +public class User implements Serializable { + private final long pk; + private final String username; + private final String fullName; + private final boolean isPrivate; + private final String profilePicUrl; + private final String profilePicId; + private final FriendshipStatus friendshipStatus; + private final boolean isVerified; + private final boolean hasAnonymousProfilePicture; + private final boolean isUnpublished; + private final boolean isFavorite; + private final boolean isDirectappInstalled; + private final String reelAutoArchive; + private final String allowedCommenterType; + private final long mediaCount; + private final long followerCount; + private final long followingCount; + private final long followingTagCount; + private final String biography; + private final String externalUrl; + private final long usertagsCount; + private final String publicEmail; + + + public User(final long pk, + final String username, + final String fullName, + final boolean isPrivate, + final String profilePicUrl, + final String profilePicId, + final FriendshipStatus friendshipStatus, + final boolean isVerified, + final boolean hasAnonymousProfilePicture, + final boolean isUnpublished, + final boolean isFavorite, + final boolean isDirectappInstalled, + final String reelAutoArchive, + final String allowedCommenterType, + final long mediaCount, + final long followerCount, + final long followingCount, + final long followingTagCount, + final String biography, + final String externalUrl, + final long usertagsCount, + final String publicEmail) { + this.pk = pk; + this.username = username; + this.fullName = fullName; + this.isPrivate = isPrivate; + this.profilePicUrl = profilePicUrl; + this.profilePicId = profilePicId; + this.friendshipStatus = friendshipStatus; + this.isVerified = isVerified; + this.hasAnonymousProfilePicture = hasAnonymousProfilePicture; + this.isUnpublished = isUnpublished; + this.isFavorite = isFavorite; + this.isDirectappInstalled = isDirectappInstalled; + this.reelAutoArchive = reelAutoArchive; + this.allowedCommenterType = allowedCommenterType; + this.mediaCount = mediaCount; + this.followerCount = followerCount; + this.followingCount = followingCount; + this.followingTagCount = followingTagCount; + this.biography = biography; + this.externalUrl = externalUrl; + this.usertagsCount = usertagsCount; + this.publicEmail = publicEmail; + } + + public long getPk() { + return pk; + } + + public String getUsername() { + return username; + } + + public String getFullName() { + return fullName; + } + + public boolean isPrivate() { + return isPrivate; + } + + public String getProfilePicUrl() { + return profilePicUrl; + } + + public String getProfilePicId() { + return profilePicId; + } + + public FriendshipStatus getFriendshipStatus() { + return friendshipStatus; + } + + public boolean isVerified() { + return isVerified; + } + + public boolean hasAnonymousProfilePicture() { + return hasAnonymousProfilePicture; + } + + public boolean isUnpublished() { + return isUnpublished; + } + + public boolean isFavorite() { + return isFavorite; + } + + public boolean isDirectappInstalled() { + return isDirectappInstalled; + } + + public String getReelAutoArchive() { + return reelAutoArchive; + } + + public String getAllowedCommenterType() { + return allowedCommenterType; + } + + public long getMediaCount() { + return mediaCount; + } + + public long getFollowerCount() { + return followerCount; + } + + public long getFollowingCount() { + return followingCount; + } + + public long getFollowingTagCount() { + return followingTagCount; + } + + public String getBiography() { + return biography; + } + + public String getExternalUrl() { + return externalUrl; + } + + public long getUsertagsCount() { + return usertagsCount; + } + + public String getPublicEmail() { + return publicEmail; + } + + // public boolean isReallyPrivate() { + // final FriendshipStatus friendshipStatus = getFriendshipStatus(); + // !user.optBoolean("followed_by_viewer") && (id != uid && isPrivate) + // } + + // public static User fromProfileModel(final ProfileModel profileModel) { + // return new User( + // Long.parseLong(profileModel.getId()), + // profileModel.getUsername(), + // profileModel.getName(), + // profileModel.isPrivate(), + // profileModel.getSdProfilePic(), + // null, + // new FriendshipStatus( + // profileModel.isFollowing(), + // false, + // profileModel.isBlocked(), + // false, + // profileModel.isPrivate(), + // false, + // profileModel.isRequested(), + // false, + // profileModel.isRestricted(), + // false), + // profileModel.isVerified(), + // false, + // false, + // false, + // false, + // null, + // null, + // profileModel.getPostCount(), + // profileModel.getFollowersCount(), + // profileModel.getFollowingCount(), + // 0, + // profileModel.getBiography(), + // profileModel.getUrl(), + // 0, + // null); + // } + + @Override + public boolean equals(final Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + final User that = (User) o; + return pk == that.pk && + Objects.equals(username, that.username); + } + + @Override + public int hashCode() { + return Objects.hash(pk, username); + } +} diff --git a/app/src/main/java/awais/instagrabber/repositories/responses/UserFeedResponse.java b/app/src/main/java/awais/instagrabber/repositories/responses/UserFeedResponse.java new file mode 100644 index 00000000..bc912bed --- /dev/null +++ b/app/src/main/java/awais/instagrabber/repositories/responses/UserFeedResponse.java @@ -0,0 +1,43 @@ +package awais.instagrabber.repositories.responses; + +import java.util.List; + +public class UserFeedResponse { + private final int numResults; + private final String nextMaxId; + private final boolean moreAvailable; + private final String status; + private final List items; + + public UserFeedResponse(final int numResults, + final String nextMaxId, + final boolean moreAvailable, + final String status, + final List items) { + this.numResults = numResults; + this.nextMaxId = nextMaxId; + this.moreAvailable = moreAvailable; + this.status = status; + this.items = items; + } + + public int getNumResults() { + return numResults; + } + + public String getNextMaxId() { + return nextMaxId; + } + + public boolean isMoreAvailable() { + return moreAvailable; + } + + public String getStatus() { + return status; + } + + public List getItems() { + return items; + } +} diff --git a/app/src/main/java/awais/instagrabber/repositories/responses/UserInfo.java b/app/src/main/java/awais/instagrabber/repositories/responses/UserInfo.java index 995beab9..d85f5161 100644 --- a/app/src/main/java/awais/instagrabber/repositories/responses/UserInfo.java +++ b/app/src/main/java/awais/instagrabber/repositories/responses/UserInfo.java @@ -1,10 +1,10 @@ package awais.instagrabber.repositories.responses; public class UserInfo { - private final String pk; + private final long pk; private final String username, fullName, profilePicUrl, hdProfilePicUrl; - public UserInfo(final String pk, + public UserInfo(final long pk, final String username, final String fullName, final String profilePicUrl, @@ -16,7 +16,7 @@ public class UserInfo { this.hdProfilePicUrl = hdProfilePicUrl; } - public String getPk() { + public long getPk() { return pk; } diff --git a/app/src/main/java/awais/instagrabber/repositories/responses/UserSearchResponse.java b/app/src/main/java/awais/instagrabber/repositories/responses/UserSearchResponse.java index fccf0ae0..a9490a33 100644 --- a/app/src/main/java/awais/instagrabber/repositories/responses/UserSearchResponse.java +++ b/app/src/main/java/awais/instagrabber/repositories/responses/UserSearchResponse.java @@ -2,15 +2,13 @@ package awais.instagrabber.repositories.responses; import java.util.List; -import awais.instagrabber.repositories.responses.directmessages.DirectUser; - public class UserSearchResponse { private final int numResults; - private final List users; + private final List users; private final boolean hasMore; private final String status; - public UserSearchResponse(final int numResults, final List users, final boolean hasMore, final String status) { + public UserSearchResponse(final int numResults, final List users, final boolean hasMore, final String status) { this.numResults = numResults; this.users = users; this.hasMore = hasMore; @@ -21,7 +19,7 @@ public class UserSearchResponse { return numResults; } - public List getUsers() { + public List getUsers() { return users; } diff --git a/app/src/main/java/awais/instagrabber/repositories/responses/UsertagIn.java b/app/src/main/java/awais/instagrabber/repositories/responses/UsertagIn.java new file mode 100644 index 00000000..f634475d --- /dev/null +++ b/app/src/main/java/awais/instagrabber/repositories/responses/UsertagIn.java @@ -0,0 +1,22 @@ +package awais.instagrabber.repositories.responses; + +import java.io.Serializable; +import java.util.List; + +public class UsertagIn implements Serializable { + private final User user; + private final List position; + + public UsertagIn(final User user, final List position) { + this.user = user; + this.position = position; + } + + public User getUser() { + return user; + } + + public List getPosition() { + return position; + } +} diff --git a/app/src/main/java/awais/instagrabber/repositories/responses/Usertags.java b/app/src/main/java/awais/instagrabber/repositories/responses/Usertags.java new file mode 100644 index 00000000..17e60419 --- /dev/null +++ b/app/src/main/java/awais/instagrabber/repositories/responses/Usertags.java @@ -0,0 +1,16 @@ +package awais.instagrabber.repositories.responses; + +import java.io.Serializable; +import java.util.List; + +public class Usertags implements Serializable { + private final List in; + + public Usertags(final List in) { + this.in = in; + } + + public List getIn() { + return in; + } +} diff --git a/app/src/main/java/awais/instagrabber/repositories/responses/directmessages/VideoVersion.java b/app/src/main/java/awais/instagrabber/repositories/responses/VideoVersion.java similarity index 83% rename from app/src/main/java/awais/instagrabber/repositories/responses/directmessages/VideoVersion.java rename to app/src/main/java/awais/instagrabber/repositories/responses/VideoVersion.java index c73ea79c..52d2f53a 100644 --- a/app/src/main/java/awais/instagrabber/repositories/responses/directmessages/VideoVersion.java +++ b/app/src/main/java/awais/instagrabber/repositories/responses/VideoVersion.java @@ -1,6 +1,8 @@ -package awais.instagrabber.repositories.responses.directmessages; +package awais.instagrabber.repositories.responses; -public class VideoVersion { +import java.io.Serializable; + +public class VideoVersion implements Serializable { private final String id; private final String type; private final int width; diff --git a/app/src/main/java/awais/instagrabber/repositories/responses/directmessages/Caption.java b/app/src/main/java/awais/instagrabber/repositories/responses/directmessages/Caption.java deleted file mode 100644 index c9532d9d..00000000 --- a/app/src/main/java/awais/instagrabber/repositories/responses/directmessages/Caption.java +++ /dev/null @@ -1,25 +0,0 @@ -package awais.instagrabber.repositories.responses.directmessages; - -public class Caption { - private final long pk; - private final long userId; - private final String text; - - public Caption(final long pk, final long userId, final String text) { - this.pk = pk; - this.userId = userId; - this.text = text; - } - - public long getPk() { - return pk; - } - - public long getUserId() { - return userId; - } - - public String getText() { - return text; - } -} diff --git a/app/src/main/java/awais/instagrabber/repositories/responses/directmessages/DirectInboxResponse.java b/app/src/main/java/awais/instagrabber/repositories/responses/directmessages/DirectInboxResponse.java index 0155f425..1a8a5401 100644 --- a/app/src/main/java/awais/instagrabber/repositories/responses/directmessages/DirectInboxResponse.java +++ b/app/src/main/java/awais/instagrabber/repositories/responses/directmessages/DirectInboxResponse.java @@ -1,20 +1,22 @@ package awais.instagrabber.repositories.responses.directmessages; +import awais.instagrabber.repositories.responses.User; + public class DirectInboxResponse { - private final DirectUser viewer; + private final User viewer; private final DirectInbox inbox; private final long seqId; private final long snapshotAtMs; private final int pendingRequestsTotal; - private final DirectUser mostRecentInviter; + private final User mostRecentInviter; private final String status; - public DirectInboxResponse(final DirectUser viewer, + public DirectInboxResponse(final User viewer, final DirectInbox inbox, final long seqId, final long snapshotAtMs, final int pendingRequestsTotal, - final DirectUser mostRecentInviter, + final User mostRecentInviter, final String status) { this.viewer = viewer; this.inbox = inbox; @@ -25,7 +27,7 @@ public class DirectInboxResponse { this.status = status; } - public DirectUser getViewer() { + public User getViewer() { return viewer; } @@ -45,7 +47,7 @@ public class DirectInboxResponse { return pendingRequestsTotal; } - public DirectUser getMostRecentInviter() { + public User getMostRecentInviter() { return mostRecentInviter; } diff --git a/app/src/main/java/awais/instagrabber/repositories/responses/directmessages/DirectItem.java b/app/src/main/java/awais/instagrabber/repositories/responses/directmessages/DirectItem.java index 1bf95be7..1b2e9292 100644 --- a/app/src/main/java/awais/instagrabber/repositories/responses/directmessages/DirectItem.java +++ b/app/src/main/java/awais/instagrabber/repositories/responses/directmessages/DirectItem.java @@ -6,6 +6,9 @@ import java.util.Date; import java.util.List; import awais.instagrabber.models.enums.DirectItemType; +import awais.instagrabber.repositories.responses.Location; +import awais.instagrabber.repositories.responses.Media; +import awais.instagrabber.repositories.responses.User; public class DirectItem implements Cloneable { private final String itemId; @@ -18,11 +21,11 @@ public class DirectItem implements Cloneable { private final String clientContext; private final DirectItemReelShare reelShare; private final DirectItemStoryShare storyShare; - private final DirectItemMedia mediaShare; - private final DirectUser profile; + private final Media mediaShare; + private final User profile; private final DirectItemPlaceholder placeholder; - private final DirectItemMedia media; - private final List previewMedias; + private final Media media; + private final List previewMedias; private final DirectItemActionLog actionLog; private final DirectItemVideoCallEvent videoCallEvent; private final DirectItemClip clip; @@ -32,7 +35,7 @@ public class DirectItem implements Cloneable { private final DirectItemReactions reactions; private final DirectItem repliedToMessage; private final DirectItemVoiceMedia voiceMedia; - private final DirectItemLocation location; + private final Location location; private final int hideInThread; private Date date; private boolean isPending; @@ -47,11 +50,11 @@ public class DirectItem implements Cloneable { final String clientContext, final DirectItemReelShare reelShare, final DirectItemStoryShare storyShare, - final DirectItemMedia mediaShare, - final DirectUser profile, + final Media mediaShare, + final User profile, final DirectItemPlaceholder placeholder, - final DirectItemMedia media, - final List previewMedias, + final Media media, + final List previewMedias, final DirectItemActionLog actionLog, final DirectItemVideoCallEvent videoCallEvent, final DirectItemClip clip, @@ -61,7 +64,7 @@ public class DirectItem implements Cloneable { final DirectItemReactions reactions, final DirectItem repliedToMessage, final DirectItemVoiceMedia voiceMedia, - final DirectItemLocation location, + final Location location, final int hideInThread) { this.itemId = itemId; this.userId = userId; @@ -128,7 +131,7 @@ public class DirectItem implements Cloneable { return reelShare; } - public DirectUser getProfile() { + public User getProfile() { return profile; } @@ -136,7 +139,7 @@ public class DirectItem implements Cloneable { return placeholder; } - public DirectItemMedia getMediaShare() { + public Media getMediaShare() { return mediaShare; } @@ -144,11 +147,11 @@ public class DirectItem implements Cloneable { return like; } - public DirectItemMedia getMedia() { + public Media getMedia() { return media; } - public List getPreviewMedias() { + public List getPreviewMedias() { return previewMedias; } @@ -192,7 +195,7 @@ public class DirectItem implements Cloneable { return voiceMedia; } - public DirectItemLocation getLocation() { + public Location getLocation() { return location; } diff --git a/app/src/main/java/awais/instagrabber/repositories/responses/directmessages/DirectItemAnimatedMedia.java b/app/src/main/java/awais/instagrabber/repositories/responses/directmessages/DirectItemAnimatedMedia.java index 5a8b8c59..462052d7 100644 --- a/app/src/main/java/awais/instagrabber/repositories/responses/directmessages/DirectItemAnimatedMedia.java +++ b/app/src/main/java/awais/instagrabber/repositories/responses/directmessages/DirectItemAnimatedMedia.java @@ -1,5 +1,7 @@ package awais.instagrabber.repositories.responses.directmessages; +import awais.instagrabber.repositories.responses.AnimatedMediaImages; + public final class DirectItemAnimatedMedia { private final String id; private final AnimatedMediaImages images; diff --git a/app/src/main/java/awais/instagrabber/repositories/responses/directmessages/DirectItemClip.java b/app/src/main/java/awais/instagrabber/repositories/responses/directmessages/DirectItemClip.java index 601656f6..2bb23479 100644 --- a/app/src/main/java/awais/instagrabber/repositories/responses/directmessages/DirectItemClip.java +++ b/app/src/main/java/awais/instagrabber/repositories/responses/directmessages/DirectItemClip.java @@ -1,13 +1,15 @@ package awais.instagrabber.repositories.responses.directmessages; -public class DirectItemClip { - private final DirectItemMedia clip; +import awais.instagrabber.repositories.responses.Media; - public DirectItemClip(final DirectItemMedia clip) { +public class DirectItemClip { + private final Media clip; + + public DirectItemClip(final Media clip) { this.clip = clip; } - public DirectItemMedia getClip() { + public Media getClip() { return clip; } } diff --git a/app/src/main/java/awais/instagrabber/repositories/responses/directmessages/DirectItemFelixShare.java b/app/src/main/java/awais/instagrabber/repositories/responses/directmessages/DirectItemFelixShare.java index c660c4d8..078a3810 100644 --- a/app/src/main/java/awais/instagrabber/repositories/responses/directmessages/DirectItemFelixShare.java +++ b/app/src/main/java/awais/instagrabber/repositories/responses/directmessages/DirectItemFelixShare.java @@ -1,13 +1,15 @@ package awais.instagrabber.repositories.responses.directmessages; -public class DirectItemFelixShare { - private final DirectItemMedia video; +import awais.instagrabber.repositories.responses.Media; - public DirectItemFelixShare(final DirectItemMedia video) { +public class DirectItemFelixShare { + private final Media video; + + public DirectItemFelixShare(final Media video) { this.video = video; } - public DirectItemMedia getVideo() { + public Media getVideo() { return video; } } diff --git a/app/src/main/java/awais/instagrabber/repositories/responses/directmessages/DirectItemMedia.java b/app/src/main/java/awais/instagrabber/repositories/responses/directmessages/DirectItemMedia.java deleted file mode 100644 index ab6c0dfa..00000000 --- a/app/src/main/java/awais/instagrabber/repositories/responses/directmessages/DirectItemMedia.java +++ /dev/null @@ -1,115 +0,0 @@ -package awais.instagrabber.repositories.responses.directmessages; - -import java.util.List; - -import awais.instagrabber.models.enums.MediaItemType; - -public class DirectItemMedia { - private final String pk; - private final String id; - private final String code; - private final DirectUser user; - private final ImageVersions2 imageVersions2; - private final int originalWidth; - private final int originalHeight; - private final MediaItemType mediaType; - private final boolean isReelMedia; - private final List videoVersions; - private final boolean hasAudio; - private final Caption caption; - private final Audio audio; - private final String title; - private final List carouselMedia; - - public DirectItemMedia(final String pk, - final String id, - final String code, - final DirectUser user, - final ImageVersions2 imageVersions2, - final int originalWidth, - final int originalHeight, - final MediaItemType mediaType, - final boolean isReelMedia, - final List videoVersions, - final boolean hasAudio, - final Caption caption, - final Audio audio, - final String title, - final List carouselMedia) { - this.pk = pk; - this.id = id; - this.code = code; - this.user = user; - this.imageVersions2 = imageVersions2; - this.originalWidth = originalWidth; - this.originalHeight = originalHeight; - this.mediaType = mediaType; - this.isReelMedia = isReelMedia; - this.videoVersions = videoVersions; - this.hasAudio = hasAudio; - this.caption = caption; - this.audio = audio; - this.title = title; - this.carouselMedia = carouselMedia; - } - - public String getPk() { - return pk; - } - - public String getId() { - return id; - } - - public String getCode() { - return code; - } - - public DirectUser getUser() { - return user; - } - - public ImageVersions2 getImageVersions2() { - return imageVersions2; - } - - public int getOriginalWidth() { - return originalWidth; - } - - public int getOriginalHeight() { - return originalHeight; - } - - public MediaItemType getMediaType() { - return mediaType; - } - - public boolean isReelMedia() { - return isReelMedia; - } - - public List getVideoVersions() { - return videoVersions; - } - - public boolean isHasAudio() { - return hasAudio; - } - - public Caption getCaption() { - return caption; - } - - public Audio getAudio() { - return audio; - } - - public String getTitle() { - return title; - } - - public List getCarouselMedia() { - return carouselMedia; - } -} diff --git a/app/src/main/java/awais/instagrabber/repositories/responses/directmessages/DirectItemReelShare.java b/app/src/main/java/awais/instagrabber/repositories/responses/directmessages/DirectItemReelShare.java index 98330a62..e1142e55 100644 --- a/app/src/main/java/awais/instagrabber/repositories/responses/directmessages/DirectItemReelShare.java +++ b/app/src/main/java/awais/instagrabber/repositories/responses/directmessages/DirectItemReelShare.java @@ -1,5 +1,7 @@ package awais.instagrabber.repositories.responses.directmessages; +import awais.instagrabber.repositories.responses.Media; + public class DirectItemReelShare { private final String text; private final String type; @@ -7,7 +9,7 @@ public class DirectItemReelShare { private final long mentionedUserId; private final boolean isReelPersisted; private final String reelType; - private final DirectItemMedia media; + private final Media media; private final DirectItemReelShareReactionInfo reactionInfo; public DirectItemReelShare(final String text, @@ -16,7 +18,7 @@ public class DirectItemReelShare { final long mentionedUserId, final boolean isReelPersisted, final String reelType, - final DirectItemMedia media, + final Media media, final DirectItemReelShareReactionInfo reactionInfo) { this.text = text; this.type = type; @@ -48,7 +50,7 @@ public class DirectItemReelShare { return reelType; } - public DirectItemMedia getMedia() { + public Media getMedia() { return media; } diff --git a/app/src/main/java/awais/instagrabber/repositories/responses/directmessages/DirectItemStoryShare.java b/app/src/main/java/awais/instagrabber/repositories/responses/directmessages/DirectItemStoryShare.java index b3a7496e..8a8ea535 100644 --- a/app/src/main/java/awais/instagrabber/repositories/responses/directmessages/DirectItemStoryShare.java +++ b/app/src/main/java/awais/instagrabber/repositories/responses/directmessages/DirectItemStoryShare.java @@ -1,11 +1,13 @@ package awais.instagrabber.repositories.responses.directmessages; +import awais.instagrabber.repositories.responses.Media; + public class DirectItemStoryShare { private final String reelId; private final String reelType; private final String text; private final boolean isReelPersisted; - private final DirectItemMedia media; + private final Media media; private final String title; private final String message; @@ -13,7 +15,7 @@ public class DirectItemStoryShare { final String reelType, final String text, final boolean isReelPersisted, - final DirectItemMedia media, + final Media media, final String title, final String message) { this.reelId = reelId; @@ -41,7 +43,7 @@ public class DirectItemStoryShare { return isReelPersisted; } - public DirectItemMedia getMedia() { + public Media getMedia() { return media; } diff --git a/app/src/main/java/awais/instagrabber/repositories/responses/directmessages/DirectItemVisualMedia.java b/app/src/main/java/awais/instagrabber/repositories/responses/directmessages/DirectItemVisualMedia.java index 16e8f964..fed2184b 100644 --- a/app/src/main/java/awais/instagrabber/repositories/responses/directmessages/DirectItemVisualMedia.java +++ b/app/src/main/java/awais/instagrabber/repositories/responses/directmessages/DirectItemVisualMedia.java @@ -3,6 +3,7 @@ package awais.instagrabber.repositories.responses.directmessages; import java.util.List; import awais.instagrabber.models.enums.RavenMediaViewMode; +import awais.instagrabber.repositories.responses.Media; public class DirectItemVisualMedia { private final long urlExpireAtSecs; @@ -12,7 +13,7 @@ public class DirectItemVisualMedia { private final int seenCount; private final long replayExpiringAtUs; private final RavenExpiringMediaActionSummary expiringMediaActionSummary; - private final DirectItemMedia media; + private final Media media; public DirectItemVisualMedia(final long urlExpireAtSecs, final int playbackDurationSecs, @@ -21,7 +22,7 @@ public class DirectItemVisualMedia { final int seenCount, final long replayExpiringAtUs, final RavenExpiringMediaActionSummary expiringMediaActionSummary, - final DirectItemMedia media) { + final Media media) { this.urlExpireAtSecs = urlExpireAtSecs; this.playbackDurationSecs = playbackDurationSecs; this.seenUserIds = seenUserIds; @@ -60,7 +61,7 @@ public class DirectItemVisualMedia { return expiringMediaActionSummary; } - public DirectItemMedia getMedia() { + public Media getMedia() { return media; } } diff --git a/app/src/main/java/awais/instagrabber/repositories/responses/directmessages/DirectItemVoiceMedia.java b/app/src/main/java/awais/instagrabber/repositories/responses/directmessages/DirectItemVoiceMedia.java index 9a19d57d..c5618018 100644 --- a/app/src/main/java/awais/instagrabber/repositories/responses/directmessages/DirectItemVoiceMedia.java +++ b/app/src/main/java/awais/instagrabber/repositories/responses/directmessages/DirectItemVoiceMedia.java @@ -1,17 +1,19 @@ package awais.instagrabber.repositories.responses.directmessages; +import awais.instagrabber.repositories.responses.Media; + public class DirectItemVoiceMedia { - private final DirectItemMedia media; + private final Media media; private final int seenCount; private final String viewMode; - public DirectItemVoiceMedia(final DirectItemMedia media, final int seenCount, final String viewMode) { + public DirectItemVoiceMedia(final Media media, final int seenCount, final String viewMode) { this.media = media; this.seenCount = seenCount; this.viewMode = viewMode; } - public DirectItemMedia getMedia() { + public Media getMedia() { return media; } diff --git a/app/src/main/java/awais/instagrabber/repositories/responses/directmessages/DirectThread.java b/app/src/main/java/awais/instagrabber/repositories/responses/directmessages/DirectThread.java index 8012ad11..3125a4ca 100644 --- a/app/src/main/java/awais/instagrabber/repositories/responses/directmessages/DirectThread.java +++ b/app/src/main/java/awais/instagrabber/repositories/responses/directmessages/DirectThread.java @@ -6,11 +6,13 @@ import java.util.List; import java.util.Map; import java.util.Objects; +import awais.instagrabber.repositories.responses.User; + public class DirectThread { private final String threadId; private final String threadV2Id; - private final List users; - private final List leftUsers; + private final List users; + private final List leftUsers; private final List adminUserIds; private final List items; private final long lastActivityAt; @@ -29,7 +31,7 @@ public class DirectThread { private final boolean vcMuted; private final boolean isGroup; private final boolean mentionsMuted; - private final DirectUser inviter; + private final User inviter; private final boolean hasOlder; private final boolean hasNewer; private final Map lastSeenAt; @@ -41,8 +43,8 @@ public class DirectThread { public DirectThread(final String threadId, final String threadV2Id, - final List users, - final List leftUsers, + final List users, + final List leftUsers, final List adminUserIds, final List items, final long lastActivityAt, @@ -61,7 +63,7 @@ public class DirectThread { final boolean vcMuted, final boolean isGroup, final boolean mentionsMuted, - final DirectUser inviter, + final User inviter, final boolean hasOlder, final boolean hasNewer, final Map lastSeenAt, @@ -111,11 +113,11 @@ public class DirectThread { return threadV2Id; } - public List getUsers() { + public List getUsers() { return users; } - public List getLeftUsers() { + public List getLeftUsers() { return leftUsers; } @@ -191,7 +193,7 @@ public class DirectThread { return mentionsMuted; } - public DirectUser getInviter() { + public User getInviter() { return inviter; } diff --git a/app/src/main/java/awais/instagrabber/repositories/responses/directmessages/DirectUser.java b/app/src/main/java/awais/instagrabber/repositories/responses/directmessages/DirectUser.java deleted file mode 100644 index 2d3a8880..00000000 --- a/app/src/main/java/awais/instagrabber/repositories/responses/directmessages/DirectUser.java +++ /dev/null @@ -1,133 +0,0 @@ -package awais.instagrabber.repositories.responses.directmessages; - -import java.io.Serializable; -import java.util.Objects; - -import awais.instagrabber.models.ProfileModel; - -public class DirectUser implements Serializable { - private final long pk; - private final String username; - private final String fullName; - private final boolean isPrivate; - private final String profilePicUrl; - private final String profilePicId; - private final DirectUserFriendshipStatus friendshipStatus; - private final boolean isVerified; - private final boolean hasAnonymousProfilePicture; - private final boolean isDirectappInstalled; - private final String reelAutoArchive; - private final String allowedCommenterType; - - public DirectUser(final long pk, - final String username, - final String fullName, - final boolean isPrivate, - final String profilePicUrl, - final String profilePicId, - final DirectUserFriendshipStatus friendshipStatus, - final boolean isVerified, - final boolean hasAnonymousProfilePicture, - final boolean isDirectappInstalled, - final String reelAutoArchive, - final String allowedCommenterType) { - this.pk = pk; - this.username = username; - this.fullName = fullName; - this.isPrivate = isPrivate; - this.profilePicUrl = profilePicUrl; - this.profilePicId = profilePicId; - this.friendshipStatus = friendshipStatus; - this.isVerified = isVerified; - this.hasAnonymousProfilePicture = hasAnonymousProfilePicture; - this.isDirectappInstalled = isDirectappInstalled; - this.reelAutoArchive = reelAutoArchive; - this.allowedCommenterType = allowedCommenterType; - } - - public long getPk() { - return pk; - } - - public String getUsername() { - return username; - } - - public String getFullName() { - return fullName; - } - - public boolean isPrivate() { - return isPrivate; - } - - public String getProfilePicUrl() { - return profilePicUrl; - } - - public String getProfilePicId() { - return profilePicId; - } - - public DirectUserFriendshipStatus getFriendshipStatus() { - return friendshipStatus; - } - - public boolean isVerified() { - return isVerified; - } - - public boolean isHasAnonymousProfilePicture() { - return hasAnonymousProfilePicture; - } - - public boolean isDirectappInstalled() { - return isDirectappInstalled; - } - - public String getReelAutoArchive() { - return reelAutoArchive; - } - - public String getAllowedCommenterType() { - return allowedCommenterType; - } - - public static DirectUser fromProfileModel(final ProfileModel profileModel) { - return new DirectUser( - Long.parseLong(profileModel.getId()), - profileModel.getUsername(), - profileModel.getName(), - profileModel.isPrivate(), - profileModel.getSdProfilePic(), - null, - new DirectUserFriendshipStatus( - profileModel.isFollowing(), - profileModel.isBlocked(), - profileModel.isPrivate(), - false, - profileModel.isRequested(), - false, - profileModel.isRestricted()), - profileModel.isVerified(), - false, - false, - null, - null - ); - } - - @Override - public boolean equals(final Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - final DirectUser that = (DirectUser) o; - return pk == that.pk && - Objects.equals(username, that.username); - } - - @Override - public int hashCode() { - return Objects.hash(pk, username); - } -} diff --git a/app/src/main/java/awais/instagrabber/repositories/responses/discover/TopicalExploreFeedResponse.java b/app/src/main/java/awais/instagrabber/repositories/responses/discover/TopicalExploreFeedResponse.java new file mode 100644 index 00000000..ceea714a --- /dev/null +++ b/app/src/main/java/awais/instagrabber/repositories/responses/discover/TopicalExploreFeedResponse.java @@ -0,0 +1,59 @@ +package awais.instagrabber.repositories.responses.discover; + +import java.util.List; + +import awais.instagrabber.models.TopicCluster; + +public class TopicalExploreFeedResponse { + private final boolean moreAvailable; + private final String nextMaxId; + private final String maxId; + private final String status; + private final int numResults; + private final List clusters; + private final List items; + + public TopicalExploreFeedResponse(final boolean moreAvailable, + final String nextMaxId, + final String maxId, + final String status, + final int numResults, + final List clusters, + final List items) { + this.moreAvailable = moreAvailable; + this.nextMaxId = nextMaxId; + this.maxId = maxId; + this.status = status; + this.numResults = numResults; + this.clusters = clusters; + this.items = items; + } + + public boolean isMoreAvailable() { + return moreAvailable; + } + + public String getNextMaxId() { + return nextMaxId; + } + + public String getMaxId() { + return maxId; + } + + public String getStatus() { + return status; + } + + public int getNumResults() { + return numResults; + } + + public List getClusters() { + return clusters; + } + + public List getItems() { + return items; + } +} diff --git a/app/src/main/java/awais/instagrabber/repositories/responses/discover/TopicalExploreItem.java b/app/src/main/java/awais/instagrabber/repositories/responses/discover/TopicalExploreItem.java new file mode 100644 index 00000000..242790a3 --- /dev/null +++ b/app/src/main/java/awais/instagrabber/repositories/responses/discover/TopicalExploreItem.java @@ -0,0 +1,15 @@ +package awais.instagrabber.repositories.responses.discover; + +import awais.instagrabber.repositories.responses.Media; + +public class TopicalExploreItem { + private final Media media; + + public TopicalExploreItem(final Media media) { + this.media = media; + } + + public Media getMedia() { + return media; + } +} diff --git a/app/src/main/java/awais/instagrabber/utils/CookieUtils.java b/app/src/main/java/awais/instagrabber/utils/CookieUtils.java index 78a6998e..59bb805e 100644 --- a/app/src/main/java/awais/instagrabber/utils/CookieUtils.java +++ b/app/src/main/java/awais/instagrabber/utils/CookieUtils.java @@ -70,9 +70,17 @@ public final class CookieUtils { } } - @Nullable - public static String getUserIdFromCookie(final String cookies) { - return getCookieValue(cookies, "ds_user_id"); + public static long getUserIdFromCookie(final String cookies) { + final String dsUserId = getCookieValue(cookies, "ds_user_id"); + if (dsUserId == null) { + return 0; + } + try { + return Long.parseLong(dsUserId); + } catch (NumberFormatException e) { + Log.e(TAG, "getUserIdFromCookie: ", e); + } + return 0; } @Nullable diff --git a/app/src/main/java/awais/instagrabber/utils/DirectItemFactory.java b/app/src/main/java/awais/instagrabber/utils/DirectItemFactory.java index 7da5e07e..44f28942 100644 --- a/app/src/main/java/awais/instagrabber/utils/DirectItemFactory.java +++ b/app/src/main/java/awais/instagrabber/utils/DirectItemFactory.java @@ -8,13 +8,13 @@ import java.util.UUID; import awais.instagrabber.models.enums.DirectItemType; import awais.instagrabber.models.enums.MediaItemType; -import awais.instagrabber.repositories.responses.directmessages.Audio; +import awais.instagrabber.repositories.responses.Audio; +import awais.instagrabber.repositories.responses.ImageVersions2; +import awais.instagrabber.repositories.responses.Media; +import awais.instagrabber.repositories.responses.MediaCandidate; +import awais.instagrabber.repositories.responses.VideoVersion; import awais.instagrabber.repositories.responses.directmessages.DirectItem; -import awais.instagrabber.repositories.responses.directmessages.DirectItemMedia; import awais.instagrabber.repositories.responses.directmessages.DirectItemVoiceMedia; -import awais.instagrabber.repositories.responses.directmessages.ImageVersions2; -import awais.instagrabber.repositories.responses.directmessages.MediaCandidate; -import awais.instagrabber.repositories.responses.directmessages.VideoVersion; public class DirectItemFactory { @@ -69,23 +69,38 @@ public class DirectItemFactory { ); videoVersions = Collections.singletonList(videoVersion); } - final DirectItemMedia media = new DirectItemMedia( + final Media media = new Media( null, UUID.randomUUID().toString(), null, + -1, null, + false, imageVersions2, width, height, isVideo ? MediaItemType.MEDIA_TYPE_VIDEO : MediaItemType.MEDIA_TYPE_IMAGE, false, + -1, + -1, + -1, + false, + false, videoVersions, false, + 0f, + 0, + null, + false, null, null, null, - null - ); + null, + null, + false, + false, + null, + null); return new DirectItem( UUID.randomUUID().toString(), userId, @@ -120,7 +135,8 @@ public class DirectItemFactory { final String clientContext, final Uri uri, final long duration, - final List waveform, final int samplingFreq) { + final List waveform, + final int samplingFreq) { final Audio audio = new Audio( uri.toString(), duration, @@ -128,23 +144,38 @@ public class DirectItemFactory { samplingFreq, 0 ); - final DirectItemMedia media = new DirectItemMedia( + final Media media = new Media( null, UUID.randomUUID().toString(), null, + -1, null, + false, null, 0, 0, MediaItemType.MEDIA_TYPE_VOICE, false, - null, + -1, + 0, + 0, + false, false, null, + false, + 0f, + 0, + null, + false, audio, null, - null - ); + null, + null, + null, + false, + false, + null, + null); final DirectItemVoiceMedia voiceMedia = new DirectItemVoiceMedia( media, 0, diff --git a/app/src/main/java/awais/instagrabber/utils/DownloadUtils.java b/app/src/main/java/awais/instagrabber/utils/DownloadUtils.java index 2ccbb281..d063a569 100644 --- a/app/src/main/java/awais/instagrabber/utils/DownloadUtils.java +++ b/app/src/main/java/awais/instagrabber/utils/DownloadUtils.java @@ -37,10 +37,11 @@ import java.util.UUID; import java.util.regex.Pattern; import awais.instagrabber.R; -import awais.instagrabber.models.FeedModel; -import awais.instagrabber.models.PostChild; import awais.instagrabber.models.StoryModel; import awais.instagrabber.models.enums.MediaItemType; +import awais.instagrabber.repositories.responses.Media; +import awais.instagrabber.repositories.responses.User; +import awais.instagrabber.repositories.responses.VideoVersion; import awais.instagrabber.workers.DownloadWorker; import static awais.instagrabber.utils.Constants.FOLDER_PATH; @@ -195,23 +196,29 @@ public final class DownloadUtils { return ""; } - public static List checkDownloaded(@NonNull final FeedModel feedModel) { + public static List checkDownloaded(@NonNull final Media media) { final List checkList = new LinkedList<>(); - final File downloadDir = getDownloadDir(null, "@" + feedModel.getProfileModel().getUsername(), true); - switch (feedModel.getItemType()) { + final User user = media.getUser(); + String username = "username"; + if (user != null) { + username = user.getUsername(); + } + final File downloadDir = getDownloadDir(null, "@" + username, true); + switch (media.getMediaType()) { case MEDIA_TYPE_IMAGE: case MEDIA_TYPE_VIDEO: { - final String url = feedModel.getDisplayUrl(); - final File file = getDownloadSaveFile(downloadDir, feedModel.getShortCode(), url); + final String url = ResponseBodyUtils.getImageUrl(media); + final File file = getDownloadSaveFile(downloadDir, media.getCode(), url); checkList.add(file.exists()); break; } case MEDIA_TYPE_SLIDER: - final List sliderItems = feedModel.getSliderItems(); + final List sliderItems = media.getCarouselMedia(); for (int i = 0; i < sliderItems.size(); i++) { - final PostChild child = sliderItems.get(i); - final String url = child.getDisplayUrl(); - final File file = getDownloadChildSaveFile(downloadDir, feedModel.getShortCode(), i + 1, url); + final Media child = sliderItems.get(i); + if (child == null) continue; + final String url = ResponseBodyUtils.getImageUrl(child); + final File file = getDownloadChildSaveFile(downloadDir, media.getCode(), i + 1, url); checkList.add(file.exists()); } break; @@ -221,7 +228,7 @@ public final class DownloadUtils { } public static void showDownloadDialog(@NonNull Context context, - @NonNull final FeedModel feedModel, + @NonNull final Media feedModel, final int childPosition) { if (childPosition >= 0) { final DialogInterface.OnClickListener clickListener = (dialog, which) -> { @@ -266,45 +273,45 @@ public final class DownloadUtils { } public static void download(@NonNull final Context context, - @NonNull final FeedModel feedModel) { + @NonNull final Media feedModel) { download(context, feedModel, -1); } public static void download(@NonNull final Context context, - @NonNull final FeedModel feedModel, + @NonNull final Media feedModel, final int position) { download(context, Collections.singletonList(feedModel), position); } public static void download(@NonNull final Context context, - @NonNull final List feedModels) { + @NonNull final List feedModels) { download(context, feedModels, -1); } private static void download(@NonNull final Context context, - @NonNull final List feedModels, + @NonNull final List feedModels, final int childPositionIfSingle) { final Map map = new HashMap<>(); - for (final FeedModel feedModel : feedModels) { - final File downloadDir = getDownloadDir(context, "@" + feedModel.getProfileModel().getUsername()); + for (final Media media : feedModels) { + final File downloadDir = getDownloadDir(context, "@" + media.getUser().getUsername()); if (downloadDir == null) return; - switch (feedModel.getItemType()) { + switch (media.getMediaType()) { case MEDIA_TYPE_IMAGE: case MEDIA_TYPE_VIDEO: { - final String url = feedModel.getDisplayUrl(); - final File file = getDownloadSaveFile(downloadDir, feedModel.getShortCode(), url); + final String url = getUrlOfType(media); + final File file = getDownloadSaveFile(downloadDir, media.getCode(), url); map.put(url, file.getAbsolutePath()); break; } case MEDIA_TYPE_SLIDER: - final List sliderItems = feedModel.getSliderItems(); + final List sliderItems = media.getCarouselMedia(); for (int i = 0; i < sliderItems.size(); i++) { if (childPositionIfSingle >= 0 && feedModels.size() == 1 && i != childPositionIfSingle) { continue; } - final PostChild child = sliderItems.get(i); - final String url = child.getDisplayUrl(); - final File file = getDownloadChildSaveFile(downloadDir, feedModel.getShortCode(), i + 1, url); + final Media child = sliderItems.get(i); + final String url = getUrlOfType(child); + final File file = getDownloadChildSaveFile(downloadDir, media.getCode(), i + 1, url); map.put(url, file.getAbsolutePath()); } break; @@ -314,6 +321,27 @@ public final class DownloadUtils { download(context, map); } + @Nullable + private static String getUrlOfType(@NonNull final Media media) { + switch (media.getMediaType()) { + case MEDIA_TYPE_IMAGE: { + return ResponseBodyUtils.getImageUrl(media); + } + case MEDIA_TYPE_VIDEO: { + final List videoVersions = media.getVideoVersions(); + String url = null; + if (videoVersions != null && !videoVersions.isEmpty()) { + final VideoVersion videoVersion = videoVersions.get(0); + if (videoVersion != null) { + url = videoVersion.getUrl(); + } + } + return url; + } + } + return null; + } + public static void download(final Context context, final String url, final String filePath) { diff --git a/app/src/main/java/awais/instagrabber/utils/ResponseBodyUtils.java b/app/src/main/java/awais/instagrabber/utils/ResponseBodyUtils.java index e526ae99..c3fd2ff3 100644 --- a/app/src/main/java/awais/instagrabber/utils/ResponseBodyUtils.java +++ b/app/src/main/java/awais/instagrabber/utils/ResponseBodyUtils.java @@ -3,7 +3,6 @@ package awais.instagrabber.utils; import android.util.Log; import android.util.Pair; -import androidx.annotation.NonNull; import androidx.annotation.Nullable; import org.json.JSONArray; @@ -16,21 +15,24 @@ import java.util.List; import java.util.Map; import awais.instagrabber.BuildConfig; -import awais.instagrabber.models.FeedModel; -import awais.instagrabber.models.PostChild; -import awais.instagrabber.models.ProfileModel; -import awais.instagrabber.models.enums.MediaItemType; import awais.instagrabber.models.StoryModel; -import awais.instagrabber.repositories.responses.directmessages.DirectItem; -import awais.instagrabber.repositories.responses.directmessages.DirectThreadDirectStory; -import awais.instagrabber.repositories.responses.directmessages.DirectThreadLastSeenAt; -import awais.instagrabber.repositories.responses.directmessages.ImageVersions2; -import awais.instagrabber.repositories.responses.directmessages.MediaCandidate; +import awais.instagrabber.models.enums.MediaItemType; import awais.instagrabber.models.stickers.PollModel; import awais.instagrabber.models.stickers.QuestionModel; import awais.instagrabber.models.stickers.QuizModel; import awais.instagrabber.models.stickers.SliderModel; import awais.instagrabber.models.stickers.SwipeUpModel; +import awais.instagrabber.repositories.responses.Caption; +import awais.instagrabber.repositories.responses.FriendshipStatus; +import awais.instagrabber.repositories.responses.ImageVersions2; +import awais.instagrabber.repositories.responses.Location; +import awais.instagrabber.repositories.responses.Media; +import awais.instagrabber.repositories.responses.MediaCandidate; +import awais.instagrabber.repositories.responses.User; +import awais.instagrabber.repositories.responses.VideoVersion; +import awais.instagrabber.repositories.responses.directmessages.DirectItem; +import awais.instagrabber.repositories.responses.directmessages.DirectThreadDirectStory; +import awais.instagrabber.repositories.responses.directmessages.DirectThreadLastSeenAt; import awaisomereport.LogCollector; public final class ResponseBodyUtils { @@ -102,95 +104,95 @@ public final class ResponseBodyUtils { return src; } - public static String getLowQualityImage(final JSONObject resources) { - String src = null; - try { - src = getHighQualityPost(resources.getJSONObject("image_versions2").getJSONArray("candidates"), false, true, true); - } catch (final Exception e) { - if (Utils.logCollector != null) - Utils.logCollector.appendException(e, LogCollector.LogFile.UTILS, "getLowQualityImage", - new Pair<>("resourcesNull", resources == null)); - if (BuildConfig.DEBUG) Log.e(TAG, "Error in getLowQualityImage", e); - } - return src; - } + // public static String getLowQualityImage(final JSONObject resources) { + // String src = null; + // try { + // src = getHighQualityPost(resources.getJSONObject("image_versions2").getJSONArray("candidates"), false, true, true); + // } catch (final Exception e) { + // if (Utils.logCollector != null) + // Utils.logCollector.appendException(e, LogCollector.LogFile.UTILS, "getLowQualityImage", + // new Pair<>("resourcesNull", resources == null)); + // if (BuildConfig.DEBUG) Log.e(TAG, "Error in getLowQualityImage", e); + // } + // return src; + // } - public static ThumbnailDetails getItemThumbnail(@NonNull final JSONArray jsonArray) { - final ThumbnailDetails thumbnailDetails = new ThumbnailDetails(); - final int imageResLen = jsonArray.length(); - for (int i = 0; i < imageResLen; ++i) { - final JSONObject imageResource = jsonArray.optJSONObject(i); - try { - // final float ratio = (float) height / width; - // if (ratio >= 0.95f && ratio <= 1.0f) { - thumbnailDetails.height = imageResource.getInt("height"); - thumbnailDetails.width = imageResource.getInt("width"); - thumbnailDetails.url = imageResource.getString("url"); - break; - // } - } catch (final Exception e) { - if (Utils.logCollector != null) - Utils.logCollector.appendException(e, LogCollector.LogFile.UTILS, "getItemThumbnail"); - if (BuildConfig.DEBUG) Log.e(TAG, "", e); - } - } - // if (TextUtils.isEmpty(thumbnail)) thumbnail = jsonArray.optJSONObject(0).optString("url"); - return thumbnailDetails; - } + // public static ThumbnailDetails getItemThumbnail(@NonNull final JSONArray jsonArray) { + // final ThumbnailDetails thumbnailDetails = new ThumbnailDetails(); + // final int imageResLen = jsonArray.length(); + // for (int i = 0; i < imageResLen; ++i) { + // final JSONObject imageResource = jsonArray.optJSONObject(i); + // try { + // // final float ratio = (float) height / width; + // // if (ratio >= 0.95f && ratio <= 1.0f) { + // thumbnailDetails.height = imageResource.getInt("height"); + // thumbnailDetails.width = imageResource.getInt("width"); + // thumbnailDetails.url = imageResource.getString("url"); + // break; + // // } + // } catch (final Exception e) { + // if (Utils.logCollector != null) + // Utils.logCollector.appendException(e, LogCollector.LogFile.UTILS, "getItemThumbnail"); + // if (BuildConfig.DEBUG) Log.e(TAG, "", e); + // } + // } + // // if (TextUtils.isEmpty(thumbnail)) thumbnail = jsonArray.optJSONObject(0).optString("url"); + // return thumbnailDetails; + // } - public static class ThumbnailDetails { - int width; - int height; - public String url; - } + // public static class ThumbnailDetails { + // int width; + // int height; + // public String url; + // } - @Nullable - public static ThumbnailDetails getThumbnailUrl(@NonNull final JSONObject mediaObj, final MediaItemType mediaType) throws Exception { - ThumbnailDetails thumbnail = null; - if (mediaType == MediaItemType.MEDIA_TYPE_IMAGE || mediaType == MediaItemType.MEDIA_TYPE_VIDEO) { - final JSONObject imageVersions = mediaObj.optJSONObject("image_versions2"); - if (imageVersions != null) - thumbnail = getItemThumbnail(imageVersions.getJSONArray("candidates")); + // @Nullable + // public static ThumbnailDetails getThumbnailUrl(@NonNull final JSONObject mediaObj, final MediaItemType mediaType) throws Exception { + // ThumbnailDetails thumbnail = null; + // if (mediaType == MediaItemType.MEDIA_TYPE_IMAGE || mediaType == MediaItemType.MEDIA_TYPE_VIDEO) { + // final JSONObject imageVersions = mediaObj.optJSONObject("image_versions2"); + // if (imageVersions != null) + // thumbnail = getItemThumbnail(imageVersions.getJSONArray("candidates")); + // + // } else if (mediaType == MediaItemType.MEDIA_TYPE_SLIDER) { + // final JSONArray carouselMedia = mediaObj.optJSONArray("carousel_media"); + // if (carouselMedia != null) + // thumbnail = getItemThumbnail(carouselMedia.getJSONObject(0) + // .getJSONObject("image_versions2") + // .getJSONArray("candidates")); + // } + // return thumbnail; + // } - } else if (mediaType == MediaItemType.MEDIA_TYPE_SLIDER) { - final JSONArray carouselMedia = mediaObj.optJSONArray("carousel_media"); - if (carouselMedia != null) - thumbnail = getItemThumbnail(carouselMedia.getJSONObject(0) - .getJSONObject("image_versions2") - .getJSONArray("candidates")); - } - return thumbnail; - } + // public static String getVideoUrl(@NonNull final JSONObject mediaObj) { + // String url = null; + // final JSONArray videoVersions = mediaObj.optJSONArray("video_versions"); + // if (videoVersions == null) { + // return null; + // } + // int largestWidth = 0; + // for (int i = 0; i < videoVersions.length(); i++) { + // final JSONObject videoVersionJson = videoVersions.optJSONObject(i); + // if (videoVersionJson == null) { + // continue; + // } + // final int width = videoVersionJson.optInt("width"); + // if (largestWidth == 0 || width > largestWidth) { + // largestWidth = width; + // url = videoVersionJson.optString("url"); + // } + // } + // return url; + // } - public static String getVideoUrl(@NonNull final JSONObject mediaObj) { - String url = null; - final JSONArray videoVersions = mediaObj.optJSONArray("video_versions"); - if (videoVersions == null) { - return null; - } - int largestWidth = 0; - for (int i = 0; i < videoVersions.length(); i++) { - final JSONObject videoVersionJson = videoVersions.optJSONObject(i); - if (videoVersionJson == null) { - continue; - } - final int width = videoVersionJson.optInt("width"); - if (largestWidth == 0 || width > largestWidth) { - largestWidth = width; - url = videoVersionJson.optString("url"); - } - } - return url; - } - - @Nullable - public static MediaItemType getMediaItemType(final int mediaType) { - if (mediaType == 1) return MediaItemType.MEDIA_TYPE_IMAGE; - if (mediaType == 2) return MediaItemType.MEDIA_TYPE_VIDEO; - if (mediaType == 8) return MediaItemType.MEDIA_TYPE_SLIDER; - if (mediaType == 11) return MediaItemType.MEDIA_TYPE_VOICE; - return null; - } + // @Nullable + // public static MediaItemType getMediaItemType(final int mediaType) { + // if (mediaType == 1) return MediaItemType.MEDIA_TYPE_IMAGE; + // if (mediaType == 2) return MediaItemType.MEDIA_TYPE_VIDEO; + // if (mediaType == 8) return MediaItemType.MEDIA_TYPE_SLIDER; + // if (mediaType == 11) return MediaItemType.MEDIA_TYPE_VOICE; + // return null; + // } // public static DirectItemModel.DirectItemMediaModel getDirectMediaModel(final JSONObject mediaObj) throws Exception { // final DirectItemModel.DirectItemMediaModel mediaModel; @@ -597,89 +599,89 @@ public final class ResponseBodyUtils { // return RavenExpiringMediaType.RAVEN_UNKNOWN; // } - public static FeedModel parseItem(final JSONObject itemJson) throws JSONException { - if (itemJson == null) { - return null; - } - ProfileModel profileModel = null; - if (itemJson.has("user")) { - final JSONObject user = itemJson.getJSONObject("user"); - final JSONObject friendshipStatus = user.optJSONObject("friendship_status"); - boolean following = false; - boolean restricted = false; - boolean requested = false; - if (friendshipStatus != null) { - following = friendshipStatus.optBoolean("following"); - requested = friendshipStatus.optBoolean("outgoing_request"); - restricted = friendshipStatus.optBoolean("is_restricted"); - } - profileModel = new ProfileModel( - user.optBoolean("is_private"), - false, // if you can see it then you def follow - user.optBoolean("is_verified"), - user.getString("pk"), - user.getString(Constants.EXTRAS_USERNAME), - user.optString("full_name"), - null, - null, - user.getString("profile_pic_url"), - null, - 0, - 0, - 0, - following, - false, - restricted, - false, - requested); - } - final JSONObject captionJson = itemJson.optJSONObject("caption"); - final JSONObject locationJson = itemJson.optJSONObject("location"); - final MediaItemType mediaType = ResponseBodyUtils.getMediaItemType(itemJson.optInt("media_type")); - if (mediaType == null) { - return null; - } - final FeedModel.Builder feedModelBuilder = new FeedModel.Builder() - .setItemType(mediaType) - .setProfileModel(profileModel) - .setPostId(itemJson.getString(Constants.EXTRAS_ID)) - .setThumbnailUrl(mediaType != MediaItemType.MEDIA_TYPE_SLIDER ? ResponseBodyUtils.getLowQualityImage(itemJson) : null) - .setShortCode(itemJson.getString("code")) - .setPostCaption(captionJson != null ? captionJson.optString("text") : "") - .setCaptionId(captionJson != null ? captionJson.optString("pk") : null) - .setCommentsCount(itemJson.optInt("comment_count")) - .setTimestamp(itemJson.optLong("taken_at", -1)) - .setLiked(itemJson.optBoolean("has_liked")) - .setBookmarked(itemJson.optBoolean("has_viewer_saved")) - .setLikesCount(itemJson.optInt("like_count")) - .setLocationName(locationJson != null ? locationJson.optString("name") : null) - .setLocationId(locationJson != null ? String.valueOf(locationJson.optLong("pk")) : null) - .setImageHeight(itemJson.optInt("original_height")) - .setImageWidth(itemJson.optInt("original_width")); - switch (mediaType) { - case MEDIA_TYPE_VIDEO: - final long videoViews = itemJson.optLong("view_count", 0); - feedModelBuilder.setViewCount(videoViews) - .setDisplayUrl(ResponseBodyUtils.getVideoUrl(itemJson)); - break; - case MEDIA_TYPE_IMAGE: - feedModelBuilder.setDisplayUrl(ResponseBodyUtils.getHighQualityImage(itemJson)); - break; - case MEDIA_TYPE_SLIDER: - final List childPosts = getChildPosts(itemJson); - feedModelBuilder.setSliderItems(childPosts) - .setImageHeight(childPosts.get(0).getHeight()) - .setImageWidth(childPosts.get(0).getWidth()); - break; - } - return feedModelBuilder.build(); - } + // public static FeedModel parseItem(final JSONObject itemJson) throws JSONException { + // if (itemJson == null) { + // return null; + // } + // ProfileModel profileModel = null; + // if (itemJson.has("user")) { + // final JSONObject user = itemJson.getJSONObject("user"); + // final JSONObject friendshipStatus = user.optJSONObject("friendship_status"); + // boolean following = false; + // boolean restricted = false; + // boolean requested = false; + // if (friendshipStatus != null) { + // following = friendshipStatus.optBoolean("following"); + // requested = friendshipStatus.optBoolean("outgoing_request"); + // restricted = friendshipStatus.optBoolean("is_restricted"); + // } + // profileModel = new ProfileModel( + // user.optBoolean("is_private"), + // false, // if you can see it then you def follow + // user.optBoolean("is_verified"), + // user.getString("pk"), + // user.getString(Constants.EXTRAS_USERNAME), + // user.optString("full_name"), + // null, + // null, + // user.getString("profile_pic_url"), + // null, + // 0, + // 0, + // 0, + // following, + // false, + // restricted, + // false, + // requested); + // } + // final JSONObject captionJson = itemJson.optJSONObject("caption"); + // final JSONObject locationJson = itemJson.optJSONObject("location"); + // final MediaItemType mediaType = ResponseBodyUtils.getMediaItemType(itemJson.optInt("media_type")); + // if (mediaType == null) { + // return null; + // } + // final FeedModel.Builder feedModelBuilder = new FeedModel.Builder() + // .setItemType(mediaType) + // .setProfileModel(profileModel) + // .setPostId(itemJson.getString(Constants.EXTRAS_ID)) + // .setThumbnailUrl(mediaType != MediaItemType.MEDIA_TYPE_SLIDER ? ResponseBodyUtils.getLowQualityImage(itemJson) : null) + // .setShortCode(itemJson.getString("code")) + // .setPostCaption(captionJson != null ? captionJson.optString("text") : "") + // .setCaptionId(captionJson != null ? captionJson.optString("pk") : null) + // .setCommentsCount(itemJson.optInt("comment_count")) + // .setTimestamp(itemJson.optLong("taken_at", -1)) + // .setLiked(itemJson.optBoolean("has_liked")) + // .setBookmarked(itemJson.optBoolean("has_viewer_saved")) + // .setLikesCount(itemJson.optInt("like_count")) + // .setLocationName(locationJson != null ? locationJson.optString("name") : null) + // .setLocationId(locationJson != null ? String.valueOf(locationJson.optLong("pk")) : null) + // .setImageHeight(itemJson.optInt("original_height")) + // .setImageWidth(itemJson.optInt("original_width")); + // switch (mediaType) { + // case MEDIA_TYPE_VIDEO: + // final long videoViews = itemJson.optLong("view_count", 0); + // feedModelBuilder.setViewCount(videoViews) + // .setDisplayUrl(ResponseBodyUtils.getVideoUrl(itemJson)); + // break; + // case MEDIA_TYPE_IMAGE: + // feedModelBuilder.setDisplayUrl(ResponseBodyUtils.getHighQualityImage(itemJson)); + // break; + // case MEDIA_TYPE_SLIDER: + // final List childPosts = getChildPosts(itemJson); + // feedModelBuilder.setSliderItems(childPosts) + // .setImageHeight(childPosts.get(0).getHeight()) + // .setImageWidth(childPosts.get(0).getWidth()); + // break; + // } + // return feedModelBuilder.build(); + // } - public static FeedModel parseGraphQLItem(final JSONObject itemJson) throws JSONException { + public static Media parseGraphQLItem(final JSONObject itemJson) throws JSONException { if (itemJson == null) { return null; } - final JSONObject feedItem = itemJson.getJSONObject("node"); + final JSONObject feedItem = itemJson.has("node") ? itemJson.getJSONObject("node") : itemJson; final String mediaType = feedItem.optString("__typename"); if ("GraphSuggestedUserFeedUnit".equals(mediaType)) return null; @@ -694,30 +696,6 @@ public final class ResponseBodyUtils { } else { resourceUrl = feedItem.has("display_resources") ? ResponseBodyUtils.getHighQualityImage(feedItem) : displayUrl; } - - ProfileModel profileModel = null; - if (feedItem.has("owner")) { - final JSONObject owner = feedItem.getJSONObject("owner"); - profileModel = new ProfileModel( - owner.optBoolean("is_private"), - false, // if you can see it then you def follow - owner.optBoolean("is_verified"), - owner.getString(Constants.EXTRAS_ID), - owner.optString(Constants.EXTRAS_USERNAME), - owner.optString("full_name"), - null, - null, - owner.optString("profile_pic_url"), - null, - 0, - 0, - 0, - false, - false, - false, - false, - false); - } JSONObject tempJsonObject = feedItem.optJSONObject("edge_media_preview_comment"); final long commentsCount = tempJsonObject != null ? tempJsonObject.optLong("count") : 0; tempJsonObject = feedItem.optJSONObject("edge_media_preview_like"); @@ -731,16 +709,16 @@ public final class ResponseBodyUtils { captionText = tempJsonObject.getString("text"); } } - final JSONObject location = feedItem.optJSONObject("location"); + final JSONObject locationJson = feedItem.optJSONObject("location"); // Log.d(TAG, "location: " + (location == null ? null : location.toString())); - String locationId = null; + long locationId = 0; String locationName = null; - if (location != null) { - locationName = location.optString("name"); - if (location.has("id")) { - locationId = location.getString("id"); - } else if (location.has("pk")) { - locationId = location.getString("pk"); + if (locationJson != null) { + locationName = locationJson.optString("name"); + if (locationJson.has("id")) { + locationId = locationJson.optLong("id"); + } else if (locationJson.has("pk")) { + locationId = locationJson.optLong("pk"); } // Log.d(TAG, "locationId: " + locationId); } @@ -757,125 +735,231 @@ public final class ResponseBodyUtils { .getJSONObject(0) .getString("src"); } catch (JSONException ignored) {} - final FeedModel.Builder feedModelBuilder = new FeedModel.Builder() - .setProfileModel(profileModel) - .setItemType(isVideo ? MediaItemType.MEDIA_TYPE_VIDEO - : MediaItemType.MEDIA_TYPE_IMAGE) - .setViewCount(videoViews) - .setPostId(feedItem.getString(Constants.EXTRAS_ID)) - .setDisplayUrl(resourceUrl) - .setThumbnailUrl(thumbnailUrl != null ? thumbnailUrl : displayUrl) - .setShortCode(feedItem.getString(Constants.EXTRAS_SHORTCODE)) - .setPostCaption(captionText) - .setCommentsCount(commentsCount) - .setTimestamp(feedItem.optLong("taken_at_timestamp", -1)) - .setLiked(feedItem.optBoolean("viewer_has_liked")) - .setBookmarked(feedItem.optBoolean("viewer_has_saved")) - .setLikesCount(likesCount) - .setLocationName(locationName) - .setLocationId(locationId) - .setImageHeight(height) - .setImageWidth(width); + // final FeedModel.Builder feedModelBuilder = new FeedModel.Builder() + // .setProfileModel(profileModel) + // .setItemType(isVideo ? MediaItemType.MEDIA_TYPE_VIDEO + // : MediaItemType.MEDIA_TYPE_IMAGE) + // .setViewCount(videoViews) + // .setPostId(feedItem.getString(Constants.EXTRAS_ID)) + // .setDisplayUrl(resourceUrl) + // .setThumbnailUrl(thumbnailUrl != null ? thumbnailUrl : displayUrl) + // .setShortCode(feedItem.getString(Constants.EXTRAS_SHORTCODE)) + // .setPostCaption(captionText) + // .setCommentsCount(commentsCount) + // .setTimestamp(feedItem.optLong("taken_at_timestamp", -1)) + // .setLiked(feedItem.optBoolean("viewer_has_liked")) + // .setBookmarked(feedItem.optBoolean("viewer_has_saved")) + // .setLikesCount(likesCount) + // .setLocationName(locationName) + // .setLocationId(String.valueOf(locationId)) + // .setImageHeight(height) + // .setImageWidth(width); + + User user = null; + long userId = -1; + if (feedItem.has("owner")) { + final JSONObject owner = feedItem.getJSONObject("owner"); + final FriendshipStatus friendshipStatus = new FriendshipStatus( + false, + false, + false, + false, + owner.optBoolean("is_private"), + false, + false, + false, + false, + false + ); + userId = owner.optLong(Constants.EXTRAS_ID, -1); + user = new User( + userId, + owner.optString(Constants.EXTRAS_USERNAME), + owner.optString("full_name"), + owner.optBoolean("is_private"), + owner.optString("profile_pic_url"), + null, + friendshipStatus, + owner.optBoolean("is_verified"), + false, false, false, false, null, null, 0, 0, 0, 0, null, null, 0, null); + } + final String id = feedItem.getString(Constants.EXTRAS_ID); + final ImageVersions2 imageVersions2 = new ImageVersions2( + Collections.singletonList(new MediaCandidate( + width, + height, + isVideo ? thumbnailUrl : resourceUrl + )) + ); + VideoVersion videoVersion = null; + if (isVideo) { + videoVersion = new VideoVersion( + null, + null, + width, + height, + resourceUrl + ); + } + final Caption caption = new Caption( + userId, + captionText + ); final boolean isSlider = "GraphSidecar".equals(mediaType) && feedItem.has("edge_sidecar_to_children"); - + List childItems = null; if (isSlider) { - feedModelBuilder.setItemType(MediaItemType.MEDIA_TYPE_SLIDER); + childItems = new ArrayList<>(); + // feedModelBuilder.setItemType(MediaItemType.MEDIA_TYPE_SLIDER); final JSONObject sidecar = feedItem.optJSONObject("edge_sidecar_to_children"); if (sidecar != null) { final JSONArray children = sidecar.optJSONArray("edges"); if (children != null) { - final List sliderItems = getSliderItems(children); - feedModelBuilder.setSliderItems(sliderItems) - .setImageHeight(sliderItems.get(0).getHeight()) - .setImageWidth(sliderItems.get(0).getWidth()); + // final List sliderItems = getSliderItems(children); + // feedModelBuilder.setSliderItems(sliderItems) + // .setImageHeight(sliderItems.get(0).getHeight()) + // .setImageWidth(sliderItems.get(0).getWidth()); + for (int i = 0; i < children.length(); i++) { + final JSONObject child = children.optJSONObject(i); + if (child == null) continue; + final Media media = parseGraphQLItem(child); + media.setIsSidecarChild(true); + childItems.add(media); + } } } } - return feedModelBuilder.build(); + MediaItemType mediaItemType = MediaItemType.MEDIA_TYPE_IMAGE; + if (isSlider) { + mediaItemType = MediaItemType.MEDIA_TYPE_SLIDER; + } else if (isVideo) { + mediaItemType = MediaItemType.MEDIA_TYPE_VIDEO; + } + final Location location = new Location( + locationId, + locationName, + locationName, + null, + null, + -1, + -1 + ); + return new Media( + id, + id, + feedItem.optString(Constants.EXTRAS_SHORTCODE), + feedItem.optLong("taken_at_timestamp", -1), + user, + false, + imageVersions2, + width, + height, + mediaItemType, + false, + -1, + commentsCount, + likesCount, + false, + false, + isVideo ? Collections.singletonList(videoVersion) : null, + feedItem.optBoolean("has_audio"), + feedItem.optDouble("video_duration"), + videoViews, + caption, + false, + null, + null, + childItems, + location, + null, + false, + false, + null, + null + ); } - private static List getChildPosts(final JSONObject mediaJson) throws JSONException { - if (mediaJson == null) { - return Collections.emptyList(); - } - final JSONArray carouselMedia = mediaJson.optJSONArray("carousel_media"); - if (carouselMedia == null) { - return Collections.emptyList(); - } - final List children = new ArrayList<>(); - for (int i = 0; i < carouselMedia.length(); i++) { - final JSONObject childJson = carouselMedia.optJSONObject(i); - final PostChild childPost = getChildPost(childJson); - if (childPost != null) { - children.add(childPost); - } - } - return children; - } + // private static List getChildPosts(final JSONObject mediaJson) throws JSONException { + // if (mediaJson == null) { + // return Collections.emptyList(); + // } + // final JSONArray carouselMedia = mediaJson.optJSONArray("carousel_media"); + // if (carouselMedia == null) { + // return Collections.emptyList(); + // } + // final List children = new ArrayList<>(); + // for (int i = 0; i < carouselMedia.length(); i++) { + // final JSONObject childJson = carouselMedia.optJSONObject(i); + // final PostChild childPost = getChildPost(childJson); + // if (childPost != null) { + // children.add(childPost); + // } + // } + // return children; + // } - private static PostChild getChildPost(final JSONObject childJson) throws JSONException { - if (childJson == null) { - return null; - } - final MediaItemType mediaType = ResponseBodyUtils.getMediaItemType(childJson.optInt("media_type")); - if (mediaType == null) { - return null; - } - final PostChild.Builder builder = new PostChild.Builder(); - switch (mediaType) { - case MEDIA_TYPE_VIDEO: - builder.setDisplayUrl(ResponseBodyUtils.getVideoUrl(childJson)); - break; - case MEDIA_TYPE_IMAGE: - builder.setDisplayUrl(ResponseBodyUtils.getHighQualityImage(childJson)); - break; - } - return builder.setItemType(mediaType) - .setPostId(childJson.getString("id")) - .setThumbnailUrl(ResponseBodyUtils.getLowQualityImage(childJson)) - .setHeight(childJson.optInt("original_height")) - .setWidth(childJson.optInt("original_width")) - .build(); - } + // private static PostChild getChildPost(final JSONObject childJson) throws JSONException { + // if (childJson == null) { + // return null; + // } + // final MediaItemType mediaType = ResponseBodyUtils.getMediaItemType(childJson.optInt("media_type")); + // if (mediaType == null) { + // return null; + // } + // final PostChild.Builder builder = new PostChild.Builder(); + // switch (mediaType) { + // case MEDIA_TYPE_VIDEO: + // builder.setDisplayUrl(ResponseBodyUtils.getVideoUrl(childJson)); + // break; + // case MEDIA_TYPE_IMAGE: + // builder.setDisplayUrl(ResponseBodyUtils.getHighQualityImage(childJson)); + // break; + // } + // return builder.setItemType(mediaType) + // .setPostId(childJson.getString("id")) + // .setThumbnailUrl(ResponseBodyUtils.getLowQualityImage(childJson)) + // .setHeight(childJson.optInt("original_height")) + // .setWidth(childJson.optInt("original_width")) + // .build(); + // } // this is for graphql - @NonNull - private static List getSliderItems(final JSONArray children) throws JSONException { - final List sliderItems = new ArrayList<>(); - for (int j = 0; j < children.length(); ++j) { - final JSONObject childNode = children.optJSONObject(j).getJSONObject("node"); - final boolean isChildVideo = childNode.optBoolean("is_video"); - int height = 0; - int width = 0; - final JSONObject dimensions = childNode.optJSONObject("dimensions"); - if (dimensions != null) { - height = dimensions.optInt("height"); - width = dimensions.optInt("width"); - } - String thumbnailUrl = null; - try { - thumbnailUrl = childNode.getJSONArray("display_resources") - .getJSONObject(0) - .getString("src"); - } catch (JSONException ignored) {} - final PostChild sliderItem = new PostChild.Builder() - .setItemType(isChildVideo ? MediaItemType.MEDIA_TYPE_VIDEO - : MediaItemType.MEDIA_TYPE_IMAGE) - .setPostId(childNode.getString(Constants.EXTRAS_ID)) - .setDisplayUrl(isChildVideo ? childNode.getString("video_url") - : childNode.getString("display_url")) - .setThumbnailUrl(thumbnailUrl != null ? thumbnailUrl - : childNode.getString("display_url")) - .setVideoViews(childNode.optLong("video_view_count", 0)) - .setHeight(height) - .setWidth(width) - .build(); - // Log.d(TAG, "getSliderItems: sliderItem: " + sliderItem); - sliderItems.add(sliderItem); - } - return sliderItems; - } + // @NonNull + // private static List getSliderItems(final JSONArray children) throws JSONException { + // final List sliderItems = new ArrayList<>(); + // for (int j = 0; j < children.length(); ++j) { + // final JSONObject childNode = children.optJSONObject(j).getJSONObject("node"); + // final boolean isChildVideo = childNode.optBoolean("is_video"); + // int height = 0; + // int width = 0; + // final JSONObject dimensions = childNode.optJSONObject("dimensions"); + // if (dimensions != null) { + // height = dimensions.optInt("height"); + // width = dimensions.optInt("width"); + // } + // String thumbnailUrl = null; + // try { + // thumbnailUrl = childNode.getJSONArray("display_resources") + // .getJSONObject(0) + // .getString("src"); + // } catch (JSONException ignored) {} + // final PostChild sliderItem = new PostChild.Builder() + // .setItemType(isChildVideo ? MediaItemType.MEDIA_TYPE_VIDEO + // : MediaItemType.MEDIA_TYPE_IMAGE) + // .setPostId(childNode.getString(Constants.EXTRAS_ID)) + // .setDisplayUrl(isChildVideo ? childNode.getString("video_url") + // : childNode.getString("display_url")) + // .setThumbnailUrl(thumbnailUrl != null ? thumbnailUrl + // : childNode.getString("display_url")) + // .setVideoViews(childNode.optLong("video_view_count", 0)) + // .setHeight(height) + // .setWidth(width) + // .build(); + // // Log.d(TAG, "getSliderItems: sliderItem: " + sliderItem); + // sliderItems.add(sliderItem); + // } + // return sliderItems; + // } public static StoryModel parseStoryItem(final JSONObject data, final boolean isLoc, @@ -883,19 +967,19 @@ public final class ResponseBodyUtils { final String localUsername) throws JSONException { final boolean isVideo = data.has("video_duration"); final StoryModel model = new StoryModel(data.getString("id"), - data.getJSONObject("image_versions2").getJSONArray("candidates").getJSONObject(0) - .getString("url"), null, - isVideo ? MediaItemType.MEDIA_TYPE_VIDEO : MediaItemType.MEDIA_TYPE_IMAGE, - data.optLong("taken_at", 0), - (isLoc || isHashtag) - ? data.getJSONObject("user").getString("username") - : localUsername, - data.getJSONObject("user").getString("pk"), - data.optBoolean("can_reply")); + data.getJSONObject("image_versions2").getJSONArray("candidates").getJSONObject(0) + .getString("url"), null, + isVideo ? MediaItemType.MEDIA_TYPE_VIDEO : MediaItemType.MEDIA_TYPE_IMAGE, + data.optLong("taken_at", 0), + (isLoc || isHashtag) + ? data.getJSONObject("user").getString("username") + : localUsername, + data.getJSONObject("user").getLong("pk"), + data.optBoolean("can_reply")); if (data.getJSONObject("image_versions2").getJSONArray("candidates").length() > 1) { model.setThumbnail(data.getJSONObject("image_versions2").getJSONArray("candidates").getJSONObject(1) - .getString("url")); + .getString("url")); } final JSONArray videoResources = data.optJSONArray("video_versions"); @@ -928,7 +1012,7 @@ public final class ResponseBodyUtils { } if (data.has("story_questions")) { final JSONObject tappableObject = data.getJSONArray("story_questions").getJSONObject(0) - .optJSONObject("question_sticker"); + .optJSONObject("question_sticker"); if (tappableObject != null && !tappableObject.getString("question_type").equals("music")) model.setQuestion(new QuestionModel( String.valueOf(tappableObject.getLong("question_id")), @@ -964,7 +1048,7 @@ public final class ResponseBodyUtils { } if (data.has("story_sliders")) { final JSONObject tappableObject = data.getJSONArray("story_sliders").getJSONObject(0) - .optJSONObject("slider_sticker"); + .optJSONObject("slider_sticker"); if (tappableObject != null) model.setSlider(new SliderModel( String.valueOf(tappableObject.getLong("slider_id")), @@ -1005,6 +1089,14 @@ public final class ResponseBodyUtils { return model; } + public static String getThumbUrl(final Media media) { + if (media == null) { + return null; + } + final ImageVersions2 imageVersions2 = media.getImageVersions2(); + return getThumbUrl(imageVersions2); + } + public static String getThumbUrl(final ImageVersions2 imageVersions2) { if (imageVersions2 == null) return null; final List candidates = imageVersions2.getCandidates(); @@ -1014,6 +1106,17 @@ public final class ResponseBodyUtils { return mediaCandidate.getUrl(); } + public static String getImageUrl(final Media media) { + if (media == null) return null; + final ImageVersions2 imageVersions2 = media.getImageVersions2(); + if (imageVersions2 == null) return null; + final List candidates = imageVersions2.getCandidates(); + if (candidates == null || candidates.isEmpty()) return null; + final MediaCandidate candidate = candidates.get(0); + if (candidate == null) return null; + return candidate.getUrl(); + } + public static boolean isRead(final DirectItem item, final Map lastSeenAt, final List userIdsToCheck, diff --git a/app/src/main/java/awais/instagrabber/viewmodels/AppStateViewModel.java b/app/src/main/java/awais/instagrabber/viewmodels/AppStateViewModel.java index 4bf5a664..134d8170 100644 --- a/app/src/main/java/awais/instagrabber/viewmodels/AppStateViewModel.java +++ b/app/src/main/java/awais/instagrabber/viewmodels/AppStateViewModel.java @@ -16,7 +16,7 @@ import awais.instagrabber.db.entities.Account; import awais.instagrabber.db.repositories.AccountRepository; import awais.instagrabber.db.repositories.RepositoryCallback; import awais.instagrabber.interfaces.FetchListener; -import awais.instagrabber.models.ProfileModel; +import awais.instagrabber.repositories.responses.User; import awais.instagrabber.utils.Constants; import awais.instagrabber.utils.CookieUtils; import awais.instagrabber.utils.TextUtils; @@ -26,7 +26,7 @@ import static awais.instagrabber.utils.Utils.settingsHelper; public class AppStateViewModel extends AndroidViewModel { private static final String TAG = AppStateViewModel.class.getSimpleName(); - private final MutableLiveData currentUser = new MutableLiveData<>(); + private final MutableLiveData currentUser = new MutableLiveData<>(); private final String cookie; private final boolean isLoggedIn; @@ -37,7 +37,7 @@ public class AppStateViewModel extends AndroidViewModel { super(application); Log.d(TAG, "AppStateViewModel: constructor"); cookie = settingsHelper.getString(Constants.COOKIE); - isLoggedIn = !TextUtils.isEmpty(cookie) && CookieUtils.getUserIdFromCookie(cookie) != null; + isLoggedIn = !TextUtils.isEmpty(cookie) && CookieUtils.getUserIdFromCookie(cookie) > 0; if (!isLoggedIn) return; accountRepository = AccountRepository.getInstance(AccountDataSource.getInstance(application)); setCurrentUser(); @@ -53,7 +53,7 @@ public class AppStateViewModel extends AndroidViewModel { fetchUsername(usernameListener); } - public LiveData getCurrentUser() { + public LiveData getCurrentUser() { return currentUser; } @@ -62,8 +62,8 @@ public class AppStateViewModel extends AndroidViewModel { usernameListener.onResult(username); return; } - final String uid = CookieUtils.getUserIdFromCookie(cookie); - if (uid == null) return; + final long uid = CookieUtils.getUserIdFromCookie(cookie); + if (uid <= 0) return; accountRepository.getAccount(uid, new RepositoryCallback() { @Override public void onSuccess(@NonNull final Account account) { @@ -84,11 +84,7 @@ public class AppStateViewModel extends AndroidViewModel { if (TextUtils.isEmpty(username)) return; new ProfileFetcher( username.trim().substring(1), - profileModel -> currentUser.postValue(profileModel) + currentUser::postValue ).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); } - - public void refreshCurrentUser() { - - } } diff --git a/app/src/main/java/awais/instagrabber/viewmodels/BasePostViewModel.java b/app/src/main/java/awais/instagrabber/viewmodels/BasePostViewModel.java deleted file mode 100644 index eb4dc8d2..00000000 --- a/app/src/main/java/awais/instagrabber/viewmodels/BasePostViewModel.java +++ /dev/null @@ -1,27 +0,0 @@ -package awais.instagrabber.viewmodels; - -import androidx.lifecycle.MutableLiveData; -import androidx.lifecycle.ViewModel; - -import java.util.List; - -import awais.instagrabber.models.BasePostModel; - -public class BasePostViewModel extends ViewModel { - private MutableLiveData> list; - - public MutableLiveData> getList() { - if (list == null) { - list = new MutableLiveData<>(); - } - return list; - } - - public void edit(int index, T post) { - - } - - public void delete(int index) { - - } -} \ No newline at end of file diff --git a/app/src/main/java/awais/instagrabber/viewmodels/DirectInboxViewModel.java b/app/src/main/java/awais/instagrabber/viewmodels/DirectInboxViewModel.java index d13e1257..9351a579 100644 --- a/app/src/main/java/awais/instagrabber/viewmodels/DirectInboxViewModel.java +++ b/app/src/main/java/awais/instagrabber/viewmodels/DirectInboxViewModel.java @@ -10,11 +10,11 @@ import java.util.Collection; import java.util.LinkedList; import java.util.List; +import awais.instagrabber.repositories.responses.User; import awais.instagrabber.repositories.responses.directmessages.DirectBadgeCount; import awais.instagrabber.repositories.responses.directmessages.DirectInbox; import awais.instagrabber.repositories.responses.directmessages.DirectInboxResponse; import awais.instagrabber.repositories.responses.directmessages.DirectThread; -import awais.instagrabber.repositories.responses.directmessages.DirectUser; import awais.instagrabber.utils.Constants; import awais.instagrabber.utils.CookieUtils; import awais.instagrabber.utils.TextUtils; @@ -39,14 +39,14 @@ public class DirectInboxViewModel extends ViewModel { private long seqId; private String cursor; private boolean hasOlder = true; - private DirectUser viewer; + private User viewer; public DirectInboxViewModel() { final String cookie = settingsHelper.getString(Constants.COOKIE); - final String userId = CookieUtils.getUserIdFromCookie(cookie); + final long userId = CookieUtils.getUserIdFromCookie(cookie); final String deviceUuid = settingsHelper.getString(Constants.DEVICE_UUID); final String csrfToken = CookieUtils.getCsrfTokenFromCookie(cookie); - if (TextUtils.isEmpty(csrfToken) || TextUtils.isEmpty(userId) || TextUtils.isEmpty(deviceUuid)) { + if (TextUtils.isEmpty(csrfToken) || userId <= 0 || TextUtils.isEmpty(deviceUuid)) { throw new IllegalArgumentException("User is not logged in!"); } service = DirectMessagesService.getInstance(csrfToken, userId, deviceUuid); @@ -78,7 +78,7 @@ public class DirectInboxViewModel extends ViewModel { return fetchingInbox; } - public DirectUser getViewer() { + public User getViewer() { return viewer; } diff --git a/app/src/main/java/awais/instagrabber/viewmodels/DirectSettingsViewModel.java b/app/src/main/java/awais/instagrabber/viewmodels/DirectSettingsViewModel.java index d871207c..14ae8c8a 100644 --- a/app/src/main/java/awais/instagrabber/viewmodels/DirectSettingsViewModel.java +++ b/app/src/main/java/awais/instagrabber/viewmodels/DirectSettingsViewModel.java @@ -26,11 +26,11 @@ import java.util.stream.Collectors; import awais.instagrabber.R; import awais.instagrabber.dialogs.MultiOptionDialogFragment.Option; import awais.instagrabber.models.Resource; -import awais.instagrabber.repositories.responses.FriendshipRepoChangeRootResponse; -import awais.instagrabber.repositories.responses.FriendshipRepoRestrictRootResponse; +import awais.instagrabber.repositories.responses.FriendshipChangeResponse; +import awais.instagrabber.repositories.responses.FriendshipRestrictResponse; +import awais.instagrabber.repositories.responses.User; import awais.instagrabber.repositories.responses.directmessages.DirectThread; import awais.instagrabber.repositories.responses.directmessages.DirectThreadDetailsChangeResponse; -import awais.instagrabber.repositories.responses.directmessages.DirectUser; import awais.instagrabber.utils.Constants; import awais.instagrabber.utils.CookieUtils; import awais.instagrabber.utils.TextUtils; @@ -55,19 +55,19 @@ public class DirectSettingsViewModel extends AndroidViewModel { private static final String ACTION_RESTRICT = "restrict"; private static final String ACTION_UNRESTRICT = "unrestrict"; - private final MutableLiveData, List>> users = new MutableLiveData<>( + private final MutableLiveData, List>> users = new MutableLiveData<>( new Pair<>(Collections.emptyList(), Collections.emptyList())); private final MutableLiveData title = new MutableLiveData<>(""); private final MutableLiveData> adminUserIds = new MutableLiveData<>(Collections.emptyList()); private final DirectMessagesService directMessagesService; private DirectThread thread; - private final String userId; + private final long userId; private boolean viewerIsAdmin; private final Resources resources; private final FriendshipService friendshipService; private final String csrfToken; - private DirectUser viewer; + private User viewer; public DirectSettingsViewModel(final Application application) { super(application); @@ -75,7 +75,7 @@ public class DirectSettingsViewModel extends AndroidViewModel { userId = CookieUtils.getUserIdFromCookie(cookie); final String deviceUuid = settingsHelper.getString(Constants.DEVICE_UUID); csrfToken = CookieUtils.getCsrfTokenFromCookie(cookie); - if (TextUtils.isEmpty(csrfToken) || TextUtils.isEmpty(userId) || TextUtils.isEmpty(deviceUuid)) { + if (TextUtils.isEmpty(csrfToken) || userId <= 0 || TextUtils.isEmpty(deviceUuid)) { throw new IllegalArgumentException("User is not logged in!"); } directMessagesService = DirectMessagesService.getInstance(csrfToken, userId, deviceUuid); @@ -90,9 +90,9 @@ public class DirectSettingsViewModel extends AndroidViewModel { public void setThread(@NonNull final DirectThread thread) { this.thread = thread; - List users = thread.getUsers(); + List users = thread.getUsers(); if (viewer != null) { - final ImmutableList.Builder builder = ImmutableList.builder().add(viewer); + final ImmutableList.Builder builder = ImmutableList.builder().add(viewer); if (users != null) { builder.addAll(users); } @@ -102,7 +102,7 @@ public class DirectSettingsViewModel extends AndroidViewModel { setTitle(thread.getThreadTitle()); final List adminUserIds = thread.getAdminUserIds(); this.adminUserIds.postValue(adminUserIds); - viewerIsAdmin = adminUserIds.contains(Long.parseLong(userId)); + viewerIsAdmin = adminUserIds.contains(userId); } public boolean isGroup() { @@ -112,7 +112,7 @@ public class DirectSettingsViewModel extends AndroidViewModel { return false; } - public LiveData, List>> getUsers() { + public LiveData, List>> getUsers() { return users; } @@ -140,15 +140,15 @@ public class DirectSettingsViewModel extends AndroidViewModel { return data; } - public LiveData> addMembers(final Set users) { + public LiveData> addMembers(final Set users) { final MutableLiveData> data = new MutableLiveData<>(); final Call addUsersRequest = directMessagesService - .addUsers(thread.getThreadId(), users.stream().map(DirectUser::getPk).collect(Collectors.toList())); + .addUsers(thread.getThreadId(), users.stream().map(User::getPk).collect(Collectors.toList())); handleDetailsChangeRequest(data, addUsersRequest); return data; } - public LiveData> removeMember(final DirectUser user) { + public LiveData> removeMember(final User user) { final MutableLiveData> data = new MutableLiveData<>(); final Call request = directMessagesService .removeUsers(thread.getThreadId(), Collections.singleton(user.getPk())); @@ -159,22 +159,22 @@ public class DirectSettingsViewModel extends AndroidViewModel { handleAdminChangeResponseError(response, data); return; } - Pair, List> usersValue = users.getValue(); + Pair, List> usersValue = users.getValue(); if (usersValue == null) { usersValue = new Pair<>(Collections.emptyList(), Collections.emptyList()); } - List activeUsers = usersValue.first; + List activeUsers = usersValue.first; if (activeUsers == null) { activeUsers = Collections.emptyList(); } - final List updatedActiveUsers = activeUsers.stream() - .filter(user1 -> user1.getPk() != user.getPk()) - .collect(Collectors.toList()); - List leftUsers = usersValue.second; + final List updatedActiveUsers = activeUsers.stream() + .filter(user1 -> user1.getPk() != user.getPk()) + .collect(Collectors.toList()); + List leftUsers = usersValue.second; if (leftUsers == null) { leftUsers = Collections.emptyList(); } - final ImmutableList updateLeftUsers = ImmutableList.builder() + final ImmutableList updateLeftUsers = ImmutableList.builder() .addAll(leftUsers) .add(user) .build(); @@ -190,7 +190,7 @@ public class DirectSettingsViewModel extends AndroidViewModel { return data; } - private LiveData> makeAdmin(final DirectUser user) { + private LiveData> makeAdmin(final User user) { final MutableLiveData> data = new MutableLiveData<>(); if (isAdmin(user)) return data; final Call request = directMessagesService.addAdmins(thread.getThreadId(), Collections.singleton(user.getPk())); @@ -217,7 +217,7 @@ public class DirectSettingsViewModel extends AndroidViewModel { return data; } - private LiveData> removeAdmin(final DirectUser user) { + private LiveData> removeAdmin(final User user) { final MutableLiveData> data = new MutableLiveData<>(); if (!isAdmin(user)) return data; final Call request = directMessagesService.removeAdmins(thread.getThreadId(), Collections.singleton(user.getPk())); @@ -262,11 +262,11 @@ public class DirectSettingsViewModel extends AndroidViewModel { } } - private LiveData> blockUser(final DirectUser user) { + private LiveData> blockUser(final User user) { final MutableLiveData> data = new MutableLiveData<>(); - friendshipService.block(userId, String.valueOf(user.getPk()), csrfToken, new ServiceCallback() { + friendshipService.block(userId, user.getPk(), csrfToken, new ServiceCallback() { @Override - public void onSuccess(final FriendshipRepoChangeRootResponse result) { + public void onSuccess(final FriendshipChangeResponse result) { // refresh thread } @@ -279,11 +279,11 @@ public class DirectSettingsViewModel extends AndroidViewModel { return data; } - private LiveData> unblockUser(final DirectUser user) { + private LiveData> unblockUser(final User user) { final MutableLiveData> data = new MutableLiveData<>(); - friendshipService.unblock(userId, String.valueOf(user.getPk()), csrfToken, new ServiceCallback() { + friendshipService.unblock(userId, user.getPk(), csrfToken, new ServiceCallback() { @Override - public void onSuccess(final FriendshipRepoChangeRootResponse result) { + public void onSuccess(final FriendshipChangeResponse result) { // refresh thread } @@ -296,11 +296,11 @@ public class DirectSettingsViewModel extends AndroidViewModel { return data; } - private LiveData> restrictUser(final DirectUser user) { + private LiveData> restrictUser(final User user) { final MutableLiveData> data = new MutableLiveData<>(); - friendshipService.toggleRestrict(String.valueOf(user.getPk()), true, csrfToken, new ServiceCallback() { + friendshipService.toggleRestrict(user.getPk(), true, csrfToken, new ServiceCallback() { @Override - public void onSuccess(final FriendshipRepoRestrictRootResponse result) { + public void onSuccess(final FriendshipRestrictResponse result) { // refresh thread } @@ -313,11 +313,11 @@ public class DirectSettingsViewModel extends AndroidViewModel { return data; } - private LiveData> unRestrictUser(final DirectUser user) { + private LiveData> unRestrictUser(final User user) { final MutableLiveData> data = new MutableLiveData<>(); - friendshipService.toggleRestrict(String.valueOf(user.getPk()), false, csrfToken, new ServiceCallback() { + friendshipService.toggleRestrict(user.getPk(), false, csrfToken, new ServiceCallback() { @Override - public void onSuccess(final FriendshipRepoRestrictRootResponse result) { + public void onSuccess(final FriendshipRestrictResponse result) { // refresh thread } @@ -375,7 +375,7 @@ public class DirectSettingsViewModel extends AndroidViewModel { } } - public ArrayList> createUserOptions(final DirectUser user) { + public ArrayList> createUserOptions(final User user) { final ArrayList> options = new ArrayList<>(); if (user == null || isSelf(user) || hasLeft(user)) { return options; @@ -408,26 +408,26 @@ public class DirectSettingsViewModel extends AndroidViewModel { return options; } - private boolean hasLeft(final DirectUser user) { - final Pair, List> users = this.users.getValue(); + private boolean hasLeft(final User user) { + final Pair, List> users = this.users.getValue(); if (users == null || users.second == null) return false; return users.second.contains(user); } - private boolean isAdmin(final DirectUser user) { + private boolean isAdmin(final User user) { final List adminUserIdsValue = adminUserIds.getValue(); return adminUserIdsValue != null && adminUserIdsValue.contains(user.getPk()); } - private boolean isSelf(final DirectUser user) { - return user.getPk() == Long.parseLong(userId); + private boolean isSelf(final User user) { + return user.getPk() == userId; } private String getString(@StringRes final int resId) { return resources.getString(resId); } - public LiveData> doAction(final DirectUser user, final String action) { + public LiveData> doAction(final User user, final String action) { if (user == null || action == null) return null; switch (action) { case ACTION_KICK: @@ -451,7 +451,7 @@ public class DirectSettingsViewModel extends AndroidViewModel { } } - public void setViewer(final DirectUser viewer) { + public void setViewer(final User viewer) { this.viewer = viewer; } } diff --git a/app/src/main/java/awais/instagrabber/viewmodels/DirectThreadViewModel.java b/app/src/main/java/awais/instagrabber/viewmodels/DirectThreadViewModel.java index f2ababbc..cfb1858e 100644 --- a/app/src/main/java/awais/instagrabber/viewmodels/DirectThreadViewModel.java +++ b/app/src/main/java/awais/instagrabber/viewmodels/DirectThreadViewModel.java @@ -30,18 +30,17 @@ import java.util.Locale; import java.util.UUID; import java.util.stream.Collectors; -import awais.instagrabber.models.ProfileModel; import awais.instagrabber.models.Resource; import awais.instagrabber.models.UploadVideoOptions; import awais.instagrabber.repositories.requests.UploadFinishOptions; import awais.instagrabber.repositories.requests.directmessages.BroadcastOptions.ThreadIdOrUserIds; +import awais.instagrabber.repositories.responses.User; import awais.instagrabber.repositories.responses.directmessages.DirectItem; import awais.instagrabber.repositories.responses.directmessages.DirectThread; import awais.instagrabber.repositories.responses.directmessages.DirectThreadBroadcastResponse; import awais.instagrabber.repositories.responses.directmessages.DirectThreadBroadcastResponseMessageMetadata; import awais.instagrabber.repositories.responses.directmessages.DirectThreadBroadcastResponsePayload; import awais.instagrabber.repositories.responses.directmessages.DirectThreadFeedResponse; -import awais.instagrabber.repositories.responses.directmessages.DirectUser; import awais.instagrabber.utils.BitmapUtils; import awais.instagrabber.utils.Constants; import awais.instagrabber.utils.CookieUtils; @@ -74,7 +73,7 @@ public class DirectThreadViewModel extends AndroidViewModel { private final MutableLiveData> items = new MutableLiveData<>(new LinkedList<>()); private final MutableLiveData threadTitle = new MutableLiveData<>(""); private final MutableLiveData fetching = new MutableLiveData<>(false); - private final MutableLiveData> users = new MutableLiveData<>(new ArrayList<>()); + private final MutableLiveData> users = new MutableLiveData<>(new ArrayList<>()); private final DirectMessagesService service; private final ContentResolver contentResolver; private final MediaService mediaService; @@ -86,17 +85,17 @@ public class DirectThreadViewModel extends AndroidViewModel { private String threadId; private boolean hasOlder = true; private ThreadIdOrUserIds threadIdOrUserIds; - private ProfileModel currentUser; + private User currentUser; private Call chatsRequest; private VoiceRecorder voiceRecorder; public DirectThreadViewModel(@NonNull final Application application) { super(application); final String cookie = settingsHelper.getString(Constants.COOKIE); - final String userId = CookieUtils.getUserIdFromCookie(cookie); + final long userId = CookieUtils.getUserIdFromCookie(cookie); final String deviceUuid = settingsHelper.getString(Constants.DEVICE_UUID); csrfToken = CookieUtils.getCsrfTokenFromCookie(cookie); - if (TextUtils.isEmpty(csrfToken) || TextUtils.isEmpty(userId) || TextUtils.isEmpty(deviceUuid)) { + if (TextUtils.isEmpty(csrfToken) || userId <= 0 || TextUtils.isEmpty(deviceUuid)) { throw new IllegalArgumentException("User is not logged in!"); } service = DirectMessagesService.getInstance(csrfToken, userId, deviceUuid); @@ -184,7 +183,7 @@ public class DirectThreadViewModel extends AndroidViewModel { return fetching; } - public LiveData> getUsers() { + public LiveData> getUsers() { return users; } @@ -552,7 +551,7 @@ public class DirectThreadViewModel extends AndroidViewModel { }); } - public void setCurrentUser(final ProfileModel currentUser) { + public void setCurrentUser(final User currentUser) { this.currentUser = currentUser; } @@ -607,18 +606,11 @@ public class DirectThreadViewModel extends AndroidViewModel { @Nullable private Long handleCurrentUser(final MutableLiveData> data) { - if (currentUser == null || currentUser.getId() == null) { + if (currentUser == null || currentUser.getPk() <= 0) { data.postValue(Resource.error(ERROR_INVALID_USER, null)); return null; } - final long userId; - try { - userId = Long.parseLong(currentUser.getId()); - } catch (NumberFormatException e) { - data.postValue(Resource.error(ERROR_INVALID_USER, null)); - Log.e(TAG, "sendUri: ", e); - return null; - } + final long userId = currentUser.getPk(); if (threadIdOrUserIds == null) { data.postValue(Resource.error(ERROR_INVALID_THREAD, null)); return null; diff --git a/app/src/main/java/awais/instagrabber/viewmodels/DiscoverItemViewModel.java b/app/src/main/java/awais/instagrabber/viewmodels/DiscoverItemViewModel.java deleted file mode 100644 index 9d11c51c..00000000 --- a/app/src/main/java/awais/instagrabber/viewmodels/DiscoverItemViewModel.java +++ /dev/null @@ -1,7 +0,0 @@ -package awais.instagrabber.viewmodels; - -import awais.instagrabber.models.DiscoverItemModel; - -public class DiscoverItemViewModel extends BasePostViewModel { - -} \ No newline at end of file diff --git a/app/src/main/java/awais/instagrabber/viewmodels/FeedViewModel.java b/app/src/main/java/awais/instagrabber/viewmodels/FeedViewModel.java deleted file mode 100644 index a368f0b4..00000000 --- a/app/src/main/java/awais/instagrabber/viewmodels/FeedViewModel.java +++ /dev/null @@ -1,7 +0,0 @@ -package awais.instagrabber.viewmodels; - -import awais.instagrabber.models.FeedModel; - -public class FeedViewModel extends BasePostViewModel { - -} \ No newline at end of file diff --git a/app/src/main/java/awais/instagrabber/viewmodels/ViewerPostViewModel.java b/app/src/main/java/awais/instagrabber/viewmodels/MediaViewModel.java similarity index 51% rename from app/src/main/java/awais/instagrabber/viewmodels/ViewerPostViewModel.java rename to app/src/main/java/awais/instagrabber/viewmodels/MediaViewModel.java index 07bf525c..dac55056 100644 --- a/app/src/main/java/awais/instagrabber/viewmodels/ViewerPostViewModel.java +++ b/app/src/main/java/awais/instagrabber/viewmodels/MediaViewModel.java @@ -5,15 +5,15 @@ import androidx.lifecycle.ViewModel; import java.util.List; -import awais.instagrabber.models.ViewerPostModelWrapper; +import awais.instagrabber.repositories.responses.Media; -public class ViewerPostViewModel extends ViewModel { - private MutableLiveData> list; +public class MediaViewModel extends ViewModel { + private MutableLiveData> list; - public MutableLiveData> getList() { + public MutableLiveData> getList() { if (list == null) { list = new MutableLiveData<>(); } return list; } -} +} \ No newline at end of file diff --git a/app/src/main/java/awais/instagrabber/viewmodels/PostsViewModel.java b/app/src/main/java/awais/instagrabber/viewmodels/PostsViewModel.java deleted file mode 100644 index 12427ad1..00000000 --- a/app/src/main/java/awais/instagrabber/viewmodels/PostsViewModel.java +++ /dev/null @@ -1,7 +0,0 @@ -package awais.instagrabber.viewmodels; - -import awais.instagrabber.models.PostModel; - -public class PostsViewModel extends BasePostViewModel { - -} \ No newline at end of file diff --git a/app/src/main/java/awais/instagrabber/viewmodels/UserSearchViewModel.java b/app/src/main/java/awais/instagrabber/viewmodels/UserSearchViewModel.java index ecc4b0a4..ab43a2ec 100644 --- a/app/src/main/java/awais/instagrabber/viewmodels/UserSearchViewModel.java +++ b/app/src/main/java/awais/instagrabber/viewmodels/UserSearchViewModel.java @@ -16,8 +16,8 @@ import java.util.Set; import java.util.stream.Collectors; import awais.instagrabber.models.Resource; +import awais.instagrabber.repositories.responses.User; import awais.instagrabber.repositories.responses.UserSearchResponse; -import awais.instagrabber.repositories.responses.directmessages.DirectUser; import awais.instagrabber.utils.Debouncer; import awais.instagrabber.webservices.UserService; import okhttp3.ResponseBody; @@ -33,10 +33,10 @@ public class UserSearchViewModel extends ViewModel { private String currentQuery; private Call searchRequest; - private final MutableLiveData>> users = new MutableLiveData<>(); + private final MutableLiveData>> users = new MutableLiveData<>(); private final MutableLiveData showAction = new MutableLiveData<>(false); private final Debouncer searchDebouncer; - private final Set selectedUsers = new HashSet<>(); + private final Set selectedUsers = new HashSet<>(); private final UserService userService; private long[] hideUserIds; @@ -59,7 +59,7 @@ public class UserSearchViewModel extends ViewModel { searchDebouncer = new Debouncer<>(searchCallback, 1000); } - public LiveData>> getUsers() { + public LiveData>> getUsers() { return users; } @@ -119,7 +119,7 @@ public class UserSearchViewModel extends ViewModel { users.postValue(Resource.error(errorString, Collections.emptyList())); } - public void setSelectedUser(final DirectUser user, final boolean selected) { + public void setSelectedUser(final User user, final boolean selected) { if (selected) { selectedUsers.add(user); } else { @@ -128,7 +128,7 @@ public class UserSearchViewModel extends ViewModel { showAction.postValue(!selectedUsers.isEmpty()); } - public Set getSelectedUsers() { + public Set getSelectedUsers() { return selectedUsers; } diff --git a/app/src/main/java/awais/instagrabber/webservices/AddCookiesInterceptor.java b/app/src/main/java/awais/instagrabber/webservices/AddCookiesInterceptor.java index 70920088..37d123b5 100644 --- a/app/src/main/java/awais/instagrabber/webservices/AddCookiesInterceptor.java +++ b/app/src/main/java/awais/instagrabber/webservices/AddCookiesInterceptor.java @@ -6,6 +6,7 @@ import java.io.IOException; import awais.instagrabber.utils.Constants; import awais.instagrabber.utils.LocaleUtils; +import awais.instagrabber.utils.TextUtils; import awais.instagrabber.utils.Utils; import okhttp3.Interceptor; import okhttp3.Request; @@ -18,10 +19,13 @@ public class AddCookiesInterceptor implements Interceptor { final Request request = chain.request(); final Request.Builder builder = request.newBuilder(); final String cookie = Utils.settingsHelper.getString(Constants.COOKIE); - builder.addHeader("Cookie", cookie); + final boolean hasCookie = !TextUtils.isEmpty(cookie); + if (hasCookie) { + builder.addHeader("Cookie", cookie); + } final String userAgentHeader = "User-Agent"; if (request.header(userAgentHeader) == null) { - builder.addHeader(userAgentHeader, Constants.I_USER_AGENT); + builder.addHeader(userAgentHeader, hasCookie ? Constants.I_USER_AGENT : Constants.USER_AGENT); } final String languageHeader = "Accept-Language"; if (request.header(languageHeader) == null) { diff --git a/app/src/main/java/awais/instagrabber/webservices/BaseService.java b/app/src/main/java/awais/instagrabber/webservices/BaseService.java index b794e319..ca850400 100644 --- a/app/src/main/java/awais/instagrabber/webservices/BaseService.java +++ b/app/src/main/java/awais/instagrabber/webservices/BaseService.java @@ -7,6 +7,7 @@ import com.google.gson.GsonBuilder; import java.io.File; import awais.instagrabber.BuildConfig; +import awais.instagrabber.repositories.responses.Caption; import awais.instagrabber.utils.Utils; import okhttp3.Cache; import okhttp3.OkHttpClient; @@ -33,6 +34,7 @@ public abstract class BaseService { } final Gson gson = new GsonBuilder() .setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES) + .registerTypeAdapter(Caption.class, new Caption.CaptionDeserializer()) .create(); builder = new Retrofit.Builder() .addConverterFactory(ScalarsConverterFactory.create()) diff --git a/app/src/main/java/awais/instagrabber/webservices/DirectMessagesService.java b/app/src/main/java/awais/instagrabber/webservices/DirectMessagesService.java index 802f328d..f7a2c9df 100644 --- a/app/src/main/java/awais/instagrabber/webservices/DirectMessagesService.java +++ b/app/src/main/java/awais/instagrabber/webservices/DirectMessagesService.java @@ -40,11 +40,11 @@ public class DirectMessagesService extends BaseService { private final DirectMessagesRepository repository; private final String csrfToken; - private final String userId; + private final long userId; private final String deviceUuid; private DirectMessagesService(@NonNull final String csrfToken, - @NonNull final String userId, + final long userId, @NonNull final String deviceUuid) { this.csrfToken = csrfToken; this.userId = userId; @@ -59,7 +59,7 @@ public class DirectMessagesService extends BaseService { return csrfToken; } - public String getUserId() { + public long getUserId() { return userId; } @@ -68,7 +68,7 @@ public class DirectMessagesService extends BaseService { } public static DirectMessagesService getInstance(@NonNull final String csrfToken, - @NonNull final String userId, + final long userId, @NonNull final String deviceUuid) { if (instance == null || !Objects.equals(instance.getCsrfToken(), csrfToken) @@ -153,7 +153,8 @@ public class DirectMessagesService extends BaseService { public Call broadcastStoryReply(final ThreadIdOrUserIds threadIdOrUserIds, final String text, - final String mediaId, final String reelId) throws UnsupportedEncodingException { + final String mediaId, + final String reelId) throws UnsupportedEncodingException { return broadcast(new StoryReplyBroadcastOptions(UUID.randomUUID().toString(), threadIdOrUserIds, text, mediaId, reelId)); } diff --git a/app/src/main/java/awais/instagrabber/webservices/DiscoverService.java b/app/src/main/java/awais/instagrabber/webservices/DiscoverService.java index 84d7f305..294a6a7d 100644 --- a/app/src/main/java/awais/instagrabber/webservices/DiscoverService.java +++ b/app/src/main/java/awais/instagrabber/webservices/DiscoverService.java @@ -4,22 +4,10 @@ import androidx.annotation.NonNull; import com.google.common.collect.ImmutableMap; -import org.json.JSONArray; -import org.json.JSONException; -import org.json.JSONObject; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; import java.util.Objects; -import awais.instagrabber.models.FeedModel; -import awais.instagrabber.models.ProfileModel; -import awais.instagrabber.models.TopicCluster; -import awais.instagrabber.models.enums.MediaItemType; import awais.instagrabber.repositories.DiscoverRepository; -import awais.instagrabber.utils.Constants; -import awais.instagrabber.utils.ResponseBodyUtils; +import awais.instagrabber.repositories.responses.discover.TopicalExploreFeedResponse; import awais.instagrabber.utils.TextUtils; import retrofit2.Call; import retrofit2.Callback; @@ -49,7 +37,7 @@ public class DiscoverService extends BaseService { } public void topicalExplore(@NonNull final TopicalExploreRequest request, - final ServiceCallback callback) { + final ServiceCallback callback) { final ImmutableMap.Builder builder = ImmutableMap.builder() .put("module", "explore_popular"); if (!TextUtils.isEmpty(request.getModule())) { @@ -58,169 +46,167 @@ public class DiscoverService extends BaseService { if (!TextUtils.isEmpty(request.getClusterId())) { builder.put("cluster_id", request.getClusterId()); } - if (request.getMaxId() >= 0) { - builder.put("max_id", String.valueOf(request.getMaxId())); + if (!TextUtils.isEmpty(request.getMaxId())) { + builder.put("max_id", request.getMaxId()); } - final Call req = repository.topicalExplore(builder.build()); - req.enqueue(new Callback() { + final Call req = repository.topicalExplore(builder.build()); + req.enqueue(new Callback() { @Override - public void onResponse(@NonNull final Call call, @NonNull final Response response) { - if (callback == null) { - return; - } - final String body = response.body(); - if (TextUtils.isEmpty(body)) { + public void onResponse(@NonNull final Call call, + @NonNull final Response response) { + if (callback == null) return; + final TopicalExploreFeedResponse feedResponse = response.body(); + if (feedResponse == null) { callback.onSuccess(null); return; } - try { - final TopicalExploreResponse topicalExploreResponse = parseTopicalExploreResponse(body); - callback.onSuccess(topicalExploreResponse); - } catch (JSONException e) { - callback.onFailure(e); - // Log.e(TAG, "Error parsing topicalExplore response", e); - } + callback.onSuccess(feedResponse); + // try { + // } catch (JSONException e) { + // callback.onFailure(e); + // // Log.e(TAG, "Error parsing topicalExplore response", e); + // } } @Override - public void onFailure(@NonNull final Call call, @NonNull final Throwable t) { + public void onFailure(@NonNull final Call call, @NonNull final Throwable t) { callback.onFailure(t); } }); } - private TopicalExploreResponse parseTopicalExploreResponse(@NonNull final String body) throws JSONException { - final JSONObject root = new JSONObject(body); - final boolean moreAvailable = root.optBoolean("more_available"); - final int nextMaxId = root.optInt("next_max_id", -1); - final int numResults = root.optInt("num_results"); - final String status = root.optString("status"); - final JSONArray clustersJson = root.optJSONArray("clusters"); - final List clusters = parseClusters(clustersJson); - final JSONArray itemsJson = root.optJSONArray("items"); - final List items = parseItems(itemsJson); - return new TopicalExploreResponse( - moreAvailable, - nextMaxId, - numResults, - status, - clusters, - items - ); - } + // private TopicalExploreResponse parseTopicalExploreResponse(@NonNull final String body) throws JSONException { + // final JSONObject root = new JSONObject(body); + // final boolean moreAvailable = root.optBoolean("more_available"); + // final int nextMaxId = root.optInt("next_max_id", -1); + // final int numResults = root.optInt("num_results"); + // final String status = root.optString("status"); + // final JSONArray clustersJson = root.optJSONArray("clusters"); + // final List clusters = parseClusters(clustersJson); + // final JSONArray itemsJson = root.optJSONArray("items"); + // final List items = parseItems(itemsJson); + // return new TopicalExploreResponse( + // moreAvailable, + // nextMaxId, + // numResults, + // status, + // clusters, + // items + // ); + // } - private List parseClusters(final JSONArray clustersJson) throws JSONException { - if (clustersJson == null) { - return Collections.emptyList(); - } - final List clusters = new ArrayList<>(); - for (int i = 0; i < clustersJson.length(); i++) { - final JSONObject clusterJson = clustersJson.getJSONObject(i); - final String id = clusterJson.optString("id"); - final String title = clusterJson.optString("title"); - if (TextUtils.isEmpty(id) || TextUtils.isEmpty(title)) { - continue; - } - final String type = clusterJson.optString("type"); - final boolean canMute = clusterJson.optBoolean("can_mute"); - final boolean isMuted = clusterJson.optBoolean("is_muted"); - final JSONObject coverMediaJson = clusterJson.optJSONObject("cover_media"); - final int rankedPosition = clusterJson.optInt("ranked_position"); - final FeedModel feedModel = parseClusterCover(coverMediaJson); - final TopicCluster topicCluster = new TopicCluster( - id, - title, - type, - canMute, - isMuted, - rankedPosition, - feedModel - ); - clusters.add(topicCluster); - } - return clusters; - } + // private List parseClusters(final JSONArray clustersJson) throws JSONException { + // if (clustersJson == null) { + // return Collections.emptyList(); + // } + // final List clusters = new ArrayList<>(); + // for (int i = 0; i < clustersJson.length(); i++) { + // final JSONObject clusterJson = clustersJson.getJSONObject(i); + // final String id = clusterJson.optString("id"); + // final String title = clusterJson.optString("title"); + // if (TextUtils.isEmpty(id) || TextUtils.isEmpty(title)) { + // continue; + // } + // final String type = clusterJson.optString("type"); + // final boolean canMute = clusterJson.optBoolean("can_mute"); + // final boolean isMuted = clusterJson.optBoolean("is_muted"); + // final JSONObject coverMediaJson = clusterJson.optJSONObject("cover_media"); + // final int rankedPosition = clusterJson.optInt("ranked_position"); + // final FeedModel feedModel = parseClusterCover(coverMediaJson); + // final TopicCluster topicCluster = new TopicCluster( + // id, + // title, + // type, + // canMute, + // isMuted, + // rankedPosition, + // feedModel + // ); + // clusters.add(topicCluster); + // } + // return clusters; + // } - private FeedModel parseClusterCover(final JSONObject coverMediaJson) throws JSONException { - if (coverMediaJson == null) { - return null; - } - ProfileModel profileModel = null; - if (coverMediaJson.has("user")) { - final JSONObject user = coverMediaJson.getJSONObject("user"); - profileModel = new ProfileModel( - user.optBoolean("is_private"), - false, - user.optBoolean("is_verified"), - user.getString("pk"), - user.getString(Constants.EXTRAS_USERNAME), - user.optString("full_name"), - null, - null, - user.getString("profile_pic_url"), - null, - 0, - 0, - 0, - false, - false, - false, - false, - false); - } - final String resourceUrl = ResponseBodyUtils.getHighQualityImage(coverMediaJson); - final String thumbnailUrl = ResponseBodyUtils.getLowQualityImage(coverMediaJson); - final int width = coverMediaJson.optInt("original_width"); - final int height = coverMediaJson.optInt("original_height"); - return new FeedModel.Builder() - .setProfileModel(profileModel) - .setItemType(MediaItemType.MEDIA_TYPE_IMAGE) - .setViewCount(0) - .setPostId(coverMediaJson.getString(Constants.EXTRAS_ID)) - .setDisplayUrl(resourceUrl) - .setThumbnailUrl(thumbnailUrl) - .setShortCode(coverMediaJson.getString("code")) - .setPostCaption(null) - .setCommentsCount(0) - .setTimestamp(coverMediaJson.optLong("taken_at", -1)) - .setLiked(false) - .setBookmarked(false) - .setLikesCount(0) - .setLocationName(null) - .setLocationId(null) - .setImageHeight(height) - .setImageWidth(width) - .build(); - } + // private FeedModel parseClusterCover(final JSONObject coverMediaJson) throws JSONException { + // if (coverMediaJson == null) { + // return null; + // } + // ProfileModel profileModel = null; + // if (coverMediaJson.has("user")) { + // final JSONObject user = coverMediaJson.getJSONObject("user"); + // profileModel = new ProfileModel( + // user.optBoolean("is_private"), + // false, + // user.optBoolean("is_verified"), + // user.getString("pk"), + // user.getString(Constants.EXTRAS_USERNAME), + // user.optString("full_name"), + // null, + // null, + // user.getString("profile_pic_url"), + // null, + // 0, + // 0, + // 0, + // false, + // false, + // false, + // false, + // false); + // } + // final String resourceUrl = ResponseBodyUtils.getHighQualityImage(coverMediaJson); + // final String thumbnailUrl = ResponseBodyUtils.getLowQualityImage(coverMediaJson); + // final int width = coverMediaJson.optInt("original_width"); + // final int height = coverMediaJson.optInt("original_height"); + // return new FeedModel.Builder() + // .setProfileModel(profileModel) + // .setItemType(MediaItemType.MEDIA_TYPE_IMAGE) + // .setViewCount(0) + // .setPostId(coverMediaJson.getString(Constants.EXTRAS_ID)) + // .setDisplayUrl(resourceUrl) + // .setThumbnailUrl(thumbnailUrl) + // .setShortCode(coverMediaJson.getString("code")) + // .setPostCaption(null) + // .setCommentsCount(0) + // .setTimestamp(coverMediaJson.optLong("taken_at", -1)) + // .setLiked(false) + // .setBookmarked(false) + // .setLikesCount(0) + // .setLocationName(null) + // .setLocationId(null) + // .setImageHeight(height) + // .setImageWidth(width) + // .build(); + // } - private List parseItems(final JSONArray items) throws JSONException { - if (items == null) { - return Collections.emptyList(); - } - final List feedModels = new ArrayList<>(); - for (int i = 0; i < items.length(); i++) { - final JSONObject itemJson = items.optJSONObject(i); - if (itemJson == null) { - continue; - } - final JSONObject mediaJson = itemJson.optJSONObject("media"); - final FeedModel feedModel = ResponseBodyUtils.parseItem(mediaJson); - if (feedModel != null) { - feedModels.add(feedModel); - } - } - return feedModels; - } + // private List parseItems(final JSONArray items) throws JSONException { + // if (items == null) { + // return Collections.emptyList(); + // } + // final List feedModels = new ArrayList<>(); + // for (int i = 0; i < items.length(); i++) { + // final JSONObject itemJson = items.optJSONObject(i); + // if (itemJson == null) { + // continue; + // } + // final JSONObject mediaJson = itemJson.optJSONObject("media"); + // final FeedModel feedModel = ResponseBodyUtils.parseItem(mediaJson); + // if (feedModel != null) { + // feedModels.add(feedModel); + // } + // } + // return feedModels; + // } public static class TopicalExploreRequest { private String module; private String clusterId; - private int maxId = -1; + private String maxId; public TopicalExploreRequest() {} - public TopicalExploreRequest(final String module, final String clusterId, final int maxId) { + public TopicalExploreRequest(final String module, final String clusterId, final String maxId) { this.module = module; this.clusterId = clusterId; this.maxId = maxId; @@ -239,18 +225,16 @@ public class DiscoverService extends BaseService { return clusterId; } - public TopicalExploreRequest setClusterId(final String clusterId) { + public void setClusterId(final String clusterId) { this.clusterId = clusterId; - return this; } - public int getMaxId() { + public String getMaxId() { return maxId; } - public TopicalExploreRequest setMaxId(final int maxId) { + public void setMaxId(final String maxId) { this.maxId = maxId; - return this; } @Override @@ -258,7 +242,7 @@ public class DiscoverService extends BaseService { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; final TopicalExploreRequest that = (TopicalExploreRequest) o; - return maxId == that.maxId && + return maxId.equals(that.maxId) && Objects.equals(module, that.module) && Objects.equals(clusterId, that.clusterId); } @@ -268,6 +252,7 @@ public class DiscoverService extends BaseService { return Objects.hash(module, clusterId, maxId); } + @NonNull @Override public String toString() { return "TopicalExploreRequest{" + @@ -278,112 +263,112 @@ public class DiscoverService extends BaseService { } } - public static class TopicalExploreResponse { - - private boolean moreAvailable; - private int nextMaxId; - private int numResults; - private String status; - private List clusters; - private List items; - - public TopicalExploreResponse() {} - - public TopicalExploreResponse(final boolean moreAvailable, - final int nextMaxId, - final int numResults, - final String status, - final List clusters, final List items) { - this.moreAvailable = moreAvailable; - this.nextMaxId = nextMaxId; - this.numResults = numResults; - this.status = status; - this.clusters = clusters; - this.items = items; - } - - public boolean isMoreAvailable() { - return moreAvailable; - } - - public TopicalExploreResponse setMoreAvailable(final boolean moreAvailable) { - this.moreAvailable = moreAvailable; - return this; - } - - public int getNextMaxId() { - return nextMaxId; - } - - public TopicalExploreResponse setNextMaxId(final int nextMaxId) { - this.nextMaxId = nextMaxId; - return this; - } - - public int getNumResults() { - return numResults; - } - - public TopicalExploreResponse setNumResults(final int numResults) { - this.numResults = numResults; - return this; - } - - public String getStatus() { - return status; - } - - public TopicalExploreResponse setStatus(final String status) { - this.status = status; - return this; - } - - public List getClusters() { - return clusters; - } - - public TopicalExploreResponse setClusters(final List clusters) { - this.clusters = clusters; - return this; - } - - public List getItems() { - return items; - } - - public TopicalExploreResponse setItems(final List items) { - this.items = items; - return this; - } - - @Override - public boolean equals(final Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - final TopicalExploreResponse that = (TopicalExploreResponse) o; - return moreAvailable == that.moreAvailable && - nextMaxId == that.nextMaxId && - numResults == that.numResults && - Objects.equals(status, that.status) && - Objects.equals(clusters, that.clusters) && - Objects.equals(items, that.items); - } - - @Override - public int hashCode() { - return Objects.hash(moreAvailable, nextMaxId, numResults, status, clusters, items); - } - - @Override - public String toString() { - return "TopicalExploreResponse{" + - "moreAvailable=" + moreAvailable + - ", nextMaxId=" + nextMaxId + - ", numResults=" + numResults + - ", status='" + status + '\'' + - ", clusters=" + clusters + - ", items=" + items + - '}'; - } - } + // public static class TopicalExploreResponse { + // + // private boolean moreAvailable; + // private int nextMaxId; + // private int numResults; + // private String status; + // private List clusters; + // private List items; + // + // public TopicalExploreResponse() {} + // + // public TopicalExploreResponse(final boolean moreAvailable, + // final int nextMaxId, + // final int numResults, + // final String status, + // final List clusters, final List items) { + // this.moreAvailable = moreAvailable; + // this.nextMaxId = nextMaxId; + // this.numResults = numResults; + // this.status = status; + // this.clusters = clusters; + // this.items = items; + // } + // + // public boolean isMoreAvailable() { + // return moreAvailable; + // } + // + // public TopicalExploreResponse setMoreAvailable(final boolean moreAvailable) { + // this.moreAvailable = moreAvailable; + // return this; + // } + // + // public int getNextMaxId() { + // return nextMaxId; + // } + // + // public TopicalExploreResponse setNextMaxId(final int nextMaxId) { + // this.nextMaxId = nextMaxId; + // return this; + // } + // + // public int getNumResults() { + // return numResults; + // } + // + // public TopicalExploreResponse setNumResults(final int numResults) { + // this.numResults = numResults; + // return this; + // } + // + // public String getStatus() { + // return status; + // } + // + // public TopicalExploreResponse setStatus(final String status) { + // this.status = status; + // return this; + // } + // + // public List getClusters() { + // return clusters; + // } + // + // public TopicalExploreResponse setClusters(final List clusters) { + // this.clusters = clusters; + // return this; + // } + // + // public List getItems() { + // return items; + // } + // + // public TopicalExploreResponse setItems(final List items) { + // this.items = items; + // return this; + // } + // + // @Override + // public boolean equals(final Object o) { + // if (this == o) return true; + // if (o == null || getClass() != o.getClass()) return false; + // final TopicalExploreResponse that = (TopicalExploreResponse) o; + // return moreAvailable == that.moreAvailable && + // nextMaxId == that.nextMaxId && + // numResults == that.numResults && + // Objects.equals(status, that.status) && + // Objects.equals(clusters, that.clusters) && + // Objects.equals(items, that.items); + // } + // + // @Override + // public int hashCode() { + // return Objects.hash(moreAvailable, nextMaxId, numResults, status, clusters, items); + // } + // + // @Override + // public String toString() { + // return "TopicalExploreResponse{" + + // "moreAvailable=" + moreAvailable + + // ", nextMaxId=" + nextMaxId + + // ", numResults=" + numResults + + // ", status='" + status + '\'' + + // ", clusters=" + clusters + + // ", items=" + items + + // '}'; + // } + // } } diff --git a/app/src/main/java/awais/instagrabber/webservices/FeedService.java b/app/src/main/java/awais/instagrabber/webservices/FeedService.java index 584d5e14..6ec814c4 100644 --- a/app/src/main/java/awais/instagrabber/webservices/FeedService.java +++ b/app/src/main/java/awais/instagrabber/webservices/FeedService.java @@ -1,19 +1,9 @@ package awais.instagrabber.webservices; -import android.os.Handler; import android.util.Log; import androidx.annotation.NonNull; -import org.json.JSONArray; -import org.json.JSONException; -import org.json.JSONObject; - -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.io.Reader; -import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; @@ -22,14 +12,13 @@ import java.util.Map; import java.util.TimeZone; import java.util.UUID; -import awais.instagrabber.models.FeedModel; -import awais.instagrabber.models.PostChild; -import awais.instagrabber.models.ProfileModel; -import awais.instagrabber.models.enums.MediaItemType; import awais.instagrabber.repositories.FeedRepository; +import awais.instagrabber.repositories.responses.EndOfFeedDemarcator; +import awais.instagrabber.repositories.responses.EndOfFeedGroup; +import awais.instagrabber.repositories.responses.EndOfFeedGroupSet; +import awais.instagrabber.repositories.responses.FeedFetchResponse; +import awais.instagrabber.repositories.responses.Media; import awais.instagrabber.repositories.responses.PostsFetchResponse; -import awais.instagrabber.utils.Constants; -import awais.instagrabber.utils.ResponseBodyUtils; import awais.instagrabber.utils.TextUtils; import retrofit2.Call; import retrofit2.Callback; @@ -71,22 +60,21 @@ public class FeedService extends BaseService { if (!TextUtils.isEmpty(cursor)) { form.put("max_id", cursor); form.put("reason", "pagination"); - } - else { + } else { form.put("is_pull_to_refresh", "1"); form.put("reason", "pull_to_refresh"); } - final Call request = repository.fetch(form); - request.enqueue(new Callback() { + final Call request = repository.fetch(form); + request.enqueue(new Callback() { @Override - public void onResponse(@NonNull final Call call, @NonNull final Response response) { + public void onResponse(@NonNull final Call call, @NonNull final Response response) { try { // Log.d(TAG, "onResponse: body: " + response.body()); final PostsFetchResponse postsFetchResponse = parseResponse(response); if (callback != null) { callback.onSuccess(postsFetchResponse); } - } catch (JSONException e) { + } catch (Exception e) { Log.e(TAG, "onResponse", e); if (callback != null) { callback.onFailure(e); @@ -95,7 +83,7 @@ public class FeedService extends BaseService { } @Override - public void onFailure(@NonNull final Call call, @NonNull final Throwable t) { + public void onFailure(@NonNull final Call call, @NonNull final Throwable t) { if (callback != null) { callback.onFailure(t); } @@ -105,56 +93,44 @@ public class FeedService extends BaseService { } @NonNull - private PostsFetchResponse parseResponse(@NonNull final Response response) throws JSONException { - if (TextUtils.isEmpty(response.body())) { + private PostsFetchResponse parseResponse(@NonNull final Response response) { + final FeedFetchResponse feedFetchResponse = response.body(); + if (feedFetchResponse == null) { Log.e(TAG, "parseResponse: feed response body is empty with status code: " + response.code()); return new PostsFetchResponse(Collections.emptyList(), false, null); } - return parseResponseBody(response.body()); + return parseResponseBody(feedFetchResponse); } @NonNull - private PostsFetchResponse parseResponseBody(@NonNull final String body) - throws JSONException { - final JSONObject root = new JSONObject(body); - final boolean moreAvailable = root.optBoolean("more_available"); - String nextMaxId = root.optString("next_max_id"); + private PostsFetchResponse parseResponseBody(@NonNull final FeedFetchResponse feedFetchResponse) { + final boolean moreAvailable = feedFetchResponse.isMoreAvailable(); + String nextMaxId = feedFetchResponse.getNextMaxId(); final boolean needNewMaxId = nextMaxId.equals("feed_recs_head_load"); - final JSONArray feedItems = root.optJSONArray("items"); - final List feedModels = new ArrayList<>(); - for (int i = 0; i < feedItems.length(); ++i) { - final JSONObject itemJson = feedItems.optJSONObject(i); - if (itemJson == null || itemJson.has("injected")) { + final List allPosts = new ArrayList<>(); + final List items = feedFetchResponse.getItems(); + for (final Media media : items) { + if (media.isInjected() || media.getMediaType() == null) continue; + if (needNewMaxId && media.getEndOfFeedDemarcator() != null) { + final EndOfFeedDemarcator endOfFeedDemarcator = media.getEndOfFeedDemarcator(); + final EndOfFeedGroupSet groupSet = endOfFeedDemarcator.getGroupSet(); + if (groupSet == null) continue; + final List groups = groupSet.getGroups(); + if (groups == null) continue; + for (final EndOfFeedGroup group : groups) { + final String id = group.getId(); + if (id == null || !id.equals("past_posts")) continue; + nextMaxId = group.getNextMaxId(); + final List feedItems = group.getFeedItems(); + for (final Media feedItem : feedItems) { + if (feedItem == null || feedItem.isInjected()) continue; + allPosts.add(feedItem); + } + } continue; } - else if (itemJson.has("end_of_feed_demarcator") && needNewMaxId) { - final JSONArray groups = itemJson.getJSONObject("end_of_feed_demarcator").getJSONObject("group_set").getJSONArray("groups"); - for (int j = 0; j < groups.length(); ++j) { - final JSONObject groupJson = groups.optJSONObject(j); - if (groupJson.getString("id").equals("past_posts")) { - nextMaxId = groupJson.optString("next_max_id"); - final JSONArray miniFeedItems = groupJson.optJSONArray("feed_items"); - for (int k = 0; k < miniFeedItems.length(); ++k) { - final JSONObject miniItemJson = miniFeedItems.optJSONObject(k); - if (miniItemJson == null || miniItemJson.has("injected")) { - continue; - } - final FeedModel feedModel = ResponseBodyUtils.parseItem(miniItemJson); - if (feedModel != null) { - feedModels.add(feedModel); - } - } - } - else continue; - } - } - else { - final FeedModel feedModel = ResponseBodyUtils.parseItem(itemJson); - if (feedModel != null) { - feedModels.add(feedModel); - } - } + allPosts.add(media); } - return new PostsFetchResponse(feedModels, moreAvailable, nextMaxId); + return new PostsFetchResponse(allPosts, moreAvailable, nextMaxId); } } \ No newline at end of file diff --git a/app/src/main/java/awais/instagrabber/webservices/FriendshipService.java b/app/src/main/java/awais/instagrabber/webservices/FriendshipService.java index a31eb3b6..5b6ec369 100644 --- a/app/src/main/java/awais/instagrabber/webservices/FriendshipService.java +++ b/app/src/main/java/awais/instagrabber/webservices/FriendshipService.java @@ -13,14 +13,13 @@ import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.Objects; import java.util.UUID; import awais.instagrabber.models.FollowModel; import awais.instagrabber.repositories.FriendshipRepository; -import awais.instagrabber.repositories.responses.FriendshipRepoChangeRootResponse; -import awais.instagrabber.repositories.responses.FriendshipRepoListFetchResponse; -import awais.instagrabber.repositories.responses.FriendshipRepoRestrictRootResponse; +import awais.instagrabber.repositories.responses.FriendshipChangeResponse; +import awais.instagrabber.repositories.responses.FriendshipListFetchResponse; +import awais.instagrabber.repositories.responses.FriendshipRestrictResponse; import awais.instagrabber.utils.Constants; import awais.instagrabber.utils.TextUtils; import awais.instagrabber.utils.Utils; @@ -50,55 +49,55 @@ public class FriendshipService extends BaseService { return instance; } - public void follow(final String userId, - final String targetUserId, + public void follow(final long userId, + final long targetUserId, final String csrfToken, - final ServiceCallback callback) { + final ServiceCallback callback) { change("create", userId, targetUserId, csrfToken, callback); } - public void unfollow(final String userId, - final String targetUserId, + public void unfollow(final long userId, + final long targetUserId, final String csrfToken, - final ServiceCallback callback) { + final ServiceCallback callback) { change("destroy", userId, targetUserId, csrfToken, callback); } - public void block(final String userId, - final String targetUserId, + public void block(final long userId, + final long targetUserId, final String csrfToken, - final ServiceCallback callback) { + final ServiceCallback callback) { change("block", userId, targetUserId, csrfToken, callback); } - public void unblock(final String userId, - final String targetUserId, + public void unblock(final long userId, + final long targetUserId, final String csrfToken, - final ServiceCallback callback) { + final ServiceCallback callback) { change("unblock", userId, targetUserId, csrfToken, callback); } - public void toggleRestrict(final String targetUserId, + public void toggleRestrict(final long targetUserId, final boolean restrict, final String csrfToken, - final ServiceCallback callback) { + final ServiceCallback callback) { final Map form = new HashMap<>(3); form.put("_csrftoken", csrfToken); form.put("_uuid", UUID.randomUUID().toString()); - form.put("target_user_id", targetUserId); + form.put("target_user_id", String.valueOf(targetUserId)); final String action = restrict ? "restrict" : "unrestrict"; - final Call request = repository.toggleRestrict(Constants.I_USER_AGENT, action, form); - request.enqueue(new Callback() { + final Call request = repository.toggleRestrict(Constants.I_USER_AGENT, action, form); + request.enqueue(new Callback() { @Override - public void onResponse(@NonNull final Call call, - @NonNull final Response response) { + public void onResponse(@NonNull final Call call, + @NonNull final Response response) { if (callback != null) { callback.onSuccess(response.body()); } } @Override - public void onFailure(@NonNull final Call call, + public void onFailure(@NonNull final Call call, @NonNull final Throwable t) { if (callback != null) { callback.onFailure(t); @@ -107,25 +106,25 @@ public class FriendshipService extends BaseService { }); } - public void approve(final String userId, - final String targetUserId, - final String csrfToken, - final ServiceCallback callback) { + public void approve(final long userId, + final long targetUserId, + final String csrfToken, + final ServiceCallback callback) { change("approve", userId, targetUserId, csrfToken, callback); } - public void ignore(final String userId, - final String targetUserId, - final String csrfToken, - final ServiceCallback callback) { + public void ignore(final long userId, + final long targetUserId, + final String csrfToken, + final ServiceCallback callback) { change("ignore", userId, targetUserId, csrfToken, callback); } private void change(final String action, - final String userId, - final String targetUserId, + final long userId, + final long targetUserId, final String csrfToken, - final ServiceCallback callback) { + final ServiceCallback callback) { final Map form = new HashMap<>(5); form.put("_csrftoken", csrfToken); form.put("_uid", userId); @@ -133,18 +132,18 @@ public class FriendshipService extends BaseService { form.put("radio_type", "wifi-none"); form.put("user_id", targetUserId); final Map signedForm = Utils.sign(form); - final Call request = repository.change(Constants.I_USER_AGENT, action, targetUserId, signedForm); - request.enqueue(new Callback() { + final Call request = repository.change(Constants.I_USER_AGENT, action, targetUserId, signedForm); + request.enqueue(new Callback() { @Override - public void onResponse(@NonNull final Call call, - @NonNull final Response response) { + public void onResponse(@NonNull final Call call, + @NonNull final Response response) { if (callback != null) { callback.onSuccess(response.body()); } } @Override - public void onFailure(@NonNull final Call call, + public void onFailure(@NonNull final Call call, @NonNull final Throwable t) { if (callback != null) { callback.onFailure(t); @@ -154,9 +153,9 @@ public class FriendshipService extends BaseService { } public void getList(final boolean follower, - final String targetUserId, + final long targetUserId, final String maxId, - final ServiceCallback callback) { + final ServiceCallback callback) { final Map queryMap = new HashMap<>(); if (maxId != null) queryMap.put("max_id", maxId); final Call request = repository.getList(Constants.I_USER_AGENT, @@ -175,7 +174,7 @@ public class FriendshipService extends BaseService { callback.onSuccess(null); return; } - final FriendshipRepoListFetchResponse friendshipListFetchResponse = parseListResponse(body); + final FriendshipListFetchResponse friendshipListFetchResponse = parseListResponse(body); callback.onSuccess(friendshipListFetchResponse); } catch (JSONException e) { Log.e(TAG, "onResponse", e); @@ -192,13 +191,13 @@ public class FriendshipService extends BaseService { }); } - private FriendshipRepoListFetchResponse parseListResponse(@NonNull final String body) throws JSONException { + private FriendshipListFetchResponse parseListResponse(@NonNull final String body) throws JSONException { final JSONObject root = new JSONObject(body); final String nextMaxId = root.optString("next_max_id"); final String status = root.optString("status"); final JSONArray itemsJson = root.optJSONArray("users"); final List items = parseItems(itemsJson); - return new FriendshipRepoListFetchResponse( + return new FriendshipListFetchResponse( nextMaxId, status, items diff --git a/app/src/main/java/awais/instagrabber/webservices/GraphQLService.java b/app/src/main/java/awais/instagrabber/webservices/GraphQLService.java index 3a9c9606..d7421e53 100644 --- a/app/src/main/java/awais/instagrabber/webservices/GraphQLService.java +++ b/app/src/main/java/awais/instagrabber/webservices/GraphQLService.java @@ -1,6 +1,5 @@ package awais.instagrabber.webservices; -import android.os.Handler; import android.util.Log; import androidx.annotation.NonNull; @@ -9,22 +8,18 @@ import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.io.Reader; -import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; -import awais.instagrabber.models.FeedModel; -import awais.instagrabber.models.ProfileModel; import awais.instagrabber.repositories.GraphQLRepository; +import awais.instagrabber.repositories.responses.FriendshipStatus; import awais.instagrabber.repositories.responses.GraphQLUserListFetchResponse; +import awais.instagrabber.repositories.responses.Media; import awais.instagrabber.repositories.responses.PostsFetchResponse; +import awais.instagrabber.repositories.responses.User; import awais.instagrabber.utils.Constants; import awais.instagrabber.utils.ResponseBodyUtils; import awais.instagrabber.utils.TextUtils; @@ -35,7 +30,7 @@ import retrofit2.Retrofit; public class GraphQLService extends BaseService { private static final String TAG = "GraphQLService"; - private static final boolean loadFromMock = false; + // private static final boolean loadFromMock = false; private final GraphQLRepository repository; @@ -94,54 +89,55 @@ public class GraphQLService extends BaseService { final String maxId, final ServiceCallback callback) { fetch("36bd0f2bf5911908de389b8ceaa3be6d", - "{\"id\":\"" + locationId + "\"," + - "\"first\":25," + - "\"after\":\"" + (maxId == null ? "" : maxId) + "\"}", - Constants.EXTRAS_LOCATION, - "edge_location_to_media", - callback); + "{\"id\":\"" + locationId + "\"," + + "\"first\":25," + + "\"after\":\"" + (maxId == null ? "" : maxId) + "\"}", + Constants.EXTRAS_LOCATION, + "edge_location_to_media", + callback); } public void fetchHashtagPosts(@NonNull final String tag, final String maxId, final ServiceCallback callback) { fetch("9b498c08113f1e09617a1703c22b2f32", - "{\"tag_name\":\"" + tag + "\"," + - "\"first\":25," + - "\"after\":\"" + (maxId == null ? "" : maxId) + "\"}", - Constants.EXTRAS_HASHTAG, - "edge_hashtag_to_media", - callback); + "{\"tag_name\":\"" + tag + "\"," + + "\"first\":25," + + "\"after\":\"" + (maxId == null ? "" : maxId) + "\"}", + Constants.EXTRAS_HASHTAG, + "edge_hashtag_to_media", + callback); } - public void fetchProfilePosts(@NonNull final String profileId, + public void fetchProfilePosts(final long profileId, final int postsPerPage, final String maxId, final ServiceCallback callback) { fetch("18a7b935ab438c4514b1f742d8fa07a7", - "{\"id\":\"" + profileId + "\"," + - "\"first\":" + postsPerPage + "," + - "\"after\":\"" + (maxId == null ? "" : maxId) + "\"}", - Constants.EXTRAS_USER, - "edge_owner_to_timeline_media", - callback); + "{\"id\":\"" + profileId + "\"," + + "\"first\":" + postsPerPage + "," + + "\"after\":\"" + (maxId == null ? "" : maxId) + "\"}", + Constants.EXTRAS_USER, + "edge_owner_to_timeline_media", + callback); } - public void fetchTaggedPosts(@NonNull final String profileId, + public void fetchTaggedPosts(final long profileId, final int postsPerPage, final String maxId, final ServiceCallback callback) { fetch("31fe64d9463cbbe58319dced405c6206", - "{\"id\":\"" + profileId + "\"," + - "\"first\":" + postsPerPage + "," + - "\"after\":\"" + (maxId == null ? "" : maxId) + "\"}", - Constants.EXTRAS_USER, - "edge_user_to_photos_of_you", - callback); + "{\"id\":\"" + profileId + "\"," + + "\"first\":" + postsPerPage + "," + + "\"after\":\"" + (maxId == null ? "" : maxId) + "\"}", + Constants.EXTRAS_USER, + "edge_user_to_photos_of_you", + callback); } @NonNull - private PostsFetchResponse parsePostResponse(@NonNull final Response response, @NonNull final String arg1, @NonNull final String arg2) throws JSONException { + private PostsFetchResponse parsePostResponse(@NonNull final Response response, @NonNull final String arg1, @NonNull final String arg2) + throws JSONException { if (TextUtils.isEmpty(response.body())) { Log.e(TAG, "parseResponse: feed response body is empty with status code: " + response.code()); return new PostsFetchResponse(Collections.emptyList(), false, null); @@ -152,7 +148,7 @@ public class GraphQLService extends BaseService { @NonNull private PostsFetchResponse parseResponseBody(@NonNull final String body, @NonNull final String arg1, @NonNull final String arg2) throws JSONException { - final List feedModels = new ArrayList<>(); + final List items = new ArrayList<>(); final JSONObject timelineFeed = new JSONObject(body) .getJSONObject("data") .getJSONObject(arg1) @@ -176,17 +172,17 @@ public class GraphQLService extends BaseService { if (itemJson == null) { continue; } - final FeedModel feedModel = ResponseBodyUtils.parseGraphQLItem(itemJson); - if (feedModel != null) { - feedModels.add(feedModel); + final Media media = ResponseBodyUtils.parseGraphQLItem(itemJson); + if (media != null) { + items.add(media); } } - return new PostsFetchResponse(feedModels, hasNextPage, endCursor); + return new PostsFetchResponse(items, hasNextPage, endCursor); } public void fetchCommentLikers(final String commentId, - final String endCursor, - final ServiceCallback callback) { + final String endCursor, + final ServiceCallback callback) { final Map queryMap = new HashMap<>(); queryMap.put("query_hash", "5f0b1f6281e72053cbc07909c8d154ae"); queryMap.put("variables", "{\"comment_id\":\"" + commentId + "\"," + @@ -198,7 +194,7 @@ public class GraphQLService extends BaseService { public void onResponse(@NonNull final Call call, @NonNull final Response response) { final String rawBody = response.body(); if (rawBody == null) { - Log.e(TAG, "Error occurred while fetching gql comment likes of "+commentId); + Log.e(TAG, "Error occurred while fetching gql comment likes of " + commentId); callback.onSuccess(null); return; } @@ -210,18 +206,53 @@ public class GraphQLService extends BaseService { final String endCursor = pageInfo.getBoolean("has_next_page") ? pageInfo.getString("end_cursor") : null; final JSONArray users = data.getJSONArray("edges"); final int usersLen = users.length(); - final List userModels = new ArrayList<>(); + final List userModels = new ArrayList<>(); for (int j = 0; j < usersLen; ++j) { final JSONObject userObject = users.getJSONObject(j).getJSONObject("node"); - userModels.add(new ProfileModel(userObject.optBoolean("is_private"), - false, - userObject.optBoolean("is_verified"), - userObject.getString("id"), + userModels.add(new User( + userObject.getLong("id"), userObject.getString("username"), userObject.optString("full_name"), - null, null, + userObject.optBoolean("is_private"), userObject.getString("profile_pic_url"), - null, 0, 0, 0, false, false, false, false, false)); + null, + new FriendshipStatus( + false, + false, + false, + false, + false, + false, + false, + false, + false, + false + ), + userObject.optBoolean("is_verified"), + false, + false, + false, + false, + null, + null, + 0, + 0, + 0, + 0, + null, + null, + 0, + null + )); + // userModels.add(new ProfileModel(userObject.optBoolean("is_private"), + // false, + // userObject.optBoolean("is_verified"), + // userObject.getString("id"), + // userObject.getString("username"), + // userObject.optString("full_name"), + // null, null, + // userObject.getString("profile_pic_url"), + // null, 0, 0, 0, false, false, false, false, false)); } callback.onSuccess(new GraphQLUserListFetchResponse(endCursor, status, userModels)); } catch (JSONException e) { diff --git a/app/src/main/java/awais/instagrabber/webservices/LocationService.java b/app/src/main/java/awais/instagrabber/webservices/LocationService.java index a9b40981..d932d19a 100644 --- a/app/src/main/java/awais/instagrabber/webservices/LocationService.java +++ b/app/src/main/java/awais/instagrabber/webservices/LocationService.java @@ -1,26 +1,12 @@ package awais.instagrabber.webservices; -import android.util.Log; - import androidx.annotation.NonNull; import com.google.common.collect.ImmutableMap; -import org.json.JSONArray; -import org.json.JSONException; -import org.json.JSONObject; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Objects; - -import awais.instagrabber.models.FeedModel; import awais.instagrabber.repositories.LocationRepository; +import awais.instagrabber.repositories.responses.LocationFeedResponse; import awais.instagrabber.repositories.responses.PostsFetchResponse; -import awais.instagrabber.utils.ResponseBodyUtils; import awais.instagrabber.utils.TextUtils; import retrofit2.Call; import retrofit2.Callback; @@ -55,29 +41,27 @@ public class LocationService extends BaseService { if (!TextUtils.isEmpty(maxId)) { builder.put("max_id", maxId); } - final Call request = repository.fetchPosts(locationId, builder.build()); - request.enqueue(new Callback() { + final Call request = repository.fetchPosts(locationId, builder.build()); + request.enqueue(new Callback() { @Override - public void onResponse(@NonNull final Call call, @NonNull final Response response) { - try { - if (callback == null) { - return; - } - final String body = response.body(); - if (TextUtils.isEmpty(body)) { - callback.onSuccess(null); - return; - } - final PostsFetchResponse tagPostsFetchResponse = parseResponse(body); - callback.onSuccess(tagPostsFetchResponse); - } catch (JSONException e) { - Log.e(TAG, "onResponse", e); - callback.onFailure(e); + public void onResponse(@NonNull final Call call, @NonNull final Response response) { + if (callback == null) return; + final LocationFeedResponse body = response.body(); + if (body == null) { + callback.onSuccess(null); + return; } + final PostsFetchResponse postsFetchResponse = new PostsFetchResponse( + body.getItems(), + body.isMoreAvailable(), + body.getNextMaxId() + ); + callback.onSuccess(postsFetchResponse); + } @Override - public void onFailure(@NonNull final Call call, @NonNull final Throwable t) { + public void onFailure(@NonNull final Call call, @NonNull final Throwable t) { if (callback != null) { callback.onFailure(t); } @@ -85,34 +69,34 @@ public class LocationService extends BaseService { }); } - private PostsFetchResponse parseResponse(@NonNull final String body) throws JSONException { - final JSONObject root = new JSONObject(body); - final boolean moreAvailable = root.optBoolean("more_available"); - final String nextMaxId = root.optString("next_max_id"); - final JSONArray itemsJson = root.optJSONArray("items"); - final List items = parseItems(itemsJson); - return new PostsFetchResponse( - items, - moreAvailable, - nextMaxId - ); - } + // private PostsFetchResponse parseResponse(@NonNull final String body) throws JSONException { + // final JSONObject root = new JSONObject(body); + // final boolean moreAvailable = root.optBoolean("more_available"); + // final String nextMaxId = root.optString("next_max_id"); + // final JSONArray itemsJson = root.optJSONArray("items"); + // final List items = parseItems(itemsJson); + // return new PostsFetchResponse( + // items, + // moreAvailable, + // nextMaxId + // ); + // } - private List parseItems(final JSONArray items) throws JSONException { - if (items == null) { - return Collections.emptyList(); - } - final List feedModels = new ArrayList<>(); - for (int i = 0; i < items.length(); i++) { - final JSONObject itemJson = items.optJSONObject(i); - if (itemJson == null) { - continue; - } - final FeedModel feedModel = ResponseBodyUtils.parseItem(itemJson); - if (feedModel != null) { - feedModels.add(feedModel); - } - } - return feedModels; - } + // private List parseItems(final JSONArray items) throws JSONException { + // if (items == null) { + // return Collections.emptyList(); + // } + // final List feedModels = new ArrayList<>(); + // for (int i = 0; i < items.length(); i++) { + // final JSONObject itemJson = items.optJSONObject(i); + // if (itemJson == null) { + // continue; + // } + // final FeedModel feedModel = ResponseBodyUtils.parseItem(itemJson); + // if (feedModel != null) { + // feedModels.add(feedModel); + // } + // } + // return feedModels; + // } } diff --git a/app/src/main/java/awais/instagrabber/webservices/MediaService.java b/app/src/main/java/awais/instagrabber/webservices/MediaService.java index 236113ec..88767b45 100644 --- a/app/src/main/java/awais/instagrabber/webservices/MediaService.java +++ b/app/src/main/java/awais/instagrabber/webservices/MediaService.java @@ -7,25 +7,23 @@ import androidx.annotation.NonNull; import com.google.common.collect.ImmutableMap; -import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; -import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.UUID; -import awais.instagrabber.models.FeedModel; -import awais.instagrabber.models.ProfileModel; import awais.instagrabber.repositories.MediaRepository; import awais.instagrabber.repositories.requests.UploadFinishOptions; -import awais.instagrabber.utils.Constants; +import awais.instagrabber.repositories.responses.LikersResponse; +import awais.instagrabber.repositories.responses.Media; +import awais.instagrabber.repositories.responses.MediaInfoResponse; +import awais.instagrabber.repositories.responses.User; import awais.instagrabber.utils.DateUtils; import awais.instagrabber.utils.MediaUploadHelper; -import awais.instagrabber.utils.ResponseBodyUtils; import awais.instagrabber.utils.Utils; import retrofit2.Call; import retrofit2.Callback; @@ -54,28 +52,23 @@ public class MediaService extends BaseService { } public void fetch(final String mediaId, - final ServiceCallback callback) { - final Call request = repository.fetch(mediaId); - request.enqueue(new Callback() { + final ServiceCallback callback) { + final Call request = repository.fetch(mediaId); + request.enqueue(new Callback() { @Override - public void onResponse(@NonNull final Call call, - @NonNull final Response response) { + public void onResponse(@NonNull final Call call, + @NonNull final Response response) { if (callback == null) return; - final String body = response.body(); - if (body == null) { + final MediaInfoResponse mediaInfoResponse = response.body(); + if (mediaInfoResponse == null || mediaInfoResponse.getItems() == null || mediaInfoResponse.getItems().isEmpty()) { callback.onSuccess(null); return; } - try { - final JSONObject itemJson = new JSONObject(body).getJSONArray("items").getJSONObject(0); - callback.onSuccess(ResponseBodyUtils.parseItem(itemJson)); - } catch (JSONException e) { - callback.onFailure(e); - } + callback.onSuccess(mediaInfoResponse.getItems().get(0)); } @Override - public void onFailure(@NonNull final Call call, + public void onFailure(@NonNull final Call call, @NonNull final Throwable t) { if (callback != null) { callback.onFailure(t); @@ -85,35 +78,35 @@ public class MediaService extends BaseService { } public void like(final String mediaId, - final String userId, + final long userId, final String csrfToken, final ServiceCallback callback) { action(mediaId, userId, "like", csrfToken, callback); } public void unlike(final String mediaId, - final String userId, + final long userId, final String csrfToken, final ServiceCallback callback) { action(mediaId, userId, "unlike", csrfToken, callback); } public void save(final String mediaId, - final String userId, + final long userId, final String csrfToken, final ServiceCallback callback) { action(mediaId, userId, "save", csrfToken, callback); } public void unsave(final String mediaId, - final String userId, + final long userId, final String csrfToken, final ServiceCallback callback) { action(mediaId, userId, "unsave", csrfToken, callback); } private void action(final String mediaId, - final String userId, + final long userId, final String action, final String csrfToken, final ServiceCallback callback) { @@ -156,7 +149,7 @@ public class MediaService extends BaseService { public void comment(@NonNull final String mediaId, @NonNull final String comment, - @NonNull final String userId, + final long userId, final String replyToCommentId, final String csrfToken, @NonNull final ServiceCallback callback) { @@ -201,7 +194,7 @@ public class MediaService extends BaseService { } public void deleteComment(final String mediaId, - final String userId, + final long userId, final String commentId, final String csrfToken, @NonNull final ServiceCallback callback) { @@ -209,7 +202,7 @@ public class MediaService extends BaseService { } public void deleteComments(final String mediaId, - final String userId, + final long userId, final List commentIds, final String csrfToken, @NonNull final ServiceCallback callback) { @@ -320,7 +313,7 @@ public class MediaService extends BaseService { } public void editCaption(final String postId, - final String userId, + final long userId, final String newCaption, @NonNull final String csrfToken, @NonNull final ServiceCallback callback) { @@ -362,43 +355,22 @@ public class MediaService extends BaseService { public void fetchLikes(final String mediaId, final boolean isComment, - @NonNull final ServiceCallback> callback) { - final Call likesRequest = repository.fetchLikes(mediaId, isComment ? "comment_likers" : "likers"); - likesRequest.enqueue(new Callback() { + @NonNull final ServiceCallback> callback) { + final Call likesRequest = repository.fetchLikes(mediaId, isComment ? "comment_likers" : "likers"); + likesRequest.enqueue(new Callback() { @Override - public void onResponse(@NonNull final Call call, @NonNull final Response response) { - final String body = response.body(); - if (body == null) { - Log.e(TAG, "Error occurred while fetching likes of "+mediaId); + public void onResponse(@NonNull final Call call, @NonNull final Response response) { + final LikersResponse likersResponse = response.body(); + if (likersResponse == null) { + Log.e(TAG, "Error occurred while fetching likes of " + mediaId); callback.onSuccess(null); return; } - try { - final JSONObject data = new JSONObject(body); - final JSONArray users = data.getJSONArray("users"); - final int usersLen = users.length(); - final List userModels = new ArrayList<>(); - for (int j = 0; j < usersLen; ++j) { - final JSONObject userObject = users.getJSONObject(j); - userModels.add(new ProfileModel(userObject.optBoolean("is_private"), - false, - userObject.optBoolean("is_verified"), - String.valueOf(userObject.get("pk")), - userObject.getString("username"), - userObject.optString("full_name"), - null, null, - userObject.getString("profile_pic_url"), - null, 0, 0, 0, false, false, false, false, false)); - } - callback.onSuccess(userModels); - } catch (JSONException e) { - // Log.e(TAG, "Error parsing body", e); - callback.onFailure(e); - } + callback.onSuccess(likersResponse.getUsers()); } @Override - public void onFailure(@NonNull final Call call, @NonNull final Throwable t) { + public void onFailure(@NonNull final Call call, @NonNull final Throwable t) { Log.e(TAG, "Error getting likes", t); callback.onFailure(t); } @@ -409,7 +381,7 @@ public class MediaService extends BaseService { final String type, // 1 caption 2 comment 3 bio @NonNull final ServiceCallback callback) { final Map form = new HashMap<>(); - form.put("id", id); + form.put("id", String.valueOf(id)); form.put("type", type); final Call request = repository.translate(form); request.enqueue(new Callback() { diff --git a/app/src/main/java/awais/instagrabber/webservices/NewsService.java b/app/src/main/java/awais/instagrabber/webservices/NewsService.java index 3e2a37fa..6000fd95 100644 --- a/app/src/main/java/awais/instagrabber/webservices/NewsService.java +++ b/app/src/main/java/awais/instagrabber/webservices/NewsService.java @@ -124,7 +124,7 @@ public class NewsService extends BaseService { data.getString(Constants.EXTRAS_ID), data.optString("text"), // comments or mentions data.getLong("timestamp"), - user.getString("id"), + user.getLong("id"), user.getString("username"), user.getString("profile_pic_url"), !data.isNull("media") ? data.getJSONObject("media").getString("id") : null, @@ -143,7 +143,7 @@ public class NewsService extends BaseService { data.getString(Constants.EXTRAS_ID), data.optString("full_name"), 0L, - data.getString(Constants.EXTRAS_ID), + data.getLong(Constants.EXTRAS_ID), data.getString("username"), data.getString("profile_pic_url"), null, @@ -177,7 +177,7 @@ public class NewsService extends BaseService { data.getString("tuuid"), data.has("text") ? data.getString("text") : cleanRichText(data.optString("rich_text", "")), data.getLong("timestamp"), - data.getString("profile_id"), + data.getLong("profile_id"), data.getString("profile_name"), data.getString("profile_image"), !data.isNull("media") ? data.getJSONArray("media").getJSONObject(0).getString("id") : null, @@ -251,7 +251,7 @@ public class NewsService extends BaseService { itemJson.getString("uuid"), itemJson.getString("social_context"), 0L, - data.getString("pk"), + data.getLong("pk"), data.getString("username"), data.getString("profile_pic_url"), data.getString("full_name"), // just borrowing this field diff --git a/app/src/main/java/awais/instagrabber/webservices/ProfileService.java b/app/src/main/java/awais/instagrabber/webservices/ProfileService.java index 62eafe74..c6ab47f5 100644 --- a/app/src/main/java/awais/instagrabber/webservices/ProfileService.java +++ b/app/src/main/java/awais/instagrabber/webservices/ProfileService.java @@ -1,23 +1,12 @@ package awais.instagrabber.webservices; -import android.util.Log; - import androidx.annotation.NonNull; import com.google.common.collect.ImmutableMap; -import org.json.JSONArray; -import org.json.JSONException; -import org.json.JSONObject; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - -import awais.instagrabber.models.FeedModel; import awais.instagrabber.repositories.ProfileRepository; import awais.instagrabber.repositories.responses.PostsFetchResponse; -import awais.instagrabber.utils.ResponseBodyUtils; +import awais.instagrabber.repositories.responses.UserFeedResponse; import awais.instagrabber.utils.TextUtils; import retrofit2.Call; import retrofit2.Callback; @@ -45,36 +34,32 @@ public class ProfileService extends BaseService { return instance; } - public void fetchPosts(final String userId, + public void fetchPosts(final long userId, final String maxId, final ServiceCallback callback) { final ImmutableMap.Builder builder = ImmutableMap.builder(); if (!TextUtils.isEmpty(maxId)) { builder.put("max_id", maxId); } - final Call request = repository.fetch(userId, builder.build()); - request.enqueue(new Callback() { + final Call request = repository.fetch(userId, builder.build()); + request.enqueue(new Callback() { @Override - public void onResponse(@NonNull final Call call, @NonNull final Response response) { - try { - if (callback == null) { - return; - } - final String body = response.body(); - if (TextUtils.isEmpty(body)) { - callback.onSuccess(null); - return; - } - final PostsFetchResponse postsFetchResponse = parseProfilePostsResponse(body, false); - callback.onSuccess(postsFetchResponse); - } catch (JSONException e) { - Log.e(TAG, "onResponse", e); - callback.onFailure(e); + public void onResponse(@NonNull final Call call, @NonNull final Response response) { + if (callback == null) return; + final UserFeedResponse body = response.body(); + if (body == null) { + callback.onSuccess(null); + return; } + callback.onSuccess(new PostsFetchResponse( + body.getItems(), + body.isMoreAvailable(), + body.getNextMaxId() + )); } @Override - public void onFailure(@NonNull final Call call, @NonNull final Throwable t) { + public void onFailure(@NonNull final Call call, @NonNull final Throwable t) { if (callback != null) { callback.onFailure(t); } @@ -88,29 +73,25 @@ public class ProfileService extends BaseService { if (!TextUtils.isEmpty(maxId)) { builder.put("max_id", maxId); } - final Call request = repository.fetchSaved(builder.build()); - request.enqueue(new Callback() { + final Call request = repository.fetchSaved(builder.build()); + request.enqueue(new Callback() { @Override - public void onResponse(@NonNull final Call call, @NonNull final Response response) { - try { - if (callback == null) { - return; - } - final String body = response.body(); - if (TextUtils.isEmpty(body)) { - callback.onSuccess(null); - return; - } - final PostsFetchResponse PostsFetchResponse = parseSavedPostsResponse(body, true); - callback.onSuccess(PostsFetchResponse); - } catch (JSONException e) { - Log.e(TAG, "onResponse", e); - callback.onFailure(e); + public void onResponse(@NonNull final Call call, @NonNull final Response response) { + if (callback == null) return; + final UserFeedResponse userFeedResponse = response.body(); + if (userFeedResponse == null) { + callback.onSuccess(null); + return; } + callback.onSuccess(new PostsFetchResponse( + userFeedResponse.getItems(), + userFeedResponse.isMoreAvailable(), + userFeedResponse.getNextMaxId() + )); } @Override - public void onFailure(@NonNull final Call call, @NonNull final Throwable t) { + public void onFailure(@NonNull final Call call, @NonNull final Throwable t) { if (callback != null) { callback.onFailure(t); } @@ -124,29 +105,25 @@ public class ProfileService extends BaseService { if (!TextUtils.isEmpty(maxId)) { builder.put("max_id", maxId); } - final Call request = repository.fetchLiked(builder.build()); - request.enqueue(new Callback() { + final Call request = repository.fetchLiked(builder.build()); + request.enqueue(new Callback() { @Override - public void onResponse(@NonNull final Call call, @NonNull final Response response) { - try { - if (callback == null) { - return; - } - final String body = response.body(); - if (TextUtils.isEmpty(body)) { - callback.onSuccess(null); - return; - } - final PostsFetchResponse PostsFetchResponse = parseSavedPostsResponse(body, false); - callback.onSuccess(PostsFetchResponse); - } catch (JSONException e) { - Log.e(TAG, "onResponse", e); - callback.onFailure(e); + public void onResponse(@NonNull final Call call, @NonNull final Response response) { + if (callback == null) return; + final UserFeedResponse userFeedResponse = response.body(); + if (userFeedResponse == null) { + callback.onSuccess(null); + return; } + callback.onSuccess(new PostsFetchResponse( + userFeedResponse.getItems(), + userFeedResponse.isMoreAvailable(), + userFeedResponse.getNextMaxId() + )); } @Override - public void onFailure(@NonNull final Call call, @NonNull final Throwable t) { + public void onFailure(@NonNull final Call call, @NonNull final Throwable t) { if (callback != null) { callback.onFailure(t); } @@ -154,36 +131,32 @@ public class ProfileService extends BaseService { }); } - public void fetchTagged(final String profileId, + public void fetchTagged(final long profileId, final String maxId, final ServiceCallback callback) { final ImmutableMap.Builder builder = ImmutableMap.builder(); if (!TextUtils.isEmpty(maxId)) { builder.put("max_id", maxId); } - final Call request = repository.fetchTagged(profileId, builder.build()); - request.enqueue(new Callback() { + final Call request = repository.fetchTagged(profileId, builder.build()); + request.enqueue(new Callback() { @Override - public void onResponse(@NonNull final Call call, @NonNull final Response response) { - try { - if (callback == null) { - return; - } - final String body = response.body(); - if (TextUtils.isEmpty(body)) { - callback.onSuccess(null); - return; - } - final PostsFetchResponse PostsFetchResponse = parseSavedPostsResponse(body, false); - callback.onSuccess(PostsFetchResponse); - } catch (JSONException e) { - Log.e(TAG, "onResponse", e); - callback.onFailure(e); + public void onResponse(@NonNull final Call call, @NonNull final Response response) { + if (callback == null) return; + final UserFeedResponse userFeedResponse = response.body(); + if (userFeedResponse == null) { + callback.onSuccess(null); + return; } + callback.onSuccess(new PostsFetchResponse( + userFeedResponse.getItems(), + userFeedResponse.isMoreAvailable(), + userFeedResponse.getNextMaxId() + )); } @Override - public void onFailure(@NonNull final Call call, @NonNull final Throwable t) { + public void onFailure(@NonNull final Call call, @NonNull final Throwable t) { if (callback != null) { callback.onFailure(t); } @@ -191,49 +164,49 @@ public class ProfileService extends BaseService { }); } - private PostsFetchResponse parseProfilePostsResponse(final String body, final boolean isInMedia) throws JSONException { - final JSONObject root = new JSONObject(body); - final boolean moreAvailable = root.optBoolean("more_available"); - final String nextMaxId = root.optString("next_max_id"); - final JSONArray itemsJson = root.optJSONArray("items"); - final List items = parseItems(itemsJson, isInMedia); - return new PostsFetchResponse( - items, - moreAvailable, - nextMaxId - ); - } + // private PostsFetchResponse parseProfilePostsResponse(final String body) throws JSONException { + // final JSONObject root = new JSONObject(body); + // final boolean moreAvailable = root.optBoolean("more_available"); + // final String nextMaxId = root.optString("next_max_id"); + // final JSONArray itemsJson = root.optJSONArray("items"); + // final List items = parseItems(itemsJson, false); + // return new PostsFetchResponse( + // items, + // moreAvailable, + // nextMaxId + // ); + // } - private PostsFetchResponse parseSavedPostsResponse(final String body, final boolean isInMedia) throws JSONException { - final JSONObject root = new JSONObject(body); - final boolean moreAvailable = root.optBoolean("more_available"); - final String nextMaxId = root.optString("next_max_id"); - final int numResults = root.optInt("num_results"); - final String status = root.optString("status"); - final JSONArray itemsJson = root.optJSONArray("items"); - final List items = parseItems(itemsJson, isInMedia); - return new PostsFetchResponse( - items, - moreAvailable, - nextMaxId - ); - } + // private PostsFetchResponse parseSavedPostsResponse(final String body, final boolean isInMedia) throws JSONException { + // final JSONObject root = new JSONObject(body); + // final boolean moreAvailable = root.optBoolean("more_available"); + // final String nextMaxId = root.optString("next_max_id"); + // final int numResults = root.optInt("num_results"); + // final String status = root.optString("status"); + // final JSONArray itemsJson = root.optJSONArray("items"); + // final List items = parseItems(itemsJson, isInMedia); + // return new PostsFetchResponse( + // items, + // moreAvailable, + // nextMaxId + // ); + // } - private List parseItems(final JSONArray items, final boolean isInMedia) throws JSONException { - if (items == null) { - return Collections.emptyList(); - } - final List feedModels = new ArrayList<>(); - for (int i = 0; i < items.length(); i++) { - final JSONObject itemJson = items.optJSONObject(i); - if (itemJson == null) { - continue; - } - final FeedModel feedModel = ResponseBodyUtils.parseItem(isInMedia ? itemJson.optJSONObject("media") : itemJson); - if (feedModel != null) { - feedModels.add(feedModel); - } - } - return feedModels; - } + // private List parseItems(final JSONArray items, final boolean isInMedia) throws JSONException { + // if (items == null) { + // return Collections.emptyList(); + // } + // final List feedModels = new ArrayList<>(); + // for (int i = 0; i < items.length(); i++) { + // final JSONObject itemJson = items.optJSONObject(i); + // if (itemJson == null) { + // continue; + // } + // final FeedModel feedModel = ResponseBodyUtils.parseItem(isInMedia ? itemJson.optJSONObject("media") : itemJson); + // if (feedModel != null) { + // feedModels.add(feedModel); + // } + // } + // return feedModels; + // } } diff --git a/app/src/main/java/awais/instagrabber/webservices/StoriesService.java b/app/src/main/java/awais/instagrabber/webservices/StoriesService.java index 948e7107..64835a47 100644 --- a/app/src/main/java/awais/instagrabber/webservices/StoriesService.java +++ b/app/src/main/java/awais/instagrabber/webservices/StoriesService.java @@ -18,10 +18,11 @@ import java.util.UUID; import awais.instagrabber.models.FeedStoryModel; import awais.instagrabber.models.HighlightModel; -import awais.instagrabber.models.ProfileModel; import awais.instagrabber.models.StoryModel; import awais.instagrabber.repositories.StoriesRepository; +import awais.instagrabber.repositories.responses.FriendshipStatus; import awais.instagrabber.repositories.responses.StoryStickerResponse; +import awais.instagrabber.repositories.responses.User; import awais.instagrabber.utils.Constants; import awais.instagrabber.utils.ResponseBodyUtils; import awais.instagrabber.utils.TextUtils; @@ -84,7 +85,7 @@ public class StoriesService extends BaseService { }); } - public void getFeedStories(final String csrfToken, final ServiceCallback> callback) { + public void getFeedStories(final ServiceCallback> callback) { final Call response = repository.getFeedStories(); response.enqueue(new Callback() { @Override @@ -110,13 +111,47 @@ public class StoriesService extends BaseService { final JSONArray feedStoriesReel = new JSONObject(body).getJSONArray("tray"); for (int i = 0; i < feedStoriesReel.length(); ++i) { final JSONObject node = feedStoriesReel.getJSONObject(i); - final JSONObject user = node.getJSONObject(node.has("user") ? "user" : "owner"); - final ProfileModel profileModel = new ProfileModel(false, false, false, - user.getString("pk"), - user.getString("username"), - null, null, null, - user.getString("profile_pic_url"), - null, 0, 0, 0, false, false, false, false, false); + final JSONObject userJson = node.getJSONObject(node.has("user") ? "user" : "owner"); + // final ProfileModel profileModel = new ProfileModel(false, false, false, + // user.getString("pk"), + // user.getString("username"), + // null, null, null, + // user.getString("profile_pic_url"), + // null, 0, 0, 0, false, false, false, false, false); + final User user = new User(userJson.getLong("pk"), + userJson.getString("username"), + userJson.optString("full_name"), + userJson.optBoolean("is_private"), + userJson.getString("profile_pic_url"), + null, + new FriendshipStatus( + false, + false, + false, + false, + false, + false, + false, + false, + false, + false + ), + userJson.optBoolean("is_verified"), + false, + false, + false, + false, + null, + null, + 0, + 0, + 0, + 0, + null, + null, + 0, + null + ); final String id = node.getString("id"); final long timestamp = node.getLong("latest_reel_media"); final int mediaCount = node.getInt("media_count"); @@ -126,7 +161,7 @@ public class StoriesService extends BaseService { if (itemJson != null) { firstStoryModel = ResponseBodyUtils.parseStoryItem(itemJson, false, false, null); } - feedStoryModels.add(new FeedStoryModel(id, profileModel, fullyRead, timestamp, firstStoryModel, mediaCount)); + feedStoryModels.add(new FeedStoryModel(id, user, fullyRead, timestamp, firstStoryModel, mediaCount)); } callback.onSuccess(sort(feedStoryModels)); } catch (JSONException e) { @@ -134,7 +169,7 @@ public class StoriesService extends BaseService { } } - public void fetchHighlights(final String profileId, + public void fetchHighlights(final long profileId, final ServiceCallback> callback) { final Call request = repository.fetchHighlights(profileId); request.enqueue(new Callback() { @@ -303,7 +338,7 @@ public class StoriesService extends BaseService { final String action, final String arg1, final String arg2, - final String userId, + final long userId, final String csrfToken, final ServiceCallback callback) { final Map form = new HashMap<>(); @@ -340,7 +375,7 @@ public class StoriesService extends BaseService { public void respondToQuestion(final String storyId, final String stickerId, final String answer, - final String userId, + final long userId, final String csrfToken, final ServiceCallback callback) { respondToSticker(storyId, stickerId, "story_question_response", "response", answer, userId, csrfToken, callback); @@ -350,7 +385,7 @@ public class StoriesService extends BaseService { public void respondToQuiz(final String storyId, final String stickerId, final int answer, - final String userId, + final long userId, final String csrfToken, final ServiceCallback callback) { respondToSticker(storyId, stickerId, "story_quiz_answer", "answer", String.valueOf(answer), userId, csrfToken, callback); @@ -360,7 +395,7 @@ public class StoriesService extends BaseService { public void respondToPoll(final String storyId, final String stickerId, final int answer, - final String userId, + final long userId, final String csrfToken, final ServiceCallback callback) { respondToSticker(storyId, stickerId, "story_poll_vote", "vote", String.valueOf(answer), userId, csrfToken, callback); @@ -369,7 +404,7 @@ public class StoriesService extends BaseService { public void respondToSlider(final String storyId, final String stickerId, final double answer, - final String userId, + final long userId, final String csrfToken, final ServiceCallback callback) { respondToSticker(storyId, stickerId, "story_slider_vote", "vote", String.valueOf(answer), userId, csrfToken, callback); @@ -401,10 +436,10 @@ public class StoriesService extends BaseService { int result; switch (Utils.settingsHelper.getString(Constants.STORY_SORT)) { case "1": - result = o1.getTimestamp() > o2.getTimestamp() ? -1 : (o1.getTimestamp() == o2.getTimestamp() ? 0 : 1); + result = Long.compare(o2.getTimestamp(), o1.getTimestamp()); break; case "2": - result = o1.getTimestamp() > o2.getTimestamp() ? 1 : (o1.getTimestamp() == o2.getTimestamp() ? 0 : -1); + result = Long.compare(o1.getTimestamp(), o2.getTimestamp()); break; default: result = 0; @@ -414,7 +449,7 @@ public class StoriesService extends BaseService { return listCopy; } - public class ArchiveFetchResponse { + public static class ArchiveFetchResponse { private final List archives; private final boolean hasNextPage; private final String nextCursor; diff --git a/app/src/main/java/awais/instagrabber/webservices/TagsService.java b/app/src/main/java/awais/instagrabber/webservices/TagsService.java index 7f3dc490..004bcd8f 100644 --- a/app/src/main/java/awais/instagrabber/webservices/TagsService.java +++ b/app/src/main/java/awais/instagrabber/webservices/TagsService.java @@ -6,22 +6,13 @@ import androidx.annotation.NonNull; import com.google.common.collect.ImmutableMap; -import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Objects; - -import awais.instagrabber.models.FeedModel; import awais.instagrabber.repositories.TagsRepository; import awais.instagrabber.repositories.responses.PostsFetchResponse; +import awais.instagrabber.repositories.responses.TagFeedResponse; import awais.instagrabber.utils.Constants; -import awais.instagrabber.utils.ResponseBodyUtils; import awais.instagrabber.utils.TextUtils; import retrofit2.Call; import retrofit2.Callback; @@ -124,29 +115,27 @@ public class TagsService extends BaseService { if (!TextUtils.isEmpty(maxId)) { builder.put("max_id", maxId); } - final Call request = repository.fetchPosts(tag, builder.build()); - request.enqueue(new Callback() { + final Call request = repository.fetchPosts(tag, builder.build()); + request.enqueue(new Callback() { @Override - public void onResponse(@NonNull final Call call, @NonNull final Response response) { - try { - if (callback == null) { - return; - } - final String body = response.body(); - if (TextUtils.isEmpty(body)) { - callback.onSuccess(null); - return; - } - final PostsFetchResponse tagPostsFetchResponse = parseResponse(body); - callback.onSuccess(tagPostsFetchResponse); - } catch (JSONException e) { - Log.e(TAG, "onResponse", e); - callback.onFailure(e); + public void onResponse(@NonNull final Call call, @NonNull final Response response) { + if (callback == null) { + return; } + final TagFeedResponse body = response.body(); + if (body == null) { + callback.onSuccess(null); + return; + } + callback.onSuccess(new PostsFetchResponse( + body.getItems(), + body.isMoreAvailable(), + body.getNextMaxId() + )); } @Override - public void onFailure(@NonNull final Call call, @NonNull final Throwable t) { + public void onFailure(@NonNull final Call call, @NonNull final Throwable t) { if (callback != null) { callback.onFailure(t); } @@ -154,34 +143,34 @@ public class TagsService extends BaseService { }); } - private PostsFetchResponse parseResponse(@NonNull final String body) throws JSONException { - final JSONObject root = new JSONObject(body); - final boolean moreAvailable = root.optBoolean("more_available"); - final String nextMaxId = root.optString("next_max_id"); - final JSONArray itemsJson = root.optJSONArray("items"); - final List items = parseItems(itemsJson); - return new PostsFetchResponse( - items, - moreAvailable, - nextMaxId - ); - } + // private PostsFetchResponse parseResponse(@NonNull final String body) throws JSONException { + // final JSONObject root = new JSONObject(body); + // final boolean moreAvailable = root.optBoolean("more_available"); + // final String nextMaxId = root.optString("next_max_id"); + // final JSONArray itemsJson = root.optJSONArray("items"); + // final List items = parseItems(itemsJson); + // return new PostsFetchResponse( + // items, + // moreAvailable, + // nextMaxId + // ); + // } - private List parseItems(final JSONArray items) throws JSONException { - if (items == null) { - return Collections.emptyList(); - } - final List feedModels = new ArrayList<>(); - for (int i = 0; i < items.length(); i++) { - final JSONObject itemJson = items.optJSONObject(i); - if (itemJson == null) { - continue; - } - final FeedModel feedModel = ResponseBodyUtils.parseItem(itemJson); - if (feedModel != null) { - feedModels.add(feedModel); - } - } - return feedModels; - } + // private List parseItems(final JSONArray items) throws JSONException { + // if (items == null) { + // return Collections.emptyList(); + // } + // final List feedModels = new ArrayList<>(); + // for (int i = 0; i < items.length(); i++) { + // final JSONObject itemJson = items.optJSONObject(i); + // if (itemJson == null) { + // continue; + // } + // final FeedModel feedModel = ResponseBodyUtils.parseItem(itemJson); + // if (feedModel != null) { + // feedModels.add(feedModel); + // } + // } + // return feedModels; + // } } diff --git a/app/src/main/java/awais/instagrabber/webservices/UserService.java b/app/src/main/java/awais/instagrabber/webservices/UserService.java index b61c6960..c3b3e9a4 100644 --- a/app/src/main/java/awais/instagrabber/webservices/UserService.java +++ b/app/src/main/java/awais/instagrabber/webservices/UserService.java @@ -1,18 +1,12 @@ package awais.instagrabber.webservices; -import android.util.Log; - import androidx.annotation.NonNull; -import org.json.JSONException; -import org.json.JSONObject; - import java.util.TimeZone; import awais.instagrabber.repositories.UserRepository; -import awais.instagrabber.repositories.responses.UserInfo; +import awais.instagrabber.repositories.responses.User; import awais.instagrabber.repositories.responses.UserSearchResponse; -import awais.instagrabber.utils.Constants; import retrofit2.Call; import retrofit2.Callback; import retrofit2.Response; @@ -39,34 +33,21 @@ public class UserService extends BaseService { return instance; } - public void getUserInfo(final String uid, final ServiceCallback callback) { - final Call request = repository.getUserInfo(uid); - request.enqueue(new Callback() { + public void getUserInfo(final long uid, final ServiceCallback callback) { + final Call request = repository.getUserInfo(uid); + request.enqueue(new Callback() { @Override - public void onResponse(@NonNull final Call call, @NonNull final Response response) { - final String body = response.body(); - if (body == null) return; - try { - final JSONObject jsonObject = new JSONObject(body); - final JSONObject user = jsonObject.optJSONObject(Constants.EXTRAS_USER); - if (user == null) return; - // Log.d(TAG, "user: " + user.toString()); - final UserInfo userInfo = new UserInfo( - uid, - user.getString(Constants.EXTRAS_USERNAME), - user.optString("full_name"), - user.optString("profile_pic_url"), - user.has("hd_profile_pic_url_info") - ? user.getJSONObject("hd_profile_pic_url_info").optString("url") : null - ); - callback.onSuccess(userInfo); - } catch (JSONException e) { - Log.e(TAG, "Error parsing json", e); + public void onResponse(@NonNull final Call call, @NonNull final Response response) { + final User user = response.body(); + if (user == null) { + callback.onSuccess(null); + return; } + callback.onSuccess(user); } @Override - public void onFailure(@NonNull final Call call, @NonNull final Throwable t) { + public void onFailure(@NonNull final Call call, @NonNull final Throwable t) { callback.onFailure(t); } }); diff --git a/app/src/main/res/navigation/comments_nav_graph.xml b/app/src/main/res/navigation/comments_nav_graph.xml index 6f5e9bac..82ffd80c 100644 --- a/app/src/main/res/navigation/comments_nav_graph.xml +++ b/app/src/main/res/navigation/comments_nav_graph.xml @@ -42,8 +42,7 @@ app:nullable="false" /> + app:argType="long" /> + app:argType="long" /> diff --git a/app/src/main/res/navigation/direct_messages_nav_graph.xml b/app/src/main/res/navigation/direct_messages_nav_graph.xml index 55fd2515..70afe3d0 100644 --- a/app/src/main/res/navigation/direct_messages_nav_graph.xml +++ b/app/src/main/res/navigation/direct_messages_nav_graph.xml @@ -23,8 +23,7 @@ app:destination="@id/location_nav_graph"> + app:argType="long" /> @@ -64,8 +63,7 @@ app:nullable="false" /> + app:argType="long" /> @@ -140,7 +138,9 @@ tools:layout="@layout/fragment_direct_messages_settings"> + app:argType="string" + app:nullable="false" /> + + app:argType="long" /> @@ -53,8 +52,7 @@ app:nullable="false" /> + app:argType="long" /> @@ -62,14 +60,14 @@ - - + + diff --git a/app/src/main/res/navigation/feed_nav_graph.xml b/app/src/main/res/navigation/feed_nav_graph.xml index 1c2d8b62..b87d891e 100644 --- a/app/src/main/res/navigation/feed_nav_graph.xml +++ b/app/src/main/res/navigation/feed_nav_graph.xml @@ -34,8 +34,7 @@ app:destination="@id/location_nav_graph"> + app:argType="long" /> @@ -53,8 +52,7 @@ app:nullable="false" /> + app:argType="long" /> diff --git a/app/src/main/res/navigation/hashtag_nav_graph.xml b/app/src/main/res/navigation/hashtag_nav_graph.xml index 8af163c2..c8a61d1e 100644 --- a/app/src/main/res/navigation/hashtag_nav_graph.xml +++ b/app/src/main/res/navigation/hashtag_nav_graph.xml @@ -20,8 +20,7 @@ app:nullable="false" /> + app:argType="long" /> @@ -53,8 +52,7 @@ app:destination="@id/location_nav_graph"> + app:argType="long" /> + app:argType="long" /> @@ -64,8 +63,7 @@ tools:layout="@layout/fragment_location"> + app:argType="long" /> @@ -75,8 +73,7 @@ app:destination="@id/locationFragment"> + app:argType="long" /> + app:argType="long" /> + app:argType="long" /> diff --git a/app/src/main/res/navigation/profile_nav_graph.xml b/app/src/main/res/navigation/profile_nav_graph.xml index bf78ac76..dd676668 100644 --- a/app/src/main/res/navigation/profile_nav_graph.xml +++ b/app/src/main/res/navigation/profile_nav_graph.xml @@ -20,8 +20,7 @@ app:nullable="false" /> + app:argType="long" /> @@ -69,8 +68,7 @@ app:destination="@id/location_nav_graph"> + app:argType="long" /> @@ -118,8 +116,7 @@ app:nullable="false" /> + app:argType="long" /> + app:argType="long" /> + app:argType="long" />