mirror of
https://github.com/ReVanced/revanced-patches.git
synced 2026-01-27 12:41:03 +00:00
feat: Update to patcher v22
This commit is contained in:
@@ -0,0 +1,57 @@
|
||||
package app.revanced.extension.shared;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
public enum ResourceType {
|
||||
ANIM("anim"),
|
||||
ANIMATOR("animator"),
|
||||
ARRAY("array"),
|
||||
ATTR("attr"),
|
||||
BOOL("bool"),
|
||||
COLOR("color"),
|
||||
DIMEN("dimen"),
|
||||
DRAWABLE("drawable"),
|
||||
FONT("font"),
|
||||
FRACTION("fraction"),
|
||||
ID("id"),
|
||||
INTEGER("integer"),
|
||||
INTERPOLATOR("interpolator"),
|
||||
LAYOUT("layout"),
|
||||
MENU("menu"),
|
||||
MIPMAP("mipmap"),
|
||||
NAVIGATION("navigation"),
|
||||
PLURALS("plurals"),
|
||||
RAW("raw"),
|
||||
STRING("string"),
|
||||
STYLE("style"),
|
||||
STYLEABLE("styleable"),
|
||||
TRANSITION("transition"),
|
||||
VALUES("values"),
|
||||
XML("xml");
|
||||
|
||||
private static final Map<String, ResourceType> VALUE_MAP;
|
||||
|
||||
static {
|
||||
ResourceType[] values = values();
|
||||
VALUE_MAP = new HashMap<>(2 * values.length);
|
||||
|
||||
for (ResourceType type : values) {
|
||||
VALUE_MAP.put(type.value, type);
|
||||
}
|
||||
}
|
||||
|
||||
public final String value;
|
||||
|
||||
public static ResourceType fromValue(String value) {
|
||||
ResourceType type = VALUE_MAP.get(value);
|
||||
if (type == null) {
|
||||
throw new IllegalArgumentException("Unknown resource type: " + value);
|
||||
}
|
||||
return type;
|
||||
}
|
||||
|
||||
ResourceType(String value) {
|
||||
this.value = value;
|
||||
}
|
||||
}
|
||||
@@ -54,8 +54,10 @@ import androidx.annotation.Nullable;
|
||||
import java.text.Bidi;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
import java.util.concurrent.Callable;
|
||||
import java.util.concurrent.Future;
|
||||
@@ -148,12 +150,12 @@ public class Utils {
|
||||
/**
|
||||
* Hide a view by setting its layout height and width to 1dp.
|
||||
*
|
||||
* @param condition The setting to check for hiding the view.
|
||||
* @param setting The setting to check for hiding the view.
|
||||
* @param view The view to hide.
|
||||
*/
|
||||
public static void hideViewBy0dpUnderCondition(BooleanSetting condition, View view) {
|
||||
if (hideViewBy0dpUnderCondition(condition.get(), view)) {
|
||||
Logger.printDebug(() -> "View hidden by setting: " + condition);
|
||||
public static void hideViewBy0dpUnderCondition(BooleanSetting setting, View view) {
|
||||
if (hideViewBy0dpUnderCondition(setting.get(), view)) {
|
||||
Logger.printDebug(() -> "View hidden by setting: " + setting);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -165,22 +167,47 @@ public class Utils {
|
||||
*/
|
||||
public static boolean hideViewBy0dpUnderCondition(boolean condition, View view) {
|
||||
if (condition) {
|
||||
hideViewByLayoutParams(view);
|
||||
hideViewBy0dp(view);
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Hide a view by setting its layout params to 0x0
|
||||
* @param view The view to hide.
|
||||
*/
|
||||
public static void hideViewBy0dp(View view) {
|
||||
if (view instanceof LinearLayout) {
|
||||
LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(0, 0);
|
||||
view.setLayoutParams(layoutParams);
|
||||
} else if (view instanceof FrameLayout) {
|
||||
FrameLayout.LayoutParams layoutParams2 = new FrameLayout.LayoutParams(0, 0);
|
||||
view.setLayoutParams(layoutParams2);
|
||||
} else if (view instanceof RelativeLayout) {
|
||||
RelativeLayout.LayoutParams layoutParams3 = new RelativeLayout.LayoutParams(0, 0);
|
||||
view.setLayoutParams(layoutParams3);
|
||||
} else if (view instanceof Toolbar) {
|
||||
Toolbar.LayoutParams layoutParams4 = new Toolbar.LayoutParams(0, 0);
|
||||
view.setLayoutParams(layoutParams4);
|
||||
} else {
|
||||
ViewGroup.LayoutParams params = view.getLayoutParams();
|
||||
params.width = 0;
|
||||
params.height = 0;
|
||||
view.setLayoutParams(params);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Hide a view by setting its visibility to GONE.
|
||||
*
|
||||
* @param condition The setting to check for hiding the view.
|
||||
* @param setting The setting to check for hiding the view.
|
||||
* @param view The view to hide.
|
||||
*/
|
||||
public static void hideViewUnderCondition(BooleanSetting condition, View view) {
|
||||
if (hideViewUnderCondition(condition.get(), view)) {
|
||||
Logger.printDebug(() -> "View hidden by setting: " + condition);
|
||||
public static void hideViewUnderCondition(BooleanSetting setting, View view) {
|
||||
if (hideViewUnderCondition(setting.get(), view)) {
|
||||
Logger.printDebug(() -> "View hidden by setting: " + setting);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -199,14 +226,14 @@ public class Utils {
|
||||
return false;
|
||||
}
|
||||
|
||||
public static void hideViewByRemovingFromParentUnderCondition(BooleanSetting condition, View view) {
|
||||
if (hideViewByRemovingFromParentUnderCondition(condition.get(), view)) {
|
||||
Logger.printDebug(() -> "View hidden by setting: " + condition);
|
||||
public static void hideViewByRemovingFromParentUnderCondition(BooleanSetting setting, View view) {
|
||||
if (hideViewByRemovingFromParentUnderCondition(setting.get(), view)) {
|
||||
Logger.printDebug(() -> "View hidden by setting: " + setting);
|
||||
}
|
||||
}
|
||||
|
||||
public static boolean hideViewByRemovingFromParentUnderCondition(boolean setting, View view) {
|
||||
if (setting) {
|
||||
public static boolean hideViewByRemovingFromParentUnderCondition(boolean condition, View view) {
|
||||
if (condition) {
|
||||
ViewParent parent = view.getParent();
|
||||
if (parent instanceof ViewGroup parentGroup) {
|
||||
parentGroup.removeView(view);
|
||||
@@ -277,42 +304,42 @@ public class Utils {
|
||||
/**
|
||||
* @return zero, if the resource is not found.
|
||||
*/
|
||||
@SuppressLint("DiscouragedApi")
|
||||
public static int getResourceIdentifier(Context context, String resourceIdentifierName, String type) {
|
||||
return context.getResources().getIdentifier(resourceIdentifierName, type, context.getPackageName());
|
||||
public static int getResourceIdentifier(ResourceType type, String resourceIdentifierName) {
|
||||
return getResourceIdentifier(getContext(), type, resourceIdentifierName);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return zero, if the resource is not found.
|
||||
*/
|
||||
public static int getResourceIdentifier(String resourceIdentifierName, String type) {
|
||||
return getResourceIdentifier(getContext(), resourceIdentifierName, type);
|
||||
@SuppressLint("DiscouragedApi")
|
||||
public static int getResourceIdentifier(Context context, ResourceType type, String resourceIdentifierName) {
|
||||
return context.getResources().getIdentifier(resourceIdentifierName, type.value, context.getPackageName());
|
||||
}
|
||||
|
||||
public static int getResourceInteger(String resourceIdentifierName) throws Resources.NotFoundException {
|
||||
return getContext().getResources().getInteger(getResourceIdentifier(resourceIdentifierName, "integer"));
|
||||
return getContext().getResources().getInteger(getResourceIdentifier(ResourceType.INTEGER, resourceIdentifierName));
|
||||
}
|
||||
|
||||
public static Animation getResourceAnimation(String resourceIdentifierName) throws Resources.NotFoundException {
|
||||
return AnimationUtils.loadAnimation(getContext(), getResourceIdentifier(resourceIdentifierName, "anim"));
|
||||
return AnimationUtils.loadAnimation(getContext(), getResourceIdentifier(ResourceType.ANIM, resourceIdentifierName));
|
||||
}
|
||||
|
||||
@ColorInt
|
||||
public static int getResourceColor(String resourceIdentifierName) throws Resources.NotFoundException {
|
||||
//noinspection deprecation
|
||||
return getContext().getResources().getColor(getResourceIdentifier(resourceIdentifierName, "color"));
|
||||
return getContext().getResources().getColor(getResourceIdentifier(ResourceType.COLOR, resourceIdentifierName));
|
||||
}
|
||||
|
||||
public static int getResourceDimensionPixelSize(String resourceIdentifierName) throws Resources.NotFoundException {
|
||||
return getContext().getResources().getDimensionPixelSize(getResourceIdentifier(resourceIdentifierName, "dimen"));
|
||||
return getContext().getResources().getDimensionPixelSize(getResourceIdentifier(ResourceType.DIMEN, resourceIdentifierName));
|
||||
}
|
||||
|
||||
public static float getResourceDimension(String resourceIdentifierName) throws Resources.NotFoundException {
|
||||
return getContext().getResources().getDimension(getResourceIdentifier(resourceIdentifierName, "dimen"));
|
||||
return getContext().getResources().getDimension(getResourceIdentifier(ResourceType.DIMEN, resourceIdentifierName));
|
||||
}
|
||||
|
||||
public static String[] getResourceStringArray(String resourceIdentifierName) throws Resources.NotFoundException {
|
||||
return getContext().getResources().getStringArray(getResourceIdentifier(resourceIdentifierName, "array"));
|
||||
return getContext().getResources().getStringArray(getResourceIdentifier(ResourceType.ARRAY, resourceIdentifierName));
|
||||
}
|
||||
|
||||
public interface MatchFilter<T> {
|
||||
@@ -323,7 +350,7 @@ public class Utils {
|
||||
* Includes sub children.
|
||||
*/
|
||||
public static <R extends View> R getChildViewByResourceName(View view, String str) {
|
||||
var child = view.findViewById(Utils.getResourceIdentifier(str, "id"));
|
||||
var child = view.findViewById(Utils.getResourceIdentifier(ResourceType.ID, str));
|
||||
if (child != null) {
|
||||
//noinspection unchecked
|
||||
return (R) child;
|
||||
@@ -718,34 +745,6 @@ public class Utils {
|
||||
|| (type == ConnectivityManager.TYPE_BLUETOOTH) ? NetworkType.MOBILE : NetworkType.OTHER;
|
||||
}
|
||||
|
||||
/**
|
||||
* Hide a view by setting its layout params to 0x0
|
||||
* @param view The view to hide.
|
||||
*/
|
||||
public static void hideViewByLayoutParams(View view) {
|
||||
if (view instanceof LinearLayout) {
|
||||
LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(0, 0);
|
||||
view.setLayoutParams(layoutParams);
|
||||
} else if (view instanceof FrameLayout) {
|
||||
FrameLayout.LayoutParams layoutParams2 = new FrameLayout.LayoutParams(0, 0);
|
||||
view.setLayoutParams(layoutParams2);
|
||||
} else if (view instanceof RelativeLayout) {
|
||||
RelativeLayout.LayoutParams layoutParams3 = new RelativeLayout.LayoutParams(0, 0);
|
||||
view.setLayoutParams(layoutParams3);
|
||||
} else if (view instanceof Toolbar) {
|
||||
Toolbar.LayoutParams layoutParams4 = new Toolbar.LayoutParams(0, 0);
|
||||
view.setLayoutParams(layoutParams4);
|
||||
} else if (view instanceof ViewGroup) {
|
||||
ViewGroup.LayoutParams layoutParams5 = new ViewGroup.LayoutParams(0, 0);
|
||||
view.setLayoutParams(layoutParams5);
|
||||
} else {
|
||||
ViewGroup.LayoutParams params = view.getLayoutParams();
|
||||
params.width = 0;
|
||||
params.height = 0;
|
||||
view.setLayoutParams(params);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a custom dialog with a styled layout, including a title, message, buttons, and an
|
||||
* optional EditText. The dialog's appearance adapts to the app's dark mode setting, with
|
||||
@@ -1517,4 +1516,18 @@ public class Utils {
|
||||
public static float clamp(float value, float lower, float upper) {
|
||||
return Math.max(lower, Math.min(value, upper));
|
||||
}
|
||||
|
||||
/**
|
||||
* @param maxSize The maximum number of elements to keep in the map.
|
||||
* @return A {@link LinkedHashMap} that automatically evicts the oldest entry
|
||||
* when the size exceeds {@code maxSize}.
|
||||
*/
|
||||
public static <T, V> Map<T, V> createSizeRestrictedMap(int maxSize) {
|
||||
return new LinkedHashMap<>(2 * maxSize) {
|
||||
@Override
|
||||
protected boolean removeEldestEntry(Entry eldest) {
|
||||
return size() > maxSize;
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,7 +3,6 @@ package app.revanced.extension.shared.checks;
|
||||
import static android.text.Html.FROM_HTML_MODE_COMPACT;
|
||||
import static app.revanced.extension.shared.StringRef.str;
|
||||
import static app.revanced.extension.shared.Utils.DialogFragmentOnStartAction;
|
||||
import static app.revanced.extension.shared.Utils.dipToPixels;
|
||||
|
||||
import android.annotation.SuppressLint;
|
||||
import android.app.Activity;
|
||||
@@ -24,6 +23,7 @@ import androidx.annotation.Nullable;
|
||||
import java.util.Collection;
|
||||
|
||||
import app.revanced.extension.shared.Logger;
|
||||
import app.revanced.extension.shared.ResourceType;
|
||||
import app.revanced.extension.shared.Utils;
|
||||
import app.revanced.extension.shared.settings.BaseSettings;
|
||||
|
||||
@@ -127,7 +127,8 @@ abstract class Check {
|
||||
|
||||
// Add icon to the dialog.
|
||||
ImageView iconView = new ImageView(activity);
|
||||
iconView.setImageResource(Utils.getResourceIdentifier("revanced_ic_dialog_alert", "drawable"));
|
||||
iconView.setImageResource(Utils.getResourceIdentifier(
|
||||
ResourceType.DRAWABLE, "revanced_ic_dialog_alert"));
|
||||
iconView.setColorFilter(Utils.getAppForegroundColor(), PorterDuff.Mode.SRC_IN);
|
||||
iconView.setPadding(0, 0, 0, 0);
|
||||
LinearLayout.LayoutParams iconParams = new LinearLayout.LayoutParams(
|
||||
|
||||
@@ -15,7 +15,6 @@ import okhttp3.Request;
|
||||
import okhttp3.Response;
|
||||
import okhttp3.ResponseBody;
|
||||
|
||||
|
||||
public abstract class BaseFixRedgifsApiPatch implements Interceptor {
|
||||
protected static BaseFixRedgifsApiPatch INSTANCE;
|
||||
public abstract String getDefaultUserAgent();
|
||||
|
||||
@@ -23,6 +23,7 @@ import androidx.annotation.Nullable;
|
||||
import java.util.Objects;
|
||||
|
||||
import app.revanced.extension.shared.Logger;
|
||||
import app.revanced.extension.shared.ResourceType;
|
||||
import app.revanced.extension.shared.Utils;
|
||||
import app.revanced.extension.shared.settings.BaseSettings;
|
||||
import app.revanced.extension.shared.settings.BooleanSetting;
|
||||
@@ -105,7 +106,7 @@ public abstract class AbstractPreferenceFragment extends PreferenceFragment {
|
||||
String preferenceResourceName = BaseSettings.SHOW_MENU_ICONS.get()
|
||||
? "revanced_prefs_icons"
|
||||
: "revanced_prefs";
|
||||
final var identifier = Utils.getResourceIdentifier(preferenceResourceName, "xml");
|
||||
final var identifier = Utils.getResourceIdentifier(ResourceType.XML, preferenceResourceName);
|
||||
if (identifier == 0) return;
|
||||
addPreferencesFromResource(identifier);
|
||||
|
||||
|
||||
@@ -32,6 +32,7 @@ import java.util.Locale;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
import app.revanced.extension.shared.Logger;
|
||||
import app.revanced.extension.shared.ResourceType;
|
||||
import app.revanced.extension.shared.Utils;
|
||||
import app.revanced.extension.shared.settings.Setting;
|
||||
import app.revanced.extension.shared.settings.StringSetting;
|
||||
@@ -171,7 +172,8 @@ public class ColorPickerPreference extends EditTextPreference {
|
||||
}
|
||||
|
||||
// Set the widget layout to a custom layout containing the colored dot.
|
||||
setWidgetLayoutResource(getResourceIdentifier("revanced_color_dot_widget", "layout"));
|
||||
setWidgetLayoutResource(getResourceIdentifier(
|
||||
ResourceType.LAYOUT, "revanced_color_dot_widget"));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -208,9 +210,11 @@ public class ColorPickerPreference extends EditTextPreference {
|
||||
super.onBindView(view);
|
||||
|
||||
widgetColorDot = view.findViewById(getResourceIdentifier(
|
||||
"revanced_color_dot_widget", "id"));
|
||||
ResourceType.ID,
|
||||
"revanced_color_dot_widget"));
|
||||
widgetColorDot.setBackgroundResource(getResourceIdentifier(
|
||||
"revanced_settings_circle_background", "drawable"));
|
||||
ResourceType.DRAWABLE,
|
||||
"revanced_settings_circle_background"));
|
||||
widgetColorDot.getBackground().setTint(currentColor | 0xFF000000);
|
||||
widgetColorDot.setAlpha(isEnabled() ? 1.0f : DISABLED_ALPHA);
|
||||
}
|
||||
@@ -286,10 +290,10 @@ public class ColorPickerPreference extends EditTextPreference {
|
||||
Context context = getContext();
|
||||
|
||||
// Inflate color picker view.
|
||||
View colorPicker = LayoutInflater.from(context).inflate(
|
||||
getResourceIdentifier("revanced_color_picker", "layout"), null);
|
||||
dialogColorPickerView = colorPicker.findViewById(
|
||||
getResourceIdentifier("revanced_color_picker_view", "id"));
|
||||
View colorPicker = LayoutInflater.from(context).inflate(getResourceIdentifier(
|
||||
ResourceType.LAYOUT, "revanced_color_picker"), null);
|
||||
dialogColorPickerView = colorPicker.findViewById(getResourceIdentifier(
|
||||
ResourceType.ID, "revanced_color_picker_view"));
|
||||
dialogColorPickerView.setColor(currentColor);
|
||||
|
||||
// Horizontal layout for preview and EditText.
|
||||
|
||||
@@ -13,6 +13,7 @@ import android.widget.*;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
|
||||
import app.revanced.extension.shared.ResourceType;
|
||||
import app.revanced.extension.shared.Utils;
|
||||
|
||||
/**
|
||||
@@ -54,11 +55,14 @@ public class CustomDialogListPreference extends ListPreference {
|
||||
view = inflater.inflate(layoutResourceId, parent, false);
|
||||
holder = new SubViewDataContainer();
|
||||
holder.checkIcon = view.findViewById(Utils.getResourceIdentifier(
|
||||
"revanced_check_icon", "id"));
|
||||
ResourceType.ID,
|
||||
"revanced_check_icon"));
|
||||
holder.placeholder = view.findViewById(Utils.getResourceIdentifier(
|
||||
"revanced_check_icon_placeholder", "id"));
|
||||
ResourceType.ID,
|
||||
"revanced_check_icon_placeholder"));
|
||||
holder.itemText = view.findViewById(Utils.getResourceIdentifier(
|
||||
"revanced_item_text", "id"));
|
||||
ResourceType.ID,
|
||||
"revanced_item_text"));
|
||||
view.setTag(holder);
|
||||
} else {
|
||||
holder = (SubViewDataContainer) view.getTag();
|
||||
@@ -111,7 +115,7 @@ public class CustomDialogListPreference extends ListPreference {
|
||||
// Create custom adapter for the ListView.
|
||||
ListPreferenceArrayAdapter adapter = new ListPreferenceArrayAdapter(
|
||||
context,
|
||||
Utils.getResourceIdentifier("revanced_custom_list_item_checked", "layout"),
|
||||
Utils.getResourceIdentifier(ResourceType.LAYOUT, "revanced_custom_list_item_checked"),
|
||||
getEntries(),
|
||||
getEntryValues(),
|
||||
getValue()
|
||||
|
||||
@@ -13,7 +13,9 @@ import java.net.HttpURLConnection;
|
||||
import java.net.SocketTimeoutException;
|
||||
import java.nio.ByteBuffer;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.util.*;
|
||||
import java.util.Collections;
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
import java.util.concurrent.ExecutionException;
|
||||
import java.util.concurrent.Future;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
@@ -70,22 +72,15 @@ public class StreamingDataRequest {
|
||||
*/
|
||||
private static final int MAX_MILLISECONDS_TO_WAIT_FOR_FETCH = 20 * 1000;
|
||||
|
||||
/**
|
||||
* Cache limit must be greater than the maximum number of videos open at once,
|
||||
* which theoretically is more than 4 (3 Shorts + one regular minimized video).
|
||||
* But instead use a much larger value, to handle if a video viewed a while ago
|
||||
* is somehow still referenced. Each stream is a small array of Strings
|
||||
* so memory usage is not a concern.
|
||||
*/
|
||||
private static final Map<String, StreamingDataRequest> cache = Collections.synchronizedMap(
|
||||
new LinkedHashMap<>(100) {
|
||||
/**
|
||||
* Cache limit must be greater than the maximum number of videos open at once,
|
||||
* which theoretically is more than 4 (3 Shorts + one regular minimized video).
|
||||
* But instead use a much larger value, to handle if a video viewed a while ago
|
||||
* is somehow still referenced. Each stream is a small array of Strings
|
||||
* so memory usage is not a concern.
|
||||
*/
|
||||
private static final int CACHE_LIMIT = 50;
|
||||
|
||||
@Override
|
||||
protected boolean removeEldestEntry(Entry eldest) {
|
||||
return size() > CACHE_LIMIT; // Evict the oldest entry if over the cache limit.
|
||||
}
|
||||
});
|
||||
Utils.createSizeRestrictedMap(50));
|
||||
|
||||
private static volatile ClientType lastSpoofedClientType;
|
||||
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
package app.revanced.extension.spotify.layout.hide.createbutton;
|
||||
|
||||
import app.revanced.extension.shared.Logger;
|
||||
import app.revanced.extension.shared.ResourceType;
|
||||
import app.revanced.extension.spotify.shared.ComponentFilters.ComponentFilter;
|
||||
import app.revanced.extension.spotify.shared.ComponentFilters.ResourceIdComponentFilter;
|
||||
import app.revanced.extension.spotify.shared.ComponentFilters.StringComponentFilter;
|
||||
@@ -15,7 +16,7 @@ public final class HideCreateButtonPatch {
|
||||
* The main approach used is matching the resource id for the Create button title.
|
||||
*/
|
||||
private static final List<ComponentFilter> CREATE_BUTTON_COMPONENT_FILTERS = List.of(
|
||||
new ResourceIdComponentFilter("navigationbar_musicappitems_create_title", "string"),
|
||||
new ResourceIdComponentFilter(ResourceType.STRING, "navigationbar_musicappitems_create_title"),
|
||||
// Temporary fallback and fix for APKs merged with AntiSplit-M not having resources properly encoded,
|
||||
// and thus getting the resource identifier for the Create button title always return 0.
|
||||
// FIXME: Remove this once the above issue is no longer relevant.
|
||||
@@ -27,7 +28,7 @@ public final class HideCreateButtonPatch {
|
||||
* Used in older versions of the app.
|
||||
*/
|
||||
private static final ResourceIdComponentFilter OLD_CREATE_BUTTON_COMPONENT_FILTER =
|
||||
new ResourceIdComponentFilter("bottom_navigation_bar_create_tab_title", "string");
|
||||
new ResourceIdComponentFilter(ResourceType.STRING, "bottom_navigation_bar_create_tab_title");
|
||||
|
||||
/**
|
||||
* Injection point. This method is called on every navigation bar item to check whether it is the Create button.
|
||||
|
||||
@@ -3,6 +3,7 @@ package app.revanced.extension.spotify.shared;
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import app.revanced.extension.shared.Logger;
|
||||
import app.revanced.extension.shared.ResourceType;
|
||||
import app.revanced.extension.shared.Utils;
|
||||
|
||||
public final class ComponentFilters {
|
||||
@@ -19,21 +20,26 @@ public final class ComponentFilters {
|
||||
public static final class ResourceIdComponentFilter implements ComponentFilter {
|
||||
|
||||
public final String resourceName;
|
||||
public final String resourceType;
|
||||
public final ResourceType resourceType;
|
||||
// Android resources are always positive, so -1 is a valid sentinel value to indicate it has not been loaded.
|
||||
// 0 is returned when a resource has not been found.
|
||||
private int resourceId = -1;
|
||||
@Nullable
|
||||
private String stringfiedResourceId;
|
||||
|
||||
@Deprecated
|
||||
public ResourceIdComponentFilter(String resourceName, String resourceType) {
|
||||
this(ResourceType.valueOf(resourceType), resourceName);
|
||||
}
|
||||
|
||||
public ResourceIdComponentFilter(ResourceType resourceType, String resourceName) {
|
||||
this.resourceName = resourceName;
|
||||
this.resourceType = resourceType;
|
||||
}
|
||||
|
||||
public int getResourceId() {
|
||||
if (resourceId == -1) {
|
||||
resourceId = Utils.getResourceIdentifier(resourceName, resourceType);
|
||||
resourceId = Utils.getResourceIdentifier(resourceType, resourceName);
|
||||
}
|
||||
return resourceId;
|
||||
}
|
||||
|
||||
@@ -1,14 +1,18 @@
|
||||
package app.revanced.extension.twitch;
|
||||
|
||||
import app.revanced.extension.shared.ResourceType;
|
||||
|
||||
public class Utils {
|
||||
|
||||
/* Called from SettingsPatch smali */
|
||||
public static int getStringId(String name) {
|
||||
return app.revanced.extension.shared.Utils.getResourceIdentifier(name, "string");
|
||||
return app.revanced.extension.shared.Utils.getResourceIdentifier(
|
||||
ResourceType.STRING, name);
|
||||
}
|
||||
|
||||
/* Called from SettingsPatch smali */
|
||||
public static int getDrawableId(String name) {
|
||||
return app.revanced.extension.shared.Utils.getResourceIdentifier(name, "drawable");
|
||||
return app.revanced.extension.shared.Utils.getResourceIdentifier(
|
||||
ResourceType.DRAWABLE, name);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,16 +2,19 @@ package app.revanced.extension.twitch.settings;
|
||||
|
||||
import android.content.Intent;
|
||||
import android.os.Bundle;
|
||||
|
||||
import androidx.appcompat.app.ActionBar;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import app.revanced.extension.shared.Logger;
|
||||
import app.revanced.extension.shared.ResourceType;
|
||||
import app.revanced.extension.shared.Utils;
|
||||
import app.revanced.extension.twitch.settings.preference.ReVancedPreferenceFragment;
|
||||
import tv.twitch.android.feature.settings.menu.SettingsMenuGroup;
|
||||
import tv.twitch.android.settings.SettingsActivity;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Hooks AppCompatActivity.
|
||||
* <p>
|
||||
@@ -105,7 +108,7 @@ public class AppCompatActivityHook {
|
||||
|
||||
base.getFragmentManager()
|
||||
.beginTransaction()
|
||||
.replace(Utils.getResourceIdentifier("fragment_container", "id"), fragment)
|
||||
.replace(Utils.getResourceIdentifier(ResourceType.ID, "fragment_container"), fragment)
|
||||
.commit();
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -18,7 +18,6 @@ import java.io.IOException;
|
||||
import java.net.HttpURLConnection;
|
||||
import java.net.URL;
|
||||
import java.util.HashMap;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.ExecutionException;
|
||||
|
||||
@@ -505,14 +504,8 @@ public final class AlternativeThumbnailsPatch {
|
||||
* Cache used to verify if an alternative thumbnails exists for a given video id.
|
||||
*/
|
||||
@GuardedBy("itself")
|
||||
private static final Map<String, VerifiedQualities> altVideoIdLookup = new LinkedHashMap<>(100) {
|
||||
private static final int CACHE_LIMIT = 1000;
|
||||
|
||||
@Override
|
||||
protected boolean removeEldestEntry(Entry eldest) {
|
||||
return size() > CACHE_LIMIT; // Evict the oldest entry if over the cache limit.
|
||||
}
|
||||
};
|
||||
private static final Map<String, VerifiedQualities> altVideoIdLookup =
|
||||
Utils.createSizeRestrictedMap(1000);
|
||||
|
||||
private static VerifiedQualities getVerifiedQualities(@NonNull String videoId, boolean returnNullIfDoesNotExist) {
|
||||
synchronized (altVideoIdLookup) {
|
||||
|
||||
@@ -7,6 +7,7 @@ import androidx.annotation.Nullable;
|
||||
import java.util.Objects;
|
||||
|
||||
import app.revanced.extension.shared.Logger;
|
||||
import app.revanced.extension.shared.ResourceType;
|
||||
import app.revanced.extension.shared.Utils;
|
||||
import app.revanced.extension.youtube.settings.Settings;
|
||||
|
||||
@@ -40,7 +41,7 @@ public class ChangeHeaderPatch {
|
||||
return null;
|
||||
}
|
||||
|
||||
final int identifier = Utils.getResourceIdentifier(attributeName, "attr");
|
||||
final int identifier = Utils.getResourceIdentifier(ResourceType.ATTR, attributeName);
|
||||
if (identifier == 0) {
|
||||
// Identifier is zero if custom header setting was included in imported settings
|
||||
// and a custom image was not included during patching.
|
||||
@@ -62,7 +63,7 @@ public class ChangeHeaderPatch {
|
||||
? "_dark"
|
||||
: "_light");
|
||||
|
||||
final int identifier = Utils.getResourceIdentifier(drawableFullName, "drawable");
|
||||
final int identifier = Utils.getResourceIdentifier(ResourceType.DRAWABLE, drawableFullName);
|
||||
if (identifier == 0) {
|
||||
Logger.printDebug(() -> "Could not find drawable: " + drawableFullName);
|
||||
Settings.HEADER_LOGO.resetToDefault();
|
||||
|
||||
@@ -21,7 +21,7 @@ public final class DownloadsPatch {
|
||||
/**
|
||||
* Injection point.
|
||||
*/
|
||||
public static void activityCreated(Activity mainActivity) {
|
||||
public static void setMainActivity(Activity mainActivity) {
|
||||
activityRef = new WeakReference<>(mainActivity);
|
||||
}
|
||||
|
||||
|
||||
@@ -5,6 +5,7 @@ import android.view.ViewGroup;
|
||||
import android.widget.ImageView;
|
||||
|
||||
import app.revanced.extension.shared.Logger;
|
||||
import app.revanced.extension.shared.ResourceType;
|
||||
import app.revanced.extension.shared.Utils;
|
||||
import app.revanced.extension.youtube.settings.Settings;
|
||||
|
||||
@@ -27,6 +28,15 @@ public final class HidePlayerOverlayButtonsPatch {
|
||||
return Settings.HIDE_CAST_BUTTON.get() ? View.GONE : original;
|
||||
}
|
||||
|
||||
/**
|
||||
* Injection point.
|
||||
*/
|
||||
public static boolean getCastButtonOverrideV2(boolean original) {
|
||||
if (Settings.HIDE_CAST_BUTTON.get()) return false;
|
||||
|
||||
return original;
|
||||
}
|
||||
|
||||
/**
|
||||
* Injection point.
|
||||
*/
|
||||
@@ -38,10 +48,10 @@ public final class HidePlayerOverlayButtonsPatch {
|
||||
= Settings.HIDE_PLAYER_PREVIOUS_NEXT_BUTTONS.get();
|
||||
|
||||
private static final int PLAYER_CONTROL_PREVIOUS_BUTTON_TOUCH_AREA_ID =
|
||||
Utils.getResourceIdentifier("player_control_previous_button_touch_area", "id");
|
||||
Utils.getResourceIdentifier(ResourceType.ID, "player_control_previous_button_touch_area");
|
||||
|
||||
private static final int PLAYER_CONTROL_NEXT_BUTTON_TOUCH_AREA_ID =
|
||||
Utils.getResourceIdentifier("player_control_next_button_touch_area", "id");
|
||||
Utils.getResourceIdentifier(ResourceType.ID, "player_control_next_button_touch_area");
|
||||
|
||||
/**
|
||||
* Injection point.
|
||||
|
||||
@@ -4,7 +4,17 @@ import app.revanced.extension.youtube.settings.Settings;
|
||||
|
||||
@SuppressWarnings("unused")
|
||||
public class HideSeekbarPatch {
|
||||
/**
|
||||
* Injection point.
|
||||
*/
|
||||
public static boolean hideSeekbar() {
|
||||
return Settings.HIDE_SEEKBAR.get();
|
||||
}
|
||||
|
||||
/**
|
||||
* Injection point.
|
||||
*/
|
||||
public static boolean useFullscreenLargeSeekbar(boolean original) {
|
||||
return Settings.FULLSCREEN_LARGE_SEEKBAR.get();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,6 +13,7 @@ import android.widget.TextView;
|
||||
import androidx.annotation.Nullable;
|
||||
|
||||
import app.revanced.extension.shared.Logger;
|
||||
import app.revanced.extension.shared.ResourceType;
|
||||
import app.revanced.extension.shared.Utils;
|
||||
import app.revanced.extension.shared.settings.Setting;
|
||||
import app.revanced.extension.youtube.settings.Settings;
|
||||
@@ -113,7 +114,7 @@ public final class MiniplayerPatch {
|
||||
* Resource is not present in older targets, and this field will be zero.
|
||||
*/
|
||||
private static final int MODERN_OVERLAY_SUBTITLE_TEXT
|
||||
= Utils.getResourceIdentifier("modern_miniplayer_subtitle_text", "id");
|
||||
= Utils.getResourceIdentifier(ResourceType.ID, "modern_miniplayer_subtitle_text");
|
||||
|
||||
private static final MiniplayerType CURRENT_TYPE = Settings.MINIPLAYER_TYPE.get();
|
||||
|
||||
|
||||
@@ -62,6 +62,13 @@ public final class NavigationButtonsPatch {
|
||||
hideViewUnderCondition(Settings.HIDE_NAVIGATION_BUTTON_LABELS, navigationLabelsView);
|
||||
}
|
||||
|
||||
/**
|
||||
* Injection point.
|
||||
*/
|
||||
public static boolean useAnimatedNavigationButtons(boolean original) {
|
||||
return Settings.NAVIGATION_BAR_ANIMATIONS.get();
|
||||
}
|
||||
|
||||
/**
|
||||
* Injection point.
|
||||
*/
|
||||
|
||||
@@ -20,15 +20,6 @@ public class OpenShortsInRegularPlayerPatch {
|
||||
REGULAR_PLAYER_FULLSCREEN
|
||||
}
|
||||
|
||||
static {
|
||||
if (!VersionCheckPatch.IS_19_46_OR_GREATER
|
||||
&& Settings.SHORTS_PLAYER_TYPE.get() == ShortsPlayerType.REGULAR_PLAYER_FULLSCREEN) {
|
||||
// User imported newer settings to an older app target.
|
||||
Logger.printInfo(() -> "Resetting " + Settings.SHORTS_PLAYER_TYPE);
|
||||
Settings.SHORTS_PLAYER_TYPE.resetToDefault();
|
||||
}
|
||||
}
|
||||
|
||||
private static WeakReference<Activity> mainActivityRef = new WeakReference<>(null);
|
||||
|
||||
private static volatile boolean overrideBackPressToExit;
|
||||
|
||||
@@ -24,18 +24,20 @@ public class OpenVideosFullscreenHookPatch {
|
||||
|
||||
/**
|
||||
* Injection point.
|
||||
*
|
||||
* Returns negated value.
|
||||
*/
|
||||
public static boolean openVideoFullscreenPortrait(boolean original) {
|
||||
public static boolean doNotOpenVideoFullscreenPortrait(boolean original) {
|
||||
Boolean openFullscreen = openNextVideoFullscreen;
|
||||
if (openFullscreen != null) {
|
||||
openNextVideoFullscreen = null;
|
||||
return openFullscreen;
|
||||
return !openFullscreen;
|
||||
}
|
||||
|
||||
if (!isFullScreenPatchIncluded()) {
|
||||
return original;
|
||||
}
|
||||
|
||||
return Settings.OPEN_VIDEOS_FULLSCREEN_PORTRAIT.get();
|
||||
return !Settings.OPEN_VIDEOS_FULLSCREEN_PORTRAIT.get();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -42,7 +42,7 @@ public class PlayerControlsPatch {
|
||||
|
||||
Logger.printDebug(() -> "fullscreen button visibility: "
|
||||
+ (visibility == View.VISIBLE ? "VISIBLE" :
|
||||
visibility == View.GONE ? "GONE" : "INVISIBLE"));
|
||||
visibility == View.GONE ? "GONE" : "INVISIBLE"));
|
||||
|
||||
fullscreenButtonVisibilityChanged(visibility == View.VISIBLE);
|
||||
}
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
package app.revanced.extension.youtube.patches;
|
||||
|
||||
import android.content.Intent;
|
||||
|
||||
import app.revanced.extension.youtube.settings.Settings;
|
||||
|
||||
@SuppressWarnings("unused")
|
||||
@@ -7,8 +9,13 @@ public final class RemoveTrackingQueryParameterPatch {
|
||||
private static final String NEW_TRACKING_PARAMETER_REGEX = ".si=.+";
|
||||
private static final String OLD_TRACKING_PARAMETER_REGEX = ".feature=.+";
|
||||
|
||||
/**
|
||||
* Injection point.
|
||||
*/
|
||||
public static String sanitize(String url) {
|
||||
if (!Settings.REMOVE_TRACKING_QUERY_PARAMETER.get()) return url;
|
||||
if (!Settings.REMOVE_TRACKING_QUERY_PARAMETER.get()) {
|
||||
return url;
|
||||
}
|
||||
|
||||
return url
|
||||
.replaceAll(NEW_TRACKING_PARAMETER_REGEX, "")
|
||||
|
||||
@@ -1,19 +1,29 @@
|
||||
package app.revanced.extension.youtube.patches;
|
||||
|
||||
import android.app.AlertDialog;
|
||||
|
||||
import app.revanced.extension.shared.Logger;
|
||||
import app.revanced.extension.shared.Utils;
|
||||
import app.revanced.extension.youtube.settings.Settings;
|
||||
|
||||
/** @noinspection unused*/
|
||||
@SuppressWarnings("unused")
|
||||
public class RemoveViewerDiscretionDialogPatch {
|
||||
|
||||
/**
|
||||
* Injection point.
|
||||
*/
|
||||
public static void confirmDialog(AlertDialog dialog) {
|
||||
if (!Settings.REMOVE_VIEWER_DISCRETION_DIALOG.get()) {
|
||||
// Since the patch replaces the AlertDialog#show() method, we need to call the original method here.
|
||||
dialog.show();
|
||||
if (Settings.REMOVE_VIEWER_DISCRETION_DIALOG.get()) {
|
||||
Logger.printDebug(() -> "Clicking alert dialog dismiss button");
|
||||
|
||||
final var button = dialog.getButton(AlertDialog.BUTTON_POSITIVE);
|
||||
button.setSoundEffectsEnabled(false);
|
||||
button.performClick();
|
||||
return;
|
||||
}
|
||||
|
||||
final var button = dialog.getButton(AlertDialog.BUTTON_POSITIVE);
|
||||
button.setSoundEffectsEnabled(false);
|
||||
button.performClick();
|
||||
// Since the patch replaces the AlertDialog#show() method, we need to call the original method here.
|
||||
Logger.printDebug(() -> "Showing alert dialog");
|
||||
dialog.show();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,8 +2,6 @@ package app.revanced.extension.youtube.patches;
|
||||
|
||||
import android.app.Activity;
|
||||
|
||||
import androidx.annotation.Nullable;
|
||||
|
||||
import java.lang.ref.WeakReference;
|
||||
import java.util.Objects;
|
||||
|
||||
@@ -78,7 +76,7 @@ public class ShortsAutoplayPatch {
|
||||
/**
|
||||
* Injection point.
|
||||
*/
|
||||
public static Enum<?> changeShortsRepeatBehavior(@Nullable Enum<?> original) {
|
||||
public static Enum<?> changeShortsRepeatBehavior(Enum<?> original) {
|
||||
try {
|
||||
final boolean autoplay;
|
||||
|
||||
@@ -95,19 +93,19 @@ public class ShortsAutoplayPatch {
|
||||
autoplay = Settings.SHORTS_AUTOPLAY.get();
|
||||
}
|
||||
|
||||
final ShortsLoopBehavior behavior = autoplay
|
||||
Enum<?> overrideBehavior = (autoplay
|
||||
? ShortsLoopBehavior.SINGLE_PLAY
|
||||
: ShortsLoopBehavior.REPEAT;
|
||||
: ShortsLoopBehavior.REPEAT).ytEnumValue;
|
||||
|
||||
if (behavior.ytEnumValue != null) {
|
||||
if (overrideBehavior != null) {
|
||||
Logger.printDebug(() -> {
|
||||
String name = (original == null ? "unknown (null)" : original.name());
|
||||
return behavior == original
|
||||
return overrideBehavior == original
|
||||
? "Behavior setting is same as original. Using original: " + name
|
||||
: "Changing Shorts repeat behavior from: " + name + " to: " + behavior.name();
|
||||
: "Changing Shorts repeat behavior from: " + name + " to: " + overrideBehavior.name();
|
||||
});
|
||||
|
||||
return behavior.ytEnumValue;
|
||||
return overrideBehavior;
|
||||
}
|
||||
|
||||
if (original == null) {
|
||||
@@ -118,13 +116,12 @@ public class ShortsAutoplayPatch {
|
||||
return unknown;
|
||||
}
|
||||
} catch (Exception ex) {
|
||||
Logger.printException(() -> "changeShortsRepeatBehavior failure", ex);
|
||||
Logger.printException(() -> "changeShortsRepeatState failure", ex);
|
||||
}
|
||||
|
||||
return original;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Injection point.
|
||||
*/
|
||||
|
||||
@@ -19,5 +19,8 @@ public class VersionCheckPatch {
|
||||
public static final boolean IS_19_29_OR_GREATER = isVersionOrGreater("19.29.00");
|
||||
@Deprecated
|
||||
public static final boolean IS_19_34_OR_GREATER = isVersionOrGreater("19.34.00");
|
||||
public static final boolean IS_19_46_OR_GREATER = isVersionOrGreater("19.46.00");
|
||||
|
||||
public static final boolean IS_20_21_OR_GREATER = isVersionOrGreater("20.21.00");
|
||||
|
||||
public static final boolean IS_20_22_OR_GREATER = isVersionOrGreater("20.22.00");
|
||||
}
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
package app.revanced.extension.youtube.patches.components;
|
||||
|
||||
import app.revanced.extension.youtube.patches.VersionCheckPatch;
|
||||
import app.revanced.extension.youtube.settings.Settings;
|
||||
|
||||
@SuppressWarnings("unused")
|
||||
@@ -34,7 +35,6 @@ final class ButtonsFilter extends Filter {
|
||||
|
||||
addPathCallbacks(
|
||||
likeSubscribeGlow,
|
||||
bufferFilterPathGroup,
|
||||
new StringFilterGroup(
|
||||
Settings.HIDE_LIKE_DISLIKE_BUTTON,
|
||||
"|segmented_like_dislike_button"
|
||||
@@ -53,6 +53,12 @@ final class ButtonsFilter extends Filter {
|
||||
)
|
||||
);
|
||||
|
||||
// FIXME: 20.22+ filtering of the action buttons doesn't work because
|
||||
// the buffer is the same for all buttons.
|
||||
if (!VersionCheckPatch.IS_20_22_OR_GREATER) {
|
||||
addPathCallbacks(bufferFilterPathGroup);
|
||||
}
|
||||
|
||||
bufferButtonsGroupList.addAll(
|
||||
new ByteArrayFilterGroup(
|
||||
Settings.HIDE_REPORT_BUTTON,
|
||||
@@ -78,12 +84,6 @@ final class ButtonsFilter extends Filter {
|
||||
Settings.HIDE_STOP_ADS_BUTTON,
|
||||
"yt_outline_slash_circle_left"
|
||||
),
|
||||
// Check for clip button both here and using a path filter,
|
||||
// as there's a chance the path is a generic action button and won't contain 'clip_button'
|
||||
new ByteArrayFilterGroup(
|
||||
Settings.HIDE_CLIP_BUTTON,
|
||||
"yt_outline_scissors"
|
||||
),
|
||||
new ByteArrayFilterGroup(
|
||||
Settings.HIDE_HYPE_BUTTON,
|
||||
"yt_outline_star_shooting"
|
||||
@@ -96,11 +96,13 @@ final class ButtonsFilter extends Filter {
|
||||
}
|
||||
|
||||
private boolean isEveryFilterGroupEnabled() {
|
||||
for (var group : pathCallbacks)
|
||||
for (var group : pathCallbacks) {
|
||||
if (!group.isEnabled()) return false;
|
||||
}
|
||||
|
||||
for (var group : bufferButtonsGroupList)
|
||||
for (var group : bufferButtonsGroupList) {
|
||||
if (!group.isEnabled()) return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
package app.revanced.extension.youtube.patches.components;
|
||||
|
||||
import static app.revanced.extension.youtube.patches.VersionCheckPatch.IS_20_21_OR_GREATER;
|
||||
import static app.revanced.extension.youtube.shared.NavigationBar.NavigationButton;
|
||||
|
||||
import android.graphics.drawable.Drawable;
|
||||
@@ -365,14 +366,16 @@ public final class LayoutComponentsFilter extends Filter {
|
||||
* Injection point.
|
||||
* Called from a different place then the other filters.
|
||||
*/
|
||||
public static boolean filterMixPlaylists(Object conversionContext, @Nullable final byte[] bytes) {
|
||||
public static boolean filterMixPlaylists(Object conversionContext, @Nullable byte[] buffer) {
|
||||
// Edit: This hook may no longer be needed, and mix playlist filtering
|
||||
// might be possible using the existing litho filters.
|
||||
try {
|
||||
if (!Settings.HIDE_MIX_PLAYLISTS.get()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (bytes == null) {
|
||||
Logger.printDebug(() -> "bytes is null");
|
||||
if (buffer == null) {
|
||||
Logger.printDebug(() -> "buffer is null");
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -382,11 +385,11 @@ public final class LayoutComponentsFilter extends Filter {
|
||||
}
|
||||
|
||||
// Prevent hiding the description of some videos accidentally.
|
||||
if (mixPlaylistsExceptions2.check(bytes).isFiltered()) {
|
||||
if (mixPlaylistsExceptions2.check(buffer).isFiltered()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (mixPlaylists.check(bytes).isFiltered()) {
|
||||
if (mixPlaylists.check(buffer).isFiltered()) {
|
||||
Logger.printDebug(() -> "Filtered mix playlist");
|
||||
return true;
|
||||
}
|
||||
@@ -443,11 +446,23 @@ public final class LayoutComponentsFilter extends Filter {
|
||||
: height;
|
||||
}
|
||||
|
||||
private static final boolean HIDE_FILTER_BAR_FEED_IN_RELATED_VIDEOS_ENABLED
|
||||
= Settings.HIDE_FILTER_BAR_FEED_IN_RELATED_VIDEOS.get();
|
||||
|
||||
/**
|
||||
* Injection point.
|
||||
*/
|
||||
public static void hideInRelatedVideos(View chipView) {
|
||||
Utils.hideViewBy0dpUnderCondition(Settings.HIDE_FILTER_BAR_FEED_IN_RELATED_VIDEOS, chipView);
|
||||
// Cannot use 0dp hide with later targets, otherwise the suggested videos
|
||||
// can be shown in full screen mode.
|
||||
// This behavior may also be present in earlier app targets.
|
||||
if (IS_20_21_OR_GREATER) {
|
||||
// FIXME: The filter bar is still briefly shown when dragging the suggested videos
|
||||
// below the video player.
|
||||
Utils.hideViewUnderCondition(HIDE_FILTER_BAR_FEED_IN_RELATED_VIDEOS_ENABLED, chipView);
|
||||
} else {
|
||||
Utils.hideViewBy0dpUnderCondition(HIDE_FILTER_BAR_FEED_IN_RELATED_VIDEOS_ENABLED, chipView);
|
||||
}
|
||||
}
|
||||
|
||||
private static final boolean HIDE_DOODLES_ENABLED = Settings.HIDE_DOODLES.get();
|
||||
@@ -472,7 +487,9 @@ public final class LayoutComponentsFilter extends Filter {
|
||||
&& NavigationBar.isSearchBarActive()
|
||||
// Search bar can be active but behind the player.
|
||||
&& !PlayerType.getCurrent().isMaximizedOrFullscreen()) {
|
||||
Utils.hideViewByLayoutParams(view);
|
||||
// FIXME: "Show more" button is visible hidden,
|
||||
// but an empty space remains that can be clicked.
|
||||
Utils.hideViewBy0dp(view);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -4,11 +4,16 @@ import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
|
||||
import java.nio.ByteBuffer;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import app.revanced.extension.shared.Logger;
|
||||
import app.revanced.extension.shared.Utils;
|
||||
import app.revanced.extension.shared.settings.BaseSettings;
|
||||
import app.revanced.extension.youtube.StringTrieSearch;
|
||||
import app.revanced.extension.youtube.patches.VersionCheckPatch;
|
||||
import app.revanced.extension.youtube.settings.Settings;
|
||||
|
||||
@SuppressWarnings("unused")
|
||||
@@ -73,6 +78,15 @@ public final class LithoFilterPatch {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Placeholder for actual filters.
|
||||
*/
|
||||
private static final class DummyFilter extends Filter { }
|
||||
|
||||
private static final Filter[] filters = new Filter[] {
|
||||
new DummyFilter() // Replaced during patching, do not touch.
|
||||
};
|
||||
|
||||
/**
|
||||
* Litho layout fixed thread pool size override.
|
||||
* <p>
|
||||
@@ -90,25 +104,46 @@ public final class LithoFilterPatch {
|
||||
private static final int LITHO_LAYOUT_THREAD_POOL_SIZE = 1;
|
||||
|
||||
/**
|
||||
* Placeholder for actual filters.
|
||||
* 20.22+ cannot use the thread buffer, because frequently the buffer is not correct,
|
||||
* especially for components that are recreated such as dragging off screen then back on screen.
|
||||
* Instead, parse the identifier found near the start of the buffer and use that to
|
||||
* identify the correct buffer to use when filtering.
|
||||
*/
|
||||
private static final class DummyFilter extends Filter { }
|
||||
private static final boolean EXTRACT_IDENTIFIER_FROM_BUFFER = VersionCheckPatch.IS_20_22_OR_GREATER;
|
||||
|
||||
private static final Filter[] filters = new Filter[] {
|
||||
new DummyFilter() // Replaced patching, do not touch.
|
||||
};
|
||||
/**
|
||||
* Turns on additional logging, used for development purposes only.
|
||||
*/
|
||||
public static final boolean DEBUG_EXTRACT_IDENTIFIER_FROM_BUFFER = false;
|
||||
|
||||
private static final StringTrieSearch pathSearchTree = new StringTrieSearch();
|
||||
private static final StringTrieSearch identifierSearchTree = new StringTrieSearch();
|
||||
private static final String EML_STRING = ".eml";
|
||||
private static final byte[] EML_STRING_BYTES = EML_STRING.getBytes(StandardCharsets.US_ASCII);
|
||||
|
||||
private static final byte[] EMPTY_BYTE_ARRAY = new byte[0];
|
||||
|
||||
/**
|
||||
* Because litho filtering is multi-threaded and the buffer is passed in from a different injection point,
|
||||
* the buffer is saved to a ThreadLocal so each calling thread does not interfere with other threads.
|
||||
* Used for 20.21 and lower.
|
||||
*/
|
||||
private static final ThreadLocal<byte[]> bufferThreadLocal = new ThreadLocal<>();
|
||||
|
||||
/**
|
||||
* Identifier to protocol buffer mapping. Only used for 20.22+.
|
||||
* Thread local is needed because filtering is multi-threaded and each thread can load
|
||||
* a different component with the same identifier.
|
||||
*/
|
||||
private static final ThreadLocal<Map<String, byte[]>> identifierToBufferThread = new ThreadLocal<>();
|
||||
|
||||
/**
|
||||
* Global shared buffer. Used only if the buffer is not found in the ThreadLocal.
|
||||
*/
|
||||
private static final Map<String, byte[]> identifierToBufferGlobal
|
||||
= Collections.synchronizedMap(createIdentifierToBufferMap());
|
||||
|
||||
private static final StringTrieSearch pathSearchTree = new StringTrieSearch();
|
||||
private static final StringTrieSearch identifierSearchTree = new StringTrieSearch();
|
||||
|
||||
static {
|
||||
for (Filter filter : filters) {
|
||||
filterUsingCallbacks(identifierSearchTree, filter,
|
||||
@@ -160,16 +195,107 @@ public final class LithoFilterPatch {
|
||||
}
|
||||
}
|
||||
|
||||
private static Map<String, byte[]> createIdentifierToBufferMap() {
|
||||
// It's unclear how many items should be cached. This is a guess.
|
||||
return Utils.createSizeRestrictedMap(100);
|
||||
}
|
||||
|
||||
/**
|
||||
* Helper function that differs from {@link Character#isDigit(char)}
|
||||
* as this only matches ascii and not unicode numbers.
|
||||
*/
|
||||
private static boolean isAsciiNumber(byte character) {
|
||||
return '0' <= character && character <= '9';
|
||||
}
|
||||
|
||||
private static boolean isAsciiLowerCaseLetter(byte character) {
|
||||
return 'a' <= character && character <= 'z';
|
||||
}
|
||||
|
||||
/**
|
||||
* Injection point. Called off the main thread.
|
||||
* Targets 20.22+
|
||||
*/
|
||||
public static void setProtoBuffer(byte[] buffer) {
|
||||
// Set the buffer to a thread local. The buffer will remain in memory, even after the call to #filter completes.
|
||||
// This is intentional, as it appears the buffer can be set once and then filtered multiple times.
|
||||
// The buffer will be cleared from memory after a new buffer is set by the same thread,
|
||||
// or when the calling thread eventually dies.
|
||||
bufferThreadLocal.set(buffer);
|
||||
if (DEBUG_EXTRACT_IDENTIFIER_FROM_BUFFER) {
|
||||
StringBuilder builder = new StringBuilder();
|
||||
LithoFilterParameters.findAsciiStrings(builder, buffer);
|
||||
Logger.printDebug(() -> "New buffer: " + builder);
|
||||
}
|
||||
|
||||
// Could use Boyer-Moore-Horspool since the string is ASCII and has a limited number of
|
||||
// unique characters, but it seems to be slower since the extra overhead of checking the
|
||||
// bad character array negates any performance gain of skipping a few extra subsearches.
|
||||
int emlIndex = -1;
|
||||
final int emlStringLength = EML_STRING_BYTES.length;
|
||||
for (int i = 0, lastStartIndex = buffer.length - emlStringLength; i <= lastStartIndex; i++) {
|
||||
boolean match = true;
|
||||
for (int j = 0; j < emlStringLength; j++) {
|
||||
if (buffer[i + j] != EML_STRING_BYTES[j]) {
|
||||
match = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (match) {
|
||||
emlIndex = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (emlIndex < 0) {
|
||||
// Buffer is not used for creating a new litho component.
|
||||
return;
|
||||
}
|
||||
|
||||
int startIndex = emlIndex - 1;
|
||||
while (startIndex > 0) {
|
||||
final byte character = buffer[startIndex];
|
||||
int startIndexFinal = startIndex;
|
||||
if (isAsciiNumber(character) || isAsciiLowerCaseLetter(character) || character == '_') {
|
||||
// Valid character for the first path element.
|
||||
startIndex--;
|
||||
} else {
|
||||
startIndex++;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Strip away any numbers on the start of the identifier, which can
|
||||
// be from random data in the buffer before the identifier starts.
|
||||
while (true) {
|
||||
final byte character = buffer[startIndex];
|
||||
if (isAsciiNumber(character)) {
|
||||
startIndex++;
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Find the pipe character after the identifier.
|
||||
int endIndex = -1;
|
||||
for (int i = emlIndex, length = buffer.length; i < length; i++) {
|
||||
if (buffer[i] == '|') {
|
||||
endIndex = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (endIndex < 0) {
|
||||
Logger.printException(() -> "Could not find buffer identifier");
|
||||
return;
|
||||
}
|
||||
|
||||
String identifier = new String(buffer, startIndex, endIndex - startIndex, StandardCharsets.US_ASCII);
|
||||
if (DEBUG_EXTRACT_IDENTIFIER_FROM_BUFFER) {
|
||||
Logger.printDebug(() -> "Found buffer for identifier: " + identifier);
|
||||
}
|
||||
identifierToBufferGlobal.put(identifier, buffer);
|
||||
|
||||
Map<String, byte[]> map = identifierToBufferThread.get();
|
||||
if (map == null) {
|
||||
map = createIdentifierToBufferMap();
|
||||
identifierToBufferThread.set(map);
|
||||
}
|
||||
map.put(identifier, buffer);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -177,46 +303,70 @@ public final class LithoFilterPatch {
|
||||
* Targets 20.21 and lower.
|
||||
*/
|
||||
public static void setProtoBuffer(@Nullable ByteBuffer buffer) {
|
||||
// Set the buffer to a thread local. The buffer will remain in memory, even after the call to #filter completes.
|
||||
// This is intentional, as it appears the buffer can be set once and then filtered multiple times.
|
||||
// The buffer will be cleared from memory after a new buffer is set by the same thread,
|
||||
// or when the calling thread eventually dies.
|
||||
if (buffer == null || !buffer.hasArray()) {
|
||||
// It appears the buffer can be cleared out just before the call to #filter()
|
||||
// Ignore this null value and retain the last buffer that was set.
|
||||
Logger.printDebug(() -> "Ignoring null or empty buffer: " + buffer);
|
||||
} else {
|
||||
setProtoBuffer(buffer.array());
|
||||
// Set the buffer to a thread local. The buffer will remain in memory, even after the call to #filter completes.
|
||||
// This is intentional, as it appears the buffer can be set once and then filtered multiple times.
|
||||
// The buffer will be cleared from memory after a new buffer is set by the same thread,
|
||||
// or when the calling thread eventually dies.
|
||||
bufferThreadLocal.set(buffer.array());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Injection point.
|
||||
*/
|
||||
public static boolean isFiltered(String lithoIdentifier, StringBuilder pathBuilder) {
|
||||
public static boolean isFiltered(String identifier, StringBuilder pathBuilder) {
|
||||
try {
|
||||
if (lithoIdentifier.isEmpty() && pathBuilder.length() == 0) {
|
||||
if (identifier.isEmpty() || pathBuilder.length() == 0) {
|
||||
return false;
|
||||
}
|
||||
|
||||
byte[] buffer = bufferThreadLocal.get();
|
||||
byte[] buffer = null;
|
||||
if (EXTRACT_IDENTIFIER_FROM_BUFFER) {
|
||||
final int pipeIndex = identifier.indexOf('|');
|
||||
if (pipeIndex >= 0) {
|
||||
// If the identifier contains no pipe, then it's not an ".eml" identifier
|
||||
// and the buffer is not uniquely identified. Typically this only happens
|
||||
// for subcomponents where buffer filtering is not used.
|
||||
String identifierKey = identifier.substring(0, pipeIndex);
|
||||
|
||||
var map = identifierToBufferThread.get();
|
||||
if (map != null) {
|
||||
buffer = map.get(identifierKey);
|
||||
}
|
||||
|
||||
if (buffer == null) {
|
||||
// Buffer for thread local not found. Use the last buffer found from any thread.
|
||||
buffer = identifierToBufferGlobal.get(identifierKey);
|
||||
|
||||
if (DEBUG_EXTRACT_IDENTIFIER_FROM_BUFFER && buffer == null) {
|
||||
// No buffer is found for some components, such as
|
||||
// shorts_lockup_cell.eml on channel profiles.
|
||||
// For now, just ignore this and filter without a buffer.
|
||||
Logger.printException(() -> "Could not find global buffer for identifier: " + identifier);
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
buffer = bufferThreadLocal.get();
|
||||
}
|
||||
|
||||
// Potentially the buffer may have been null or never set up until now.
|
||||
// Use an empty buffer so the litho id/path filters still work correctly.
|
||||
// Use an empty buffer so the litho id/path filters that do not use a buffer still work.
|
||||
if (buffer == null) {
|
||||
buffer = EMPTY_BYTE_ARRAY;
|
||||
}
|
||||
|
||||
LithoFilterParameters parameter = new LithoFilterParameters(
|
||||
lithoIdentifier, pathBuilder.toString(), buffer);
|
||||
String path = pathBuilder.toString();
|
||||
LithoFilterParameters parameter = new LithoFilterParameters(identifier, path, buffer);
|
||||
Logger.printDebug(() -> "Searching " + parameter);
|
||||
|
||||
if (identifierSearchTree.matches(parameter.identifier, parameter)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (pathSearchTree.matches(parameter.path, parameter)) {
|
||||
return true;
|
||||
}
|
||||
return identifierSearchTree.matches(identifier, parameter)
|
||||
|| pathSearchTree.matches(path, parameter);
|
||||
} catch (Exception ex) {
|
||||
Logger.printException(() -> "isFiltered failure", ex);
|
||||
}
|
||||
|
||||
@@ -4,15 +4,15 @@ import androidx.annotation.GuardedBy;
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.LinkedHashSet;
|
||||
import java.util.Map;
|
||||
|
||||
import app.revanced.extension.shared.Logger;
|
||||
import app.revanced.extension.shared.Utils;
|
||||
import app.revanced.extension.youtube.TrieSearch;
|
||||
import app.revanced.extension.youtube.patches.ReturnYouTubeDislikePatch;
|
||||
import app.revanced.extension.youtube.patches.VideoInformation;
|
||||
import app.revanced.extension.youtube.settings.Settings;
|
||||
import app.revanced.extension.shared.Logger;
|
||||
import app.revanced.extension.youtube.TrieSearch;
|
||||
|
||||
/**
|
||||
* Searches for video id's in the proto buffer of Shorts dislike.
|
||||
@@ -33,18 +33,7 @@ public final class ReturnYouTubeDislikeFilter extends Filter {
|
||||
* Cannot use {@link LinkedHashSet} because it's missing #removeEldestEntry().
|
||||
*/
|
||||
@GuardedBy("itself")
|
||||
private static final Map<String, Boolean> lastVideoIds = new LinkedHashMap<>() {
|
||||
/**
|
||||
* Number of video id's to keep track of for searching thru the buffer.
|
||||
* A minimum value of 3 should be sufficient, but check a few more just in case.
|
||||
*/
|
||||
private static final int NUMBER_OF_LAST_VIDEO_IDS_TO_TRACK = 5;
|
||||
|
||||
@Override
|
||||
protected boolean removeEldestEntry(Entry eldest) {
|
||||
return size() > NUMBER_OF_LAST_VIDEO_IDS_TO_TRACK;
|
||||
}
|
||||
};
|
||||
private static final Map<String, Boolean> lastVideoIds = Utils.createSizeRestrictedMap(5);
|
||||
|
||||
/**
|
||||
* Injection point.
|
||||
|
||||
@@ -11,6 +11,7 @@ import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
import app.revanced.extension.shared.Logger;
|
||||
import app.revanced.extension.youtube.patches.VersionCheckPatch;
|
||||
import app.revanced.extension.youtube.settings.Settings;
|
||||
import app.revanced.extension.youtube.shared.NavigationBar;
|
||||
import app.revanced.extension.youtube.shared.PlayerType;
|
||||
@@ -202,7 +203,11 @@ public final class ShortsFilter extends Filter {
|
||||
|
||||
videoActionButton = new StringFilterGroup(
|
||||
null,
|
||||
// Can be simply 'button.eml', 'shorts_video_action_button.eml' or 'reel_action_button.eml'
|
||||
// Can be any of:
|
||||
// button.eml
|
||||
// shorts_video_action_button.eml
|
||||
// reel_action_button.eml
|
||||
// reel_pivot_button.eml
|
||||
"button.eml"
|
||||
);
|
||||
|
||||
@@ -213,31 +218,37 @@ public final class ShortsFilter extends Filter {
|
||||
|
||||
addPathCallbacks(
|
||||
shortsCompactFeedVideo, joinButton, subscribeButton, paidPromotionButton,
|
||||
shortsActionBar, suggestedAction, pausedOverlayButtons, channelBar,
|
||||
suggestedAction, pausedOverlayButtons, channelBar,
|
||||
fullVideoLinkLabel, videoTitle, useSoundButton, reelSoundMetadata, soundButton, infoPanel,
|
||||
stickers, likeFountain, likeButton, dislikeButton
|
||||
);
|
||||
|
||||
//
|
||||
// All other action buttons.
|
||||
//
|
||||
videoActionButtonBuffer.addAll(
|
||||
new ByteArrayFilterGroup(
|
||||
Settings.HIDE_SHORTS_COMMENTS_BUTTON,
|
||||
"reel_comment_button",
|
||||
"youtube_shorts_comment_outline"
|
||||
),
|
||||
new ByteArrayFilterGroup(
|
||||
Settings.HIDE_SHORTS_SHARE_BUTTON,
|
||||
"reel_share_button",
|
||||
"youtube_shorts_share_outline"
|
||||
),
|
||||
new ByteArrayFilterGroup(
|
||||
Settings.HIDE_SHORTS_REMIX_BUTTON,
|
||||
"reel_remix_button",
|
||||
"youtube_shorts_remix_outline"
|
||||
)
|
||||
);
|
||||
// FIXME: The Shorts buffer is very different with 20.22+ and if any of these filters
|
||||
// are enabled then all Shorts player vertical buttons are hidden.
|
||||
if (!VersionCheckPatch.IS_20_22_OR_GREATER) {
|
||||
addPathCallbacks(shortsActionBar);
|
||||
|
||||
//
|
||||
// All other action buttons.
|
||||
//
|
||||
videoActionButtonBuffer.addAll(
|
||||
new ByteArrayFilterGroup(
|
||||
Settings.HIDE_SHORTS_COMMENTS_BUTTON,
|
||||
"reel_comment_button",
|
||||
"youtube_shorts_comment_outline"
|
||||
),
|
||||
new ByteArrayFilterGroup(
|
||||
Settings.HIDE_SHORTS_SHARE_BUTTON,
|
||||
"reel_share_button",
|
||||
"youtube_shorts_share_outline"
|
||||
),
|
||||
new ByteArrayFilterGroup(
|
||||
Settings.HIDE_SHORTS_REMIX_BUTTON,
|
||||
"reel_remix_button",
|
||||
"youtube_shorts_remix_outline"
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
//
|
||||
// Suggested actions.
|
||||
|
||||
@@ -21,7 +21,6 @@ public class RememberVideoQualityPatch {
|
||||
private static final IntegerSetting shortsQualityWifi = Settings.SHORTS_QUALITY_DEFAULT_WIFI;
|
||||
private static final IntegerSetting shortsQualityMobile = Settings.SHORTS_QUALITY_DEFAULT_MOBILE;
|
||||
|
||||
|
||||
public static boolean shouldRememberVideoQuality() {
|
||||
BooleanSetting preference = ShortsPlayerState.isOpen()
|
||||
? Settings.REMEMBER_SHORTS_QUALITY_LAST_SELECTED
|
||||
|
||||
@@ -19,6 +19,7 @@ import java.util.Locale;
|
||||
import java.util.Scanner;
|
||||
|
||||
import app.revanced.extension.shared.Logger;
|
||||
import app.revanced.extension.shared.ResourceType;
|
||||
import app.revanced.extension.shared.Utils;
|
||||
import app.revanced.extension.shared.settings.BaseSettings;
|
||||
import app.revanced.extension.youtube.settings.Settings;
|
||||
@@ -152,8 +153,8 @@ public final class SeekbarColorPatch {
|
||||
Logger.printDebug(() -> "Using splash seekbar style: " + seekbarStyle);
|
||||
|
||||
final int styleIdentifierDefault = Utils.getResourceIdentifier(
|
||||
seekbarStyle,
|
||||
"style"
|
||||
ResourceType.STYLE,
|
||||
seekbarStyle
|
||||
);
|
||||
if (styleIdentifierDefault == 0) {
|
||||
throw new RuntimeException("Seekbar style not found: " + seekbarStyle);
|
||||
|
||||
@@ -258,7 +258,8 @@ public class ReturnYouTubeDislike {
|
||||
// middle separator
|
||||
String middleSeparatorString = compactLayout
|
||||
? " " + MIDDLE_SEPARATOR_CHARACTER + " "
|
||||
: " \u2009" + MIDDLE_SEPARATOR_CHARACTER + "\u2009 "; // u2009 = 'narrow space' character
|
||||
: " \u2009\u2009" + MIDDLE_SEPARATOR_CHARACTER + "\u2009\u2009 "; // u2009 = 'narrow space'
|
||||
|
||||
final int shapeInsertionIndex = middleSeparatorString.length() / 2;
|
||||
Spannable middleSeparatorSpan = new SpannableString(middleSeparatorString);
|
||||
ShapeDrawable shapeDrawable = new ShapeDrawable(new OvalShape());
|
||||
|
||||
@@ -13,6 +13,7 @@ import android.widget.TextView;
|
||||
import android.widget.Toolbar;
|
||||
|
||||
import app.revanced.extension.shared.Logger;
|
||||
import app.revanced.extension.shared.ResourceType;
|
||||
import app.revanced.extension.shared.Utils;
|
||||
import app.revanced.extension.shared.settings.AppLanguage;
|
||||
import app.revanced.extension.shared.settings.BaseSettings;
|
||||
@@ -87,7 +88,7 @@ public class LicenseActivityHook extends Activity {
|
||||
setActivityTheme(licenseActivity);
|
||||
ReVancedPreferenceFragment.setNavigationBarColor(licenseActivity.getWindow());
|
||||
licenseActivity.setContentView(getResourceIdentifier(
|
||||
"revanced_settings_with_toolbar", "layout"));
|
||||
ResourceType.LAYOUT, "revanced_settings_with_toolbar"));
|
||||
|
||||
// Sanity check.
|
||||
String dataString = licenseActivity.getIntent().getDataString();
|
||||
@@ -102,7 +103,7 @@ public class LicenseActivityHook extends Activity {
|
||||
//noinspection deprecation
|
||||
licenseActivity.getFragmentManager()
|
||||
.beginTransaction()
|
||||
.replace(getResourceIdentifier("revanced_settings_fragments", "id"), fragment)
|
||||
.replace(getResourceIdentifier(ResourceType.ID, "revanced_settings_fragments"), fragment)
|
||||
.commit();
|
||||
} catch (Exception ex) {
|
||||
Logger.printException(() -> "initialize failure", ex);
|
||||
@@ -114,7 +115,7 @@ public class LicenseActivityHook extends Activity {
|
||||
// Replace dummy placeholder toolbar.
|
||||
// This is required to fix submenu title alignment issue with Android ASOP 15+
|
||||
ViewGroup toolBarParent = activity.findViewById(
|
||||
getResourceIdentifier("revanced_toolbar_parent", "id"));
|
||||
getResourceIdentifier(ResourceType.ID, "revanced_toolbar_parent"));
|
||||
ViewGroup dummyToolbar = Utils.getChildViewByResourceName(toolBarParent, "revanced_toolbar");
|
||||
toolbarLayoutParams = dummyToolbar.getLayoutParams();
|
||||
toolBarParent.removeView(dummyToolbar);
|
||||
@@ -122,7 +123,7 @@ public class LicenseActivityHook extends Activity {
|
||||
Toolbar toolbar = new Toolbar(toolBarParent.getContext());
|
||||
toolbar.setBackgroundColor(getToolbarBackgroundColor());
|
||||
toolbar.setNavigationIcon(ReVancedPreferenceFragment.getBackButtonDrawable());
|
||||
toolbar.setTitle(getResourceIdentifier("revanced_settings_title", "string"));
|
||||
toolbar.setTitle(getResourceIdentifier(ResourceType.STRING, "revanced_settings_title"));
|
||||
|
||||
final int margin = Utils.dipToPixels(16);
|
||||
toolbar.setTitleMarginStart(margin);
|
||||
@@ -147,7 +148,7 @@ public class LicenseActivityHook extends Activity {
|
||||
final var theme = Utils.isDarkModeEnabled()
|
||||
? "Theme.YouTube.Settings.Dark"
|
||||
: "Theme.YouTube.Settings";
|
||||
activity.setTheme(getResourceIdentifier(theme, "style"));
|
||||
activity.setTheme(getResourceIdentifier(ResourceType.STYLE, theme));
|
||||
}
|
||||
|
||||
public static int getToolbarBackgroundColor() {
|
||||
|
||||
@@ -30,6 +30,7 @@ import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
|
||||
import app.revanced.extension.shared.Logger;
|
||||
import app.revanced.extension.shared.ResourceType;
|
||||
import app.revanced.extension.shared.Utils;
|
||||
import app.revanced.extension.shared.settings.AppLanguage;
|
||||
import app.revanced.extension.shared.settings.BaseSettings;
|
||||
@@ -68,7 +69,7 @@ public class SearchViewController {
|
||||
/**
|
||||
* Creates a background drawable for suggestion items with rounded corners.
|
||||
*/
|
||||
private static GradientDrawable createSuggestionBackgroundDrawable(Context context) {
|
||||
private static GradientDrawable createSuggestionBackgroundDrawable() {
|
||||
GradientDrawable background = new GradientDrawable();
|
||||
background.setShape(GradientDrawable.RECTANGLE);
|
||||
background.setColor(getSearchViewBackground());
|
||||
@@ -109,9 +110,11 @@ public class SearchViewController {
|
||||
|
||||
// Retrieve SearchView and container from XML.
|
||||
searchView = activity.findViewById(getResourceIdentifier(
|
||||
"revanced_search_view", "id"));
|
||||
ResourceType.ID,
|
||||
"revanced_search_view"));
|
||||
searchContainer = activity.findViewById(getResourceIdentifier(
|
||||
"revanced_search_view_container", "id"));
|
||||
ResourceType.ID,
|
||||
"revanced_search_view_container"));
|
||||
|
||||
// Initialize AutoCompleteTextView.
|
||||
autoCompleteTextView = searchView.findViewById(
|
||||
@@ -178,8 +181,8 @@ public class SearchViewController {
|
||||
});
|
||||
|
||||
// Set menu and search icon.
|
||||
final int actionSearchId = getResourceIdentifier("action_search", "id");
|
||||
toolbar.inflateMenu(getResourceIdentifier("revanced_search_menu", "menu"));
|
||||
final int actionSearchId = getResourceIdentifier(ResourceType.ID, "action_search");
|
||||
toolbar.inflateMenu(getResourceIdentifier(ResourceType.MENU, "revanced_search_menu"));
|
||||
MenuItem searchItem = toolbar.getMenu().findItem(actionSearchId);
|
||||
|
||||
// Set menu item click listener.
|
||||
@@ -307,7 +310,8 @@ public class SearchViewController {
|
||||
private void openSearch() {
|
||||
isSearchActive = true;
|
||||
toolbar.getMenu().findItem(getResourceIdentifier(
|
||||
"action_search", "id")).setVisible(false);
|
||||
ResourceType.ID,
|
||||
"action_search")).setVisible(false);
|
||||
toolbar.setTitle("");
|
||||
searchContainer.setVisibility(View.VISIBLE);
|
||||
searchView.requestFocus();
|
||||
@@ -332,7 +336,8 @@ public class SearchViewController {
|
||||
public void closeSearch() {
|
||||
isSearchActive = false;
|
||||
toolbar.getMenu().findItem(getResourceIdentifier(
|
||||
"action_search", "id")).setVisible(true);
|
||||
ResourceType.ID,
|
||||
"action_search")).setVisible(true);
|
||||
toolbar.setTitle(originalTitle);
|
||||
searchContainer.setVisibility(View.GONE);
|
||||
searchView.setQuery("", false);
|
||||
@@ -368,16 +373,18 @@ public class SearchViewController {
|
||||
public View getView(int position, View convertView, @NonNull android.view.ViewGroup parent) {
|
||||
if (convertView == null) {
|
||||
convertView = LinearLayout.inflate(getContext(), getResourceIdentifier(
|
||||
"revanced_search_suggestion_item", "layout"), null);
|
||||
ResourceType.LAYOUT,
|
||||
"revanced_search_suggestion_item"), null);
|
||||
}
|
||||
|
||||
// Apply rounded corners programmatically.
|
||||
convertView.setBackground(createSuggestionBackgroundDrawable(getContext()));
|
||||
convertView.setBackground(createSuggestionBackgroundDrawable());
|
||||
String query = getItem(position);
|
||||
|
||||
// Set query text.
|
||||
TextView textView = convertView.findViewById(getResourceIdentifier(
|
||||
"suggestion_text", "id"));
|
||||
ResourceType.ID,
|
||||
"suggestion_text"));
|
||||
if (textView != null) {
|
||||
textView.setText(query);
|
||||
}
|
||||
|
||||
@@ -13,6 +13,7 @@ import static app.revanced.extension.youtube.patches.ChangeStartPagePatch.Change
|
||||
import static app.revanced.extension.youtube.patches.ChangeStartPagePatch.StartPage;
|
||||
import static app.revanced.extension.youtube.patches.ExitFullscreenPatch.FullscreenMode;
|
||||
import static app.revanced.extension.youtube.patches.ForceOriginalAudioPatch.ForceOriginalAudioAvailability;
|
||||
import static app.revanced.extension.youtube.patches.MiniplayerPatch.MiniplayerHideOverlayButtonsAvailability;
|
||||
import static app.revanced.extension.youtube.patches.MiniplayerPatch.MiniplayerHorizontalDragAvailability;
|
||||
import static app.revanced.extension.youtube.patches.MiniplayerPatch.MiniplayerType;
|
||||
import static app.revanced.extension.youtube.patches.MiniplayerPatch.MiniplayerType.MINIMAL;
|
||||
@@ -46,7 +47,6 @@ import app.revanced.extension.youtube.patches.AlternativeThumbnailsPatch.DeArrow
|
||||
import app.revanced.extension.youtube.patches.AlternativeThumbnailsPatch.StillImagesAvailability;
|
||||
import app.revanced.extension.youtube.patches.AlternativeThumbnailsPatch.ThumbnailOption;
|
||||
import app.revanced.extension.youtube.patches.AlternativeThumbnailsPatch.ThumbnailStillTime;
|
||||
import app.revanced.extension.youtube.patches.MiniplayerPatch;
|
||||
import app.revanced.extension.youtube.sponsorblock.SponsorBlockSettings;
|
||||
import app.revanced.extension.youtube.swipecontrols.SwipeControlsConfigurationProvider.SwipeOverlayStyle;
|
||||
|
||||
@@ -182,8 +182,8 @@ public class Settings extends BaseSettings {
|
||||
public static final BooleanSetting MINIPLAYER_DOUBLE_TAP_ACTION = new BooleanSetting("revanced_miniplayer_double_tap_action", TRUE, true, MINIPLAYER_ANY_MODERN);
|
||||
public static final BooleanSetting MINIPLAYER_DRAG_AND_DROP = new BooleanSetting("revanced_miniplayer_drag_and_drop", TRUE, true, MINIPLAYER_ANY_MODERN);
|
||||
public static final BooleanSetting MINIPLAYER_HORIZONTAL_DRAG = new BooleanSetting("revanced_miniplayer_horizontal_drag", FALSE, true, new MiniplayerHorizontalDragAvailability());
|
||||
public static final BooleanSetting MINIPLAYER_HIDE_OVERLAY_BUTTONS = new BooleanSetting("revanced_miniplayer_hide_overlay_buttons", FALSE, true, new MiniplayerPatch.MiniplayerHideOverlayButtonsAvailability());
|
||||
public static final BooleanSetting MINIPLAYER_HIDE_SUBTEXT = new BooleanSetting("revanced_miniplayer_hide_subtext", FALSE, true, MINIPLAYER_TYPE.availability(MODERN_1, MODERN_3));
|
||||
public static final BooleanSetting MINIPLAYER_HIDE_OVERLAY_BUTTONS = new BooleanSetting("revanced_miniplayer_hide_overlay_buttons", FALSE, true, new MiniplayerHideOverlayButtonsAvailability());
|
||||
public static final BooleanSetting MINIPLAYER_HIDE_SUBTEXT = new BooleanSetting("revanced_miniplayer_hide_subtext", FALSE, true, MINIPLAYER_TYPE.availability(MODERN_1, MODERN_3, MODERN_4));
|
||||
public static final BooleanSetting MINIPLAYER_HIDE_REWIND_FORWARD = new BooleanSetting("revanced_miniplayer_hide_rewind_forward", TRUE, true, MINIPLAYER_TYPE.availability(MODERN_1));
|
||||
public static final BooleanSetting MINIPLAYER_ROUNDED_CORNERS = new BooleanSetting("revanced_miniplayer_rounded_corners", TRUE, true, MINIPLAYER_ANY_MODERN);
|
||||
public static final IntegerSetting MINIPLAYER_WIDTH_DIP = new IntegerSetting("revanced_miniplayer_width_dip", 192, true, MINIPLAYER_ANY_MODERN);
|
||||
@@ -282,6 +282,7 @@ public class Settings extends BaseSettings {
|
||||
public static final BooleanSetting HIDE_NOTIFICATIONS_BUTTON = new BooleanSetting("revanced_hide_notifications_button", FALSE, true);
|
||||
public static final BooleanSetting SWITCH_CREATE_WITH_NOTIFICATIONS_BUTTON = new BooleanSetting("revanced_switch_create_with_notifications_button", TRUE, true,
|
||||
"revanced_switch_create_with_notifications_button_user_dialog_message");
|
||||
public static final BooleanSetting NAVIGATION_BAR_ANIMATIONS = new BooleanSetting("revanced_navigation_bar_animations", FALSE);
|
||||
public static final BooleanSetting DISABLE_TRANSLUCENT_STATUS_BAR = new BooleanSetting("revanced_disable_translucent_status_bar", FALSE, true,
|
||||
"revanced_disable_translucent_status_bar_user_dialog_message");
|
||||
public static final BooleanSetting DISABLE_TRANSLUCENT_NAVIGATION_BAR_LIGHT = new BooleanSetting("revanced_disable_translucent_navigation_bar_light", FALSE, true);
|
||||
@@ -333,6 +334,7 @@ public class Settings extends BaseSettings {
|
||||
public static final BooleanSetting DISABLE_PRECISE_SEEKING_GESTURE = new BooleanSetting("revanced_disable_precise_seeking_gesture", FALSE);
|
||||
public static final BooleanSetting HIDE_SEEKBAR = new BooleanSetting("revanced_hide_seekbar", FALSE, true);
|
||||
public static final BooleanSetting HIDE_SEEKBAR_THUMBNAIL = new BooleanSetting("revanced_hide_seekbar_thumbnail", FALSE, true);
|
||||
public static final BooleanSetting FULLSCREEN_LARGE_SEEKBAR = new BooleanSetting("revanced_fullscreen_large_seekbar", FALSE);
|
||||
public static final BooleanSetting HIDE_TIMESTAMP = new BooleanSetting("revanced_hide_timestamp", FALSE);
|
||||
public static final BooleanSetting RESTORE_OLD_SEEKBAR_THUMBNAILS = new BooleanSetting("revanced_restore_old_seekbar_thumbnails", TRUE);
|
||||
public static final BooleanSetting SEEKBAR_TAPPING = new BooleanSetting("revanced_seekbar_tapping", FALSE);
|
||||
|
||||
@@ -34,6 +34,7 @@ import java.util.Objects;
|
||||
import java.util.function.Function;
|
||||
|
||||
import app.revanced.extension.shared.Logger;
|
||||
import app.revanced.extension.shared.ResourceType;
|
||||
import app.revanced.extension.shared.Utils;
|
||||
import app.revanced.extension.shared.settings.preference.CustomDialogListPreference;
|
||||
import app.revanced.extension.youtube.settings.Settings;
|
||||
@@ -210,7 +211,7 @@ public class ExternalDownloaderPreference extends CustomDialogListPreference {
|
||||
final boolean usingCustomDownloader = Downloader.findByPackageName(packageName) == null;
|
||||
adapter = new CustomDialogListPreference.ListPreferenceArrayAdapter(
|
||||
context,
|
||||
Utils.getResourceIdentifier("revanced_custom_list_item_checked", "layout"),
|
||||
Utils.getResourceIdentifier(ResourceType.LAYOUT, "revanced_custom_list_item_checked"),
|
||||
getEntries(),
|
||||
getEntryValues(),
|
||||
usingCustomDownloader
|
||||
|
||||
@@ -38,6 +38,7 @@ import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
import app.revanced.extension.shared.Logger;
|
||||
import app.revanced.extension.shared.ResourceType;
|
||||
import app.revanced.extension.shared.Utils;
|
||||
import app.revanced.extension.shared.settings.BaseSettings;
|
||||
import app.revanced.extension.shared.settings.preference.AbstractPreferenceFragment;
|
||||
@@ -72,7 +73,9 @@ public class ReVancedPreferenceFragment extends AbstractPreferenceFragment {
|
||||
|
||||
@SuppressLint("UseCompatLoadingForDrawables")
|
||||
public static Drawable getBackButtonDrawable() {
|
||||
final int backButtonResource = getResourceIdentifier("revanced_settings_toolbar_arrow_left", "drawable");
|
||||
final int backButtonResource = getResourceIdentifier(
|
||||
ResourceType.DRAWABLE,
|
||||
"revanced_settings_toolbar_arrow_left");
|
||||
Drawable drawable = Utils.getContext().getResources().getDrawable(backButtonResource);
|
||||
drawable.setTint(Utils.getAppForegroundColor());
|
||||
return drawable;
|
||||
@@ -217,8 +220,11 @@ public class ReVancedPreferenceFragment extends AbstractPreferenceFragment {
|
||||
noResultsPreference.setSelectable(false);
|
||||
// Set icon for the placeholder preference.
|
||||
noResultsPreference.setLayoutResource(getResourceIdentifier(
|
||||
"revanced_preference_with_icon_no_search_result", "layout"));
|
||||
noResultsPreference.setIcon(getResourceIdentifier("revanced_settings_search_icon", "drawable"));
|
||||
ResourceType.LAYOUT,
|
||||
"revanced_preference_with_icon_no_search_result"));
|
||||
noResultsPreference.setIcon(getResourceIdentifier(
|
||||
ResourceType.DRAWABLE,
|
||||
"revanced_settings_search_icon"));
|
||||
preferenceScreen.addPreference(noResultsPreference);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -19,6 +19,7 @@ import java.util.concurrent.CountDownLatch;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
import app.revanced.extension.shared.Logger;
|
||||
import app.revanced.extension.shared.ResourceType;
|
||||
import app.revanced.extension.shared.Utils;
|
||||
import app.revanced.extension.shared.settings.BaseSettings;
|
||||
import app.revanced.extension.youtube.settings.Settings;
|
||||
@@ -282,7 +283,8 @@ public final class NavigationBar {
|
||||
* the what would be the filled cairo icon.
|
||||
*/
|
||||
private static final int fillBellCairoBlack = Utils.getResourceIdentifier(
|
||||
"yt_fill_bell_black_24", "drawable");
|
||||
ResourceType.DRAWABLE,
|
||||
"yt_fill_bell_black_24");
|
||||
|
||||
/**
|
||||
* Injection point.
|
||||
|
||||
@@ -3,6 +3,7 @@ package app.revanced.extension.youtube.shared
|
||||
import android.app.Activity
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import app.revanced.extension.shared.ResourceType
|
||||
import app.revanced.extension.shared.Utils
|
||||
import java.lang.ref.WeakReference
|
||||
|
||||
@@ -19,13 +20,13 @@ class PlayerControlsVisibilityObserverImpl(
|
||||
* id of the direct parent of controls_layout, R.id.youtube_controls_overlay
|
||||
*/
|
||||
private val controlsLayoutParentId =
|
||||
Utils.getResourceIdentifier(activity, "youtube_controls_overlay", "id")
|
||||
Utils.getResourceIdentifier(activity, ResourceType.ID, "youtube_controls_overlay")
|
||||
|
||||
/**
|
||||
* id of R.id.controls_layout
|
||||
*/
|
||||
private val controlsLayoutId =
|
||||
Utils.getResourceIdentifier(activity, "controls_layout", "id")
|
||||
Utils.getResourceIdentifier(activity, ResourceType.ID, "controls_layout")
|
||||
|
||||
/**
|
||||
* reference to the controls layout view
|
||||
|
||||
@@ -2,7 +2,6 @@ package app.revanced.extension.youtube.shared
|
||||
|
||||
import app.revanced.extension.shared.Logger
|
||||
import app.revanced.extension.youtube.Event
|
||||
import app.revanced.extension.youtube.patches.VideoInformation
|
||||
|
||||
/**
|
||||
* Regular player type.
|
||||
|
||||
@@ -26,7 +26,6 @@ import android.widget.TextView;
|
||||
import androidx.annotation.Nullable;
|
||||
|
||||
import java.lang.ref.WeakReference;
|
||||
import java.lang.reflect.Field;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
@@ -151,9 +150,9 @@ public class SegmentPlaybackController {
|
||||
private static long skipSegmentButtonEndTime;
|
||||
@Nullable
|
||||
private static String timeWithoutSegments;
|
||||
private static int sponsorBarAbsoluteLeft;
|
||||
private static int sponsorAbsoluteBarRight;
|
||||
private static int sponsorBarThickness;
|
||||
private static int seekbarAbsoluteLeft;
|
||||
private static int seekbarAbsoluteRight;
|
||||
private static int seekbarThickness;
|
||||
|
||||
@Nullable
|
||||
private static SponsorSegment lastSegmentSkipped;
|
||||
@@ -923,31 +922,13 @@ public class SegmentPlaybackController {
|
||||
* injection point.
|
||||
*/
|
||||
@SuppressWarnings("unused")
|
||||
public static void setSponsorBarRect(Object self) {
|
||||
try {
|
||||
Field field = self.getClass().getDeclaredField("replaceMeWithsetSponsorBarRect");
|
||||
field.setAccessible(true);
|
||||
Rect rect = (Rect) Objects.requireNonNull(field.get(self));
|
||||
setSponsorBarAbsoluteLeft(rect);
|
||||
setSponsorBarAbsoluteRight(rect);
|
||||
} catch (Exception ex) {
|
||||
Logger.printException(() -> "setSponsorBarRect failure", ex);
|
||||
}
|
||||
}
|
||||
|
||||
private static void setSponsorBarAbsoluteLeft(Rect rect) {
|
||||
final int left = rect.left;
|
||||
if (sponsorBarAbsoluteLeft != left) {
|
||||
Logger.printDebug(() -> "setSponsorBarAbsoluteLeft: " + left);
|
||||
sponsorBarAbsoluteLeft = left;
|
||||
}
|
||||
}
|
||||
|
||||
private static void setSponsorBarAbsoluteRight(Rect rect) {
|
||||
final int right = rect.right;
|
||||
if (sponsorAbsoluteBarRight != right) {
|
||||
Logger.printDebug(() -> "setSponsorBarAbsoluteRight: " + right);
|
||||
sponsorAbsoluteBarRight = right;
|
||||
public static void setSeekbarRectangle(Rect seekbarRect) {
|
||||
final int left = seekbarRect.left;
|
||||
final int right = seekbarRect.right;
|
||||
if (seekbarAbsoluteLeft != left || seekbarAbsoluteRight != right) {
|
||||
Logger.printDebug(() -> "setSeekbarRectangle left: " + left + " right: " + right);
|
||||
seekbarAbsoluteLeft = left;
|
||||
seekbarAbsoluteRight = right;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -955,8 +936,8 @@ public class SegmentPlaybackController {
|
||||
* injection point.
|
||||
*/
|
||||
@SuppressWarnings("unused")
|
||||
public static void setSponsorBarThickness(int thickness) {
|
||||
sponsorBarThickness = thickness;
|
||||
public static void setSeekbarThickness(int thickness) {
|
||||
seekbarThickness = thickness;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -966,8 +947,7 @@ public class SegmentPlaybackController {
|
||||
public static String appendTimeWithoutSegments(String totalTime) {
|
||||
try {
|
||||
if (Settings.SB_ENABLED.get() && Settings.SB_VIDEO_LENGTH_WITHOUT_SEGMENTS.get()
|
||||
&& !TextUtils.isEmpty(totalTime) && !TextUtils.isEmpty(timeWithoutSegments)
|
||||
&& !isAdProgressTextVisible()) {
|
||||
&& !TextUtils.isEmpty(totalTime) && !TextUtils.isEmpty(timeWithoutSegments)) {
|
||||
// Force LTR layout, to match the same LTR video time/length layout YouTube uses for all languages
|
||||
return "\u202D" + totalTime + timeWithoutSegments; // u202D = left to right override
|
||||
}
|
||||
@@ -995,6 +975,7 @@ public class SegmentPlaybackController {
|
||||
continue;
|
||||
}
|
||||
foundNonhighlightSegments = true;
|
||||
|
||||
long start = segment.start;
|
||||
final long end = segment.end;
|
||||
// To prevent nested segments from incorrectly counting additional time,
|
||||
@@ -1026,17 +1007,17 @@ public class SegmentPlaybackController {
|
||||
* Injection point.
|
||||
*/
|
||||
@SuppressWarnings("unused")
|
||||
public static void drawSponsorTimeBars(final Canvas canvas, final float posY) {
|
||||
public static void drawSegmentTimeBars(final Canvas canvas, final float posY) {
|
||||
try {
|
||||
if (segments == null || isAdProgressTextVisible()) return;
|
||||
if (segments == null) return;
|
||||
final long videoLength = VideoInformation.getVideoLength();
|
||||
if (videoLength <= 0) return;
|
||||
|
||||
final int thicknessDiv2 = sponsorBarThickness / 2; // rounds down
|
||||
final float top = posY - (sponsorBarThickness - thicknessDiv2);
|
||||
final int thicknessDiv2 = seekbarThickness / 2; // Rounds down.
|
||||
final float top = posY - (seekbarThickness - thicknessDiv2);
|
||||
final float bottom = posY + thicknessDiv2;
|
||||
final float videoMillisecondsToPixels = (1f / videoLength) * (sponsorAbsoluteBarRight - sponsorBarAbsoluteLeft);
|
||||
final float leftPadding = sponsorBarAbsoluteLeft;
|
||||
final float videoMillisecondsToPixels = (1f / videoLength) * (seekbarAbsoluteRight - seekbarAbsoluteLeft);
|
||||
final float leftPadding = seekbarAbsoluteLeft;
|
||||
|
||||
for (SponsorSegment segment : segments) {
|
||||
final float left = leftPadding + segment.start * videoMillisecondsToPixels;
|
||||
|
||||
@@ -26,6 +26,7 @@ import java.util.Locale;
|
||||
import java.util.Objects;
|
||||
|
||||
import app.revanced.extension.shared.Logger;
|
||||
import app.revanced.extension.shared.ResourceType;
|
||||
import app.revanced.extension.shared.Utils;
|
||||
import app.revanced.extension.shared.settings.preference.ColorPickerPreference;
|
||||
import app.revanced.extension.shared.settings.preference.ColorPickerView;
|
||||
@@ -100,10 +101,10 @@ public class SegmentCategoryListPreference extends ListPreference {
|
||||
contentLayout.addView(radioGroup);
|
||||
|
||||
// Inflate the color picker view.
|
||||
View colorPickerContainer = LayoutInflater.from(context)
|
||||
.inflate(getResourceIdentifier("revanced_color_picker", "layout"), null);
|
||||
View colorPickerContainer = LayoutInflater.from(context).inflate(
|
||||
getResourceIdentifier(ResourceType.LAYOUT, "revanced_color_picker"), null);
|
||||
dialogColorPickerView = colorPickerContainer.findViewById(
|
||||
getResourceIdentifier("revanced_color_picker_view", "id"));
|
||||
getResourceIdentifier(ResourceType.ID, "revanced_color_picker_view"));
|
||||
dialogColorPickerView.setColor(categoryColor);
|
||||
contentLayout.addView(colorPickerContainer);
|
||||
|
||||
|
||||
@@ -59,6 +59,7 @@ public class CreateSegmentButton {
|
||||
|
||||
private static boolean isButtonEnabled() {
|
||||
return Settings.SB_ENABLED.get() && Settings.SB_CREATE_NEW_SEGMENT.get()
|
||||
&& SegmentPlaybackController.videoHasSegments()
|
||||
&& !SegmentPlaybackController.isAdProgressTextVisible();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -10,6 +10,7 @@ import android.view.ViewGroup;
|
||||
import android.widget.FrameLayout;
|
||||
import android.widget.ImageButton;
|
||||
|
||||
import app.revanced.extension.shared.ResourceType;
|
||||
import app.revanced.extension.youtube.patches.VideoInformation;
|
||||
import app.revanced.extension.youtube.settings.Settings;
|
||||
import app.revanced.extension.youtube.sponsorblock.SponsorBlockUtils;
|
||||
@@ -45,7 +46,10 @@ public final class NewSegmentLayout extends FrameLayout {
|
||||
super(context, attributeSet, defStyleAttr, defStyleRes);
|
||||
|
||||
LayoutInflater.from(context).inflate(
|
||||
getResourceIdentifier(context, "revanced_sb_new_segment", "layout"), this, true
|
||||
getResourceIdentifier(context,
|
||||
ResourceType.LAYOUT, "revanced_sb_new_segment"),
|
||||
this,
|
||||
true
|
||||
);
|
||||
|
||||
initializeButton(
|
||||
@@ -104,7 +108,7 @@ public final class NewSegmentLayout extends FrameLayout {
|
||||
*/
|
||||
private void initializeButton(final Context context, final String resourceIdentifierName,
|
||||
final ButtonOnClickHandlerFunction handler, final String debugMessage) {
|
||||
ImageButton button = findViewById(getResourceIdentifier(context, resourceIdentifierName, "id"));
|
||||
ImageButton button = findViewById(getResourceIdentifier(context, ResourceType.ID, resourceIdentifierName));
|
||||
|
||||
// Add ripple effect
|
||||
RippleDrawable rippleDrawable = new RippleDrawable(
|
||||
|
||||
@@ -20,6 +20,7 @@ import androidx.annotation.NonNull;
|
||||
|
||||
import java.util.Objects;
|
||||
|
||||
import app.revanced.extension.shared.ResourceType;
|
||||
import app.revanced.extension.youtube.settings.Settings;
|
||||
import app.revanced.extension.youtube.sponsorblock.SegmentPlaybackController;
|
||||
import app.revanced.extension.youtube.sponsorblock.objects.SponsorSegment;
|
||||
@@ -56,9 +57,9 @@ public class SkipSponsorButton extends FrameLayout {
|
||||
public SkipSponsorButton(Context context, AttributeSet attributeSet, int defStyleAttr, int defStyleRes) {
|
||||
super(context, attributeSet, defStyleAttr, defStyleRes);
|
||||
|
||||
LayoutInflater.from(context).inflate(getResourceIdentifier(context, "revanced_sb_skip_sponsor_button", "layout"), this, true); // layout:skip_ad_button
|
||||
LayoutInflater.from(context).inflate(getResourceIdentifier(context, ResourceType.LAYOUT, "revanced_sb_skip_sponsor_button"), this, true); // layout:skip_ad_button
|
||||
setMinimumHeight(getResourceDimensionPixelSize("ad_skip_ad_button_min_height")); // dimen:ad_skip_ad_button_min_height
|
||||
skipSponsorBtnContainer = Objects.requireNonNull(findViewById(getResourceIdentifier(context, "revanced_sb_skip_sponsor_button_container", "id"))); // id:skip_ad_button_container
|
||||
skipSponsorBtnContainer = Objects.requireNonNull(findViewById(getResourceIdentifier(context, ResourceType.ID, "revanced_sb_skip_sponsor_button_container"))); // id:skip_ad_button_container
|
||||
|
||||
background = new Paint();
|
||||
background.setColor(getResourceColor("skip_ad_button_background_color")); // color:skip_ad_button_background_color);
|
||||
@@ -69,7 +70,7 @@ public class SkipSponsorButton extends FrameLayout {
|
||||
border.setStrokeWidth(getResourceDimension("ad_skip_ad_button_border_width")); // dimen:ad_skip_ad_button_border_width);
|
||||
border.setStyle(Paint.Style.STROKE);
|
||||
|
||||
skipSponsorTextView = Objects.requireNonNull(findViewById(getResourceIdentifier(context, "revanced_sb_skip_sponsor_button_text", "id"))); // id:skip_ad_button_text;
|
||||
skipSponsorTextView = Objects.requireNonNull(findViewById(getResourceIdentifier(context, ResourceType.ID, "revanced_sb_skip_sponsor_button_text"))); // id:skip_ad_button_text;
|
||||
defaultBottomMargin = getResourceDimensionPixelSize("skip_button_default_bottom_margin"); // dimen:skip_button_default_bottom_margin
|
||||
ctaBottomMargin = getResourceDimensionPixelSize("skip_button_cta_bottom_margin"); // dimen:skip_button_cta_bottom_margin
|
||||
|
||||
|
||||
@@ -15,6 +15,7 @@ import java.lang.ref.WeakReference;
|
||||
import java.util.Objects;
|
||||
|
||||
import app.revanced.extension.shared.Logger;
|
||||
import app.revanced.extension.shared.ResourceType;
|
||||
import app.revanced.extension.shared.Utils;
|
||||
import app.revanced.extension.youtube.shared.PlayerType;
|
||||
import app.revanced.extension.youtube.sponsorblock.objects.SponsorSegment;
|
||||
@@ -62,15 +63,17 @@ public class SponsorBlockViewController {
|
||||
|
||||
Context context = Utils.getContext();
|
||||
RelativeLayout layout = new RelativeLayout(context);
|
||||
layout.setLayoutParams(new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT,RelativeLayout.LayoutParams.MATCH_PARENT));
|
||||
LayoutInflater.from(context).inflate(getResourceIdentifier("revanced_sb_inline_sponsor_overlay", "layout"), layout);
|
||||
layout.setLayoutParams(new RelativeLayout.LayoutParams(
|
||||
RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.MATCH_PARENT));
|
||||
LayoutInflater.from(context).inflate(getResourceIdentifier(ResourceType.LAYOUT,
|
||||
"revanced_sb_inline_sponsor_overlay"), layout);
|
||||
inlineSponsorOverlayRef = new WeakReference<>(layout);
|
||||
|
||||
viewGroup.addView(layout);
|
||||
viewGroup.setOnHierarchyChangeListener(new ViewGroup.OnHierarchyChangeListener() {
|
||||
@Override
|
||||
public void onChildViewAdded(View parent, View child) {
|
||||
// ensure SB buttons and controls are always on top, otherwise the endscreen cards can cover the skip button
|
||||
// Ensure SB buttons and controls are always on top, otherwise the end-screen cards can cover the skip button.
|
||||
RelativeLayout layout = inlineSponsorOverlayRef.get();
|
||||
if (layout != null) {
|
||||
layout.bringToFront();
|
||||
@@ -83,13 +86,13 @@ public class SponsorBlockViewController {
|
||||
youtubeOverlaysLayoutRef = new WeakReference<>(viewGroup);
|
||||
|
||||
skipHighlightButtonRef = new WeakReference<>(Objects.requireNonNull(
|
||||
layout.findViewById(getResourceIdentifier("revanced_sb_skip_highlight_button", "id"))));
|
||||
layout.findViewById(getResourceIdentifier(ResourceType.ID, "revanced_sb_skip_highlight_button"))));
|
||||
|
||||
skipSponsorButtonRef = new WeakReference<>(Objects.requireNonNull(
|
||||
layout.findViewById(getResourceIdentifier("revanced_sb_skip_sponsor_button", "id"))));
|
||||
layout.findViewById(getResourceIdentifier(ResourceType.ID, "revanced_sb_skip_sponsor_button"))));
|
||||
|
||||
NewSegmentLayout newSegmentLayout = Objects.requireNonNull(
|
||||
layout.findViewById(getResourceIdentifier("revanced_sb_new_segment_view", "id")));
|
||||
layout.findViewById(getResourceIdentifier(ResourceType.ID, "revanced_sb_new_segment_view")));
|
||||
newSegmentLayoutRef = new WeakReference<>(newSegmentLayout);
|
||||
newSegmentLayout.updateLayout();
|
||||
|
||||
|
||||
@@ -59,8 +59,7 @@ public class VotingButton {
|
||||
}
|
||||
|
||||
private static boolean isButtonEnabled() {
|
||||
return Settings.SB_ENABLED.get() && Settings.SB_VOTING_BUTTON.get()
|
||||
&& SegmentPlaybackController.videoHasSegments()
|
||||
return Settings.SB_ENABLED.get() && Settings.SB_CREATE_NEW_SEGMENT.get()
|
||||
&& !SegmentPlaybackController.isAdProgressTextVisible();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8,6 +8,7 @@ import android.view.MotionEvent
|
||||
import android.view.ViewGroup
|
||||
import app.revanced.extension.shared.Logger.printDebug
|
||||
import app.revanced.extension.shared.Logger.printException
|
||||
import app.revanced.extension.youtube.patches.VersionCheckPatch
|
||||
import app.revanced.extension.youtube.settings.Settings
|
||||
import app.revanced.extension.youtube.shared.PlayerType
|
||||
import app.revanced.extension.youtube.swipecontrols.controller.AudioVolumeController
|
||||
@@ -237,6 +238,8 @@ class SwipeControlsHostActivity : Activity() {
|
||||
*/
|
||||
@Suppress("unused")
|
||||
@JvmStatic
|
||||
fun allowSwipeChangeVideo(original: Boolean): Boolean = Settings.SWIPE_CHANGE_VIDEO.get()
|
||||
fun allowSwipeChangeVideo(original: Boolean): Boolean =
|
||||
// Feature can cause crashing if forced in newer targets.
|
||||
!VersionCheckPatch.IS_20_22_OR_GREATER && Settings.SWIPE_CHANGE_VIDEO.get()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,6 +3,7 @@ package app.revanced.extension.youtube.swipecontrols.controller
|
||||
import android.app.Activity
|
||||
import android.util.TypedValue
|
||||
import android.view.ViewGroup
|
||||
import app.revanced.extension.shared.ResourceType
|
||||
import app.revanced.extension.shared.Utils
|
||||
import app.revanced.extension.youtube.swipecontrols.misc.Rectangle
|
||||
import app.revanced.extension.youtube.swipecontrols.misc.applyDimension
|
||||
@@ -56,7 +57,8 @@ class SwipeZonesController(
|
||||
/**
|
||||
* id for R.id.player_view
|
||||
*/
|
||||
private val playerViewId = Utils.getResourceIdentifier(host, "player_view", "id")
|
||||
private val playerViewId = Utils.getResourceIdentifier(
|
||||
host, ResourceType.ID, "player_view")
|
||||
|
||||
/**
|
||||
* current bounding rectangle of the player
|
||||
|
||||
@@ -14,12 +14,13 @@ import android.util.AttributeSet
|
||||
import android.view.HapticFeedbackConstants
|
||||
import android.view.View
|
||||
import android.widget.RelativeLayout
|
||||
import app.revanced.extension.shared.ResourceType
|
||||
import app.revanced.extension.shared.StringRef.str
|
||||
import app.revanced.extension.shared.Utils
|
||||
import app.revanced.extension.youtube.swipecontrols.SwipeControlsConfigurationProvider
|
||||
import app.revanced.extension.youtube.swipecontrols.misc.SwipeControlsOverlay
|
||||
import kotlin.math.min
|
||||
import kotlin.math.max
|
||||
import kotlin.math.min
|
||||
import kotlin.math.round
|
||||
|
||||
/**
|
||||
@@ -53,7 +54,7 @@ class SwipeControlsOverlayLayout(
|
||||
// Function to retrieve drawable resources by name.
|
||||
private fun getDrawable(name: String): Drawable {
|
||||
val drawable = resources.getDrawable(
|
||||
Utils.getResourceIdentifier(context, name, "drawable"),
|
||||
Utils.getResourceIdentifier(context, ResourceType.DRAWABLE, name),
|
||||
context.theme,
|
||||
)
|
||||
drawable.setTint(config.overlayTextColor)
|
||||
@@ -86,7 +87,7 @@ class SwipeControlsOverlayLayout(
|
||||
|
||||
// Initialize horizontal progress bar.
|
||||
val screenWidth = resources.displayMetrics.widthPixels
|
||||
val layoutWidth = (screenWidth * 4 / 5).toInt() // Cap at ~360dp.
|
||||
val layoutWidth = (screenWidth * 4 / 5) // Cap at ~360dp.
|
||||
horizontalProgressView = HorizontalProgressView(
|
||||
context,
|
||||
config.overlayBackgroundOpacity,
|
||||
@@ -630,7 +631,7 @@ class VerticalProgressView(
|
||||
if (isMinimalStyle) {
|
||||
canvas.drawText(displayText, textX, textStartY, textPaint)
|
||||
} else {
|
||||
val progressStartY = (iconEndY + padding).toFloat()
|
||||
val progressStartY = (iconEndY + padding)
|
||||
val progressEndY = textStartY - textPaint.textSize - padding
|
||||
val progressHeight = progressEndY - progressStartY
|
||||
|
||||
|
||||
@@ -38,6 +38,7 @@ import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import app.revanced.extension.shared.Logger;
|
||||
import app.revanced.extension.shared.ResourceType;
|
||||
import app.revanced.extension.shared.Utils;
|
||||
import app.revanced.extension.youtube.patches.VideoInformation;
|
||||
import app.revanced.extension.youtube.patches.playback.quality.RememberVideoQualityPatch;
|
||||
@@ -421,13 +422,13 @@ public class VideoQualityDialogButton {
|
||||
|
||||
private static class CustomQualityAdapter extends ArrayAdapter<String> {
|
||||
private static final int CUSTOM_LIST_ITEM_CHECKED_ID = Utils.getResourceIdentifier(
|
||||
"revanced_custom_list_item_checked", "layout");
|
||||
ResourceType.LAYOUT, "revanced_custom_list_item_checked");
|
||||
private static final int CHECK_ICON_ID = Utils.getResourceIdentifier(
|
||||
"revanced_check_icon", "id");
|
||||
ResourceType.ID, "revanced_check_icon");
|
||||
private static final int CHECK_ICON_PLACEHOLDER_ID = Utils.getResourceIdentifier(
|
||||
"revanced_check_icon_placeholder", "id");
|
||||
ResourceType.ID, "revanced_check_icon_placeholder");
|
||||
private static final int ITEM_TEXT_ID = Utils.getResourceIdentifier(
|
||||
"revanced_item_text", "id");
|
||||
ResourceType.ID, "revanced_item_text");
|
||||
|
||||
private int selectedPosition = -1;
|
||||
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
[versions]
|
||||
revanced-patcher = "21.0.0"
|
||||
revanced-patcher = "22.0.0"
|
||||
# Tracking https://github.com/google/smali/issues/64.
|
||||
#noinspection GradleDependency
|
||||
smali = "3.0.5"
|
||||
smali = "3.0.8"
|
||||
# 8.3.0 causes java verifier error: https://github.com/ReVanced/revanced-patches/issues/2818.
|
||||
#noinspection GradleDependency
|
||||
agp = "8.2.2"
|
||||
|
||||
@@ -64,10 +64,6 @@ public final class app/revanced/patches/all/misc/debugging/EnableAndroidDebuggin
|
||||
public static final fun getEnableAndroidDebuggingPatch ()Lapp/revanced/patcher/patch/ResourcePatch;
|
||||
}
|
||||
|
||||
public final class app/revanced/patches/all/misc/directory/ChangeDataDirectoryLocationPatchKt {
|
||||
public static final fun getChangeDataDirectoryLocationPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
|
||||
}
|
||||
|
||||
public final class app/revanced/patches/all/misc/directory/documentsprovider/ExportInternalDataDocumentsProviderPatchKt {
|
||||
public static final fun getExportInternalDataDocumentsProviderPatch ()Lapp/revanced/patcher/patch/ResourcePatch;
|
||||
}
|
||||
@@ -152,10 +148,6 @@ public final class app/revanced/patches/angulus/ads/RemoveAdsPatchKt {
|
||||
public static final fun getAngulusPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
|
||||
}
|
||||
|
||||
public final class app/revanced/patches/backdrops/misc/pro/ProUnlockPatchKt {
|
||||
public static final fun getProUnlockPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
|
||||
}
|
||||
|
||||
public final class app/revanced/patches/bandcamp/limitations/RemovePlayLimitsPatchKt {
|
||||
public static final fun getRemovePlayLimitsPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
|
||||
}
|
||||
@@ -232,10 +224,6 @@ public final class app/revanced/patches/googlephotos/misc/gms/GmsCoreSupportPatc
|
||||
public static final fun getGmsCoreSupportPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
|
||||
}
|
||||
|
||||
public final class app/revanced/patches/googlephotos/misc/preferences/RestoreHiddenBackUpWhileChargingTogglePatchKt {
|
||||
public static final fun getRestoreHiddenBackUpWhileChargingTogglePatch ()Lapp/revanced/patcher/patch/BytecodePatch;
|
||||
}
|
||||
|
||||
public final class app/revanced/patches/googlerecorder/restrictions/RemoveDeviceRestrictionsKt {
|
||||
public static final fun getRemoveDeviceRestrictionsPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
|
||||
}
|
||||
@@ -308,14 +296,6 @@ public final class app/revanced/patches/messenger/inbox/HideInboxSubtabsPatchKt
|
||||
public static final fun getHideInboxSubtabsPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
|
||||
}
|
||||
|
||||
public final class app/revanced/patches/messenger/inputfield/DisableSwitchingEmojiToStickerPatchKt {
|
||||
public static final fun getDisableSwitchingEmojiToStickerPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
|
||||
}
|
||||
|
||||
public final class app/revanced/patches/messenger/inputfield/DisableTypingIndicatorPatchKt {
|
||||
public static final fun getDisableTypingIndicatorPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
|
||||
}
|
||||
|
||||
public final class app/revanced/patches/messenger/layout/HideFacebookButtonPatchKt {
|
||||
public static final fun getHideFacebookButtonPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
|
||||
}
|
||||
@@ -328,14 +308,6 @@ public final class app/revanced/patches/messenger/misc/extension/ExtensionPatchK
|
||||
public static final fun getSharedExtensionPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
|
||||
}
|
||||
|
||||
public final class app/revanced/patches/messenger/navbar/RemoveMetaAITabPatchKt {
|
||||
public static final fun getRemoveMetaAITabPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
|
||||
}
|
||||
|
||||
public final class app/revanced/patches/meta/ads/HideAdsPatchKt {
|
||||
public static final fun getHideAdsPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
|
||||
}
|
||||
|
||||
public final class app/revanced/patches/mifitness/misc/locale/ForceEnglishLocalePatchKt {
|
||||
public static final fun getForceEnglishLocalePatch ()Lapp/revanced/patcher/patch/BytecodePatch;
|
||||
}
|
||||
@@ -356,10 +328,6 @@ public final class app/revanced/patches/music/interaction/permanentrepeat/Perman
|
||||
public static final fun getPermanentRepeatPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
|
||||
}
|
||||
|
||||
public final class app/revanced/patches/music/interaction/permanentshuffle/PermanentShufflePatchKt {
|
||||
public static final fun getPermanentShufflePatch ()Lapp/revanced/patcher/patch/BytecodePatch;
|
||||
}
|
||||
|
||||
public final class app/revanced/patches/music/layout/compactheader/HideCategoryBarKt {
|
||||
public static final fun getHideCategoryBar ()Lapp/revanced/patcher/patch/BytecodePatch;
|
||||
}
|
||||
@@ -412,10 +380,6 @@ public final class app/revanced/patches/netguard/broadcasts/removerestriction/Re
|
||||
public static final fun getRemoveBroadcastsRestrictionPatch ()Lapp/revanced/patcher/patch/ResourcePatch;
|
||||
}
|
||||
|
||||
public final class app/revanced/patches/nfctoolsse/misc/pro/UnlockProPatchKt {
|
||||
public static final fun getUnlockProPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
|
||||
}
|
||||
|
||||
public final class app/revanced/patches/nunl/ads/HideAdsPatchKt {
|
||||
public static final fun getHideAdsPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
|
||||
}
|
||||
@@ -424,10 +388,6 @@ public final class app/revanced/patches/nunl/firebase/SpoofCertificatePatchKt {
|
||||
public static final fun getSpoofCertificatePatch ()Lapp/revanced/patcher/patch/BytecodePatch;
|
||||
}
|
||||
|
||||
public final class app/revanced/patches/nyx/misc/pro/UnlockProPatchKt {
|
||||
public static final fun getUnlockProPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
|
||||
}
|
||||
|
||||
public final class app/revanced/patches/openinghours/misc/fix/crash/FixCrashPatchKt {
|
||||
public static final fun getFixCrashPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
|
||||
}
|
||||
@@ -654,16 +614,11 @@ public final class app/revanced/patches/reddit/customclients/sync/syncforreddit/
|
||||
public static final fun getFixVideoDownloadsPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
|
||||
}
|
||||
|
||||
public final class app/revanced/patches/reddit/customclients/syncforreddit/fix/video/FixVideoDownloadsPatchKt {
|
||||
public static final fun getFixVideoDownloadsPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
|
||||
}
|
||||
|
||||
public final class app/revanced/patches/reddit/layout/disablescreenshotpopup/DisableScreenshotPopupPatchKt {
|
||||
public static final fun getDisableScreenshotPopupPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
|
||||
}
|
||||
|
||||
public final class app/revanced/patches/reddit/layout/premiumicon/UnlockPremiumIconPatchKt {
|
||||
public static final fun getUnlockPremiumIconPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
|
||||
public static final fun getUnlockPremiumIconsPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
|
||||
}
|
||||
|
||||
@@ -689,26 +644,22 @@ public final class app/revanced/patches/shared/misc/extension/ExtensionHook {
|
||||
|
||||
public final class app/revanced/patches/shared/misc/extension/SharedExtensionPatchKt {
|
||||
public static final fun extensionHook (Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;Lapp/revanced/patcher/Fingerprint;)Lapp/revanced/patches/shared/misc/extension/ExtensionHook;
|
||||
public static final fun extensionHook (Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function1;)Lapp/revanced/patches/shared/misc/extension/ExtensionHook;
|
||||
public static final fun extensionHook (Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function1;)Lkotlin/jvm/functions/Function0;
|
||||
public static synthetic fun extensionHook$default (Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;Lapp/revanced/patcher/Fingerprint;ILjava/lang/Object;)Lapp/revanced/patches/shared/misc/extension/ExtensionHook;
|
||||
public static synthetic fun extensionHook$default (Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lapp/revanced/patches/shared/misc/extension/ExtensionHook;
|
||||
public static final fun sharedExtensionPatch (Ljava/lang/String;[Lapp/revanced/patches/shared/misc/extension/ExtensionHook;)Lapp/revanced/patcher/patch/BytecodePatch;
|
||||
public static final fun sharedExtensionPatch ([Lapp/revanced/patches/shared/misc/extension/ExtensionHook;)Lapp/revanced/patcher/patch/BytecodePatch;
|
||||
public static synthetic fun extensionHook$default (Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lkotlin/jvm/functions/Function0;
|
||||
public static final fun sharedExtensionPatch (Ljava/lang/String;[Lkotlin/jvm/functions/Function0;)Lapp/revanced/patcher/patch/BytecodePatch;
|
||||
public static final fun sharedExtensionPatch ([Lkotlin/jvm/functions/Function0;)Lapp/revanced/patcher/patch/BytecodePatch;
|
||||
}
|
||||
|
||||
public final class app/revanced/patches/shared/misc/fix/verticalscroll/VerticalScrollPatchKt {
|
||||
public static final fun getVerticalScrollPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
|
||||
}
|
||||
|
||||
public final class app/revanced/patches/shared/misc/gms/FingerprintsKt {
|
||||
public static final field GET_GMS_CORE_VENDOR_GROUP_ID_METHOD_NAME Ljava/lang/String;
|
||||
}
|
||||
|
||||
public final class app/revanced/patches/shared/misc/gms/GmsCoreSupportPatchKt {
|
||||
public static final fun gmsCoreSupportPatch (Ljava/lang/String;Ljava/lang/String;Lapp/revanced/patcher/Fingerprint;Ljava/util/Set;Lapp/revanced/patcher/Fingerprint;Lapp/revanced/patcher/patch/Patch;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)Lapp/revanced/patcher/patch/BytecodePatch;
|
||||
public static synthetic fun gmsCoreSupportPatch$default (Ljava/lang/String;Ljava/lang/String;Lapp/revanced/patcher/Fingerprint;Ljava/util/Set;Lapp/revanced/patcher/Fingerprint;Lapp/revanced/patcher/patch/Patch;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lapp/revanced/patcher/patch/BytecodePatch;
|
||||
public static final fun gmsCoreSupportResourcePatch (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lapp/revanced/patcher/patch/Option;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)Lapp/revanced/patcher/patch/ResourcePatch;
|
||||
public static synthetic fun gmsCoreSupportResourcePatch$default (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lapp/revanced/patcher/patch/Option;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lapp/revanced/patcher/patch/ResourcePatch;
|
||||
public static final fun gmsCoreSupportResourcePatch (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lapp/revanced/patcher/patch/Option;ZLkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)Lapp/revanced/patcher/patch/ResourcePatch;
|
||||
public static synthetic fun gmsCoreSupportResourcePatch$default (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lapp/revanced/patcher/patch/Option;ZLkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lapp/revanced/patcher/patch/ResourcePatch;
|
||||
}
|
||||
|
||||
public final class app/revanced/patches/shared/misc/hex/HexPatchBuilder : java/util/Set, kotlin/jvm/internal/markers/KMappedMarker {
|
||||
@@ -747,23 +698,64 @@ public final class app/revanced/patches/shared/misc/hex/Replacement {
|
||||
}
|
||||
|
||||
public final class app/revanced/patches/shared/misc/mapping/ResourceElement {
|
||||
public final fun component1 ()Ljava/lang/String;
|
||||
public fun <init> (Lapp/revanced/patches/shared/misc/mapping/ResourceType;Ljava/lang/String;J)V
|
||||
public final fun component1 ()Lapp/revanced/patches/shared/misc/mapping/ResourceType;
|
||||
public final fun component2 ()Ljava/lang/String;
|
||||
public final fun component3 ()J
|
||||
public final fun copy (Ljava/lang/String;Ljava/lang/String;J)Lapp/revanced/patches/shared/misc/mapping/ResourceElement;
|
||||
public static synthetic fun copy$default (Lapp/revanced/patches/shared/misc/mapping/ResourceElement;Ljava/lang/String;Ljava/lang/String;JILjava/lang/Object;)Lapp/revanced/patches/shared/misc/mapping/ResourceElement;
|
||||
public final fun copy (Lapp/revanced/patches/shared/misc/mapping/ResourceType;Ljava/lang/String;J)Lapp/revanced/patches/shared/misc/mapping/ResourceElement;
|
||||
public static synthetic fun copy$default (Lapp/revanced/patches/shared/misc/mapping/ResourceElement;Lapp/revanced/patches/shared/misc/mapping/ResourceType;Ljava/lang/String;JILjava/lang/Object;)Lapp/revanced/patches/shared/misc/mapping/ResourceElement;
|
||||
public fun equals (Ljava/lang/Object;)Z
|
||||
public final fun getId ()J
|
||||
public final fun getName ()Ljava/lang/String;
|
||||
public final fun getType ()Ljava/lang/String;
|
||||
public final fun getType ()Lapp/revanced/patches/shared/misc/mapping/ResourceType;
|
||||
public fun hashCode ()I
|
||||
public fun toString ()Ljava/lang/String;
|
||||
}
|
||||
|
||||
public final class app/revanced/patches/shared/misc/mapping/ResourceMappingPatchKt {
|
||||
public static final fun get (Ljava/util/List;Ljava/lang/String;Ljava/lang/String;)J
|
||||
public static final fun getResourceElements ()Ljava/util/Collection;
|
||||
public static final fun getResourceId (Lapp/revanced/patches/shared/misc/mapping/ResourceType;Ljava/lang/String;)J
|
||||
public static final fun getResourceMappingPatch ()Lapp/revanced/patcher/patch/ResourcePatch;
|
||||
public static final fun getResourceMappings ()Ljava/util/List;
|
||||
public static final fun hasResourceId (Lapp/revanced/patches/shared/misc/mapping/ResourceType;Ljava/lang/String;)Z
|
||||
public static final fun resourceLiteral (Lapp/revanced/patches/shared/misc/mapping/ResourceType;Ljava/lang/String;I)Lapp/revanced/patcher/LiteralFilter;
|
||||
public static synthetic fun resourceLiteral$default (Lapp/revanced/patches/shared/misc/mapping/ResourceType;Ljava/lang/String;IILjava/lang/Object;)Lapp/revanced/patcher/LiteralFilter;
|
||||
}
|
||||
|
||||
public final class app/revanced/patches/shared/misc/mapping/ResourceType : java/lang/Enum {
|
||||
public static final field ANIM Lapp/revanced/patches/shared/misc/mapping/ResourceType;
|
||||
public static final field ANIMATOR Lapp/revanced/patches/shared/misc/mapping/ResourceType;
|
||||
public static final field ARRAY Lapp/revanced/patches/shared/misc/mapping/ResourceType;
|
||||
public static final field ATTR Lapp/revanced/patches/shared/misc/mapping/ResourceType;
|
||||
public static final field BOOL Lapp/revanced/patches/shared/misc/mapping/ResourceType;
|
||||
public static final field COLOR Lapp/revanced/patches/shared/misc/mapping/ResourceType;
|
||||
public static final field Companion Lapp/revanced/patches/shared/misc/mapping/ResourceType$Companion;
|
||||
public static final field DIMEN Lapp/revanced/patches/shared/misc/mapping/ResourceType;
|
||||
public static final field DRAWABLE Lapp/revanced/patches/shared/misc/mapping/ResourceType;
|
||||
public static final field FONT Lapp/revanced/patches/shared/misc/mapping/ResourceType;
|
||||
public static final field FRACTION Lapp/revanced/patches/shared/misc/mapping/ResourceType;
|
||||
public static final field ID Lapp/revanced/patches/shared/misc/mapping/ResourceType;
|
||||
public static final field INTEGER Lapp/revanced/patches/shared/misc/mapping/ResourceType;
|
||||
public static final field INTERPOLATOR Lapp/revanced/patches/shared/misc/mapping/ResourceType;
|
||||
public static final field LAYOUT Lapp/revanced/patches/shared/misc/mapping/ResourceType;
|
||||
public static final field MENU Lapp/revanced/patches/shared/misc/mapping/ResourceType;
|
||||
public static final field MIPMAP Lapp/revanced/patches/shared/misc/mapping/ResourceType;
|
||||
public static final field NAVIGATION Lapp/revanced/patches/shared/misc/mapping/ResourceType;
|
||||
public static final field PLURALS Lapp/revanced/patches/shared/misc/mapping/ResourceType;
|
||||
public static final field RAW Lapp/revanced/patches/shared/misc/mapping/ResourceType;
|
||||
public static final field STRING Lapp/revanced/patches/shared/misc/mapping/ResourceType;
|
||||
public static final field STYLE Lapp/revanced/patches/shared/misc/mapping/ResourceType;
|
||||
public static final field STYLEABLE Lapp/revanced/patches/shared/misc/mapping/ResourceType;
|
||||
public static final field TRANSITION Lapp/revanced/patches/shared/misc/mapping/ResourceType;
|
||||
public static final field VALUES Lapp/revanced/patches/shared/misc/mapping/ResourceType;
|
||||
public static final field XML Lapp/revanced/patches/shared/misc/mapping/ResourceType;
|
||||
public static fun getEntries ()Lkotlin/enums/EnumEntries;
|
||||
public final fun getValue ()Ljava/lang/String;
|
||||
public static fun valueOf (Ljava/lang/String;)Lapp/revanced/patches/shared/misc/mapping/ResourceType;
|
||||
public static fun values ()[Lapp/revanced/patches/shared/misc/mapping/ResourceType;
|
||||
}
|
||||
|
||||
public final class app/revanced/patches/shared/misc/mapping/ResourceType$Companion {
|
||||
public final fun fromValue (Ljava/lang/String;)Lapp/revanced/patches/shared/misc/mapping/ResourceType;
|
||||
}
|
||||
|
||||
public final class app/revanced/patches/shared/misc/pairip/license/DisableLicenseCheckPatchKt {
|
||||
@@ -773,7 +765,6 @@ public final class app/revanced/patches/shared/misc/pairip/license/DisableLicens
|
||||
public final class app/revanced/patches/shared/misc/settings/SettingsPatchKt {
|
||||
public static final fun overrideThemeColors (Ljava/lang/String;Ljava/lang/String;)V
|
||||
public static final fun settingsPatch (Ljava/util/List;Ljava/util/Set;)Lapp/revanced/patcher/patch/ResourcePatch;
|
||||
public static final fun settingsPatch (Lkotlin/Pair;Ljava/util/Set;)Lapp/revanced/patcher/patch/ResourcePatch;
|
||||
public static synthetic fun settingsPatch$default (Ljava/util/List;Ljava/util/Set;ILjava/lang/Object;)Lapp/revanced/patcher/patch/ResourcePatch;
|
||||
}
|
||||
|
||||
@@ -866,8 +857,8 @@ public final class app/revanced/patches/shared/misc/settings/preference/ListPref
|
||||
public fun <init> ()V
|
||||
public fun <init> (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lapp/revanced/util/resource/ArrayResource;Lapp/revanced/util/resource/ArrayResource;)V
|
||||
public synthetic fun <init> (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lapp/revanced/util/resource/ArrayResource;Lapp/revanced/util/resource/ArrayResource;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
|
||||
public fun <init> (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
|
||||
public synthetic fun <init> (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
|
||||
public fun <init> (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
|
||||
public synthetic fun <init> (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
|
||||
public final fun getEntries ()Lapp/revanced/util/resource/ArrayResource;
|
||||
public final fun getEntriesKey ()Ljava/lang/String;
|
||||
public final fun getEntryValues ()Lapp/revanced/util/resource/ArrayResource;
|
||||
@@ -979,14 +970,6 @@ public final class app/revanced/patches/spotify/layout/theme/CustomThemePatchKt
|
||||
public static final fun getCustomThemePatch ()Lapp/revanced/patcher/patch/ResourcePatch;
|
||||
}
|
||||
|
||||
public final class app/revanced/patches/spotify/lite/ondemand/OnDemandPatchKt {
|
||||
public static final fun getOnDemandPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
|
||||
}
|
||||
|
||||
public final class app/revanced/patches/spotify/misc/UnlockPremiumPatchKt {
|
||||
public static final fun getUnlockPremiumPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
|
||||
}
|
||||
|
||||
public final class app/revanced/patches/spotify/misc/extension/ExtensionPatchKt {
|
||||
public static final fun getSharedExtensionPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
|
||||
}
|
||||
@@ -995,14 +978,6 @@ public final class app/revanced/patches/spotify/misc/fix/SpoofClientPatchKt {
|
||||
public static final fun getSpoofClientPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
|
||||
}
|
||||
|
||||
public final class app/revanced/patches/spotify/misc/fix/SpoofPackageInfoPatchKt {
|
||||
public static final fun getSpoofPackageInfoPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
|
||||
}
|
||||
|
||||
public final class app/revanced/patches/spotify/misc/fix/SpoofSignaturePatchKt {
|
||||
public static final fun getSpoofSignaturePatch ()Lapp/revanced/patcher/patch/BytecodePatch;
|
||||
}
|
||||
|
||||
public final class app/revanced/patches/spotify/misc/fix/login/FixFacebookLoginPatchKt {
|
||||
public static final fun getFixFacebookLoginPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
|
||||
}
|
||||
@@ -1019,10 +994,6 @@ public final class app/revanced/patches/spotify/misc/widgets/FixThirdPartyLaunch
|
||||
public static final fun getFixThirdPartyLaunchersWidgets ()Lapp/revanced/patcher/patch/BytecodePatch;
|
||||
}
|
||||
|
||||
public final class app/revanced/patches/spotify/navbar/PremiumNavbarTabPatchKt {
|
||||
public static final fun getPremiumNavbarTabPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
|
||||
}
|
||||
|
||||
public final class app/revanced/patches/stocard/layout/HideOffersTabPatchKt {
|
||||
public static final fun getHideOffersTabPatch ()Lapp/revanced/patcher/patch/ResourcePatch;
|
||||
}
|
||||
@@ -1239,10 +1210,6 @@ public final class app/revanced/patches/twitter/misc/links/SanitizeSharingLinksP
|
||||
public static final fun getSanitizeSharingLinksPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
|
||||
}
|
||||
|
||||
public final class app/revanced/patches/vsco/misc/pro/UnlockProPatchKt {
|
||||
public static final fun getUnlockProPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
|
||||
}
|
||||
|
||||
public final class app/revanced/patches/warnwetter/misc/firebasegetcert/FirebaseGetCertPatchKt {
|
||||
public static final fun getFirebaseGetCertPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
|
||||
}
|
||||
@@ -1251,10 +1218,6 @@ public final class app/revanced/patches/warnwetter/misc/promocode/PromoCodeUnloc
|
||||
public static final fun getPromoCodeUnlockPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
|
||||
}
|
||||
|
||||
public final class app/revanced/patches/windyapp/misc/unlockpro/UnlockProPatchKt {
|
||||
public static final fun getUnlockProPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
|
||||
}
|
||||
|
||||
public final class app/revanced/patches/youtube/ad/general/HideAdsPatchKt {
|
||||
public static final fun getHideAdsPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
|
||||
}
|
||||
@@ -1276,7 +1239,6 @@ public final class app/revanced/patches/youtube/interaction/dialog/RemoveViewerD
|
||||
}
|
||||
|
||||
public final class app/revanced/patches/youtube/interaction/doubletap/DisableChapterSkipDoubleTapPatchKt {
|
||||
public static final fun getDisableChapterSkipDoubleTapPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
|
||||
public static final fun getDisableDoubleTapActionsPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
|
||||
}
|
||||
|
||||
@@ -1353,15 +1315,7 @@ public final class app/revanced/patches/youtube/layout/hide/fullscreenambientmod
|
||||
}
|
||||
|
||||
public final class app/revanced/patches/youtube/layout/hide/general/HideLayoutComponentsPatchKt {
|
||||
public static final fun getAlbumCardId ()J
|
||||
public static final fun getBarContainerHeightId ()J
|
||||
public static final fun getCrowdfundingBoxId ()J
|
||||
public static final fun getExpandButtonDownId ()J
|
||||
public static final fun getFabButtonId ()J
|
||||
public static final fun getFilterBarHeightId ()J
|
||||
public static final fun getHideLayoutComponentsPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
|
||||
public static final fun getRelatedChipCloudMarginId ()J
|
||||
public static final fun getYouTubeLogo ()J
|
||||
}
|
||||
|
||||
public final class app/revanced/patches/youtube/layout/hide/infocards/HideInfoCardsPatchKt {
|
||||
@@ -1380,10 +1334,6 @@ public final class app/revanced/patches/youtube/layout/hide/rollingnumber/Disabl
|
||||
public static final fun getDisableRollingNumberAnimationPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
|
||||
}
|
||||
|
||||
public final class app/revanced/patches/youtube/layout/hide/seekbar/HideSeekbarPatchKt {
|
||||
public static final fun getHideSeekbarPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
|
||||
}
|
||||
|
||||
public final class app/revanced/patches/youtube/layout/hide/shorts/HideShortsComponentsPatchKt {
|
||||
public static final fun getHideShortsComponentsPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
|
||||
}
|
||||
@@ -1392,10 +1342,6 @@ public final class app/revanced/patches/youtube/layout/hide/signintotvpopup/Disa
|
||||
public static final fun getDisableSignInToTvPopupPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
|
||||
}
|
||||
|
||||
public final class app/revanced/patches/youtube/layout/hide/suggestedvideoendscreen/DisableSuggestedVideoEndScreenPatchKt {
|
||||
public static final fun getDisableSuggestedVideoEndScreenPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
|
||||
}
|
||||
|
||||
public final class app/revanced/patches/youtube/layout/hide/time/HideTimestampPatchKt {
|
||||
public static final fun getHideTimestampPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
|
||||
}
|
||||
@@ -1408,14 +1354,6 @@ public final class app/revanced/patches/youtube/layout/panels/popup/PlayerPopupP
|
||||
public static final fun getPlayerPopupPanelsPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
|
||||
}
|
||||
|
||||
public final class app/revanced/patches/youtube/layout/player/background/PlayerControlsBackgroundPatchKt {
|
||||
public static final fun getPlayerControlsBackgroundPatch ()Lapp/revanced/patcher/patch/ResourcePatch;
|
||||
}
|
||||
|
||||
public final class app/revanced/patches/youtube/layout/player/fullscreen/OpenVideosFullscreenKt {
|
||||
public static final fun getOpenVideosFullscreen ()Lapp/revanced/patcher/patch/BytecodePatch;
|
||||
}
|
||||
|
||||
public final class app/revanced/patches/youtube/layout/player/fullscreen/OpenVideosFullscreenPatchKt {
|
||||
public static final fun getOpenVideosFullscreenPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
|
||||
}
|
||||
@@ -1470,10 +1408,6 @@ public final class app/revanced/patches/youtube/layout/startupshortsreset/Disabl
|
||||
public static final fun getDisableResumingShortsOnStartupPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
|
||||
}
|
||||
|
||||
public final class app/revanced/patches/youtube/layout/tablet/EnableTabletLayoutPatchKt {
|
||||
public static final fun getEnableTabletLayoutPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
|
||||
}
|
||||
|
||||
public final class app/revanced/patches/youtube/layout/theme/LithoColorHookPatchKt {
|
||||
public static final fun getLithoColorHookPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
|
||||
public static final fun getLithoColorOverrideHook ()Lkotlin/jvm/functions/Function2;
|
||||
@@ -1519,14 +1453,6 @@ public final class app/revanced/patches/youtube/misc/extension/SharedExtensionPa
|
||||
public static final fun getSharedExtensionPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
|
||||
}
|
||||
|
||||
public final class app/revanced/patches/youtube/misc/fix/playback/SpoofVideoStreamsPatchKt {
|
||||
public static final fun getSpoofVideoStreamsPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
|
||||
}
|
||||
|
||||
public final class app/revanced/patches/youtube/misc/fix/playback/UserAgentClientSpoofPatchKt {
|
||||
public static final fun getUserAgentClientSpoofPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
|
||||
}
|
||||
|
||||
public final class app/revanced/patches/youtube/misc/fix/playbackspeed/FIxPlaybackSpeedWhilePlayingPatchKt {
|
||||
public static final fun getFixPlaybackSpeedWhilePlayingPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
|
||||
}
|
||||
@@ -1574,7 +1500,6 @@ public final class app/revanced/patches/youtube/misc/playercontrols/PlayerContro
|
||||
public final class app/revanced/patches/youtube/misc/playercontrols/PlayerControlsPatchKt {
|
||||
public static final fun getAddBottomControl ()Lkotlin/jvm/functions/Function1;
|
||||
public static final fun getPlayerControlsPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
|
||||
public static final fun getPlayerControlsResourcePatch ()Lapp/revanced/patcher/patch/ResourcePatch;
|
||||
public static final fun initializeBottomControl (Ljava/lang/String;)V
|
||||
public static final fun injectVisibilityCheckCall (Ljava/lang/String;)V
|
||||
}
|
||||
@@ -1585,9 +1510,6 @@ public final class app/revanced/patches/youtube/misc/playertype/PlayerTypeHookPa
|
||||
|
||||
public final class app/revanced/patches/youtube/misc/playservice/VersionCheckPatchKt {
|
||||
public static final fun getVersionCheckPatch ()Lapp/revanced/patcher/patch/ResourcePatch;
|
||||
public static final fun is_19_03_or_greater ()Z
|
||||
public static final fun is_19_04_or_greater ()Z
|
||||
public static final fun is_19_16_or_greater ()Z
|
||||
public static final fun is_19_17_or_greater ()Z
|
||||
public static final fun is_19_18_or_greater ()Z
|
||||
public static final fun is_19_23_or_greater ()Z
|
||||
@@ -1612,6 +1534,15 @@ public final class app/revanced/patches/youtube/misc/playservice/VersionCheckPat
|
||||
public static final fun is_20_10_or_greater ()Z
|
||||
public static final fun is_20_14_or_greater ()Z
|
||||
public static final fun is_20_15_or_greater ()Z
|
||||
public static final fun is_20_19_or_greater ()Z
|
||||
public static final fun is_20_20_or_greater ()Z
|
||||
public static final fun is_20_21_or_greater ()Z
|
||||
public static final fun is_20_22_or_greater ()Z
|
||||
public static final fun is_20_26_or_greater ()Z
|
||||
public static final fun is_20_28_or_greater ()Z
|
||||
public static final fun is_20_30_or_greater ()Z
|
||||
public static final fun is_20_31_or_greater ()Z
|
||||
public static final fun is_20_34_or_greater ()Z
|
||||
}
|
||||
|
||||
public final class app/revanced/patches/youtube/misc/privacy/RemoveTrackingQueryParameterPatchKt {
|
||||
@@ -1654,10 +1585,6 @@ public final class app/revanced/patches/youtube/misc/spoof/UserAgentClientSpoofP
|
||||
public static final fun getUserAgentClientSpoofPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
|
||||
}
|
||||
|
||||
public final class app/revanced/patches/youtube/misc/zoomhaptics/ZoomHapticsPatchKt {
|
||||
public static final fun getZoomHapticsPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
|
||||
}
|
||||
|
||||
public final class app/revanced/patches/youtube/video/audio/ForceOriginalAudioPatchKt {
|
||||
public static final fun getForceOriginalAudioPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
|
||||
}
|
||||
@@ -1722,14 +1649,6 @@ public final class app/revanced/patches/youtube/video/videoid/VideoIdPatchKt {
|
||||
public static final fun hookVideoId (Ljava/lang/String;)V
|
||||
}
|
||||
|
||||
public final class app/revanced/patches/youtube/video/videoqualitymenu/RestoreOldVideoQualityMenuPatchKt {
|
||||
public static final fun getRestoreOldVideoQualityMenuPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
|
||||
}
|
||||
|
||||
public final class app/revanced/patches/yuka/misc/unlockpremium/UnlockPremiumPatchKt {
|
||||
public static final fun getUnlockPremiumPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
|
||||
}
|
||||
|
||||
public final class app/revanced/util/BytecodeUtilsKt {
|
||||
public static final fun addInstructionsAtControlFlowLabel (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;ILjava/lang/String;)V
|
||||
public static final fun addInstructionsAtControlFlowLabel (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;ILjava/lang/String;[Lapp/revanced/patcher/util/smali/ExternalLabel;)V
|
||||
@@ -1779,6 +1698,7 @@ public final class app/revanced/util/BytecodeUtilsKt {
|
||||
public static final fun indexOfFirstResourceIdOrThrow (Lcom/android/tools/smali/dexlib2/iface/Method;Ljava/lang/String;)I
|
||||
public static final fun injectHideViewCall (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;IILjava/lang/String;Ljava/lang/String;)V
|
||||
public static final fun literal (Lapp/revanced/patcher/FingerprintBuilder;Lkotlin/jvm/functions/Function0;)V
|
||||
public static final fun returnEarly (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;)V
|
||||
public static final fun returnEarly (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;B)V
|
||||
public static final fun returnEarly (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;C)V
|
||||
public static final fun returnEarly (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;D)V
|
||||
@@ -1786,9 +1706,9 @@ public final class app/revanced/util/BytecodeUtilsKt {
|
||||
public static final fun returnEarly (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;I)V
|
||||
public static final fun returnEarly (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;J)V
|
||||
public static final fun returnEarly (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;Ljava/lang/String;)V
|
||||
public static final fun returnEarly (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;Ljava/lang/Void;)V
|
||||
public static final fun returnEarly (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;S)V
|
||||
public static final fun returnEarly (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;Z)V
|
||||
public static synthetic fun returnEarly$default (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;ZILjava/lang/Object;)V
|
||||
public static final fun returnLate (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;B)V
|
||||
public static final fun returnLate (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;C)V
|
||||
public static final fun returnLate (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;D)V
|
||||
@@ -1796,6 +1716,7 @@ public final class app/revanced/util/BytecodeUtilsKt {
|
||||
public static final fun returnLate (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;I)V
|
||||
public static final fun returnLate (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;J)V
|
||||
public static final fun returnLate (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;Ljava/lang/String;)V
|
||||
public static final fun returnLate (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;Ljava/lang/Void;)V
|
||||
public static final fun returnLate (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;S)V
|
||||
public static final fun returnLate (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;Z)V
|
||||
public static final fun transformMethods (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableClass;Lkotlin/jvm/functions/Function1;)V
|
||||
|
||||
@@ -12,6 +12,12 @@ patches {
|
||||
}
|
||||
}
|
||||
|
||||
repositories {
|
||||
mavenLocal()
|
||||
gradlePluginPortal()
|
||||
google()
|
||||
}
|
||||
|
||||
dependencies {
|
||||
// Required due to smali, or build fails. Can be removed once smali is bumped.
|
||||
implementation(libs.guava)
|
||||
|
||||
@@ -1,19 +0,0 @@
|
||||
package app.revanced.patches.all.misc.directory
|
||||
|
||||
import app.revanced.patcher.patch.bytecodePatch
|
||||
import app.revanced.patches.all.misc.directory.documentsprovider.exportInternalDataDocumentsProviderPatch
|
||||
|
||||
@Suppress("unused")
|
||||
@Deprecated(
|
||||
"Superseded by internalDataDocumentsProviderPatch",
|
||||
ReplaceWith("internalDataDocumentsProviderPatch"),
|
||||
)
|
||||
val changeDataDirectoryLocationPatch = bytecodePatch(
|
||||
// name = "Change data directory location",
|
||||
description = "Changes the data directory in the application from " +
|
||||
"the app internal storage directory to /sdcard/android/data accessible by root-less devices." +
|
||||
"Using this patch can cause unexpected issues with some apps.",
|
||||
use = false,
|
||||
) {
|
||||
dependsOn(exportInternalDataDocumentsProviderPatch)
|
||||
}
|
||||
@@ -36,7 +36,7 @@ fun <T> transformInstructionsPatch(
|
||||
}
|
||||
}.forEach { (classDef, methods) ->
|
||||
// And finally transform the methods...
|
||||
val mutableClass = proxy(classDef).mutableClass
|
||||
val mutableClass = mutableClassBy(classDef)
|
||||
|
||||
methods.map(mutableClass::findMutableMethodOf).forEach methods@{ mutableMethod ->
|
||||
val patchIndices = findPatchIndices(mutableClass, mutableMethod)?.toCollection(ArrayDeque())
|
||||
|
||||
@@ -3,7 +3,7 @@ package app.revanced.patches.amazon
|
||||
import app.revanced.patcher.fingerprint
|
||||
import com.android.tools.smali.dexlib2.AccessFlags
|
||||
|
||||
internal val deepLinkingFingerprint = fingerprint {
|
||||
internal val deepLinkingFingerprint by fingerprint {
|
||||
accessFlags(AccessFlags.PRIVATE)
|
||||
returns("Z")
|
||||
parameters("L")
|
||||
|
||||
@@ -11,7 +11,7 @@ import com.android.tools.smali.dexlib2.AccessFlags
|
||||
|
||||
// This fingerprint targets a method that returns the daily measurement count.
|
||||
// This method is used to determine if the user has reached the daily limit of measurements.
|
||||
internal val getDailyMeasurementCountFingerprint = fingerprint {
|
||||
internal val getDailyMeasurementCountFingerprint by fingerprint {
|
||||
accessFlags(AccessFlags.PRIVATE)
|
||||
returns("I")
|
||||
strings("dailyMeasurementCount")
|
||||
|
||||
@@ -1,19 +0,0 @@
|
||||
package app.revanced.patches.backdrops.misc.pro
|
||||
|
||||
import app.revanced.patcher.fingerprint
|
||||
import com.android.tools.smali.dexlib2.Opcode
|
||||
|
||||
@Deprecated("Fingerprint no longer resolves and will soon be deleted.")
|
||||
internal val proUnlockFingerprint = fingerprint {
|
||||
opcodes(
|
||||
Opcode.INVOKE_VIRTUAL,
|
||||
Opcode.MOVE_RESULT_OBJECT,
|
||||
Opcode.INVOKE_INTERFACE,
|
||||
Opcode.MOVE_RESULT,
|
||||
Opcode.IF_EQZ,
|
||||
)
|
||||
custom { method, _ ->
|
||||
method.name == "lambda\$existPurchase\$0" &&
|
||||
method.definingClass == "Lcom/backdrops/wallpapers/data/local/DatabaseHandlerIAB;"
|
||||
}
|
||||
}
|
||||
@@ -1,24 +0,0 @@
|
||||
package app.revanced.patches.backdrops.misc.pro
|
||||
|
||||
import app.revanced.patcher.extensions.InstructionExtensions.addInstruction
|
||||
import app.revanced.patcher.extensions.InstructionExtensions.getInstruction
|
||||
import app.revanced.patcher.patch.bytecodePatch
|
||||
import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
|
||||
|
||||
@Suppress("unused")
|
||||
@Deprecated("This patch no longer works and will soon be deleted.")
|
||||
val proUnlockPatch = bytecodePatch{
|
||||
compatibleWith("com.backdrops.wallpapers")
|
||||
|
||||
execute {
|
||||
val registerIndex = proUnlockFingerprint.patternMatch!!.endIndex - 1
|
||||
|
||||
proUnlockFingerprint.method.apply {
|
||||
val register = getInstruction<OneRegisterInstruction>(registerIndex).registerA
|
||||
addInstruction(
|
||||
proUnlockFingerprint.patternMatch!!.endIndex,
|
||||
"const/4 v$register, 0x1",
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -2,6 +2,6 @@ package app.revanced.patches.bandcamp.limitations
|
||||
|
||||
import app.revanced.patcher.fingerprint
|
||||
|
||||
internal val handlePlaybackLimitsFingerprint = fingerprint {
|
||||
internal val handlePlaybackLimitsFingerprint by fingerprint {
|
||||
strings("track_id", "play_count")
|
||||
}
|
||||
|
||||
@@ -2,7 +2,7 @@ package app.revanced.patches.cieid.restrictions.root
|
||||
|
||||
import app.revanced.patcher.fingerprint
|
||||
|
||||
internal val checkRootFingerprint = fingerprint {
|
||||
internal val checkRootFingerprint by fingerprint {
|
||||
custom { method, _ ->
|
||||
method.name == "onResume" && method.definingClass == "Lit/ipzs/cieid/BaseActivity;"
|
||||
}
|
||||
|
||||
@@ -3,12 +3,12 @@ package app.revanced.patches.cricbuzz.ads
|
||||
import app.revanced.patcher.fingerprint
|
||||
import com.android.tools.smali.dexlib2.Opcode
|
||||
|
||||
internal val userStateSwitchFingerprint = fingerprint {
|
||||
internal val userStateSwitchFingerprint by fingerprint {
|
||||
opcodes(Opcode.SPARSE_SWITCH)
|
||||
strings("key.user.state", "NA")
|
||||
}
|
||||
|
||||
internal val cb11ConstructorFingerprint = fingerprint {
|
||||
internal val cb11ConstructorFingerprint by fingerprint {
|
||||
parameters(
|
||||
"Ljava/lang/String;",
|
||||
"Ljava/lang/String;",
|
||||
@@ -26,7 +26,7 @@ internal val cb11ConstructorFingerprint = fingerprint {
|
||||
}
|
||||
}
|
||||
|
||||
internal val getBottomBarFingerprint = fingerprint {
|
||||
internal val getBottomBarFingerprint by fingerprint {
|
||||
custom { method, classDef ->
|
||||
method.name == "getBottomBar" && classDef.endsWith("HomeMenu;")
|
||||
}
|
||||
|
||||
@@ -2,6 +2,6 @@ package app.revanced.patches.crunchyroll.ads
|
||||
|
||||
import app.revanced.patcher.fingerprint
|
||||
|
||||
internal val videoUrlReadyToStringFingerprint = fingerprint {
|
||||
internal val videoUrlReadyToStringFingerprint by fingerprint {
|
||||
strings("VideoUrlReady(url=", ", enableAds=")
|
||||
}
|
||||
|
||||
@@ -19,16 +19,16 @@ val disableAdsPatch = bytecodePatch(
|
||||
// SharedPreferences has a debug boolean value with key "disable_ads", which maps to "DebugCategory.DISABLE_ADS".
|
||||
//
|
||||
// MonetizationDebugSettings seems to be the most general setting to work fine.
|
||||
initializeMonetizationDebugSettingsFingerprint
|
||||
.match(monetizationDebugSettingsToStringFingerprint.classDef)
|
||||
.method.apply {
|
||||
val insertIndex = initializeMonetizationDebugSettingsFingerprint.patternMatch!!.startIndex
|
||||
val register = getInstruction<TwoRegisterInstruction>(insertIndex).registerA
|
||||
initializeMonetizationDebugSettingsFingerprint.match(
|
||||
monetizationDebugSettingsToStringFingerprint.classDef
|
||||
).method.apply {
|
||||
val insertIndex = initializeMonetizationDebugSettingsFingerprint.instructionMatches.first().index
|
||||
val register = getInstruction<TwoRegisterInstruction>(insertIndex).registerA
|
||||
|
||||
addInstructions(
|
||||
insertIndex,
|
||||
"const/4 v$register, 0x1",
|
||||
)
|
||||
}
|
||||
addInstructions(
|
||||
insertIndex,
|
||||
"const/4 v$register, 0x1",
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,14 +4,14 @@ import app.revanced.patcher.fingerprint
|
||||
import com.android.tools.smali.dexlib2.AccessFlags
|
||||
import com.android.tools.smali.dexlib2.Opcode
|
||||
|
||||
internal val initializeMonetizationDebugSettingsFingerprint = fingerprint {
|
||||
internal val initializeMonetizationDebugSettingsFingerprint by fingerprint {
|
||||
accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR)
|
||||
returns("V")
|
||||
// Parameters have not been reliable for fingerprinting between versions.
|
||||
opcodes(Opcode.IPUT_BOOLEAN)
|
||||
}
|
||||
|
||||
internal val monetizationDebugSettingsToStringFingerprint = fingerprint {
|
||||
internal val monetizationDebugSettingsToStringFingerprint by fingerprint {
|
||||
strings("MonetizationDebugSettings(") // Partial string match.
|
||||
custom { method, _ -> method.name == "toString" }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -14,7 +14,7 @@ val enableDebugMenuPatch = bytecodePatch(
|
||||
|
||||
execute {
|
||||
initializeBuildConfigProviderFingerprint.method.apply {
|
||||
val insertIndex = initializeBuildConfigProviderFingerprint.patternMatch!!.startIndex
|
||||
val insertIndex = initializeBuildConfigProviderFingerprint.instructionMatches.first().index
|
||||
val register = getInstruction<TwoRegisterInstruction>(insertIndex).registerA
|
||||
|
||||
addInstructions(
|
||||
|
||||
@@ -11,9 +11,8 @@ import com.android.tools.smali.dexlib2.Opcode
|
||||
* - `isDebug`: compares "release" with "debug" <-- we want to force this to `true`
|
||||
*/
|
||||
|
||||
internal val initializeBuildConfigProviderFingerprint = fingerprint {
|
||||
internal val initializeBuildConfigProviderFingerprint by fingerprint {
|
||||
accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR)
|
||||
returns("V")
|
||||
opcodes(Opcode.IPUT_BOOLEAN)
|
||||
strings("debug", "release", "china")
|
||||
}
|
||||
|
||||
@@ -4,7 +4,7 @@ import app.revanced.patcher.fingerprint
|
||||
import com.android.tools.smali.dexlib2.AccessFlags
|
||||
import com.android.tools.smali.dexlib2.Opcode
|
||||
|
||||
internal val baseModelMapperFingerprint = fingerprint {
|
||||
internal val baseModelMapperFingerprint by fingerprint {
|
||||
accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL)
|
||||
returns("Lcom/facebook/graphql/modelutil/BaseModelWithTree;")
|
||||
parameters("Ljava/lang/Class", "I", "I")
|
||||
@@ -17,7 +17,7 @@ internal val baseModelMapperFingerprint = fingerprint {
|
||||
)
|
||||
}
|
||||
|
||||
internal val getSponsoredDataModelTemplateFingerprint = fingerprint {
|
||||
internal val getSponsoredDataModelTemplateFingerprint by fingerprint {
|
||||
accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL)
|
||||
returns("L")
|
||||
parameters()
|
||||
@@ -33,7 +33,7 @@ internal val getSponsoredDataModelTemplateFingerprint = fingerprint {
|
||||
}
|
||||
}
|
||||
|
||||
internal val getStoryVisibilityFingerprint = fingerprint {
|
||||
internal val getStoryVisibilityFingerprint by fingerprint {
|
||||
accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC)
|
||||
returns("Ljava/lang/String;")
|
||||
opcodes(
|
||||
|
||||
@@ -67,7 +67,7 @@ val hideSponsoredStoriesPatch = bytecodePatch(
|
||||
// Check if the parameter type is GraphQLStory and if sponsoredDataModelGetter returns a non-null value.
|
||||
// If so, hide the story by setting the visibility to StoryVisibility.GONE.
|
||||
getStoryVisibilityFingerprint.method.addInstructionsWithLabels(
|
||||
getStoryVisibilityFingerprint.patternMatch!!.startIndex,
|
||||
getStoryVisibilityFingerprint.instructionMatches.first().index,
|
||||
"""
|
||||
instance-of v0, p0, $graphQlStoryClassDescriptor
|
||||
if-eqz v0, :resume_normal
|
||||
|
||||
@@ -3,11 +3,11 @@ package app.revanced.patches.facebook.ads.story
|
||||
import app.revanced.patcher.fingerprint
|
||||
import com.android.tools.smali.dexlib2.iface.value.StringEncodedValue
|
||||
|
||||
internal val adsInsertionFingerprint = fieldFingerprint(
|
||||
internal val adsInsertionFingerprint by fieldFingerprint(
|
||||
fieldValue = "AdBucketDataSourceUtil\$attemptAdsInsertion\$1",
|
||||
)
|
||||
|
||||
internal val fetchMoreAdsFingerprint = fieldFingerprint(
|
||||
internal val fetchMoreAdsFingerprint by fieldFingerprint(
|
||||
fieldValue = "AdBucketDataSourceUtil\$attemptFetchMoreAds\$1",
|
||||
)
|
||||
|
||||
|
||||
@@ -5,7 +5,7 @@ import com.android.tools.smali.dexlib2.AccessFlags
|
||||
import app.revanced.patcher.fingerprint
|
||||
|
||||
// Located @ at.gv.bmf.bmf2go.taxequalization.tools.utils.AttestationHelper#isBootStateOk (3.0.1)
|
||||
internal val bootStateFingerprint = fingerprint {
|
||||
internal val bootStateFingerprint by fingerprint {
|
||||
accessFlags(AccessFlags.PUBLIC)
|
||||
returns("Z")
|
||||
opcodes(
|
||||
@@ -30,7 +30,7 @@ internal val bootStateFingerprint = fingerprint {
|
||||
}
|
||||
|
||||
// Located @ at.gv.bmf.bmf2go.taxequalization.tools.utils.AttestationHelper#createKey (3.0.1)
|
||||
internal val createKeyFingerprint = fingerprint {
|
||||
internal val createKeyFingerprint by fingerprint {
|
||||
accessFlags(AccessFlags.PUBLIC)
|
||||
returns("Z")
|
||||
strings("attestation", "SHA-256", "random", "EC", "AndroidKeyStore")
|
||||
|
||||
@@ -5,7 +5,7 @@ import com.android.tools.smali.dexlib2.AccessFlags
|
||||
import app.revanced.patcher.fingerprint
|
||||
|
||||
// Located @ at.gv.bmf.bmf2go.taxequalization.tools.utils.RootDetection#isRooted (3.0.1)
|
||||
internal val rootDetectionFingerprint = fingerprint {
|
||||
internal val rootDetectionFingerprint by fingerprint {
|
||||
accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC)
|
||||
returns("L")
|
||||
parameters("L")
|
||||
|
||||
@@ -14,7 +14,7 @@ val enableCustomTabsPatch = bytecodePatch(
|
||||
|
||||
execute {
|
||||
launchCustomTabFingerprint.method.apply {
|
||||
val checkIndex = launchCustomTabFingerprint.patternMatch!!.endIndex + 1
|
||||
val checkIndex = launchCustomTabFingerprint.instructionMatches.last().index + 1
|
||||
val register = getInstruction<OneRegisterInstruction>(checkIndex).registerA
|
||||
|
||||
replaceInstruction(checkIndex, "const/4 v$register, 0x1")
|
||||
|
||||
@@ -4,7 +4,7 @@ import app.revanced.patcher.fingerprint
|
||||
import com.android.tools.smali.dexlib2.AccessFlags
|
||||
import com.android.tools.smali.dexlib2.Opcode
|
||||
|
||||
internal val launchCustomTabFingerprint = fingerprint {
|
||||
internal val launchCustomTabFingerprint by fingerprint {
|
||||
accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR)
|
||||
opcodes(
|
||||
Opcode.IPUT_OBJECT,
|
||||
|
||||
@@ -2,7 +2,7 @@ package app.revanced.patches.googlenews.misc.gms
|
||||
|
||||
import app.revanced.patcher.fingerprint
|
||||
|
||||
internal val magazinesActivityOnCreateFingerprint = fingerprint {
|
||||
internal val magazinesActivityOnCreateFingerprint by fingerprint {
|
||||
custom { methodDef, classDef ->
|
||||
methodDef.name == "onCreate" && classDef.endsWith("/StartActivity;")
|
||||
}
|
||||
|
||||
@@ -2,7 +2,7 @@ package app.revanced.patches.googlephotos.misc.backup
|
||||
|
||||
import app.revanced.patcher.fingerprint
|
||||
|
||||
internal val isDCIMFolderBackupControlDisabled = fingerprint {
|
||||
internal val isDCIMFolderBackupControlDisabled by fingerprint {
|
||||
returns("Z")
|
||||
strings("/dcim", "/mars_files/")
|
||||
}
|
||||
|
||||
@@ -2,6 +2,6 @@ package app.revanced.patches.googlephotos.misc.features
|
||||
|
||||
import app.revanced.patcher.fingerprint
|
||||
|
||||
internal val initializeFeaturesEnumFingerprint = fingerprint {
|
||||
internal val initializeFeaturesEnumFingerprint by fingerprint {
|
||||
strings("com.google.android.apps.photos.NEXUS_PRELOAD")
|
||||
}
|
||||
|
||||
@@ -2,7 +2,7 @@ package app.revanced.patches.googlephotos.misc.gms
|
||||
|
||||
import app.revanced.patcher.fingerprint
|
||||
|
||||
internal val homeActivityOnCreateFingerprint = fingerprint {
|
||||
internal val homeActivityOnCreateFingerprint by fingerprint {
|
||||
custom { methodDef, classDef ->
|
||||
methodDef.name == "onCreate" && classDef.endsWith("/HomeActivity;")
|
||||
}
|
||||
|
||||
@@ -1,8 +0,0 @@
|
||||
package app.revanced.patches.googlephotos.misc.preferences
|
||||
|
||||
import app.revanced.patcher.fingerprint
|
||||
|
||||
internal val backupPreferencesFingerprint = fingerprint {
|
||||
returns("Lcom/google/android/apps/photos/backup/data/BackupPreferences;")
|
||||
strings("backup_prefs_had_backup_only_when_charging_enabled")
|
||||
}
|
||||
@@ -1,30 +0,0 @@
|
||||
package app.revanced.patches.googlephotos.misc.preferences
|
||||
|
||||
import app.revanced.patcher.extensions.InstructionExtensions.addInstruction
|
||||
import app.revanced.patcher.extensions.InstructionExtensions.getInstruction
|
||||
import app.revanced.patcher.patch.bytecodePatch
|
||||
import app.revanced.util.indexOfFirstInstructionOrThrow
|
||||
import com.android.tools.smali.dexlib2.Opcode
|
||||
import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
|
||||
|
||||
@Deprecated("This patch no longer works and this code will soon be deleted")
|
||||
@Suppress("unused")
|
||||
val restoreHiddenBackUpWhileChargingTogglePatch = bytecodePatch(
|
||||
description = "Restores a hidden toggle to only run backups when the device is charging."
|
||||
) {
|
||||
compatibleWith("com.google.android.apps.photos"("7.11.0.705590205"))
|
||||
|
||||
execute {
|
||||
// Patches 'backup_prefs_had_backup_only_when_charging_enabled' to always be true.
|
||||
backupPreferencesFingerprint.let {
|
||||
it.method.apply {
|
||||
val index = indexOfFirstInstructionOrThrow(
|
||||
it.stringMatches!!.first().index,
|
||||
Opcode.MOVE_RESULT
|
||||
)
|
||||
val register = getInstruction<OneRegisterInstruction>(index).registerA
|
||||
addInstruction(index + 1, "const/4 v$register, 0x1")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -2,7 +2,7 @@ package app.revanced.patches.googlerecorder.restrictions
|
||||
|
||||
import app.revanced.patcher.fingerprint
|
||||
|
||||
internal val onApplicationCreateFingerprint = fingerprint {
|
||||
internal val onApplicationCreateFingerprint by fingerprint {
|
||||
strings("com.google.android.feature.PIXEL_2017_EXPERIENCE")
|
||||
custom { method, classDef ->
|
||||
if (method.name != "onCreate") return@custom false
|
||||
|
||||
@@ -14,7 +14,7 @@ val removeDeviceRestrictionsPatch = bytecodePatch(
|
||||
compatibleWith("com.google.android.apps.recorder")
|
||||
|
||||
execute {
|
||||
val featureStringIndex = onApplicationCreateFingerprint.stringMatches!!.first().index
|
||||
val featureStringIndex = onApplicationCreateFingerprint.stringMatches.first().index
|
||||
|
||||
onApplicationCreateFingerprint.method.apply {
|
||||
// Remove check for device restrictions.
|
||||
|
||||
@@ -2,7 +2,7 @@ package app.revanced.patches.hexeditor.ad
|
||||
|
||||
import app.revanced.patcher.fingerprint
|
||||
|
||||
internal val primaryAdsFingerprint = fingerprint {
|
||||
internal val primaryAdsFingerprint by fingerprint {
|
||||
custom { method, classDef ->
|
||||
classDef.endsWith("PreferencesHelper;") && method.name == "isAdsDisabled"
|
||||
}
|
||||
|
||||
@@ -2,7 +2,7 @@ package app.revanced.patches.iconpackstudio.misc.pro
|
||||
|
||||
import app.revanced.patcher.fingerprint
|
||||
|
||||
internal val checkProFingerprint = fingerprint {
|
||||
internal val checkProFingerprint by fingerprint {
|
||||
returns("Z")
|
||||
custom { _, classDef -> classDef.endsWith("IPSPurchaseRepository;") }
|
||||
}
|
||||
@@ -3,7 +3,7 @@ package app.revanced.patches.idaustria.detection.root
|
||||
import app.revanced.patcher.fingerprint
|
||||
import com.android.tools.smali.dexlib2.AccessFlags
|
||||
|
||||
internal val attestationSupportedCheckFingerprint = fingerprint {
|
||||
internal val attestationSupportedCheckFingerprint by fingerprint {
|
||||
accessFlags(AccessFlags.PUBLIC)
|
||||
returns("V")
|
||||
custom { method, classDef ->
|
||||
@@ -12,7 +12,7 @@ internal val attestationSupportedCheckFingerprint = fingerprint {
|
||||
}
|
||||
}
|
||||
|
||||
internal val bootloaderCheckFingerprint = fingerprint {
|
||||
internal val bootloaderCheckFingerprint by fingerprint {
|
||||
accessFlags(AccessFlags.PUBLIC)
|
||||
returns("Z")
|
||||
custom { method, classDef ->
|
||||
@@ -21,7 +21,7 @@ internal val bootloaderCheckFingerprint = fingerprint {
|
||||
}
|
||||
}
|
||||
|
||||
internal val rootCheckFingerprint = fingerprint {
|
||||
internal val rootCheckFingerprint by fingerprint {
|
||||
accessFlags(AccessFlags.PUBLIC)
|
||||
returns("V")
|
||||
custom { method, classDef ->
|
||||
|
||||
@@ -3,7 +3,7 @@ package app.revanced.patches.idaustria.detection.signature
|
||||
import app.revanced.patcher.fingerprint
|
||||
import com.android.tools.smali.dexlib2.AccessFlags
|
||||
|
||||
internal val spoofSignatureFingerprint = fingerprint {
|
||||
internal val spoofSignatureFingerprint by fingerprint {
|
||||
accessFlags(AccessFlags.PRIVATE)
|
||||
returns("L")
|
||||
parameters("L")
|
||||
|
||||
@@ -2,7 +2,7 @@ package app.revanced.patches.inshorts.ad
|
||||
|
||||
import app.revanced.patcher.fingerprint
|
||||
|
||||
internal val inshortsAdsFingerprint = fingerprint {
|
||||
internal val inshortsAdsFingerprint by fingerprint {
|
||||
returns("V")
|
||||
strings("GoogleAdLoader", "exception in requestAd")
|
||||
}
|
||||
@@ -4,7 +4,7 @@ package app.revanced.patches.instagram.hide.navigation
|
||||
import app.revanced.patcher.fingerprint
|
||||
import com.android.tools.smali.dexlib2.Opcode
|
||||
|
||||
internal val tabCreateButtonsLoopStartFingerprint = fingerprint {
|
||||
internal val tabCreateButtonsLoopStartFingerprint by fingerprint {
|
||||
returns("V")
|
||||
strings("InstagramMainActivity.createTabButtons")
|
||||
opcodes(
|
||||
@@ -16,7 +16,7 @@ internal val tabCreateButtonsLoopStartFingerprint = fingerprint {
|
||||
)
|
||||
}
|
||||
|
||||
internal val tabCreateButtonsLoopEndFingerprint = fingerprint {
|
||||
internal val tabCreateButtonsLoopEndFingerprint by fingerprint {
|
||||
returns("V")
|
||||
strings("InstagramMainActivity.createTabButtons")
|
||||
opcodes(
|
||||
|
||||
@@ -2,8 +2,7 @@ package app.revanced.patches.instagram.hide.stories
|
||||
import app.revanced.patcher.fingerprint
|
||||
import com.android.tools.smali.dexlib2.Opcode
|
||||
|
||||
|
||||
internal val getOrCreateAvatarViewFingerprint = fingerprint {
|
||||
internal val getOrCreateAvatarViewFingerprint by fingerprint {
|
||||
parameters()
|
||||
returns("L")
|
||||
custom { method, classDef ->
|
||||
|
||||
@@ -5,11 +5,11 @@ import app.revanced.util.getReference
|
||||
import app.revanced.util.indexOfFirstInstruction
|
||||
import com.android.tools.smali.dexlib2.iface.reference.MethodReference
|
||||
|
||||
internal val isValidSignatureClassFingerprint = fingerprint {
|
||||
internal val isValidSignatureClassFingerprint by fingerprint {
|
||||
strings("The provider for uri '", "' is not trusted: ")
|
||||
}
|
||||
|
||||
internal val isValidSignatureMethodFingerprint = fingerprint {
|
||||
internal val isValidSignatureMethodFingerprint by fingerprint {
|
||||
parameters("L", "Z")
|
||||
returns("Z")
|
||||
custom { method, _ ->
|
||||
|
||||
@@ -3,9 +3,8 @@ package app.revanced.patches.irplus.ad
|
||||
import com.android.tools.smali.dexlib2.AccessFlags
|
||||
import app.revanced.patcher.fingerprint
|
||||
|
||||
internal val irplusAdsFingerprint = fingerprint {
|
||||
internal val irplusAdsFingerprint by fingerprint {
|
||||
accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR)
|
||||
returns("V")
|
||||
parameters("L", "Z")
|
||||
strings("TAGGED")
|
||||
}
|
||||
@@ -4,7 +4,7 @@ import com.android.tools.smali.dexlib2.Opcode
|
||||
import com.android.tools.smali.dexlib2.AccessFlags
|
||||
import app.revanced.patcher.fingerprint
|
||||
|
||||
internal val isLoggedInFingerprint = fingerprint {
|
||||
internal val isLoggedInFingerprint by fingerprint {
|
||||
accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC, AccessFlags.FINAL)
|
||||
returns("Z")
|
||||
opcodes(
|
||||
|
||||
@@ -4,7 +4,7 @@ import com.android.tools.smali.dexlib2.Opcode
|
||||
import com.android.tools.smali.dexlib2.AccessFlags
|
||||
import app.revanced.patcher.fingerprint
|
||||
|
||||
internal val hasPurchasedFingerprint = fingerprint {
|
||||
internal val hasPurchasedFingerprint by fingerprint {
|
||||
accessFlags(AccessFlags.PRIVATE, AccessFlags.FINAL)
|
||||
returns("Z")
|
||||
opcodes(
|
||||
|
||||
@@ -4,7 +4,7 @@ import com.android.tools.smali.dexlib2.Opcode
|
||||
import com.android.tools.smali.dexlib2.AccessFlags
|
||||
import app.revanced.patcher.fingerprint
|
||||
|
||||
internal val licenseValidationFingerprint = fingerprint {
|
||||
internal val licenseValidationFingerprint by fingerprint {
|
||||
accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC)
|
||||
returns("Z")
|
||||
parameters("Landroid/content/Context;")
|
||||
|
||||
@@ -4,7 +4,7 @@ import com.android.tools.smali.dexlib2.Opcode
|
||||
import com.android.tools.smali.dexlib2.AccessFlags
|
||||
import app.revanced.patcher.fingerprint
|
||||
|
||||
internal val verifySignatureFingerprint = fingerprint(fuzzyPatternScanThreshold = 2) {
|
||||
internal val verifySignatureFingerprint by fingerprint {
|
||||
accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC)
|
||||
returns("Z")
|
||||
parameters("Landroid/app/Activity;")
|
||||
|
||||
@@ -4,7 +4,7 @@ import com.android.tools.smali.dexlib2.Opcode
|
||||
import com.android.tools.smali.dexlib2.AccessFlags
|
||||
import app.revanced.patcher.fingerprint
|
||||
|
||||
internal val isFreeVersionFingerprint = fingerprint {
|
||||
internal val isFreeVersionFingerprint by fingerprint {
|
||||
accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC)
|
||||
returns("Ljava/lang/Boolean;")
|
||||
parameters("Landroid/content/Context;")
|
||||
|
||||
@@ -5,7 +5,7 @@ import com.android.tools.smali.dexlib2.AccessFlags
|
||||
import com.android.tools.smali.dexlib2.Opcode
|
||||
import com.android.tools.smali.dexlib2.iface.value.StringEncodedValue
|
||||
|
||||
internal val createInboxSubTabsFingerprint = fingerprint {
|
||||
internal val createInboxSubTabsFingerprint by fingerprint {
|
||||
returns("V")
|
||||
accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL)
|
||||
opcodes(
|
||||
@@ -22,7 +22,7 @@ internal val createInboxSubTabsFingerprint = fingerprint {
|
||||
}
|
||||
}
|
||||
|
||||
internal val loadInboxAdsFingerprint = fingerprint {
|
||||
internal val loadInboxAdsFingerprint by fingerprint {
|
||||
returns("V")
|
||||
strings(
|
||||
"ads_load_begin",
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user