Skip to content

Commit

Permalink
feat(Tiktok - Feed filter): Add more filters (#445)
Browse files Browse the repository at this point in the history
Co-authored-by: oSumAtrIX <johan.melkonyan1@web.de>
  • Loading branch information
d4rkk3y and oSumAtrIX committed Aug 2, 2023
1 parent d2a8c33 commit c16c038
Show file tree
Hide file tree
Showing 28 changed files with 769 additions and 325 deletions.
Expand Up @@ -4,10 +4,10 @@

public class DownloadsPatch {
public static String getDownloadPath() {
return SettingsEnum.TIK_DOWN_PATH.getString();
return SettingsEnum.DOWNLOAD_PATH.getString();
}

public static boolean shouldRemoveWatermark() {
return SettingsEnum.TIK_DOWN_WATERMARK.getBoolean();
return SettingsEnum.DOWNLOAD_WATERMARK.getBoolean();
}
}
16 changes: 16 additions & 0 deletions app/src/main/java/app/revanced/tiktok/feedfilter/AdsFilter.java
@@ -0,0 +1,16 @@
package app.revanced.tiktok.feedfilter;

import app.revanced.tiktok.settings.SettingsEnum;
import com.ss.android.ugc.aweme.feed.model.Aweme;

public class AdsFilter implements IFilter {
@Override
public boolean getEnabled() {
return SettingsEnum.REMOVE_ADS.getBoolean();
}

@Override
public boolean getFiltered(Aweme item) {
return item.isAd() || item.isWithPromotionalMusic();
}
}
Expand Up @@ -6,33 +6,28 @@
import java.util.Iterator;
import java.util.List;

import app.revanced.tiktok.settings.SettingsEnum;

public class FeedItemsFilter {
public final class FeedItemsFilter {
private static final List<IFilter> FILTERS = List.of(
new AdsFilter(),
new LiveFilter(),
new StoryFilter(),
new ImageVideoFilter(),
new ViewCountFilter(),
new LikeCountFilter()
);

public static void filter(FeedItemList feedItemList) {
if (SettingsEnum.TIK_REMOVE_ADS.getBoolean()) removeAds(feedItemList);
if (SettingsEnum.TIK_HIDE_LIVE.getBoolean()) removeLive(feedItemList);
}

private static void removeAds(FeedItemList feedItemList) {
List<Aweme> items = feedItemList.items;
Iterator<Aweme> it = items.iterator();
while (it.hasNext()) {
Aweme item = it.next();
if (item != null && (item.isAd() || item.isWithPromotionalMusic())) {
it.remove();
}
}
}
Iterator<Aweme> feedItemListIterator = feedItemList.items.iterator();
while (feedItemListIterator.hasNext()) {
Aweme item = feedItemListIterator.next();
if (item == null) continue;

private static void removeLive(FeedItemList feedItemList) {
List<Aweme> items = feedItemList.items;
Iterator<Aweme> it = items.iterator();
while (it.hasNext()) {
Aweme item = it.next();
if (item != null && (item.isLive() || item.isLiveReplay())) {
it.remove();
for (IFilter filter : FILTERS) {
boolean enabled = filter.getEnabled();
if (enabled && filter.getFiltered(item)) {
feedItemListIterator.remove();
break;
}
}
}
}
Expand Down
9 changes: 9 additions & 0 deletions app/src/main/java/app/revanced/tiktok/feedfilter/IFilter.java
@@ -0,0 +1,9 @@
package app.revanced.tiktok.feedfilter;

import com.ss.android.ugc.aweme.feed.model.Aweme;

public interface IFilter {
boolean getEnabled();

boolean getFiltered(Aweme item);
}
@@ -0,0 +1,16 @@
package app.revanced.tiktok.feedfilter;

import app.revanced.tiktok.settings.SettingsEnum;
import com.ss.android.ugc.aweme.feed.model.Aweme;

public class ImageVideoFilter implements IFilter {
@Override
public boolean getEnabled() {
return SettingsEnum.HIDE_IMAGE.getBoolean();
}

@Override
public boolean getFiltered(Aweme item) {
return item.isImage() || item.isPhotoMode();
}
}
@@ -0,0 +1,32 @@
package app.revanced.tiktok.feedfilter;

import app.revanced.tiktok.settings.SettingsEnum;
import com.ss.android.ugc.aweme.feed.model.Aweme;
import com.ss.android.ugc.aweme.feed.model.AwemeStatistics;

import static app.revanced.tiktok.utils.ReVancedUtils.parseMinMax;

public final class LikeCountFilter implements IFilter {
final long minLike;
final long maxLike;

LikeCountFilter() {
long[] minMax = parseMinMax(SettingsEnum.MIN_MAX_LIKES);
minLike = minMax[0];
maxLike = minMax[1];
}

@Override
public boolean getEnabled() {
return true;
}

@Override
public boolean getFiltered(Aweme item) {
AwemeStatistics statistics = item.getStatistics();
if (statistics == null) return false;

long likeCount = statistics.getDiggCount();
return likeCount < minLike || likeCount > maxLike;
}
}
16 changes: 16 additions & 0 deletions app/src/main/java/app/revanced/tiktok/feedfilter/LiveFilter.java
@@ -0,0 +1,16 @@
package app.revanced.tiktok.feedfilter;

import app.revanced.tiktok.settings.SettingsEnum;
import com.ss.android.ugc.aweme.feed.model.Aweme;

public class LiveFilter implements IFilter {
@Override
public boolean getEnabled() {
return SettingsEnum.HIDE_LIVE.getBoolean();
}

@Override
public boolean getFiltered(Aweme item) {
return item.isLive() || item.isLiveReplay();
}
}
16 changes: 16 additions & 0 deletions app/src/main/java/app/revanced/tiktok/feedfilter/StoryFilter.java
@@ -0,0 +1,16 @@
package app.revanced.tiktok.feedfilter;

import app.revanced.tiktok.settings.SettingsEnum;
import com.ss.android.ugc.aweme.feed.model.Aweme;

public class StoryFilter implements IFilter {
@Override
public boolean getEnabled() {
return SettingsEnum.HIDE_STORY.getBoolean();
}

@Override
public boolean getFiltered(Aweme item) {
return item.getIsTikTokStory();
}
}
@@ -0,0 +1,32 @@
package app.revanced.tiktok.feedfilter;

import app.revanced.tiktok.settings.SettingsEnum;
import com.ss.android.ugc.aweme.feed.model.Aweme;
import com.ss.android.ugc.aweme.feed.model.AwemeStatistics;

import static app.revanced.tiktok.utils.ReVancedUtils.parseMinMax;

public class ViewCountFilter implements IFilter {
final long minView;
final long maxView;

ViewCountFilter() {
long[] minMax = parseMinMax(SettingsEnum.MIN_MAX_VIEWS);
minView = minMax[0];
maxView = minMax[1];
}

@Override
public boolean getEnabled() {
return true;
}

@Override
public boolean getFiltered(Aweme item) {
AwemeStatistics statistics = item.getStatistics();
if (statistics == null) return false;

long playCount = statistics.getPlayCount();
return playCount < minView || playCount > maxView;
}
}
68 changes: 44 additions & 24 deletions app/src/main/java/app/revanced/tiktok/settings/SettingsEnum.java
@@ -1,32 +1,42 @@
package app.revanced.tiktok.settings;

import static java.lang.Boolean.FALSE;
import static java.lang.Boolean.TRUE;
import static app.revanced.tiktok.settings.SettingsEnum.ReturnType.BOOLEAN;
import static app.revanced.tiktok.settings.SettingsEnum.ReturnType.STRING;

import android.content.Context;
import android.util.Log;

import androidx.annotation.NonNull;

import androidx.annotation.Nullable;
import app.revanced.tiktok.utils.LogHelper;
import app.revanced.tiktok.utils.ReVancedUtils;

import java.util.HashMap;
import java.util.Map;

import static app.revanced.tiktok.settings.SettingsEnum.ReturnType.BOOLEAN;
import static app.revanced.tiktok.settings.SettingsEnum.ReturnType.STRING;
import static java.lang.Boolean.FALSE;
import static java.lang.Boolean.TRUE;

public enum SettingsEnum {
//TikTok Settings
TIK_DEBUG("tik_debug", BOOLEAN, FALSE), // must be first value, otherwise logging during loading will not work
TIK_REMOVE_ADS("tik_remove_ads", BOOLEAN, TRUE, true),
TIK_HIDE_LIVE("tik_hide_live", BOOLEAN, FALSE, true),
TIK_DOWN_PATH("tik_down_path", STRING, "DCIM/TikTok"),
TIK_DOWN_WATERMARK("tik_down_watermark", BOOLEAN, TRUE),
TIK_SIMSPOOF("tik_simspoof", BOOLEAN, TRUE, true),
TIK_SIMSPOOF_ISO("tik_simspoof_iso", STRING, "us"),
TIK_SIMSPOOF_MCCMNC("tik_simspoof_mccmnc", STRING, "310160"),
TIK_SIMSPOOF_OP_NAME("tik_simspoof_op_name", STRING, "T-Mobile");
DEBUG("debug", BOOLEAN, FALSE), // Must be first value, otherwise logging during loading will not work.
REMOVE_ADS("remove_ads", BOOLEAN, TRUE, true),
HIDE_LIVE("hide_live", BOOLEAN, FALSE, true),
HIDE_STORY("hide_story", BOOLEAN, FALSE, true),
HIDE_IMAGE("hide_image", BOOLEAN, FALSE, true),
MIN_MAX_VIEWS("min_max_views", STRING, "0-" + Long.MAX_VALUE, true),
MIN_MAX_LIKES("min_max_likes", STRING, "0-" + Long.MAX_VALUE, true),
DOWNLOAD_PATH("down_path", STRING, "DCIM/TikTok"),
DOWNLOAD_WATERMARK("down_watermark", BOOLEAN, TRUE),
SIM_SPOOF("simspoof", BOOLEAN, TRUE, true),
SIM_SPOOF_ISO("simspoof_iso", STRING, "us"),
SIMSPOOF_MCCMNC("simspoof_mccmnc", STRING, "310160"),
SIMSPOOF_OP_NAME("simspoof_op_name", STRING, "T-Mobile");

private static final Map<String, SettingsEnum> pathToSetting = new HashMap<>(2 * values().length);

static {
loadAllSettings();
for (SettingsEnum setting : values()) {
pathToSetting.put(setting.path, setting);
}
}

@NonNull
Expand All @@ -47,18 +57,24 @@ public enum SettingsEnum {
SettingsEnum(String path, ReturnType returnType, Object defaultValue) {
this(path, returnType, defaultValue, SharedPrefCategory.TIKTOK_PREFS, false);
}

SettingsEnum(String path, ReturnType returnType, Object defaultValue, boolean rebootApp) {
this(path, returnType, defaultValue, SharedPrefCategory.TIKTOK_PREFS, rebootApp);
}
SettingsEnum(@NonNull String path, @NonNull ReturnType returnType, @NonNull Object defaultValue,
@NonNull SharedPrefCategory prefName, boolean rebootApp) {

SettingsEnum(@NonNull String path, @NonNull ReturnType returnType, @NonNull Object defaultValue, @NonNull SharedPrefCategory prefName, boolean rebootApp) {
this.path = path;
this.returnType = returnType;
this.defaultValue = defaultValue;
this.sharedPref = prefName;
this.rebootApp = rebootApp;
}

@Nullable
public static SettingsEnum getSettingsFromPath(@NonNull String str) {
return pathToSetting.get(str);
}

private static void loadAllSettings() {
try {
Context context = ReVancedUtils.getAppContext();
Expand Down Expand Up @@ -144,11 +160,15 @@ public String getString() {
return (String) value;
}

/**
* @return the value of this setting as as generic object type.
*/
@NonNull
public Object getObjectValue() {
return value;
}

public enum ReturnType {
BOOLEAN,
INTEGER,
LONG,
FLOAT,
STRING,
BOOLEAN, INTEGER, LONG, FLOAT, STRING,
}
}

0 comments on commit c16c038

Please sign in to comment.