|
|
@ -43,7 +43,6 @@ import java.util.Set; |
|
|
|
import awais.instagrabber.R; |
|
|
|
import awais.instagrabber.activities.MainActivity; |
|
|
|
import awais.instagrabber.adapters.FeedAdapterV2; |
|
|
|
import awais.instagrabber.asyncs.HashtagFetcher; |
|
|
|
import awais.instagrabber.asyncs.HashtagPostFetchService; |
|
|
|
import awais.instagrabber.asyncs.PostFetcher; |
|
|
|
import awais.instagrabber.customviews.PrimaryActionModeCallback; |
|
|
@ -54,12 +53,12 @@ import awais.instagrabber.db.entities.Favorite; |
|
|
|
import awais.instagrabber.db.repositories.FavoriteRepository; |
|
|
|
import awais.instagrabber.db.repositories.RepositoryCallback; |
|
|
|
import awais.instagrabber.dialogs.PostsLayoutPreferencesDialogFragment; |
|
|
|
import awais.instagrabber.interfaces.FetchListener; |
|
|
|
import awais.instagrabber.models.HashtagModel; |
|
|
|
import awais.instagrabber.models.PostsLayoutPreferences; |
|
|
|
import awais.instagrabber.models.StoryModel; |
|
|
|
import awais.instagrabber.models.enums.FavoriteType; |
|
|
|
import awais.instagrabber.models.enums.FollowingType; |
|
|
|
import awais.instagrabber.repositories.requests.StoryViewerOptions; |
|
|
|
import awais.instagrabber.repositories.responses.Hashtag; |
|
|
|
import awais.instagrabber.repositories.responses.Location; |
|
|
|
import awais.instagrabber.repositories.responses.Media; |
|
|
|
import awais.instagrabber.utils.Constants; |
|
|
@ -67,16 +66,18 @@ import awais.instagrabber.utils.CookieUtils; |
|
|
|
import awais.instagrabber.utils.DownloadUtils; |
|
|
|
import awais.instagrabber.utils.TextUtils; |
|
|
|
import awais.instagrabber.utils.Utils; |
|
|
|
import awais.instagrabber.webservices.GraphQLService; |
|
|
|
import awais.instagrabber.webservices.ServiceCallback; |
|
|
|
import awais.instagrabber.webservices.StoriesService; |
|
|
|
import awais.instagrabber.webservices.TagsService; |
|
|
|
//import awaisomereport.LogCollector; |
|
|
|
|
|
|
|
import static androidx.core.content.PermissionChecker.checkSelfPermission; |
|
|
|
import static awais.instagrabber.utils.DownloadUtils.WRITE_PERMISSION; |
|
|
|
//import static awais.instagrabber.utils.Utils.logCollector; |
|
|
|
import static awais.instagrabber.utils.Utils.settingsHelper; |
|
|
|
|
|
|
|
//import awaisomereport.LogCollector; |
|
|
|
//import static awais.instagrabber.utils.Utils.logCollector; |
|
|
|
|
|
|
|
public class HashTagFragment extends Fragment implements SwipeRefreshLayout.OnRefreshListener { |
|
|
|
private static final String TAG = "HashTagFragment"; |
|
|
|
private static final int STORAGE_PERM_REQUEST_CODE = 8020; |
|
|
@ -91,12 +92,13 @@ public class HashTagFragment extends Fragment implements SwipeRefreshLayout.OnRe |
|
|
|
private boolean hasStories = false; |
|
|
|
private boolean opening = false; |
|
|
|
private String hashtag; |
|
|
|
private HashtagModel hashtagModel = null; |
|
|
|
private Hashtag hashtagModel = null; |
|
|
|
private ActionMode actionMode; |
|
|
|
private StoriesService storiesService; |
|
|
|
private AsyncTask<?, ?, ?> currentlyExecuting; |
|
|
|
private boolean isLoggedIn; |
|
|
|
private TagsService tagsService; |
|
|
|
private GraphQLService graphQLService; |
|
|
|
private boolean storiesFetching; |
|
|
|
private Set<Media> selectedFeedModels; |
|
|
|
private Media downloadFeedModel; |
|
|
@ -270,13 +272,29 @@ public class HashTagFragment extends Fragment implements SwipeRefreshLayout.OnRe |
|
|
|
} |
|
|
|
} |
|
|
|
}; |
|
|
|
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(); |
|
|
|
} |
|
|
|
}; |
|
|
|
|
|
|
|
@Override |
|
|
|
public void onCreate(@Nullable final Bundle savedInstanceState) { |
|
|
|
super.onCreate(savedInstanceState); |
|
|
|
fragmentActivity = (MainActivity) requireActivity(); |
|
|
|
tagsService = TagsService.getInstance(); |
|
|
|
storiesService = StoriesService.getInstance(null, 0L, null); |
|
|
|
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(); |
|
|
|
setHasOptionsMenu(true); |
|
|
|
} |
|
|
|
|
|
|
@ -358,29 +376,15 @@ public class HashTagFragment extends Fragment implements SwipeRefreshLayout.OnRe |
|
|
|
|
|
|
|
private void init() { |
|
|
|
if (getArguments() == null) return; |
|
|
|
final String cookie = settingsHelper.getString(Constants.COOKIE); |
|
|
|
isLoggedIn = !TextUtils.isEmpty(cookie) && CookieUtils.getUserIdFromCookie(cookie) > 0; |
|
|
|
final HashTagFragmentArgs fragmentArgs = HashTagFragmentArgs.fromBundle(getArguments()); |
|
|
|
hashtag = fragmentArgs.getHashtag(); |
|
|
|
fetchHashtagModel(); |
|
|
|
} |
|
|
|
|
|
|
|
private void fetchHashtagModel() { |
|
|
|
stopCurrentExecutor(); |
|
|
|
binding.swipeRefreshLayout.setRefreshing(true); |
|
|
|
currentlyExecuting = new HashtagFetcher(hashtag.substring(1), new FetchListener<HashtagModel>() { |
|
|
|
@Override |
|
|
|
public void onResult(final HashtagModel result) { |
|
|
|
hashtagModel = result; |
|
|
|
binding.swipeRefreshLayout.setRefreshing(false); |
|
|
|
setHashtagDetails(); |
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
|
public void onFailure(Throwable t) { |
|
|
|
setHashtagDetails(); |
|
|
|
} |
|
|
|
}).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); |
|
|
|
if (isLoggedIn) tagsService.fetch(hashtag, cb); |
|
|
|
else graphQLService.fetchTag(hashtag, cb); |
|
|
|
} |
|
|
|
|
|
|
|
private void setupPosts() { |
|
|
@ -409,8 +413,10 @@ public class HashTagFragment extends Fragment implements SwipeRefreshLayout.OnRe |
|
|
|
fetchStories(); |
|
|
|
if (isLoggedIn) { |
|
|
|
hashtagDetailsBinding.btnFollowTag.setVisibility(View.VISIBLE); |
|
|
|
hashtagDetailsBinding.btnFollowTag.setText(hashtagModel.getFollowing() ? R.string.unfollow : R.string.follow); |
|
|
|
hashtagDetailsBinding.btnFollowTag.setChipIconResource(hashtagModel.getFollowing() |
|
|
|
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 -> { |
|
|
@ -420,36 +426,12 @@ public class HashTagFragment extends Fragment implements SwipeRefreshLayout.OnRe |
|
|
|
final String deviceUuid = Utils.settingsHelper.getString(Constants.DEVICE_UUID); |
|
|
|
if (csrfToken != null && userId != 0 && deviceUuid != null) { |
|
|
|
hashtagDetailsBinding.btnFollowTag.setClickable(false); |
|
|
|
if (!hashtagModel.getFollowing()) { |
|
|
|
tagsService.follow(hashtag.substring(1), 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"); |
|
|
|
Snackbar.make(root, R.string.downloader_unknown_error, BaseTransientBottomBar.LENGTH_LONG) |
|
|
|
.show(); |
|
|
|
return; |
|
|
|
} |
|
|
|
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(); |
|
|
|
} |
|
|
|
}); |
|
|
|
return; |
|
|
|
} |
|
|
|
tagsService.unfollow(hashtag.substring(1), csrfToken, userId, deviceUuid, new ServiceCallback<Boolean>() { |
|
|
|
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); |
|
|
@ -459,8 +441,8 @@ public class HashTagFragment extends Fragment implements SwipeRefreshLayout.OnRe |
|
|
|
.show(); |
|
|
|
return; |
|
|
|
} |
|
|
|
hashtagDetailsBinding.btnFollowTag.setText(R.string.follow); |
|
|
|
hashtagDetailsBinding.btnFollowTag.setChipIconResource(R.drawable.ic_outline_person_add_24); |
|
|
|
hashtagDetailsBinding.btnFollowTag.setText(R.string.unfollow); |
|
|
|
hashtagDetailsBinding.btnFollowTag.setChipIconResource(R.drawable.ic_outline_person_add_disabled_24); |
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
@ -475,6 +457,7 @@ public class HashTagFragment extends Fragment implements SwipeRefreshLayout.OnRe |
|
|
|
.show(); |
|
|
|
} |
|
|
|
}); |
|
|
|
return; |
|
|
|
} |
|
|
|
}); |
|
|
|
} else { |
|
|
@ -482,15 +465,15 @@ public class HashTagFragment extends Fragment implements SwipeRefreshLayout.OnRe |
|
|
|
} |
|
|
|
hashtagDetailsBinding.favChip.setVisibility(View.VISIBLE); |
|
|
|
final FavoriteRepository favoriteRepository = FavoriteRepository.getInstance(FavoriteDataSource.getInstance(getContext())); |
|
|
|
favoriteRepository.getFavorite(hashtag.substring(1), FavoriteType.HASHTAG, new RepositoryCallback<Favorite>() { |
|
|
|
favoriteRepository.getFavorite(hashtag, FavoriteType.HASHTAG, new RepositoryCallback<Favorite>() { |
|
|
|
@Override |
|
|
|
public void onSuccess(final Favorite result) { |
|
|
|
favoriteRepository.insertOrUpdateFavorite(new Favorite( |
|
|
|
result.getId(), |
|
|
|
hashtag.substring(1), |
|
|
|
hashtag, |
|
|
|
FavoriteType.HASHTAG, |
|
|
|
hashtagModel.getName(), |
|
|
|
hashtagModel.getSdProfilePic(), |
|
|
|
hashtagModel.getProfilePicUrl(), |
|
|
|
result.getDateAdded() |
|
|
|
), new RepositoryCallback<Void>() { |
|
|
|
@Override |
|
|
@ -511,10 +494,10 @@ public class HashTagFragment extends Fragment implements SwipeRefreshLayout.OnRe |
|
|
|
} |
|
|
|
}); |
|
|
|
hashtagDetailsBinding.favChip.setOnClickListener( |
|
|
|
v -> favoriteRepository.getFavorite(hashtag.substring(1), FavoriteType.HASHTAG, new RepositoryCallback<Favorite>() { |
|
|
|
v -> favoriteRepository.getFavorite(hashtag, FavoriteType.HASHTAG, new RepositoryCallback<Favorite>() { |
|
|
|
@Override |
|
|
|
public void onSuccess(final Favorite result) { |
|
|
|
favoriteRepository.deleteFavorite(hashtag.substring(1), FavoriteType.HASHTAG, new RepositoryCallback<Void>() { |
|
|
|
favoriteRepository.deleteFavorite(hashtag, FavoriteType.HASHTAG, new RepositoryCallback<Void>() { |
|
|
|
@Override |
|
|
|
public void onSuccess(final Void result) { |
|
|
|
hashtagDetailsBinding.favChip.setText(R.string.add_to_favorites); |
|
|
@ -531,10 +514,10 @@ public class HashTagFragment extends Fragment implements SwipeRefreshLayout.OnRe |
|
|
|
public void onDataNotAvailable() { |
|
|
|
favoriteRepository.insertOrUpdateFavorite(new Favorite( |
|
|
|
0, |
|
|
|
hashtag.substring(1), |
|
|
|
hashtag, |
|
|
|
FavoriteType.HASHTAG, |
|
|
|
hashtagModel.getName(), |
|
|
|
hashtagModel.getSdProfilePic(), |
|
|
|
hashtagModel.getProfilePicUrl(), |
|
|
|
new Date() |
|
|
|
), new RepositoryCallback<Void>() { |
|
|
|
@Override |
|
|
@ -549,12 +532,12 @@ public class HashTagFragment extends Fragment implements SwipeRefreshLayout.OnRe |
|
|
|
}); |
|
|
|
} |
|
|
|
})); |
|
|
|
hashtagDetailsBinding.mainHashtagImage.setImageURI(hashtagModel.getSdProfilePic()); |
|
|
|
final String postCount = String.valueOf(hashtagModel.getPostCount()); |
|
|
|
hashtagDetailsBinding.mainHashtagImage.setImageURI(hashtagModel.getProfilePicUrl()); |
|
|
|
final String postCount = String.valueOf(hashtagModel.getMediaCount()); |
|
|
|
final SpannableStringBuilder span = new SpannableStringBuilder(getResources().getQuantityString(R.plurals.main_posts_count_inline, |
|
|
|
hashtagModel.getPostCount() > 2000000000L |
|
|
|
hashtagModel.getMediaCount() > 2000000000L |
|
|
|
? 2000000000 |
|
|
|
: hashtagModel.getPostCount().intValue(), |
|
|
|
: hashtagModel.getMediaCount().intValue(), |
|
|
|
postCount)); |
|
|
|
span.setSpan(new RelativeSizeSpan(1.2f), 0, postCount.length(), 0); |
|
|
|
span.setSpan(new StyleSpan(Typeface.BOLD), 0, postCount.length(), 0); |
|
|
@ -602,23 +585,11 @@ public class HashTagFragment extends Fragment implements SwipeRefreshLayout.OnRe |
|
|
|
}); |
|
|
|
} |
|
|
|
|
|
|
|
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) { |
|
|
|
// Log.d(TAG, "setting title: " + hashtag); |
|
|
|
actionBar.setTitle(hashtag); |
|
|
|
actionBar.setTitle('#' + hashtag); |
|
|
|
// final Handler handler = new Handler(); |
|
|
|
// handler.postDelayed(() -> , 1000); |
|
|
|
} |
|
|
|
xxxxxxxxxx