diff --git a/app/src/main/java/awais/instagrabber/adapters/HighlightStoriesListAdapter.java b/app/src/main/java/awais/instagrabber/adapters/HighlightStoriesListAdapter.java index 9547b9c1..eabfe737 100755 --- a/app/src/main/java/awais/instagrabber/adapters/HighlightStoriesListAdapter.java +++ b/app/src/main/java/awais/instagrabber/adapters/HighlightStoriesListAdapter.java @@ -9,19 +9,19 @@ import androidx.recyclerview.widget.ListAdapter; import awais.instagrabber.adapters.viewholder.StoryListViewHolder; import awais.instagrabber.databinding.ItemNotificationBinding; -import awais.instagrabber.models.HighlightModel; +import awais.instagrabber.repositories.responses.stories.Story; -public final class HighlightStoriesListAdapter extends ListAdapter { +public final class HighlightStoriesListAdapter extends ListAdapter { private final OnHighlightStoryClickListener listener; - private static final DiffUtil.ItemCallback diffCallback = new DiffUtil.ItemCallback() { + private static final DiffUtil.ItemCallback diffCallback = new DiffUtil.ItemCallback() { @Override - public boolean areItemsTheSame(@NonNull final HighlightModel oldItem, @NonNull final HighlightModel newItem) { + public boolean areItemsTheSame(@NonNull final Story oldItem, @NonNull final Story newItem) { return oldItem.getId().equals(newItem.getId()); } @Override - public boolean areContentsTheSame(@NonNull final HighlightModel oldItem, @NonNull final HighlightModel newItem) { + public boolean areContentsTheSame(@NonNull final Story oldItem, @NonNull final Story newItem) { return oldItem.getId().equals(newItem.getId()); } }; @@ -41,12 +41,12 @@ public final class HighlightStoriesListAdapter extends ListAdapter { if (notificationClickListener == null) return; diff --git a/app/src/main/java/awais/instagrabber/fragments/StoryListViewerFragment.java b/app/src/main/java/awais/instagrabber/fragments/StoryListViewerFragment.java index c259b1c4..77ef289a 100644 --- a/app/src/main/java/awais/instagrabber/fragments/StoryListViewerFragment.java +++ b/app/src/main/java/awais/instagrabber/fragments/StoryListViewerFragment.java @@ -38,8 +38,8 @@ import awais.instagrabber.adapters.HighlightStoriesListAdapter.OnHighlightStoryC import awais.instagrabber.customviews.helpers.RecyclerLazyLoader; import awais.instagrabber.databinding.FragmentStoryListViewerBinding; import awais.instagrabber.fragments.settings.MorePreferencesFragmentDirections; -import awais.instagrabber.models.HighlightModel; import awais.instagrabber.repositories.requests.StoryViewerOptions; +import awais.instagrabber.repositories.responses.stories.ArchiveResponse; import awais.instagrabber.repositories.responses.stories.Story; import awais.instagrabber.utils.AppExecutors; import awais.instagrabber.utils.CoroutineUtilsKt; @@ -48,7 +48,6 @@ import awais.instagrabber.viewmodels.ArchivesViewModel; import awais.instagrabber.viewmodels.FeedStoriesViewModel; import awais.instagrabber.webservices.ServiceCallback; import awais.instagrabber.webservices.StoriesRepository; -import awais.instagrabber.webservices.StoriesRepository.ArchiveFetchResponse; import kotlinx.coroutines.Dispatchers; public final class StoryListViewerFragment extends Fragment implements SwipeRefreshLayout.OnRefreshListener { @@ -88,7 +87,7 @@ public final class StoryListViewerFragment extends Fragment implements SwipeRefr private final OnHighlightStoryClickListener archiveClickListener = new OnHighlightStoryClickListener() { @Override - public void onHighlightClick(final HighlightModel model, final int position) { + public void onHighlightClick(final Story model, final int position) { if (model == null) return; final NavDirections action = StoryListViewerFragmentDirections .actionStoryListFragmentToStoryViewerFragment(StoryViewerOptions.forStoryArchive(position)); @@ -101,9 +100,9 @@ public final class StoryListViewerFragment extends Fragment implements SwipeRefr } }; - private final ServiceCallback cb = new ServiceCallback() { + private final ServiceCallback cb = new ServiceCallback() { @Override - public void onSuccess(final ArchiveFetchResponse result) { + public void onSuccess(final ArchiveResponse result) { binding.swipeRefreshLayout.setRefreshing(false); if (result == null) { try { @@ -111,10 +110,10 @@ public final class StoryListViewerFragment extends Fragment implements SwipeRefr Toast.makeText(context, R.string.empty_list, Toast.LENGTH_SHORT).show(); } catch (Exception ignored) {} } else { - endCursor = result.getNextCursor(); - final List models = archivesViewModel.getList().getValue(); - final List modelsCopy = models == null ? new ArrayList<>() : new ArrayList<>(models); - modelsCopy.addAll(result.getResult()); + endCursor = result.getMaxId(); + final List models = archivesViewModel.getList().getValue(); + final List modelsCopy = models == null ? new ArrayList<>() : new ArrayList<>(models); + modelsCopy.addAll(result.getItems()); archivesViewModel.getList().postValue(modelsCopy); } } diff --git a/app/src/main/java/awais/instagrabber/fragments/StoryViewerFragment.java b/app/src/main/java/awais/instagrabber/fragments/StoryViewerFragment.java index b67487b2..7f951c6c 100644 --- a/app/src/main/java/awais/instagrabber/fragments/StoryViewerFragment.java +++ b/app/src/main/java/awais/instagrabber/fragments/StoryViewerFragment.java @@ -75,7 +75,6 @@ import awais.instagrabber.databinding.FragmentStoryViewerBinding; import awais.instagrabber.fragments.main.ProfileFragmentDirections; import awais.instagrabber.fragments.settings.PreferenceKeys; import awais.instagrabber.interfaces.SwipeEvent; -import awais.instagrabber.models.HighlightModel; import awais.instagrabber.models.StoryModel; import awais.instagrabber.models.enums.MediaItemType; import awais.instagrabber.models.stickers.PollModel; @@ -760,12 +759,12 @@ public class StoryViewerFragment extends Fragment { } case STORY_ARCHIVE: { final ArchivesViewModel archivesViewModel = (ArchivesViewModel) viewModel; - final List models = archivesViewModel.getList().getValue(); + final List models = archivesViewModel.getList().getValue(); if (models == null || models.isEmpty() || currentFeedStoryIndex >= models.size() || currentFeedStoryIndex < 0) { Toast.makeText(context, R.string.downloader_unknown_error, Toast.LENGTH_SHORT).show(); return; } - final HighlightModel model = models.get(currentFeedStoryIndex); + final Story model = models.get(currentFeedStoryIndex); currentStoryMediaId = parseStoryMediaId(model.getId()); currentStoryUsername = model.getTitle(); fetchOptions = StoryViewerOptions.forStoryArchive(model.getId()); diff --git a/app/src/main/java/awais/instagrabber/models/HighlightModel.kt b/app/src/main/java/awais/instagrabber/models/HighlightModel.kt deleted file mode 100644 index 73ac96eb..00000000 --- a/app/src/main/java/awais/instagrabber/models/HighlightModel.kt +++ /dev/null @@ -1,14 +0,0 @@ -package awais.instagrabber.models - -import awais.instagrabber.utils.TextUtils - -data class HighlightModel( - val title: String? = null, - val id: String = "", - val thumbnailUrl: String = "", - val timestamp: Long = 0, - val mediaCount: Int = 0, -) { - val dateTime: String - get() = TextUtils.epochSecondToString(timestamp) -} \ No newline at end of file diff --git a/app/src/main/java/awais/instagrabber/repositories/StoriesService.kt b/app/src/main/java/awais/instagrabber/repositories/StoriesService.kt index 205830c0..f9190548 100644 --- a/app/src/main/java/awais/instagrabber/repositories/StoriesService.kt +++ b/app/src/main/java/awais/instagrabber/repositories/StoriesService.kt @@ -1,5 +1,6 @@ package awais.instagrabber.repositories +import awais.instagrabber.repositories.responses.stories.ArchiveResponse import awais.instagrabber.repositories.responses.stories.ReelsTrayResponse import awais.instagrabber.repositories.responses.stories.StoryStickerResponse import retrofit2.http.* @@ -16,7 +17,7 @@ interface StoriesService { suspend fun fetchHighlights(@Path("uid") uid: Long): ReelsTrayResponse @GET("/api/v1/archive/reel/day_shells/") - suspend fun fetchArchive(@QueryMap queryParams: Map): String + suspend fun fetchArchive(@QueryMap queryParams: Map): ArchiveResponse? @GET suspend fun getUserStory(@Url url: String): String diff --git a/app/src/main/java/awais/instagrabber/repositories/responses/stories/ArchiveResponse.kt b/app/src/main/java/awais/instagrabber/repositories/responses/stories/ArchiveResponse.kt new file mode 100644 index 00000000..d9c990dd --- /dev/null +++ b/app/src/main/java/awais/instagrabber/repositories/responses/stories/ArchiveResponse.kt @@ -0,0 +1,9 @@ +package awais.instagrabber.repositories.responses.stories + +data class ArchiveResponse( + val numResults: Int, + val maxId: String?, + val moreAvailable: Boolean, + val status: String, + val items: List +) \ No newline at end of file diff --git a/app/src/main/java/awais/instagrabber/repositories/responses/stories/Story.kt b/app/src/main/java/awais/instagrabber/repositories/responses/stories/Story.kt index 57f8b095..1b2df16c 100644 --- a/app/src/main/java/awais/instagrabber/repositories/responses/stories/Story.kt +++ b/app/src/main/java/awais/instagrabber/repositories/responses/stories/Story.kt @@ -1,6 +1,7 @@ package awais.instagrabber.repositories.responses.stories import java.io.Serializable +import awais.instagrabber.repositories.responses.ImageUrl import awais.instagrabber.repositories.responses.User import awais.instagrabber.utils.TextUtils @@ -8,19 +9,23 @@ data class Story( // universal val id: String?, val latestReelMedia: Long?, // = timestamp + val mediaCount: Int?, + // for stories and highlights var seen: Long?, val user: User?, // for stories - val mediaCount: Int?, val muted: Boolean?, val hasBestiesMedia: Boolean?, val items: List?, // may be null // for highlights val coverMedia: CoverMedia?, val title: String?, + // for archives + val coverImageVersion: ImageUrl?, // invented fields val broadcast: Broadcast? // does not naturally occur ) : Serializable { val dateTime: String get() = if (latestReelMedia != null) TextUtils.epochSecondToString(latestReelMedia) else "" + // note that archives have property "timestamp" but is ignored } \ No newline at end of file diff --git a/app/src/main/java/awais/instagrabber/viewmodels/ArchivesViewModel.java b/app/src/main/java/awais/instagrabber/viewmodels/ArchivesViewModel.java index 18802826..be70eac0 100644 --- a/app/src/main/java/awais/instagrabber/viewmodels/ArchivesViewModel.java +++ b/app/src/main/java/awais/instagrabber/viewmodels/ArchivesViewModel.java @@ -5,12 +5,12 @@ import androidx.lifecycle.ViewModel; import java.util.List; -import awais.instagrabber.models.HighlightModel; +import awais.instagrabber.repositories.responses.stories.Story; public class ArchivesViewModel extends ViewModel { - private MutableLiveData> list; + private MutableLiveData> list; - public MutableLiveData> getList() { + public MutableLiveData> getList() { if (list == null) { list = new MutableLiveData<>(); } diff --git a/app/src/main/java/awais/instagrabber/webservices/StoriesRepository.kt b/app/src/main/java/awais/instagrabber/webservices/StoriesRepository.kt index d4f080cd..bc5b18ff 100644 --- a/app/src/main/java/awais/instagrabber/webservices/StoriesRepository.kt +++ b/app/src/main/java/awais/instagrabber/webservices/StoriesRepository.kt @@ -1,10 +1,10 @@ package awais.instagrabber.webservices import awais.instagrabber.fragments.settings.PreferenceKeys -import awais.instagrabber.models.HighlightModel import awais.instagrabber.models.StoryModel import awais.instagrabber.repositories.StoriesService import awais.instagrabber.repositories.requests.StoryViewerOptions +import awais.instagrabber.repositories.responses.stories.ArchiveResponse import awais.instagrabber.repositories.responses.stories.Story import awais.instagrabber.repositories.responses.stories.StoryStickerResponse import awais.instagrabber.utils.Constants @@ -35,14 +35,15 @@ open class StoriesRepository(private val service: StoriesService) { Story( broadcast.id, broadcast.publishedTime, + 1, 0L, broadcast.broadcastOwner, - 1, broadcast.muted, false, // unclear null, null, null, + null, broadcast ) ) @@ -53,11 +54,11 @@ open class StoriesRepository(private val service: StoriesService) { open suspend fun fetchHighlights(profileId: Long): List { val response = service.fetchHighlights(profileId) - val highlightModels = response.tray ?: listOf() + val highlightModels = response?.tray ?: listOf() return highlightModels } - suspend fun fetchArchive(maxId: String): ArchiveFetchResponse { + suspend fun fetchArchive(maxId: String): ArchiveResponse? { val form = mutableMapOf( "include_suggested_highlights" to "false", "is_in_archive_home" to "true", @@ -66,24 +67,7 @@ open class StoriesRepository(private val service: StoriesService) { if (!isEmpty(maxId)) { form["max_id"] = maxId // NOT TESTED } - val response = service.fetchArchive(form) - val data = JSONObject(response) - val highlightsReel = data.getJSONArray("items") - val length = highlightsReel.length() - val highlightModels: MutableList = ArrayList() - for (i in 0 until length) { - val highlightNode = highlightsReel.getJSONObject(i) - highlightModels.add( - HighlightModel( - null, - highlightNode.getString(Constants.EXTRAS_ID), - highlightNode.getJSONObject("cover_image_version").getString("url"), - highlightNode.getLong("latest_reel_media"), - highlightNode.getInt("media_count") - ) - ) - } - return ArchiveFetchResponse(highlightModels, data.getBoolean("more_available"), data.getString("max_id")) + return service.fetchArchive(form) } open suspend fun getUserStory(options: StoryViewerOptions): List { @@ -248,12 +232,6 @@ open class StoriesRepository(private val service: StoriesService) { return listCopy } - class ArchiveFetchResponse(val result: List, val hasNextPage: Boolean, val nextCursor: String) { - fun hasNextPage(): Boolean { - return hasNextPage - } - } - companion object { @Volatile private var INSTANCE: StoriesRepository? = null