From 649115a66556cb99a277cc43d0fba899283e73ef Mon Sep 17 00:00:00 2001 From: Ammar Githam Date: Sun, 30 Aug 2020 21:51:47 +0900 Subject: [PATCH] Add Location fragment --- .../java/awais/instagrabber/MainHelper.java | 6 +- .../activities/CommentsViewer.java | 2 +- .../instagrabber/activities/MainActivity.java | 3 +- .../activities/NotificationsViewer.java | 2 +- .../instagrabber/activities/PostViewer.java | 4 +- .../activities/ProfileViewer.java | 2 +- .../viewholder/feed/FeedItemViewHolder.java | 14 +- .../customviews/RamboTextView.java | 2 +- .../fragments/LocationFragment.java | 341 ++++++++++++++++++ .../DirectMessageThreadFragment.java | 2 +- .../fragments/main/FeedFragment.java | 20 +- .../interfaces/MentionClickListener.java | 5 +- app/src/main/res/layout/fragment_location.xml | 131 +++++++ .../main/res/navigation/feed_nav_graph.xml | 13 + 14 files changed, 513 insertions(+), 34 deletions(-) create mode 100644 app/src/main/java/awais/instagrabber/fragments/LocationFragment.java create mode 100644 app/src/main/res/layout/fragment_location.xml diff --git a/app/src/main/java/awais/instagrabber/MainHelper.java b/app/src/main/java/awais/instagrabber/MainHelper.java index 41f2f08f..28c6a5b6 100755 --- a/app/src/main/java/awais/instagrabber/MainHelper.java +++ b/app/src/main/java/awais/instagrabber/MainHelper.java @@ -307,7 +307,7 @@ public final class MainHelper implements SwipeRefreshLayout.OnRefreshListener { }; private final MentionClickListener mentionClickListener = new MentionClickListener() { @Override - public void onClick(final RamboTextView view, final String text, final boolean isHashtag) { + public void onClick(final RamboTextView view, final String text, final boolean isHashtag, final boolean isLocation) { new AlertDialog.Builder(mainActivity).setMessage(isHashtag ? R.string.comment_view_mention_hash_search : R.string.comment_view_mention_user_search) .setTitle(text).setNegativeButton(R.string.cancel, null).setPositiveButton(R.string.ok, (dialog, which) -> { if (MainActivityBackup.scanHack != null) MainActivityBackup.scanHack.onResult(text); @@ -640,7 +640,7 @@ public final class MainHelper implements SwipeRefreshLayout.OnRefreshListener { case R.id.ivProfilePic: profileModel = feedModel.getProfileModel(); if (profileModel != null) - mentionClickListener.onClick(null, profileModel.getUsername(), false); + mentionClickListener.onClick(null, profileModel.getUsername(), false, false); break; } } @@ -655,7 +655,7 @@ public final class MainHelper implements SwipeRefreshLayout.OnRefreshListener { final LinearLayoutManager layoutManager = new LinearLayoutManager(mainActivity); mainActivity.mainBinding.feedView.feedPosts.setHasFixedSize(true); mainActivity.mainBinding.feedView.feedPosts.setLayoutManager(layoutManager); - mainActivity.mainBinding.feedView.feedPosts.setAdapter(feedAdapter = new FeedAdapter(clickListener, (view, text, isHashtag) -> + mainActivity.mainBinding.feedView.feedPosts.setAdapter(feedAdapter = new FeedAdapter(clickListener, (view, text, isHashtag, isLocation) -> new AlertDialog.Builder(mainActivity).setMessage(isHashtag ? R.string.comment_view_mention_hash_search : R.string.comment_view_mention_user_search) .setTitle(text).setNegativeButton(R.string.cancel, null).setPositiveButton(R.string.ok, (dialog, which) -> { if (MainActivityBackup.scanHack != null) { diff --git a/app/src/main/java/awais/instagrabber/activities/CommentsViewer.java b/app/src/main/java/awais/instagrabber/activities/CommentsViewer.java index 0a98cc01..c2f0ba6e 100755 --- a/app/src/main/java/awais/instagrabber/activities/CommentsViewer.java +++ b/app/src/main/java/awais/instagrabber/activities/CommentsViewer.java @@ -187,7 +187,7 @@ public final class CommentsViewer extends BaseLanguageActivity implements SwipeR } }; - private final MentionClickListener mentionClickListener = (view, text, isHashtag) -> + private final MentionClickListener mentionClickListener = (view, text, isHashtag, isLocation) -> new AlertDialog.Builder(this).setTitle(text) .setMessage(isHashtag ? R.string.comment_view_mention_hash_search : R.string.comment_view_mention_user_search) .setNegativeButton(R.string.cancel, null).setPositiveButton(R.string.ok, diff --git a/app/src/main/java/awais/instagrabber/activities/MainActivity.java b/app/src/main/java/awais/instagrabber/activities/MainActivity.java index 863cfacc..003feff8 100644 --- a/app/src/main/java/awais/instagrabber/activities/MainActivity.java +++ b/app/src/main/java/awais/instagrabber/activities/MainActivity.java @@ -44,7 +44,8 @@ public class MainActivity extends BaseLanguageActivity { R.id.discoverFragment, R.id.morePreferencesFragment, R.id.settingsPreferencesFragment, - R.id.hashTagFragment); + R.id.hashTagFragment, + R.id.locationFragment); private ActivityMainBinding binding; private LiveData currentNavControllerLiveData; diff --git a/app/src/main/java/awais/instagrabber/activities/NotificationsViewer.java b/app/src/main/java/awais/instagrabber/activities/NotificationsViewer.java index 4bb0cb2a..6fc474cc 100755 --- a/app/src/main/java/awais/instagrabber/activities/NotificationsViewer.java +++ b/app/src/main/java/awais/instagrabber/activities/NotificationsViewer.java @@ -114,7 +114,7 @@ public final class NotificationsViewer extends BaseLanguageActivity implements S } }; - private final MentionClickListener mentionClickListener = (view, text, isHashtag) -> + private final MentionClickListener mentionClickListener = (view, text, isHashtag, isLocation) -> new AlertDialog.Builder(this).setTitle(text) .setMessage(isHashtag ? R.string.comment_view_mention_hash_search : R.string.comment_view_mention_user_search) .setNegativeButton(R.string.cancel, null).setPositiveButton(R.string.ok, diff --git a/app/src/main/java/awais/instagrabber/activities/PostViewer.java b/app/src/main/java/awais/instagrabber/activities/PostViewer.java index 2a7297b3..6e67bf71 100755 --- a/app/src/main/java/awais/instagrabber/activities/PostViewer.java +++ b/app/src/main/java/awais/instagrabber/activities/PostViewer.java @@ -276,7 +276,7 @@ public final class PostViewer extends BaseLanguageActivity { resources = getResources(); viewerBinding.topPanel.title.setMovementMethod(new LinkMovementMethod()); - viewerBinding.topPanel.title.setMentionClickListener((view, text, isHashtag) -> searchUsername(text)); + viewerBinding.topPanel.title.setMentionClickListener((view, text, isHashtag, isLocation) -> searchUsername(text)); viewerBinding.topPanel.ivProfilePic.setOnClickListener(onClickListener); viewerBinding.ivToggleFullScreen.setOnClickListener(onClickListener); @@ -578,7 +578,7 @@ public final class PostViewer extends BaseLanguageActivity { if (Utils.hasMentions(postCaption)) { viewerBinding.bottomPanel.viewerCaption.setText(Utils.getMentionText(postCaption), TextView.BufferType.SPANNABLE); - viewerBinding.bottomPanel.viewerCaption.setMentionClickListener((view, text, isHashtag) -> searchUsername(text)); + viewerBinding.bottomPanel.viewerCaption.setMentionClickListener((view, text, isHashtag, isLocation) -> searchUsername(text)); } else { viewerBinding.bottomPanel.viewerCaption.setMentionClickListener(null); viewerBinding.bottomPanel.viewerCaption.setText(postCaption); diff --git a/app/src/main/java/awais/instagrabber/activities/ProfileViewer.java b/app/src/main/java/awais/instagrabber/activities/ProfileViewer.java index 2ed18177..c8f8a3de 100755 --- a/app/src/main/java/awais/instagrabber/activities/ProfileViewer.java +++ b/app/src/main/java/awais/instagrabber/activities/ProfileViewer.java @@ -127,7 +127,7 @@ public final class ProfileViewer extends BaseLanguageActivity implements SwipeRe }; private final MentionClickListener mentionClickListener = new MentionClickListener() { @Override - public void onClick(final RamboTextView view, final String text, final boolean isHashtag) { + public void onClick(final RamboTextView view, final String text, final boolean isHashtag, final boolean isLocation) { startActivity(new Intent(getApplicationContext(), ProfileViewer.class).putExtra(Constants.EXTRAS_USERNAME, text)); } }; 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 b4b842e4..ea608ba9 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 @@ -8,12 +8,10 @@ import android.widget.RelativeLayout; import android.widget.TextView; import androidx.annotation.NonNull; -import androidx.appcompat.app.AlertDialog; import androidx.recyclerview.widget.RecyclerView; import org.json.JSONObject; -import awais.instagrabber.R; import awais.instagrabber.customviews.CommentMentionClickSpan; import awais.instagrabber.customviews.RamboTextView; import awais.instagrabber.databinding.ItemFeedBottomBinding; @@ -65,7 +63,7 @@ public abstract class FeedItemViewHolder extends RecyclerView.ViewHolder { final SpannableString spannableString = new SpannableString("@" + profileModel.getUsername()); spannableString.setSpan(new CommentMentionClickSpan(), 0, titleLen, 0); topBinding.title.setText(spannableString); - topBinding.title.setMentionClickListener((view, text, isHashtag) -> mentionClickListener.onClick(null, profileModel.getUsername(), false)); + topBinding.title.setMentionClickListener((view, text, isHashtag, isLocation) -> mentionClickListener.onClick(null, profileModel.getUsername(), false, false)); } bottomBinding.tvPostDate.setText(feedModel.getPostDate()); final long commentsCount = feedModel.getCommentsCount(); @@ -101,12 +99,10 @@ 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 -> { - new AlertDialog.Builder(v.getContext()).setTitle(location.optString("name")) - .setMessage(R.string.comment_view_mention_location_search) - .setNegativeButton(R.string.cancel, null).setPositiveButton(R.string.ok, - (dialog, which) -> mentionClickListener.onClick(null, location.optString("id") + "/" + location.optString("slug"), false)).show(); - }); + topBinding.location.setOnClickListener(v -> mentionClickListener.onClick(topBinding.location, + location.optString("id") + "/" + location.optString("slug"), + false, + true)); } } diff --git a/app/src/main/java/awais/instagrabber/customviews/RamboTextView.java b/app/src/main/java/awais/instagrabber/customviews/RamboTextView.java index ac8b2c9b..08c5df20 100755 --- a/app/src/main/java/awais/instagrabber/customviews/RamboTextView.java +++ b/app/src/main/java/awais/instagrabber/customviews/RamboTextView.java @@ -121,7 +121,7 @@ public final class RamboTextView extends AppCompatTextView { if (indexOfEllipsize != -1) subSequence = subSequence.subSequence(0, indexOfEllipsize - 1); - mentionClickListener.onClick(this, subSequence.toString(), ishHashtag); + mentionClickListener.onClick(this, subSequence.toString(), ishHashtag, false); } } diff --git a/app/src/main/java/awais/instagrabber/fragments/LocationFragment.java b/app/src/main/java/awais/instagrabber/fragments/LocationFragment.java new file mode 100644 index 00000000..4c682c1c --- /dev/null +++ b/app/src/main/java/awais/instagrabber/fragments/LocationFragment.java @@ -0,0 +1,341 @@ +package awais.instagrabber.fragments; + +import android.content.Intent; +import android.graphics.Typeface; +import android.net.Uri; +import android.os.AsyncTask; +import android.os.Bundle; +import android.text.SpannableStringBuilder; +import android.text.style.RelativeSizeSpan; +import android.text.style.StyleSpan; +import android.util.Log; +import android.view.ActionMode; +import android.view.LayoutInflater; +import android.view.MenuItem; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; +import android.widget.Toast; + +import androidx.activity.OnBackPressedCallback; +import androidx.activity.OnBackPressedDispatcher; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.appcompat.app.ActionBar; +import androidx.fragment.app.Fragment; +import androidx.lifecycle.ViewModelProvider; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +import awais.instagrabber.R; +import awais.instagrabber.activities.MainActivity; +import awais.instagrabber.activities.PostViewer; +import awais.instagrabber.adapters.PostsAdapter; +import awais.instagrabber.asyncs.LocationFetcher; +import awais.instagrabber.asyncs.PostsFetcher; +import awais.instagrabber.asyncs.i.iStoryStatusFetcher; +import awais.instagrabber.customviews.PrimaryActionModeCallback; +import awais.instagrabber.customviews.helpers.GridAutofitLayoutManager; +import awais.instagrabber.customviews.helpers.GridSpacingItemDecoration; +import awais.instagrabber.customviews.helpers.NestedCoordinatorLayout; +import awais.instagrabber.customviews.helpers.RecyclerLazyLoader; +import awais.instagrabber.databinding.FragmentLocationBinding; +import awais.instagrabber.fragments.main.viewmodels.PostsViewModel; +import awais.instagrabber.interfaces.FetchListener; +import awais.instagrabber.models.LocationModel; +import awais.instagrabber.models.PostModel; +import awais.instagrabber.models.StoryModel; +import awais.instagrabber.models.enums.DownloadMethod; +import awais.instagrabber.models.enums.ItemGetType; +import awais.instagrabber.utils.Constants; +import awais.instagrabber.utils.Utils; +import awaisomereport.LogCollector; + +import static awais.instagrabber.utils.Utils.logCollector; +import static awais.instagrabber.utils.Utils.settingsHelper; + +public class LocationFragment extends Fragment { + private static final String TAG = "LocationFragment"; + + private MainActivity fragmentActivity; + private FragmentLocationBinding binding; + private NestedCoordinatorLayout root; + private boolean shouldRefresh = true; + private String location; + private LocationModel locationModel; + private PostsViewModel postsViewModel; + private PostsAdapter postsAdapter; + private ActionMode actionMode; + private boolean hasNextPage; + private String endCursor; + private AsyncTask currentlyExecuting; + private boolean isLoggedIn; + private StoryModel[] storyModels; + + private final OnBackPressedCallback onBackPressedCallback = new OnBackPressedCallback(false) { + @Override + public void handleOnBackPressed() { + if (postsAdapter == null) { + setEnabled(false); + remove(); + return; + } + postsAdapter.clearSelection(); + setEnabled(false); + remove(); + } + }; + private final PrimaryActionModeCallback multiSelectAction = new PrimaryActionModeCallback( + R.menu.multi_select_download_menu, + new PrimaryActionModeCallback.CallbacksHelper() { + @Override + public void onDestroy(final ActionMode mode) { + onBackPressedCallback.handleOnBackPressed(); + } + + @Override + public boolean onActionItemClicked(final ActionMode mode, final MenuItem item) { + if (item.getItemId() == R.id.action_download) { + if (postsAdapter == null || location == null) { + return false; + } + Utils.batchDownload(requireContext(), + location, + DownloadMethod.DOWNLOAD_MAIN, + postsAdapter.getSelectedModels()); + checkAndResetAction(); + return true; + } + return false; + } + }); + private final FetchListener postsFetchListener = new FetchListener() { + @Override + public void onResult(final PostModel[] result) { + binding.swipeRefreshLayout.setRefreshing(false); + if (result == null) return; + binding.mainPosts.post(() -> binding.mainPosts.setVisibility(View.VISIBLE)); + final List postModels = postsViewModel.getList().getValue(); + final List finalList = postModels == null || postModels.isEmpty() ? new ArrayList<>() : new ArrayList<>(postModels); + finalList.addAll(Arrays.asList(result)); + postsViewModel.getList().postValue(finalList); + PostModel model = null; + if (result.length != 0) { + model = result[result.length - 1]; + } + if (model == null) return; + endCursor = model.getEndCursor(); + hasNextPage = model.hasNextPage(); + model.setPageCursor(false, null); + } + }; + + @Override + public void onCreate(@Nullable final Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + fragmentActivity = (MainActivity) requireActivity(); + } + + @Nullable + @Override + public View onCreateView(@NonNull final LayoutInflater inflater, @Nullable final ViewGroup container, @Nullable final Bundle savedInstanceState) { + if (root != null) { + shouldRefresh = false; + return root; + } + binding = FragmentLocationBinding.inflate(inflater, container, false); + root = binding.getRoot(); + return root; + } + + @Override + public void onViewCreated(@NonNull final View view, @Nullable final Bundle savedInstanceState) { + if (!shouldRefresh) return; + init(); + shouldRefresh = false; + } + + @Override + public void onDestroy() { + super.onDestroy(); + if (postsViewModel != null) { + postsViewModel.getList().postValue(Collections.emptyList()); + } + } + + private void init() { + if (getArguments() == null) return; + final String cookie = settingsHelper.getString(Constants.COOKIE); + isLoggedIn = !Utils.isEmpty(cookie) && Utils.getUserIdFromCookie(cookie) != null; + final LocationFragmentArgs fragmentArgs = LocationFragmentArgs.fromBundle(getArguments()); + location = fragmentArgs.getLocation(); + setTitle(); + setupPosts(); + fetchLocationModel(); + } + + private void setupPosts() { + postsViewModel = new ViewModelProvider(this).get(PostsViewModel.class); + final GridAutofitLayoutManager layoutManager = new GridAutofitLayoutManager(requireContext(), Utils.convertDpToPx(110)); + binding.mainPosts.setLayoutManager(layoutManager); + binding.mainPosts.addItemDecoration(new GridSpacingItemDecoration(Utils.convertDpToPx(4))); + postsAdapter = new PostsAdapter((postModel, position) -> { + if (postsAdapter.isSelecting()) { + if (actionMode == null) return; + final String title = getString(R.string.number_selected, postsAdapter.getSelectedModels().size()); + actionMode.setTitle(title); + return; + } + if (checkAndResetAction()) return; + startActivity(new Intent(requireContext(), PostViewer.class) + .putExtra(Constants.EXTRAS_INDEX, position) + .putExtra(Constants.EXTRAS_POST, postModel) + .putExtra(Constants.EXTRAS_USER, location) + .putExtra(Constants.EXTRAS_TYPE, ItemGetType.MAIN_ITEMS)); + + }, (model, position) -> { + if (!postsAdapter.isSelecting()) { + checkAndResetAction(); + return true; + } + if (onBackPressedCallback.isEnabled()) { + return true; + } + final OnBackPressedDispatcher onBackPressedDispatcher = fragmentActivity.getOnBackPressedDispatcher(); + onBackPressedCallback.setEnabled(true); + actionMode = fragmentActivity.startActionMode(multiSelectAction); + final String title = getString(R.string.number_selected, 1); + actionMode.setTitle(title); + onBackPressedDispatcher.addCallback(getViewLifecycleOwner(), onBackPressedCallback); + return true; + }); + postsViewModel.getList().observe(fragmentActivity, postsAdapter::submitList); + binding.mainPosts.setAdapter(postsAdapter); + final RecyclerLazyLoader lazyLoader = new RecyclerLazyLoader(layoutManager, (page, totalItemsCount) -> { + if (!hasNextPage) return; + binding.swipeRefreshLayout.setRefreshing(true); + fetchPosts(); + endCursor = null; + }); + binding.mainPosts.addOnScrollListener(lazyLoader); + } + + private void fetchLocationModel() { + stopCurrentExecutor(); + binding.swipeRefreshLayout.setRefreshing(true); + currentlyExecuting = new LocationFetcher(location.split("/")[0], result -> { + locationModel = result; + binding.swipeRefreshLayout.setRefreshing(false); + if (locationModel == null) { + Toast.makeText(requireContext(), R.string.error_loading_profile, Toast.LENGTH_SHORT).show(); + return; + } + setTitle(); + setupLocationDetails(); + fetchPosts(); + }).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); + } + + private void setupLocationDetails() { + final String locationId = locationModel.getId(); + binding.swipeRefreshLayout.setRefreshing(true); + if (isLoggedIn) { + new iStoryStatusFetcher(locationId.split("/")[0], null, true, false, false, false, stories -> { + storyModels = stories; + if (stories != null && stories.length > 0) { + binding.mainLocationImage.setStoriesBorder(); + } + }).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); + } + binding.mainLocationImage.setImageURI(locationModel.getSdProfilePic()); + final String postCount = String.valueOf(locationModel.getPostCount()); + final SpannableStringBuilder span = new SpannableStringBuilder(getString(R.string.main_posts_count, postCount)); + span.setSpan(new RelativeSizeSpan(1.2f), 0, postCount.length(), 0); + span.setSpan(new StyleSpan(Typeface.BOLD), 0, postCount.length(), 0); + binding.mainLocPostCount.setText(span); + binding.mainLocPostCount.setVisibility(View.VISIBLE); + binding.locationFullName.setText(locationModel.getName()); + CharSequence biography = locationModel.getBio(); + binding.locationBiography.setCaptionIsExpandable(true); + binding.locationBiography.setCaptionIsExpanded(true); + + if (Utils.isEmpty(biography)) { + binding.locationBiography.setVisibility(View.GONE); + } else if (Utils.hasMentions(biography)) { + binding.locationBiography.setVisibility(View.VISIBLE); + biography = Utils.getMentionText(biography); + binding.locationBiography.setText(biography, TextView.BufferType.SPANNABLE); + // binding.locationBiography.setMentionClickListener(mentionClickListener); + } else { + binding.locationBiography.setVisibility(View.VISIBLE); + binding.locationBiography.setText(biography); + binding.locationBiography.setMentionClickListener(null); + } + + if (!locationModel.getGeo().startsWith("geo:0.0,0.0?z=17")) { + binding.btnMap.setVisibility(View.VISIBLE); + binding.btnMap.setOnClickListener(v -> { + final Intent intent = new Intent(Intent.ACTION_VIEW); + intent.setData(Uri.parse(locationModel.getGeo())); + startActivity(intent); + }); + } else { + binding.btnMap.setVisibility(View.GONE); + binding.btnMap.setOnClickListener(null); + } + + final String url = locationModel.getUrl(); + if (Utils.isEmpty(url)) { + binding.locationUrl.setVisibility(View.GONE); + } else if (!url.startsWith("http")) { + binding.locationUrl.setVisibility(View.VISIBLE); + binding.locationUrl.setText(Utils.getSpannableUrl("http://" + url)); + } else { + binding.locationUrl.setVisibility(View.VISIBLE); + binding.locationUrl.setText(Utils.getSpannableUrl(url)); + } + } + + private void fetchPosts() { + stopCurrentExecutor(); + currentlyExecuting = new PostsFetcher(locationModel.getId(), endCursor, postsFetchListener) + .executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); + } + + public void stopCurrentExecutor() { + if (currentlyExecuting != null) { + try { + currentlyExecuting.cancel(true); + } catch (final Exception e) { + if (logCollector != null) + logCollector.appendException(e, LogCollector.LogFile.MAIN_HELPER, "stopCurrentExecutor"); + Log.e(TAG, "", e); + } + } + } + + private void setTitle() { + final ActionBar actionBar = fragmentActivity.getSupportActionBar(); + if (actionBar != null && locationModel != null) { + actionBar.setTitle(locationModel.getName()); + } + } + + private boolean checkAndResetAction() { + if (!onBackPressedCallback.isEnabled() && actionMode == null) { + return false; + } + if (onBackPressedCallback.isEnabled()) { + onBackPressedCallback.setEnabled(false); + onBackPressedCallback.remove(); + } + if (actionMode != null) { + actionMode.finish(); + actionMode = null; + } + return true; + } +} 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 5ca4531e..63d0b1bd 100644 --- a/app/src/main/java/awais/instagrabber/fragments/directmessages/DirectMessageThreadFragment.java +++ b/app/src/main/java/awais/instagrabber/fragments/directmessages/DirectMessageThreadFragment.java @@ -314,7 +314,7 @@ public class DirectMessageThreadFragment extends Fragment { .show(); } }; - final MentionClickListener mentionClickListener = (view, text, isHashtag) -> searchUsername(text); + final MentionClickListener mentionClickListener = (view, text, isHashtag, isLocation) -> searchUsername(text); final DirectMessageItemsAdapter adapter = new DirectMessageItemsAdapter(users, leftUsers, onClickListener, mentionClickListener); messageList.setAdapter(adapter); listViewModel.getList().observe(fragmentActivity, adapter::submitList); 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 f33f7a06..66b86222 100644 --- a/app/src/main/java/awais/instagrabber/fragments/main/FeedFragment.java +++ b/app/src/main/java/awais/instagrabber/fragments/main/FeedFragment.java @@ -198,23 +198,17 @@ public class FeedFragment extends Fragment { } } - final MentionClickListener mentionClickListener = (view, text, isHashtag) -> { - // final AlertDialog.Builder builder = new AlertDialog.Builder(requireContext()) - // .setMessage(isHashtag ? R.string.comment_view_mention_hash_search : R.string.comment_view_mention_user_search) - // .setTitle(text) - // .setNegativeButton(R.string.cancel, null) - // .setPositiveButton(R.string.ok, (dialog, which) -> { - // // if (MainActivityBackup.scanHack != null) { - // // mainActivity.mainBinding.drawerLayout.closeDrawers(); - // // MainActivityBackup.scanHack.onResult(text); - // // } - // }); - // builder.show(); + final MentionClickListener mentionClickListener = (view, text, isHashtag, isLocation) -> { if (isHashtag) { final NavDirections action = FeedFragmentDirections.actionFeedFragmentToHashTagFragment(text); NavHostFragment.findNavController(this).navigate(action); return; } + if (isLocation) { + final NavDirections action = FeedFragmentDirections.actionFeedFragmentToLocationFragment(text); + NavHostFragment.findNavController(this).navigate(action); + return; + } final NavDirections action = FeedFragmentDirections.actionFeedFragmentToProfileFragment("@" + text); NavHostFragment.findNavController(this).navigate(action); }; @@ -294,7 +288,7 @@ public class FeedFragment extends Fragment { case R.id.ivProfilePic: profileModel = feedModel.getProfileModel(); if (profileModel != null) - mentionClickListener.onClick(null, profileModel.getUsername(), false); + mentionClickListener.onClick(null, profileModel.getUsername(), false, false); break; } }; diff --git a/app/src/main/java/awais/instagrabber/interfaces/MentionClickListener.java b/app/src/main/java/awais/instagrabber/interfaces/MentionClickListener.java index d8d0a347..09560dfc 100755 --- a/app/src/main/java/awais/instagrabber/interfaces/MentionClickListener.java +++ b/app/src/main/java/awais/instagrabber/interfaces/MentionClickListener.java @@ -3,5 +3,8 @@ package awais.instagrabber.interfaces; import awais.instagrabber.customviews.RamboTextView; public interface MentionClickListener { - void onClick(final RamboTextView view, final String text, final boolean isHashtag); + void onClick(final RamboTextView view, + final String text, + final boolean isHashtag, + final boolean isLocation); } \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_location.xml b/app/src/main/res/layout/fragment_location.xml new file mode 100644 index 00000000..fc097a9a --- /dev/null +++ b/app/src/main/res/layout/fragment_location.xml @@ -0,0 +1,131 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/navigation/feed_nav_graph.xml b/app/src/main/res/navigation/feed_nav_graph.xml index 89fc12f7..341d424b 100644 --- a/app/src/main/res/navigation/feed_nav_graph.xml +++ b/app/src/main/res/navigation/feed_nav_graph.xml @@ -19,6 +19,9 @@ + + + + \ No newline at end of file