mirror of
				https://github.com/KokaKiwi/BarInsta
				synced 2025-11-03 21:15:35 +00:00 
			
		
		
		
	support for viewing comment likes
This commit is contained in:
		
							parent
							
								
									49ba524305
								
							
						
					
					
						commit
						28af696e01
					
				@ -25,6 +25,7 @@ import androidx.appcompat.widget.LinearLayoutCompat;
 | 
				
			|||||||
import androidx.fragment.app.FragmentManager;
 | 
					import androidx.fragment.app.FragmentManager;
 | 
				
			||||||
import androidx.fragment.app.FragmentTransaction;
 | 
					import androidx.fragment.app.FragmentTransaction;
 | 
				
			||||||
import androidx.lifecycle.ViewModelProvider;
 | 
					import androidx.lifecycle.ViewModelProvider;
 | 
				
			||||||
 | 
					import androidx.navigation.NavController;
 | 
				
			||||||
import androidx.navigation.NavDirections;
 | 
					import androidx.navigation.NavDirections;
 | 
				
			||||||
import androidx.navigation.fragment.NavHostFragment;
 | 
					import androidx.navigation.fragment.NavHostFragment;
 | 
				
			||||||
import androidx.recyclerview.widget.LinearLayoutManager;
 | 
					import androidx.recyclerview.widget.LinearLayoutManager;
 | 
				
			||||||
