From 9a9a73e89af15ab0db416daca5119730ac050401 Mon Sep 17 00:00:00 2001 From: Vologhat <47892605+Vologhat@users.noreply.github.com> Date: Thu, 11 Aug 2022 21:02:25 +0300 Subject: [PATCH] refactor newsfeed manager --- README.md | 6 +- .../ru/vtosters/lite/hooks/JsonInjectors.java | 45 ++++++++---- .../ui/components/NewsfeedListManager.java | 68 ++++++++----------- .../lite/ui/fragments/FeedFragment.java | 9 ++- smali/res/values/styles.xml | 8 +-- 5 files changed, 79 insertions(+), 57 deletions(-) diff --git a/README.md b/README.md index ec1455629..86f19baf1 100644 --- a/README.md +++ b/README.md @@ -66,6 +66,7 @@ * Округление чисел * Сокращение постов **(Показать полностью)** * Результаты опросов без участия + * Возможность указывать папку для загрузки фото/видео/музыки/всего * Интеграция с LAST.FM (а также возможность скробблинга) * Новый раздел музыки * Возможность скачивать видео @@ -90,6 +91,7 @@ * Возможность видеть онлайн пользователей, если у вас скрыт онлайн через VK Messenger * Отключить уведомление о том, что вы сделали скриншот в беседе * Отключение редиректа через away.php + * Отключение отправки метрики * Внешний вид * **Milkshake** тема (дизайн новых версий ВК) * Название заголовков в докбаре @@ -103,8 +105,10 @@ * Возможность отключить блок историй наверху ленты * Возможность отключить боковую камеру в разделе «Новости» * Возможность отключить блок «Что у вас нового?» в разделе «Новости» - * Возможность менять раздел, который запускается при запуске + * Возможность показывать лайки у постов справа + * Возможность менять стартовый раздел при запуске приложения * Анимации фрагментов + * Возможность изменять размер закругления картинок (аватарок и прочего) * Возможность отключить редизайн видеопостов * Возможность отключить блок миниаппов/VK Pay/Superapp * Возможность отключить сокращение названий разделов в меню 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 fa454b93d..f98d35db1 100644 --- a/app/src/main/java/ru/vtosters/lite/hooks/JsonInjectors.java +++ b/app/src/main/java/ru/vtosters/lite/hooks/JsonInjectors.java @@ -2,6 +2,7 @@ package ru.vtosters.lite.hooks; import static ru.vtosters.lite.foaf.FoafBase.getLastSeen; import static ru.vtosters.lite.hooks.DateHook.getLocale; +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; @@ -17,11 +18,11 @@ import static ru.vtosters.lite.utils.Preferences.getBoolValue; import static ru.vtosters.lite.utils.Preferences.hasVerification; import static ru.vtosters.lite.utils.Preferences.podcastcatalog; import static ru.vtosters.lite.utils.Preferences.postsrecomm; -import static ru.vtosters.lite.utils.Preferences.preferences; import static ru.vtosters.lite.utils.VTVerifications.isDeveloper; import static ru.vtosters.lite.utils.VTVerifications.isPrometheus; import static ru.vtosters.lite.utils.VTVerifications.isVerified; +import android.text.TextUtils; import android.util.Log; import com.vk.core.network.Network; @@ -34,6 +35,8 @@ import org.json.JSONObject; import java.io.IOException; import java.text.ParseException; +import java.util.Collections; +import java.util.LinkedHashSet; import java.util.Objects; import java.util.Random; @@ -372,19 +375,37 @@ public class JsonInjectors { } public static JSONArray newsfeedlist(JSONArray items) throws JSONException { - for (int j = 0; j < items.length(); j++) { - var list = items.optJSONObject(j); - var id = list.optString("id"); - var title = list.optString("title"); + var selectedItems = getDefaultPrefs().getString("news_feed_selected_items", ""); + var filtersSet = getDefaultPrefs().getStringSet("news_feed_items_set", null); + var mutableFiltersSet = Collections.synchronizedSet(new LinkedHashSet()); + if (filtersSet != null) + mutableFiltersSet.addAll(filtersSet); - if (!id.equals("kpop") && !id.equals("foryou") && !id.equals("qazaqstan") && !id.equals("podcasts")) { - preferences.edit().putString("newsfeedlist_title_" + id, title).apply(); - if (!getBoolValue("newsfeedlist_" + id, false)) { - Log.d("NewsfeedList", "Added list " + id + " to feed"); - list.put("is_hidden", false).put("is_unavailable", false); - if (dev()) Log.d("NewsfeedListInj", "Unlocked " + id + " in newsfeed list"); - } + synchronized (mutableFiltersSet) { + for (int i = 0; i < items.length(); i++) { + var item = items.optJSONObject(i); + if (item == null) continue; + + var id = item.optString("id"); + var title = item.optString("title"); + + if (TextUtils.isEmpty(id) || TextUtils.isEmpty(title) + // this items not working + || id.equals("kpop") || id.equals("foryou") + || id.equals("qazaqstan") || id.equals("podcasts")) + continue; + + mutableFiltersSet.add(id + "|" + title); + + var hide = selectedItems.contains(id); + + Log.d("NewsfeedList", "Added list " + id + " to feed"); + item.put("is_hidden", hide) + .put("is_unavailable", hide); + if (dev()) Log.d("NewsfeedListInj", "Unlocked " + id + " in newsfeed list"); } + getDefaultPrefs().edit().putStringSet("news_feed_items_set", mutableFiltersSet) + .apply(); } return items; diff --git a/app/src/main/java/ru/vtosters/lite/ui/components/NewsfeedListManager.java b/app/src/main/java/ru/vtosters/lite/ui/components/NewsfeedListManager.java index 63eb95a5e..0ef92837d 100644 --- a/app/src/main/java/ru/vtosters/lite/ui/components/NewsfeedListManager.java +++ b/app/src/main/java/ru/vtosters/lite/ui/components/NewsfeedListManager.java @@ -1,70 +1,62 @@ package ru.vtosters.lite.ui.components; + import static ru.vtosters.lite.ui.vkui.VBListBuilder.VBListItem; import static ru.vtosters.lite.ui.vkui.VBListBuilder.buildListOf; -import static ru.vtosters.lite.utils.AndroidUtils.edit; import static ru.vtosters.lite.utils.AndroidUtils.getDefaultPrefs; import static ru.vtosters.lite.utils.AndroidUtils.sendToast; -import static ru.vtosters.lite.utils.Preferences.getBoolValue; import android.app.Activity; import java.util.ArrayList; -import java.util.List; -import java.util.Map; +import java.util.Collections; +import java.util.LinkedHashSet; import ru.vtosters.lite.ui.vkui.VBottomSheetBuilder; -public class NewsfeedListManager{ - public static int hideitems = 0; +public class NewsfeedListManager { - public static void callEditorPopup(Activity activity){ - List list = new ArrayList<>(); + public static void callEditorPopup(Activity activity) { + var selectedItems = getDefaultPrefs().getString("news_feed_selected_items", ""); + var filtersSet = getDefaultPrefs().getStringSet("news_feed_items_set", Collections.synchronizedSet(new LinkedHashSet<>())); + var list = new ArrayList(); - for (Map.Entry entry : getDefaultPrefs().getAll().entrySet()) { - if (entry.getKey().startsWith("newsfeedlist_title_")) { - var boolname = entry.getKey().replace("newsfeedlist_title_", "newsfeedlist_"); - var boolvalue = getBoolValue(boolname, false); - var title = entry.getValue().toString(); - - list.add(new VBListItem(boolname, title, boolvalue)); - } - } - - if (list.size() == 0) { + if (filtersSet.size() == 0) { sendToast("Обновите ленту для получения списка доступных пунктов"); return; } + synchronized (filtersSet) { + for (String item : filtersSet) { + var id = item.substring(0, item.indexOf("|")); + var title = item.substring(item.indexOf("|") + 1); + + list.add(new VBListItem(id, title, selectedItems.contains(id))); + } + } + VBottomSheetBuilder.show(activity, new VBottomSheetBuilder.VBSContent( "Выберите пункты для скрытия", buildListOf(activity, list), - new VBottomSheetBuilder.VBSContent.VBSButton( "Сохранить", () -> { - for (VBListItem item : list) { - edit().putBoolean(item.id, item.checked).commit(); - sendToast("Для применения изменений обновите ленту"); - if (item.checked) { - hideitems++; - edit().putInt("newsfeedlistitems", hideitems).commit(); - } else if (hideitems == 0) { - edit().putInt("newsfeedlistitems", hideitems).commit(); - } - } + var newSelectedItems = ""; + for (VBListItem item : list) + if (item.checked) + newSelectedItems += item.id + ","; + getDefaultPrefs().edit() + .putString("news_feed_selected_items", newSelectedItems) + .apply(); + sendToast("Для применения изменений обновите ленту"); } ) )); } - public static void resetHideItems(){ - hideitems = 0; - for (Map.Entry entry : getDefaultPrefs().getAll().entrySet()) { - if (entry.getKey().startsWith("newsfeedlist_")) { - getDefaultPrefs().edit().remove(entry.getKey()).commit(); - } - } - + public static void resetHideItems() { + getDefaultPrefs().edit() + .putString("news_feed_selected_items", "") + .apply(); sendToast("Сброшены пункты для скрытия"); } } 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 7e3643a4d..cbd749136 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,13 +1,14 @@ package ru.vtosters.lite.ui.fragments; +import static ru.vtosters.lite.utils.AndroidUtils.getDefaultPrefs; import static ru.vtosters.lite.utils.AndroidUtils.getIdentifier; import static ru.vtosters.lite.utils.AndroidUtils.getPrefsValue; import static ru.vtosters.lite.utils.Preferences.copyright_post; -import static ru.vtosters.lite.utils.Preferences.offline; import android.content.Context; import android.content.Intent; import android.os.Bundle; +import android.text.TextUtils; import androidx.preference.Preference; @@ -36,7 +37,11 @@ public class FeedFragment extends MaterialPreferenceToolbarFragment { NewsfeedListManager.callEditorPopup(getActivity()); return true; }); - findPreference("newsfeedlistmanager").setSummary("Скрыто " + NewsfeedListManager.hideitems + " лент новостей"); + var str = getDefaultPrefs().getString("news_feed_selected_items", ""); + findPreference("newsfeedlistmanager").setSummary( + "Скрыто " + + (!TextUtils.isEmpty(str) ? str.split(",").length : 0) + + " лент новостей"); findPreference("newsfeedlistmanager_reset").setOnPreferenceClickListener(preference -> { NewsfeedListManager.resetHideItems(); return true; diff --git a/smali/res/values/styles.xml b/smali/res/values/styles.xml index 12b5ef973..a2d45b579 100644 --- a/smali/res/values/styles.xml +++ b/smali/res/values/styles.xml @@ -6359,8 +6359,8 @@ @color/gold_400 @color/white @color/gold_250 - @color/black - @color/black + @color/gray_900 + @color/gray_900 @color/gray_600 @color/gray_600 @color/gray_800 @@ -6619,8 +6619,8 @@ @color/gold_400 @color/white @color/gold_250 - @color/black - @color/black + @color/gray_900 + @color/gray_900 @color/gray_600 @color/gray_600 @color/gray_800