mirror of
				https://github.com/KokaKiwi/BarInsta
				synced 2025-11-04 05:25:35 +00:00 
			
		
		
		
	open on giphy & download voice; close #792
This commit is contained in:
		
							parent
							
								
									ac9b5385d2
								
							
						
					
					
						commit
						22a927e9e7
					
				@ -543,6 +543,15 @@ public abstract class DirectItemViewHolder extends RecyclerView.ViewHolder imple
 | 
				
			|||||||
        if (thread.getInputMode() != 1 && messageDirection == MessageDirection.OUTGOING) {
 | 
					        if (thread.getInputMode() != 1 && messageDirection == MessageDirection.OUTGOING) {
 | 
				
			||||||
            builder.add(new DirectItemContextMenu.MenuItem(R.id.unsend, R.string.dms_inbox_unsend));
 | 
					            builder.add(new DirectItemContextMenu.MenuItem(R.id.unsend, R.string.dms_inbox_unsend));
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					        final DirectItemType itemType = item.getItemType();
 | 
				
			||||||
 | 
					        switch (itemType) {
 | 
				
			||||||
 | 
					            case ANIMATED_MEDIA:
 | 
				
			||||||
 | 
					                builder.add(new DirectItemContextMenu.MenuItem(R.id.detail, R.string.dms_inbox_giphy));
 | 
				
			||||||
 | 
					                break;
 | 
				
			||||||
 | 
					            case VOICE_MEDIA:
 | 
				
			||||||
 | 
					                builder.add(new DirectItemContextMenu.MenuItem(R.id.detail, R.string.action_download));
 | 
				
			||||||
 | 
					                break;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
        final boolean showReactions = thread.getInputMode() != 1 && allowReaction();
 | 
					        final boolean showReactions = thread.getInputMode() != 1 && allowReaction();
 | 
				
			||||||
        final ImmutableList<DirectItemContextMenu.MenuItem> menuItems = builder.build();
 | 
					        final ImmutableList<DirectItemContextMenu.MenuItem> menuItems = builder.build();
 | 
				
			||||||
        if (!showReactions && menuItems.isEmpty()) return;
 | 
					        if (!showReactions && menuItems.isEmpty()) return;
 | 
				
			||||||
 | 
				
			|||||||
@ -30,6 +30,7 @@ import androidx.annotation.NonNull;
 | 
				
			|||||||
import androidx.annotation.Nullable;
 | 
					import androidx.annotation.Nullable;
 | 
				
			||||||
import androidx.appcompat.app.ActionBar;
 | 
					import androidx.appcompat.app.ActionBar;
 | 
				
			||||||
import androidx.constraintlayout.widget.ConstraintLayout;
 | 
					import androidx.constraintlayout.widget.ConstraintLayout;
 | 
				
			||||||
 | 
					import androidx.core.content.ContextCompat;
 | 
				
			||||||
import androidx.fragment.app.Fragment;
 | 
					import androidx.fragment.app.Fragment;
 | 
				
			||||||
import androidx.lifecycle.LiveData;
 | 
					import androidx.lifecycle.LiveData;
 | 
				
			||||||
import androidx.lifecycle.MediatorLiveData;
 | 
					import androidx.lifecycle.MediatorLiveData;
 | 
				
			||||||
@ -57,6 +58,7 @@ import java.io.File;
 | 
				
			|||||||
import java.util.ArrayList;
 | 
					import java.util.ArrayList;
 | 
				
			||||||
import java.util.List;
 | 
					import java.util.List;
 | 
				
			||||||
import java.util.Set;
 | 
					import java.util.Set;
 | 
				
			||||||
 | 
					import java.util.stream.Collectors;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import awais.instagrabber.ProfileNavGraphDirections;
 | 
					import awais.instagrabber.ProfileNavGraphDirections;
 | 
				
			||||||
import awais.instagrabber.R;
 | 
					import awais.instagrabber.R;
 | 
				
			||||||
@ -86,6 +88,7 @@ import awais.instagrabber.fragments.PostViewV2Fragment;
 | 
				
			|||||||
import awais.instagrabber.fragments.UserSearchFragment;
 | 
					import awais.instagrabber.fragments.UserSearchFragment;
 | 
				
			||||||
import awais.instagrabber.fragments.UserSearchFragmentDirections;
 | 
					import awais.instagrabber.fragments.UserSearchFragmentDirections;
 | 
				
			||||||
import awais.instagrabber.models.Resource;
 | 
					import awais.instagrabber.models.Resource;
 | 
				
			||||||
 | 
					import awais.instagrabber.models.enums.DirectItemType;
 | 
				
			||||||
import awais.instagrabber.models.enums.MediaItemType;
 | 
					import awais.instagrabber.models.enums.MediaItemType;
 | 
				
			||||||
import awais.instagrabber.repositories.requests.StoryViewerOptions;
 | 
					import awais.instagrabber.repositories.requests.StoryViewerOptions;
 | 
				
			||||||
import awais.instagrabber.repositories.responses.Media;
 | 
					import awais.instagrabber.repositories.responses.Media;
 | 
				
			||||||
@ -97,6 +100,7 @@ import awais.instagrabber.repositories.responses.directmessages.DirectItemVisual
 | 
				
			|||||||
import awais.instagrabber.repositories.responses.directmessages.DirectThread;
 | 
					import awais.instagrabber.repositories.responses.directmessages.DirectThread;
 | 
				
			||||||
import awais.instagrabber.repositories.responses.directmessages.RankedRecipient;
 | 
					import awais.instagrabber.repositories.responses.directmessages.RankedRecipient;
 | 
				
			||||||
import awais.instagrabber.utils.AppExecutors;
 | 
					import awais.instagrabber.utils.AppExecutors;
 | 
				
			||||||
 | 
					import awais.instagrabber.utils.DownloadUtils;
 | 
				
			||||||
import awais.instagrabber.utils.PermissionUtils;
 | 
					import awais.instagrabber.utils.PermissionUtils;
 | 
				
			||||||
import awais.instagrabber.utils.ResponseBodyUtils;
 | 
					import awais.instagrabber.utils.ResponseBodyUtils;
 | 
				
			||||||
import awais.instagrabber.utils.TextUtils;
 | 
					import awais.instagrabber.utils.TextUtils;
 | 
				
			||||||
@ -121,6 +125,7 @@ public class DirectMessageThreadFragment extends Fragment implements DirectReact
 | 
				
			|||||||
    private ConstraintLayout root;
 | 
					    private ConstraintLayout root;
 | 
				
			||||||
    private boolean shouldRefresh = true;
 | 
					    private boolean shouldRefresh = true;
 | 
				
			||||||
    private List<DirectItemOrHeader> itemOrHeaders;
 | 
					    private List<DirectItemOrHeader> itemOrHeaders;
 | 
				
			||||||
 | 
					    private List<User> users;
 | 
				
			||||||
    private FragmentDirectMessagesThreadBinding binding;
 | 
					    private FragmentDirectMessagesThreadBinding binding;
 | 
				
			||||||
    private Tooltip tooltip;
 | 
					    private Tooltip tooltip;
 | 
				
			||||||
    private float initialSendX;
 | 
					    private float initialSendX;
 | 
				
			||||||
@ -258,6 +263,19 @@ public class DirectMessageThreadFragment extends Fragment implements DirectReact
 | 
				
			|||||||
                final NavController navController = NavHostFragment.findNavController(DirectMessageThreadFragment.this);
 | 
					                final NavController navController = NavHostFragment.findNavController(DirectMessageThreadFragment.this);
 | 
				
			||||||
                navController.navigate(actionGlobalUserSearch);
 | 
					                navController.navigate(actionGlobalUserSearch);
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					            if (itemId == R.id.detail) {
 | 
				
			||||||
 | 
					                final Context context = getContext();
 | 
				
			||||||
 | 
					                if (context == null) return;
 | 
				
			||||||
 | 
					                final DirectItemType itemType = item.getItemType();
 | 
				
			||||||
 | 
					                switch (itemType) {
 | 
				
			||||||
 | 
					                    case ANIMATED_MEDIA:
 | 
				
			||||||
 | 
					                        Utils.openURL(context, "https://giphy.com/gifs/" + item.getAnimatedMedia().getId());
 | 
				
			||||||
 | 
					                        break;
 | 
				
			||||||
 | 
					                    case VOICE_MEDIA:
 | 
				
			||||||
 | 
					                        downloadItem(item.getVoiceMedia() == null ? null : item.getVoiceMedia().getMedia(), context);
 | 
				
			||||||
 | 
					                        break;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
    private final DirectItemLongClickListener directItemLongClickListener = position -> {
 | 
					    private final DirectItemLongClickListener directItemLongClickListener = position -> {
 | 
				
			||||||
@ -906,6 +924,7 @@ public class DirectMessageThreadFragment extends Fragment implements DirectReact
 | 
				
			|||||||
        itemsAdapter.setStateRestorationPolicy(RecyclerView.Adapter.StateRestorationPolicy.PREVENT_WHEN_EMPTY);
 | 
					        itemsAdapter.setStateRestorationPolicy(RecyclerView.Adapter.StateRestorationPolicy.PREVENT_WHEN_EMPTY);
 | 
				
			||||||
        binding.chats.setAdapter(itemsAdapter);
 | 
					        binding.chats.setAdapter(itemsAdapter);
 | 
				
			||||||
        registerDataObserver();
 | 
					        registerDataObserver();
 | 
				
			||||||
 | 
					        users = thread.getUsers();
 | 
				
			||||||
        final List<DirectItem> items = viewModel.getItems().getValue();
 | 
					        final List<DirectItem> items = viewModel.getItems().getValue();
 | 
				
			||||||
        if (items != null && itemsAdapter.getItems() != items) {
 | 
					        if (items != null && itemsAdapter.getItems() != items) {
 | 
				
			||||||
            submitItemsToAdapter(items);
 | 
					            submitItemsToAdapter(items);
 | 
				
			||||||
@ -1230,25 +1249,19 @@ public class DirectMessageThreadFragment extends Fragment implements DirectReact
 | 
				
			|||||||
        appExecutors.mainThread().execute(prevTitleRunnable, 1000);
 | 
					        appExecutors.mainThread().execute(prevTitleRunnable, 1000);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // private void downloadItem(final Context context) {
 | 
					    // currently ONLY for voice
 | 
				
			||||||
    //     final DirectUser user = getUser(directItemModel.getUserId());
 | 
					    private void downloadItem(final Media media, final Context context) {
 | 
				
			||||||
    //     final DirectItemMediaModel selectedItem = directItemModel.getItemType() == DirectItemType.MEDIA
 | 
					        if (media == null) {
 | 
				
			||||||
    //                                               ? (DirectItemMediaModel) directItemModel.getMediaModel()
 | 
					            Toast.makeText(context, R.string.downloader_unknown_error, Toast.LENGTH_SHORT).show();
 | 
				
			||||||
    //                                               : ((DirectItemRavenMediaModel) directItemModel.getMediaModel()).getMedia();
 | 
					        } else {
 | 
				
			||||||
    //     final String url = selectedItem.getMediaType() == MediaItemType.MEDIA_TYPE_VIDEO
 | 
					            if (ContextCompat.checkSelfPermission(context, DownloadUtils.PERMS[0]) == PackageManager.PERMISSION_GRANTED) {
 | 
				
			||||||
    //                        ? selectedItem.getVideoUrl()
 | 
					                DownloadUtils.download(context, media);
 | 
				
			||||||
    //                        : selectedItem.getThumbUrl();
 | 
					            } else {
 | 
				
			||||||
    //     if (url == null) {
 | 
					                requestPermissions(DownloadUtils.PERMS, STORAGE_PERM_REQUEST_CODE);
 | 
				
			||||||
    //         Toast.makeText(context, R.string.downloader_unknown_error, Toast.LENGTH_SHORT).show();
 | 
					            }
 | 
				
			||||||
    //     } else {
 | 
					            Toast.makeText(context, R.string.downloader_downloading_media, Toast.LENGTH_SHORT).show();
 | 
				
			||||||
    //         if (ContextCompat.checkSelfPermission(context, DownloadUtils.PERMS[0]) == PackageManager.PERMISSION_GRANTED) {
 | 
					        }
 | 
				
			||||||
    //             DownloadUtils.dmDownload(context, user != null ? user.getUsername() : "", selectedItem.getId(), url);
 | 
					    }
 | 
				
			||||||
    //         } else {
 | 
					 | 
				
			||||||
    //             requestPermissions(DownloadUtils.PERMS, STORAGE_PERM_REQUEST_CODE);
 | 
					 | 
				
			||||||
    //         }
 | 
					 | 
				
			||||||
    //         Toast.makeText(context, R.string.downloader_downloading_media, Toast.LENGTH_SHORT).show();
 | 
					 | 
				
			||||||
    //     }
 | 
					 | 
				
			||||||
    // }
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // private void sendText(final String text, final String itemId, final boolean delete) {
 | 
					    // private void sendText(final String text, final String itemId, final boolean delete) {
 | 
				
			||||||
    //     DirectThreadBroadcaster.TextBroadcastOptions textOptions = null;
 | 
					    //     DirectThreadBroadcaster.TextBroadcastOptions textOptions = null;
 | 
				
			||||||
@ -1339,14 +1352,14 @@ public class DirectMessageThreadFragment extends Fragment implements DirectReact
 | 
				
			|||||||
    //     broadcaster.execute(broadcastOptions);
 | 
					    //     broadcaster.execute(broadcastOptions);
 | 
				
			||||||
    // }
 | 
					    // }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // @NonNull
 | 
					    @NonNull
 | 
				
			||||||
    // private DirectUser getUser(final long userId) {
 | 
					    private User getUser(final long userId) {
 | 
				
			||||||
    //     for (final DirectUser user : users) {
 | 
					        for (final User user : users) {
 | 
				
			||||||
    //         if (userId != user.getPk()) continue;
 | 
					            if (userId != user.getPk()) continue;
 | 
				
			||||||
    //         return user;
 | 
					            return user;
 | 
				
			||||||
    //     }
 | 
					        }
 | 
				
			||||||
    //     return null;
 | 
					        return null;
 | 
				
			||||||
    // }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // private void searchUsername(final String text) {
 | 
					    // private void searchUsername(final String text) {
 | 
				
			||||||
    //     final Bundle bundle = new Bundle();
 | 
					    //     final Bundle bundle = new Bundle();
 | 
				
			||||||
 | 
				
			|||||||
@ -39,6 +39,7 @@ import java.util.regex.Pattern;
 | 
				
			|||||||
import awais.instagrabber.R;
 | 
					import awais.instagrabber.R;
 | 
				
			||||||
import awais.instagrabber.models.StoryModel;
 | 
					import awais.instagrabber.models.StoryModel;
 | 
				
			||||||
import awais.instagrabber.models.enums.MediaItemType;
 | 
					import awais.instagrabber.models.enums.MediaItemType;
 | 
				
			||||||
 | 
					import awais.instagrabber.repositories.responses.Audio;
 | 
				
			||||||
import awais.instagrabber.repositories.responses.Media;
 | 
					import awais.instagrabber.repositories.responses.Media;
 | 
				
			||||||
import awais.instagrabber.repositories.responses.User;
 | 
					import awais.instagrabber.repositories.responses.User;
 | 
				
			||||||
import awais.instagrabber.repositories.responses.VideoVersion;
 | 
					import awais.instagrabber.repositories.responses.VideoVersion;
 | 
				
			||||||
@ -89,17 +90,17 @@ public final class DownloadUtils {
 | 
				
			|||||||
        return dir;
 | 
					        return dir;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public static void dmDownload(@NonNull final Context context,
 | 
					//    public static void dmDownload(@NonNull final Context context,
 | 
				
			||||||
                                  @Nullable final String username,
 | 
					//                                  @Nullable final String username,
 | 
				
			||||||
                                  final String modelId,
 | 
					//                                  final String modelId,
 | 
				
			||||||
                                  final String url) {
 | 
					//                                  final String url) {
 | 
				
			||||||
        if (url == null) return;
 | 
					//        if (url == null) return;
 | 
				
			||||||
        if (ContextCompat.checkSelfPermission(context, PERMS[0]) == PackageManager.PERMISSION_GRANTED) {
 | 
					//        if (ContextCompat.checkSelfPermission(context, PERMS[0]) == PackageManager.PERMISSION_GRANTED) {
 | 
				
			||||||
            dmDownloadImpl(context, username, modelId, url);
 | 
					//            dmDownloadImpl(context, username, modelId, url);
 | 
				
			||||||
        } else if (context instanceof Activity) {
 | 
					//        } else if (context instanceof Activity) {
 | 
				
			||||||
            ActivityCompat.requestPermissions((Activity) context, PERMS, 8020);
 | 
					//            ActivityCompat.requestPermissions((Activity) context, PERMS, 8020);
 | 
				
			||||||
        }
 | 
					//        }
 | 
				
			||||||
    }
 | 
					//    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private static void dmDownloadImpl(@NonNull final Context context,
 | 
					    private static void dmDownloadImpl(@NonNull final Context context,
 | 
				
			||||||
                                       @Nullable final String username,
 | 
					                                       @Nullable final String username,
 | 
				
			||||||
@ -303,6 +304,17 @@ public final class DownloadUtils {
 | 
				
			|||||||
                    map.put(url, file.getAbsolutePath());
 | 
					                    map.put(url, file.getAbsolutePath());
 | 
				
			||||||
                    break;
 | 
					                    break;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					                case MEDIA_TYPE_VOICE: {
 | 
				
			||||||
 | 
					                    final String url = getUrlOfType(media);
 | 
				
			||||||
 | 
					                    String fileName = media.getId();
 | 
				
			||||||
 | 
					                    final User user = media.getUser();
 | 
				
			||||||
 | 
					                    if (user != null) {
 | 
				
			||||||
 | 
					                        fileName = user.getUsername() + "_" + fileName;
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                    final File file = getDownloadSaveFile(downloadDir, fileName, url);
 | 
				
			||||||
 | 
					                    map.put(url, file.getAbsolutePath());
 | 
				
			||||||
 | 
					                    break;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
                case MEDIA_TYPE_SLIDER:
 | 
					                case MEDIA_TYPE_SLIDER:
 | 
				
			||||||
                    final List<Media> sliderItems = media.getCarouselMedia();
 | 
					                    final List<Media> sliderItems = media.getCarouselMedia();
 | 
				
			||||||
                    for (int i = 0; i < sliderItems.size(); i++) {
 | 
					                    for (int i = 0; i < sliderItems.size(); i++) {
 | 
				
			||||||
@ -338,6 +350,14 @@ public final class DownloadUtils {
 | 
				
			|||||||
                }
 | 
					                }
 | 
				
			||||||
                return url;
 | 
					                return url;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					            case MEDIA_TYPE_VOICE: {
 | 
				
			||||||
 | 
					                final Audio audio = media.getAudio();
 | 
				
			||||||
 | 
					                String url = null;
 | 
				
			||||||
 | 
					                if (audio != null) {
 | 
				
			||||||
 | 
					                    url = audio.getAudioSrc();
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                return url;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        return null;
 | 
					        return null;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
				
			|||||||
@ -3,5 +3,6 @@
 | 
				
			|||||||
    <item name="reply" type="id" />
 | 
					    <item name="reply" type="id" />
 | 
				
			||||||
    <item name="unsend" type="id" />
 | 
					    <item name="unsend" type="id" />
 | 
				
			||||||
    <item name="forward" type="id" />
 | 
					    <item name="forward" type="id" />
 | 
				
			||||||
 | 
					    <item name="detail" type="id" />
 | 
				
			||||||
    <item name="pending_requests" type="id" />
 | 
					    <item name="pending_requests" type="id" />
 | 
				
			||||||
</resources>
 | 
					</resources>
 | 
				
			||||||
@ -180,6 +180,7 @@
 | 
				
			|||||||
    <string name="dms_inbox_unlike">Unlike message</string>
 | 
					    <string name="dms_inbox_unlike">Unlike message</string>
 | 
				
			||||||
    <string name="dms_inbox_unsend">Unsend message</string>
 | 
					    <string name="dms_inbox_unsend">Unsend message</string>
 | 
				
			||||||
    <string name="dms_inbox_author">View author profile</string>
 | 
					    <string name="dms_inbox_author">View author profile</string>
 | 
				
			||||||
 | 
					    <string name="dms_inbox_giphy">View on GIPHY</string>
 | 
				
			||||||
    <string name="dms_inbox_shared_post">%s shared a post by @%s</string>
 | 
					    <string name="dms_inbox_shared_post">%s shared a post by @%s</string>
 | 
				
			||||||
    <string name="dms_inbox_shared_image">%s shared an image</string>
 | 
					    <string name="dms_inbox_shared_image">%s shared an image</string>
 | 
				
			||||||
    <string name="dms_inbox_shared_video">%s shared a video</string>
 | 
					    <string name="dms_inbox_shared_video">%s shared a video</string>
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user