From 29840f66c79363753f18d6bae93601298e108dc0 Mon Sep 17 00:00:00 2001 From: Anderson Mesquita Date: Fri, 18 Sep 2020 10:55:47 -0400 Subject: [PATCH 1/5] Switch isSwapTime conditional This doesn't change behavior, but makes the variable `isSwapTime` match the value of the checkbox state (`cbSwapTimeDate.isChecked()`). Now, both of them will be either `true` or `false` together, instead of having opposite values. --- .../awais/instagrabber/dialogs/TimeSettingsDialog.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/awais/instagrabber/dialogs/TimeSettingsDialog.java b/app/src/main/java/awais/instagrabber/dialogs/TimeSettingsDialog.java index 9a371db2..cf3bf5ee 100755 --- a/app/src/main/java/awais/instagrabber/dialogs/TimeSettingsDialog.java +++ b/app/src/main/java/awais/instagrabber/dialogs/TimeSettingsDialog.java @@ -86,11 +86,12 @@ public final class TimeSettingsDialog extends DialogFragment implements AdapterV final String timeStr = String.valueOf(timeSettingsBinding.spTimeFormat.getSelectedItem()); final String dateStr = String.valueOf(timeSettingsBinding.spDateFormat.getSelectedItem()); - final boolean isSwapTime = !timeSettingsBinding.cbSwapTimeDate.isChecked(); + final boolean isSwapTime = timeSettingsBinding.cbSwapTimeDate.isChecked(); + final boolean isBlankSeparator = timeSettingsBinding.spSeparator.getSelectedItemPosition() <= 0; - selectedFormat = (isSwapTime ? timeStr : dateStr) - + (TextUtils.isEmpty(sepStr) || timeSettingsBinding.spSeparator.getSelectedItemPosition() == 0 ? " " : " '" + sepStr + "' ") - + (isSwapTime ? dateStr : timeStr); + selectedFormat = (isSwapTime ? dateStr : timeStr) + + (isBlankSeparator ? " " : " '" + sepStr + "' ") + + (isSwapTime ? timeStr : dateStr); timeSettingsBinding.btnConfirm.setEnabled(true); currentFormat = new SimpleDateFormat(selectedFormat, LocaleUtils.getCurrentLocale()); From 68033cd0ec05915497c887954c4aa747e781a844 Mon Sep 17 00:00:00 2001 From: Anderson Mesquita Date: Wed, 16 Sep 2020 10:10:05 -0400 Subject: [PATCH 2/5] Save "Swap time and date positions" checkbox state Currently, if the user checks the option "Swap time and date positions", leaves the settings modal and returns to it, the option will be unchecked, even though the date and time are, indeed, swapped. This saves the value of the "Swap time and date positions" option so that it will match whatever state the user selected last. Fixes: #165 --- .../instagrabber/dialogs/TimeSettingsDialog.java | 15 ++++++++++++--- .../settings/SettingsPreferencesFragment.java | 6 +++++- .../java/awais/instagrabber/utils/Constants.java | 1 + .../awais/instagrabber/utils/SettingsHelper.java | 3 ++- 4 files changed, 20 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/awais/instagrabber/dialogs/TimeSettingsDialog.java b/app/src/main/java/awais/instagrabber/dialogs/TimeSettingsDialog.java index cf3bf5ee..9958e59c 100755 --- a/app/src/main/java/awais/instagrabber/dialogs/TimeSettingsDialog.java +++ b/app/src/main/java/awais/instagrabber/dialogs/TimeSettingsDialog.java @@ -34,15 +34,18 @@ public final class TimeSettingsDialog extends DialogFragment implements AdapterV private boolean customDateTimeFormatEnabled; private String customDateTimeFormat; private String dateTimeSelection; + private final boolean swapDateTimeEnabled; private final OnConfirmListener onConfirmListener; public TimeSettingsDialog(final boolean customDateTimeFormatEnabled, final String customDateTimeFormat, final String dateTimeSelection, + final boolean swapDateTimeEnabled, final OnConfirmListener onConfirmListener) { this.customDateTimeFormatEnabled = customDateTimeFormatEnabled; this.customDateTimeFormat = customDateTimeFormat; this.dateTimeSelection = dateTimeSelection; + this.swapDateTimeEnabled = swapDateTimeEnabled; this.onConfirmListener = onConfirmListener; final Calendar instance = GregorianCalendar.getInstance(); instance.set(2020, 5, 22, 8, 17, 13); @@ -55,6 +58,7 @@ public final class TimeSettingsDialog extends DialogFragment implements AdapterV timeSettingsBinding.cbCustomFormat.setOnCheckedChangeListener(this); timeSettingsBinding.cbCustomFormat.setChecked(customDateTimeFormatEnabled); + timeSettingsBinding.cbSwapTimeDate.setChecked(swapDateTimeEnabled); timeSettingsBinding.etCustomFormat.setText(customDateTimeFormat); final String[] dateTimeFormat = dateTimeSelection.split(";"); // output = time;separator;date @@ -146,13 +150,15 @@ public final class TimeSettingsDialog extends DialogFragment implements AdapterV if (v == timeSettingsBinding.btnConfirm) { final Editable etCustomFormatText = timeSettingsBinding.etCustomFormat.getText(); if (onConfirmListener != null) { - onConfirmListener.onConfirm(timeSettingsBinding.cbCustomFormat.isChecked(), + onConfirmListener.onConfirm( + timeSettingsBinding.cbCustomFormat.isChecked(), etCustomFormatText == null ? null : etCustomFormatText.toString(), timeSettingsBinding.spTimeFormat.getSelectedItemPosition(), timeSettingsBinding.spSeparator.getSelectedItemPosition(), timeSettingsBinding.spDateFormat.getSelectedItemPosition(), selectedFormat, - currentFormat); + currentFormat, + timeSettingsBinding.cbSwapTimeDate.isChecked()); } dismiss(); } else if (v == timeSettingsBinding.btnInfo) { @@ -167,7 +173,10 @@ public final class TimeSettingsDialog extends DialogFragment implements AdapterV String formatSelection, int spTimeFormatSelectedItemPosition, int spSeparatorSelectedItemPosition, - int spDateFormatSelectedItemPosition, final String selectedFormat, final SimpleDateFormat currentFormat); + int spDateFormatSelectedItemPosition, + final String selectedFormat, + final SimpleDateFormat currentFormat, + final boolean swapDateTime); } @Override diff --git a/app/src/main/java/awais/instagrabber/fragments/settings/SettingsPreferencesFragment.java b/app/src/main/java/awais/instagrabber/fragments/settings/SettingsPreferencesFragment.java index 7e108b17..ba3abc9c 100644 --- a/app/src/main/java/awais/instagrabber/fragments/settings/SettingsPreferencesFragment.java +++ b/app/src/main/java/awais/instagrabber/fragments/settings/SettingsPreferencesFragment.java @@ -284,12 +284,15 @@ public class SettingsPreferencesFragment extends BasePreferencesFragment { settingsHelper.getBoolean(Constants.CUSTOM_DATE_TIME_FORMAT_ENABLED), settingsHelper.getString(Constants.CUSTOM_DATE_TIME_FORMAT), settingsHelper.getString(Constants.DATE_TIME_SELECTION), + settingsHelper.getBoolean(Constants.SWAP_DATE_TIME_FORMAT_ENABLED), (isCustomFormat, formatSelection, spTimeFormatSelectedItemPosition, spSeparatorSelectedItemPosition, spDateFormatSelectedItemPosition, - selectedFormat, currentFormat) -> { + selectedFormat, + currentFormat, + swapDateTime) -> { if (isCustomFormat) { settingsHelper.putString(Constants.CUSTOM_DATE_TIME_FORMAT, formatSelection); } else { @@ -300,6 +303,7 @@ public class SettingsPreferencesFragment extends BasePreferencesFragment { settingsHelper.putString(Constants.DATE_TIME_SELECTION, formatSelectionUpdated); } settingsHelper.putBoolean(Constants.CUSTOM_DATE_TIME_FORMAT_ENABLED, isCustomFormat); + settingsHelper.putBoolean(Constants.SWAP_DATE_TIME_FORMAT_ENABLED, swapDateTime); Utils.datetimeParser = (SimpleDateFormat) currentFormat.clone(); preference.setSummary(Utils.datetimeParser.format(new Date())); } diff --git a/app/src/main/java/awais/instagrabber/utils/Constants.java b/app/src/main/java/awais/instagrabber/utils/Constants.java index 59251a02..6155fd06 100644 --- a/app/src/main/java/awais/instagrabber/utils/Constants.java +++ b/app/src/main/java/awais/instagrabber/utils/Constants.java @@ -19,6 +19,7 @@ public final class Constants { public static final String AUTOLOAD_POSTS = "autoload_posts"; public static final String SHOW_FEED = "show_feed"; public static final String CUSTOM_DATE_TIME_FORMAT_ENABLED = "data_time_custom_enabled"; + public static final String SWAP_DATE_TIME_FORMAT_ENABLED = "swap_date_time_enabled"; public static final String MARK_AS_SEEN = "mark_as_seen"; public static final String DM_MARK_AS_SEEN = "dm_mark_as_seen"; public static final String INSTADP = "instadp"; diff --git a/app/src/main/java/awais/instagrabber/utils/SettingsHelper.java b/app/src/main/java/awais/instagrabber/utils/SettingsHelper.java index a62dc9a8..aa39823e 100755 --- a/app/src/main/java/awais/instagrabber/utils/SettingsHelper.java +++ b/app/src/main/java/awais/instagrabber/utils/SettingsHelper.java @@ -34,6 +34,7 @@ import static awais.instagrabber.utils.Constants.PREV_INSTALL_VERSION; import static awais.instagrabber.utils.Constants.SHOW_QUICK_ACCESS_DIALOG; import static awais.instagrabber.utils.Constants.SKIPPED_VERSION; import static awais.instagrabber.utils.Constants.STORY_VIEWER; +import static awais.instagrabber.utils.Constants.SWAP_DATE_TIME_FORMAT_ENABLED; public final class SettingsHelper { private final SharedPreferences sharedPreferences; @@ -118,7 +119,7 @@ public final class SettingsHelper { @StringDef({DOWNLOAD_USER_FOLDER, FOLDER_SAVE_TO, AUTOPLAY_VIDEOS, SHOW_QUICK_ACCESS_DIALOG, MUTED_VIDEOS, AUTOLOAD_POSTS, CUSTOM_DATE_TIME_FORMAT_ENABLED, MARK_AS_SEEN, DM_MARK_AS_SEEN, INSTADP, - CHECK_ACTIVITY, CHECK_UPDATES}) + CHECK_ACTIVITY, CHECK_UPDATES, SWAP_DATE_TIME_FORMAT_ENABLED}) public @interface BooleanSettings {} @StringDef({PREV_INSTALL_VERSION}) From 890c4d32d1ef5e957137c3357cb2d52d8fb9f2be Mon Sep 17 00:00:00 2001 From: Anderson Mesquita Date: Fri, 18 Sep 2020 13:40:36 -0400 Subject: [PATCH 3/5] Extract method to get longest cookie This reduces duplication and makes it easier to know what `getCookie` is doing, since all domains are now clustered together and it's easy to see the difference between them.. --- .../awais/instagrabber/utils/CookieUtils.java | 97 ++++++------------- 1 file changed, 30 insertions(+), 67 deletions(-) diff --git a/app/src/main/java/awais/instagrabber/utils/CookieUtils.java b/app/src/main/java/awais/instagrabber/utils/CookieUtils.java index e3e4f800..207f2600 100644 --- a/app/src/main/java/awais/instagrabber/utils/CookieUtils.java +++ b/app/src/main/java/awais/instagrabber/utils/CookieUtils.java @@ -10,6 +10,8 @@ import java.net.CookieStore; import java.net.HttpCookie; import java.net.URI; import java.net.URISyntaxException; +import java.util.Arrays; +import java.util.List; import awais.instagrabber.BuildConfig; import awaisomereport.LogCollector; @@ -74,79 +76,40 @@ public final class CookieUtils { @Nullable public static String getCookie(@Nullable final String webViewUrl) { - int lastLongestCookieLength = 0; - String mainCookie = null; + final List domains = Arrays.asList( + "https://instagram.com", + "https://instagram.com/", + "http://instagram.com", + "http://instagram.com", + "https://www.instagram.com", + "https://www.instagram.com/", + "http://www.instagram.com", + "http://www.instagram.com/" + ); - String cookie; if (!TextUtils.isEmpty(webViewUrl)) { - cookie = COOKIE_MANAGER.getCookie(webViewUrl); + domains.add(0, webViewUrl); + } + + return getLongestCookie(domains); + } + + @Nullable + private static String getLongestCookie(final List domains) { + int longestLength = 0; + String longestCookie = null; + + for (final String domain : domains) { + final String cookie = COOKIE_MANAGER.getCookie(domain); if (cookie != null) { - final int cookieLen = cookie.length(); - if (cookieLen > lastLongestCookieLength) { - mainCookie = cookie; - lastLongestCookieLength = cookieLen; + final int cookieLength = cookie.length(); + if (cookieLength > longestLength) { + longestCookie = cookie; + longestLength = cookieLength; } } } - 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; + return longestCookie; } } From dd0f1e397c849cf06a2a61c2967bb0a71ca0833d Mon Sep 17 00:00:00 2001 From: Anderson Mesquita Date: Fri, 18 Sep 2020 13:48:40 -0400 Subject: [PATCH 4/5] Extract method to get cookie value Currently, trying to get a `csrftoken` from an empty cookie string will crash the application. This creates a helper method to extract a cookie value given a cookie name by pattern matching on the cookie string and returning the value if one is found. Fixes: #167 --- .../awais/instagrabber/utils/CookieUtils.java | 29 ++++++++++--------- 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/app/src/main/java/awais/instagrabber/utils/CookieUtils.java b/app/src/main/java/awais/instagrabber/utils/CookieUtils.java index 207f2600..17c43e2b 100644 --- a/app/src/main/java/awais/instagrabber/utils/CookieUtils.java +++ b/app/src/main/java/awais/instagrabber/utils/CookieUtils.java @@ -12,6 +12,8 @@ import java.net.URI; import java.net.URISyntaxException; import java.util.Arrays; import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import awais.instagrabber.BuildConfig; import awaisomereport.LogCollector; @@ -56,22 +58,23 @@ public final class CookieUtils { } @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 getUserIdFromCookie(final String cookies) { + return getCookieValue(cookies, "ds_user_id"); } - public static String getCsrfTokenFromCookie(final String cookie) { - if (cookie == null) { - return null; + @Nullable + public static String getCsrfTokenFromCookie(final String cookies) { + return getCookieValue(cookies, "csrftoken"); + } + + @Nullable + private static String getCookieValue(final String cookies, final String name) { + final Pattern pattern = Pattern.compile(name + "=(.+?);"); + final Matcher matcher = pattern.matcher(cookies); + if (matcher.find()) { + return matcher.group(1); } - return cookie.split("csrftoken=")[1].split(";")[0]; + return null; } @Nullable From 5e302abc8385717e55b46378a70bcd7dfd6ecde3 Mon Sep 17 00:00:00 2001 From: Austin Huang Date: Sat, 19 Sep 2020 22:54:20 -0400 Subject: [PATCH 5/5] add @andersonvom to contributors Co-Authored-By: Anderson Mesquita --- .all-contributorsrc | 23 ++++++++++++----------- README.md | 6 +++--- 2 files changed, 15 insertions(+), 14 deletions(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index 04d554bf..c0f4f8aa 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -31,6 +31,16 @@ "question" ] }, + { + "login": "andersonvom", + "name": "Anderson Mesquita", + "avatar_url": "https://avatars3.githubusercontent.com/u/69922?v=4", + "profile": "https://github.com/andersonvom", + "contributions": [ + "code", + "bug" + ] + }, { "login": "AwaisKing", "name": "AWAiS", @@ -47,16 +57,8 @@ "avatar_url": "https://avatars2.githubusercontent.com/u/42580385?v=4", "profile": "https://stefannajdovski.com/", "contributions": [ - "design" - ] - }, - { - "login": "aypie", - "name": "Alex Potterson", - "avatar_url": "https://avatars3.githubusercontent.com/u/57075012?v=4", - "profile": "http://aypie.design/", - "contributions": [ - "design" + "design", + "translation" ] }, { @@ -97,7 +99,6 @@ "avatar_url": "https://avatars3.githubusercontent.com/u/13700948", "profile": "https://github.com/Galang23", "contributions": [ - "question", "translation" ] }, diff --git a/README.md b/README.md index 5982211b..d904bba3 100755 --- a/README.md +++ b/README.md @@ -47,15 +47,15 @@ Prominent contributors are listed here in the [all-contributors](https://allcont
Austin Huang

💻 📖 💬 🌍 🤔
Ammar Githam

💻 🎨 🤔 🚧 💬 +
Anderson Mesquita

💻 🐛
AWAiS

💻 🤔 -
Stefan Najdovski

🎨 -
Alex Potterson

🎨 +
Stefan Najdovski

🎨 🌍
Kevin Thomas

💵
Shadowspear123

📝 🐛 🤔 💬 📓
Airikr

💬 🤔 -
Galang23

💬 🌍 +
Galang23

🌍
farzadx

🌍
kernoeb

🌍
Ten_Lego

🌍