init
This commit is contained in:
@@ -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<NewsEntry> {
|
||||
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);
|
||||
}
|
||||
}
|
||||
@@ -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<Long> postIds = PostService.getPostIdsByOwnerId((long) ownerid, 0L);
|
||||
PostsPreferences.saveGroupSpecifiedPosts(postIds, (long) ownerid);
|
||||
if (PostsPreferences.isGroupAd(ownerid) || VotesPreferences.isGroupAd(ownerid)) {
|
||||
if (VotesPreferences.isEnabled()) {
|
||||
Map<String, List<String>> postIds = VotesService.getPostIdsByOwnerId((long) ownerid, 0L);
|
||||
VotesPreferences.saveGroupSpecifiedPosts(postIds.get("vote"), (long) ownerid);
|
||||
PostsPreferences.saveGroupSpecifiedPosts(postIds.get("prod"), (long) ownerid);
|
||||
} else {
|
||||
List<Long> 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("Этот пост помечен как рекламный");
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@@ -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(),
|
||||
"",
|
||||
|
||||
@@ -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)) {
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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<String> posts) {
|
||||
preferences.edit()
|
||||
.putStringSet("posts", new HashSet<>(posts))
|
||||
.apply();
|
||||
}
|
||||
|
||||
public static void saveGroupsIds(List<String> ids) {
|
||||
preferences.edit()
|
||||
.putStringSet("groupIds", new HashSet<>(ids))
|
||||
.apply();
|
||||
}
|
||||
|
||||
public static void saveGroupSpecifiedPosts(List<String> postsIds, Long ownerId) {
|
||||
Set<String> 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<String> currentStringSet = preferences.getStringSet("posts", new HashSet<>());
|
||||
Set<String> 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<String> 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<String> hasSpecifiedGroupPosts = preferences.getStringSet(ownerId + "_posts", new HashSet<>());
|
||||
Set<String> hasPost = preferences.getStringSet("posts", new HashSet<>());
|
||||
|
||||
return hasPost.contains(ownerId + "_" + postId) || hasSpecifiedGroupPosts.contains(ownerId + "_" + postId);
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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<String, List<String>> 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<String, List<String>> 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<String> prodList = IntStream.range(0, prodBase.length())
|
||||
.mapToObj(prodBase::optString)
|
||||
.filter(Objects::nonNull)
|
||||
.collect(Collectors.toList());
|
||||
|
||||
List<String> 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<String, List<String>> 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<String, List<String>> 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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<Post> posts) {
|
||||
Set<String> stringSet = posts.stream()
|
||||
.map(post -> post.getOwnerId() + "_" + post.getPostId())
|
||||
@@ -40,7 +48,13 @@ public class PostsPreferences {
|
||||
.apply();
|
||||
}
|
||||
|
||||
public static void saveGroupSpecifiedPosts(List<Long> postsIds, Long ownerId) {
|
||||
public static void savePostsStr(List<String> posts) {
|
||||
preferences.edit()
|
||||
.putStringSet("posts", new HashSet<>(posts))
|
||||
.apply();
|
||||
}
|
||||
|
||||
public static void saveGroupSpecifiedPosts(List<?> postsIds, Long ownerId) {
|
||||
Set<String> stringSet = postsIds.stream()
|
||||
.map(post -> ownerId + "_" + post)
|
||||
.collect(Collectors.toSet());
|
||||
@@ -50,7 +64,7 @@ public class PostsPreferences {
|
||||
.apply();
|
||||
}
|
||||
|
||||
public static void saveGroupsIds(List<Long> ids) {
|
||||
public static void saveGroupsIds(List<?> ids) {
|
||||
Set<String> stringSet = ids.stream().map(String::valueOf).collect(Collectors.toSet());
|
||||
|
||||
preferences.edit()
|
||||
|
||||
@@ -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<Post> posts = PostService.getPosts(weekAgo);
|
||||
List<Long> groupIds = PostService.getOwnerIds();
|
||||
if (VotesPreferences.isEnabled()) {
|
||||
Map<String, List<String>> posts = VotesService.getPosts(weekAgo);
|
||||
Map<String, List<String>> 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<Post> posts = PostService.getPosts(weekAgo);
|
||||
List<Long> groupIds = PostService.getOwnerIds();
|
||||
|
||||
if (!posts.isEmpty()) {
|
||||
PostsPreferences.savePosts(posts);
|
||||
}
|
||||
|
||||
if (!groupIds.isEmpty()) {
|
||||
PostsPreferences.saveGroupsIds(groupIds);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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 <init>(Landroid/view/ViewGroup;)V
|
||||
.locals 3
|
||||
|
||||
const v0, 0x7f0d0307
|
||||
|
||||
.line 1
|
||||
invoke-direct {p0, v0, p1}, Lcom/vk/newsfeed/holders/BaseNewsEntryHolder;-><init>(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
|
||||
Reference in New Issue
Block a user