@ -288,6 +289,7 @@ public final class CommentsViewerFragment extends BottomSheetDialogFragment impl
 | 
				
			|||||||
            commentDialogList = new String[]{
 | 
					            commentDialogList = new String[]{
 | 
				
			||||||
                    resources.getString(R.string.open_profile),
 | 
					                    resources.getString(R.string.open_profile),
 | 
				
			||||||
                    resources.getString(R.string.comment_viewer_copy_comment),
 | 
					                    resources.getString(R.string.comment_viewer_copy_comment),
 | 
				
			||||||
 | 
					                    resources.getString(R.string.comment_viewer_see_likers),
 | 
				
			||||||
                    resources.getString(R.string.comment_viewer_reply_comment),
 | 
					                    resources.getString(R.string.comment_viewer_reply_comment),
 | 
				
			||||||
                    commentModel.getLiked() ? resources.getString(R.string.comment_viewer_unlike_comment)
 | 
					                    commentModel.getLiked() ? resources.getString(R.string.comment_viewer_unlike_comment)
 | 
				
			||||||
                                            : resources.getString(R.string.comment_viewer_like_comment),
 | 
					                                            : resources.getString(R.string.comment_viewer_like_comment),
 | 
				
			||||||
@ -298,6 +300,7 @@ public final class CommentsViewerFragment extends BottomSheetDialogFragment impl
 | 
				
			|||||||
            commentDialogList = new String[]{
 | 
					            commentDialogList = new String[]{
 | 
				
			||||||
                    resources.getString(R.string.open_profile),
 | 
					                    resources.getString(R.string.open_profile),
 | 
				
			||||||
                    resources.getString(R.string.comment_viewer_copy_comment),
 | 
					                    resources.getString(R.string.comment_viewer_copy_comment),
 | 
				
			||||||
 | 
					                    resources.getString(R.string.comment_viewer_see_likers),
 | 
				
			||||||
                    resources.getString(R.string.comment_viewer_reply_comment),
 | 
					                    resources.getString(R.string.comment_viewer_reply_comment),
 | 
				
			||||||
                    commentModel.getLiked() ? resources.getString(R.string.comment_viewer_unlike_comment)
 | 
					                    commentModel.getLiked() ? resources.getString(R.string.comment_viewer_unlike_comment)
 | 
				
			||||||
                                            : resources.getString(R.string.comment_viewer_like_comment),
 | 
					                                            : resources.getString(R.string.comment_viewer_like_comment),
 | 
				
			||||||
@ -306,7 +309,8 @@ public final class CommentsViewerFragment extends BottomSheetDialogFragment impl
 | 
				
			|||||||
        } else {
 | 
					        } else {
 | 
				
			||||||
            commentDialogList = new String[]{
 | 
					            commentDialogList = new String[]{
 | 
				
			||||||
                    resources.getString(R.string.open_profile),
 | 
					                    resources.getString(R.string.open_profile),
 | 
				
			||||||
                    resources.getString(R.string.comment_viewer_copy_comment)
 | 
					                    resources.getString(R.string.comment_viewer_copy_comment),
 | 
				
			||||||
 | 
					                    resources.getString(R.string.comment_viewer_see_likers)
 | 
				
			||||||
            };
 | 
					            };
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        final Context context = getContext();
 | 
					        final Context context = getContext();
 | 
				
			||||||
@ -321,7 +325,17 @@ public final class CommentsViewerFragment extends BottomSheetDialogFragment impl
 | 
				
			|||||||
                case 1: // copy comment
 | 
					                case 1: // copy comment
 | 
				
			||||||
                    Utils.copyText(context, "@" + profileModel.getUsername() + ": " + commentModel.getText());
 | 
					                    Utils.copyText(context, "@" + profileModel.getUsername() + ": " + commentModel.getText());
 | 
				
			||||||
                    break;
 | 
					                    break;
 | 
				
			||||||
                case 2: // reply to comment
 | 
					                case 2: // see comment likers, this is surprisingly available to anons
 | 
				
			||||||
 | 
					                    final NavController navController = getNavController();
 | 
				
			||||||
 | 
					                    if (navController != null) {
 | 
				
			||||||
 | 
					                        final Bundle bundle = new Bundle();
 | 
				
			||||||
 | 
					                        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();
 | 
				
			||||||
 | 
					                    break;
 | 
				
			||||||
 | 
					                case 3: // reply to comment
 | 
				
			||||||
                    commentsAdapter.setSelected(commentModel);
 | 
					                    commentsAdapter.setSelected(commentModel);
 | 
				
			||||||
                    String mention = "@" + profileModel.getUsername() + " ";
 | 
					                    String mention = "@" + profileModel.getUsername() + " ";
 | 
				
			||||||
                    binding.commentText.setText(mention);
 | 
					                    binding.commentText.setText(mention);
 | 
				
			||||||
@ -333,7 +347,7 @@ public final class CommentsViewerFragment extends BottomSheetDialogFragment impl
 | 
				
			|||||||
                        imm.showSoftInput(binding.commentText, 0);
 | 
					                        imm.showSoftInput(binding.commentText, 0);
 | 
				
			||||||
                    }, 200);
 | 
					                    }, 200);
 | 
				
			||||||
                    break;
 | 
					                    break;
 | 
				
			||||||
                case 3: // like/unlike comment
 | 
					                case 4: // like/unlike comment
 | 
				
			||||||
                    if (csrfToken == null) {
 | 
					                    if (csrfToken == null) {
 | 
				
			||||||
                        return;
 | 
					                        return;
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
@ -373,7 +387,7 @@ public final class CommentsViewerFragment extends BottomSheetDialogFragment impl
 | 
				
			|||||||
                        }
 | 
					                        }
 | 
				
			||||||
                    });
 | 
					                    });
 | 
				
			||||||
                    break;
 | 
					                    break;
 | 
				
			||||||
                case 4: // translate comment
 | 
					                case 5: // translate comment
 | 
				
			||||||
                    mediaService.translate(commentModel.getId(), "2", new ServiceCallback<String>() {
 | 
					                    mediaService.translate(commentModel.getId(), "2", new ServiceCallback<String>() {
 | 
				
			||||||
                        @Override
 | 
					                        @Override
 | 
				
			||||||
                        public void onSuccess(final String result) {
 | 
					                        public void onSuccess(final String result) {
 | 
				
			||||||
@ -395,7 +409,7 @@ public final class CommentsViewerFragment extends BottomSheetDialogFragment impl
 | 
				
			|||||||
                        }
 | 
					                        }
 | 
				
			||||||
                    });
 | 
					                    });
 | 
				
			||||||
                    break;
 | 
					                    break;
 | 
				
			||||||
                case 5: // delete comment
 | 
					                case 6: // delete comment
 | 
				
			||||||
                    final String userId = CookieUtils.getUserIdFromCookie(cookie);
 | 
					                    final String userId = CookieUtils.getUserIdFromCookie(cookie);
 | 
				
			||||||
                    if (userId == null) return;
 | 
					                    if (userId == null) return;
 | 
				
			||||||
                    mediaService.deleteComment(
 | 
					                    mediaService.deleteComment(
 | 
				
			||||||
@ -440,4 +454,15 @@ public final class CommentsViewerFragment extends BottomSheetDialogFragment impl
 | 
				
			|||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @Nullable
 | 
				
			||||||
 | 
					    private NavController getNavController() {
 | 
				
			||||||
 | 
					        NavController navController = null;
 | 
				
			||||||
 | 
					        try {
 | 
				
			||||||
 | 
					            navController = NavHostFragment.findNavController(this);
 | 
				
			||||||
 | 
					        } catch (IllegalStateException e) {
 | 
				
			||||||
 | 
					            Log.e(TAG, "navigateToProfile", e);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        return navController;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -14,28 +14,30 @@ import androidx.annotation.NonNull;
 | 
				
			|||||||
import androidx.annotation.Nullable;
 | 
					import androidx.annotation.Nullable;
 | 
				
			||||||
import androidx.appcompat.app.AppCompatActivity;
 | 
					import androidx.appcompat.app.AppCompatActivity;
 | 
				
			||||||
import androidx.appcompat.widget.LinearLayoutCompat;
 | 
					import androidx.appcompat.widget.LinearLayoutCompat;
 | 
				
			||||||
import androidx.lifecycle.ViewModelProvider;
 | 
					 | 
				
			||||||
import androidx.navigation.NavDirections;
 | 
					 | 
				
			||||||
import androidx.navigation.fragment.NavHostFragment;
 | 
					import androidx.navigation.fragment.NavHostFragment;
 | 
				
			||||||
import androidx.recyclerview.widget.LinearLayoutManager;
 | 
					import androidx.recyclerview.widget.LinearLayoutManager;
 | 
				
			||||||
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
 | 
					import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import com.google.android.material.bottomsheet.BottomSheetDialogFragment;
 | 
					import com.google.android.material.bottomsheet.BottomSheetDialogFragment;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import java.util.Collections;
 | 
					 | 
				
			||||||
import java.util.List;
 | 
					import java.util.List;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import awais.instagrabber.BuildConfig;
 | 
					 | 
				
			||||||
import awais.instagrabber.R;
 | 
					import awais.instagrabber.R;
 | 
				
			||||||
import awais.instagrabber.adapters.LikesAdapter;
 | 
					import awais.instagrabber.adapters.LikesAdapter;
 | 
				
			||||||
 | 
					import awais.instagrabber.customviews.helpers.RecyclerLazyLoader;
 | 
				
			||||||
import awais.instagrabber.databinding.FragmentLikesBinding;
 | 
					import awais.instagrabber.databinding.FragmentLikesBinding;
 | 
				
			||||||
import awais.instagrabber.models.ProfileModel;
 | 
					import awais.instagrabber.models.ProfileModel;
 | 
				
			||||||
 | 
					import awais.instagrabber.repositories.responses.GraphQLUserListFetchResponse;
 | 
				
			||||||
import awais.instagrabber.utils.Constants;
 | 
					import awais.instagrabber.utils.Constants;
 | 
				
			||||||
 | 
					import awais.instagrabber.utils.CookieUtils;
 | 
				
			||||||
import awais.instagrabber.utils.TextUtils;
 | 
					import awais.instagrabber.utils.TextUtils;
 | 
				
			||||||
import awais.instagrabber.utils.Utils;
 | 
					import awais.instagrabber.utils.Utils;
 | 
				
			||||||
 | 
					import awais.instagrabber.webservices.GraphQLService;
 | 
				
			||||||
import awais.instagrabber.webservices.MediaService;
 | 
					import awais.instagrabber.webservices.MediaService;
 | 
				
			||||||
import awais.instagrabber.webservices.ServiceCallback;
 | 
					import awais.instagrabber.webservices.ServiceCallback;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import static awais.instagrabber.utils.Utils.settingsHelper;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
public final class LikesViewerFragment extends BottomSheetDialogFragment implements SwipeRefreshLayout.OnRefreshListener {
 | 
					public final class LikesViewerFragment extends BottomSheetDialogFragment implements SwipeRefreshLayout.OnRefreshListener {
 | 
				
			||||||
    private static final String TAG = "LikesViewerFragment";
 | 
					    private static final String TAG = "LikesViewerFragment";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -47,8 +49,12 @@ public final class LikesViewerFragment extends BottomSheetDialogFragment impleme
 | 
				
			|||||||
    private Resources resources;
 | 
					    private Resources resources;
 | 
				
			||||||
    private AppCompatActivity fragmentActivity;
 | 
					    private AppCompatActivity fragmentActivity;
 | 
				
			||||||
    private LinearLayoutCompat root;
 | 
					    private LinearLayoutCompat root;
 | 
				
			||||||
 | 
					    private RecyclerLazyLoader lazyLoader;
 | 
				
			||||||
    private MediaService mediaService;
 | 
					    private MediaService mediaService;
 | 
				
			||||||
    private String postId;
 | 
					    private GraphQLService graphQLService;
 | 
				
			||||||
 | 
					    private boolean isLoggedIn;
 | 
				
			||||||
 | 
					    private String postId, endCursor;
 | 
				
			||||||
 | 
					    private boolean isComment;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private final ServiceCallback<List<ProfileModel>> cb = new ServiceCallback<List<ProfileModel>>() {
 | 
					    private final ServiceCallback<List<ProfileModel>> cb = new ServiceCallback<List<ProfileModel>>() {
 | 
				
			||||||
        @Override
 | 
					        @Override
 | 
				
			||||||
@ -78,11 +84,44 @@ public final class LikesViewerFragment extends BottomSheetDialogFragment impleme
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private final ServiceCallback<GraphQLUserListFetchResponse> acb = new ServiceCallback<GraphQLUserListFetchResponse>() {
 | 
				
			||||||
 | 
					        @Override
 | 
				
			||||||
 | 
					        public void onSuccess(final GraphQLUserListFetchResponse result) {
 | 
				
			||||||
 | 
					            endCursor = result.getNextMaxId();
 | 
				
			||||||
 | 
					            final LikesAdapter likesAdapter = new LikesAdapter(result.getItems(), v -> {
 | 
				
			||||||
 | 
					                final Object tag = v.getTag();
 | 
				
			||||||
 | 
					                if (tag instanceof ProfileModel) {
 | 
				
			||||||
 | 
					                    ProfileModel model = (ProfileModel) tag;
 | 
				
			||||||
 | 
					                    final Bundle bundle = new Bundle();
 | 
				
			||||||
 | 
					                    bundle.putString("username", "@" + model.getUsername());
 | 
				
			||||||
 | 
					                    NavHostFragment.findNavController(LikesViewerFragment.this).navigate(R.id.action_global_profileFragment, bundle);
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            });
 | 
				
			||||||
 | 
					            layoutManager = new LinearLayoutManager(getContext());
 | 
				
			||||||
 | 
					            binding.rvLikes.setAdapter(likesAdapter);
 | 
				
			||||||
 | 
					            binding.rvLikes.setLayoutManager(layoutManager);
 | 
				
			||||||
 | 
					            binding.swipeRefreshLayout.setRefreshing(false);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        @Override
 | 
				
			||||||
 | 
					        public void onFailure(final Throwable t) {
 | 
				
			||||||
 | 
					            Log.e(TAG, "Error", t);
 | 
				
			||||||
 | 
					            try {
 | 
				
			||||||
 | 
					                final Context context = getContext();
 | 
				
			||||||
 | 
					                Toast.makeText(context, t.getMessage(), Toast.LENGTH_SHORT).show();
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            catch (Exception e) {}
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @Override
 | 
					    @Override
 | 
				
			||||||
    public void onCreate(@Nullable final Bundle savedInstanceState) {
 | 
					    public void onCreate(@Nullable final Bundle savedInstanceState) {
 | 
				
			||||||
        super.onCreate(savedInstanceState);
 | 
					        super.onCreate(savedInstanceState);
 | 
				
			||||||
 | 
					        final String cookie = settingsHelper.getString(Constants.COOKIE);
 | 
				
			||||||
 | 
					        isLoggedIn = !TextUtils.isEmpty(cookie) && CookieUtils.getUserIdFromCookie(cookie) != null;
 | 
				
			||||||
        fragmentActivity = (AppCompatActivity) getActivity();
 | 
					        fragmentActivity = (AppCompatActivity) getActivity();
 | 
				
			||||||
        mediaService = MediaService.getInstance();
 | 
					        mediaService = isLoggedIn ? MediaService.getInstance() : null;
 | 
				
			||||||
 | 
					        graphQLService = isLoggedIn ? null : GraphQLService.getInstance();
 | 
				
			||||||
        // setHasOptionsMenu(true);
 | 
					        // setHasOptionsMenu(true);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -103,16 +142,29 @@ public final class LikesViewerFragment extends BottomSheetDialogFragment impleme
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    @Override
 | 
					    @Override
 | 
				
			||||||
    public void onRefresh() {
 | 
					    public void onRefresh() {
 | 
				
			||||||
        mediaService.fetchLikes(postId, cb);
 | 
					        if (isComment && !isLoggedIn) {
 | 
				
			||||||
 | 
					            lazyLoader.resetState();
 | 
				
			||||||
 | 
					            graphQLService.fetchCommentLikers(postId, null, acb);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        else mediaService.fetchLikes(postId, isComment, cb);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private void init() {
 | 
					    private void init() {
 | 
				
			||||||
        if (getArguments() == null) return;
 | 
					        if (getArguments() == null) return;
 | 
				
			||||||
        final LikesViewerFragmentArgs fragmentArgs = LikesViewerFragmentArgs.fromBundle(getArguments());
 | 
					        final LikesViewerFragmentArgs fragmentArgs = LikesViewerFragmentArgs.fromBundle(getArguments());
 | 
				
			||||||
        postId = fragmentArgs.getPostId();
 | 
					        postId = fragmentArgs.getPostId();
 | 
				
			||||||
 | 
					        isComment = fragmentArgs.getIsComment();
 | 
				
			||||||
        binding.swipeRefreshLayout.setOnRefreshListener(this);
 | 
					        binding.swipeRefreshLayout.setOnRefreshListener(this);
 | 
				
			||||||
        binding.swipeRefreshLayout.setRefreshing(true);
 | 
					        binding.swipeRefreshLayout.setRefreshing(true);
 | 
				
			||||||
        resources = getResources();
 | 
					        resources = getResources();
 | 
				
			||||||
 | 
					        if (isComment && !isLoggedIn) {
 | 
				
			||||||
 | 
					            lazyLoader = new RecyclerLazyLoader(layoutManager, (page, totalItemsCount) -> {
 | 
				
			||||||
 | 
					                if (!TextUtils.isEmpty(endCursor))
 | 
				
			||||||
 | 
					                    graphQLService.fetchCommentLikers(postId, null, acb);
 | 
				
			||||||
 | 
					                endCursor = null;
 | 
				
			||||||
 | 
					            });
 | 
				
			||||||
 | 
					            binding.rvLikes.addOnScrollListener(lazyLoader);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
        onRefresh();
 | 
					        onRefresh();
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -542,6 +542,7 @@ public class PostViewV2Fragment extends SharedElementTransitionDialogFragment {
 | 
				
			|||||||
            if (navController != null && isLoggedIn) {
 | 
					            if (navController != null && isLoggedIn) {
 | 
				
			||||||
                final Bundle bundle = new Bundle();
 | 
					                final Bundle bundle = new Bundle();
 | 
				
			||||||
                bundle.putString("postId", feedModel.getPostId());
 | 
					                bundle.putString("postId", feedModel.getPostId());
 | 
				
			||||||
 | 
					                bundle.putBoolean("isComment", false);
 | 
				
			||||||
                navController.navigate(R.id.action_global_likesViewerFragment, bundle);
 | 
					                navController.navigate(R.id.action_global_likesViewerFragment, bundle);
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            else {
 | 
					            else {
 | 
				
			||||||
 | 
				
			|||||||
@ -15,8 +15,9 @@ public interface MediaRepository {
 | 
				
			|||||||
    @GET("/api/v1/media/{mediaId}/info/")
 | 
					    @GET("/api/v1/media/{mediaId}/info/")
 | 
				
			||||||
    Call<String> fetch(@Path("mediaId") final String mediaId);
 | 
					    Call<String> fetch(@Path("mediaId") final String mediaId);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @GET("/api/v1/media/{mediaId}/likers/")
 | 
					    @GET("/api/v1/media/{mediaId}/{action}/")
 | 
				
			||||||
    Call<String> fetchLikes(@Path("mediaId") final String mediaId);
 | 
					    Call<String> fetchLikes(@Path("mediaId") final String mediaId,
 | 
				
			||||||
 | 
					                            @Path("action") final String action); // one of "likers" or "comment_likers"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @FormUrlEncoded
 | 
					    @FormUrlEncoded
 | 
				
			||||||
    @POST("/api/v1/media/{mediaId}/{action}/")
 | 
					    @POST("/api/v1/media/{mediaId}/{action}/")
 | 
				
			||||||
 | 
				
			|||||||
@ -0,0 +1,79 @@
 | 
				
			|||||||
 | 
					package awais.instagrabber.repositories.responses;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					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<ProfileModel> items;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public GraphQLUserListFetchResponse(final String nextMaxId,
 | 
				
			||||||
 | 
					                                        final String status,
 | 
				
			||||||
 | 
					                                        final List<ProfileModel> items) {
 | 
				
			||||||
 | 
					        this.nextMaxId = nextMaxId;
 | 
				
			||||||
 | 
					        this.status = status;
 | 
				
			||||||
 | 
					        this.items = items;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public boolean isMoreAvailable() {
 | 
				
			||||||
 | 
					        return !TextUtils.isEmpty(nextMaxId);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public String getNextMaxId() {
 | 
				
			||||||
 | 
					        return nextMaxId;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public GraphQLUserListFetchResponse setNextMaxId(final String nextMaxId) {
 | 
				
			||||||
 | 
					        this.nextMaxId = nextMaxId;
 | 
				
			||||||
 | 
					        return this;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public String getStatus() {
 | 
				
			||||||
 | 
					        return status;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public GraphQLUserListFetchResponse setStatus(final String status) {
 | 
				
			||||||
 | 
					        this.status = status;
 | 
				
			||||||
 | 
					        return this;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public List<ProfileModel> getItems() {
 | 
				
			||||||
 | 
					        return items;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public GraphQLUserListFetchResponse setItems(final List<ProfileModel> 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 GraphQLUserListFetchResponse that = (GraphQLUserListFetchResponse) o;
 | 
				
			||||||
 | 
					        return Objects.equals(nextMaxId, that.nextMaxId) &&
 | 
				
			||||||
 | 
					                Objects.equals(status, that.status) &&
 | 
				
			||||||
 | 
					                Objects.equals(items, that.items);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @Override
 | 
				
			||||||
 | 
					    public int hashCode() {
 | 
				
			||||||
 | 
					        return Objects.hash(nextMaxId, status, items);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @NonNull
 | 
				
			||||||
 | 
					    @Override
 | 
				
			||||||
 | 
					    public String toString() {
 | 
				
			||||||
 | 
					        return "GraphQLUserListFetchResponse{" +
 | 
				
			||||||
 | 
					                "nextMaxId='" + nextMaxId + '\'' +
 | 
				
			||||||
 | 
					                ", status='" + status + '\'' +
 | 
				
			||||||
 | 
					                ", items=" + items +
 | 
				
			||||||
 | 
					                '}';
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@ -21,7 +21,9 @@ import java.util.List;
 | 
				
			|||||||
import java.util.Map;
 | 
					import java.util.Map;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import awais.instagrabber.models.FeedModel;
 | 
					import awais.instagrabber.models.FeedModel;
 | 
				
			||||||
 | 
					import awais.instagrabber.models.ProfileModel;
 | 
				
			||||||
import awais.instagrabber.repositories.GraphQLRepository;
 | 
					import awais.instagrabber.repositories.GraphQLRepository;
 | 
				
			||||||
 | 
					import awais.instagrabber.repositories.responses.GraphQLUserListFetchResponse;
 | 
				
			||||||
import awais.instagrabber.repositories.responses.PostsFetchResponse;
 | 
					import awais.instagrabber.repositories.responses.PostsFetchResponse;
 | 
				
			||||||
import awais.instagrabber.utils.Constants;
 | 
					import awais.instagrabber.utils.Constants;
 | 
				
			||||||
import awais.instagrabber.utils.ResponseBodyUtils;
 | 
					import awais.instagrabber.utils.ResponseBodyUtils;
 | 
				
			||||||
@ -181,4 +183,61 @@ public class GraphQLService extends BaseService {
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
        return new PostsFetchResponse(feedModels, hasNextPage, endCursor);
 | 
					        return new PostsFetchResponse(feedModels, hasNextPage, endCursor);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public void fetchCommentLikers(final String commentId,
 | 
				
			||||||
 | 
					                                    final String endCursor,
 | 
				
			||||||
 | 
					                                    final ServiceCallback<GraphQLUserListFetchResponse> callback) {
 | 
				
			||||||
 | 
					        final Map<String, String> queryMap = new HashMap<>();
 | 
				
			||||||
 | 
					        queryMap.put("query_hash", "5f0b1f6281e72053cbc07909c8d154ae");
 | 
				
			||||||
 | 
					        queryMap.put("variables", "{\"comment_id\":\"" + commentId + "\"," +
 | 
				
			||||||
 | 
					                "\"first\":30," +
 | 
				
			||||||
 | 
					                "\"after\":\"" + (endCursor == null ? "" : endCursor) + "\"}");
 | 
				
			||||||
 | 
					        final Call<String> request = repository.fetch(queryMap);
 | 
				
			||||||
 | 
					        request.enqueue(new Callback<String>() {
 | 
				
			||||||
 | 
					            @Override
 | 
				
			||||||
 | 
					            public void onResponse(@NonNull final Call<String> call, @NonNull final Response<String> response) {
 | 
				
			||||||
 | 
					                final String rawBody = response.body();
 | 
				
			||||||
 | 
					                if (rawBody == null) {
 | 
				
			||||||
 | 
					                    Log.e(TAG, "Error occurred while fetching gql comment likes of "+commentId);
 | 
				
			||||||
 | 
					                    callback.onSuccess(null);
 | 
				
			||||||
 | 
					                    return;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                try {
 | 
				
			||||||
 | 
					                    final JSONObject body = new JSONObject(rawBody);
 | 
				
			||||||
 | 
					                    final String status = body.getString("status");
 | 
				
			||||||
 | 
					                    final JSONObject data = body.getJSONObject("data").getJSONObject("comment").getJSONObject("edge_liked_by");
 | 
				
			||||||
 | 
					                    final JSONObject pageInfo = data.getJSONObject("page_info");
 | 
				
			||||||
 | 
					                    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<ProfileModel> 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"),
 | 
				
			||||||
 | 
					                                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) {
 | 
				
			||||||
 | 
					                    Log.e(TAG, "onResponse", e);
 | 
				
			||||||
 | 
					                    if (callback != null) {
 | 
				
			||||||
 | 
					                        callback.onFailure(e);
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            @Override
 | 
				
			||||||
 | 
					            public void onFailure(@NonNull final Call<String> call, @NonNull final Throwable t) {
 | 
				
			||||||
 | 
					                if (callback != null) {
 | 
				
			||||||
 | 
					                    callback.onFailure(t);
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -356,8 +356,9 @@ public class MediaService extends BaseService {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public void fetchLikes(final String mediaId,
 | 
					    public void fetchLikes(final String mediaId,
 | 
				
			||||||
 | 
					                           final boolean isComment,
 | 
				
			||||||
                           @NonNull final ServiceCallback<List<ProfileModel>> callback) {
 | 
					                           @NonNull final ServiceCallback<List<ProfileModel>> callback) {
 | 
				
			||||||
        final Call<String> likesRequest = repository.fetchLikes(mediaId);
 | 
					        final Call<String> likesRequest = repository.fetchLikes(mediaId, isComment ? "comment_likers" : "likers");
 | 
				
			||||||
        likesRequest.enqueue(new Callback<String>() {
 | 
					        likesRequest.enqueue(new Callback<String>() {
 | 
				
			||||||
            @Override
 | 
					            @Override
 | 
				
			||||||
            public void onResponse(@NonNull final Call<String> call, @NonNull final Response<String> response) {
 | 
					            public void onResponse(@NonNull final Call<String> call, @NonNull final Response<String> response) {
 | 
				
			||||||
 | 
				
			|||||||
@ -62,4 +62,19 @@
 | 
				
			|||||||
            app:argType="string"
 | 
					            app:argType="string"
 | 
				
			||||||
            app:nullable="false" />
 | 
					            app:nullable="false" />
 | 
				
			||||||
    </action>
 | 
					    </action>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <include app:graph="@navigation/likes_nav_graph" />
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <action
 | 
				
			||||||
 | 
					        android:id="@+id/action_global_likesViewerFragment"
 | 
				
			||||||
 | 
					        app:destination="@id/likes_nav_graph">
 | 
				
			||||||
 | 
					    <argument
 | 
				
			||||||
 | 
					        android:name="postId"
 | 
				
			||||||
 | 
					        app:argType="string"
 | 
				
			||||||
 | 
					        app:nullable="false" />
 | 
				
			||||||
 | 
					    <argument
 | 
				
			||||||
 | 
					        android:name="isComment"
 | 
				
			||||||
 | 
					        app:argType="boolean"
 | 
				
			||||||
 | 
					        app:nullable="false" />
 | 
				
			||||||
 | 
					    </action>
 | 
				
			||||||
</navigation>
 | 
					</navigation>
 | 
				
			||||||
@ -68,10 +68,14 @@
 | 
				
			|||||||
    <action
 | 
					    <action
 | 
				
			||||||
        android:id="@+id/action_global_likesViewerFragment"
 | 
					        android:id="@+id/action_global_likesViewerFragment"
 | 
				
			||||||
        app:destination="@id/likes_nav_graph">
 | 
					        app:destination="@id/likes_nav_graph">
 | 
				
			||||||
        <argument
 | 
					    <argument
 | 
				
			||||||
            android:name="postId"
 | 
					        android:name="postId"
 | 
				
			||||||
            app:argType="string"
 | 
					        app:argType="string"
 | 
				
			||||||
            app:nullable="false" />
 | 
					        app:nullable="false" />
 | 
				
			||||||
 | 
					    <argument
 | 
				
			||||||
 | 
					        android:name="isComment"
 | 
				
			||||||
 | 
					        app:argType="boolean"
 | 
				
			||||||
 | 
					        app:nullable="false" />
 | 
				
			||||||
    </action>
 | 
					    </action>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    <fragment
 | 
					    <fragment
 | 
				
			||||||
 | 
				
			|||||||
@ -62,10 +62,14 @@
 | 
				
			|||||||
    <action
 | 
					    <action
 | 
				
			||||||
        android:id="@+id/action_global_likesViewerFragment"
 | 
					        android:id="@+id/action_global_likesViewerFragment"
 | 
				
			||||||
        app:destination="@id/likes_nav_graph">
 | 
					        app:destination="@id/likes_nav_graph">
 | 
				
			||||||
        <argument
 | 
					    <argument
 | 
				
			||||||
            android:name="postId"
 | 
					        android:name="postId"
 | 
				
			||||||
            app:argType="string"
 | 
					        app:argType="string"
 | 
				
			||||||
            app:nullable="false" />
 | 
					        app:nullable="false" />
 | 
				
			||||||
 | 
					    <argument
 | 
				
			||||||
 | 
					        android:name="isComment"
 | 
				
			||||||
 | 
					        app:argType="boolean"
 | 
				
			||||||
 | 
					        app:nullable="false" />
 | 
				
			||||||
    </action>
 | 
					    </action>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    <include app:graph="@navigation/notification_viewer_nav_graph" />
 | 
					    <include app:graph="@navigation/notification_viewer_nav_graph" />
 | 
				
			||||||
 | 
				
			|||||||
@ -66,6 +66,10 @@
 | 
				
			|||||||
            android:name="postId"
 | 
					            android:name="postId"
 | 
				
			||||||
            app:argType="string"
 | 
					            app:argType="string"
 | 
				
			||||||
            app:nullable="false" />
 | 
					            app:nullable="false" />
 | 
				
			||||||
 | 
					        <argument
 | 
				
			||||||
 | 
					            android:name="isComment"
 | 
				
			||||||
 | 
					            app:argType="boolean"
 | 
				
			||||||
 | 
					            app:nullable="false" />
 | 
				
			||||||
    </action>
 | 
					    </action>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    <include app:graph="@navigation/notification_viewer_nav_graph" />
 | 
					    <include app:graph="@navigation/notification_viewer_nav_graph" />
 | 
				
			||||||
 | 
				
			|||||||
@ -33,6 +33,10 @@
 | 
				
			|||||||
            android:name="postId"
 | 
					            android:name="postId"
 | 
				
			||||||
            app:argType="string"
 | 
					            app:argType="string"
 | 
				
			||||||
            app:nullable="false" />
 | 
					            app:nullable="false" />
 | 
				
			||||||
 | 
					        <argument
 | 
				
			||||||
 | 
					            android:name="isComment"
 | 
				
			||||||
 | 
					            app:argType="boolean"
 | 
				
			||||||
 | 
					            app:nullable="false" />
 | 
				
			||||||
    </action>
 | 
					    </action>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    <action
 | 
					    <action
 | 
				
			||||||
 | 
				
			|||||||
@ -27,6 +27,10 @@
 | 
				
			|||||||
            android:name="postId"
 | 
					            android:name="postId"
 | 
				
			||||||
            app:argType="string"
 | 
					            app:argType="string"
 | 
				
			||||||
            app:nullable="false" />
 | 
					            app:nullable="false" />
 | 
				
			||||||
 | 
					        <argument
 | 
				
			||||||
 | 
					            android:name="isComment"
 | 
				
			||||||
 | 
					            app:argType="boolean"
 | 
				
			||||||
 | 
					            app:nullable="false" />
 | 
				
			||||||
    </dialog>
 | 
					    </dialog>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    <action
 | 
					    <action
 | 
				
			||||||
@ -36,5 +40,9 @@
 | 
				
			|||||||
            android:name="postId"
 | 
					            android:name="postId"
 | 
				
			||||||
            app:argType="string"
 | 
					            app:argType="string"
 | 
				
			||||||
            app:nullable="false" />
 | 
					            app:nullable="false" />
 | 
				
			||||||
 | 
					        <argument
 | 
				
			||||||
 | 
					            android:name="isComment"
 | 
				
			||||||
 | 
					            app:argType="boolean"
 | 
				
			||||||
 | 
					            app:nullable="false" />
 | 
				
			||||||
    </action>
 | 
					    </action>
 | 
				
			||||||
</navigation>
 | 
					</navigation>
 | 
				
			||||||
@ -33,6 +33,10 @@
 | 
				
			|||||||
            android:name="postId"
 | 
					            android:name="postId"
 | 
				
			||||||
            app:argType="string"
 | 
					            app:argType="string"
 | 
				
			||||||
            app:nullable="false" />
 | 
					            app:nullable="false" />
 | 
				
			||||||
 | 
					        <argument
 | 
				
			||||||
 | 
					            android:name="isComment"
 | 
				
			||||||
 | 
					            app:argType="boolean"
 | 
				
			||||||
 | 
					            app:nullable="false" />
 | 
				
			||||||
    </action>
 | 
					    </action>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    <action
 | 
					    <action
 | 
				
			||||||
 | 
				
			|||||||
@ -16,7 +16,6 @@
 | 
				
			|||||||
        app:destination="@id/notificationsViewer" />
 | 
					        app:destination="@id/notificationsViewer" />
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    <include app:graph="@navigation/comments_nav_graph" />
 | 
					    <include app:graph="@navigation/comments_nav_graph" />
 | 
				
			||||||
    <include app:graph="@navigation/likes_nav_graph" />
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    <action
 | 
					    <action
 | 
				
			||||||
        android:id="@+id/action_global_commentsViewerFragment"
 | 
					        android:id="@+id/action_global_commentsViewerFragment"
 | 
				
			||||||
@ -34,4 +33,19 @@
 | 
				
			|||||||
            app:argType="string"
 | 
					            app:argType="string"
 | 
				
			||||||
            app:nullable="false" />
 | 
					            app:nullable="false" />
 | 
				
			||||||
    </action>
 | 
					    </action>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <include app:graph="@navigation/likes_nav_graph" />
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <action
 | 
				
			||||||
 | 
					        android:id="@+id/action_global_likesViewerFragment"
 | 
				
			||||||
 | 
					        app:destination="@id/likes_nav_graph">
 | 
				
			||||||
 | 
					        <argument
 | 
				
			||||||
 | 
					            android:name="postId"
 | 
				
			||||||
 | 
					            app:argType="string"
 | 
				
			||||||
 | 
					            app:nullable="false" />
 | 
				
			||||||
 | 
					        <argument
 | 
				
			||||||
 | 
					            android:name="isComment"
 | 
				
			||||||
 | 
					            app:argType="boolean"
 | 
				
			||||||
 | 
					            app:nullable="false" />
 | 
				
			||||||
 | 
					    </action>
 | 
				
			||||||
</navigation>
 | 
					</navigation>
 | 
				
			||||||
@ -33,9 +33,12 @@
 | 
				
			|||||||
            android:name="postId"
 | 
					            android:name="postId"
 | 
				
			||||||
            app:argType="string"
 | 
					            app:argType="string"
 | 
				
			||||||
            app:nullable="false" />
 | 
					            app:nullable="false" />
 | 
				
			||||||
 | 
					        <argument
 | 
				
			||||||
 | 
					            android:name="isComment"
 | 
				
			||||||
 | 
					            app:argType="boolean"
 | 
				
			||||||
 | 
					            app:nullable="false" />
 | 
				
			||||||
    </action>
 | 
					    </action>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
    <include app:graph="@navigation/hashtag_nav_graph" />
 | 
					    <include app:graph="@navigation/hashtag_nav_graph" />
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    <action
 | 
					    <action
 | 
				
			||||||
 | 
				
			|||||||
@ -195,6 +195,7 @@
 | 
				
			|||||||
    <string name="downloader_too_many">You can only download 100 posts at a time. Don\'t be too greedy!</string>
 | 
					    <string name="downloader_too_many">You can only download 100 posts at a time. Don\'t be too greedy!</string>
 | 
				
			||||||
    <string name="comment_viewer_copy_user">Copy username</string>
 | 
					    <string name="comment_viewer_copy_user">Copy username</string>
 | 
				
			||||||
    <string name="comment_viewer_copy_comment">Copy comment</string>
 | 
					    <string name="comment_viewer_copy_comment">Copy comment</string>
 | 
				
			||||||
 | 
					    <string name="comment_viewer_see_likers">View comment likers</string>
 | 
				
			||||||
    <string name="comment_viewer_reply_comment">Reply to comment</string>
 | 
					    <string name="comment_viewer_reply_comment">Reply to comment</string>
 | 
				
			||||||
    <string name="comment_viewer_like_comment">Like comment</string>
 | 
					    <string name="comment_viewer_like_comment">Like comment</string>
 | 
				
			||||||
    <string name="comment_viewer_unlike_comment">Unlike comment</string>
 | 
					    <string name="comment_viewer_unlike_comment">Unlike comment</string>
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user