From 657d038d9cf3affa486963571109ff91d72ec088 Mon Sep 17 00:00:00 2001 From: gdlbo <41114720+gdlbo@users.noreply.github.com> Date: Mon, 22 Aug 2022 03:31:44 +0300 Subject: [PATCH] groups filters whitelist --- .../ru/vtosters/lite/hooks/JsonInjectors.java | 36 +++++++++++- .../ru/vtosters/lite/hooks/NewsfeedHook.java | 56 +++++++++++++++++-- .../lite/ui/fragments/FeedFragment.java | 50 +++++++++++++++++ .../ru/vtosters/lite/ui/vkui/MenuBuilder.java | 29 ++++++++++ smali/res/xml/preferences_feed.xml | 6 ++ 5 files changed, 170 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/ru/vtosters/lite/hooks/JsonInjectors.java b/app/src/main/java/ru/vtosters/lite/hooks/JsonInjectors.java index 61af576d2..b274a7e5e 100644 --- a/app/src/main/java/ru/vtosters/lite/hooks/JsonInjectors.java +++ b/app/src/main/java/ru/vtosters/lite/hooks/JsonInjectors.java @@ -1,13 +1,11 @@ package ru.vtosters.lite.hooks; -import static ru.vtosters.lite.foaf.FoafBase.getLastSeen; import static ru.vtosters.lite.foaf.FoafBase.getBypassedOnlineInfo; import static ru.vtosters.lite.hooks.OnlineFormatterHook.onlineHookProfiles; import static ru.vtosters.lite.hooks.DateHook.getLocale; import static ru.vtosters.lite.proxy.ProxyUtils.getApi; import static ru.vtosters.lite.proxy.ProxyUtils.getStatic; import static ru.vtosters.lite.utils.AndroidUtils.getDefaultPrefs; -import static ru.vtosters.lite.utils.Base64Utils.decode; import static ru.vtosters.lite.utils.NewsFeedFiltersUtils.checkCaption; import static ru.vtosters.lite.utils.NewsFeedFiltersUtils.checkCopyright; import static ru.vtosters.lite.utils.NewsFeedFiltersUtils.isBadNews; @@ -437,6 +435,30 @@ public class JsonInjectors { return false; } + public static Boolean isWhitelistedFilters(JSONObject list) throws JSONException { + var id = String.valueOf(list.optInt("owner_id")); + + if (id.equals("0")) { + id = String.valueOf(list.optInt("source_id")); + } + + var whitelist = AndroidUtils.getDefaultPrefs().getStringSet("whitelisted_filters_groups", Collections.synchronizedSet(new LinkedHashSet<>())); + + return whitelist.contains(id); + } + + public static Boolean isWhitelistedAd(JSONObject list) throws JSONException { + var id = String.valueOf(list.optInt("owner_id")); + + if (id.equals("0")) { + id = String.valueOf(list.optInt("source_id")); + } + + var whitelist = AndroidUtils.getDefaultPrefs().getStringSet("whitelisted_ad_groups", Collections.synchronizedSet(new LinkedHashSet<>())); + + return whitelist.contains(id); + } + public static JSONArray newsfeedlist(JSONArray items) throws JSONException { var selectedItems = getDefaultPrefs().getString("news_feed_selected_items", ""); var filtersSet = getDefaultPrefs().getStringSet("news_feed_items_set", null); @@ -482,10 +504,20 @@ public class JsonInjectors { var list = items.optJSONObject(j); var type = list.optString("type"); + if (isWhitelistedAd(list)) { + newItems.put(list); + continue; + } + if (isAds(list, type)) { continue; } + if (isWhitelistedFilters(list)) { + newItems.put(list); + continue; + } + if (authorsrecomm() && (type.equals("authors_rec") || type.startsWith("recommended_") && (type.endsWith("audios") || type.endsWith("artists") diff --git a/app/src/main/java/ru/vtosters/lite/hooks/NewsfeedHook.java b/app/src/main/java/ru/vtosters/lite/hooks/NewsfeedHook.java index db355cd9d..018054dbb 100644 --- a/app/src/main/java/ru/vtosters/lite/hooks/NewsfeedHook.java +++ b/app/src/main/java/ru/vtosters/lite/hooks/NewsfeedHook.java @@ -1,6 +1,7 @@ package ru.vtosters.lite.hooks; import static java.lang.Long.MAX_VALUE; +import static ru.vtosters.lite.utils.AndroidUtils.*; import static ru.vtosters.lite.utils.AndroidUtils.getPrefsValue; import static ru.vtosters.lite.utils.NewsFeedFiltersUtils.checkCaption; import static ru.vtosters.lite.utils.NewsFeedFiltersUtils.checkCopyright; @@ -23,14 +24,20 @@ import static ru.vtosters.lite.utils.Preferences.milkshake; import static ru.vtosters.lite.utils.Preferences.vkme; import com.vk.core.preference.Preference; +import com.vtosters.lite.api.ExtendedCommunityProfile; import org.json.JSONException; import org.json.JSONObject; import java.util.ArrayList; +import java.util.Collections; import java.util.HashSet; +import java.util.LinkedHashSet; import java.util.List; +import ru.vtosters.lite.utils.AccountManagerUtils; +import ru.vtosters.lite.utils.AndroidUtils; + public class NewsfeedHook { public static boolean injectFilters(JSONObject obj) throws JSONException { if (getBoolValue("newadblock", true)) return true; @@ -102,18 +109,57 @@ public class NewsfeedHook { return params.toArray(new String[0]); } + public static boolean isWhitelistedFilter(ExtendedCommunityProfile eup) { + return getDefaultPrefs().getStringSet("whitelisted_filters_groups", Collections.synchronizedSet(new LinkedHashSet<>())).contains(String.valueOf(AccountManagerUtils.getUserID(eup))); + } + + public static boolean isWhitelistedAd(ExtendedCommunityProfile eup) { + return getDefaultPrefs().getStringSet("whitelisted_ad_groups", Collections.synchronizedSet(new LinkedHashSet<>())).contains(String.valueOf(AccountManagerUtils.getUserID(eup))); + } + + public static void setWhitelistedFilter(ExtendedCommunityProfile eup, boolean needWhitelist) { + var mutableAdsSet = Collections.synchronizedSet(new LinkedHashSet()); + var id = String.valueOf(AccountManagerUtils.getUserID(eup)); + + mutableAdsSet.addAll(getDefaultPrefs().getStringSet("whitelisted_filters_groups", mutableAdsSet)); + + if (needWhitelist) { + mutableAdsSet.add(id); + } else { + mutableAdsSet.remove(id); + } + + getDefaultPrefs().edit().putStringSet("whitelisted_filters_groups", mutableAdsSet).apply(); + } + + public static void setWhitelistedAd(ExtendedCommunityProfile eup, boolean needWhitelist) { + var mutableAdsSet = Collections.synchronizedSet(new LinkedHashSet()); + var id = String.valueOf(AccountManagerUtils.getUserID(eup)); + + mutableAdsSet.addAll(getDefaultPrefs().getStringSet("whitelisted_ad_groups", mutableAdsSet)); + + if (needWhitelist) { + mutableAdsSet.add(id); + } else { + mutableAdsSet.remove(id); + } + + getDefaultPrefs().edit().putStringSet("whitelisted_ad_groups", mutableAdsSet).apply(); + } + public static void adsParams(HashSet hashSet) { - if (ads() || adsslider()) { + if (ads()) { hashSet.add("ads_disabled"); - if (milkshake()) { - return; - } + hashSet.add("ads_app_slider"); + return; } hashSet.add("ads_app"); hashSet.add("ads_site"); hashSet.add("ads_post"); - hashSet.add("ads_app_slider"); + if (adsslider()) { + hashSet.add("ads_app_slider"); + } hashSet.add("ads_site_slider"); hashSet.add("ads_app_video"); hashSet.add("ads_post_pretty_cards"); diff --git a/app/src/main/java/ru/vtosters/lite/ui/fragments/FeedFragment.java b/app/src/main/java/ru/vtosters/lite/ui/fragments/FeedFragment.java index 3cc8c4ce0..d04b3d4e2 100644 --- a/app/src/main/java/ru/vtosters/lite/ui/fragments/FeedFragment.java +++ b/app/src/main/java/ru/vtosters/lite/ui/fragments/FeedFragment.java @@ -1,9 +1,14 @@ package ru.vtosters.lite.ui.fragments; +import static ru.vtosters.lite.utils.AndroidUtils.edit; import static ru.vtosters.lite.utils.AndroidUtils.getDefaultPrefs; +import static ru.vtosters.lite.utils.AndroidUtils.getGlobalContext; import static ru.vtosters.lite.utils.AndroidUtils.getIdentifier; import static ru.vtosters.lite.utils.AndroidUtils.getPrefsValue; +import static ru.vtosters.lite.utils.AndroidUtils.getString; +import static ru.vtosters.lite.utils.AndroidUtils.sendToast; import static ru.vtosters.lite.utils.Preferences.copyright_post; +import static ru.vtosters.lite.utils.Preferences.getBoolValue; import android.content.Context; import android.content.Intent; @@ -12,6 +17,7 @@ import android.text.TextUtils; import androidx.preference.Preference; +import com.vk.core.dialogs.alert.VkAlertDialog; import com.vk.navigation.Navigator; import com.vk.newsfeed.NewsfeedSettingsFragment; import com.vtosters.lite.general.fragments.MaterialPreferenceToolbarFragment; @@ -34,6 +40,20 @@ public class FeedFragment extends MaterialPreferenceToolbarFragment { findPreference("spamfilters").setSummary(count(getPrefsValue("spamfilters"))); findPreference("sourcenamefilter").setSummary(count(getPrefsValue("sourcenamefilter"))); findPreference("linkfilter").setSummary(count(getPrefsValue("linkfilter"))); + + findPreference("whitelisted_ad_groups").setSummary(countSet("whitelisted_ad_groups")); + findPreference("whitelisted_filters_groups").setSummary(countSet("whitelisted_filters_groups")); + + findPreference("whitelisted_ad_groups").setOnPreferenceClickListener(preference -> { + remdialog("whitelisted_ad_groups", getContext()); + return true; + }); + + findPreference("whitelisted_filters_groups").setOnPreferenceClickListener(preference -> { + remdialog("whitelisted_filters_groups", getContext()); + return true; + }); + findPreference("newsfeedlistmanager").setOnPreferenceClickListener(preference -> { NewsfeedListManager.callEditorPopup(getActivity()); return true; @@ -59,6 +79,36 @@ public class FeedFragment extends MaterialPreferenceToolbarFragment { } } + private void remdialog(String key, Context context) { + VkAlertDialog.Builder builder = new VkAlertDialog.Builder(context); + builder.setTitle("Внимание!"); + builder.setMessage("Вы действительно хотите удалить все элементы из списка?"); + builder.setCancelable(false); + builder.setPositiveButton("Да", (dialogInterface, i) -> edit().remove(key).apply()); + builder.setNegativeButton("Отмена", (dialogInterface, i) -> dialogInterface.dismiss()); + builder.show(); + sendToast("Все элементы списка удалены"); + } + + private String countSet(String key) { + var set = getDefaultPrefs().getStringSet(key, null); + StringBuilder str = new StringBuilder(); + if (set != null) { + for (var s : set) { + str.append(s).append(", "); + } + } + + var count = str.toString().split(", ").length; + + if (count < 1 || (str.length() == 0)) { + return AndroidUtils.getString("feed_no_elements"); + } else { + return String.format(AndroidUtils.getString("feed_elements_count"), count); + } + } + + @Override public boolean onPreferenceTreeClick(Preference preference) { findPreference("cringecopyright").setEnabled(!copyright_post()); diff --git a/app/src/main/java/ru/vtosters/lite/ui/vkui/MenuBuilder.java b/app/src/main/java/ru/vtosters/lite/ui/vkui/MenuBuilder.java index 653f54e78..52ae7798e 100644 --- a/app/src/main/java/ru/vtosters/lite/ui/vkui/MenuBuilder.java +++ b/app/src/main/java/ru/vtosters/lite/ui/vkui/MenuBuilder.java @@ -1,6 +1,7 @@ package ru.vtosters.lite.ui.vkui; import static ru.vtosters.lite.foaf.FoafBase.loadAndShow; +import static ru.vtosters.lite.hooks.NewsfeedHook.setWhitelistedFilter; import static ru.vtosters.lite.utils.AccountManagerUtils.getUserID; import static ru.vtosters.lite.utils.AndroidUtils.sendToast; @@ -24,6 +25,7 @@ import java.util.Objects; import kotlin.Unit; import kotlin.jvm.b.Functions; +import ru.vtosters.lite.hooks.NewsfeedHook; import ru.vtosters.lite.utils.AndroidUtils; import ru.vtosters.lite.utils.RenameTool; @@ -91,6 +93,33 @@ public class MenuBuilder { return Unit.a; }); + if (NewsfeedHook.isWhitelistedFilter(ecp)) { + addItem(builder, "Удалить из вайтлиста фильтров", () -> { + setWhitelistedFilter(ecp, false); + return Unit.a; + }); + } else { + addItem(builder, "Добавить в вайтлист фильтров", () -> { + setWhitelistedFilter(ecp, true); + sendToast("Группа добавлена в вайтлист"); + return Unit.a; + }); + } + + if (NewsfeedHook.isWhitelistedAd(ecp)) { + addItem(builder, "Удалить из вайтлиста рекламы", () -> { + NewsfeedHook.setWhitelistedAd(ecp, false); + sendToast("Группа удалена из вайтлиста"); + return Unit.a; + }); + } else { + addItem(builder, "Добавить в вайтлист рекламы", () -> { + NewsfeedHook.setWhitelistedAd(ecp, true); + sendToast("Группа добавлена в вайтлист"); + return Unit.a; + }); + } + } catch (IllegalAccessException | InvocationTargetException e) { e.printStackTrace(); } diff --git a/smali/res/xml/preferences_feed.xml b/smali/res/xml/preferences_feed.xml index 6ed207495..d2addd9e0 100644 --- a/smali/res/xml/preferences_feed.xml +++ b/smali/res/xml/preferences_feed.xml @@ -21,6 +21,9 @@ android:key="adsstories" android:summary="@string/feed_ads_stories_summary" android:title="@string/vtldas" /> + +