From 9efccb37add995c661443a0ab8c282d74a88b0e4 Mon Sep 17 00:00:00 2001 From: gdlbo <41114720+gdlbo@users.noreply.github.com> Date: Fri, 16 Feb 2024 03:02:58 +0300 Subject: [PATCH] init --- .../com/vk/newsfeed/holders/AdMarkHolder.java | 67 +++++++ .../java/ru/vtosters/hooks/NewsfeedHook.java | 42 ++-- .../ui/fragments/SponsorPostFragment.java | 58 +++++- .../utils/newsfeed/NewsFeedFiltersUtils.java | 29 ++- .../vtosters/sponsorpost/internal/Native.java | 15 ++ .../internal/VotesPreferences.java | 87 ++++++++ .../sponsorpost/internal/VotesService.java | 187 ++++++++++++++++++ .../sponsorpost/services/PostService.java | 2 +- .../sponsorpost/utils/FiltersPreferences.java | 8 + .../sponsorpost/utils/PostsPreferences.java | 18 +- .../vtosters/sponsorpost/utils/Updates.java | 35 +++- .../vk/newsfeed/holders/AdMarkHolder.smali | 187 ------------------ 12 files changed, 518 insertions(+), 217 deletions(-) create mode 100644 app/src/main/java/com/vk/newsfeed/holders/AdMarkHolder.java create mode 100644 app/src/main/java/ru/vtosters/sponsorpost/internal/Native.java create mode 100644 app/src/main/java/ru/vtosters/sponsorpost/internal/VotesPreferences.java create mode 100644 app/src/main/java/ru/vtosters/sponsorpost/internal/VotesService.java delete mode 100644 smali/smali_classes3/com/vk/newsfeed/holders/AdMarkHolder.smali diff --git a/app/src/main/java/com/vk/newsfeed/holders/AdMarkHolder.java b/app/src/main/java/com/vk/newsfeed/holders/AdMarkHolder.java new file mode 100644 index 000000000..09ea4dde3 --- /dev/null +++ b/app/src/main/java/com/vk/newsfeed/holders/AdMarkHolder.java @@ -0,0 +1,67 @@ +package com.vk.newsfeed.holders; + +import android.annotation.SuppressLint; +import android.graphics.drawable.Drawable; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; +import androidx.recyclerview.widget.RecyclerView; +import com.vk.core.ui.themes.VKThemeHelper; +import com.vk.dto.newsfeed.entries.NewsEntry; +import com.vk.dto.newsfeed.entries.Post; +import com.vk.dto.newsfeed.entries.PromoPost; +import com.vk.extensions.ViewExtKt; +import com.vtosters.lite.R; +import ru.vtosters.lite.utils.newsfeed.NewsFeedFiltersUtils; +import ru.vtosters.sponsorpost.internal.VotesPreferences; +import ru.vtosters.sponsorpost.utils.PostsPreferences; + +public final class AdMarkHolder extends BaseNewsEntryHolder { + private final TextView F; + + @SuppressLint("ResourceType") + public AdMarkHolder(ViewGroup viewGroup) { + super(R.layout.marked_as_ads, viewGroup); + View view = ((RecyclerView.ViewHolder) this).itemView; + this.F = ViewExtKt.a(view, R.id.text, (View.OnClickListener) null); + } + + @SuppressLint("ResourceType") + public void b(NewsEntry newsEntry) { // onBind + String disclamer = null; + Drawable drawable = null; + int height = 0; + + if (newsEntry instanceof Post) { + Post post = ((Post) newsEntry); + if (post.L1()) { + drawable = VKThemeHelper.a(R.drawable.marked_as_ads, R.attr.icon_tertiary); + int ownerId = post.b(); + int postId = post.P1(); + String text = post.getText(); + + if (PostsPreferences.isPostAd(ownerId, postId)) { + disclamer = "SponsorPost: Реклама"; + } else if (VotesPreferences.isPostAd(ownerId, postId)) { + disclamer = "SponsorPost: Возможно реклама"; + } else if (NewsFeedFiltersUtils.sponsorFilters(text)) { + disclamer = "SponsorPost: Заблокировано фильтрами"; + } else { + disclamer = m(R.string.sponsored_post_in_group); + } + + height = e0().getDimensionPixelSize(R.dimen.newsfeed_ad_mark_post_height); + } + } else if (newsEntry instanceof PromoPost) { + PromoPost promoPost = (PromoPost) newsEntry; + if (!promoPost.E1().isEmpty()) { + height = e0().getDimensionPixelSize(R.dimen.newsfeed_ad_mark_promo_post_height); + disclamer = promoPost.E1(); + } + } + + this.F.setCompoundDrawablesRelativeWithIntrinsicBounds(drawable, null, null, null); + this.F.setMinHeight(height); + this.F.setText(disclamer); + } +} \ No newline at end of file diff --git a/app/src/main/java/ru/vtosters/hooks/NewsfeedHook.java b/app/src/main/java/ru/vtosters/hooks/NewsfeedHook.java index 491c275e7..b8b04b990 100644 --- a/app/src/main/java/ru/vtosters/hooks/NewsfeedHook.java +++ b/app/src/main/java/ru/vtosters/hooks/NewsfeedHook.java @@ -9,13 +9,12 @@ import com.vk.discover.DiscoverItemDecorator; import ru.vtosters.hooks.other.Preferences; import ru.vtosters.lite.concurrent.VTExecutors; import ru.vtosters.lite.utils.NetworkUtils; +import ru.vtosters.sponsorpost.internal.VotesPreferences; +import ru.vtosters.sponsorpost.internal.VotesService; import ru.vtosters.sponsorpost.services.PostService; import ru.vtosters.sponsorpost.utils.PostsPreferences; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashSet; -import java.util.List; +import java.util.*; import static java.lang.Long.MAX_VALUE; import static ru.vtosters.hooks.other.Preferences.*; @@ -100,8 +99,16 @@ public class NewsfeedHook { public static void takeOwnerIdSponsorPost(int ownerid) { if (NetworkUtils.isNetworkConnected() && PostsPreferences.isEnabled() && !Preferences.serverFeaturesDisable()) { VTExecutors.getIoScheduler().a(() -> { - List postIds = PostService.getPostIdsByOwnerId((long) ownerid, 0L); - PostsPreferences.saveGroupSpecifiedPosts(postIds, (long) ownerid); + if (PostsPreferences.isGroupAd(ownerid) || VotesPreferences.isGroupAd(ownerid)) { + if (VotesPreferences.isEnabled()) { + Map> postIds = VotesService.getPostIdsByOwnerId((long) ownerid, 0L); + VotesPreferences.saveGroupSpecifiedPosts(postIds.get("vote"), (long) ownerid); + PostsPreferences.saveGroupSpecifiedPosts(postIds.get("prod"), (long) ownerid); + } else { + List postIds = PostService.getPostIdsByOwnerId((long) ownerid, 0L); + PostsPreferences.saveGroupSpecifiedPosts(postIds, (long) ownerid); + } + } }); } } @@ -110,17 +117,28 @@ public class NewsfeedHook { long ownerid = Long.parseLong(strArr[0].split("_")[0]); long postId = Long.parseLong(strArr[0].split("_")[1]); - if (PostsPreferences.isPostAd(ownerid, postId)) { + if (PostsPreferences.isPostAd(ownerid, postId) || VotesPreferences.isPostAd(ownerid, postId)) { return; } - if (NetworkUtils.isNetworkConnected() && PostsPreferences.isEnabled() && !Preferences.serverFeaturesDisable() && PostsPreferences.isGroupAd(ownerid)) { + if (NetworkUtils.isNetworkConnected() && PostsPreferences.isEnabled() && !Preferences.serverFeaturesDisable()) { VTExecutors.getIoScheduler().a(() -> { - boolean postIds = PostService.isPostAd(ownerid, postId); + if (VotesPreferences.isEnabled()) { + boolean postIds = VotesService.isPostAd(ownerid, postId); - if (postIds) { - PostsPreferences.saveAdPostInfo(ownerid, postId); - sendToast("Этот пост помечен как рекламный"); + if (postIds) { + VotesPreferences.saveAdPostInfo(ownerid, postId); + } + } else { + boolean postIds = PostService.isPostAd(ownerid, postId); + + if (postIds) { + PostsPreferences.saveAdPostInfo(ownerid, postId); + + if (!PostsPreferences.isEnabledMarking()) { + sendToast("Этот пост помечен как рекламный"); + } + } } }); } diff --git a/app/src/main/java/ru/vtosters/lite/ui/fragments/SponsorPostFragment.java b/app/src/main/java/ru/vtosters/lite/ui/fragments/SponsorPostFragment.java index e47a1ae49..0b0987104 100644 --- a/app/src/main/java/ru/vtosters/lite/ui/fragments/SponsorPostFragment.java +++ b/app/src/main/java/ru/vtosters/lite/ui/fragments/SponsorPostFragment.java @@ -6,8 +6,10 @@ import android.os.Bundle; import ru.vtosters.hooks.other.Preferences; import ru.vtosters.hooks.other.ThemesUtils; import ru.vtosters.lite.ui.PreferenceFragmentUtils; +import ru.vtosters.lite.utils.AndroidUtils; import ru.vtosters.lite.utils.NetworkUtils; import ru.vtosters.sponsorpost.data.Filter; +import ru.vtosters.sponsorpost.internal.VotesPreferences; import ru.vtosters.sponsorpost.services.FilterService; import ru.vtosters.sponsorpost.utils.FiltersPreferences; import ru.vtosters.sponsorpost.utils.PostsPreferences; @@ -49,7 +51,7 @@ public class SponsorPostFragment extends TrackedMaterialPreferenceToolbarFragmen } else { PreferenceFragmentUtils.addMaterialSwitchPreference( getPreferenceScreen(), - "sponsorpost", + "", "Фильтр постов", "Получать списки рекламных постов в группах и ленте, которые не блокируются рекламными фильтрами", null, @@ -59,6 +61,47 @@ public class SponsorPostFragment extends TrackedMaterialPreferenceToolbarFragmen return true; } ); + + PreferenceFragmentUtils.addMaterialSwitchPreference( + getPreferenceScreen(), + "", + "Не скрывать посты", + "Помечать посты рекламной пометкой, но не скрывать их полностью", + null, + PostsPreferences.isEnabledMarking(), + (preference, o) -> { + PostsPreferences.setEnabledMarking((boolean) o); + return true; + } + ); + + PreferenceFragmentUtils.addMaterialSwitchPreference( + getPreferenceScreen(), + "", + "Предварительные списки", + "Получать дополнительно более свежие списки которые ещё не попали в основной список. Нужно для активного голосования для блокировки постов. Возможно много ошибок!", + null, + VotesPreferences.isEnabled(), + (preference, o) -> { + VotesPreferences.setEnabled((boolean) o); + return true; + } + ).setEnabled(PostsPreferences.isEnabled()); + + PreferenceFragmentUtils.addPreference( + getPreferenceScreen(), + "", + "Обновить списки постов", + null, + null, + preference -> { + this.requireActivity().runOnUiThread(() -> { + Updates.updatePosts(); + AndroidUtils.sendToast("Обновлено"); + }); + return false; + } + ); } requireActivity().runOnUiThread(() -> { @@ -123,6 +166,19 @@ public class SponsorPostFragment extends TrackedMaterialPreferenceToolbarFragmen ); } + PreferenceFragmentUtils.addMaterialSwitchPreference( + getPreferenceScreen(), + "", + "Не блокировать посты", + "Помечать посты заблокированные фильтрами", + null, + FiltersPreferences.isEnabledMarking(), + (preference, o) -> { + FiltersPreferences.setEnabledMarking((boolean) o); + return true; + } + ); + PreferenceFragmentUtils.addPreference( getPreferenceScreen(), "", diff --git a/app/src/main/java/ru/vtosters/lite/utils/newsfeed/NewsFeedFiltersUtils.java b/app/src/main/java/ru/vtosters/lite/utils/newsfeed/NewsFeedFiltersUtils.java index d3109db8f..c85b2951e 100644 --- a/app/src/main/java/ru/vtosters/lite/utils/newsfeed/NewsFeedFiltersUtils.java +++ b/app/src/main/java/ru/vtosters/lite/utils/newsfeed/NewsFeedFiltersUtils.java @@ -6,6 +6,7 @@ import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import ru.vtosters.lite.utils.AccountManagerUtils; +import ru.vtosters.sponsorpost.internal.VotesPreferences; import ru.vtosters.sponsorpost.utils.FiltersPreferences; import ru.vtosters.sponsorpost.utils.PostsPreferences; @@ -212,19 +213,37 @@ public class NewsFeedFiltersUtils { return false; } - if (adsgroup() && post.optInt("marked_as_ads") == 1 && !isWhitelistedAd(post)) { + if (adsgroup() && post.optInt("marked_as_ads") == 1 && !post.optBoolean("sponsorpost") && !post.optBoolean("sponsorpost_filters") && !isWhitelistedAd(post)) { logRemovedPost(post, source, "marked_as_ads", needToShowToast); return false; } - if (PostsPreferences.isPostAd(getOwnerId(post), getPostId(post)) && !isWhitelistedAd(post)) { + if (PostsPreferences.isPostAd(getOwnerId(post), getPostId(post)) && !post.optBoolean("sponsorpost") && !post.optBoolean("sponsorpost_filters") && !isWhitelistedAd(post)) { logRemovedPost(post, source, "sponsorpost", needToShowToast); - return false; + + if (PostsPreferences.isEnabledMarking()) { + post.putOpt("marked_as_ads", 1); + post.putOpt("sponsorpost", true); + } else { + return false; + } } - if (sponsorFilters(post.optString("text")) && !isWhitelistedFilters(post)) { + if (VotesPreferences.isPostAd(getOwnerId(post), getPostId(post)) && !post.optBoolean("sponsorpost") && !post.optBoolean("sponsorpost_filters") && !isWhitelistedAd(post)) { + logRemovedPost(post, source, "sponsorpost vote base", needToShowToast); + post.putOpt("marked_as_ads", 1); + post.putOpt("sponsorpost", true); + } + + if (sponsorFilters(post.optString("text")) && !post.optBoolean("sponsorpost") && !post.optBoolean("sponsorpost_filters") && !isWhitelistedFilters(post)) { logRemovedPost(post, source, "sponsorpost filter", needToShowToast); - return false; + + if (FiltersPreferences.isEnabledMarking()) { + post.putOpt("marked_as_ads", 1); + post.putOpt("sponsorpost_filters", true); + } else { + return false; + } } if (checkCopyright(post)) { diff --git a/app/src/main/java/ru/vtosters/sponsorpost/internal/Native.java b/app/src/main/java/ru/vtosters/sponsorpost/internal/Native.java new file mode 100644 index 000000000..52e0b9d63 --- /dev/null +++ b/app/src/main/java/ru/vtosters/sponsorpost/internal/Native.java @@ -0,0 +1,15 @@ +package ru.vtosters.sponsorpost.internal; + +public class Native { + public static String sig() { + return null; + } + + public static String time() { + return null; + } + + public static String pkey() { + return null; + } +} \ No newline at end of file diff --git a/app/src/main/java/ru/vtosters/sponsorpost/internal/VotesPreferences.java b/app/src/main/java/ru/vtosters/sponsorpost/internal/VotesPreferences.java new file mode 100644 index 000000000..2a308640a --- /dev/null +++ b/app/src/main/java/ru/vtosters/sponsorpost/internal/VotesPreferences.java @@ -0,0 +1,87 @@ +package ru.vtosters.sponsorpost.internal; + +import android.content.Context; +import android.content.SharedPreferences; +import android.util.Log; +import ru.vtosters.lite.utils.AndroidUtils; + +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + +public class VotesPreferences { + private static final SharedPreferences preferences; + + static { + preferences = getPreferences(); + } + + private static SharedPreferences getPreferences() { + return AndroidUtils.getGlobalContext().getSharedPreferences("ru.vtosters.sponsorpost.votes.prefs", Context.MODE_PRIVATE); + } + + public static boolean isEnabled() { + return preferences.getBoolean("sponsortesting", false); + } + + public static void setEnabled(boolean status) { + preferences.edit().putBoolean("sponsortesting", status).apply(); + } + + public static void savePosts(List posts) { + preferences.edit() + .putStringSet("posts", new HashSet<>(posts)) + .apply(); + } + + public static void saveGroupsIds(List ids) { + preferences.edit() + .putStringSet("groupIds", new HashSet<>(ids)) + .apply(); + } + + public static void saveGroupSpecifiedPosts(List postsIds, Long ownerId) { + Set stringSet = postsIds.stream() + .map(post -> ownerId + "_" + post) + .collect(Collectors.toSet()); + + preferences.edit() + .putStringSet(ownerId + "_posts", stringSet) + .apply(); + } + + public static void saveAdPostInfo(long ownerId, long postId) { + Set currentStringSet = preferences.getStringSet("posts", new HashSet<>()); + Set newStringSet = new HashSet<>(currentStringSet); + + newStringSet.add(ownerId + "_" + postId); + + Log.d("SponsorPost", ownerId + "_" + postId); + + preferences.edit() + .putStringSet("posts", newStringSet) + .apply(); + } + + public static boolean isGroupAd(long ownerId) { + Set isGroupAd = preferences.getStringSet("groupIds", new HashSet<>()); + + if (!isGroupAd.isEmpty() && isEnabled()) { + return isGroupAd.contains(Long.toString(ownerId)); + } else { + return false; + } + } + + public static boolean isPostAd(long ownerId, long postId) { + if (isEnabled() && isGroupAd(ownerId)) { + Set hasSpecifiedGroupPosts = preferences.getStringSet(ownerId + "_posts", new HashSet<>()); + Set hasPost = preferences.getStringSet("posts", new HashSet<>()); + + return hasPost.contains(ownerId + "_" + postId) || hasSpecifiedGroupPosts.contains(ownerId + "_" + postId); + } else { + return false; + } + } +} \ No newline at end of file diff --git a/app/src/main/java/ru/vtosters/sponsorpost/internal/VotesService.java b/app/src/main/java/ru/vtosters/sponsorpost/internal/VotesService.java new file mode 100644 index 000000000..c449c69b8 --- /dev/null +++ b/app/src/main/java/ru/vtosters/sponsorpost/internal/VotesService.java @@ -0,0 +1,187 @@ +package ru.vtosters.sponsorpost.internal; + +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.Response; +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; +import ru.vtosters.sponsorpost.utils.ApiUtils; +import ru.vtosters.sponsorpost.utils.GzipDecompressor; + +import java.io.IOException; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.stream.Collectors; +import java.util.stream.IntStream; + +public class VotesService { + private static final OkHttpClient client = new OkHttpClient(); + private static final String apiPath = ApiUtils.getURL() + "/votes"; + + public static Map> getPosts(Long date) { + String getFromDate = date > 0 ? ("&date=" + date) : ""; + Request request = new Request.a() + .b(apiPath + "/getAllPostIds" + "?needProd=true" + getFromDate) + .a("Content-Type", "application/json") + .a("Accept-Encoding", "gzip") + .a(); + try (Response response = client.a(request).execute()) { + if (response.h()) { + String encoding = response.a("Content-Encoding"); + if (encoding != null && encoding.equals("gzip")) { + return parseJSON(new JSONObject(GzipDecompressor.decompress(response.a().b()))); + } else { + return parseJSON(new JSONObject(response.a().g())); + } + } else { + throw new RuntimeException("Failed to get posts: " + response.l()); + } + } catch (IOException | JSONException e) { + throw new RuntimeException(e); + } + } + + private static Map> parseJSON(JSONObject object) throws JSONException { + String PROD_KEY = "prod"; + String VOTE_KEY = "vote"; + + JSONArray prodBase = object.getJSONArray(PROD_KEY); + JSONArray testBase = object.getJSONArray(VOTE_KEY); + + if (prodBase.length() == 0 || testBase.length() == 0) { + return Collections.emptyMap(); + } + + List prodList = IntStream.range(0, prodBase.length()) + .mapToObj(prodBase::optString) + .filter(Objects::nonNull) + .collect(Collectors.toList()); + + List voteList = IntStream.range(0, testBase.length()) + .mapToObj(testBase::optString) + .filter(Objects::nonNull) + .collect(Collectors.toList()); + + return Map.of(PROD_KEY, prodList, VOTE_KEY, voteList); + } + + public static Map> getPostIdsByOwnerId(Long ownerId, Long date) { + String getFromDate = date > 0 ? ("&date=" + date) : ""; + String requestUrl = apiPath + "/getPostIdsByOwnerId" + "?ownerId=" + ownerId + getFromDate + "&needProd=true"; + Request request = new Request.a() + .b(requestUrl) + .a("Content-Type", "application/json") + .a("Accept-Encoding", "gzip") + .a(); + try (Response response = client.a(request).execute()) { + if (response.h()) { + String encoding = response.a("Content-Encoding"); + if (encoding != null && encoding.equals("gzip")) { + return parseJSON(new JSONObject(GzipDecompressor.decompress(response.a().b()))); + } else { + return parseJSON(new JSONObject(response.a().g())); + } + } else { + throw new RuntimeException("Failed to get postIdsByOwnerId: " + response.l()); + } + } catch (IOException | JSONException e) { + throw new RuntimeException(e); + } + } + + public static Map> getOwnerIds() { + String requestUrl = apiPath + "/getOwnerIds" + "?needProd=true"; + Request request = new Request.a() + .b(requestUrl) + .a("Content-Type", "application/json") + .a("Accept-Encoding", "gzip") + .a(); + try (Response response = client.a(request).execute()) { + if (response.h()) { + String encoding = response.a("Content-Encoding"); + if (encoding != null && encoding.equals("gzip")) { + return parseJSON(new JSONObject(GzipDecompressor.decompress(response.a().b()))); + } else { + return parseJSON(new JSONObject(response.a().g())); + } + } else { + throw new RuntimeException("Failed to get ownersIds: " + response.l()); + } + } catch (IOException | JSONException e) { + throw new RuntimeException(e); + } + } + + public static JSONObject ratePost(Long ownerId, Long postId, boolean reportToServer) { + String requestUrl = apiPath + (reportToServer ? "/dislike" : "/like") + "?ownerId=" + ownerId + "&postId=" + postId; + Request request = new Request.a() + .b(requestUrl) + .a("Content-Type", "application/json") + .a(); + try (Response response = client.a(request).execute()) { + if (response.h()) { + String encoding = response.a("Content-Encoding"); + if (encoding != null && encoding.equals("gzip")) { + return new JSONObject(GzipDecompressor.decompress(response.a().b())); + } else { + return new JSONObject(response.a().g()); + } + } else { + throw new RuntimeException("Failed to get vote token: " + response.l()); + } + } catch (IOException | JSONException e) { + throw new RuntimeException(e); + } + } + + public static String getVoteToken() { + String requestUrl = apiPath + "/getUserToken" + "?private_key=" + Native.pkey(); + Request request = new Request.a() + .b(requestUrl) + .a("Content-Type", "application/json") + .a("Timestamp", Native.time()) + .a("Signature", Native.sig()) + .a(); + try (Response response = client.a(request).execute()) { + if (response.h()) { + String encoding = response.a("Content-Encoding"); + if (encoding != null && encoding.equals("gzip")) { + return new JSONObject(GzipDecompressor.decompress(response.a().b())).getString("token"); + } else { + return new JSONObject(response.a().g()).getString("token"); + } + } else { + throw new RuntimeException("Failed to get vote token: " + response.l()); + } + } catch (IOException | JSONException e) { + throw new RuntimeException(e); + } + } + + public static boolean isPostAd(long ownerId, long postId) { + String requestUrl = apiPath + "/isPostAdvert?post=" + ownerId + "_" + postId + "&needProd=true"; + Request request = new Request.a() + .b(requestUrl) + .a("Content-Type", "application/json") + .a(); + try (Response response = client.a(request).execute()) { + if (response.h()) { + String encoding = response.a("Content-Encoding"); + String resp; + if (encoding != null && encoding.equals("gzip")) { + resp = GzipDecompressor.decompress(response.a().b()); + } else { + resp = response.a().g(); + } + return Boolean.parseBoolean(resp); + } else { + throw new RuntimeException("Failed to check post for ad status: " + response.l()); + } + } catch (IOException e) { + throw new RuntimeException(e); + } + } +} diff --git a/app/src/main/java/ru/vtosters/sponsorpost/services/PostService.java b/app/src/main/java/ru/vtosters/sponsorpost/services/PostService.java index 823c06080..cf39a8752 100644 --- a/app/src/main/java/ru/vtosters/sponsorpost/services/PostService.java +++ b/app/src/main/java/ru/vtosters/sponsorpost/services/PostService.java @@ -137,7 +137,7 @@ public class PostService { // Retrieve post IDs for a specific owner and date // If date is positive, get posts older than the specified date // Otherwise, get all posts for the owner - String getFromDate = date > 0 ? ("?date=" + date) : ""; + String getFromDate = date > 0 ? ("&date=" + date) : ""; // Construct the API request URL String requestUrl = apiPath + "/getPostIdsByOwnerId" + "?ownerId=" + ownerId + getFromDate; diff --git a/app/src/main/java/ru/vtosters/sponsorpost/utils/FiltersPreferences.java b/app/src/main/java/ru/vtosters/sponsorpost/utils/FiltersPreferences.java index 6b773f7b5..664851340 100644 --- a/app/src/main/java/ru/vtosters/sponsorpost/utils/FiltersPreferences.java +++ b/app/src/main/java/ru/vtosters/sponsorpost/utils/FiltersPreferences.java @@ -31,6 +31,14 @@ public class FiltersPreferences { return AndroidUtils.getGlobalContext().getSharedPreferences("ru.vtosters.sponsorpost.filters.prefs", Context.MODE_PRIVATE); } + public static boolean isEnabledMarking() { + return preferences.getBoolean("sponsorpost_filters_marking", false); + } + + public static void setEnabledMarking(boolean status) { + preferences.edit().putBoolean("sponsorpost_filters_marking", status).apply(); + } + public static void clearAll() { preferences.edit().clear().apply(); } diff --git a/app/src/main/java/ru/vtosters/sponsorpost/utils/PostsPreferences.java b/app/src/main/java/ru/vtosters/sponsorpost/utils/PostsPreferences.java index 7fe438609..b520377ad 100644 --- a/app/src/main/java/ru/vtosters/sponsorpost/utils/PostsPreferences.java +++ b/app/src/main/java/ru/vtosters/sponsorpost/utils/PostsPreferences.java @@ -30,6 +30,14 @@ public class PostsPreferences { preferences.edit().putBoolean("sponsorpost", status).apply(); } + public static boolean isEnabledMarking() { + return preferences.getBoolean("sponsorpost_marking", false); + } + + public static void setEnabledMarking(boolean status) { + preferences.edit().putBoolean("sponsorpost_marking", status).apply(); + } + public static void savePosts(List posts) { Set stringSet = posts.stream() .map(post -> post.getOwnerId() + "_" + post.getPostId()) @@ -40,7 +48,13 @@ public class PostsPreferences { .apply(); } - public static void saveGroupSpecifiedPosts(List postsIds, Long ownerId) { + public static void savePostsStr(List posts) { + preferences.edit() + .putStringSet("posts", new HashSet<>(posts)) + .apply(); + } + + public static void saveGroupSpecifiedPosts(List postsIds, Long ownerId) { Set stringSet = postsIds.stream() .map(post -> ownerId + "_" + post) .collect(Collectors.toSet()); @@ -50,7 +64,7 @@ public class PostsPreferences { .apply(); } - public static void saveGroupsIds(List ids) { + public static void saveGroupsIds(List ids) { Set stringSet = ids.stream().map(String::valueOf).collect(Collectors.toSet()); preferences.edit() diff --git a/app/src/main/java/ru/vtosters/sponsorpost/utils/Updates.java b/app/src/main/java/ru/vtosters/sponsorpost/utils/Updates.java index 91c665e95..42dd81120 100644 --- a/app/src/main/java/ru/vtosters/sponsorpost/utils/Updates.java +++ b/app/src/main/java/ru/vtosters/sponsorpost/utils/Updates.java @@ -1,13 +1,15 @@ package ru.vtosters.sponsorpost.utils; -import ru.vtosters.hooks.other.Preferences; import ru.vtosters.lite.utils.NetworkUtils; import ru.vtosters.sponsorpost.data.Filter; import ru.vtosters.sponsorpost.data.Post; +import ru.vtosters.sponsorpost.internal.VotesPreferences; +import ru.vtosters.sponsorpost.internal.VotesService; import ru.vtosters.sponsorpost.services.FilterService; import ru.vtosters.sponsorpost.services.PostService; import java.util.List; +import java.util.Map; import java.util.Objects; import java.util.concurrent.TimeUnit; @@ -56,16 +58,31 @@ public class Updates { long weekAgo = currentTime - TimeUnit.DAYS.toMillis(7); if (PostsPreferences.isEnabled() && NetworkUtils.isNetworkConnected()) { - List posts = PostService.getPosts(weekAgo); - List groupIds = PostService.getOwnerIds(); + if (VotesPreferences.isEnabled()) { + Map> posts = VotesService.getPosts(weekAgo); + Map> groupIds = VotesService.getOwnerIds(); - if (!posts.isEmpty()) { - PostsPreferences.savePosts(posts); - } + if (!posts.isEmpty()) { + PostsPreferences.savePostsStr(posts.get("prod")); + VotesPreferences.savePosts(posts.get("vote")); + } - if (!groupIds.isEmpty()) { - PostsPreferences.saveGroupsIds(groupIds); + if (!groupIds.isEmpty()) { + PostsPreferences.saveGroupsIds(groupIds.get("prod")); + VotesPreferences.saveGroupsIds(groupIds.get("vote")); + } + } else { + List posts = PostService.getPosts(weekAgo); + List groupIds = PostService.getOwnerIds(); + + if (!posts.isEmpty()) { + PostsPreferences.savePosts(posts); + } + + if (!groupIds.isEmpty()) { + PostsPreferences.saveGroupsIds(groupIds); + } } } } -} +} \ No newline at end of file diff --git a/smali/smali_classes3/com/vk/newsfeed/holders/AdMarkHolder.smali b/smali/smali_classes3/com/vk/newsfeed/holders/AdMarkHolder.smali deleted file mode 100644 index aa7e38cba..000000000 --- a/smali/smali_classes3/com/vk/newsfeed/holders/AdMarkHolder.smali +++ /dev/null @@ -1,187 +0,0 @@ -.class public final Lcom/vk/newsfeed/holders/AdMarkHolder; -.super Lcom/vk/newsfeed/holders/BaseNewsEntryHolder; -.source "AdMarkHolder.kt" - - -# annotations -.annotation system Ldalvik/annotation/Signature; - value = { - "Lcom/vk/newsfeed/holders/BaseNewsEntryHolder<", - "Lcom/vk/dto/newsfeed/entries/NewsEntry;", - ">;" - } -.end annotation - - -# instance fields -.field private final F:Landroid/widget/TextView; - - -# direct methods -.method public constructor (Landroid/view/ViewGroup;)V - .locals 3 - - const v0, 0x7f0d0307 - - .line 1 - invoke-direct {p0, v0, p1}, Lcom/vk/newsfeed/holders/BaseNewsEntryHolder;->(ILandroid/view/ViewGroup;)V - - .line 2 - iget-object p1, p0, Landroidx/recyclerview/widget/RecyclerView$ViewHolder;->itemView:Landroid/view/View; - - const-string v0, "itemView" - - invoke-static {p1, v0}, Lkotlin/jvm/internal/Intrinsics;->a(Ljava/lang/Object;Ljava/lang/String;)V - - const/4 v0, 0x0 - - const v1, 0x7f0a0d4e - - const/4 v2, 0x2 - - invoke-static {p1, v1, v0, v2, v0}, Lcom/vk/extensions/ViewExtKt;->a(Landroid/view/View;ILkotlin/jvm/b/Functions2;ILjava/lang/Object;)Landroid/view/View; - - move-result-object p1 - - check-cast p1, Landroid/widget/TextView; - - iput-object p1, p0, Lcom/vk/newsfeed/holders/AdMarkHolder;->F:Landroid/widget/TextView; - - return-void -.end method - - -# virtual methods -.method public b(Lcom/vk/dto/newsfeed/entries/NewsEntry;)V - .locals 4 - - .line 2 - instance-of v0, p1, Lcom/vk/dto/newsfeed/entries/Post; - - const/4 v1, 0x0 - - const/4 v2, 0x0 - - if-eqz v0, :cond_0 - - check-cast p1, Lcom/vk/dto/newsfeed/entries/Post; - - invoke-virtual {p1}, Lcom/vk/dto/newsfeed/entries/Post;->L1()Z - - move-result p1 - - if-eqz p1, :cond_2 - - const p1, 0x7f0808cf - - const v0, 0x7f040256 - - .line 3 - invoke-static {p1, v0}, Lcom/vk/core/ui/themes/VKThemeHelper;->a(II)Lcom/vk/core/drawable/RecoloredDrawable; - - move-result-object p1 - - const v0, 0x7f120def - - .line 4 - invoke-virtual {p0, v0}, Lcom/vtosters/lite/ui/holder/RecyclerHolder;->m(I)Ljava/lang/String; - - move-result-object v0 - - .line 5 - invoke-virtual {p0}, Lcom/vtosters/lite/ui/holder/RecyclerHolder;->e0()Landroid/content/res/Resources; - - move-result-object v1 - - const v3, 0x7f0701b8 - - invoke-virtual {v1, v3}, Landroid/content/res/Resources;->getDimensionPixelSize(I)I - - move-result v1 - - goto :goto_1 - - .line 6 - :cond_0 - instance-of v0, p1, Lcom/vk/dto/newsfeed/entries/PromoPost; - - if-eqz v0, :cond_2 - - check-cast p1, Lcom/vk/dto/newsfeed/entries/PromoPost; - - invoke-virtual {p1}, Lcom/vk/dto/newsfeed/entries/PromoPost;->E1()Ljava/lang/String; - - move-result-object v0 - - invoke-interface {v0}, Ljava/lang/CharSequence;->length()I - - move-result v0 - - if-lez v0, :cond_1 - - const/4 v0, 0x1 - - goto :goto_0 - - :cond_1 - const/4 v0, 0x0 - - :goto_0 - if-eqz v0, :cond_2 - - .line 7 - invoke-virtual {p1}, Lcom/vk/dto/newsfeed/entries/PromoPost;->E1()Ljava/lang/String; - - move-result-object p1 - - .line 8 - invoke-virtual {p0}, Lcom/vtosters/lite/ui/holder/RecyclerHolder;->e0()Landroid/content/res/Resources; - - move-result-object v0 - - const v1, 0x7f0701b9 - - invoke-virtual {v0, v1}, Landroid/content/res/Resources;->getDimensionPixelSize(I)I - - move-result v1 - - move-object v0, p1 - - move-object p1, v2 - - goto :goto_1 - - :cond_2 - move-object p1, v2 - - move-object v0, p1 - - .line 9 - :goto_1 - iget-object v3, p0, Lcom/vk/newsfeed/holders/AdMarkHolder;->F:Landroid/widget/TextView; - - invoke-virtual {v3, p1, v2, v2, v2}, Landroid/widget/TextView;->setCompoundDrawablesRelativeWithIntrinsicBounds(Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;)V - - .line 10 - iget-object p1, p0, Lcom/vk/newsfeed/holders/AdMarkHolder;->F:Landroid/widget/TextView; - - invoke-virtual {p1, v1}, Landroid/widget/TextView;->setMinHeight(I)V - - .line 11 - iget-object p1, p0, Lcom/vk/newsfeed/holders/AdMarkHolder;->F:Landroid/widget/TextView; - - invoke-virtual {p1, v0}, Landroid/widget/TextView;->setText(Ljava/lang/CharSequence;)V - - return-void -.end method - -.method public bridge synthetic b(Ljava/lang/Object;)V - .locals 0 - - .line 1 - check-cast p1, Lcom/vk/dto/newsfeed/entries/NewsEntry; - - invoke-virtual {p0, p1}, Lcom/vk/newsfeed/holders/AdMarkHolder;->b(Lcom/vk/dto/newsfeed/entries/NewsEntry;)V - - return-void -.end method