barinsta/app/src/main/java/awais/instagrabber/fragments/HashTagFragment.java

623 lines
28 KiB
Java
Raw Normal View History

2020-08-30 13:45:37 +02:00
package awais.instagrabber.fragments;
import android.content.Context;
import android.content.pm.PackageManager;
2020-08-30 13:45:37 +02:00
import android.graphics.Typeface;
import android.os.Bundle;
2020-11-01 12:34:42 +01:00
import android.os.Handler;
2020-08-30 13:45:37 +02:00
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;
2020-11-01 12:34:42 +01:00
import android.view.Menu;
import android.view.MenuInflater;
2020-08-30 13:45:37 +02:00
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;
import androidx.activity.OnBackPressedCallback;
import androidx.activity.OnBackPressedDispatcher;
2020-08-30 13:45:37 +02:00
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.ActionBar;
import androidx.coordinatorlayout.widget.CoordinatorLayout;
2020-11-01 12:34:42 +01:00
import androidx.core.content.PermissionChecker;
2020-08-30 13:45:37 +02:00
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
2020-11-01 12:34:42 +01:00
import androidx.navigation.NavController;
import androidx.navigation.NavDirections;
import androidx.navigation.fragment.NavHostFragment;
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
import com.google.android.material.snackbar.BaseTransientBottomBar;
import com.google.android.material.snackbar.Snackbar;
import com.google.common.collect.ImmutableList;
2020-08-30 13:45:37 +02:00
import java.util.Date;
2020-08-30 13:45:37 +02:00
import java.util.List;
import java.util.Set;
2020-08-30 13:45:37 +02:00
import awais.instagrabber.R;
import awais.instagrabber.activities.MainActivity;
2020-11-01 12:34:42 +01:00
import awais.instagrabber.adapters.FeedAdapterV2;
import awais.instagrabber.asyncs.HashtagPostFetchService;
import awais.instagrabber.asyncs.PostFetcher;
2020-08-30 13:45:37 +02:00
import awais.instagrabber.customviews.PrimaryActionModeCallback;
import awais.instagrabber.databinding.FragmentHashtagBinding;
import awais.instagrabber.databinding.LayoutHashtagDetailsBinding;
2020-12-07 11:47:03 +01:00
import awais.instagrabber.db.datasources.FavoriteDataSource;
import awais.instagrabber.db.entities.Favorite;
import awais.instagrabber.db.repositories.FavoriteRepository;
import awais.instagrabber.db.repositories.RepositoryCallback;
2020-11-01 12:34:42 +01:00
import awais.instagrabber.dialogs.PostsLayoutPreferencesDialogFragment;
import awais.instagrabber.models.PostsLayoutPreferences;
2020-09-26 02:15:46 +02:00
import awais.instagrabber.models.StoryModel;
import awais.instagrabber.models.enums.FavoriteType;
2021-03-20 18:37:17 +01:00
import awais.instagrabber.models.enums.FollowingType;
import awais.instagrabber.repositories.requests.StoryViewerOptions;
2021-03-20 18:37:17 +01:00
import awais.instagrabber.repositories.responses.Hashtag;
import awais.instagrabber.repositories.responses.Location;
import awais.instagrabber.repositories.responses.Media;
import awais.instagrabber.repositories.responses.User;
2020-08-30 13:45:37 +02:00
import awais.instagrabber.utils.Constants;
import awais.instagrabber.utils.CookieUtils;
import awais.instagrabber.utils.DownloadUtils;
import awais.instagrabber.utils.TextUtils;
2020-08-30 13:45:37 +02:00
import awais.instagrabber.utils.Utils;
2021-03-20 18:37:17 +01:00
import awais.instagrabber.webservices.GraphQLService;
import awais.instagrabber.webservices.ServiceCallback;
2020-09-26 02:15:46 +02:00
import awais.instagrabber.webservices.StoriesService;
import awais.instagrabber.webservices.TagsService;
2020-08-30 13:45:37 +02:00
2020-11-01 12:34:42 +01:00
import static androidx.core.content.PermissionChecker.checkSelfPermission;
import static awais.instagrabber.utils.DownloadUtils.WRITE_PERMISSION;
2020-08-30 13:45:37 +02:00
import static awais.instagrabber.utils.Utils.settingsHelper;
2021-03-20 18:37:17 +01:00
//import awaisomereport.LogCollector;
//import static awais.instagrabber.utils.Utils.logCollector;
public class HashTagFragment extends Fragment implements SwipeRefreshLayout.OnRefreshListener {
2020-08-30 13:45:37 +02:00
private static final String TAG = "HashTagFragment";
2020-11-01 12:34:42 +01:00
private static final int STORAGE_PERM_REQUEST_CODE = 8020;
private static final int STORAGE_PERM_REQUEST_CODE_FOR_SELECTION = 8030;
2020-08-30 13:45:37 +02:00
public static final String ARG_HASHTAG = "hashtag";
2020-08-30 13:45:37 +02:00
private MainActivity fragmentActivity;
private FragmentHashtagBinding binding;
private CoordinatorLayout root;
2020-11-01 12:34:42 +01:00
private boolean shouldRefresh = true;
private boolean hasStories = false;
private boolean opening = false;
2020-08-30 13:45:37 +02:00
private String hashtag;
2021-03-20 18:37:17 +01:00
private Hashtag hashtagModel = null;
2020-08-30 13:45:37 +02:00
private ActionMode actionMode;
2020-09-26 02:15:46 +02:00
private StoriesService storiesService;
2020-08-30 13:45:37 +02:00
private boolean isLoggedIn;
private TagsService tagsService;
2021-03-20 18:37:17 +01:00
private GraphQLService graphQLService;
2020-11-01 12:34:42 +01:00
private boolean storiesFetching;
private Set<Media> selectedFeedModels;
private Media downloadFeedModel;
2020-11-03 11:01:59 +01:00
private int downloadChildPosition = -1;
private PostsLayoutPreferences layoutPreferences = Utils.getPostsLayoutPreferences(Constants.PREF_HASHTAG_POSTS_LAYOUT);
private LayoutHashtagDetailsBinding hashtagDetailsBinding;
2020-08-30 13:45:37 +02:00
private final OnBackPressedCallback onBackPressedCallback = new OnBackPressedCallback(false) {
@Override
public void handleOnBackPressed() {
binding.posts.endSelection();
2020-08-30 13:45:37 +02:00
}
};
private final PrimaryActionModeCallback multiSelectAction = new PrimaryActionModeCallback(
R.menu.multi_select_download_menu,
new PrimaryActionModeCallback.CallbacksHelper() {
@Override
public void onDestroy(final ActionMode mode) {
binding.posts.endSelection();
2020-08-30 13:45:37 +02:00
}
@Override
public boolean onActionItemClicked(final ActionMode mode, final MenuItem item) {
if (item.getItemId() == R.id.action_download) {
if (HashTagFragment.this.selectedFeedModels == null) return false;
final Context context = getContext();
if (context == null) return false;
if (checkSelfPermission(context, WRITE_PERMISSION) == PermissionChecker.PERMISSION_GRANTED) {
DownloadUtils.download(context, ImmutableList.copyOf(HashTagFragment.this.selectedFeedModels));
binding.posts.endSelection();
return true;
}
requestPermissions(DownloadUtils.PERMS, STORAGE_PERM_REQUEST_CODE_FOR_SELECTION);
2020-08-30 13:45:37 +02:00
return true;
}
return false;
}
});
2020-11-01 12:34:42 +01:00
private final FeedAdapterV2.FeedItemCallback feedItemCallback = new FeedAdapterV2.FeedItemCallback() {
2020-08-30 13:45:37 +02:00
@Override
public void onPostClick(final Media feedModel, final View profilePicView, final View mainPostImage) {
2020-11-01 12:34:42 +01:00
openPostDialog(feedModel, profilePicView, mainPostImage, -1);
}
@Override
public void onSliderClick(final Media feedModel, final int position) {
2020-11-01 12:34:42 +01:00
openPostDialog(feedModel, null, null, position);
}
@Override
public void onCommentsClick(final Media feedModel) {
2020-11-01 12:34:42 +01:00
final NavDirections commentsAction = HashTagFragmentDirections.actionGlobalCommentsViewerFragment(
feedModel.getCode(),
feedModel.getCode(),
feedModel.getUser().getPk()
2020-11-01 12:34:42 +01:00
);
NavHostFragment.findNavController(HashTagFragment.this).navigate(commentsAction);
}
@Override
public void onDownloadClick(final Media feedModel, final int childPosition) {
2020-11-01 12:34:42 +01:00
final Context context = getContext();
if (context == null) return;
if (checkSelfPermission(context, WRITE_PERMISSION) == PermissionChecker.PERMISSION_GRANTED) {
2020-11-03 11:01:59 +01:00
DownloadUtils.showDownloadDialog(context, feedModel, childPosition);
2020-11-01 12:34:42 +01:00
return;
}
downloadFeedModel = feedModel;
2020-11-03 11:01:59 +01:00
downloadChildPosition = childPosition;
2020-11-01 12:34:42 +01:00
requestPermissions(DownloadUtils.PERMS, STORAGE_PERM_REQUEST_CODE);
}
@Override
public void onHashtagClick(final String hashtag) {
2020-11-01 13:56:04 +01:00
final NavDirections action = HashTagFragmentDirections.actionGlobalHashTagFragment(hashtag);
2020-11-01 12:34:42 +01:00
NavHostFragment.findNavController(HashTagFragment.this).navigate(action);
}
@Override
public void onLocationClick(final Media media) {
final Location location = media.getLocation();
if (location == null) return;
final NavDirections action = HashTagFragmentDirections.actionGlobalLocationFragment(location.getPk());
2020-11-01 12:34:42 +01:00
NavHostFragment.findNavController(HashTagFragment.this).navigate(action);
}
@Override
public void onMentionClick(final String mention) {
navigateToProfile(mention.trim());
}
@Override
public void onNameClick(final Media feedModel, final View profilePicView) {
navigateToProfile("@" + feedModel.getUser().getUsername());
2020-11-01 12:34:42 +01:00
}
@Override
public void onProfilePicClick(final Media feedModel, final View profilePicView) {
navigateToProfile("@" + feedModel.getUser().getUsername());
2020-11-01 12:34:42 +01:00
}
@Override
public void onURLClick(final String url) {
Utils.openURL(getContext(), url);
}
@Override
public void onEmailClick(final String emailId) {
Utils.openEmailAddress(getContext(), emailId);
}
private void openPostDialog(@NonNull final Media feedModel,
2020-11-01 12:34:42 +01:00
final View profilePicView,
final View mainPostImage,
final int position) {
if (opening) return;
final User user = feedModel.getUser();
if (user == null) return;
if (TextUtils.isEmpty(user.getUsername())) {
opening = true;
new PostFetcher(feedModel.getCode(), newFeedModel -> {
2020-11-15 07:01:02 +01:00
opening = false;
if (newFeedModel == null) return;
2020-11-15 07:01:02 +01:00
openPostDialog(newFeedModel, profilePicView, mainPostImage, position);
}).execute();
return;
}
opening = true;
final PostViewV2Fragment.Builder builder = PostViewV2Fragment.builder(feedModel);
if (position >= 0) {
builder.setPosition(position);
}
if (!layoutPreferences.isAnimationDisabled()) {
builder.setSharedProfilePicElement(profilePicView)
.setSharedMainPostElement(mainPostImage);
2020-08-30 13:45:37 +02:00
}
final FragmentManager fragmentManager = getChildFragmentManager();
if (fragmentManager.isDestroyed()) return;
builder.build().show(fragmentManager, "post_view");
opening = false;
2020-08-30 13:45:37 +02:00
}
};
private final FeedAdapterV2.SelectionModeCallback selectionModeCallback = new FeedAdapterV2.SelectionModeCallback() {
@Override
public void onSelectionStart() {
if (!onBackPressedCallback.isEnabled()) {
final OnBackPressedDispatcher onBackPressedDispatcher = fragmentActivity.getOnBackPressedDispatcher();
onBackPressedCallback.setEnabled(true);
onBackPressedDispatcher.addCallback(getViewLifecycleOwner(), onBackPressedCallback);
}
if (actionMode == null) {
actionMode = fragmentActivity.startActionMode(multiSelectAction);
}
}
@Override
public void onSelectionChange(final Set<Media> selectedFeedModels) {
final String title = getString(R.string.number_selected, selectedFeedModels.size());
if (actionMode != null) {
actionMode.setTitle(title);
}
HashTagFragment.this.selectedFeedModels = selectedFeedModels;
}
@Override
public void onSelectionEnd() {
if (onBackPressedCallback.isEnabled()) {
onBackPressedCallback.setEnabled(false);
onBackPressedCallback.remove();
}
if (actionMode != null) {
actionMode.finish();
actionMode = null;
}
}
};
2021-03-20 18:37:17 +01:00
private final ServiceCallback<Hashtag> cb = new ServiceCallback<Hashtag>() {
@Override
public void onSuccess(final Hashtag result) {
hashtagModel = result;
binding.swipeRefreshLayout.setRefreshing(false);
setHashtagDetails();
}
@Override
public void onFailure(final Throwable t) {
setHashtagDetails();
}
};
2020-08-30 13:45:37 +02:00
@Override
public void onCreate(@Nullable final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
fragmentActivity = (MainActivity) requireActivity();
2021-03-20 18:37:17 +01:00
final String cookie = settingsHelper.getString(Constants.COOKIE);
isLoggedIn = !TextUtils.isEmpty(cookie) && CookieUtils.getUserIdFromCookie(cookie) > 0;
tagsService = isLoggedIn ? TagsService.getInstance() : null;
storiesService = isLoggedIn ? StoriesService.getInstance(null, 0L, null) : null;
graphQLService = isLoggedIn ? null : GraphQLService.getInstance();
2020-11-01 12:34:42 +01:00
setHasOptionsMenu(true);
2020-08-30 13:45:37 +02:00
}
@Nullable
@Override
public View onCreateView(@NonNull final LayoutInflater inflater, @Nullable final ViewGroup container, @Nullable final Bundle savedInstanceState) {
if (root != null) {
shouldRefresh = false;
fragmentActivity.setCollapsingView(hashtagDetailsBinding.getRoot());
2020-08-30 13:45:37 +02:00
return root;
}
binding = FragmentHashtagBinding.inflate(inflater, container, false);
root = binding.getRoot();
hashtagDetailsBinding = LayoutHashtagDetailsBinding.inflate(inflater, fragmentActivity.getCollapsingToolbarView(), false);
fragmentActivity.setCollapsingView(hashtagDetailsBinding.getRoot());
2020-08-30 13:45:37 +02:00
return root;
}
@Override
public void onViewCreated(@NonNull final View view, @Nullable final Bundle savedInstanceState) {
if (!shouldRefresh) return;
binding.swipeRefreshLayout.setOnRefreshListener(this);
2020-08-30 13:45:37 +02:00
init();
shouldRefresh = false;
}
@Override
public void onRefresh() {
2020-11-01 12:34:42 +01:00
binding.posts.refresh();
fetchStories();
}
2020-09-26 02:15:46 +02:00
@Override
public void onResume() {
super.onResume();
setTitle();
}
2020-08-30 13:45:37 +02:00
@Override
2020-11-01 12:34:42 +01:00
public void onCreateOptionsMenu(@NonNull final Menu menu, @NonNull final MenuInflater inflater) {
inflater.inflate(R.menu.topic_posts_menu, menu);
}
@Override
public boolean onOptionsItemSelected(@NonNull final MenuItem item) {
if (item.getItemId() == R.id.layout) {
showPostsLayoutPreferences();
return true;
2020-08-30 13:45:37 +02:00
}
2020-11-01 12:34:42 +01:00
return super.onOptionsItemSelected(item);
2020-08-30 13:45:37 +02:00
}
@Override
public void onRequestPermissionsResult(final int requestCode, @NonNull final String[] permissions, @NonNull final int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
final boolean granted = grantResults[0] == PackageManager.PERMISSION_GRANTED;
2020-11-03 11:01:59 +01:00
final Context context = getContext();
if (context == null) return;
if (requestCode == STORAGE_PERM_REQUEST_CODE && granted) {
if (downloadFeedModel == null) return;
2020-11-03 11:01:59 +01:00
DownloadUtils.showDownloadDialog(context, downloadFeedModel, downloadChildPosition);
downloadFeedModel = null;
2020-11-03 11:01:59 +01:00
downloadChildPosition = -1;
return;
}
if (requestCode == STORAGE_PERM_REQUEST_CODE_FOR_SELECTION && granted) {
DownloadUtils.download(context, ImmutableList.copyOf(selectedFeedModels));
binding.posts.endSelection();
}
}
@Override
public void onDestroyView() {
super.onDestroyView();
if (hashtagDetailsBinding != null) {
fragmentActivity.removeCollapsingView(hashtagDetailsBinding.getRoot());
}
}
2020-08-30 13:45:37 +02:00
private void init() {
if (getArguments() == null) return;
final HashTagFragmentArgs fragmentArgs = HashTagFragmentArgs.fromBundle(getArguments());
hashtag = fragmentArgs.getHashtag();
2021-03-21 20:56:09 +01:00
if (hashtag.charAt(0) == '#') hashtag = hashtag.substring(1);
2020-08-30 13:45:37 +02:00
fetchHashtagModel();
}
private void fetchHashtagModel() {
binding.swipeRefreshLayout.setRefreshing(true);
2021-03-20 18:37:17 +01:00
if (isLoggedIn) tagsService.fetch(hashtag, cb);
else graphQLService.fetchTag(hashtag, cb);
2020-08-30 13:45:37 +02:00
}
2020-11-01 12:34:42 +01:00
private void setupPosts() {
binding.posts.setViewModelStoreOwner(this)
.setLifeCycleOwner(this)
.setPostFetchService(new HashtagPostFetchService(hashtagModel, isLoggedIn))
.setLayoutPreferences(layoutPreferences)
2020-11-01 12:34:42 +01:00
.addFetchStatusChangeListener(fetching -> updateSwipeRefreshState())
.setFeedItemCallback(feedItemCallback)
.setSelectionModeCallback(selectionModeCallback)
2020-11-01 12:34:42 +01:00
.init();
2020-08-30 13:45:37 +02:00
binding.swipeRefreshLayout.setRefreshing(true);
2020-11-01 12:34:42 +01:00
}
private void setHashtagDetails() {
2021-02-24 04:02:13 +01:00
if (hashtagModel == null) {
try {
Toast.makeText(getContext(), R.string.error_loading_hashtag, Toast.LENGTH_SHORT).show();
binding.swipeRefreshLayout.setEnabled(false);
} catch (Exception ignored) {}
2021-02-24 04:02:13 +01:00
return;
}
setTitle();
setupPosts();
fetchStories();
2020-08-30 13:45:37 +02:00
if (isLoggedIn) {
hashtagDetailsBinding.btnFollowTag.setVisibility(View.VISIBLE);
2021-03-20 18:37:17 +01:00
hashtagDetailsBinding.btnFollowTag.setText(hashtagModel.getFollowing() == FollowingType.FOLLOWING
? R.string.unfollow
: R.string.follow);
hashtagDetailsBinding.btnFollowTag.setChipIconResource(hashtagModel.getFollowing() == FollowingType.FOLLOWING
? R.drawable.ic_outline_person_add_disabled_24
: R.drawable.ic_outline_person_add_24);
hashtagDetailsBinding.btnFollowTag.setOnClickListener(v -> {
final String cookie = settingsHelper.getString(Constants.COOKIE);
final String csrfToken = CookieUtils.getCsrfTokenFromCookie(cookie);
2021-03-17 02:16:06 +01:00
final long userId = CookieUtils.getUserIdFromCookie(cookie);
final String deviceUuid = Utils.settingsHelper.getString(Constants.DEVICE_UUID);
2021-03-17 03:33:43 +01:00
if (csrfToken != null && userId != 0 && deviceUuid != null) {
hashtagDetailsBinding.btnFollowTag.setClickable(false);
2021-03-20 18:37:17 +01:00
tagsService.changeFollow(hashtagModel.getFollowing() == FollowingType.FOLLOWING ? "unfollow" : "follow",
hashtag,
csrfToken,
userId,
deviceUuid,
new ServiceCallback<Boolean>() {
@Override
public void onSuccess(final Boolean result) {
hashtagDetailsBinding.btnFollowTag.setClickable(true);
if (!result) {
Log.e(TAG, "onSuccess: result is false");
2020-12-22 23:23:48 +01:00
Snackbar.make(root, R.string.downloader_unknown_error, BaseTransientBottomBar.LENGTH_LONG)
.show();
return;
}
2021-03-20 18:37:17 +01:00
hashtagDetailsBinding.btnFollowTag.setText(R.string.unfollow);
hashtagDetailsBinding.btnFollowTag.setChipIconResource(R.drawable.ic_outline_person_add_disabled_24);
}
@Override
public void onFailure(@NonNull final Throwable t) {
hashtagDetailsBinding.btnFollowTag.setClickable(true);
Log.e(TAG, "onFailure: ", t);
final String message = t.getMessage();
Snackbar.make(root,
message != null ? message
: getString(R.string.downloader_unknown_error),
BaseTransientBottomBar.LENGTH_LONG)
.show();
}
});
2021-03-20 18:37:17 +01:00
return;
}
});
2020-08-30 13:45:37 +02:00
} else {
hashtagDetailsBinding.btnFollowTag.setVisibility(View.GONE);
2020-08-30 13:45:37 +02:00
}
hashtagDetailsBinding.favChip.setVisibility(View.VISIBLE);
2020-12-07 18:51:49 +01:00
final FavoriteRepository favoriteRepository = FavoriteRepository.getInstance(FavoriteDataSource.getInstance(getContext()));
2021-03-20 18:37:17 +01:00
favoriteRepository.getFavorite(hashtag, FavoriteType.HASHTAG, new RepositoryCallback<Favorite>() {
2020-12-07 11:47:03 +01:00
@Override
public void onSuccess(final Favorite result) {
2020-12-20 23:04:25 +01:00
favoriteRepository.insertOrUpdateFavorite(new Favorite(
result.getId(),
2021-03-20 18:37:17 +01:00
hashtag,
2020-12-20 23:04:25 +01:00
FavoriteType.HASHTAG,
hashtagModel.getName(),
"res:/" + R.drawable.ic_hashtag,
2020-12-20 23:04:25 +01:00
result.getDateAdded()
), new RepositoryCallback<Void>() {
@Override
2020-12-22 23:23:48 +01:00
public void onSuccess(final Void result) {
hashtagDetailsBinding.favChip.setChipIconResource(R.drawable.ic_star_check_24);
hashtagDetailsBinding.favChip.setText(R.string.favorite_short);
}
2020-12-20 23:04:25 +01:00
@Override
public void onDataNotAvailable() {}
});
2020-12-07 11:47:03 +01:00
}
@Override
public void onDataNotAvailable() {
hashtagDetailsBinding.favChip.setChipIconResource(R.drawable.ic_outline_star_plus_24);
hashtagDetailsBinding.favChip.setText(R.string.add_to_favorites);
}
});
2020-12-07 11:47:03 +01:00
hashtagDetailsBinding.favChip.setOnClickListener(
2021-03-20 18:37:17 +01:00
v -> favoriteRepository.getFavorite(hashtag, FavoriteType.HASHTAG, new RepositoryCallback<Favorite>() {
2020-12-07 11:47:03 +01:00
@Override
public void onSuccess(final Favorite result) {
2021-03-20 18:37:17 +01:00
favoriteRepository.deleteFavorite(hashtag, FavoriteType.HASHTAG, new RepositoryCallback<Void>() {
2020-12-07 11:47:03 +01:00
@Override
public void onSuccess(final Void result) {
hashtagDetailsBinding.favChip.setText(R.string.add_to_favorites);
hashtagDetailsBinding.favChip.setChipIconResource(R.drawable.ic_outline_star_plus_24);
showSnackbar(getString(R.string.removed_from_favs));
}
@Override
public void onDataNotAvailable() {}
});
}
@Override
public void onDataNotAvailable() {
favoriteRepository.insertOrUpdateFavorite(new Favorite(
2020-12-23 15:06:53 +01:00
0,
2021-03-20 18:37:17 +01:00
hashtag,
2020-12-07 11:47:03 +01:00
FavoriteType.HASHTAG,
hashtagModel.getName(),
"res:/" + R.drawable.ic_hashtag,
2020-12-07 11:47:03 +01:00
new Date()
2020-12-07 18:51:49 +01:00
), new RepositoryCallback<Void>() {
2020-12-07 11:47:03 +01:00
@Override
2020-12-07 18:51:49 +01:00
public void onSuccess(final Void result) {
2020-12-07 11:47:03 +01:00
hashtagDetailsBinding.favChip.setText(R.string.favorite_short);
hashtagDetailsBinding.favChip.setChipIconResource(R.drawable.ic_star_check_24);
showSnackbar(getString(R.string.added_to_favs));
2020-12-07 11:47:03 +01:00
}
@Override
public void onDataNotAvailable() {}
});
}
}));
hashtagDetailsBinding.mainHashtagImage.setImageURI("res:/" + R.drawable.ic_hashtag);
2021-03-20 18:37:17 +01:00
final String postCount = String.valueOf(hashtagModel.getMediaCount());
final SpannableStringBuilder span = new SpannableStringBuilder(getResources().getQuantityString(R.plurals.main_posts_count_inline,
2021-03-20 18:37:17 +01:00
hashtagModel.getMediaCount() > 2000000000L
? 2000000000
2021-03-20 18:37:17 +01:00
: hashtagModel.getMediaCount().intValue(),
postCount));
2020-08-30 13:45:37 +02:00
span.setSpan(new RelativeSizeSpan(1.2f), 0, postCount.length(), 0);
span.setSpan(new StyleSpan(Typeface.BOLD), 0, postCount.length(), 0);
hashtagDetailsBinding.mainTagPostCount.setText(span);
hashtagDetailsBinding.mainTagPostCount.setVisibility(View.VISIBLE);
hashtagDetailsBinding.mainHashtagImage.setOnClickListener(v -> {
2020-11-01 12:34:42 +01:00
if (!hasStories) return;
// show stories
final NavDirections action = HashTagFragmentDirections
.actionHashtagFragmentToStoryViewerFragment(StoryViewerOptions.forHashtag(hashtagModel.getName()));
2020-11-01 12:34:42 +01:00
NavHostFragment.findNavController(this).navigate(action);
2020-09-26 02:15:46 +02:00
});
2020-08-30 13:45:37 +02:00
}
2020-12-07 11:47:03 +01:00
private void showSnackbar(final String message) {
final Snackbar snackbar = Snackbar.make(root, message, BaseTransientBottomBar.LENGTH_LONG);
snackbar.setAction(R.string.ok, v1 -> snackbar.dismiss())
.setAnimationMode(BaseTransientBottomBar.ANIMATION_MODE_SLIDE)
.setAnchorView(fragmentActivity.getBottomNavView())
.show();
}
2020-11-01 12:34:42 +01:00
private void fetchStories() {
if (!isLoggedIn) return;
storiesFetching = true;
storiesService.getUserStory(
StoryViewerOptions.forHashtag(hashtagModel.getName()),
2020-11-01 12:34:42 +01:00
new ServiceCallback<List<StoryModel>>() {
@Override
public void onSuccess(final List<StoryModel> storyModels) {
if (storyModels != null && !storyModels.isEmpty()) {
hashtagDetailsBinding.mainHashtagImage.setStoriesBorder(1);
2020-11-01 12:34:42 +01:00
hasStories = true;
} else {
hasStories = false;
}
storiesFetching = false;
}
@Override
public void onFailure(final Throwable t) {
Log.e(TAG, "Error", t);
storiesFetching = false;
}
});
}
2020-08-30 13:45:37 +02:00
private void setTitle() {
final ActionBar actionBar = fragmentActivity.getSupportActionBar();
if (actionBar != null) {
2020-11-01 07:02:54 +01:00
// Log.d(TAG, "setting title: " + hashtag);
2021-03-20 18:37:17 +01:00
actionBar.setTitle('#' + hashtag);
2020-11-01 07:02:54 +01:00
// final Handler handler = new Handler();
// handler.postDelayed(() -> , 1000);
2020-08-30 13:45:37 +02:00
}
}
2020-11-01 12:34:42 +01:00
private void updateSwipeRefreshState() {
binding.swipeRefreshLayout.setRefreshing(binding.posts.isFetching() || storiesFetching);
}
private void navigateToProfile(final String username) {
final NavController navController = NavHostFragment.findNavController(this);
final Bundle bundle = new Bundle();
bundle.putString("username", username);
navController.navigate(R.id.action_global_profileFragment, bundle);
}
private void showPostsLayoutPreferences() {
final PostsLayoutPreferencesDialogFragment fragment = new PostsLayoutPreferencesDialogFragment(
Constants.PREF_HASHTAG_POSTS_LAYOUT,
preferences -> {
layoutPreferences = preferences;
new Handler().postDelayed(() -> binding.posts.setLayoutPreferences(preferences), 200);
});
2020-11-01 12:34:42 +01:00
fragment.show(getChildFragmentManager(), "posts_layout_preferences");
}
2020-08-30 13:45:37 +02:00
}