Break down Utils into separate utility classes as Utils was getting bloated

This commit is contained in:
Ammar Githam 2020-09-10 20:44:25 +09:00
parent 6fa13a6fbb
commit 80044b5daf
89 changed files with 1649 additions and 1484 deletions

View File

@ -21,7 +21,7 @@ import awais.instagrabber.utils.SettingsHelper;
import awaisomereport.CrashReporter;
import awaisomereport.LogCollector;
import static awais.instagrabber.utils.Utils.NET_COOKIE_MANAGER;
import static awais.instagrabber.utils.CookieUtils.NET_COOKIE_MANAGER;
import static awais.instagrabber.utils.Utils.clipboardManager;
import static awais.instagrabber.utils.Utils.dataBox;
import static awais.instagrabber.utils.Utils.datetimeParser;

View File

@ -20,7 +20,8 @@ import androidx.annotation.Nullable;
import awais.instagrabber.R;
import awais.instagrabber.databinding.ActivityLoginBinding;
import awais.instagrabber.utils.Constants;
import awais.instagrabber.utils.Utils;
import awais.instagrabber.utils.CookieUtils;
import awais.instagrabber.utils.TextUtils;
public final class Login extends BaseLanguageActivity implements View.OnClickListener, CompoundButton.OnCheckedChangeListener {
private final WebViewClient webViewClient = new WebViewClient() {
@ -32,8 +33,8 @@ public final class Login extends BaseLanguageActivity implements View.OnClickLis
@Override
public void onPageFinished(final WebView view, final String url) {
webViewUrl = url;
final String mainCookie = Utils.getCookie(url);
if (Utils.isEmpty(mainCookie) || !mainCookie.contains("; ds_user_id=")) {
final String mainCookie = CookieUtils.getCookie(url);
if (TextUtils.isEmpty(mainCookie) || !mainCookie.contains("; ds_user_id=")) {
ready = true;
return;
}
@ -75,8 +76,8 @@ public final class Login extends BaseLanguageActivity implements View.OnClickLis
return;
}
if (v == loginBinding.cookies) {
final String mainCookie = Utils.getCookie(webViewUrl);
if (Utils.isEmpty(mainCookie) || !mainCookie.contains("; ds_user_id=")) {
final String mainCookie = CookieUtils.getCookie(webViewUrl);
if (TextUtils.isEmpty(mainCookie) || !mainCookie.contains("; ds_user_id=")) {
Toast.makeText(this, R.string.login_error_loading_cookies, Toast.LENGTH_SHORT).show();
return;
}

View File

@ -48,9 +48,10 @@ import awais.instagrabber.models.IntentModel;
import awais.instagrabber.models.SuggestionModel;
import awais.instagrabber.models.enums.SuggestionType;
import awais.instagrabber.utils.Constants;
import awais.instagrabber.utils.CookieUtils;
import awais.instagrabber.utils.FlavorTown;
import awais.instagrabber.utils.IntentUtils;
import awais.instagrabber.utils.Utils;
import awais.instagrabber.utils.TextUtils;
import static awais.instagrabber.utils.NavigationExtensions.setupWithNavController;
import static awais.instagrabber.utils.Utils.settingsHelper;
@ -105,7 +106,7 @@ public class MainActivity extends BaseLanguageActivity {
super.onCreate(savedInstanceState);
binding = ActivityMainBinding.inflate(getLayoutInflater());
final String cookie = settingsHelper.getString(Constants.COOKIE);
Utils.setupCookies(cookie);
CookieUtils.setupCookies(cookie);
setContentView(binding.getRoot());
final Toolbar toolbar = binding.toolbar;
setSupportActionBar(toolbar);
@ -268,7 +269,7 @@ public class MainActivity extends BaseLanguageActivity {
private final Runnable runnable = () -> {
cancelSuggestionsAsync();
if (Utils.isEmpty(currentSearchQuery)) {
if (TextUtils.isEmpty(currentSearchQuery)) {
suggestionAdapter.changeCursor(null);
return;
}
@ -315,7 +316,7 @@ public class MainActivity extends BaseLanguageActivity {
private void setupBottomNavigationBar(final boolean setDefaultFromSettings) {
int main_nav_ids = R.array.main_nav_ids;
final String cookie = settingsHelper.getString(Constants.COOKIE);
isLoggedIn = !Utils.isEmpty(cookie) && Utils.getUserIdFromCookie(cookie) != null;
isLoggedIn = !TextUtils.isEmpty(cookie) && CookieUtils.getUserIdFromCookie(cookie) != null;
if (!isLoggedIn) {
main_nav_ids = R.array.logged_out_main_nav_ids;
binding.bottomNavView.getMenu().clear();
@ -333,7 +334,7 @@ public class MainActivity extends BaseLanguageActivity {
if (setDefaultFromSettings || !isLoggedIn) {
final String defaultTabIdString = settingsHelper.getString(Constants.DEFAULT_TAB);
try {
final int defaultNavId = Utils.isEmpty(defaultTabIdString) || !isLoggedIn
final int defaultNavId = TextUtils.isEmpty(defaultTabIdString) || !isLoggedIn
? R.navigation.profile_nav_graph
: Integer.parseInt(defaultTabIdString);
final int index = mainNavList.indexOf(defaultNavId);

View File

@ -1,7 +1,6 @@
package awais.instagrabber.activities;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.res.Resources;
import android.os.AsyncTask;
import android.os.Bundle;
@ -28,9 +27,9 @@ import awais.instagrabber.databinding.ActivityNotificationBinding;
import awais.instagrabber.interfaces.FetchListener;
import awais.instagrabber.interfaces.MentionClickListener;
import awais.instagrabber.models.NotificationModel;
import awais.instagrabber.models.PostModel;
import awais.instagrabber.models.enums.NotificationType;
import awais.instagrabber.utils.Constants;
import awais.instagrabber.utils.TextUtils;
import awais.instagrabber.utils.Utils;
import static awais.instagrabber.utils.Utils.notificationManager;
@ -47,7 +46,7 @@ public final class NotificationsViewer extends BaseLanguageActivity implements S
@Override
protected void onCreate(@Nullable final Bundle savedInstanceState) {
notificationManager.cancel(1800000000);
if (Utils.isEmpty(cookie)) {
if (TextUtils.isEmpty(cookie)) {
Toast.makeText(this, R.string.activity_notloggedin, Toast.LENGTH_SHORT).show();
}
super.onCreate(savedInstanceState);

View File

@ -18,7 +18,7 @@ import awais.instagrabber.interfaces.MentionClickListener;
import awais.instagrabber.models.CommentModel;
import awais.instagrabber.models.ProfileModel;
import awais.instagrabber.utils.LocaleUtils;
import awais.instagrabber.utils.Utils;
import awais.instagrabber.utils.TextUtils;
public final class CommentsAdapter extends RecyclerView.Adapter<CommentViewHolder> implements Filterable {
@ -38,7 +38,7 @@ public final class CommentsAdapter extends RecyclerView.Adapter<CommentViewHolde
results.values = commentModels;
final int commentsLen = commentModels == null ? 0 : commentModels.length;
if (commentModels != null && commentsLen > 0 && !Utils.isEmpty(filter)) {
if (commentModels != null && commentsLen > 0 && !TextUtils.isEmpty(filter)) {
final String query = filter.toString().toLowerCase();
final ArrayList<CommentModel> filterList = new ArrayList<>(commentsLen);

View File

@ -20,7 +20,7 @@ import awais.instagrabber.R;
import awais.instagrabber.adapters.viewholder.FollowsViewHolder;
import awais.instagrabber.interfaces.OnGroupClickListener;
import awais.instagrabber.models.FollowModel;
import awais.instagrabber.utils.Utils;
import awais.instagrabber.utils.TextUtils;
import thoughtbot.expandableadapter.ExpandableGroup;
import thoughtbot.expandableadapter.ExpandableList;
import thoughtbot.expandableadapter.ExpandableListPosition;
@ -34,7 +34,7 @@ public final class FollowAdapter extends RecyclerView.Adapter<RecyclerView.ViewH
@Override
protected FilterResults performFiltering(final CharSequence filter) {
if (expandableList.groups != null) {
final boolean isFilterEmpty = Utils.isEmpty(filter);
final boolean isFilterEmpty = TextUtils.isEmpty(filter);
final String query = isFilterEmpty ? null : filter.toString().toLowerCase();
for (int x = 0; x < expandableList.groups.size(); ++x) {
@ -46,13 +46,20 @@ public final class FollowAdapter extends RecyclerView.Adapter<RecyclerView.ViewH
final FollowModel followModel = items.get(i);
if (isFilterEmpty) followModel.setShown(true);
else followModel.setShown(Utils.hasKey(query, followModel.getUsername(), followModel.getFullName()));
else followModel.setShown(hasKey(query, followModel.getUsername(), followModel.getFullName()));
}
}
}
return null;
}
private boolean hasKey(final String key, final String username, final String name) {
if (TextUtils.isEmpty(key)) return true;
final boolean hasUserName = username != null && username.toLowerCase().contains(key);
if (!hasUserName && name != null) return name.toLowerCase().contains(key);
return true;
}
@Override
protected void publishResults(final CharSequence constraint, final FilterResults results) {
notifyDataSetChanged();

View File

@ -29,6 +29,7 @@ import awais.instagrabber.models.ProfileModel;
import awais.instagrabber.models.ViewerPostModel;
import awais.instagrabber.models.ViewerPostModelWrapper;
import awais.instagrabber.models.enums.MediaItemType;
import awais.instagrabber.utils.TextUtils;
import awais.instagrabber.utils.Utils;
public class PostViewerViewHolder extends RecyclerView.ViewHolder {
@ -71,17 +72,17 @@ public class PostViewerViewHolder extends RecyclerView.ViewHolder {
if (profileModel == null) return;
binding.topPanel.title.setText(profileModel.getUsername());
final String locationName = firstPost.getLocationName();
if (!Utils.isEmpty(locationName)) {
if (!TextUtils.isEmpty(locationName)) {
binding.topPanel.location.setVisibility(View.VISIBLE);
binding.topPanel.location.setText(locationName);
} else binding.topPanel.location.setVisibility(View.GONE);
binding.topPanel.ivProfilePic.setImageURI(profileModel.getSdProfilePic());
binding.bottomPanel.commentsCount.setText(String.valueOf(firstPost.getCommentsCount()));
final CharSequence postCaption = firstPost.getPostCaption();
if (Utils.hasMentions(postCaption)) {
if (TextUtils.hasMentions(postCaption)) {
binding.bottomPanel.viewerCaption.setMentionClickListener(mentionClickListener);
binding.bottomPanel.viewerCaption
.setText(Utils.getMentionText(postCaption), TextView.BufferType.SPANNABLE);
.setText(TextUtils.getMentionText(postCaption), TextView.BufferType.SPANNABLE);
} else {
binding.bottomPanel.viewerCaption.setMentionClickListener(null);
binding.bottomPanel.viewerCaption.setText(postCaption);
@ -141,7 +142,7 @@ public class PostViewerViewHolder extends RecyclerView.ViewHolder {
longClickListener.onLongClick(binding.bottomPanel.viewerCaption.getText().toString());
return true;
});
if (!Utils.isEmpty(location)) {
if (!TextUtils.isEmpty(location)) {
binding.topPanel.location.setOnClickListener(v -> mentionClickListener
.onClick(binding.topPanel.location, location, false, true));
}

View File

@ -18,13 +18,16 @@ import awais.instagrabber.databinding.LayoutDmBaseBinding;
import awais.instagrabber.models.ProfileModel;
import awais.instagrabber.models.direct_messages.DirectItemModel;
import awais.instagrabber.utils.Constants;
import awais.instagrabber.utils.CookieUtils;
import awais.instagrabber.utils.TextUtils;
import awais.instagrabber.utils.Utils;
public abstract class DirectMessageItemViewHolder extends RecyclerView.ViewHolder {
private static final int MESSAGE_INCOMING = 69;
private static final int MESSAGE_OUTGOING = 420;
private final ProfileModel myProfileHolder = ProfileModel.getDefaultProfileModel(Utils.getUserIdFromCookie(Utils.settingsHelper.getString(Constants.COOKIE)));
private final ProfileModel myProfileHolder = ProfileModel.getDefaultProfileModel(
CookieUtils.getUserIdFromCookie(Utils.settingsHelper.getString(Constants.COOKIE)));
private final LayoutDmBaseBinding binding;
private final String strDmYou;
private final int itemMargin;
@ -56,7 +59,7 @@ public abstract class DirectMessageItemViewHolder extends RecyclerView.ViewHolde
if (user != null && user != myProfileHolder) {
text = user.getUsername();
} else if (user == myProfileHolder) text = "";
text = (Utils.isEmpty(text) ? "" : text + " - ") + directItemModel.getDateTime();
text = (TextUtils.isEmpty(text) ? "" : text + " - ") + directItemModel.getDateTime();
binding.tvUsername.setText(text);
binding.tvUsername.setGravity(type == MESSAGE_INCOMING ? Gravity.START : Gravity.END);
binding.ivProfilePic.setVisibility(type == MESSAGE_INCOMING ? View.VISIBLE : View.GONE);

View File

@ -7,7 +7,7 @@ import androidx.annotation.NonNull;
import awais.instagrabber.databinding.LayoutDmBaseBinding;
import awais.instagrabber.databinding.LayoutDmLinkBinding;
import awais.instagrabber.models.direct_messages.DirectItemModel;
import awais.instagrabber.utils.Utils;
import awais.instagrabber.utils.TextUtils;
public class DirectMessageLinkViewHolder extends DirectMessageItemViewHolder {
@ -26,21 +26,21 @@ public class DirectMessageLinkViewHolder extends DirectMessageItemViewHolder {
final DirectItemModel.DirectItemLinkModel link = directItemModel.getLinkModel();
final DirectItemModel.DirectItemLinkContext linkContext = link.getLinkContext();
final String linkImageUrl = linkContext.getLinkImageUrl();
if (Utils.isEmpty(linkImageUrl)) {
if (TextUtils.isEmpty(linkImageUrl)) {
binding.ivLinkPreview.setVisibility(View.GONE);
} else {
getGlideRequestManager().load(linkImageUrl).into(binding.ivLinkPreview);
}
if (Utils.isEmpty(linkContext.getLinkTitle())) {
if (TextUtils.isEmpty(linkContext.getLinkTitle())) {
binding.tvLinkTitle.setVisibility(View.GONE);
} else {
binding.tvLinkTitle.setText(linkContext.getLinkTitle());
}
if (Utils.isEmpty(linkContext.getLinkSummary())) {
if (TextUtils.isEmpty(linkContext.getLinkSummary())) {
binding.tvLinkSummary.setVisibility(View.GONE);
} else {
binding.tvLinkSummary.setText(linkContext.getLinkSummary());
}
binding.tvMessage.setText(Utils.getSpannableUrl(link.getText()));
binding.tvMessage.setText(TextUtils.getSpannableUrl(link.getText()));
}
}

View File

@ -12,7 +12,7 @@ import awais.instagrabber.models.direct_messages.DirectItemModel;
import awais.instagrabber.models.enums.MediaItemType;
import awais.instagrabber.models.enums.RavenExpiringMediaType;
import awais.instagrabber.models.enums.RavenMediaViewType;
import awais.instagrabber.utils.Utils;
import awais.instagrabber.utils.TextUtils;
public class DirectMessageRavenMediaViewHolder extends DirectMessageItemViewHolder {
@ -33,7 +33,7 @@ public class DirectMessageRavenMediaViewHolder extends DirectMessageItemViewHold
final DirectItemModel.DirectItemRavenMediaModel ravenMediaModel = directItemModel.getRavenMediaModel();
DirectItemModel.DirectItemMediaModel mediaModel = directItemModel.getMediaModel();
final boolean isExpired = ravenMediaModel == null || (mediaModel = ravenMediaModel.getMedia()) == null ||
Utils.isEmpty(mediaModel.getThumbUrl()) && mediaModel.getPk() < 1;
TextUtils.isEmpty(mediaModel.getThumbUrl()) && mediaModel.getPk() < 1;
DirectItemModel.RavenExpiringMediaActionSummaryModel mediaActionSummary = null;
if (ravenMediaModel != null) {

View File

@ -9,7 +9,7 @@ import awais.instagrabber.databinding.LayoutDmRavenMediaBinding;
import awais.instagrabber.interfaces.MentionClickListener;
import awais.instagrabber.models.direct_messages.DirectItemModel;
import awais.instagrabber.models.enums.MediaItemType;
import awais.instagrabber.utils.Utils;
import awais.instagrabber.utils.TextUtils;
public class DirectMessageReelShareViewHolder extends DirectMessageItemViewHolder {
@ -29,10 +29,10 @@ public class DirectMessageReelShareViewHolder extends DirectMessageItemViewHolde
public void bindItem(final DirectItemModel directItemModel) {
final DirectItemModel.DirectItemReelShareModel reelShare = directItemModel.getReelShare();
CharSequence text = reelShare.getText();
if (Utils.isEmpty(text)) {
if (TextUtils.isEmpty(text)) {
binding.tvMessage.setVisibility(View.GONE);
} else {
if (Utils.hasMentions(text)) text = Utils.getMentionText(text); // for mentions
if (TextUtils.hasMentions(text)) text = TextUtils.getMentionText(text); // for mentions
binding.tvMessage.setText(text);
}
final DirectItemModel.DirectItemMediaModel reelShareMedia = reelShare.getMedia();

View File

@ -9,7 +9,7 @@ import awais.instagrabber.databinding.LayoutDmBaseBinding;
import awais.instagrabber.databinding.LayoutDmStoryShareBinding;
import awais.instagrabber.models.direct_messages.DirectItemModel;
import awais.instagrabber.models.enums.MediaItemType;
import awais.instagrabber.utils.Utils;
import awais.instagrabber.utils.TextUtils;
import static androidx.core.text.HtmlCompat.FROM_HTML_MODE_COMPACT;
@ -34,7 +34,7 @@ public class DirectMessageStoryShareViewHolder extends DirectMessageItemViewHold
binding.tvMessage.setVisibility(View.VISIBLE);
} else {
final String text = reelShare.getText();
if (!Utils.isEmpty(text)) {
if (!TextUtils.isEmpty(text)) {
binding.tvMessage.setText(text);
binding.tvMessage.setVisibility(View.VISIBLE);
}

View File

@ -12,7 +12,7 @@ import awais.instagrabber.databinding.LayoutDmBaseBinding;
import awais.instagrabber.databinding.LayoutDmTextBinding;
import awais.instagrabber.interfaces.MentionClickListener;
import awais.instagrabber.models.direct_messages.DirectItemModel;
import awais.instagrabber.utils.Utils;
import awais.instagrabber.utils.TextUtils;
public class DirectMessageTextViewHolder extends DirectMessageItemViewHolder {
@ -32,8 +32,8 @@ public class DirectMessageTextViewHolder extends DirectMessageItemViewHolder {
public void bindItem(final DirectItemModel directItemModel) {
final Context context = itemView.getContext();
CharSequence text = directItemModel.getText();
text = Utils.getSpannableUrl(text.toString()); // for urls
if (Utils.hasMentions(text)) text = Utils.getMentionText(text); // for mentions
text = TextUtils.getSpannableUrl(text.toString()); // for urls
if (TextUtils.hasMentions(text)) text = TextUtils.getMentionText(text); // for mentions
if (text instanceof Spanned)
binding.tvMessage.setText(text, TextView.BufferType.SPANNABLE);
else if (text == "") {

View File

@ -9,7 +9,7 @@ import androidx.annotation.NonNull;
import awais.instagrabber.databinding.LayoutDmBaseBinding;
import awais.instagrabber.databinding.LayoutDmVoiceMediaBinding;
import awais.instagrabber.models.direct_messages.DirectItemModel;
import awais.instagrabber.utils.Utils;
import awais.instagrabber.utils.NumberUtils;
public class DirectMessageVoiceMediaViewHolder extends DirectMessageItemViewHolder {
@ -61,13 +61,13 @@ public class DirectMessageVoiceMediaViewHolder extends DirectMessageItemViewHold
if (waveformData != null) binding.waveformSeekBar.setSample(waveformData);
final long durationMs = voiceMediaModel.getDurationMs();
binding.tvVoiceDuration.setText(Utils.millisToString(durationMs));
binding.tvVoiceDuration.setText(NumberUtils.millisToString(durationMs));
binding.waveformSeekBar.setProgress(voiceMediaModel.getProgress());
binding.waveformSeekBar.setProgressChangeListener((waveformSeekBar, progress, fromUser) -> {
// todo progress audio player
voiceMediaModel.setProgress(progress);
if (fromUser)
binding.tvVoiceDuration.setText(Utils.millisToString(durationMs * progress / 100));
binding.tvVoiceDuration.setText(NumberUtils.millisToString(durationMs * progress / 100));
});
binding.btnPlayVoice.setTag(voiceMediaModel);
} else {

View File

@ -16,7 +16,7 @@ import awais.instagrabber.databinding.ItemFeedTopBinding;
import awais.instagrabber.interfaces.MentionClickListener;
import awais.instagrabber.models.FeedModel;
import awais.instagrabber.models.ProfileModel;
import awais.instagrabber.utils.Utils;
import awais.instagrabber.utils.TextUtils;
public abstract class FeedItemViewHolder extends RecyclerView.ViewHolder {
public static final int MAX_CHARS = 255;
@ -71,11 +71,11 @@ public abstract class FeedItemViewHolder extends RecyclerView.ViewHolder {
final String locationId = feedModel.getLocationId();
setLocation(locationName, locationId);
CharSequence postCaption = feedModel.getPostCaption();
final boolean captionEmpty = Utils.isEmpty(postCaption);
final boolean captionEmpty = TextUtils.isEmpty(postCaption);
bottomBinding.viewerCaption.setVisibility(captionEmpty ? View.GONE : View.VISIBLE);
if (!captionEmpty) {
if (Utils.hasMentions(postCaption)) {
postCaption = Utils.getMentionText(postCaption);
if (TextUtils.hasMentions(postCaption)) {
postCaption = TextUtils.getMentionText(postCaption);
feedModel.setPostCaption(postCaption);
bottomBinding.viewerCaption.setText(postCaption, TextView.BufferType.SPANNABLE);
} else {
@ -87,7 +87,7 @@ public abstract class FeedItemViewHolder extends RecyclerView.ViewHolder {
}
private void setLocation(final String locationName, final String locationId) {
if (Utils.isEmpty(locationName)) {
if (TextUtils.isEmpty(locationName)) {
topBinding.location.setVisibility(View.GONE);
topBinding.title.setLayoutParams(new RelativeLayout.LayoutParams(
RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.MATCH_PARENT
@ -110,7 +110,7 @@ public abstract class FeedItemViewHolder extends RecyclerView.ViewHolder {
* @return isExpanded
*/
public static boolean expandCollapseTextView(@NonNull final RamboTextView textView, final CharSequence caption) {
if (Utils.isEmpty(caption)) return false;
if (TextUtils.isEmpty(caption)) return false;
final TextView.BufferType bufferType = caption instanceof Spanned ? TextView.BufferType.SPANNABLE : TextView.BufferType.NORMAL;
@ -119,16 +119,16 @@ public abstract class FeedItemViewHolder extends RecyclerView.ViewHolder {
textView.setCaptionIsExpanded(false);
return true;
}
int i = Utils.indexOfChar(caption, '\r', 0);
if (i == -1) i = Utils.indexOfChar(caption, '\n', 0);
int i = TextUtils.indexOfChar(caption, '\r', 0);
if (i == -1) i = TextUtils.indexOfChar(caption, '\n', 0);
if (i == -1) i = MAX_CHARS;
final int captionLen = caption.length();
final int minTrim = Math.min(MAX_CHARS, i);
if (captionLen <= minTrim) return false;
if (Utils.hasMentions(caption))
textView.setText(Utils.getMentionText(caption), TextView.BufferType.SPANNABLE);
if (TextUtils.hasMentions(caption))
textView.setText(TextUtils.getMentionText(caption), TextView.BufferType.SPANNABLE);
textView.setCaptionIsExpandable(true);
textView.setCaptionIsExpanded(true);
return true;

View File

@ -16,6 +16,7 @@ import com.facebook.imagepipeline.request.ImageRequestBuilder;
import awais.instagrabber.databinding.ItemFeedPhotoBinding;
import awais.instagrabber.interfaces.MentionClickListener;
import awais.instagrabber.models.FeedModel;
import awais.instagrabber.utils.TextUtils;
import awais.instagrabber.utils.Utils;
public class FeedPhotoViewHolder extends FeedItemViewHolder {
@ -50,7 +51,7 @@ public class FeedPhotoViewHolder extends FeedItemViewHolder {
binding.imageViewer.requestLayout();
final String thumbnailUrl = feedModel.getThumbnailUrl();
String url = feedModel.getDisplayUrl();
if (Utils.isEmpty(url)) url = thumbnailUrl;
if (TextUtils.isEmpty(url)) url = thumbnailUrl;
final ImageRequest requestBuilder = ImageRequestBuilder.newBuilderWithSource(Uri.parse(url))
.setLocalThumbnailPreviewsEnabled(true)
.setProgressiveRenderingEnabled(true)

View File

@ -26,6 +26,7 @@ import awais.instagrabber.databinding.ItemFeedVideoBinding;
import awais.instagrabber.interfaces.MentionClickListener;
import awais.instagrabber.models.FeedModel;
import awais.instagrabber.utils.Constants;
import awais.instagrabber.utils.NumberUtils;
import awais.instagrabber.utils.Utils;
import static awais.instagrabber.utils.Utils.settingsHelper;
@ -99,7 +100,7 @@ public class FeedVideoViewHolder extends FeedItemViewHolder {
binding.itemFeedBottom.btnMute.setVisibility(View.VISIBLE);
final ViewGroup.LayoutParams layoutParams = binding.playerView.getLayoutParams();
final int requiredWidth = Utils.displayMetrics.widthPixels;
final int resultingHeight = Utils.getResultingHeight(requiredWidth, feedModel.getImageHeight(), feedModel.getImageWidth());
final int resultingHeight = NumberUtils.getResultingHeight(requiredWidth, feedModel.getImageHeight(), feedModel.getImageWidth());
layoutParams.width = requiredWidth;
layoutParams.height = resultingHeight;
binding.playerView.requestLayout();

View File

@ -11,6 +11,8 @@ import java.net.URL;
import awais.instagrabber.models.StoryModel;
import awais.instagrabber.utils.Constants;
import awais.instagrabber.utils.CookieUtils;
import awais.instagrabber.utils.NetworkUtils;
import awais.instagrabber.utils.Utils;
import static awais.instagrabber.utils.Utils.settingsHelper;
@ -38,7 +40,7 @@ public class CommentAction extends AsyncTask<String, Void, String> {
urlConnection.setRequestProperty("User-Agent", Constants.I_USER_AGENT);
urlConnection.setUseCaches(false);
final String urlParameters = Utils.sign("{\"_csrftoken\":\"" + cookie.split("csrftoken=")[1].split(";")[0]
+ "\",\"_uid\":\"" + Utils.getUserIdFromCookie(cookie)
+ "\",\"_uid\":\"" + CookieUtils.getUserIdFromCookie(cookie)
+ "\",\"__uuid\":\"" + settingsHelper.getString(Constants.DEVICE_UUID)
+ "\",\"recipient_users\":\"[" + storyModel.getUserId() // <- string of array of number (not joking)
+ "]\"}");
@ -53,7 +55,7 @@ public class CommentAction extends AsyncTask<String, Void, String> {
wr.close();
urlConnection.connect();
if (urlConnection.getResponseCode() == HttpURLConnection.HTTP_OK) {
return new JSONObject(Utils.readFromConnection(urlConnection)).getString("thread_id");
return new JSONObject(NetworkUtils.readFromConnection(urlConnection)).getString("thread_id");
}
} catch (Throwable ex) {

View File

@ -19,7 +19,8 @@ import awais.instagrabber.interfaces.FetchListener;
import awais.instagrabber.models.CommentModel;
import awais.instagrabber.models.ProfileModel;
import awais.instagrabber.utils.Constants;
import awais.instagrabber.utils.Utils;
import awais.instagrabber.utils.NetworkUtils;
import awais.instagrabber.utils.TextUtils;
import awaisomereport.LogCollector;
import static awais.instagrabber.utils.Utils.logCollector;
@ -57,7 +58,7 @@ public final class CommentsFetcher extends AsyncTask<Void, Void, CommentModel[]>
final int childCommentsLen = childCommentModels.length;
final CommentModel lastChild = childCommentModels[childCommentsLen - 1];
if (lastChild != null && lastChild.hasNextPage() && !Utils.isEmpty(lastChild.getEndCursor())) {
if (lastChild != null && lastChild.hasNextPage() && !TextUtils.isEmpty(lastChild.getEndCursor())) {
final CommentModel[] remoteChildComments = getChildComments(commentModel.getId());
commentModel.setChildCommentModels(remoteChildComments);
lastChild.setPageCursor(false, null);
@ -94,12 +95,12 @@ public final class CommentsFetcher extends AsyncTask<Void, Void, CommentModel[]>
if (conn.getResponseCode() != HttpURLConnection.HTTP_OK) break;
else {
final JSONObject data = new JSONObject(Utils.readFromConnection(conn)).getJSONObject("data")
.getJSONObject("comment").getJSONObject("edge_threaded_comments");
final JSONObject data = new JSONObject(NetworkUtils.readFromConnection(conn)).getJSONObject("data")
.getJSONObject("comment").getJSONObject("edge_threaded_comments");
final JSONObject pageInfo = data.getJSONObject("page_info");
endCursor = pageInfo.getString("end_cursor");
if (Utils.isEmpty(endCursor)) endCursor = null;
if (TextUtils.isEmpty(endCursor)) endCursor = null;
final JSONArray childComments = data.optJSONArray("edges");
if (childComments != null) {
@ -158,12 +159,12 @@ public final class CommentsFetcher extends AsyncTask<Void, Void, CommentModel[]>
if (conn.getResponseCode() != HttpURLConnection.HTTP_OK) break;
else {
final JSONObject parentComments = new JSONObject(Utils.readFromConnection(conn)).getJSONObject("data")
.getJSONObject("shortcode_media").getJSONObject("edge_media_to_parent_comment");
final JSONObject parentComments = new JSONObject(NetworkUtils.readFromConnection(conn)).getJSONObject("data")
.getJSONObject("shortcode_media").getJSONObject("edge_media_to_parent_comment");
final JSONObject pageInfo = parentComments.getJSONObject("page_info");
endCursor = pageInfo.optString("end_cursor");
if (Utils.isEmpty(endCursor)) endCursor = null;
if (TextUtils.isEmpty(endCursor)) endCursor = null;
// final boolean containsToken = endCursor.contains("bifilter_token");
// if (!Utils.isEmpty(endCursor) && (containsToken || endCursor.contains("cached_comments_cursor"))) {
@ -216,7 +217,7 @@ public final class CommentsFetcher extends AsyncTask<Void, Void, CommentModel[]>
final boolean hasNextPage;
if ((tempJsonObject = tempJsonObject.optJSONObject("page_info")) != null) {
childEndCursor = tempJsonObject.optString("end_cursor");
hasNextPage = tempJsonObject.optBoolean("has_next_page", !Utils.isEmpty(childEndCursor));
hasNextPage = tempJsonObject.optBoolean("has_next_page", !TextUtils.isEmpty(childEndCursor));
} else {
childEndCursor = null;
hasNextPage = false;

View File

@ -21,6 +21,10 @@ import awais.instagrabber.interfaces.FetchListener;
import awais.instagrabber.models.DiscoverItemModel;
import awais.instagrabber.models.enums.MediaItemType;
import awais.instagrabber.utils.Constants;
import awais.instagrabber.utils.DownloadUtils;
import awais.instagrabber.utils.NetworkUtils;
import awais.instagrabber.utils.ResponseBodyUtils;
import awais.instagrabber.utils.TextUtils;
import awais.instagrabber.utils.Utils;
import awaisomereport.LogCollector;
@ -75,7 +79,7 @@ public final class DiscoverFetcher extends AsyncTask<Void, Void, DiscoverItemMod
urlConnection.setRequestProperty("User-Agent", Constants.I_USER_AGENT);
if (urlConnection.getResponseCode() == HttpURLConnection.HTTP_OK) {
final JSONObject discoverResponse = new JSONObject(Utils.readFromConnection(urlConnection));
final JSONObject discoverResponse = new JSONObject(NetworkUtils.readFromConnection(urlConnection));
moreAvailable = discoverResponse.getBoolean("more_available");
nextMaxId = discoverResponse.optString("next_max_id");
@ -160,12 +164,12 @@ public final class DiscoverFetcher extends AsyncTask<Void, Void, DiscoverItemMod
// comment = caption instanceof JSONObject ? ((JSONObject) caption).getString("text") : null;
// }
final MediaItemType mediaType = Utils.getMediaItemType(media.getInt("media_type"));
final MediaItemType mediaType = ResponseBodyUtils.getMediaItemType(media.getInt("media_type"));
final DiscoverItemModel model = new DiscoverItemModel(mediaType,
media.getString("pk"),
media.getString("code"),
Utils.getThumbnailUrl(media, mediaType));
ResponseBodyUtils.getThumbnailUrl(media, mediaType));
final File downloadDir = new File(Environment.getExternalStorageDirectory(), "Download" +
(Utils.settingsHelper.getBoolean(DOWNLOAD_USER_FOLDER) ? ("/" + username) : ""));
@ -174,13 +178,13 @@ public final class DiscoverFetcher extends AsyncTask<Void, Void, DiscoverItemMod
File customDir = null;
if (settingsHelper.getBoolean(FOLDER_SAVE_TO)) {
final String customPath = settingsHelper.getString(FOLDER_PATH);
if (!Utils.isEmpty(customPath)) customDir = new File(customPath +
if (!TextUtils.isEmpty(customPath)) customDir = new File(customPath +
(Utils.settingsHelper.getBoolean(DOWNLOAD_USER_FOLDER)
? "/" + username
: ""));
}
Utils.checkExistence(downloadDir, customDir, mediaType == MediaItemType.MEDIA_TYPE_SLIDER, model);
DownloadUtils.checkExistence(downloadDir, customDir, mediaType == MediaItemType.MEDIA_TYPE_SLIDER, model);
return model;
}

View File

@ -37,9 +37,9 @@ import awais.instagrabber.R;
import awais.instagrabber.interfaces.FetchListener;
import awais.instagrabber.utils.Utils;
import static awais.instagrabber.utils.Utils.CHANNEL_ID;
import static awais.instagrabber.utils.Utils.CHANNEL_NAME;
import static awais.instagrabber.utils.Utils.NOTIF_GROUP_NAME;
import static awais.instagrabber.utils.Constants.CHANNEL_ID;
import static awais.instagrabber.utils.Constants.CHANNEL_NAME;
import static awais.instagrabber.utils.Constants.NOTIF_GROUP_NAME;
import static awais.instagrabber.utils.Utils.isChannelCreated;
import static awais.instagrabber.utils.Utils.logCollector;
import static awais.instagrabber.utils.Utils.notificationManager;

View File

@ -19,7 +19,9 @@ import awais.instagrabber.models.ProfileModel;
import awais.instagrabber.models.ViewerPostModel;
import awais.instagrabber.models.enums.MediaItemType;
import awais.instagrabber.utils.Constants;
import awais.instagrabber.utils.Utils;
import awais.instagrabber.utils.NetworkUtils;
import awais.instagrabber.utils.ResponseBodyUtils;
import awais.instagrabber.utils.TextUtils;
import awaisomereport.LogCollector;
import static awais.instagrabber.utils.Utils.logCollector;
@ -63,7 +65,7 @@ public final class FeedFetcher extends AsyncTask<Void, Void, FeedModel[]> {
final HttpURLConnection urlConnection = (HttpURLConnection) new URL(url).openConnection();
if (urlConnection.getResponseCode() == HttpURLConnection.HTTP_OK) {
final String json = Utils.readFromConnection(urlConnection);
final String json = NetworkUtils.readFromConnection(urlConnection);
// Log.d(TAG, json);
final JSONObject timelineFeed = new JSONObject(json).getJSONObject("data")
.getJSONObject(Constants.EXTRAS_USER).getJSONObject("edge_web_feed_timeline");
@ -94,12 +96,12 @@ public final class FeedFetcher extends AsyncTask<Void, Void, FeedModel[]> {
final long videoViews = feedItem.optLong("video_view_count", 0);
final String displayUrl = feedItem.optString("display_url");
if (Utils.isEmpty(displayUrl)) continue;
if (TextUtils.isEmpty(displayUrl)) continue;
final String resourceUrl;
if (isVideo) resourceUrl = feedItem.getString("video_url");
else
resourceUrl = feedItem.has("display_resources") ? Utils.getHighQualityImage(feedItem) : displayUrl;
resourceUrl = feedItem.has("display_resources") ? ResponseBodyUtils.getHighQualityImage(feedItem) : displayUrl;
ProfileModel profileModel = null;
if (feedItem.has("owner")) {
@ -184,7 +186,7 @@ public final class FeedFetcher extends AsyncTask<Void, Void, FeedModel[]> {
sliderItems[j] = new ViewerPostModel(
isChildVideo ? MediaItemType.MEDIA_TYPE_VIDEO : MediaItemType.MEDIA_TYPE_IMAGE,
node.getString(Constants.EXTRAS_ID),
isChildVideo ? node.getString("video_url") : Utils.getHighQualityImage(node),
isChildVideo ? node.getString("video_url") : ResponseBodyUtils.getHighQualityImage(node),
null,
null,
null,

View File

@ -14,7 +14,7 @@ import awais.instagrabber.interfaces.FetchListener;
import awais.instagrabber.models.FeedStoryModel;
import awais.instagrabber.models.ProfileModel;
import awais.instagrabber.utils.Constants;
import awais.instagrabber.utils.Utils;
import awais.instagrabber.utils.NetworkUtils;
import awaisomereport.LogCollector.LogFile;
import static awais.instagrabber.utils.Utils.logCollector;
@ -39,7 +39,7 @@ public final class FeedStoriesFetcher extends AsyncTask<Void, Void, FeedStoryMod
conn.connect();
if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) {
final JSONArray feedStoriesReel = new JSONObject(Utils.readFromConnection(conn))
final JSONArray feedStoriesReel = new JSONObject(NetworkUtils.readFromConnection(conn))
.getJSONObject("data")
.getJSONObject(Constants.EXTRAS_USER)
.getJSONObject("feed_reels_tray")

View File

@ -13,7 +13,7 @@ import awais.instagrabber.BuildConfig;
import awais.instagrabber.interfaces.FetchListener;
import awais.instagrabber.models.FollowModel;
import awais.instagrabber.utils.Constants;
import awais.instagrabber.utils.Utils;
import awais.instagrabber.utils.NetworkUtils;
import awaisomereport.LogCollector;
import static awais.instagrabber.utils.Utils.logCollector;
@ -55,8 +55,8 @@ public final class FollowFetcher extends AsyncTask<Void, Void, FollowModel[]> {
conn.connect();
if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) {
final JSONObject data = new JSONObject(Utils.readFromConnection(conn)).getJSONObject("data")
.getJSONObject(Constants.EXTRAS_USER).getJSONObject(isFollowers ? "edge_followed_by" : "edge_follow");
final JSONObject data = new JSONObject(NetworkUtils.readFromConnection(conn)).getJSONObject("data")
.getJSONObject(Constants.EXTRAS_USER).getJSONObject(isFollowers ? "edge_followed_by" : "edge_follow");
final String endCursor;
final boolean hasNextPage;

View File

@ -9,7 +9,8 @@ import java.net.HttpURLConnection;
import java.net.URL;
import awais.instagrabber.utils.Constants;
import awais.instagrabber.utils.Utils;
import awais.instagrabber.utils.NetworkUtils;
import awais.instagrabber.utils.TextUtils;
public class GetActivityAsyncTask extends AsyncTask<Void, Void, GetActivityAsyncTask.NotificationCounts> {
private static final String TAG = "GetActivityAsyncTask";
@ -24,7 +25,7 @@ public class GetActivityAsyncTask extends AsyncTask<Void, Void, GetActivityAsync
}
protected NotificationCounts doInBackground(Void... voids) {
if (Utils.isEmpty(cookie)) {
if (TextUtils.isEmpty(cookie)) {
return null;
}
final String url = "https://www.instagram.com/graphql/query/?query_hash=0f318e8cfff9cc9ef09f88479ff571fb"
@ -39,9 +40,9 @@ public class GetActivityAsyncTask extends AsyncTask<Void, Void, GetActivityAsync
if (urlConnection.getResponseCode() != HttpURLConnection.HTTP_OK) {
return null;
}
final JSONObject data = new JSONObject(Utils.readFromConnection(urlConnection)).getJSONObject("data")
.getJSONObject("user").getJSONObject("edge_activity_count").getJSONArray("edges").getJSONObject(0)
.getJSONObject("node");
final JSONObject data = new JSONObject(NetworkUtils.readFromConnection(urlConnection)).getJSONObject("data")
.getJSONObject("user").getJSONObject("edge_activity_count").getJSONArray("edges").getJSONObject(0)
.getJSONObject("node");
return new NotificationCounts(
data.getInt("relationships"),
data.getInt("usertags"),

View File

@ -15,7 +15,7 @@ import awais.instagrabber.BuildConfig;
import awais.instagrabber.interfaces.FetchListener;
import awais.instagrabber.models.HashtagModel;
import awais.instagrabber.utils.Constants;
import awais.instagrabber.utils.Utils;
import awais.instagrabber.utils.NetworkUtils;
import awaisomereport.LogCollector;
import static awais.instagrabber.utils.Utils.logCollector;
@ -40,7 +40,7 @@ public final class HashtagFetcher extends AsyncTask<Void, Void, HashtagModel> {
conn.connect();
if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) {
final JSONObject user = new JSONObject(Utils.readFromConnection(conn)).getJSONObject("graphql").getJSONObject(Constants.EXTRAS_HASHTAG);
final JSONObject user = new JSONObject(NetworkUtils.readFromConnection(conn)).getJSONObject("graphql").getJSONObject(Constants.EXTRAS_HASHTAG);
final JSONObject timelineMedia = user.getJSONObject("edge_hashtag_to_media");
if (timelineMedia.has("edges")) {

View File

@ -15,7 +15,7 @@ import awais.instagrabber.BuildConfig;
import awais.instagrabber.interfaces.FetchListener;
import awais.instagrabber.models.HighlightModel;
import awais.instagrabber.utils.Constants;
import awais.instagrabber.utils.Utils;
import awais.instagrabber.utils.NetworkUtils;
public final class HighlightsFetcher extends AsyncTask<Void, Void, List<HighlightModel>> {
private final String id;
@ -41,7 +41,7 @@ public final class HighlightsFetcher extends AsyncTask<Void, Void, List<Highligh
conn.connect();
if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) {
final JSONArray highlightsReel = new JSONObject(Utils.readFromConnection(conn)).getJSONArray("tray");
final JSONArray highlightsReel = new JSONObject(NetworkUtils.readFromConnection(conn)).getJSONArray("tray");
final int length = highlightsReel.length();
final List<HighlightModel> highlightModels = new ArrayList<>();

View File

@ -21,7 +21,8 @@ import java.util.Map;
import java.util.UUID;
import awais.instagrabber.models.ImageUploadOptions;
import awais.instagrabber.utils.Utils;
import awais.instagrabber.utils.NetworkUtils;
import awais.instagrabber.utils.NumberUtils;
public class ImageUploader extends AsyncTask<ImageUploadOptions, Void, ImageUploader.ImageUploadResponse> {
private static final String TAG = "ImageUploader";
@ -51,7 +52,7 @@ public class ImageUploader extends AsyncTask<ImageUploadOptions, Void, ImageUplo
final String contentLength = String.valueOf(bytes.length);
final Map<String, String> headers = new HashMap<>();
final String uploadId = String.valueOf(new Date().getTime());
final long random = Utils.random(LOWER, UPPER + 1);
final long random = NumberUtils.random(LOWER, UPPER + 1);
final String name = String.format("%s_0_%s", uploadId, random);
final String waterfallId = options.getWaterfallId() != null ? options.getWaterfallId() : UUID.randomUUID().toString();
headers.put("X-Entity-Type", "image/jpeg");
@ -68,7 +69,7 @@ public class ImageUploader extends AsyncTask<ImageUploadOptions, Void, ImageUplo
connection.setRequestMethod("POST");
connection.setUseCaches(false);
connection.setDoOutput(true);
Utils.setConnectionHeaders(connection, headers);
NetworkUtils.setConnectionHeaders(connection, headers);
out = new BufferedOutputStream(connection.getOutputStream());
out.write(bytes);
out.flush();

View File

@ -15,7 +15,7 @@ import awais.instagrabber.BuildConfig;
import awais.instagrabber.interfaces.FetchListener;
import awais.instagrabber.models.LocationModel;
import awais.instagrabber.utils.Constants;
import awais.instagrabber.utils.Utils;
import awais.instagrabber.utils.NetworkUtils;
import awaisomereport.LogCollector;
import static awais.instagrabber.utils.Utils.logCollector;
@ -44,8 +44,8 @@ public final class LocationFetcher extends AsyncTask<Void, Void, LocationModel>
conn.connect();
if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) {
final JSONObject location = new JSONObject(Utils.readFromConnection(conn)).getJSONObject("graphql")
.getJSONObject(Constants.EXTRAS_LOCATION);
final JSONObject location = new JSONObject(NetworkUtils.readFromConnection(conn)).getJSONObject("graphql")
.getJSONObject(Constants.EXTRAS_LOCATION);
final JSONObject timelineMedia = location.getJSONObject("edge_location_to_media");
// if (timelineMedia.has("edges")) {

View File

@ -14,8 +14,9 @@ import awais.instagrabber.interfaces.FetchListener;
import awais.instagrabber.models.NotificationModel;
import awais.instagrabber.models.enums.NotificationType;
import awais.instagrabber.utils.Constants;
import awais.instagrabber.utils.CookieUtils;
import awais.instagrabber.utils.LocaleUtils;
import awais.instagrabber.utils.Utils;
import awais.instagrabber.utils.NetworkUtils;
import awaisomereport.LogCollector;
import static awais.instagrabber.utils.Utils.logCollector;
@ -32,7 +33,7 @@ public final class NotificationsFetcher extends AsyncTask<Void, Void, Notificati
protected NotificationModel[] doInBackground(final Void... voids) {
NotificationModel[] result = null;
final String url = "https://www.instagram.com/accounts/activity/?__a=1";
Utils.setupCookies(settingsHelper.getString(Constants.COOKIE));
CookieUtils.setupCookies(settingsHelper.getString(Constants.COOKIE));
try {
final HttpURLConnection conn = (HttpURLConnection) new URL(url).openConnection();
@ -42,41 +43,52 @@ public final class NotificationsFetcher extends AsyncTask<Void, Void, Notificati
conn.connect();
if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) {
JSONObject page = new JSONObject(Utils.readFromConnection(conn)).getJSONObject("graphql").getJSONObject("user"),
JSONObject page = new JSONObject(NetworkUtils.readFromConnection(conn)).getJSONObject("graphql").getJSONObject("user"),
ewaf = page.getJSONObject("activity_feed").optJSONObject("edge_web_activity_feed"),
efr = page.optJSONObject("edge_follow_requests"),
data;
JSONArray media;
int totalLength = 0, mediaLen = 0, reqLen = 0;
// int totalLength = 0;
int mediaLen = 0;
int reqLen = 0;
NotificationModel[] models = null, req = null;
if ((media = ewaf.optJSONArray("edges")) != null && media.length() > 0 &&
(data = media.optJSONObject(0).optJSONObject("node")) != null) {
if (ewaf != null
&& (media = ewaf.optJSONArray("edges")) != null
&& media.length() > 0
&& media.optJSONObject(0).optJSONObject("node") != null) {
mediaLen = media.length();
models = new NotificationModel[mediaLen];
for (int i = 0; i < mediaLen; ++i) {
data = media.optJSONObject(i).optJSONObject("node");
if (Utils.getNotifType(data.getString("__typename")) == null) continue;
models[i] = new NotificationModel(data.getString(Constants.EXTRAS_ID),
if (data == null) continue;
final String type = data.getString("__typename");
final NotificationType notificationType = NotificationType.valueOfType(type);
if (notificationType == null) continue;
models[i] = new NotificationModel(
data.getString(Constants.EXTRAS_ID),
data.optString("text"), // comments or mentions
data.getLong("timestamp"),
data.getJSONObject("user").getString("username"),
data.getJSONObject("user").getString("profile_pic_url"),
!data.isNull("media") ? data.getJSONObject("media").getString("shortcode") : null,
!data.isNull("media") ? data.getJSONObject("media").getString("thumbnail_src") : null,
Utils.getNotifType(data.getString("__typename")));
notificationType);
}
}
if (efr != null && (media = efr.optJSONArray("edges")) != null && media.length() > 0 &&
(data = media.optJSONObject(0).optJSONObject("node")) != null) {
if (efr != null
&& (media = efr.optJSONArray("edges")) != null
&& media.length() > 0
&& media.optJSONObject(0).optJSONObject("node") != null) {
reqLen = media.length();
req = new NotificationModel[reqLen];
for (int i = 0; i < reqLen; ++i) {
data = media.optJSONObject(i).optJSONObject("node");
if (data == null) continue;
req[i] = new NotificationModel(data.getString(Constants.EXTRAS_ID),
data.optString("full_name"), 0L, data.getString("username"),
data.getString("profile_pic_url"), null, null, NotificationType.REQUEST);
data.optString("full_name"), 0L, data.getString("username"),
data.getString("profile_pic_url"), null, null, NotificationType.REQUEST);
}
}

View File

@ -16,6 +16,11 @@ import awais.instagrabber.models.ProfileModel;
import awais.instagrabber.models.ViewerPostModel;
import awais.instagrabber.models.enums.MediaItemType;
import awais.instagrabber.utils.Constants;
import awais.instagrabber.utils.CookieUtils;
import awais.instagrabber.utils.DownloadUtils;
import awais.instagrabber.utils.NetworkUtils;
import awais.instagrabber.utils.ResponseBodyUtils;
import awais.instagrabber.utils.TextUtils;
import awais.instagrabber.utils.Utils;
import awaisomereport.LogCollector;
@ -38,7 +43,7 @@ public final class PostFetcher extends AsyncTask<Void, Void, ViewerPostModel[]>
@Override
protected ViewerPostModel[] doInBackground(final Void... voids) {
ViewerPostModel[] result = null;
Utils.setupCookies(Utils.settingsHelper.getString(Constants.COOKIE)); // <- direct download
CookieUtils.setupCookies(Utils.settingsHelper.getString(Constants.COOKIE)); // <- direct download
try {
final HttpURLConnection conn = (HttpURLConnection) new URL("https://www.instagram.com/p/" + shortCode + "/?__a=1").openConnection();
conn.setUseCaches(false);
@ -46,8 +51,8 @@ public final class PostFetcher extends AsyncTask<Void, Void, ViewerPostModel[]>
if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) {
final JSONObject media = new JSONObject(Utils.readFromConnection(conn)).getJSONObject("graphql")
.getJSONObject("shortcode_media");
final JSONObject media = new JSONObject(NetworkUtils.readFromConnection(conn)).getJSONObject("graphql")
.getJSONObject("shortcode_media");
ProfileModel profileModel = null;
if (media.has("owner")) {
@ -82,7 +87,7 @@ public final class PostFetcher extends AsyncTask<Void, Void, ViewerPostModel[]>
(Utils.settingsHelper.getBoolean(DOWNLOAD_USER_FOLDER)
? ("/" + username)
: ""));
if (!Utils.isEmpty(customPath)) customDir = new File(customPath);
if (!TextUtils.isEmpty(customPath)) customDir = new File(customPath);
}
final long timestamp = media.getLong("taken_at_timestamp");
@ -116,9 +121,9 @@ public final class PostFetcher extends AsyncTask<Void, Void, ViewerPostModel[]>
final ViewerPostModel postModel = new ViewerPostModel(
mediaItemType,
media.getString(Constants.EXTRAS_ID),
isVideo ? media.getString("video_url") : Utils.getHighQualityImage(media),
isVideo ? media.getString("video_url") : ResponseBodyUtils.getHighQualityImage(media),
shortCode,
Utils.isEmpty(postCaption) ? null : postCaption,
TextUtils.isEmpty(postCaption) ? null : postCaption,
profileModel,
isVideo && media.has("video_view_count") ? media.getLong("video_view_count") : -1,
timestamp, media.getBoolean("viewer_has_liked"), media.getBoolean("viewer_has_saved"),
@ -130,7 +135,7 @@ public final class PostFetcher extends AsyncTask<Void, Void, ViewerPostModel[]>
postModel.setCommentsCount(commentsCount);
Utils.checkExistence(downloadDir, customDir, false, postModel);
DownloadUtils.checkExistence(downloadDir, customDir, false, postModel);
result = new ViewerPostModel[]{postModel};
@ -145,7 +150,7 @@ public final class PostFetcher extends AsyncTask<Void, Void, ViewerPostModel[]>
postModels[i] = new ViewerPostModel(
isChildVideo ? MediaItemType.MEDIA_TYPE_VIDEO : MediaItemType.MEDIA_TYPE_IMAGE,
media.getString(Constants.EXTRAS_ID),
isChildVideo ? node.getString("video_url") : Utils.getHighQualityImage(node),
isChildVideo ? node.getString("video_url") : ResponseBodyUtils.getHighQualityImage(node),
node.getString(Constants.EXTRAS_SHORTCODE),
postCaption,
profileModel,
@ -158,7 +163,7 @@ public final class PostFetcher extends AsyncTask<Void, Void, ViewerPostModel[]>
media.getJSONObject("location").optString("slug")));
postModels[i].setSliderDisplayUrl(node.getString("display_url"));
Utils.checkExistence(downloadDir, customDir, true, postModels[i]);
DownloadUtils.checkExistence(downloadDir, customDir, true, postModels[i]);
}
postModels[0].setCommentsCount(commentsCount);

View File

@ -17,6 +17,9 @@ import awais.instagrabber.models.PostModel;
import awais.instagrabber.models.enums.MediaItemType;
import awais.instagrabber.models.enums.PostItemType;
import awais.instagrabber.utils.Constants;
import awais.instagrabber.utils.DownloadUtils;
import awais.instagrabber.utils.NetworkUtils;
import awais.instagrabber.utils.TextUtils;
import awais.instagrabber.utils.Utils;
import awaisomereport.LogCollector;
@ -92,14 +95,14 @@ public final class PostsFetcher extends AsyncTask<Void, Void, PostModel[]> {
(Utils.settingsHelper.getBoolean(DOWNLOAD_USER_FOLDER)
? ("/" + username)
: ""));
if (!Utils.isEmpty(customPath)) customDir = new File(customPath);
if (!TextUtils.isEmpty(customPath)) customDir = new File(customPath);
}
final boolean isHashtag = type == PostItemType.HASHTAG;
final boolean isLocation = type == PostItemType.LOCATION;
final boolean isSaved = type == PostItemType.SAVED;
final boolean isTagged = type == PostItemType.TAGGED;
final JSONObject mediaPosts = new JSONObject(Utils.readFromConnection(conn))
final JSONObject mediaPosts = new JSONObject(NetworkUtils.readFromConnection(conn))
.getJSONObject("data")
.getJSONObject(isHashtag
? Constants.EXTRAS_HASHTAG
@ -143,7 +146,7 @@ public final class PostsFetcher extends AsyncTask<Void, Void, PostModel[]> {
mediaNode.getLong("taken_at_timestamp"), mediaNode.optBoolean("viewer_has_liked"),
mediaNode.optBoolean("viewer_has_saved"), mediaNode.getJSONObject("edge_liked_by").getLong("count"));
Utils.checkExistence(downloadDir, customDir, isSlider, models[i]);
DownloadUtils.checkExistence(downloadDir, customDir, isSlider, models[i]);
}
if (models.length != 0 && models[models.length - 1] != null)

View File

@ -15,7 +15,8 @@ import awais.instagrabber.BuildConfig;
import awais.instagrabber.interfaces.FetchListener;
import awais.instagrabber.models.ProfileModel;
import awais.instagrabber.utils.Constants;
import awais.instagrabber.utils.Utils;
import awais.instagrabber.utils.NetworkUtils;
import awais.instagrabber.utils.TextUtils;
import awaisomereport.LogCollector;
import static awais.instagrabber.utils.Utils.logCollector;
@ -40,7 +41,7 @@ public final class ProfileFetcher extends AsyncTask<Void, Void, ProfileModel> {
conn.connect();
if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) {
final JSONObject user = new JSONObject(Utils.readFromConnection(conn)).getJSONObject("graphql").getJSONObject(Constants.EXTRAS_USER);
final JSONObject user = new JSONObject(NetworkUtils.readFromConnection(conn)).getJSONObject("graphql").getJSONObject(Constants.EXTRAS_USER);
boolean isPrivate = user.getBoolean("is_private");
boolean reallyPrivate = isPrivate;
@ -51,7 +52,7 @@ public final class ProfileFetcher extends AsyncTask<Void, Void, ProfileModel> {
}
String url = user.optString("external_url");
if (Utils.isEmpty(url)) url = null;
if (TextUtils.isEmpty(url)) url = null;
result = new ProfileModel(isPrivate,
reallyPrivate,

View File

@ -15,6 +15,8 @@ import java.net.URL;
import awais.instagrabber.BuildConfig;
import awais.instagrabber.interfaces.FetchListener;
import awais.instagrabber.utils.Constants;
import awais.instagrabber.utils.NetworkUtils;
import awais.instagrabber.utils.TextUtils;
import awais.instagrabber.utils.Utils;
import awaisomereport.LogCollector;
@ -45,26 +47,26 @@ public final class ProfilePictureFetcher extends AsyncTask<Void, Void, String> {
conn.setRequestMethod("GET");
conn.setRequestProperty("User-Agent", Constants.USER_AGENT);
final String result = conn.getResponseCode() == HttpURLConnection.HTTP_OK ? Utils.readFromConnection(conn) : null;
final String result = conn.getResponseCode() == HttpURLConnection.HTTP_OK ? NetworkUtils.readFromConnection(conn) : null;
conn.disconnect();
if (!Utils.isEmpty(result)) {
if (!TextUtils.isEmpty(result)) {
JSONObject data = new JSONObject(result).getJSONObject("user");
if (data.has("hd_profile_pic_url_info"))
out = data.getJSONObject("hd_profile_pic_url_info").optString("url");
}
if (Utils.isEmpty(out) && Utils.settingsHelper.getBoolean(Constants.INSTADP)) {
if (TextUtils.isEmpty(out) && Utils.settingsHelper.getBoolean(Constants.INSTADP)) {
final HttpURLConnection backup =
(HttpURLConnection) new URL("https://instadp.com/fullsize/" + userName).openConnection();
backup.setUseCaches(false);
backup.setRequestMethod("GET");
backup.setRequestProperty("User-Agent", Constants.A_USER_AGENT);
final String instadp = backup.getResponseCode() == HttpURLConnection.HTTP_OK ? Utils.readFromConnection(backup) : null;
final String instadp = backup.getResponseCode() == HttpURLConnection.HTTP_OK ? NetworkUtils.readFromConnection(backup) : null;
backup.disconnect();
if (!Utils.isEmpty(instadp)) {
if (!TextUtils.isEmpty(instadp)) {
final Document doc = Jsoup.parse(instadp);
boolean fallback = false;
@ -86,7 +88,7 @@ public final class ProfilePictureFetcher extends AsyncTask<Void, Void, String> {
}
}
}
if (Utils.isEmpty(out)) out = picUrl;
if (TextUtils.isEmpty(out)) out = picUrl;
} catch (final Exception e) {
if (logCollector != null)
logCollector.appendException(e, LogCollector.LogFile.ASYNC_PROFILE_PICTURE_FETCHER, "doInBackground");

View File

@ -13,6 +13,7 @@ import java.util.UUID;
import awais.instagrabber.models.StoryModel;
import awais.instagrabber.models.stickers.QuizModel;
import awais.instagrabber.utils.Constants;
import awais.instagrabber.utils.CookieUtils;
import awais.instagrabber.utils.Utils;
import static awais.instagrabber.utils.Utils.settingsHelper;
@ -43,7 +44,7 @@ public class QuizAction extends AsyncTask<Integer, Void, Integer> {
JSONObject ogBody = new JSONObject("{\"client_context\":\"" + UUID.randomUUID().toString()
+ "\",\"mutation_token\":\"" + UUID.randomUUID().toString()
+ "\",\"_csrftoken\":\"" + cookie.split("csrftoken=")[1].split(";")[0]
+ "\",\"_uid\":\"" + Utils.getUserIdFromCookie(cookie)
+ "\",\"_uid\":\"" + CookieUtils.getUserIdFromCookie(cookie)
+ "\",\"__uuid\":\"" + settingsHelper.getString(Constants.DEVICE_UUID)
+ "\"}");
ogBody.put("answer", String.valueOf(choice));

View File

@ -13,6 +13,7 @@ import java.util.UUID;
import awais.instagrabber.models.StoryModel;
import awais.instagrabber.models.stickers.QuestionModel;
import awais.instagrabber.utils.Constants;
import awais.instagrabber.utils.CookieUtils;
import awais.instagrabber.utils.Utils;
import static awais.instagrabber.utils.Utils.settingsHelper;
@ -42,7 +43,7 @@ public class RespondAction extends AsyncTask<String, Void, Boolean> {
final JSONObject ogbody = new JSONObject("{\"client_context\":\"" + UUID.randomUUID().toString()
+ "\",\"mutation_token\":\"" + UUID.randomUUID().toString()
+ "\",\"_csrftoken\":\"" + cookie.split("csrftoken=")[1].split(";")[0]
+ "\",\"_uid\":\"" + Utils.getUserIdFromCookie(cookie)
+ "\",\"_uid\":\"" + CookieUtils.getUserIdFromCookie(cookie)
+ "\",\"__uuid\":\"" + settingsHelper.getString(Constants.DEVICE_UUID)
+ "\"}");
String choice = rawChoice[0].replaceAll("\"", ("\\\""));

View File

@ -8,7 +8,7 @@ import java.net.HttpURLConnection;
import java.net.URL;
import awais.instagrabber.models.StoryModel;
import awais.instagrabber.utils.Utils;
import awais.instagrabber.utils.NetworkUtils;
public class SeenAction extends AsyncTask<Void, Void, Void> {
private static final String TAG = "SeenAction";
@ -41,7 +41,7 @@ public class SeenAction extends AsyncTask<Void, Void, Void> {
wr.flush();
wr.close();
urlConnection.connect();
Log.d(TAG, urlConnection.getResponseCode() + " " + Utils.readFromConnection(urlConnection));
Log.d(TAG, urlConnection.getResponseCode() + " " + NetworkUtils.readFromConnection(urlConnection));
urlConnection.disconnect();
} catch (Throwable ex) {
Log.e(TAG, "Error", ex);

View File

@ -17,8 +17,8 @@ import awais.instagrabber.interfaces.FetchListener;
import awais.instagrabber.models.SuggestionModel;
import awais.instagrabber.models.enums.SuggestionType;
import awais.instagrabber.utils.Constants;
import awais.instagrabber.utils.NetworkUtils;
import awais.instagrabber.utils.UrlEncoder;
import awais.instagrabber.utils.Utils;
public final class SuggestionsFetcher extends AsyncTask<String, String, SuggestionModel[]> {
private final FetchListener<SuggestionModel[]> fetchListener;
@ -43,7 +43,7 @@ public final class SuggestionsFetcher extends AsyncTask<String, String, Suggesti
if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) {
final String defaultHashTagPic = "https://www.instagram.com/static/images/hashtag/search-hashtag-default-avatar.png/1d8417c9a4f5.png";
final JSONObject jsonObject = new JSONObject(Utils.readFromConnection(conn));
final JSONObject jsonObject = new JSONObject(NetworkUtils.readFromConnection(conn));
conn.disconnect();
final JSONArray usersArray = jsonObject.getJSONArray("users");

View File

@ -13,7 +13,7 @@ import java.net.URL;
import awais.instagrabber.BuildConfig;
import awais.instagrabber.interfaces.FetchListener;
import awais.instagrabber.utils.Constants;
import awais.instagrabber.utils.Utils;
import awais.instagrabber.utils.NetworkUtils;
public final class UsernameFetcher extends AsyncTask<Void, Void, String> {
private final FetchListener<String> fetchListener;
@ -36,7 +36,7 @@ public final class UsernameFetcher extends AsyncTask<Void, Void, String> {
final JSONObject user;
if (conn.getResponseCode() == HttpURLConnection.HTTP_OK &&
(user = new JSONObject(Utils.readFromConnection(conn)).optJSONObject(Constants.EXTRAS_USER)) != null)
(user = new JSONObject(NetworkUtils.readFromConnection(conn)).optJSONObject(Constants.EXTRAS_USER)) != null)
result = user.getString(Constants.EXTRAS_USERNAME);
conn.disconnect();

View File

@ -18,7 +18,9 @@ import awais.instagrabber.models.direct_messages.InboxThreadModel;
import awais.instagrabber.models.enums.UserInboxDirection;
import awais.instagrabber.utils.Constants;
import awais.instagrabber.utils.LocaleUtils;
import awais.instagrabber.utils.Utils;
import awais.instagrabber.utils.NetworkUtils;
import awais.instagrabber.utils.ResponseBodyUtils;
import awais.instagrabber.utils.TextUtils;
import static awais.instagrabber.utils.Utils.logCollector;
import static awaisomereport.LogCollector.LogFile;
@ -48,10 +50,10 @@ public final class DirectMessageInboxThreadFetcher extends AsyncTask<Void, Void,
final Map<String, String> queryParamsMap = new HashMap<>();
queryParamsMap.put("visual_message_return_type", "unseen");
if (direction != null) queryParamsMap.put("direction", direction.getValue());
if (!Utils.isEmpty(endCursor)) {
if (!TextUtils.isEmpty(endCursor)) {
queryParamsMap.put("cursor", endCursor);
}
final String queryString = Utils.getQueryString(queryParamsMap);
final String queryString = NetworkUtils.getQueryString(queryParamsMap);
final String url = "https://i.instagram.com/api/v1/direct_v2/threads/" + id + "/?" + queryString;
try {
final HttpURLConnection conn = (HttpURLConnection) new URL(url).openConnection();
@ -60,8 +62,8 @@ public final class DirectMessageInboxThreadFetcher extends AsyncTask<Void, Void,
conn.setUseCaches(false);
if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) {
final JSONObject data = new JSONObject(Utils.readFromConnection(conn)).getJSONObject("thread");
result = Utils.createInboxThreadModel(data, true);
final JSONObject data = new JSONObject(NetworkUtils.readFromConnection(conn)).getJSONObject("thread");
result = ResponseBodyUtils.createInboxThreadModel(data, true);
}
conn.disconnect();

View File

@ -19,6 +19,7 @@ import java.util.Map;
import java.util.UUID;
import awais.instagrabber.utils.Constants;
import awais.instagrabber.utils.CookieUtils;
import awais.instagrabber.utils.Utils;
import static awais.instagrabber.utils.Utils.settingsHelper;
@ -43,8 +44,8 @@ public class DirectThreadBroadcaster extends AsyncTask<DirectThreadBroadcaster.B
final String cookie = settingsHelper.getString(Constants.COOKIE);
final String cc = UUID.randomUUID().toString();
final Map<String, String> form = new HashMap<>();
form.put("_csrftoken", Utils.getCsrfTokenFromCookie(cookie));
form.put("_uid", Utils.getUserIdFromCookie(cookie));
form.put("_csrftoken", CookieUtils.getCsrfTokenFromCookie(cookie));
form.put("_uid", CookieUtils.getUserIdFromCookie(cookie));
form.put("__uuid", settingsHelper.getString(Constants.DEVICE_UUID));
form.put("client_context", cc);
form.put("mutation_token", cc);

View File

@ -20,7 +20,9 @@ import awais.instagrabber.models.direct_messages.InboxModel;
import awais.instagrabber.models.direct_messages.InboxThreadModel;
import awais.instagrabber.utils.Constants;
import awais.instagrabber.utils.LocaleUtils;
import awais.instagrabber.utils.Utils;
import awais.instagrabber.utils.NetworkUtils;
import awais.instagrabber.utils.ResponseBodyUtils;
import awais.instagrabber.utils.TextUtils;
import static awais.instagrabber.utils.Utils.logCollector;
import static awaisomereport.LogCollector.LogFile;
@ -32,7 +34,7 @@ public final class InboxFetcher extends AsyncTask<Void, Void, InboxModel> {
private final FetchListener<InboxModel> fetchListener;
public InboxFetcher(final String endCursor, final FetchListener<InboxModel> fetchListener) {
this.endCursor = Utils.isEmpty(endCursor) ? "" : "?cursor=" + endCursor;
this.endCursor = TextUtils.isEmpty(endCursor) ? "" : "?cursor=" + endCursor;
this.fetchListener = fetchListener;
}
@ -63,7 +65,7 @@ public final class InboxFetcher extends AsyncTask<Void, Void, InboxModel> {
conn.disconnect();
return null;
}
JSONObject data = new JSONObject(Utils.readFromConnection(conn));
JSONObject data = new JSONObject(NetworkUtils.readFromConnection(conn));
// try (FileWriter fileWriter = new FileWriter(new File("/sdcard/test.json"))) {
// fileWriter.write(data.toString(2));
// }
@ -88,7 +90,7 @@ public final class InboxFetcher extends AsyncTask<Void, Void, InboxModel> {
inboxThreadModels = new InboxThreadModel[threadsLen];
for (int i = 0; i < threadsLen; ++i)
inboxThreadModels[i] = Utils.createInboxThreadModel(threadsArray.getJSONObject(i), false);
inboxThreadModels[i] = ResponseBodyUtils.createInboxThreadModel(threadsArray.getJSONObject(i), false);
}
result = new InboxModel(hasOlder, hasPendingTopRequests,

View File

@ -16,6 +16,10 @@ import awais.instagrabber.interfaces.FetchListener;
import awais.instagrabber.models.PostModel;
import awais.instagrabber.models.enums.MediaItemType;
import awais.instagrabber.utils.Constants;
import awais.instagrabber.utils.DownloadUtils;
import awais.instagrabber.utils.NetworkUtils;
import awais.instagrabber.utils.ResponseBodyUtils;
import awais.instagrabber.utils.TextUtils;
import awais.instagrabber.utils.Utils;
import awaisomereport.LogCollector;
@ -50,7 +54,7 @@ public final class iLikedFetcher extends AsyncTask<Void, Void, PostModel[]> {
conn.connect();
if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) {
final JSONObject body = new JSONObject(Utils.readFromConnection(conn));
final JSONObject body = new JSONObject(NetworkUtils.readFromConnection(conn));
final String endCursor;
final boolean hasNextPage;
@ -77,12 +81,12 @@ public final class iLikedFetcher extends AsyncTask<Void, Void, PostModel[]> {
else itemType = MediaItemType.MEDIA_TYPE_IMAGE;
models[i] = new PostModel(itemType, mediaNode.getString(Constants.EXTRAS_ID),
isSlider
? Utils.getHighQualityImage(mediaNode.getJSONArray("carousel_media").getJSONObject(0))
: Utils.getHighQualityImage(mediaNode),
isSlider
? Utils.getLowQualityImage(mediaNode.getJSONArray("carousel_media").getJSONObject(0))
: Utils.getLowQualityImage(mediaNode),
isSlider
? ResponseBodyUtils.getHighQualityImage(mediaNode.getJSONArray("carousel_media").getJSONObject(0))
: ResponseBodyUtils.getHighQualityImage(mediaNode),
isSlider
? ResponseBodyUtils.getLowQualityImage(mediaNode.getJSONArray("carousel_media").getJSONObject(0))
: ResponseBodyUtils.getLowQualityImage(mediaNode),
mediaNode.getString("code"),
mediaNode.isNull("caption") ? null : mediaNode.getJSONObject("caption").optString("text"),
mediaNode.getLong("taken_at"), true,
@ -95,9 +99,9 @@ public final class iLikedFetcher extends AsyncTask<Void, Void, PostModel[]> {
if (Utils.settingsHelper.getBoolean(FOLDER_SAVE_TO)) {
final String customPath = Utils.settingsHelper.getString(FOLDER_PATH +
(Utils.settingsHelper.getBoolean(DOWNLOAD_USER_FOLDER) ? ("/"+username) : ""));
if (!Utils.isEmpty(customPath)) customDir = new File(customPath);
if (!TextUtils.isEmpty(customPath)) customDir = new File(customPath);
}
Utils.checkExistence(downloadDir, customDir, isSlider, models[i]);
DownloadUtils.checkExistence(downloadDir, customDir, isSlider, models[i]);
}
if (models[models.length - 1] != null)

View File

@ -17,6 +17,10 @@ import awais.instagrabber.models.ProfileModel;
import awais.instagrabber.models.ViewerPostModel;
import awais.instagrabber.models.enums.MediaItemType;
import awais.instagrabber.utils.Constants;
import awais.instagrabber.utils.DownloadUtils;
import awais.instagrabber.utils.NetworkUtils;
import awais.instagrabber.utils.ResponseBodyUtils;
import awais.instagrabber.utils.TextUtils;
import awais.instagrabber.utils.Utils;
import awaisomereport.LogCollector;
@ -46,7 +50,7 @@ public final class iPostFetcher extends AsyncTask<Void, Void, ViewerPostModel[]>
conn.connect();
if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) {
final JSONObject media = new JSONObject(Utils.readFromConnection(conn))
final JSONObject media = new JSONObject(NetworkUtils.readFromConnection(conn))
.getJSONArray("items")
.getJSONObject(0);
ProfileModel profileModel = null;
@ -94,7 +98,7 @@ public final class iPostFetcher extends AsyncTask<Void, Void, ViewerPostModel[]>
if (Utils.settingsHelper.getBoolean(FOLDER_SAVE_TO)) {
final String customPath = Utils.settingsHelper.getString(FOLDER_PATH)
+ (shouldDownloadToUserFolder ? "/" + profileModel.getUsername() : "");
if (!Utils.isEmpty(customPath)) customDir = new File(customPath);
if (!TextUtils.isEmpty(customPath)) customDir = new File(customPath);
}
final long timestamp = media.getLong("taken_at");
@ -130,10 +134,10 @@ public final class iPostFetcher extends AsyncTask<Void, Void, ViewerPostModel[]>
final ViewerPostModel postModel = new ViewerPostModel(
mediaItemType,
media.getString(Constants.EXTRAS_ID),
isVideo ? Utils.getHighQualityPost(media.optJSONArray("video_versions"), true, true, false)
: Utils.getHighQualityImage(media),
isVideo ? ResponseBodyUtils.getHighQualityPost(media.optJSONArray("video_versions"), true, true, false)
: ResponseBodyUtils.getHighQualityImage(media),
media.getString("code"),
Utils.isEmpty(postCaption) ? null : postCaption,
TextUtils.isEmpty(postCaption) ? null : postCaption,
profileModel,
isVideo && media.has("view_count") ? media.getLong("view_count") : -1,
timestamp, media.optBoolean("has_liked"),
@ -144,7 +148,7 @@ public final class iPostFetcher extends AsyncTask<Void, Void, ViewerPostModel[]>
postModel.setCommentsCount(commentsCount);
Utils.checkExistence(downloadDir, customDir, false, postModel);
DownloadUtils.checkExistence(downloadDir, customDir, false, postModel);
result = new ViewerPostModel[]{postModel};
@ -160,8 +164,8 @@ public final class iPostFetcher extends AsyncTask<Void, Void, ViewerPostModel[]>
isChildVideo ? MediaItemType.MEDIA_TYPE_VIDEO
: MediaItemType.MEDIA_TYPE_IMAGE,
media.getString(Constants.EXTRAS_ID),
isChildVideo ? Utils.getHighQualityPost(node.optJSONArray("video_versions"), true, true, false)
: Utils.getHighQualityImage(node),
isChildVideo ? ResponseBodyUtils.getHighQualityPost(node.optJSONArray("video_versions"), true, true, false)
: ResponseBodyUtils.getHighQualityImage(node),
media.getString("code"),
postCaption,
profileModel,
@ -171,8 +175,8 @@ public final class iPostFetcher extends AsyncTask<Void, Void, ViewerPostModel[]>
media.getLong("like_count"),
locationName,
locationId);
postModels[i].setSliderDisplayUrl(Utils.getHighQualityImage(node));
Utils.checkExistence(downloadDir, customDir, true, postModels[i]);
postModels[i].setSliderDisplayUrl(ResponseBodyUtils.getHighQualityImage(node));
DownloadUtils.checkExistence(downloadDir, customDir, true, postModels[i]);
}
postModels[0].setCommentsCount(commentsCount);

View File

@ -19,7 +19,8 @@ import awais.instagrabber.models.stickers.QuizModel;
import awais.instagrabber.models.stickers.SwipeUpModel;
import awais.instagrabber.utils.Constants;
import awais.instagrabber.utils.LocaleUtils;
import awais.instagrabber.utils.Utils;
import awais.instagrabber.utils.NetworkUtils;
import awais.instagrabber.utils.ResponseBodyUtils;
import awaisomereport.LogCollector;
import static awais.instagrabber.utils.Utils.logCollector;
@ -90,7 +91,7 @@ public final class iStoryStatusFetcher extends AsyncTask<Void, Void, StoryModel[
conn.connect();
if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) {
JSONObject data = new JSONObject(Utils.readFromConnection(conn));
JSONObject data = new JSONObject(NetworkUtils.readFromConnection(conn));
if (!storiesig && !highlight)
data = data.optJSONObject((isLoc || isHashtag) ? "story" : "reel");
else if (highlight) data = data.getJSONObject("reels").optJSONObject(id);
@ -118,7 +119,7 @@ public final class iStoryStatusFetcher extends AsyncTask<Void, Void, StoryModel[
final JSONArray videoResources = data.optJSONArray("video_versions");
if (isVideo && videoResources != null)
models[i].setVideoUrl(Utils.getHighQualityPost(videoResources, true, true, false));
models[i].setVideoUrl(ResponseBodyUtils.getHighQualityPost(videoResources, true, true, false));
if (data.has("story_feed_media")) {
models[i].setTappableShortCode(data.getJSONArray("story_feed_media").getJSONObject(0).optString("media_id"));

View File

@ -14,7 +14,7 @@ import awais.instagrabber.interfaces.FetchListener;
import awais.instagrabber.models.DiscoverTopicModel;
import awais.instagrabber.utils.Constants;
import awais.instagrabber.utils.LocaleUtils;
import awais.instagrabber.utils.Utils;
import awais.instagrabber.utils.NetworkUtils;
import awaisomereport.LogCollector;
import static awais.instagrabber.utils.Utils.logCollector;
@ -39,7 +39,7 @@ public final class iTopicFetcher extends AsyncTask<Void, Void, DiscoverTopicMode
conn.connect();
if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) {
final JSONObject body = new JSONObject(Utils.readFromConnection(conn));
final JSONObject body = new JSONObject(NetworkUtils.readFromConnection(conn));
final JSONArray edges = body.getJSONArray("clusters");
String[] names = new String[edges.length()], ids = new String[edges.length()];

View File

@ -25,7 +25,7 @@ import androidx.appcompat.widget.AppCompatTextView;
import awais.instagrabber.R;
import awais.instagrabber.interfaces.MentionClickListener;
import awais.instagrabber.models.FeedModel;
import awais.instagrabber.utils.Utils;
import awais.instagrabber.utils.TextUtils;
public final class RamboTextView extends AppCompatTextView {
private static final String TAG = "RamboTextView";
@ -138,7 +138,7 @@ public final class RamboTextView extends AppCompatTextView {
CharSequence subSequence = s.subSequence(start, s.getSpanEnd(clickableSpan));
// for feed ellipsize
final int indexOfEllipsize = Utils.indexOfChar(subSequence, '…', 0);
final int indexOfEllipsize = TextUtils.indexOfChar(subSequence, '…', 0);
if (indexOfEllipsize != -1)
subSequence = subSequence.subSequence(0, indexOfEllipsize - 1);

View File

@ -8,7 +8,7 @@ import com.facebook.drawee.generic.GenericDraweeHierarchy;
import com.facebook.drawee.view.DraweeView;
import com.facebook.imagepipeline.image.ImageInfo;
import awais.instagrabber.utils.Utils;
import awais.instagrabber.utils.NumberUtils;
public class ImageResizingControllerListener<T extends DraweeView<GenericDraweeHierarchy>> extends BaseControllerListener<ImageInfo> {
private static final String TAG = "ImageResizingController";
@ -34,7 +34,7 @@ public class ImageResizingControllerListener<T extends DraweeView<GenericDraweeH
// final float aspectRatio = ((float) width) / height;
final ViewGroup.LayoutParams layoutParams = imageView.getLayoutParams();
// final int deviceWidth = Utils.displayMetrics.widthPixels;
final int resultingHeight = Utils.getResultingHeight(requiredWidth, height, width);
final int resultingHeight = NumberUtils.getResultingHeight(requiredWidth, height, width);
layoutParams.width = requiredWidth;
layoutParams.height = resultingHeight;
imageView.requestLayout();

View File

@ -18,6 +18,7 @@ import androidx.appcompat.widget.LinearLayoutCompat;
import com.google.android.material.bottomsheet.BottomSheetDialogFragment;
import awais.instagrabber.R;
import awais.instagrabber.utils.TextUtils;
import awais.instagrabber.utils.Utils;
public final class AboutDialog extends BottomSheetDialogFragment {
@ -36,7 +37,7 @@ public final class AboutDialog extends BottomSheetDialogFragment {
final Intent intent = new Intent(Intent.ACTION_VIEW);
if (v == btnTelegram) {
intent.setData(Uri.parse("https://t.me/grabber_app"));
if (!Utils.isEmpty(Utils.telegramPackage))
if (!TextUtils.isEmpty(Utils.telegramPackage))
intent.setPackage(Utils.telegramPackage);
}
else if (v == btnMatrix) {
@ -50,7 +51,7 @@ public final class AboutDialog extends BottomSheetDialogFragment {
btnMatrix.setOnClickListener(onClickListener);
final String description = getString(R.string.description);
if (!Utils.isEmpty(description)) {
if (!TextUtils.isEmpty(description)) {
final SpannableStringBuilder descriptionText = new SpannableStringBuilder(description, 0, description.length());
int lastIndex = descriptionText.length() / 2;
@ -72,7 +73,7 @@ public final class AboutDialog extends BottomSheetDialogFragment {
}
}
lastIndex = Utils.indexOfChar(descriptionText, '@', lastIndex) - 12;
lastIndex = TextUtils.indexOfChar(descriptionText, '@', lastIndex) - 12;
descriptionText.setSpan(new URLSpan("mailto:instagrabber@austinhuang.me"), lastIndex, lastIndex + 27, 0);
final TextView textView = (TextView) infoContainer.getChildAt(0);

View File

@ -31,7 +31,8 @@ import awais.instagrabber.asyncs.DownloadAsync;
import awais.instagrabber.asyncs.ProfilePictureFetcher;
import awais.instagrabber.databinding.DialogProfilepicBinding;
import awais.instagrabber.interfaces.FetchListener;
import awais.instagrabber.utils.Utils;
import awais.instagrabber.utils.DownloadUtils;
import awais.instagrabber.utils.TextUtils;
public class ProfilePicDialogFragment extends DialogFragment {
private static final String TAG = "ProfilePicDlgFragment";
@ -87,11 +88,11 @@ public class ProfilePicDialogFragment extends DialogFragment {
private void init() {
binding.download.setOnClickListener(v -> {
if (ContextCompat.checkSelfPermission(requireContext(), Utils.PERMS[0]) == PackageManager.PERMISSION_GRANTED) {
if (ContextCompat.checkSelfPermission(requireContext(), DownloadUtils.PERMS[0]) == PackageManager.PERMISSION_GRANTED) {
downloadProfilePicture();
return;
}
requestPermissions(Utils.PERMS, 8020);
requestPermissions(DownloadUtils.PERMS, 8020);
});
}
@ -106,7 +107,7 @@ public class ProfilePicDialogFragment extends DialogFragment {
private void fetchPhoto() {
final FetchListener<String> fetchListener = profileUrl -> {
url = profileUrl;
if (Utils.isEmpty(url)) {
if (TextUtils.isEmpty(url)) {
url = fallbackUrl;
}
final DraweeController controller = Fresco

View File

@ -23,7 +23,10 @@ import java.util.ArrayList;
import awais.instagrabber.R;
import awais.instagrabber.adapters.SimpleAdapter;
import awais.instagrabber.utils.Constants;
import awais.instagrabber.utils.CookieUtils;
import awais.instagrabber.utils.DataBox;
import awais.instagrabber.utils.DownloadUtils;
import awais.instagrabber.utils.TextUtils;
import awais.instagrabber.utils.Utils;
import static awais.instagrabber.utils.Utils.settingsHelper;
@ -58,7 +61,7 @@ public final class QuickAccessDialog extends BottomSheetDialogFragment implement
btnFavorite = contentView.findViewById(R.id.btnFavorite);
btnImportExport = contentView.findViewById(R.id.importExport);
isQuery = !Utils.isEmpty(userQuery);
isQuery = !TextUtils.isEmpty(userQuery);
btnFavorite.setVisibility(isQuery ? View.VISIBLE : View.GONE);
Utils.setTooltipText(btnImportExport, R.string.import_export);
@ -75,12 +78,12 @@ public final class QuickAccessDialog extends BottomSheetDialogFragment implement
rvFavorites.setAdapter(favoritesAdapter);
final String cookieStr = settingsHelper.getString(Constants.COOKIE);
if (!Utils.isEmpty(cookieStr)
if (!TextUtils.isEmpty(cookieStr)
|| Utils.dataBox.getCookieCount() > 0 // fallback for export / import
) {
rvQuickAccess.addItemDecoration(itemDecoration);
final ArrayList<DataBox.CookieModel> allCookies = Utils.dataBox.getAllCookies();
if (!Utils.isEmpty(cookieStr) && allCookies != null) {
if (!TextUtils.isEmpty(cookieStr) && allCookies != null) {
for (final DataBox.CookieModel cookie : allCookies) {
if (cookieStr.equals(cookie.getCookie())) {
cookie.setSelected(true);
@ -106,8 +109,8 @@ public final class QuickAccessDialog extends BottomSheetDialogFragment implement
favoritesAdapter.setItems(Utils.dataBox.getAllFavorites());
}
} else if (v == btnImportExport) {
if (ContextCompat.checkSelfPermission(activity, Utils.PERMS[0]) == PackageManager.PERMISSION_DENIED)
requestPermissions(Utils.PERMS, 6007);
if (ContextCompat.checkSelfPermission(activity, DownloadUtils.PERMS[0]) == PackageManager.PERMISSION_DENIED)
requestPermissions(DownloadUtils.PERMS, 6007);
else Utils.showImportExportDialog(v.getContext());
} else if (tag instanceof DataBox.FavoriteModel) {
@ -120,7 +123,7 @@ public final class QuickAccessDialog extends BottomSheetDialogFragment implement
final DataBox.CookieModel cookieModel = (DataBox.CookieModel) tag;
if (!cookieModel.isSelected()) {
settingsHelper.putString(Constants.COOKIE, cookieModel.getCookie());
Utils.setupCookies(cookieModel.getCookie());
CookieUtils.setupCookies(cookieModel.getCookie());
cookieChanged = true;
}
dismiss();

View File

@ -30,8 +30,11 @@ import awais.instagrabber.BuildConfig;
import awais.instagrabber.R;
import awais.instagrabber.activities.Login;
import awais.instagrabber.utils.Constants;
import awais.instagrabber.utils.CookieUtils;
import awais.instagrabber.utils.DirectoryChooser;
import awais.instagrabber.utils.DownloadUtils;
import awais.instagrabber.utils.LocaleUtils;
import awais.instagrabber.utils.TextUtils;
import awais.instagrabber.utils.Utils;
import awaisomereport.CrashReporter;
@ -118,7 +121,7 @@ public final class SettingsDialog extends BottomSheetDialogFragment implements V
btnTimeSettings.setOnClickListener(this);
btnPrivacy.setOnClickListener(this);
if (Utils.isEmpty(settingsHelper.getString(Constants.COOKIE))) btnLogout.setEnabled(false);
if (TextUtils.isEmpty(settingsHelper.getString(Constants.COOKIE))) btnLogout.setEnabled(false);
spAppTheme = contentView.findViewById(R.id.spAppTheme);
currentTheme = Integer.parseInt(settingsHelper.getString(APP_THEME));
@ -208,13 +211,13 @@ public final class SettingsDialog extends BottomSheetDialogFragment implements V
startActivity(new Intent(v.getContext(), Login.class));
somethingChanged = true;
} else if (v == btnLogout) {
Utils.setupCookies("LOGOUT");
CookieUtils.setupCookies("LOGOUT");
settingsHelper.putString(Constants.COOKIE, "");
somethingChanged = true;
this.dismiss();
} else if (v == btnImportExport) {
if (ContextCompat.checkSelfPermission(activity, Utils.PERMS[0]) == PackageManager.PERMISSION_DENIED)
requestPermissions(Utils.PERMS, 6007);
if (ContextCompat.checkSelfPermission(activity, DownloadUtils.PERMS[0]) == PackageManager.PERMISSION_DENIED)
requestPermissions(DownloadUtils.PERMS, 6007);
else Utils.showImportExportDialog(activity);
} else if (v == btnTimeSettings) {
new TimeSettingsDialog(settingsHelper.getBoolean(Constants.CUSTOM_DATE_TIME_FORMAT_ENABLED),
@ -242,8 +245,8 @@ public final class SettingsDialog extends BottomSheetDialogFragment implements V
} else if (v == btnReport) {
CrashReporter.get(activity.getApplication()).zipLogs().startCrashEmailIntent(activity, true);
} else if (v == btnSaveTo) {
if (ContextCompat.checkSelfPermission(activity, Utils.PERMS[0]) == PackageManager.PERMISSION_DENIED)
requestPermissions(Utils.PERMS, 6200);
if (ContextCompat.checkSelfPermission(activity, DownloadUtils.PERMS[0]) == PackageManager.PERMISSION_DENIED)
requestPermissions(DownloadUtils.PERMS, 6200);
else showDirectoryChooser();
} else if (v == btnPrivacy) {
final Intent intent = new Intent(Intent.ACTION_VIEW);

View File

@ -23,7 +23,7 @@ import java.util.GregorianCalendar;
import awais.instagrabber.databinding.DialogTimeSettingsBinding;
import awais.instagrabber.utils.LocaleUtils;
import awais.instagrabber.utils.Utils;
import awais.instagrabber.utils.TextUtils;
public final class TimeSettingsDialog extends DialogFragment implements AdapterView.OnItemSelectedListener, CompoundButton.OnCheckedChangeListener,
View.OnClickListener, TextWatcher {
@ -89,7 +89,7 @@ public final class TimeSettingsDialog extends DialogFragment implements AdapterV
final boolean isSwapTime = !timeSettingsBinding.cbSwapTimeDate.isChecked();
selectedFormat = (isSwapTime ? timeStr : dateStr)
+ (Utils.isEmpty(sepStr) || timeSettingsBinding.spSeparator.getSelectedItemPosition() == 0 ? " " : " '" + sepStr + "' ")
+ (TextUtils.isEmpty(sepStr) || timeSettingsBinding.spSeparator.getSelectedItemPosition() == 0 ? " " : " '" + sepStr + "' ")
+ (isSwapTime ? dateStr : timeStr);
timeSettingsBinding.btnConfirm.setEnabled(true);
@ -102,7 +102,7 @@ public final class TimeSettingsDialog extends DialogFragment implements AdapterV
try {
//noinspection ConstantConditions
final String string = timeSettingsBinding.etCustomFormat.getText().toString();
if (Utils.isEmpty(string)) throw new NullPointerException();
if (TextUtils.isEmpty(string)) throw new NullPointerException();
currentFormat = new SimpleDateFormat(string, LocaleUtils.getCurrentLocale());
final String format = currentFormat.format(magicDate);
timeSettingsBinding.timePreview.setText(format);

View File

@ -33,11 +33,12 @@ import awais.instagrabber.models.ViewerPostModel;
import awais.instagrabber.models.enums.DownloadMethod;
import awais.instagrabber.models.enums.IntentModelType;
import awais.instagrabber.utils.Constants;
import awais.instagrabber.utils.DownloadUtils;
import awais.instagrabber.utils.IntentUtils;
import awais.instagrabber.utils.Utils;
import awais.instagrabber.utils.TextUtils;
import static awais.instagrabber.utils.Utils.CHANNEL_ID;
import static awais.instagrabber.utils.Utils.CHANNEL_NAME;
import static awais.instagrabber.utils.Constants.CHANNEL_ID;
import static awais.instagrabber.utils.Constants.CHANNEL_NAME;
import static awais.instagrabber.utils.Utils.isChannelCreated;
import static awais.instagrabber.utils.Utils.notificationManager;
@ -84,14 +85,14 @@ public final class DirectDownload extends Activity {
handler.removeCallbacks(this);
}
});
ActivityCompat.requestPermissions(this, Utils.PERMS, 8020);
ActivityCompat.requestPermissions(this, DownloadUtils.PERMS, 8020);
}
finish();
}
private synchronized void doDownload() {
final String action = intent.getAction();
if (!Utils.isEmpty(action) && !Intent.ACTION_MAIN.equals(action)) {
if (!TextUtils.isEmpty(action) && !Intent.ACTION_MAIN.equals(action)) {
boolean error = true;
String data = null;
@ -109,7 +110,7 @@ public final class DirectDownload extends Activity {
if (intentData != null) data = intentData.toString();
}
if (data != null && !Utils.isEmpty(data)) {
if (data != null && !TextUtils.isEmpty(data)) {
final IntentModel model = IntentUtils.parseUrl(data);
if (model != null && model.getType() == IntentModelType.POST) {
final String text = model.getText();
@ -137,8 +138,8 @@ public final class DirectDownload extends Activity {
if (notificationManager != null) notificationManager.cancel(1900000000);
if (result != null) {
if (result.length == 1) {
Utils.batchDownload(context, result[0].getProfileModel().getUsername(), DownloadMethod.DOWNLOAD_DIRECT,
Arrays.asList(result));
DownloadUtils.batchDownload(context, result[0].getProfileModel().getUsername(), DownloadMethod.DOWNLOAD_DIRECT,
Arrays.asList(result));
} else if (result.length > 1) {
context.startActivity(new Intent(context, MultiDirectDialog.class)
.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS)

View File

@ -11,7 +11,6 @@ import androidx.appcompat.widget.Toolbar;
import androidx.recyclerview.widget.RecyclerView;
import java.util.ArrayList;
import java.util.Collections;
import awais.instagrabber.R;
import awais.instagrabber.activities.BaseLanguageActivity;
@ -23,6 +22,7 @@ import awais.instagrabber.models.PostModel;
import awais.instagrabber.models.ViewerPostModel;
import awais.instagrabber.models.enums.DownloadMethod;
import awais.instagrabber.utils.Constants;
import awais.instagrabber.utils.DownloadUtils;
import awais.instagrabber.utils.Utils;
public final class MultiDirectDialog extends BaseLanguageActivity {
@ -86,7 +86,7 @@ public final class MultiDirectDialog extends BaseLanguageActivity {
@Override
public boolean onOptionsItemSelected(@NonNull final MenuItem item) {
Utils.batchDownload(this, username, DownloadMethod.DOWNLOAD_DIRECT, selectedItems);
DownloadUtils.batchDownload(this, username, DownloadMethod.DOWNLOAD_DIRECT, selectedItems);
finish();
return true;
}

View File

@ -44,6 +44,8 @@ import awais.instagrabber.models.ProfileModel;
import awais.instagrabber.services.MediaService;
import awais.instagrabber.services.ServiceCallback;
import awais.instagrabber.utils.Constants;
import awais.instagrabber.utils.CookieUtils;
import awais.instagrabber.utils.TextUtils;
import awais.instagrabber.utils.Utils;
import static android.content.Context.INPUT_METHOD_SERVICE;
@ -134,7 +136,7 @@ public final class CommentsViewerFragment extends Fragment implements SwipeRefre
binding.swipeRefreshLayout.setOnRefreshListener(this);
binding.swipeRefreshLayout.setRefreshing(true);
resources = getResources();
if (!Utils.isEmpty(cookie)) {
if (!TextUtils.isEmpty(cookie)) {
binding.commentField.setStartIconVisible(false);
binding.commentField.setEndIconVisible(false);
binding.commentField.setVisibility(View.VISIBLE);
@ -219,7 +221,7 @@ public final class CommentsViewerFragment extends Fragment implements SwipeRefre
break;
case 5: // like/unlike comment
if (!commentModel.getLiked()) {
mediaService.commentLike(commentModel.getId(), Utils.getCsrfTokenFromCookie(cookie), new ServiceCallback<Boolean>() {
mediaService.commentLike(commentModel.getId(), CookieUtils.getCsrfTokenFromCookie(cookie), new ServiceCallback<Boolean>() {
@Override
public void onSuccess(final Boolean result) {
commentModel = null;
@ -238,7 +240,7 @@ public final class CommentsViewerFragment extends Fragment implements SwipeRefre
});
return;
}
mediaService.commentUnlike(commentModel.getId(), Utils.getCsrfTokenFromCookie(cookie), new ServiceCallback<Boolean>() {
mediaService.commentUnlike(commentModel.getId(), CookieUtils.getCsrfTokenFromCookie(cookie), new ServiceCallback<Boolean>() {
@Override
public void onSuccess(final Boolean result) {
commentModel = null;
@ -257,10 +259,10 @@ public final class CommentsViewerFragment extends Fragment implements SwipeRefre
});
break;
case 6: // delete comment
final String userId = Utils.getUserIdFromCookie(cookie);
final String userId = CookieUtils.getUserIdFromCookie(cookie);
if (userId == null) return;
mediaService.deleteComment(
postId, userId, commentModel.getId(), Utils.getCsrfTokenFromCookie(cookie),
postId, userId, commentModel.getId(), CookieUtils.getCsrfTokenFromCookie(cookie),
new ServiceCallback<Boolean>() {
@Override
public void onSuccess(final Boolean result) {
@ -293,8 +295,8 @@ public final class CommentsViewerFragment extends Fragment implements SwipeRefre
String[] commentDialogList;
final String userIdFromCookie = Utils.getUserIdFromCookie(cookie);
if (!Utils.isEmpty(cookie)
final String userIdFromCookie = CookieUtils.getUserIdFromCookie(cookie);
if (!TextUtils.isEmpty(cookie)
&& userIdFromCookie != null
&& (userIdFromCookie.equals(commentModel.getProfileModel().getId()) || userIdFromCookie.equals(userId))) {
commentDialogList = new String[]{
@ -307,7 +309,7 @@ public final class CommentsViewerFragment extends Fragment implements SwipeRefre
: resources.getString(R.string.comment_viewer_like_comment),
resources.getString(R.string.comment_viewer_delete_comment)
};
} else if (!Utils.isEmpty(cookie)) {
} else if (!TextUtils.isEmpty(cookie)) {
commentDialogList = new String[]{
resources.getString(R.string.open_profile),
resources.getString(R.string.view_pfp),
@ -344,17 +346,17 @@ public final class CommentsViewerFragment extends Fragment implements SwipeRefre
private final View.OnClickListener newCommentListener = v -> {
final Editable text = binding.commentText.getText();
if (text == null || Utils.isEmpty(text.toString())) {
if (text == null || TextUtils.isEmpty(text.toString())) {
Toast.makeText(requireContext(), R.string.comment_send_empty_comment, Toast.LENGTH_SHORT).show();
return;
}
final String userId = Utils.getUserIdFromCookie(cookie);
final String userId = CookieUtils.getUserIdFromCookie(cookie);
if (userId == null) return;
String replyToId = null;
if (commentModel != null) {
replyToId = commentModel.getId();
}
mediaService.comment(postId, text.toString(), userId, replyToId, Utils.getCsrfTokenFromCookie(cookie), new ServiceCallback<Boolean>() {
mediaService.comment(postId, text.toString(), userId, replyToId, CookieUtils.getCsrfTokenFromCookie(cookie), new ServiceCallback<Boolean>() {
@Override
public void onSuccess(final Boolean result) {
commentModel = null;

View File

@ -30,7 +30,7 @@ import awais.instagrabber.asyncs.FollowFetcher;
import awais.instagrabber.databinding.FragmentFollowersViewerBinding;
import awais.instagrabber.interfaces.FetchListener;
import awais.instagrabber.models.FollowModel;
import awais.instagrabber.utils.Utils;
import awais.instagrabber.utils.TextUtils;
import awaisomereport.LogCollector;
import thoughtbot.expandableadapter.ExpandableGroup;
@ -89,7 +89,7 @@ public final class FollowViewerFragment extends Fragment implements SwipeRefresh
isFollowersList = fragmentArgs.getIsFollowersList();
username = fragmentArgs.getUsername();
namePost = username;
if (Utils.isEmpty(username)) {
if (TextUtils.isEmpty(username)) {
// this usually should not occur
username = "You";
namePost = "You're";

View File

@ -1,6 +1,5 @@
package awais.instagrabber.fragments;
import android.content.Context;
import android.content.res.ColorStateList;
import android.graphics.Typeface;
import android.os.AsyncTask;
@ -53,6 +52,9 @@ import awais.instagrabber.models.StoryModel;
import awais.instagrabber.models.enums.DownloadMethod;
import awais.instagrabber.models.enums.PostItemType;
import awais.instagrabber.utils.Constants;
import awais.instagrabber.utils.CookieUtils;
import awais.instagrabber.utils.DownloadUtils;
import awais.instagrabber.utils.TextUtils;
import awais.instagrabber.utils.Utils;
import awais.instagrabber.viewmodels.PostsViewModel;
import awaisomereport.LogCollector;
@ -101,10 +103,10 @@ public class HashTagFragment extends Fragment {
if (postsAdapter == null || hashtag == null) {
return false;
}
Utils.batchDownload(requireContext(),
hashtag,
DownloadMethod.DOWNLOAD_MAIN,
postsAdapter.getSelectedModels());
DownloadUtils.batchDownload(requireContext(),
hashtag,
DownloadMethod.DOWNLOAD_MAIN,
postsAdapter.getSelectedModels());
checkAndResetAction();
return true;
}
@ -168,7 +170,7 @@ public class HashTagFragment extends Fragment {
private void init() {
if (getArguments() == null) return;
final String cookie = settingsHelper.getString(Constants.COOKIE);
isLoggedIn = !Utils.isEmpty(cookie) && Utils.getUserIdFromCookie(cookie) != null;
isLoggedIn = !TextUtils.isEmpty(cookie) && CookieUtils.getUserIdFromCookie(cookie) != null;
final HashTagFragmentArgs fragmentArgs = HashTagFragmentArgs.fromBundle(getArguments());
hashtag = fragmentArgs.getHashtag();
setTitle();
@ -251,7 +253,7 @@ public class HashTagFragment extends Fragment {
stopCurrentExecutor();
binding.btnFollowTag.setVisibility(View.VISIBLE);
binding.swipeRefreshLayout.setRefreshing(true);
if (Utils.isEmpty(hashtag)) return;
if (TextUtils.isEmpty(hashtag)) return;
currentlyExecuting = new PostsFetcher(hashtag.substring(1), PostItemType.HASHTAG, endCursor, postsFetchListener)
.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
if (isLoggedIn) {

View File

@ -44,6 +44,9 @@ 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.utils.CookieUtils;
import awais.instagrabber.utils.DownloadUtils;
import awais.instagrabber.utils.TextUtils;
import awais.instagrabber.viewmodels.PostsViewModel;
import awais.instagrabber.interfaces.FetchListener;
import awais.instagrabber.models.LocationModel;
@ -103,10 +106,10 @@ public class LocationFragment extends Fragment {
if (postsAdapter == null || locationId == null) {
return false;
}
Utils.batchDownload(requireContext(),
locationId,
DownloadMethod.DOWNLOAD_MAIN,
postsAdapter.getSelectedModels());
DownloadUtils.batchDownload(requireContext(),
locationId,
DownloadMethod.DOWNLOAD_MAIN,
postsAdapter.getSelectedModels());
checkAndResetAction();
return true;
}
@ -173,7 +176,7 @@ public class LocationFragment extends Fragment {
private void init() {
if (getArguments() == null) return;
final String cookie = settingsHelper.getString(Constants.COOKIE);
isLoggedIn = !Utils.isEmpty(cookie) && Utils.getUserIdFromCookie(cookie) != null;
isLoggedIn = !TextUtils.isEmpty(cookie) && CookieUtils.getUserIdFromCookie(cookie) != null;
final LocationFragmentArgs fragmentArgs = LocationFragmentArgs.fromBundle(getArguments());
locationId = fragmentArgs.getLocationId();
setTitle();
@ -284,11 +287,11 @@ public class LocationFragment extends Fragment {
binding.locationBiography.setCaptionIsExpandable(true);
binding.locationBiography.setCaptionIsExpanded(true);
if (Utils.isEmpty(biography)) {
if (TextUtils.isEmpty(biography)) {
binding.locationBiography.setVisibility(View.GONE);
} else if (Utils.hasMentions(biography)) {
} else if (TextUtils.hasMentions(biography)) {
binding.locationBiography.setVisibility(View.VISIBLE);
biography = Utils.getMentionText(biography);
biography = TextUtils.getMentionText(biography);
binding.locationBiography.setText(biography, TextView.BufferType.SPANNABLE);
// binding.locationBiography.setMentionClickListener(mentionClickListener);
} else {
@ -310,14 +313,14 @@ public class LocationFragment extends Fragment {
}
final String url = locationModel.getUrl();
if (Utils.isEmpty(url)) {
if (TextUtils.isEmpty(url)) {
binding.locationUrl.setVisibility(View.GONE);
} else if (!url.startsWith("http")) {
binding.locationUrl.setVisibility(View.VISIBLE);
binding.locationUrl.setText(Utils.getSpannableUrl("http://" + url));
binding.locationUrl.setText(TextUtils.getSpannableUrl("http://" + url));
} else {
binding.locationUrl.setVisibility(View.VISIBLE);
binding.locationUrl.setText(Utils.getSpannableUrl(url));
binding.locationUrl.setText(TextUtils.getSpannableUrl(url));
}
}

View File

@ -38,6 +38,8 @@ import awais.instagrabber.models.enums.DownloadMethod;
import awais.instagrabber.services.MediaService;
import awais.instagrabber.services.ServiceCallback;
import awais.instagrabber.utils.Constants;
import awais.instagrabber.utils.CookieUtils;
import awais.instagrabber.utils.DownloadUtils;
import awais.instagrabber.utils.Utils;
import awais.instagrabber.viewmodels.ViewerPostViewModel;
@ -129,13 +131,13 @@ public class PostViewFragment extends Fragment {
break;
case R.id.btnDownload:
if (checkSelfPermission(requireContext(),
Utils.PERMS[0]) == PackageManager.PERMISSION_GRANTED) {
DownloadUtils.PERMS[0]) == PackageManager.PERMISSION_GRANTED) {
showDownloadDialog(Arrays.asList(wrapper.getViewerPostModels()),
childPosition,
username);
return;
}
requestPermissions(Utils.PERMS, 8020);
requestPermissions(DownloadUtils.PERMS, 8020);
break;
case R.id.ivProfilePic:
case R.id.title:
@ -143,8 +145,8 @@ public class PostViewFragment extends Fragment {
break;
case R.id.btnLike:
if (mediaService != null) {
final String userId = Utils.getUserIdFromCookie(COOKIE);
final String csrfToken = Utils.getCsrfTokenFromCookie(COOKIE);
final String userId = CookieUtils.getUserIdFromCookie(COOKIE);
final String csrfToken = CookieUtils.getCsrfTokenFromCookie(COOKIE);
v.setEnabled(false);
final ServiceCallback<Boolean> likeCallback = new ServiceCallback<Boolean>() {
@Override
@ -173,8 +175,8 @@ public class PostViewFragment extends Fragment {
break;
case R.id.btnBookmark:
if (mediaService != null) {
final String userId = Utils.getUserIdFromCookie(COOKIE);
final String csrfToken = Utils.getCsrfTokenFromCookie(COOKIE);
final String userId = CookieUtils.getUserIdFromCookie(COOKIE);
final String csrfToken = CookieUtils.getCsrfTokenFromCookie(COOKIE);
v.setEnabled(false);
final ServiceCallback<Boolean> saveCallback = new ServiceCallback<Boolean>() {
@Override
@ -312,10 +314,10 @@ public class PostViewFragment extends Fragment {
postModelsToDownload.add(postModels.get(childPosition));
}
if (postModelsToDownload.size() > 0) {
Utils.batchDownload(requireContext(),
username,
DownloadMethod.DOWNLOAD_POST_VIEWER,
postModelsToDownload);
DownloadUtils.batchDownload(requireContext(),
username,
DownloadMethod.DOWNLOAD_POST_VIEWER,
postModelsToDownload);
}
};
new AlertDialog.Builder(requireContext())
@ -325,10 +327,10 @@ public class PostViewFragment extends Fragment {
.setPositiveButton(R.string.post_viewer_download_current, clickListener)
.setNegativeButton(R.string.post_viewer_download_album, clickListener).show();
} else {
Utils.batchDownload(requireContext(),
username,
DownloadMethod.DOWNLOAD_POST_VIEWER,
Collections.singletonList(postModels.get(childPosition)));
DownloadUtils.batchDownload(requireContext(),
username,
DownloadMethod.DOWNLOAD_POST_VIEWER,
Collections.singletonList(postModels.get(childPosition)));
}
}
}

View File

@ -41,6 +41,8 @@ import awais.instagrabber.customviews.helpers.GridSpacingItemDecoration;
import awais.instagrabber.customviews.helpers.RecyclerLazyLoader;
import awais.instagrabber.databinding.FragmentSavedBinding;
import awais.instagrabber.fragments.main.ProfileFragmentDirections;
import awais.instagrabber.utils.DownloadUtils;
import awais.instagrabber.utils.TextUtils;
import awais.instagrabber.viewmodels.PostsViewModel;
import awais.instagrabber.interfaces.FetchListener;
import awais.instagrabber.models.PostModel;
@ -92,10 +94,10 @@ public final class SavedViewerFragment extends Fragment implements SwipeRefreshL
if (postsAdapter == null || username == null) {
return false;
}
Utils.batchDownload(requireContext(),
username,
DownloadMethod.DOWNLOAD_SAVED,
postsAdapter.getSelectedModels());
DownloadUtils.batchDownload(requireContext(),
username,
DownloadMethod.DOWNLOAD_SAVED,
postsAdapter.getSelectedModels());
checkAndResetAction();
return true;
}
@ -257,7 +259,7 @@ public final class SavedViewerFragment extends Fragment implements SwipeRefreshL
break;
case SAVED:
case TAGGED:
if (Utils.isEmpty(profileId)) return;
if (TextUtils.isEmpty(profileId)) return;
asyncTask = new PostsFetcher(profileId, type, endCursor, postsFetchListener);
break;
default:
@ -285,7 +287,7 @@ public final class SavedViewerFragment extends Fragment implements SwipeRefreshL
public void onRequestPermissionsResult(final int requestCode, @NonNull final String[] permissions, @NonNull final int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == 8020 && grantResults[0] == PackageManager.PERMISSION_GRANTED && selectedItems.size() > 0)
Utils.batchDownload(requireContext(), null, DownloadMethod.DOWNLOAD_SAVED, selectedItems);
DownloadUtils.batchDownload(requireContext(), null, DownloadMethod.DOWNLOAD_SAVED, selectedItems);
}
public static void stopCurrentExecutor() {

View File

@ -81,6 +81,9 @@ import awais.instagrabber.models.stickers.QuizModel;
import awais.instagrabber.services.ServiceCallback;
import awais.instagrabber.services.StoriesService;
import awais.instagrabber.utils.Constants;
import awais.instagrabber.utils.CookieUtils;
import awais.instagrabber.utils.DownloadUtils;
import awais.instagrabber.utils.TextUtils;
import awais.instagrabber.utils.Utils;
import awais.instagrabber.viewmodels.FeedStoriesViewModel;
import awais.instagrabber.viewmodels.HighlightsViewModel;
@ -175,10 +178,10 @@ public class StoryViewerFragment extends Fragment {
public boolean onOptionsItemSelected(@NonNull final MenuItem item) {
switch (item.getItemId()) {
case R.id.action_download:
if (ContextCompat.checkSelfPermission(requireContext(), Utils.PERMS[0]) == PackageManager.PERMISSION_GRANTED)
if (ContextCompat.checkSelfPermission(requireContext(), DownloadUtils.PERMS[0]) == PackageManager.PERMISSION_GRANTED)
downloadStory();
else
ActivityCompat.requestPermissions(requireActivity(), Utils.PERMS, 8020);
ActivityCompat.requestPermissions(requireActivity(), DownloadUtils.PERMS, 8020);
return true;
case R.id.action_dms:
final EditText input = new EditText(requireContext());
@ -236,12 +239,12 @@ public class StoryViewerFragment extends Fragment {
}
private void init() {
isLoggedIn = !Utils.isEmpty(cookie) && Utils.getUserIdFromCookie(cookie) != null;
isLoggedIn = !TextUtils.isEmpty(cookie) && CookieUtils.getUserIdFromCookie(cookie) != null;
if (getArguments() == null) return;
fragmentArgs = StoryViewerFragmentArgs.fromBundle(getArguments());
currentFeedStoryIndex = fragmentArgs.getFeedStoryIndex();
highlight = fragmentArgs.getHighlight();
isHighlight = !Utils.isEmpty(highlight);
isHighlight = !TextUtils.isEmpty(highlight);
if (currentFeedStoryIndex >= 0) {
viewModel = isHighlight
? new ViewModelProvider(fragmentActivity).get(HighlightsViewModel.class)
@ -394,7 +397,7 @@ public class StoryViewerFragment extends Fragment {
poll.getLeftChoice() + " (" + poll.getLeftCount() + ")",
poll.getRightChoice() + " (" + poll.getRightCount() + ")"
}), (d, w) -> {
if (!Utils.isEmpty(cookie))
if (!TextUtils.isEmpty(cookie))
new VoteAction(currentStory, poll, cookie, choice -> {
if (choice > -1) {
poll.setMyChoice(choice);
@ -439,7 +442,7 @@ public class StoryViewerFragment extends Fragment {
new AlertDialog.Builder(requireContext())
.setTitle(quiz.getMyChoice() > -1 ? getString(R.string.story_quizzed) : quiz.getQuestion())
.setAdapter(new ArrayAdapter<>(requireContext(), android.R.layout.simple_list_item_1, choices), (d, w) -> {
if (quiz.getMyChoice() == -1 && !Utils.isEmpty(cookie))
if (quiz.getMyChoice() == -1 && !TextUtils.isEmpty(cookie))
new QuizAction(currentStory, quiz, cookie, choice -> {
if (choice > -1) {
quiz.setMyChoice(choice);
@ -484,12 +487,12 @@ public class StoryViewerFragment extends Fragment {
currentStoryMediaId = model.getStoryMediaId();
currentStoryUsername = model.getProfileModel().getUsername();
}
} else if (!Utils.isEmpty(fragmentArgs.getProfileId()) && !Utils.isEmpty(fragmentArgs.getUsername())) {
} else if (!TextUtils.isEmpty(fragmentArgs.getProfileId()) && !TextUtils.isEmpty(fragmentArgs.getUsername())) {
currentStoryMediaId = fragmentArgs.getProfileId();
username = fragmentArgs.getUsername();
}
isHashtag = fragmentArgs.getIsHashtag();
final boolean hasUsername = !Utils.isEmpty(currentStoryUsername);
final boolean hasUsername = !TextUtils.isEmpty(currentStoryUsername);
if (hasUsername) {
currentStoryUsername = currentStoryUsername.replace("@", "");
final ActionBar actionBar = fragmentActivity.getSupportActionBar();
@ -572,7 +575,7 @@ public class StoryViewerFragment extends Fragment {
binding.poll.setTag(poll);
question = currentStory.getQuestion();
binding.answer.setVisibility((question != null && !Utils.isEmpty(cookie)) ? View.VISIBLE : View.GONE);
binding.answer.setVisibility((question != null && !TextUtils.isEmpty(cookie)) ? View.VISIBLE : View.GONE);
binding.answer.setTag(question);
mentions = currentStory.getMentions();
@ -611,10 +614,10 @@ public class StoryViewerFragment extends Fragment {
if (settingsHelper.getBoolean(FOLDER_SAVE_TO)) {
final String customPath = settingsHelper.getString(FOLDER_PATH);
if (!Utils.isEmpty(customPath)) dir = new File(customPath);
if (!TextUtils.isEmpty(customPath)) dir = new File(customPath);
}
if (settingsHelper.getBoolean(Constants.DOWNLOAD_USER_FOLDER) && !Utils.isEmpty(currentStoryUsername))
if (settingsHelper.getBoolean(Constants.DOWNLOAD_USER_FOLDER) && !TextUtils.isEmpty(currentStoryUsername))
dir = new File(dir, currentStoryUsername);
if (dir.exists() || dir.mkdirs()) {
@ -622,7 +625,7 @@ public class StoryViewerFragment extends Fragment {
? currentStory.getVideoUrl()
: currentStory.getStoryUrl();
final File saveFile = new File(dir, currentStory.getStoryMediaId() + "_" + currentStory.getTimestamp()
+ Utils.getExtensionFromModel(storyUrl, currentStory));
+ DownloadUtils.getExtensionFromModel(storyUrl, currentStory));
new DownloadAsync(requireContext(), storyUrl, saveFile, result -> {
final int toastRes = result != null && result.exists() ? R.string.downloader_complete
@ -664,7 +667,7 @@ public class StoryViewerFragment extends Fragment {
if (menuDownload != null) {
menuDownload.setVisible(true);
}
if (currentStory.canReply() && menuDm != null && !Utils.isEmpty(cookie)) {
if (currentStory.canReply() && menuDm != null && !TextUtils.isEmpty(cookie)) {
menuDm.setVisible(true);
}
binding.progressView.setVisibility(View.GONE);
@ -693,7 +696,7 @@ public class StoryViewerFragment extends Fragment {
final LoadEventInfo loadEventInfo,
final MediaLoadData mediaLoadData) {
if (menuDownload != null) menuDownload.setVisible(true);
if (currentStory.canReply() && menuDm != null && !Utils.isEmpty(cookie))
if (currentStory.canReply() && menuDm != null && !TextUtils.isEmpty(cookie))
menuDm.setVisible(true);
binding.progressView.setVisibility(View.GONE);
}
@ -704,7 +707,7 @@ public class StoryViewerFragment extends Fragment {
final LoadEventInfo loadEventInfo,
final MediaLoadData mediaLoadData) {
if (menuDownload != null) menuDownload.setVisible(true);
if (currentStory.canReply() && menuDm != null && !Utils.isEmpty(cookie))
if (currentStory.canReply() && menuDm != null && !TextUtils.isEmpty(cookie))
menuDm.setVisible(true);
binding.progressView.setVisibility(View.VISIBLE);
}

View File

@ -34,7 +34,7 @@ import awais.instagrabber.databinding.FragmentDirectMessagesInboxBinding;
import awais.instagrabber.interfaces.FetchListener;
import awais.instagrabber.models.direct_messages.InboxModel;
import awais.instagrabber.models.direct_messages.InboxThreadModel;
import awais.instagrabber.utils.Utils;
import awais.instagrabber.utils.TextUtils;
public class DirectMessageInboxFragment extends Fragment implements SwipeRefreshLayout.OnRefreshListener {
private static final String TAG = "DirectMessagesInboxFrag";
@ -145,7 +145,7 @@ public class DirectMessageInboxFragment extends Fragment implements SwipeRefresh
private void initData() {
lazyLoader = new RecyclerLazyLoader(layoutManager, (page, totalItemsCount) -> {
if (!Utils.isEmpty(endCursor))
if (!TextUtils.isEmpty(endCursor))
currentlyRunning = new InboxFetcher(endCursor, fetchListener).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
endCursor = null;
});

View File

@ -42,6 +42,7 @@ import awais.instagrabber.interfaces.FetchListener;
import awais.instagrabber.models.ProfileModel;
import awais.instagrabber.models.direct_messages.InboxThreadModel;
import awais.instagrabber.utils.Constants;
import awais.instagrabber.utils.CookieUtils;
import awais.instagrabber.utils.Utils;
public class DirectMessageSettingsFragment extends Fragment implements SwipeRefreshLayout.OnRefreshListener {
@ -66,7 +67,7 @@ public class DirectMessageSettingsFragment extends Fragment implements SwipeRefr
@Override
public void onResult(final InboxThreadModel threadModel) {
final List<Long> adminList = Arrays.asList(threadModel.getAdmins());
final String userIdFromCookie = Utils.getUserIdFromCookie(cookie);
final String userIdFromCookie = CookieUtils.getUserIdFromCookie(cookie);
if (userIdFromCookie == null) return;
final boolean amAdmin = adminList.contains(Long.parseLong(userIdFromCookie));
final DirectMessageMembersAdapter memberAdapter = new DirectMessageMembersAdapter(threadModel.getUsers(),

View File

@ -68,6 +68,9 @@ import awais.instagrabber.models.enums.DownloadMethod;
import awais.instagrabber.models.enums.MediaItemType;
import awais.instagrabber.models.enums.UserInboxDirection;
import awais.instagrabber.utils.Constants;
import awais.instagrabber.utils.CookieUtils;
import awais.instagrabber.utils.DownloadUtils;
import awais.instagrabber.utils.TextUtils;
import awais.instagrabber.utils.Utils;
public class DirectMessageThreadFragment extends Fragment {
@ -80,7 +83,7 @@ public class DirectMessageThreadFragment extends Fragment {
private String cursor;
private String lastMessage;
private final String cookie = Utils.settingsHelper.getString(Constants.COOKIE);
private final String myId = Utils.getUserIdFromCookie(cookie);
private final String myId = CookieUtils.getUserIdFromCookie(cookie);
private FragmentDirectMessagesThreadBinding binding;
private DirectItemModelListViewModel listViewModel;
private DirectItemModel directItemModel;
@ -97,7 +100,7 @@ public class DirectMessageThreadFragment extends Fragment {
private final View.OnClickListener clickListener = v -> {
if (v == binding.commentSend) {
final String text = binding.commentText.getText().toString();
if (Utils.isEmpty(text)) {
if (TextUtils.isEmpty(text)) {
Toast.makeText(requireContext(), R.string.comment_send_empty_comment, Toast.LENGTH_SHORT).show();
return;
}
@ -120,7 +123,7 @@ public class DirectMessageThreadFragment extends Fragment {
@Override
public void onResult(final InboxThreadModel result) {
if (result == null && ("MINCURSOR".equals(cursor) || "MAXCURSOR".equals(cursor) || Utils.isEmpty(cursor)))
if (result == null && ("MINCURSOR".equals(cursor) || "MAXCURSOR".equals(cursor) || TextUtils.isEmpty(cursor)))
Toast.makeText(requireContext(), R.string.downloader_unknown_error, Toast.LENGTH_SHORT).show();
if (result != null) {
@ -210,7 +213,7 @@ public class DirectMessageThreadFragment extends Fragment {
layoutManager.setReverseLayout(true);
messageList.setLayoutManager(layoutManager);
messageList.addOnScrollListener(new RecyclerLazyLoader(layoutManager, (page, totalItemsCount) -> {
if (Utils.isEmpty(cursor) || !hasOlder) {
if (TextUtils.isEmpty(cursor) || !hasOlder) {
return;
}
new DirectMessageInboxThreadFetcher(threadId, UserInboxDirection.OLDER, cursor, fetchListener)
@ -255,7 +258,7 @@ public class DirectMessageThreadFragment extends Fragment {
if (url == null) {
Toast.makeText(requireContext(), R.string.downloader_unknown_error, Toast.LENGTH_SHORT).show();
} else {
Utils.dmDownload(requireContext(), user.getUsername(), DownloadMethod.DOWNLOAD_DIRECT, selectedItem);
DownloadUtils.dmDownload(requireContext(), user.getUsername(), DownloadMethod.DOWNLOAD_DIRECT, selectedItem);
Toast.makeText(requireContext(), R.string.downloader_downloading_media, Toast.LENGTH_SHORT).show();
}
break;

View File

@ -36,6 +36,7 @@ import awais.instagrabber.customviews.helpers.GridAutofitLayoutManager;
import awais.instagrabber.customviews.helpers.GridSpacingItemDecoration;
import awais.instagrabber.customviews.helpers.RecyclerLazyLoader;
import awais.instagrabber.databinding.FragmentDiscoverBinding;
import awais.instagrabber.utils.DownloadUtils;
import awais.instagrabber.viewmodels.DiscoverItemViewModel;
import awais.instagrabber.interfaces.FetchListener;
import awais.instagrabber.models.DiscoverItemModel;
@ -129,10 +130,10 @@ public class DiscoverFragment extends Fragment implements SwipeRefreshLayout.OnR
public boolean onActionItemClicked(final ActionMode mode, final MenuItem item) {
if (item.getItemId() == R.id.action_download) {
if (discoverAdapter == null) return false;
Utils.batchDownload(requireContext(),
null,
DownloadMethod.DOWNLOAD_DISCOVER,
discoverAdapter.getSelectedModels());
DownloadUtils.batchDownload(requireContext(),
null,
DownloadMethod.DOWNLOAD_DISCOVER,
discoverAdapter.getSelectedModels());
checkAndResetAction();
return true;
}

View File

@ -57,6 +57,8 @@ import awais.instagrabber.models.enums.MediaItemType;
import awais.instagrabber.services.ServiceCallback;
import awais.instagrabber.services.StoriesService;
import awais.instagrabber.utils.Constants;
import awais.instagrabber.utils.DownloadUtils;
import awais.instagrabber.utils.NumberUtils;
import awais.instagrabber.utils.Utils;
import awais.instagrabber.viewmodels.FeedStoriesViewModel;
import awais.instagrabber.viewmodels.FeedViewModel;
@ -113,16 +115,16 @@ public class FeedFragment extends Fragment implements SwipeRefreshLayout.OnRefre
final FeedModel feedModel = thumbToFeedMap.get(thumbUri.toString());
if (feedModel == null) return;
int requiredWidth = Utils.displayMetrics.widthPixels;
int resultingHeight = Utils
int resultingHeight = NumberUtils
.getResultingHeight(requiredWidth, encodedHeight, encodedWidth);
if (feedModel
.getItemType() == MediaItemType.MEDIA_TYPE_VIDEO && resultingHeight >= MAX_VIDEO_HEIGHT) {
// If its a video and the height is too large, need to reduce the height,
// so that entire video fits on screen
resultingHeight = RESIZED_VIDEO_HEIGHT;
requiredWidth = Utils.getResultingWidth(RESIZED_VIDEO_HEIGHT,
resultingHeight,
requiredWidth);
requiredWidth = NumberUtils.getResultingWidth(RESIZED_VIDEO_HEIGHT,
resultingHeight,
requiredWidth);
}
feedModel.setImageWidth(requiredWidth);
feedModel.setImageHeight(resultingHeight);
@ -229,10 +231,10 @@ public class FeedFragment extends Fragment implements SwipeRefreshLayout.OnRefre
if (feedModel
.getItemType() != MediaItemType.MEDIA_TYPE_SLIDER || sliderItems == null || sliderItems.length == 1)
Utils.batchDownload(requireContext(),
username,
DownloadMethod.DOWNLOAD_FEED,
Collections.singletonList(feedModel));
DownloadUtils.batchDownload(requireContext(),
username,
DownloadMethod.DOWNLOAD_FEED,
Collections.singletonList(feedModel));
else {
final ArrayList<BasePostModel> postModels = new ArrayList<>();
final DialogInterface.OnClickListener clickListener1 = (dialog, which) -> {
@ -255,10 +257,10 @@ public class FeedFragment extends Fragment implements SwipeRefreshLayout.OnRefre
postModels.add(sliderItems[0]);
}
if (postModels.size() > 0) {
Utils.batchDownload(requireContext(),
username,
DownloadMethod.DOWNLOAD_FEED,
postModels);
DownloadUtils.batchDownload(requireContext(),
username,
DownloadMethod.DOWNLOAD_FEED,
postModels);
}
};

View File

@ -76,7 +76,10 @@ import awais.instagrabber.repositories.responses.FriendshipRepoRestrictRootRespo
import awais.instagrabber.services.FriendshipService;
import awais.instagrabber.services.ServiceCallback;
import awais.instagrabber.utils.Constants;
import awais.instagrabber.utils.CookieUtils;
import awais.instagrabber.utils.DataBox;
import awais.instagrabber.utils.DownloadUtils;
import awais.instagrabber.utils.TextUtils;
import awais.instagrabber.utils.Utils;
import awais.instagrabber.viewmodels.HighlightsViewModel;
import awais.instagrabber.viewmodels.PostsViewModel;
@ -112,7 +115,7 @@ public class ProfileFragment extends Fragment implements SwipeRefreshLayout.OnRe
private final Runnable usernameSettingRunnable = () -> {
final ActionBar actionBar = fragmentActivity.getSupportActionBar();
if (actionBar != null && !Utils.isEmpty(username)) {
if (actionBar != null && !TextUtils.isEmpty(username)) {
final String finalUsername = username.startsWith("@") ? username.substring(1)
: username;
actionBar.setTitle(finalUsername);
@ -142,10 +145,10 @@ public class ProfileFragment extends Fragment implements SwipeRefreshLayout.OnRe
if (postsAdapter == null || username == null) {
return false;
}
Utils.batchDownload(requireContext(),
username,
DownloadMethod.DOWNLOAD_MAIN,
postsAdapter.getSelectedModels());
DownloadUtils.batchDownload(requireContext(),
username,
DownloadMethod.DOWNLOAD_MAIN,
postsAdapter.getSelectedModels());
checkAndResetAction();
return true;
}
@ -213,12 +216,12 @@ public class ProfileFragment extends Fragment implements SwipeRefreshLayout.OnRe
final ViewGroup container,
final Bundle savedInstanceState) {
cookie = settingsHelper.getString(Constants.COOKIE);
isLoggedIn = !Utils.isEmpty(cookie) && Utils.getUserIdFromCookie(cookie) != null;
isLoggedIn = !TextUtils.isEmpty(cookie) && CookieUtils.getUserIdFromCookie(cookie) != null;
if (root != null) {
if (getArguments() != null) {
final ProfileFragmentArgs fragmentArgs = ProfileFragmentArgs.fromBundle(getArguments());
final String username = fragmentArgs.getUsername();
if (Utils.isEmpty(username) && profileModel != null) {
if (TextUtils.isEmpty(username) && profileModel != null) {
final String profileModelUsername = profileModel.getUsername();
final boolean isSame = ("@" + profileModelUsername).equals(this.username);
if (isSame) {
@ -283,7 +286,7 @@ public class ProfileFragment extends Fragment implements SwipeRefreshLayout.OnRe
username = fragmentArgs.getUsername();
setUsernameDelayed();
}
if (Utils.isEmpty(username) && !isLoggedIn) {
if (TextUtils.isEmpty(username) && !isLoggedIn) {
binding.infoContainer.setVisibility(View.GONE);
binding.privatePage1.setImageResource(R.drawable.ic_outline_info_24);
binding.privatePage2.setText(R.string.no_acc);
@ -300,10 +303,10 @@ public class ProfileFragment extends Fragment implements SwipeRefreshLayout.OnRe
}
private void fetchUsername() {
final String uid = Utils.getUserIdFromCookie(cookie);
if (Utils.isEmpty(username) && uid != null) {
final String uid = CookieUtils.getUserIdFromCookie(cookie);
if (TextUtils.isEmpty(username) && uid != null) {
final FetchListener<String> fetchListener = username -> {
if (Utils.isEmpty(username)) return;
if (TextUtils.isEmpty(username)) return;
this.username = username;
setUsernameDelayed();
fetchProfileDetails();
@ -312,7 +315,7 @@ public class ProfileFragment extends Fragment implements SwipeRefreshLayout.OnRe
final DataBox.CookieModel cookieModel = Utils.dataBox.getCookie(uid);
if (cookieModel != null) {
final String username = cookieModel.getUsername();
if (!Utils.isEmpty(username)) {
if (!TextUtils.isEmpty(username)) {
found = true;
fetchListener.onResult("@" + username);
}
@ -330,7 +333,7 @@ public class ProfileFragment extends Fragment implements SwipeRefreshLayout.OnRe
new ProfileFetcher(username.substring(1), profileModel -> {
if (getContext() == null) return;
this.profileModel = profileModel;
final String userIdFromCookie = Utils.getUserIdFromCookie(cookie);
final String userIdFromCookie = CookieUtils.getUserIdFromCookie(cookie);
final boolean isSelf = isLoggedIn
&& profileModel != null
&& userIdFromCookie != null
@ -375,7 +378,7 @@ public class ProfileFragment extends Fragment implements SwipeRefreshLayout.OnRe
}
if (isLoggedIn) {
final String myId = Utils.getUserIdFromCookie(cookie);
final String myId = CookieUtils.getUserIdFromCookie(cookie);
if (profileId.equals(myId)) {
binding.btnTagged.setVisibility(View.VISIBLE);
binding.btnSaved.setVisibility(View.VISIBLE);
@ -471,14 +474,14 @@ public class ProfileFragment extends Fragment implements SwipeRefreshLayout.OnRe
span.setSpan(new StyleSpan(Typeface.BOLD), 0, followingCountStrLen, 0);
binding.mainFollowing.setText(span);
binding.mainFullName.setText(Utils.isEmpty(profileModel.getName()) ? profileModel.getUsername()
: profileModel.getName());
binding.mainFullName.setText(TextUtils.isEmpty(profileModel.getName()) ? profileModel.getUsername()
: profileModel.getName());
CharSequence biography = profileModel.getBiography();
binding.mainBiography.setCaptionIsExpandable(true);
binding.mainBiography.setCaptionIsExpanded(true);
if (Utils.hasMentions(biography)) {
biography = Utils.getMentionText(biography);
if (TextUtils.hasMentions(biography)) {
biography = TextUtils.getMentionText(biography);
binding.mainBiography.setText(biography, TextView.BufferType.SPANNABLE);
binding.mainBiography.setMentionClickListener(mentionClickListener);
} else {
@ -487,11 +490,11 @@ public class ProfileFragment extends Fragment implements SwipeRefreshLayout.OnRe
}
final String url = profileModel.getUrl();
if (Utils.isEmpty(url)) {
if (TextUtils.isEmpty(url)) {
binding.mainUrl.setVisibility(View.GONE);
} else {
binding.mainUrl.setVisibility(View.VISIBLE);
binding.mainUrl.setText(Utils.getSpannableUrl(url));
binding.mainUrl.setText(TextUtils.getSpannableUrl(url));
binding.mainUrl.setMovementMethod(LinkMovementMethod.getInstance());
}
@ -539,7 +542,7 @@ public class ProfileFragment extends Fragment implements SwipeRefreshLayout.OnRe
private void setupCommonListeners() {
final String userIdFromCookie = Utils.getUserIdFromCookie(cookie);
final String userIdFromCookie = CookieUtils.getUserIdFromCookie(cookie);
// final boolean isSelf = isLoggedIn && profileModel != null && userIdFromCookie != null && userIdFromCookie
// .equals(profileModel.getId());
final String favorite = Utils.dataBox.getFavorite(username);
@ -563,7 +566,7 @@ public class ProfileFragment extends Fragment implements SwipeRefreshLayout.OnRe
friendshipService.unfollow(
userIdFromCookie,
profileModel.getId(),
Utils.getCsrfTokenFromCookie(cookie),
CookieUtils.getCsrfTokenFromCookie(cookie),
new ServiceCallback<FriendshipRepoChangeRootResponse>() {
@Override
public void onSuccess(final FriendshipRepoChangeRootResponse result) {
@ -580,7 +583,7 @@ public class ProfileFragment extends Fragment implements SwipeRefreshLayout.OnRe
friendshipService.follow(
userIdFromCookie,
profileModel.getId(),
Utils.getCsrfTokenFromCookie(cookie),
CookieUtils.getCsrfTokenFromCookie(cookie),
new ServiceCallback<FriendshipRepoChangeRootResponse>() {
@Override
public void onSuccess(final FriendshipRepoChangeRootResponse result) {
@ -601,7 +604,7 @@ public class ProfileFragment extends Fragment implements SwipeRefreshLayout.OnRe
friendshipService.toggleRestrict(
profileModel.getId(),
!profileModel.getRestricted(),
Utils.getCsrfTokenFromCookie(cookie),
CookieUtils.getCsrfTokenFromCookie(cookie),
new ServiceCallback<FriendshipRepoRestrictRootResponse>() {
@Override
public void onSuccess(final FriendshipRepoRestrictRootResponse result) {
@ -621,7 +624,7 @@ public class ProfileFragment extends Fragment implements SwipeRefreshLayout.OnRe
friendshipService.unblock(
userIdFromCookie,
profileModel.getId(),
Utils.getCsrfTokenFromCookie(cookie),
CookieUtils.getCsrfTokenFromCookie(cookie),
new ServiceCallback<FriendshipRepoChangeRootResponse>() {
@Override
public void onSuccess(final FriendshipRepoChangeRootResponse result) {
@ -639,7 +642,7 @@ public class ProfileFragment extends Fragment implements SwipeRefreshLayout.OnRe
friendshipService.block(
userIdFromCookie,
profileModel.getId(),
Utils.getCsrfTokenFromCookie(cookie),
CookieUtils.getCsrfTokenFromCookie(cookie),
new ServiceCallback<FriendshipRepoChangeRootResponse>() {
@Override
public void onSuccess(final FriendshipRepoChangeRootResponse result) {

View File

@ -34,8 +34,10 @@ import awais.instagrabber.repositories.responses.UserInfo;
import awais.instagrabber.services.ProfileService;
import awais.instagrabber.services.ServiceCallback;
import awais.instagrabber.utils.Constants;
import awais.instagrabber.utils.CookieUtils;
import awais.instagrabber.utils.DataBox;
import awais.instagrabber.utils.FlavorTown;
import awais.instagrabber.utils.TextUtils;
import awais.instagrabber.utils.Utils;
import static awais.instagrabber.adapters.AccountSwitcherListAdapter.OnAccountLongClickListener;
@ -50,7 +52,7 @@ public class MorePreferencesFragment extends BasePreferencesFragment {
@Override
void setupPreferenceScreen(final PreferenceScreen screen) {
final String cookie = settingsHelper.getString(Constants.COOKIE);
final boolean isLoggedIn = !Utils.isEmpty(cookie) && Utils.getUserIdFromCookie(cookie) != null;
final boolean isLoggedIn = !TextUtils.isEmpty(cookie) && CookieUtils.getUserIdFromCookie(cookie) != null;
// screen.addPreference(new MoreHeaderPreference(requireContext()));
final PreferenceCategory accountCategory = new PreferenceCategory(requireContext());
@ -76,7 +78,7 @@ public class MorePreferencesFragment extends BasePreferencesFragment {
+ "To remove just one account, long tap the account from the account switcher dialog.\n"
+ "Do you want to continue?")
.setPositiveButton(R.string.yes, (dialog, which) -> {
Utils.setupCookies("LOGOUT");
CookieUtils.setupCookies("LOGOUT");
shouldRecreate();
Toast.makeText(requireContext(), R.string.logout_success, Toast.LENGTH_SHORT).show();
settingsHelper.putString(Constants.COOKIE, "");
@ -122,13 +124,13 @@ public class MorePreferencesFragment extends BasePreferencesFragment {
if (resultCode == Constants.LOGIN_RESULT_CODE) {
if (data == null) return;
final String cookie = data.getStringExtra("cookie");
Utils.setupCookies(cookie);
CookieUtils.setupCookies(cookie);
settingsHelper.putString(Constants.COOKIE, cookie);
// No use as the timing of show is unreliable
// Toast.makeText(requireContext(), R.string.login_success_loading_cookies, Toast.LENGTH_SHORT).show();
// adds cookies to database for quick access
final String uid = Utils.getUserIdFromCookie(cookie);
final String uid = CookieUtils.getUserIdFromCookie(cookie);
final ProfileService profileService = ProfileService.getInstance();
profileService.getUserInfo(uid, new ServiceCallback<UserInfo>() {
@Override
@ -204,7 +206,7 @@ public class MorePreferencesFragment extends BasePreferencesFragment {
.create();
accountSwitchDialog.setOnDismissListener(dialog -> {
if (tappedModel == null) return;
Utils.setupCookies(tappedModel.getCookie());
CookieUtils.setupCookies(tappedModel.getCookie());
settingsHelper.putString(Constants.COOKIE, tappedModel.getCookie());
});
}
@ -230,7 +232,7 @@ public class MorePreferencesFragment extends BasePreferencesFragment {
private void sortUserList(final String cookie, final List<DataBox.CookieModel> allUsers) {
boolean sortByName = true;
for (final DataBox.CookieModel user : allUsers) {
if (Utils.isEmpty(user.getFullName())) {
if (TextUtils.isEmpty(user.getFullName())) {
sortByName = false;
break;
}
@ -280,7 +282,7 @@ public class MorePreferencesFragment extends BasePreferencesFragment {
if (icon <= 0) preference.setIconSpaceReserved(false);
if (icon > 0) preference.setIcon(icon);
preference.setTitle(title);
if (!Utils.isEmpty(summary)) {
if (!TextUtils.isEmpty(summary)) {
preference.setSummary(summary);
}
preference.setOnPreferenceClickListener(clickListener);
@ -316,7 +318,7 @@ public class MorePreferencesFragment extends BasePreferencesFragment {
final View root = holder.itemView;
if (onClickListener != null) root.setOnClickListener(onClickListener);
final PrefAccountSwitcherBinding binding = PrefAccountSwitcherBinding.bind(root);
final String uid = Utils.getUserIdFromCookie(cookie);
final String uid = CookieUtils.getUserIdFromCookie(cookie);
final DataBox.CookieModel user = Utils.dataBox.getCookie(uid);
if (user == null) return;
binding.fullName.setText(user.getFullName());

View File

@ -2,11 +2,9 @@ package awais.instagrabber.fragments.settings;
import android.content.Context;
import android.content.res.TypedArray;
import android.os.Bundle;
import android.view.View;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.widget.AppCompatButton;
import androidx.appcompat.widget.AppCompatTextView;
import androidx.fragment.app.FragmentActivity;
@ -25,7 +23,9 @@ import java.util.Date;
import awais.instagrabber.R;
import awais.instagrabber.dialogs.TimeSettingsDialog;
import awais.instagrabber.utils.Constants;
import awais.instagrabber.utils.CookieUtils;
import awais.instagrabber.utils.DirectoryChooser;
import awais.instagrabber.utils.TextUtils;
import awais.instagrabber.utils.Utils;
import static awais.instagrabber.utils.Constants.FOLDER_PATH;
@ -40,7 +40,7 @@ public class SettingsPreferencesFragment extends BasePreferencesFragment {
@Override
void setupPreferenceScreen(final PreferenceScreen screen) {
final String cookie = settingsHelper.getString(Constants.COOKIE);
isLoggedIn = !Utils.isEmpty(cookie) && Utils.getUserIdFromCookie(cookie) != null;
isLoggedIn = !TextUtils.isEmpty(cookie) && CookieUtils.getUserIdFromCookie(cookie) != null;
final PreferenceCategory generalCategory = new PreferenceCategory(requireContext());
screen.addPreference(generalCategory);
generalCategory.setTitle(getString(R.string.pref_category_general));
@ -331,7 +331,7 @@ public class SettingsPreferencesFragment extends BasePreferencesFragment {
btnSaveTo.setOnClickListener(v -> {
if (onSelectFolderButtonClickListener == null) return;
onSelectFolderButtonClickListener.onClick(result -> {
if (Utils.isEmpty(result)) return;
if (TextUtils.isEmpty(result)) return;
customPathTextView.setText(result);
});
});

View File

@ -4,6 +4,7 @@ import androidx.annotation.NonNull;
import java.util.Date;
import awais.instagrabber.utils.TextUtils;
import awais.instagrabber.utils.Utils;
public final class CommentModel {
@ -18,7 +19,7 @@ public final class CommentModel {
public CommentModel(final String id, final String text, final long timestamp, final long likes, final boolean liked,
final ProfileModel profileModel) {
this.id = id;
this.text = Utils.hasMentions(text) ? Utils.getMentionText(text) : text;
this.text = TextUtils.hasMentions(text) ? TextUtils.getMentionText(text) : text;
this.likes = likes;
this.liked = liked;
this.timestamp = timestamp;

View File

@ -5,6 +5,7 @@ import androidx.annotation.NonNull;
import java.util.Date;
import awais.instagrabber.models.enums.NotificationType;
import awais.instagrabber.utils.TextUtils;
import awais.instagrabber.utils.Utils;
public final class NotificationModel {
@ -16,7 +17,7 @@ public final class NotificationModel {
public NotificationModel(final String id, final String text, final long timestamp, final String username,
final String profilePicUrl, final String shortcode, final String previewUrl, final NotificationType type) {
this.id = id;
this.text = Utils.hasMentions(text) ? Utils.getMentionText(text) : text;
this.text = TextUtils.hasMentions(text) ? TextUtils.getMentionText(text) : text;
this.timestamp = timestamp;
this.username = username;
this.profilePicUrl = profilePicUrl;

View File

@ -11,6 +11,7 @@ import awais.instagrabber.models.enums.DirectItemType;
import awais.instagrabber.models.enums.MediaItemType;
import awais.instagrabber.models.enums.RavenExpiringMediaType;
import awais.instagrabber.models.enums.RavenMediaViewType;
import awais.instagrabber.utils.CookieUtils;
import awais.instagrabber.utils.Utils;
import static awais.instagrabber.utils.Constants.COOKIE;
@ -39,7 +40,7 @@ public final class DirectItemModel implements Serializable, Comparable<DirectIte
final DirectItemActionLogModel actionLogModel, final DirectItemVoiceMediaModel voiceMediaModel,
final DirectItemRavenMediaModel ravenMediaModel, final DirectItemVideoCallEventModel videoCallEventModel,
final DirectItemAnimatedMediaModel animatedMediaModel) {
final String myId = Utils.getUserIdFromCookie(Utils.settingsHelper.getString(COOKIE));
final String myId = CookieUtils.getUserIdFromCookie(Utils.settingsHelper.getString(COOKIE));
this.userId = userId;
this.timestamp = timestamp;
this.itemType = itemType;

View File

@ -1,11 +1,34 @@
package awais.instagrabber.models.enums;
import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;
public enum NotificationType implements Serializable {
LIKE,
FOLLOW,
COMMENT,
MENTION,
REQUEST
LIKE("GraphLikeAggregatedStory"),
FOLLOW("GraphFollowAggregatedStory"),
COMMENT("GraphCommentMediaStory"),
MENTION("GraphMentionStory"),
REQUEST("REQUEST");
private final String itemType;
private static Map<String, NotificationType> map = new HashMap<>();
static {
for (NotificationType type : NotificationType.values()) {
map.put(type.itemType, type);
}
}
NotificationType(final String itemType) {
this.itemType = itemType;
}
public String getItemType() {
return itemType;
}
public static NotificationType valueOfType(final String itemType) {
return map.get(itemType);
}
}

View File

@ -128,7 +128,7 @@ public class MediaService extends BaseService {
form.put("_uuid", UUID.randomUUID().toString());
form.put("comment_text", comment);
form.put("containermodule", module);
if (!Utils.isEmpty(replyToCommentId)) {
if (!awais.instagrabber.utils.TextUtils.isEmpty(replyToCommentId)) {
form.put("replied_to_comment_id", replyToCommentId);
}
final Map<String, String> signedForm = Utils.sign(form);

View File

@ -22,7 +22,7 @@ import awais.instagrabber.models.stickers.QuestionModel;
import awais.instagrabber.models.stickers.QuizModel;
import awais.instagrabber.repositories.StoriesRepository;
import awais.instagrabber.utils.Constants;
import awais.instagrabber.utils.Utils;
import awais.instagrabber.utils.ResponseBodyUtils;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
@ -149,7 +149,7 @@ public class StoriesService extends BaseService {
final JSONArray videoResources = data.optJSONArray("video_versions");
if (isVideo && videoResources != null)
model.setVideoUrl(Utils.getHighQualityPost(videoResources, true, true, false));
model.setVideoUrl(ResponseBodyUtils.getHighQualityPost(videoResources, true, true, false));
if (data.has("story_feed_media")) {
model.setTappableShortCode(data.getJSONArray("story_feed_media").getJSONObject(0).optString("media_id"));

View File

@ -71,4 +71,7 @@ public final class Constants {
public static final String FDROID_SHA1_FINGERPRINT = "C1661EB8FD09F618307E687786D5E5056F65084D";
public static final String SKIPPED_VERSION = "skipped_version";
public static final String DEFAULT_TAB = "default_tab";
public static final String CHANNEL_ID = "InstaGrabber";
public static final String CHANNEL_NAME = "Instagrabber";
public static final String NOTIF_GROUP_NAME = "awais.instagrabber.InstaNotif";
}

View File

@ -0,0 +1,148 @@
package awais.instagrabber.utils;
import android.util.Log;
import android.webkit.CookieManager;
import androidx.annotation.Nullable;
import java.net.CookiePolicy;
import java.net.CookieStore;
import java.net.HttpCookie;
import java.net.URI;
import java.net.URISyntaxException;
import awais.instagrabber.BuildConfig;
import awaisomereport.LogCollector;
public final class CookieUtils {
public static final CookieManager COOKIE_MANAGER = CookieManager.getInstance();
public static final java.net.CookieManager NET_COOKIE_MANAGER = new java.net.CookieManager(null, CookiePolicy.ACCEPT_ALL);
public static void setupCookies(final String cookieRaw) {
final CookieStore cookieStore = NET_COOKIE_MANAGER.getCookieStore();
if (cookieStore == null || TextUtils.isEmpty(cookieRaw)) {
return;
}
if (cookieRaw.equals("LOGOUT")) {
cookieStore.removeAll();
Utils.dataBox.deleteAllUserCookies();
return;
}
try {
final URI uri1 = new URI("https://instagram.com");
final URI uri2 = new URI("https://instagram.com/");
final URI uri3 = new URI("https://i.instagram.com/");
for (final String cookie : cookieRaw.split("; ")) {
final String[] strings = cookie.split("=", 2);
final HttpCookie httpCookie = new HttpCookie(strings[0].trim(), strings[1].trim());
httpCookie.setDomain(".instagram.com");
httpCookie.setPath("/");
httpCookie.setVersion(0);
cookieStore.add(uri1, httpCookie);
cookieStore.add(uri2, httpCookie);
cookieStore.add(uri3, httpCookie);
}
} catch (final URISyntaxException e) {
if (Utils.logCollector != null)
Utils.logCollector.appendException(e, LogCollector.LogFile.UTILS, "setupCookies");
if (BuildConfig.DEBUG) Log.e("AWAISKING_APP", "", e);
}
}
@Nullable
public static String getUserIdFromCookie(final String cookie) {
if (!TextUtils.isEmpty(cookie)) {
final int uidIndex = cookie.indexOf("ds_user_id=");
if (uidIndex > 0) {
String uid = cookie.split("ds_user_id=")[1].split(";")[0];
return !TextUtils.isEmpty(uid) ? uid : null;
}
}
return null;
}
public static String getCsrfTokenFromCookie(final String cookie) {
if (cookie == null) {
return null;
}
return cookie.split("csrftoken=")[1].split(";")[0];
}
@Nullable
public static String getCookie(@Nullable final String webViewUrl) {
int lastLongestCookieLength = 0;
String mainCookie = null;
String cookie;
if (!TextUtils.isEmpty(webViewUrl)) {
cookie = COOKIE_MANAGER.getCookie(webViewUrl);
if (cookie != null) {
final int cookieLen = cookie.length();
if (cookieLen > lastLongestCookieLength) {
mainCookie = cookie;
lastLongestCookieLength = cookieLen;
}
}
}
cookie = COOKIE_MANAGER.getCookie("https://instagram.com");
if (cookie != null) {
final int cookieLen = cookie.length();
if (cookieLen > lastLongestCookieLength) {
mainCookie = cookie;
lastLongestCookieLength = cookieLen;
}
}
cookie = COOKIE_MANAGER.getCookie("https://instagram.com/");
if (cookie != null) {
final int cookieLen = cookie.length();
if (cookieLen > lastLongestCookieLength) {
mainCookie = cookie;
lastLongestCookieLength = cookieLen;
}
}
cookie = COOKIE_MANAGER.getCookie("http://instagram.com");
if (cookie != null) {
final int cookieLen = cookie.length();
if (cookieLen > lastLongestCookieLength) {
mainCookie = cookie;
lastLongestCookieLength = cookieLen;
}
}
cookie = COOKIE_MANAGER.getCookie("http://instagram.com/");
if (cookie != null) {
final int cookieLen = cookie.length();
if (cookieLen > lastLongestCookieLength) {
mainCookie = cookie;
lastLongestCookieLength = cookieLen;
}
}
cookie = COOKIE_MANAGER.getCookie("https://www.instagram.com");
if (cookie != null) {
final int cookieLen = cookie.length();
if (cookieLen > lastLongestCookieLength) {
mainCookie = cookie;
lastLongestCookieLength = cookieLen;
}
}
cookie = COOKIE_MANAGER.getCookie("https://www.instagram.com/");
if (cookie != null) {
final int cookieLen = cookie.length();
if (cookieLen > lastLongestCookieLength) {
mainCookie = cookie;
lastLongestCookieLength = cookieLen;
}
}
cookie = COOKIE_MANAGER.getCookie("http://www.instagram.com");
if (cookie != null) {
final int cookieLen = cookie.length();
if (cookieLen > lastLongestCookieLength) {
mainCookie = cookie;
lastLongestCookieLength = cookieLen;
}
}
cookie = COOKIE_MANAGER.getCookie("http://www.instagram.com/");
if (cookie != null && cookie.length() > lastLongestCookieLength) mainCookie = cookie;
return mainCookie;
}
}

View File

@ -77,7 +77,7 @@ public final class DataBox extends SQLiteOpenHelper {
public final void addFavorite(@NonNull final FavoriteModel favoriteModel) {
final String query = favoriteModel.getQuery();
final String display = favoriteModel.getDisplayName();
if (!Utils.isEmpty(query)) {
if (!TextUtils.isEmpty(query)) {
try (final SQLiteDatabase db = getWritableDatabase()) {
db.beginTransaction();
try {
@ -105,7 +105,7 @@ public final class DataBox extends SQLiteOpenHelper {
public final synchronized void delFavorite(@NonNull final FavoriteModel favoriteModel) {
final String query = favoriteModel.getQuery();
if (!Utils.isEmpty(query)) {
if (!TextUtils.isEmpty(query)) {
try (final SQLiteDatabase db = getWritableDatabase()) {
db.beginTransaction();
try {
@ -202,7 +202,7 @@ public final class DataBox extends SQLiteOpenHelper {
final String cookie,
final String fullName,
final String profilePicUrl) {
if (Utils.isEmpty(uid)) return;
if (TextUtils.isEmpty(uid)) return;
try (final SQLiteDatabase db = getWritableDatabase()) {
db.beginTransaction();
try {
@ -229,7 +229,7 @@ public final class DataBox extends SQLiteOpenHelper {
public final synchronized void delUserCookie(@NonNull final CookieModel cookieModel) {
final String cookieModelUid = cookieModel.getUid();
if (!Utils.isEmpty(cookieModelUid)) {
if (!TextUtils.isEmpty(cookieModelUid)) {
try (final SQLiteDatabase db = getWritableDatabase()) {
db.beginTransaction();
try {

View File

@ -46,7 +46,7 @@ public final class DirectoryChooser extends DialogFragment {
}
public DirectoryChooser setInitialDirectory(final String initialDirectory) {
if (!Utils.isEmpty(initialDirectory))
if (!TextUtils.isEmpty(initialDirectory))
this.initialDirectory = initialDirectory;
return this;
}
@ -123,7 +123,7 @@ public final class DirectoryChooser extends DialogFragment {
directoriesList.setAdapter(listDirectoriesAdapter);
final File initDir = new File(initialDirectory);
final File initialDir = !Utils.isEmpty(initialDirectory) && isValidFile(initDir) ? initDir : Environment.getExternalStorageDirectory();
final File initialDir = !TextUtils.isEmpty(initialDirectory) && isValidFile(initDir) ? initDir : Environment.getExternalStorageDirectory();
changeDirectory(initialDir);
@ -134,11 +134,11 @@ public final class DirectoryChooser extends DialogFragment {
public void onCreate(@Nullable final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (Utils.isEmpty(initialDirectory)) {
if (TextUtils.isEmpty(initialDirectory)) {
initialDirectory = new File(sdcardPath, "Download").getAbsolutePath();
if (savedInstanceState != null) {
final String savedDir = savedInstanceState.getString(KEY_CURRENT_DIRECTORY);
if (!Utils.isEmpty(savedDir)) initialDirectory = savedDir;
if (!TextUtils.isEmpty(savedDir)) initialDirectory = savedDir;
}
}

View File

@ -0,0 +1,218 @@
package awais.instagrabber.utils;
import android.Manifest;
import android.app.Activity;
import android.content.Context;
import android.content.pm.PackageManager;
import android.os.AsyncTask;
import android.os.Environment;
import android.util.Log;
import android.util.Pair;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import java.io.File;
import java.io.FilenameFilter;
import java.util.List;
import java.util.regex.Pattern;
import awais.instagrabber.BuildConfig;
import awais.instagrabber.R;
import awais.instagrabber.asyncs.DownloadAsync;
import awais.instagrabber.asyncs.PostFetcher;
import awais.instagrabber.models.BasePostModel;
import awais.instagrabber.models.StoryModel;
import awais.instagrabber.models.direct_messages.DirectItemModel;
import awais.instagrabber.models.enums.DownloadMethod;
import awais.instagrabber.models.enums.MediaItemType;
import awaisomereport.LogCollector;
import static awais.instagrabber.utils.Constants.FOLDER_PATH;
import static awais.instagrabber.utils.Constants.FOLDER_SAVE_TO;
public final class DownloadUtils {
public static final String[] PERMS = new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE};
public static void batchDownload(@NonNull final Context context, @Nullable String username, final DownloadMethod method,
final List<? extends BasePostModel> itemsToDownload) {
if (Utils.settingsHelper == null) Utils.settingsHelper = new SettingsHelper(context);
if (itemsToDownload == null || itemsToDownload.size() < 1) return;
if (username != null && username.charAt(0) == '@') username = username.substring(1);
if (ContextCompat.checkSelfPermission(context, PERMS[0]) == PackageManager.PERMISSION_GRANTED)
batchDownloadImpl(context, username, method, itemsToDownload);
else if (context instanceof Activity)
ActivityCompat.requestPermissions((Activity) context, PERMS, 8020);
}
private static void batchDownloadImpl(@NonNull final Context context,
@Nullable final String username,
final DownloadMethod method,
final List<? extends BasePostModel> itemsToDownload) {
File dir = new File(Environment.getExternalStorageDirectory(), "Download");
if (Utils.settingsHelper.getBoolean(FOLDER_SAVE_TO)) {
final String customPath = Utils.settingsHelper.getString(FOLDER_PATH);
if (!TextUtils.isEmpty(customPath)) dir = new File(customPath);
}
if (Utils.settingsHelper.getBoolean(Constants.DOWNLOAD_USER_FOLDER) && !TextUtils.isEmpty(username))
dir = new File(dir, username);
if (!dir.exists() && !dir.mkdirs()) {
Toast.makeText(context, R.string.error_creating_folders, Toast.LENGTH_SHORT).show();
return;
}
boolean checkEachPost = false;
switch (method) {
case DOWNLOAD_SAVED:
case DOWNLOAD_MAIN:
checkEachPost = true;
break;
case DOWNLOAD_FEED:
checkEachPost = false;
break;
}
final int itemsToDownloadSize = itemsToDownload.size();
for (int i = 0; i < itemsToDownloadSize; i++) {
final BasePostModel selectedItem = itemsToDownload.get(i);
if (!checkEachPost) {
final boolean isSlider = itemsToDownloadSize > 1;
final File saveFile = getDownloadSaveFile(dir, selectedItem, isSlider ? "_slide_" + (i + 1) : "");
new DownloadAsync(context,
selectedItem.getDisplayUrl(),
saveFile,
file -> selectedItem.setDownloaded(true))
.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
} else {
final File finalDir = dir;
new PostFetcher(selectedItem.getShortCode(), result -> {
if (result != null) {
final int resultsSize = result.length;
final boolean multiResult = resultsSize > 1;
for (int j = 0; j < resultsSize; j++) {
final BasePostModel model = result[j];
final File saveFile = getDownloadSaveFile(finalDir, model, multiResult ? "_slide_" + (j + 1) : "");
new DownloadAsync(context,
model.getDisplayUrl(),
saveFile,
file -> model.setDownloaded(true))
.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
}
}
}).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
}
}
}
public static void dmDownload(@NonNull final Context context, @Nullable final String username, final DownloadMethod method,
final DirectItemModel.DirectItemMediaModel itemsToDownload) {
if (Utils.settingsHelper == null) Utils.settingsHelper = new SettingsHelper(context);
if (itemsToDownload == null) return;
if (ContextCompat.checkSelfPermission(context, PERMS[0]) == PackageManager.PERMISSION_GRANTED)
dmDownloadImpl(context, username, method, itemsToDownload);
else if (context instanceof Activity)
ActivityCompat.requestPermissions((Activity) context, PERMS, 8020);
}
private static void dmDownloadImpl(@NonNull final Context context, @Nullable final String username,
final DownloadMethod method, final DirectItemModel.DirectItemMediaModel selectedItem) {
File dir = new File(Environment.getExternalStorageDirectory(), "Download");
if (Utils.settingsHelper.getBoolean(FOLDER_SAVE_TO)) {
final String customPath = Utils.settingsHelper.getString(FOLDER_PATH);
if (!TextUtils.isEmpty(customPath)) dir = new File(customPath);
}
if (Utils.settingsHelper.getBoolean(Constants.DOWNLOAD_USER_FOLDER) && !TextUtils.isEmpty(username))
dir = new File(dir, username);
if (dir.exists() || dir.mkdirs()) {
new DownloadAsync(context,
selectedItem.getMediaType() == MediaItemType.MEDIA_TYPE_VIDEO ? selectedItem.getVideoUrl() : selectedItem.getThumbUrl(),
getDownloadSaveFileDm(dir, selectedItem, ""),
null).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
} else
Toast.makeText(context, R.string.error_creating_folders, Toast.LENGTH_SHORT).show();
}
@NonNull
private static File getDownloadSaveFile(final File finalDir, @NonNull final BasePostModel model, final String sliderPrefix) {
final String displayUrl = model.getDisplayUrl();
return new File(finalDir, model.getPostId() + '_' + model.getPosition() + sliderPrefix +
getExtensionFromModel(displayUrl, model));
}
@NonNull
private static File getDownloadSaveFileDm(final File finalDir,
@NonNull final DirectItemModel.DirectItemMediaModel model,
final String sliderPrefix) {
final String displayUrl = model.getMediaType() == MediaItemType.MEDIA_TYPE_VIDEO ? model.getVideoUrl() : model.getThumbUrl();
return new File(finalDir, model.getId() + sliderPrefix +
getExtensionFromModel(displayUrl, model));
}
@NonNull
public static String getExtensionFromModel(@NonNull final String url, final Object model) {
final String extension;
final int index = url.indexOf('?');
if (index != -1) extension = url.substring(index - 4, index);
else {
final boolean isVideo;
if (model instanceof StoryModel)
isVideo = ((StoryModel) model).getItemType() == MediaItemType.MEDIA_TYPE_VIDEO;
else if (model instanceof BasePostModel)
isVideo = ((BasePostModel) model).getItemType() == MediaItemType.MEDIA_TYPE_VIDEO;
else
isVideo = false;
extension = isVideo || url.contains(".mp4") ? ".mp4" : ".jpg";
}
return extension;
}
public static void checkExistence(final File downloadDir, final File customDir, final boolean isSlider,
@NonNull final BasePostModel model) {
boolean exists = false;
try {
final String displayUrl = model.getDisplayUrl();
int index = displayUrl.indexOf('?');
if (index < 0) {
return;
}
final String fileName = model.getPostId() + '_';
final String extension = displayUrl.substring(index - 4, index);
final String fileWithoutPrefix = fileName + '0' + extension;
exists = new File(downloadDir, fileWithoutPrefix).exists();
if (!exists) {
final String fileWithPrefix = fileName + "[\\d]+(|_slide_[\\d]+)(\\.mp4|\\" + extension + ")";
final FilenameFilter filenameFilter = (dir, name) -> Pattern.matches(fileWithPrefix, name);
File[] files = downloadDir.listFiles(filenameFilter);
if ((files == null || files.length < 1) && customDir != null)
files = customDir.listFiles(filenameFilter);
if (files != null && files.length >= 1) exists = true;
}
} catch (final Exception e) {
if (Utils.logCollector != null)
Utils.logCollector.appendException(e, LogCollector.LogFile.UTILS, "checkExistence",
new Pair<>("isSlider", isSlider),
new Pair<>("model", model));
if (BuildConfig.DEBUG) Log.e("AWAISKING_APP", "", e);
}
model.setDownloaded(exists);
}
}

View File

@ -45,8 +45,8 @@ public final class ExportImportUtils {
public static void Export(@Nullable final String password, @ExportImportFlags final int flags, @NonNull final File filePath,
final FetchListener<Boolean> fetchListener) {
final String exportString = ExportImportUtils.getExportString(flags);
if (!Utils.isEmpty(exportString)) {
final boolean isPass = !Utils.isEmpty(password);
if (!TextUtils.isEmpty(exportString)) {
final boolean isPass = !TextUtils.isEmpty(password);
byte[] exportBytes = null;
if (isPass) {
@ -100,7 +100,7 @@ public final class ExportImportUtils {
new AlertDialog.Builder(context).setView(editText).setTitle(R.string.password)
.setPositiveButton(R.string.confirm, (dialog, which) -> {
final CharSequence text = editText.getText();
if (!Utils.isEmpty(text)) {
if (!TextUtils.isEmpty(text)) {
try {
final byte[] passwordBytes = text.toString().getBytes();
final byte[] bytes = new byte[32];
@ -228,16 +228,16 @@ public final class ExportImportUtils {
json.put(Constants.APP_LANGUAGE, settingsHelper.getString(Constants.APP_LANGUAGE));
String str = settingsHelper.getString(Constants.FOLDER_PATH);
if (!Utils.isEmpty(str)) json.put(Constants.FOLDER_PATH, str);
if (!TextUtils.isEmpty(str)) json.put(Constants.FOLDER_PATH, str);
str = settingsHelper.getString(Constants.DATE_TIME_FORMAT);
if (!Utils.isEmpty(str)) json.put(Constants.DATE_TIME_FORMAT, str);
if (!TextUtils.isEmpty(str)) json.put(Constants.DATE_TIME_FORMAT, str);
str = settingsHelper.getString(Constants.DATE_TIME_SELECTION);
if (!Utils.isEmpty(str)) json.put(Constants.DATE_TIME_SELECTION, str);
if (!TextUtils.isEmpty(str)) json.put(Constants.DATE_TIME_SELECTION, str);
str = settingsHelper.getString(Constants.CUSTOM_DATE_TIME_FORMAT);
if (!Utils.isEmpty(str)) json.put(Constants.CUSTOM_DATE_TIME_FORMAT, str);
if (!TextUtils.isEmpty(str)) json.put(Constants.CUSTOM_DATE_TIME_FORMAT, str);
json.put(Constants.DOWNLOAD_USER_FOLDER, settingsHelper.getBoolean(Constants.DOWNLOAD_USER_FOLDER));
json.put(Constants.MUTED_VIDEOS, settingsHelper.getBoolean(Constants.MUTED_VIDEOS));

View File

@ -22,7 +22,7 @@ public final class LocaleUtils {
final String lang = LocaleUtils.getCorrespondingLanguageCode(baseContext);
currentLocale = Utils.isEmpty(lang) ? defaultLocale : new Locale(lang);
currentLocale = TextUtils.isEmpty(lang) ? defaultLocale : new Locale(lang);
Locale.setDefault(currentLocale);
final Resources res = baseContext.getResources();
@ -56,7 +56,7 @@ public final class LocaleUtils {
Utils.settingsHelper = new SettingsHelper(baseContext);
final String appLanguageSettings = Utils.settingsHelper.getString(Constants.APP_LANGUAGE);
if (Utils.isEmpty(appLanguageSettings)) return null;
if (TextUtils.isEmpty(appLanguageSettings)) return null;
final int appLanguageIndex = Integer.parseInt(appLanguageSettings);
if (appLanguageIndex == 1) return "en";

View File

@ -0,0 +1,50 @@
package awais.instagrabber.utils;
import androidx.annotation.NonNull;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.util.Map;
import java.util.Set;
public final class NetworkUtils {
@NonNull
public static String readFromConnection(@NonNull final HttpURLConnection conn) throws Exception {
final StringBuilder sb = new StringBuilder();
try (final BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()))) {
String line;
while ((line = br.readLine()) != null) sb.append(line).append('\n');
}
return sb.toString();
}
public static void setConnectionHeaders(final HttpURLConnection connection, final Map<String, String> headers) {
if (connection == null || headers == null || headers.isEmpty()) {
return;
}
for (Map.Entry<String, String> header : headers.entrySet()) {
connection.setRequestProperty(header.getKey(), header.getValue());
}
}
public static String getQueryString(final Map<String, String> queryParamsMap) {
if (queryParamsMap == null || queryParamsMap.isEmpty()) {
return "";
}
final Set<Map.Entry<String, String>> params = queryParamsMap.entrySet();
final StringBuilder builder = new StringBuilder();
for (final Map.Entry<String, String> param : params) {
if (TextUtils.isEmpty(param.getKey())) {
continue;
}
if (builder.length() != 0) {
builder.append("&");
}
builder.append(param.getKey());
builder.append("=");
builder.append(param.getValue() != null ? param.getValue() : "");
}
return builder.toString();
}
}

View File

@ -0,0 +1,56 @@
package awais.instagrabber.utils;
import androidx.annotation.NonNull;
import java.util.Random;
public final class NumberUtils {
@NonNull
public static String millisToString(final long timeMs) {
final long totalSeconds = timeMs / 1000;
final long seconds = totalSeconds % 60;
final long minutes = totalSeconds / 60 % 60;
final long hours = totalSeconds / 3600;
final String strSec = Long.toString(seconds);
final String strMin = Long.toString(minutes);
final String strRetSec = strSec.length() > 1 ? strSec : "0" + seconds;
final String strRetMin = strMin.length() > 1 ? strMin : "0" + minutes;
final String retMinSec = strRetMin + ':' + strRetSec;
if (hours > 0)
return Long.toString(hours) + ':' + retMinSec;
return retMinSec;
}
public static int getResultingHeight(final int requiredWidth, final int height, final int width) {
return requiredWidth * height / width;
}
public static int getResultingWidth(final int requiredHeight, final int height, final int width) {
return requiredHeight * width / height;
}
public static long random(long origin, long bound) {
final Random random = new Random();
long r = random.nextLong();
long n = bound - origin, m = n - 1;
if ((n & m) == 0L) // power of two
r = (r & m) + origin;
else if (n > 0L) { // reject over-represented candidates
//noinspection StatementWithEmptyBody
for (long u = r >>> 1; // ensure non-negative
u + m - (r = u % n) < 0L; // rejection check
u = random.nextLong() >>> 1) // retry
;
r += origin;
} else { // range not representable as long
while (r < origin || r >= bound)
r = random.nextLong();
}
return r;
}
}

View File

@ -0,0 +1,562 @@
package awais.instagrabber.utils;
import android.util.Log;
import android.util.Pair;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import org.json.JSONArray;
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.Locale;
import awais.instagrabber.BuildConfig;
import awais.instagrabber.models.ProfileModel;
import awais.instagrabber.models.direct_messages.DirectItemModel;
import awais.instagrabber.models.direct_messages.InboxThreadModel;
import awais.instagrabber.models.enums.DirectItemType;
import awais.instagrabber.models.enums.InboxReadState;
import awais.instagrabber.models.enums.MediaItemType;
import awais.instagrabber.models.enums.RavenExpiringMediaType;
import awais.instagrabber.models.enums.RavenMediaViewType;
import awaisomereport.LogCollector;
public final class ResponseBodyUtils {
// isI: true if the content was requested from i.instagram.com instead of graphql
@Nullable
public static String getHighQualityPost(final JSONArray resources, final boolean isVideo, final boolean isI, final boolean low) {
try {
final int resourcesLen = resources.length();
final String[] sources = new String[resourcesLen];
int lastResMain = low ? 1000000 : 0, lastIndexMain = -1;
int lastResBase = low ? 1000000 : 0, lastIndexBase = -1;
for (int i = 0; i < resourcesLen; ++i) {
final JSONObject item = resources.getJSONObject(i);
if (item != null && (!isVideo || item.has(Constants.EXTRAS_PROFILE) || isI)) {
sources[i] = item.getString(isI ? "url" : "src");
final int currRes = item.getInt(isI ? "width" : "config_width") * item.getInt(isI ? "height" : "config_height");
final String profile = isVideo ? item.optString(Constants.EXTRAS_PROFILE) : null;
if (!isVideo || "MAIN".equals(profile)) {
if (currRes > lastResMain && !low) {
lastResMain = currRes;
lastIndexMain = i;
} else if (currRes < lastResMain && low) {
lastResMain = currRes;
lastIndexMain = i;
}
} else {
if (currRes > lastResBase && !low) {
lastResBase = currRes;
lastIndexBase = i;
} else if (currRes < lastResBase && low) {
lastResBase = currRes;
lastIndexBase = i;
}
}
}
}
if (lastIndexMain >= 0) return sources[lastIndexMain];
else if (lastIndexBase >= 0) return sources[lastIndexBase];
} catch (final Exception e) {
if (Utils.logCollector != null)
Utils.logCollector.appendException(e, LogCollector.LogFile.UTILS, "getHighQualityPost",
new Pair<>("resourcesNull", resources == null),
new Pair<>("isVideo", isVideo));
if (BuildConfig.DEBUG) Log.e("AWAISKING_APP", "", e);
}
return null;
}
public static String getHighQualityImage(final JSONObject resources) {
String src = null;
try {
if (resources.has("display_resources"))
src = getHighQualityPost(resources.getJSONArray("display_resources"), false, false, false);
else if (resources.has("image_versions2"))
src = getHighQualityPost(resources.getJSONObject("image_versions2").getJSONArray("candidates"), false, true, false);
if (src == null) return resources.getString("display_url");
} catch (final Exception e) {
if (Utils.logCollector != null)
Utils.logCollector.appendException(e, LogCollector.LogFile.UTILS, "getHighQualityImage",
new Pair<>("resourcesNull", resources == null));
if (BuildConfig.DEBUG) Log.e("AWAISKING_APP", "", e);
}
return src;
}
public static String getLowQualityImage(final JSONObject resources) {
String src = null;
try {
src = getHighQualityPost(resources.getJSONObject("image_versions2").getJSONArray("candidates"), false, true, true);
} catch (final Exception e) {
if (Utils.logCollector != null)
Utils.logCollector.appendException(e, LogCollector.LogFile.UTILS, "getLowQualityImage",
new Pair<>("resourcesNull", resources == null));
if (BuildConfig.DEBUG) Log.e("AWAISKING_APP", "", e);
}
return src;
}
public static String getItemThumbnail(@NonNull final JSONArray jsonArray) {
String thumbnail = null;
final int imageResLen = jsonArray.length();
for (int i = 0; i < imageResLen; ++i) {
final JSONObject imageResource = jsonArray.optJSONObject(i);
try {
final int width = imageResource.getInt("width");
final int height = imageResource.getInt("height");
final float ratio = Float.parseFloat(String.format(Locale.ENGLISH, "%.2f", (float) height / width));
if (ratio >= 0.95f && ratio <= 1.0f) {
thumbnail = imageResource.getString("url");
break;
}
} catch (final Exception e) {
if (Utils.logCollector != null)
Utils.logCollector.appendException(e, LogCollector.LogFile.UTILS, "getItemThumbnail");
if (BuildConfig.DEBUG) Log.e("AWAISKING_APP", "", e);
thumbnail = null;
}
}
if (TextUtils.isEmpty(thumbnail)) thumbnail = jsonArray.optJSONObject(0).optString("url");
return thumbnail;
}
@Nullable
public static String getThumbnailUrl(@NonNull final JSONObject mediaObj, final MediaItemType mediaType) throws Exception {
String thumbnail = null;
if (mediaType == MediaItemType.MEDIA_TYPE_IMAGE || mediaType == MediaItemType.MEDIA_TYPE_VIDEO) {
final JSONObject imageVersions = mediaObj.optJSONObject("image_versions2");
if (imageVersions != null)
thumbnail = getItemThumbnail(imageVersions.getJSONArray("candidates"));
} else if (mediaType == MediaItemType.MEDIA_TYPE_SLIDER) {
final JSONArray carouselMedia = mediaObj.optJSONArray("carousel_media");
if (carouselMedia != null)
thumbnail = getItemThumbnail(carouselMedia.getJSONObject(0)
.getJSONObject("image_versions2").getJSONArray("candidates"));
}
return thumbnail;
}
public static String getVideoUrl(@NonNull final JSONObject mediaObj) throws Exception {
String thumbnail = null;
final JSONArray imageVersions = mediaObj.optJSONArray("video_versions");
if (imageVersions != null)
thumbnail = getItemThumbnail(imageVersions);
return thumbnail;
}
@Nullable
public static MediaItemType getMediaItemType(final int mediaType) {
if (mediaType == 1) return MediaItemType.MEDIA_TYPE_IMAGE;
if (mediaType == 2) return MediaItemType.MEDIA_TYPE_VIDEO;
if (mediaType == 8) return MediaItemType.MEDIA_TYPE_SLIDER;
if (mediaType == 11) return MediaItemType.MEDIA_TYPE_VOICE;
return null;
}
public static DirectItemModel.DirectItemMediaModel getDirectMediaModel(final JSONObject mediaObj) throws Exception {
final DirectItemModel.DirectItemMediaModel mediaModel;
if (mediaObj == null) mediaModel = null;
else {
final JSONObject userObj = mediaObj.optJSONObject("user");
ProfileModel user = null;
if (userObj != null) {
user = new ProfileModel(
userObj.getBoolean("is_private"),
false,
userObj.optBoolean("is_verified"),
String.valueOf(userObj.get("pk")),
userObj.getString("username"),
userObj.getString("full_name"),
null, null,
userObj.getString("profile_pic_url"),
null, 0, 0, 0, false, false, false, false);
}
final MediaItemType mediaType = getMediaItemType(mediaObj.optInt("media_type", -1));
String id = mediaObj.optString("id");
if (TextUtils.isEmpty(id)) id = null;
mediaModel = new DirectItemModel.DirectItemMediaModel(mediaType,
mediaObj.optLong("expiring_at"),
mediaObj.optLong("pk"),
id,
getThumbnailUrl(mediaObj, mediaType),
mediaType == MediaItemType.MEDIA_TYPE_VIDEO ? getVideoUrl(mediaObj) : null,
user,
mediaObj.optString("code"));
}
return mediaModel;
}
private static DirectItemType getDirectItemType(final String itemType) {
if ("placeholder".equals(itemType)) return DirectItemType.PLACEHOLDER;
if ("media".equals(itemType)) return DirectItemType.MEDIA;
if ("link".equals(itemType)) return DirectItemType.LINK;
if ("like".equals(itemType)) return DirectItemType.LIKE;
if ("reel_share".equals(itemType)) return DirectItemType.REEL_SHARE;
if ("media_share".equals(itemType)) return DirectItemType.MEDIA_SHARE;
if ("action_log".equals(itemType)) return DirectItemType.ACTION_LOG;
if ("raven_media".equals(itemType)) return DirectItemType.RAVEN_MEDIA;
if ("profile".equals(itemType)) return DirectItemType.PROFILE;
if ("video_call_event".equals(itemType)) return DirectItemType.VIDEO_CALL_EVENT;
if ("animated_media".equals(itemType)) return DirectItemType.ANIMATED_MEDIA;
if ("voice_media".equals(itemType)) return DirectItemType.VOICE_MEDIA;
if ("story_share".equals(itemType)) return DirectItemType.STORY_SHARE;
if ("clip".equals(itemType)) return DirectItemType.CLIP;
return DirectItemType.TEXT;
}
@NonNull
public static InboxThreadModel createInboxThreadModel(@NonNull final JSONObject data, final boolean inThreadView) throws Exception {
final InboxReadState readState = data.getInt("read_state") == 0 ? InboxReadState.STATE_READ : InboxReadState.STATE_UNREAD;
final String threadType = data.getString("thread_type"); // they're all "private", group is identified by boolean "is_group"
final String threadId = data.getString("thread_id");
final String threadV2Id = data.getString("thread_v2_id");
final String threadTitle = data.getString("thread_title");
final String threadNewestCursor = data.getString("newest_cursor");
final String threadOldestCursor = data.getString("oldest_cursor");
final String threadNextCursor = data.has("next_cursor") ? data.getString("next_cursor") : null;
final String threadPrevCursor = data.has("prev_cursor") ? data.getString("prev_cursor") : null;
final boolean threadHasOlder = data.getBoolean("has_older");
final long unreadCount = data.optLong("read_state", 0);
final long lastActivityAt = data.optLong("last_activity_at");
final boolean named = data.optBoolean("named");
final boolean muted = data.optBoolean("muted");
final boolean isPin = data.optBoolean("is_pin");
final boolean isSpam = data.optBoolean("is_spam");
final boolean isGroup = data.optBoolean("is_group");
final boolean pending = data.optBoolean("pending");
final boolean archived = data.optBoolean("archived");
final boolean canonical = data.optBoolean("canonical");
final JSONArray users = data.getJSONArray("users");
final int usersLen = users.length();
final JSONArray leftusers = data.getJSONArray("left_users");
final int leftusersLen = leftusers.length();
final JSONArray admins = data.getJSONArray("admin_user_ids");
final int adminsLen = admins.length();
final ProfileModel[] userModels = new ProfileModel[usersLen];
for (int j = 0; j < usersLen; ++j) {
final JSONObject userObject = users.getJSONObject(j);
userModels[j] = new ProfileModel(userObject.getBoolean("is_private"),
false,
userObject.optBoolean("is_verified"),
String.valueOf(userObject.get("pk")),
userObject.getString("username"),
userObject.getString("full_name"),
null, null,
userObject.getString("profile_pic_url"),
null, 0, 0, 0, false, false, false, false);
}
final ProfileModel[] leftuserModels = new ProfileModel[leftusersLen];
for (int j = 0; j < leftusersLen; ++j) {
final JSONObject userObject = leftusers.getJSONObject(j);
leftuserModels[j] = new ProfileModel(userObject.getBoolean("is_private"),
false,
userObject.optBoolean("is_verified"),
String.valueOf(userObject.get("pk")),
userObject.getString("username"),
userObject.getString("full_name"),
null, null,
userObject.getString("profile_pic_url"),
null, 0, 0, 0, false, false, false, false);
}
final Long[] adminIDs = new Long[adminsLen];
for (int j = 0; j < adminsLen; ++j) {
adminIDs[j] = admins.getLong(j);
}
final JSONArray items = data.getJSONArray("items");
final int itemsLen = items.length();
final ArrayList<DirectItemModel> itemModels = new ArrayList<>(itemsLen);
for (int i = 0; i < itemsLen; ++i) {
final JSONObject itemObject = items.getJSONObject(i);
CharSequence text = null;
ProfileModel profileModel = null;
DirectItemModel.DirectItemLinkModel linkModel = null;
DirectItemModel.DirectItemMediaModel directMedia = null;
DirectItemModel.DirectItemReelShareModel reelShareModel = null;
DirectItemModel.DirectItemActionLogModel actionLogModel = null;
DirectItemModel.DirectItemAnimatedMediaModel animatedMediaModel = null;
DirectItemModel.DirectItemVoiceMediaModel voiceMediaModel = null;
DirectItemModel.DirectItemRavenMediaModel ravenMediaModel = null;
DirectItemModel.DirectItemVideoCallEventModel videoCallEventModel = null;
final DirectItemType itemType = getDirectItemType(itemObject.getString("item_type"));
switch (itemType) {
case ANIMATED_MEDIA: {
final JSONObject animatedMedia = itemObject.getJSONObject("animated_media");
final JSONObject stickerImage = animatedMedia.getJSONObject("images").getJSONObject("fixed_height");
animatedMediaModel = new DirectItemModel.DirectItemAnimatedMediaModel(animatedMedia.getBoolean("is_random"),
animatedMedia.getBoolean("is_sticker"),
animatedMedia.getString("id"),
stickerImage.getString("url"),
stickerImage.optString("webp"),
stickerImage.optString("mp4"),
stickerImage.getInt("height"),
stickerImage.getInt("width"));
}
break;
case VOICE_MEDIA: {
final JSONObject voiceMedia = itemObject.getJSONObject("voice_media").getJSONObject("media");
final JSONObject audio = voiceMedia.getJSONObject("audio");
int[] waveformData = null;
final JSONArray waveformDataArray = audio.optJSONArray("waveform_data");
if (waveformDataArray != null) {
final int waveformDataLen = waveformDataArray.length();
waveformData = new int[waveformDataLen];
// 0.011775206
for (int j = 0; j < waveformDataLen; ++j) {
waveformData[j] = (int) (waveformDataArray.optDouble(j) * 10);
}
}
voiceMediaModel = new DirectItemModel.DirectItemVoiceMediaModel(voiceMedia.getString("id"),
audio.getString("audio_src"), audio.getLong("duration"),
waveformData);
}
break;
case LINK: {
final JSONObject linkObj = itemObject.getJSONObject("link");
DirectItemModel.DirectItemLinkContext itemLinkContext = null;
final JSONObject linkContext = linkObj.optJSONObject("link_context");
if (linkContext != null) {
itemLinkContext = new DirectItemModel.DirectItemLinkContext(
linkContext.getString("link_url"),
linkContext.optString("link_title"),
linkContext.optString("link_summary"),
linkContext.optString("link_image_url")
);
}
linkModel = new DirectItemModel.DirectItemLinkModel(linkObj.getString("text"),
linkObj.getString("client_context"),
linkObj.optString("mutation_token"),
itemLinkContext);
}
break;
case REEL_SHARE: {
final JSONObject reelShare = itemObject.getJSONObject("reel_share");
reelShareModel = new DirectItemModel.DirectItemReelShareModel(
reelShare.optBoolean("is_reel_persisted"),
reelShare.getLong("reel_owner_id"),
reelShare.getJSONObject("media").getJSONObject("user").getString("username"),
reelShare.getString("text"),
reelShare.getString("type"),
reelShare.getString("reel_type"),
reelShare.optString("reel_name"),
reelShare.optString("reel_id"),
getDirectMediaModel(reelShare.optJSONObject("media")));
}
break;
case RAVEN_MEDIA: {
final JSONObject visualMedia = itemObject.getJSONObject("visual_media");
final JSONArray seenUserIdsArray = visualMedia.getJSONArray("seen_user_ids");
final int seenUsersLen = seenUserIdsArray.length();
final String[] seenUserIds = new String[seenUsersLen];
for (int j = 0; j < seenUsersLen; j++)
seenUserIds[j] = seenUserIdsArray.getString(j);
DirectItemModel.RavenExpiringMediaActionSummaryModel expiringSummaryModel = null;
final JSONObject actionSummary = visualMedia.optJSONObject("expiring_media_action_summary");
if (actionSummary != null)
expiringSummaryModel = new DirectItemModel.RavenExpiringMediaActionSummaryModel(
actionSummary.getLong("timestamp"), actionSummary.getInt("count"),
getExpiringMediaType(actionSummary.getString("type")));
final RavenMediaViewType viewType;
final String viewMode = visualMedia.getString("view_mode");
switch (viewMode) {
case "replayable":
viewType = RavenMediaViewType.REPLAYABLE;
break;
case "permanent":
viewType = RavenMediaViewType.PERMANENT;
break;
case "once":
default:
viewType = RavenMediaViewType.ONCE;
}
ravenMediaModel = new DirectItemModel.DirectItemRavenMediaModel(
visualMedia.optLong(viewType == RavenMediaViewType.PERMANENT ? "url_expire_at_secs" : "replay_expiring_at_us"),
visualMedia.optInt("playback_duration_secs"),
visualMedia.getInt("seen_count"),
seenUserIds,
viewType,
getDirectMediaModel(visualMedia.optJSONObject("media")),
expiringSummaryModel);
}
break;
case VIDEO_CALL_EVENT: {
final JSONObject videoCallEvent = itemObject.getJSONObject("video_call_event");
videoCallEventModel = new DirectItemModel.DirectItemVideoCallEventModel(videoCallEvent.getLong("vc_id"),
videoCallEvent.optBoolean("thread_has_audio_only_call"),
videoCallEvent.getString("action"),
videoCallEvent.getString("description"));
}
break;
case PROFILE: {
final JSONObject profile = itemObject.getJSONObject("profile");
profileModel = new ProfileModel(profile.getBoolean("is_private"),
false,
profile.getBoolean("is_verified"),
Long.toString(profile.getLong("pk")),
profile.getString("username"),
profile.getString("full_name"),
null, null,
profile.getString("profile_pic_url"),
null, 0, 0, 0, false, false, false, false);
}
break;
case PLACEHOLDER:
final JSONObject placeholder = itemObject.getJSONObject("placeholder");
text = placeholder.getString("title") + "<br><small>" + placeholder.getString("message") + "</small>";
break;
case ACTION_LOG:
if (inThreadView && itemObject.optInt("hide_in_thread", 0) != 0)
continue;
final JSONObject actionLog = itemObject.getJSONObject("action_log");
String desc = actionLog.getString("description");
JSONArray bold = actionLog.getJSONArray("bold");
for (int q = 0; q < bold.length(); ++q) {
JSONObject boldItem = bold.getJSONObject(q);
desc = desc.substring(0, boldItem.getInt("start") + q * 7) + "<b>"
+ desc.substring(boldItem.getInt("start") + q * 7, boldItem.getInt("end") + q * 7)
+ "</b>" + desc.substring(boldItem.getInt("end") + q * 7);
}
actionLogModel = new DirectItemModel.DirectItemActionLogModel(desc);
break;
case MEDIA_SHARE:
directMedia = getDirectMediaModel(itemObject.getJSONObject("media_share"));
break;
case CLIP:
directMedia = getDirectMediaModel(itemObject.getJSONObject("clip").getJSONObject("clip"));
break;
case MEDIA:
directMedia = getDirectMediaModel(itemObject.optJSONObject("media"));
break;
case LIKE:
text = itemObject.getString("like");
break;
case STORY_SHARE:
final JSONObject storyShare = itemObject.getJSONObject("story_share");
if (!storyShare.has("media"))
text = "<small>" + storyShare.optString("message") + "</small>";
else {
reelShareModel = new DirectItemModel.DirectItemReelShareModel(
storyShare.optBoolean("is_reel_persisted"),
storyShare.getJSONObject("media").getJSONObject("user").getLong("pk"),
storyShare.getJSONObject("media").getJSONObject("user").getString("username"),
storyShare.getString("text"),
storyShare.getString("story_share_type"),
storyShare.getString("reel_type"),
storyShare.optString("reel_name"),
storyShare.optString("reel_id"),
getDirectMediaModel(storyShare.optJSONObject("media")));
}
break;
case TEXT:
if (!itemObject.has("text"))
Log.d("AWAISKING_APP", "itemObject: " + itemObject); // todo
text = itemObject.optString("text");
break;
}
String[] liked = null;
if (!itemObject.isNull("reactions") && !itemObject.getJSONObject("reactions").isNull("likes")) {
JSONArray rawLiked = itemObject.getJSONObject("reactions").getJSONArray("likes");
liked = new String[rawLiked.length()];
for (int l = 0; l < rawLiked.length(); ++l) {
liked[l] = String.valueOf(rawLiked.getJSONObject(l).getLong("sender_id"));
}
}
itemModels.add(new DirectItemModel(
itemObject.getLong("user_id"),
itemObject.getLong("timestamp"),
itemObject.getString("item_id"),
liked,
itemType,
text,
linkModel,
profileModel,
reelShareModel,
directMedia,
actionLogModel,
voiceMediaModel,
ravenMediaModel,
videoCallEventModel,
animatedMediaModel));
}
itemModels.trimToSize();
return new InboxThreadModel(readState, threadId, threadV2Id, threadType, threadTitle,
threadNewestCursor, threadOldestCursor, threadNextCursor, threadPrevCursor,
null, // todo
userModels, leftuserModels, adminIDs,
itemModels.toArray(new DirectItemModel[0]),
muted, isPin, named, canonical,
pending, threadHasOlder, unreadCount, isSpam, isGroup, archived, lastActivityAt);
}
private static RavenExpiringMediaType getExpiringMediaType(final String type) {
if ("raven_sent".equals(type)) return RavenExpiringMediaType.RAVEN_SENT;
if ("raven_opened".equals(type)) return RavenExpiringMediaType.RAVEN_OPENED;
if ("raven_blocked".equals(type)) return RavenExpiringMediaType.RAVEN_BLOCKED;
if ("raven_sending".equals(type)) return RavenExpiringMediaType.RAVEN_SENDING;
if ("raven_replayed".equals(type)) return RavenExpiringMediaType.RAVEN_REPLAYED;
if ("raven_delivered".equals(type)) return RavenExpiringMediaType.RAVEN_DELIVERED;
if ("raven_suggested".equals(type)) return RavenExpiringMediaType.RAVEN_SUGGESTED;
if ("raven_screenshot".equals(type)) return RavenExpiringMediaType.RAVEN_SCREENSHOT;
if ("raven_cannot_deliver".equals(type)) return RavenExpiringMediaType.RAVEN_CANNOT_DELIVER;
//if ("raven_unknown".equals(type)) [default?]
return RavenExpiringMediaType.RAVEN_UNKNOWN;
}
}

View File

@ -0,0 +1,112 @@
package awais.instagrabber.utils;
import android.text.SpannableString;
import android.text.SpannableStringBuilder;
import android.text.Spanned;
import android.text.style.URLSpan;
import androidx.annotation.NonNull;
import awais.instagrabber.customviews.CommentMentionClickSpan;
public final class TextUtils {
@NonNull
public static CharSequence getMentionText(@NonNull final CharSequence text) {
final int commentLength = text.length();
final SpannableStringBuilder stringBuilder = new SpannableStringBuilder(text, 0, commentLength);
for (int i = 0; i < commentLength; ++i) {
char currChar = text.charAt(i);
if (currChar == '@' || currChar == '#') {
final int startLen = i;
do {
if (++i == commentLength) break;
currChar = text.charAt(i);
if (currChar == '.' && i + 1 < commentLength) {
final char nextChar = text.charAt(i + 1);
if (nextChar == '.' || nextChar == ' ' || nextChar == '#' || nextChar == '@' || nextChar == '/'
|| nextChar == '\r' || nextChar == '\n') {
break;
}
} else if (currChar == '.')
break;
// for merged hashtags
if (currChar == '#') {
--i;
break;
}
} while (currChar != ' ' && currChar != '\r' && currChar != '\n' && currChar != '>' && currChar != '<'
&& currChar != ':' && currChar != ';' && currChar != '\'' && currChar != '"' && currChar != '['
&& currChar != ']' && currChar != '\\' && currChar != '=' && currChar != '-' && currChar != '!'
&& currChar != '$' && currChar != '%' && currChar != '^' && currChar != '&' && currChar != '*'
&& currChar != '(' && currChar != ')' && currChar != '{' && currChar != '}' && currChar != '/'
&& currChar != '|' && currChar != '?' && currChar != '`' && currChar != '~'
);
final int endLen = currChar != '#' ? i : i + 1; // for merged hashtags
stringBuilder.setSpan(new CommentMentionClickSpan(), startLen,
Math.min(commentLength, endLen), // fixed - crash when end index is greater than comment length ( @kernoeb )
Spanned.SPAN_EXCLUSIVE_INCLUSIVE);
}
}
return stringBuilder;
}
// extracted from String class
public static int indexOfChar(@NonNull final CharSequence sequence, final int ch, final int startIndex) {
final int max = sequence.length();
if (startIndex < max) {
if (ch < Character.MIN_SUPPLEMENTARY_CODE_POINT) {
for (int i = startIndex; i < max; i++) if (sequence.charAt(i) == ch) return i;
} else if (Character.isValidCodePoint(ch)) {
final char hi = (char) ((ch >>> 10) + (Character.MIN_HIGH_SURROGATE - (Character.MIN_SUPPLEMENTARY_CODE_POINT >>> 10)));
final char lo = (char) ((ch & 0x3ff) + Character.MIN_LOW_SURROGATE);
for (int i = startIndex; i < max; i++)
if (sequence.charAt(i) == hi && sequence.charAt(i + 1) == lo) return i;
}
}
return -1;
}
public static boolean hasMentions(final CharSequence text) {
if (isEmpty(text)) return false;
return indexOfChar(text, '@', 0) != -1 || indexOfChar(text, '#', 0) != -1;
}
public static CharSequence getSpannableUrl(final String url) {
if (isEmpty(url)) return url;
final int httpIndex = url.indexOf("http:");
final int httpsIndex = url.indexOf("https:");
if (httpIndex == -1 && httpsIndex == -1) return url;
final int length = url.length();
final int startIndex = httpIndex != -1 ? httpIndex : httpsIndex;
final int spaceIndex = url.indexOf(' ', startIndex + 1);
final int endIndex = (spaceIndex != -1 ? spaceIndex : length);
final String extractUrl = url.substring(startIndex, Math.min(length, endIndex));
final SpannableString spannableString = new SpannableString(url);
spannableString.setSpan(new URLSpan(extractUrl), startIndex, endIndex, 0);
return spannableString;
}
public static boolean isEmpty(final CharSequence charSequence) {
if (charSequence == null || charSequence.length() < 1) return true;
if (charSequence instanceof String) {
String str = (String) charSequence;
if ("".equals(str) || "null".equals(str) || str.isEmpty()) return true;
str = str.trim();
return "".equals(str) || "null".equals(str) || str.isEmpty();
}
return "null".contentEquals(charSequence) || "".contentEquals(charSequence) || charSequence.length() < 1;
}
}

View File

@ -35,7 +35,7 @@ public final class UpdateChecker extends AsyncTask<Void, Void, Boolean> {
final int responseCode = conn.getResponseCode();
if (responseCode == HttpURLConnection.HTTP_OK) {
final JSONObject data = new JSONObject(Utils.readFromConnection(conn));
final JSONObject data = new JSONObject(NetworkUtils.readFromConnection(conn));
if (BuildConfig.VERSION_CODE < data.getInt("suggestedVersionCode")) {
version = data.getJSONArray("packages").getJSONObject(0).getString("versionName");
return true;

File diff suppressed because it is too large Load Diff