feat: Update to patcher v22
This commit is contained in:
parent
c4a720fbd3
commit
724e6d61b2
420 changed files with 4247 additions and 4429 deletions
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue