Skip to content

Commit 47ebec5

Browse files
oSumAtrIXLisoUseInAIKyriosgithub-actions[bot]semantic-release-botdtricks
authored
chore: Merge branch dev to main (#4699)
Co-authored-by: LisoUseInAIKyrios <[email protected]> Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: semantic-release-bot <[email protected]> Co-authored-by: Denis Kerner <[email protected]> Co-authored-by: Denis Kerner <[email protected]> Co-authored-by: oSumAtrIX <[email protected]> Co-authored-by: Dawid Krajcarz <[email protected]> Co-authored-by: Jakub Blažej <[email protected]> Co-authored-by: MarcaD <[email protected]> Co-authored-by: Aoife McCullough <[email protected]> Co-authored-by: Nuckyz <[email protected]> Co-authored-by: user5095 <[email protected]> Co-authored-by: Brosssh <[email protected]> Co-authored-by: Crowdin Bot <[email protected]> Co-authored-by: oSumAtrIX <[email protected]>
2 parents a233938 + 48358ff commit 47ebec5

File tree

182 files changed

+2414
-786
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

182 files changed

+2414
-786
lines changed

CHANGELOG.md

+139
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,142 @@
1+
# [5.19.0-dev.17](https://github.com/ReVanced/revanced-patches/compare/v5.19.0-dev.16...v5.19.0-dev.17) (2025-04-12)
2+
3+
4+
### Features
5+
6+
* **Spotify:** Add `Check environment` patch ([#4765](https://github.com/ReVanced/revanced-patches/issues/4765)) ([6d7101c](https://github.com/ReVanced/revanced-patches/commit/6d7101cb2e546e01a934eff9cad1264367aeafe3))
7+
8+
# [5.19.0-dev.16](https://github.com/ReVanced/revanced-patches/compare/v5.19.0-dev.15...v5.19.0-dev.16) (2025-04-11)
9+
10+
11+
### Bug Fixes
12+
13+
* **Google Photos:** Remove obsolete non functional patch `Restore hidden 'Back up while charging' toggle` ([#4764](https://github.com/ReVanced/revanced-patches/issues/4764)) ([56e48f4](https://github.com/ReVanced/revanced-patches/commit/56e48f4c89da51f81ff11a79a164eaa5b440690e))
14+
15+
# [5.19.0-dev.15](https://github.com/ReVanced/revanced-patches/compare/v5.19.0-dev.14...v5.19.0-dev.15) (2025-04-11)
16+
17+
18+
### Bug Fixes
19+
20+
* **Google Photos - Restore hidden 'Back up while charging' toggle:** Constrain to last working app target ([#4761](https://github.com/ReVanced/revanced-patches/issues/4761)) ([152bb7c](https://github.com/ReVanced/revanced-patches/commit/152bb7c3ee7cf36bc07460e7a3444631ec540441))
21+
22+
# [5.19.0-dev.14](https://github.com/ReVanced/revanced-patches/compare/v5.19.0-dev.13...v5.19.0-dev.14) (2025-04-11)
23+
24+
25+
### Bug Fixes
26+
27+
* **Spotify - Unlock Spotify Premium:** Remove restrictions for Google voice assistant ([#4702](https://github.com/ReVanced/revanced-patches/issues/4702)) ([106202f](https://github.com/ReVanced/revanced-patches/commit/106202f9ebb7699c4ba4ae46b82133e35f1ac6b9))
28+
29+
# [5.19.0-dev.13](https://github.com/ReVanced/revanced-patches/compare/v5.19.0-dev.12...v5.19.0-dev.13) (2025-04-11)
30+
31+
32+
### Features
33+
34+
* **Spotify:** Add limited support for version `8.6.98.900` (last version that supports Kenwood and Pioneer car stereos) ([#4750](https://github.com/ReVanced/revanced-patches/issues/4750)) ([a3fde87](https://github.com/ReVanced/revanced-patches/commit/a3fde874af993125ba7a741820e7bd48e3641b84))
35+
36+
# [5.19.0-dev.12](https://github.com/ReVanced/revanced-patches/compare/v5.19.0-dev.11...v5.19.0-dev.12) (2025-04-11)
37+
38+
39+
### Features
40+
41+
* **Strava - Disable subscription suggestions:** Make compatible with latest version ([#4739](https://github.com/ReVanced/revanced-patches/issues/4739)) ([649a2c0](https://github.com/ReVanced/revanced-patches/commit/649a2c06161c72a2040b179dbed5b415847d7527))
42+
43+
# [5.19.0-dev.11](https://github.com/ReVanced/revanced-patches/compare/v5.19.0-dev.10...v5.19.0-dev.11) (2025-04-10)
44+
45+
46+
### Features
47+
48+
* **Messenger:** Add `Remove Meta AI tab` patch ([#4726](https://github.com/ReVanced/revanced-patches/issues/4726)) ([e3fad97](https://github.com/ReVanced/revanced-patches/commit/e3fad97484d7eb962aeb53d44a0047b34a881071))
49+
50+
# [5.19.0-dev.10](https://github.com/ReVanced/revanced-patches/compare/v5.19.0-dev.9...v5.19.0-dev.10) (2025-04-10)
51+
52+
53+
### Bug Fixes
54+
55+
* **YouTube - Hide layout components:** Do not hide video description music/game links if hide horizontal shelves is enabled ([3864f35](https://github.com/ReVanced/revanced-patches/commit/3864f3550153617e23ad9979fb543d8a7fb4dc0a))
56+
57+
# [5.19.0-dev.9](https://github.com/ReVanced/revanced-patches/compare/v5.19.0-dev.8...v5.19.0-dev.9) (2025-04-10)
58+
59+
60+
### Bug Fixes
61+
62+
* **YouTube - Hide player flyout menu items:** Show more detailed summary text for 'Hide Audio track' if using Android spoof client ([#4756](https://github.com/ReVanced/revanced-patches/issues/4756)) ([b67bbb2](https://github.com/ReVanced/revanced-patches/commit/b67bbb299669336addb68cf52a8ce5b39c68cec0))
63+
64+
# [5.19.0-dev.8](https://github.com/ReVanced/revanced-patches/compare/v5.19.0-dev.7...v5.19.0-dev.8) (2025-04-09)
65+
66+
67+
### Bug Fixes
68+
69+
* **YouTube - Return YouTube Dislike:** Fix inconsistent label after disliking a Short ([ea92a2e](https://github.com/ReVanced/revanced-patches/commit/ea92a2e36c7aab3bd115f7d0ec40467179485b32))
70+
71+
# [5.19.0-dev.7](https://github.com/ReVanced/revanced-patches/compare/v5.19.0-dev.6...v5.19.0-dev.7) (2025-04-07)
72+
73+
74+
### Bug Fixes
75+
76+
* **YouTube - Return YouTube Dislike:** Correctly update label after disliking a Short with 20.07 ([0bb3e32](https://github.com/ReVanced/revanced-patches/commit/0bb3e32244fa10809aee5c4e549f77ed4054537e))
77+
78+
# [5.19.0-dev.6](https://github.com/ReVanced/revanced-patches/compare/v5.19.0-dev.5...v5.19.0-dev.6) (2025-04-04)
79+
80+
81+
### Bug Fixes
82+
83+
* **Spotify:** Remove ads sections from home ([#4722](https://github.com/ReVanced/revanced-patches/issues/4722)) ([0b9a5e7](https://github.com/ReVanced/revanced-patches/commit/0b9a5e7f89a89d971762b3539166d4f145111481))
84+
85+
# [5.19.0-dev.5](https://github.com/ReVanced/revanced-patches/compare/v5.19.0-dev.4...v5.19.0-dev.5) (2025-04-02)
86+
87+
88+
### Bug Fixes
89+
90+
* **Spotify - Custom theme:** Override more color resources ([#4690](https://github.com/ReVanced/revanced-patches/issues/4690)) ([d7a7a0b](https://github.com/ReVanced/revanced-patches/commit/d7a7a0b982dbafa181b04f984a5f7618fb067c2a))
91+
92+
# [5.19.0-dev.4](https://github.com/ReVanced/revanced-patches/compare/v5.19.0-dev.3...v5.19.0-dev.4) (2025-04-02)
93+
94+
95+
### Bug Fixes
96+
97+
* **YouTube - Seekbar:** Correctly hide the feed seekbar with target 20.07 ([ddc6e4c](https://github.com/ReVanced/revanced-patches/commit/ddc6e4c34fe35fa34bd859bf34e25645a23dbdc9))
98+
99+
# [5.19.0-dev.3](https://github.com/ReVanced/revanced-patches/compare/v5.19.0-dev.2...v5.19.0-dev.3) (2025-04-02)
100+
101+
102+
### Features
103+
104+
* **Proton Mail:** Add `Remove 'Sent from' signature` patch ([#4514](https://github.com/ReVanced/revanced-patches/issues/4514)) ([34c14c9](https://github.com/ReVanced/revanced-patches/commit/34c14c9b443092824d035afd77adb678c6f89e3e))
105+
106+
# [5.19.0-dev.2](https://github.com/ReVanced/revanced-patches/compare/v5.19.0-dev.1...v5.19.0-dev.2) (2025-04-02)
107+
108+
109+
### Features
110+
111+
* **YouTube - Settings:** Add icons to the ReVanced settings ([#4496](https://github.com/ReVanced/revanced-patches/issues/4496)) ([d0c85f0](https://github.com/ReVanced/revanced-patches/commit/d0c85f044083d720c63a8ea4ff15d42eefeb9db7))
112+
113+
# [5.19.0-dev.1](https://github.com/ReVanced/revanced-patches/compare/v5.18.1-dev.2...v5.19.0-dev.1) (2025-04-01)
114+
115+
116+
### Bug Fixes
117+
118+
* **Twitter - Hide recommended users:** Make hiding work again by filtering for new entryId prefix ([#4456](https://github.com/ReVanced/revanced-patches/issues/4456)) ([ff846b0](https://github.com/ReVanced/revanced-patches/commit/ff846b0b7ef5060caaffedb08c1f901172f5b2d1))
119+
120+
121+
### Features
122+
123+
* **Angulus:** Add `Hide ads` patch ([#4604](https://github.com/ReVanced/revanced-patches/issues/4604)) ([87c86b5](https://github.com/ReVanced/revanced-patches/commit/87c86b53a91b0054ac892a3f02bbe7bf83bbf813))
124+
* **Photomath:** Support latest version ([#4672](https://github.com/ReVanced/revanced-patches/issues/4672)) ([8e16483](https://github.com/ReVanced/revanced-patches/commit/8e1648322948151e4565fb0d86e0f37d0a02d73f))
125+
126+
## [5.18.1-dev.2](https://github.com/ReVanced/revanced-patches/compare/v5.18.1-dev.1...v5.18.1-dev.2) (2025-04-01)
127+
128+
129+
### Bug Fixes
130+
131+
* **YouTube:** Combine multiple seekbar patches into a single patch ([#4705](https://github.com/ReVanced/revanced-patches/issues/4705)) ([503b7eb](https://github.com/ReVanced/revanced-patches/commit/503b7eb8d413ef7f248394f128f3b2a6f3192ba6))
132+
133+
## [5.18.1-dev.1](https://github.com/ReVanced/revanced-patches/compare/v5.18.0...v5.18.1-dev.1) (2025-03-31)
134+
135+
136+
### Bug Fixes
137+
138+
* **YouTube - Remove background playback restrictions:** Do not show media controls when playing Shorts from the feed ([2ed675c](https://github.com/ReVanced/revanced-patches/commit/2ed675cdd058fb5876381a9d30dee5263f6b2e26))
139+
1140
# [5.18.0](https://github.com/ReVanced/revanced-patches/compare/v5.17.0...v5.18.0) (2025-03-28)
2141

3142

extensions/shared/library/src/main/java/app/revanced/extension/shared/Utils.java

+11
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import android.content.pm.PackageManager;
1010
import android.content.res.Configuration;
1111
import android.content.res.Resources;
12+
import android.graphics.Color;
1213
import android.net.ConnectivityManager;
1314
import android.os.Build;
1415
import android.os.Bundle;
@@ -799,4 +800,14 @@ public static void setEditTextDialogTheme(AlertDialog.Builder builder) {
799800
builder.getContext().setTheme(editTextDialogStyle);
800801
}
801802
}
803+
804+
/**
805+
* Parse a color resource or hex code to an int representation of the color.
806+
*/
807+
public static int getColorFromString(String colorString) throws IllegalArgumentException, Resources.NotFoundException {
808+
if (colorString.startsWith("#")) {
809+
return Color.parseColor(colorString);
810+
}
811+
return getResourceColor(colorString);
812+
}
802813
}

extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/BaseSettings.java

+5
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,11 @@ public class BaseSettings {
2323

2424
public static final EnumSetting<AppLanguage> REVANCED_LANGUAGE = new EnumSetting<>("revanced_language", AppLanguage.DEFAULT, true, "revanced_language_user_dialog_message");
2525

26+
/**
27+
* Use the icons declared in the preferences created during patching. If no icons or styles are declared then this setting does nothing.
28+
*/
29+
public static final BooleanSetting SHOW_MENU_ICONS = new BooleanSetting("revanced_show_menu_icons", TRUE, true);
30+
2631
public static final BooleanSetting SPOOF_VIDEO_STREAMS = new BooleanSetting("revanced_spoof_video_streams", TRUE, true, "revanced_spoof_video_streams_user_dialog_message");
2732
public static final EnumSetting<AppLanguage> SPOOF_VIDEO_STREAMS_LANGUAGE = new EnumSetting<>("revanced_spoof_video_streams_language", AppLanguage.DEFAULT, new AudioStreamLanguageOverrideAvailability());
2833
public static final BooleanSetting SPOOF_STREAMING_DATA_STATS_FOR_NERDS = new BooleanSetting("revanced_spoof_streaming_data_stats_for_nerds", TRUE, parent(SPOOF_VIDEO_STREAMS));

extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/preference/AbstractPreferenceFragment.java

+4-2
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,6 @@ public abstract class AbstractPreferenceFragment extends PreferenceFragment {
8686
}
8787
};
8888

89-
9089
/**
9190
* Initialize this instance, and do any custom behavior.
9291
* <p>
@@ -95,7 +94,10 @@ public abstract class AbstractPreferenceFragment extends PreferenceFragment {
9594
* so all app specific {@link Setting} instances are loaded before this method returns.
9695
*/
9796
protected void initialize() {
98-
final var identifier = Utils.getResourceIdentifier("revanced_prefs", "xml");
97+
String preferenceResourceName = BaseSettings.SHOW_MENU_ICONS.get()
98+
? "revanced_prefs_icons"
99+
: "revanced_prefs";
100+
final var identifier = Utils.getResourceIdentifier(preferenceResourceName, "xml");
99101
if (identifier == 0) return;
100102
addPreferencesFromResource(identifier);
101103

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package app.revanced.extension.spotify.layout.theme;
2+
3+
import android.graphics.Color;
4+
5+
import app.revanced.extension.shared.Logger;
6+
import app.revanced.extension.shared.Utils;
7+
8+
@SuppressWarnings("unused")
9+
public final class CustomThemePatch {
10+
11+
/**
12+
* Injection point.
13+
*/
14+
public static long getThemeColor(String colorString) {
15+
try {
16+
return Utils.getColorFromString(colorString);
17+
} catch (Exception ex) {
18+
Logger.printException(() -> "Invalid custom color: " + colorString, ex);
19+
return Color.BLACK;
20+
}
21+
}
22+
}

extensions/spotify/src/main/java/app/revanced/extension/spotify/misc/UnlockPremiumPatch.java

+54-7
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
import static java.lang.Boolean.FALSE;
44
import static java.lang.Boolean.TRUE;
55

6-
import com.spotify.remoteconfig.internal.AccountAttribute;
6+
import com.spotify.home.evopage.homeapi.proto.Section;
77

88
import java.util.List;
99
import java.util.Map;
@@ -14,6 +14,25 @@
1414
@SuppressWarnings("unused")
1515
public final class UnlockPremiumPatch {
1616

17+
private static final String SPOTIFY_MAIN_ACTIVITY_LEGACY = "com.spotify.music.MainActivity";
18+
19+
/**
20+
* If the app target is 8.6.98.900.
21+
*/
22+
private static final boolean IS_SPOTIFY_LEGACY_APP_TARGET;
23+
24+
static {
25+
boolean legacy;
26+
try {
27+
Class.forName(SPOTIFY_MAIN_ACTIVITY_LEGACY);
28+
legacy = true;
29+
} catch (ClassNotFoundException ex) {
30+
legacy = false;
31+
}
32+
33+
IS_SPOTIFY_LEGACY_APP_TARGET = legacy;
34+
}
35+
1736
private static class OverrideAttribute {
1837
/**
1938
* Account attribute key.
@@ -54,8 +73,8 @@ private static class OverrideAttribute {
5473
// Make sure playing songs is not disabled remotely and playlists show up.
5574
new OverrideAttribute("streaming", TRUE),
5675
// Allows adding songs to queue and removes the smart shuffle mode restriction,
57-
// allowing to pick any of the other modes.
58-
new OverrideAttribute("pick-and-shuffle", FALSE),
76+
// allowing to pick any of the other modes. Flag is not present in legacy app target.
77+
new OverrideAttribute("pick-and-shuffle", FALSE, !IS_SPOTIFY_LEGACY_APP_TARGET),
5978
// Disables shuffle-mode streaming-rule, which forces songs to be played shuffled
6079
// and breaks the player when other patches are applied.
6180
new OverrideAttribute("streaming-rules", ""),
@@ -69,23 +88,51 @@ private static class OverrideAttribute {
6988
new OverrideAttribute("tablet-free", FALSE, false)
7089
);
7190

91+
private static final List<Integer> REMOVED_HOME_SECTIONS = List.of(
92+
Section.VIDEO_BRAND_AD_FIELD_NUMBER,
93+
Section.IMAGE_BRAND_AD_FIELD_NUMBER
94+
);
95+
7296
/**
73-
* Injection point.
97+
* Injection point. Override account attributes.
7498
*/
75-
public static void overrideAttribute(Map<String, AccountAttribute> attributes) {
99+
public static void overrideAttribute(Map<String, /*AccountAttribute*/ Object> attributes) {
76100
try {
77101
for (var override : OVERRIDES) {
78102
var attribute = attributes.get(override.key);
79103
if (attribute == null) {
80104
if (override.isExpected) {
81-
Logger.printException(() -> "''" + override.key + "' expected but not found");
105+
Logger.printException(() -> "'" + override.key + "' expected but not found");
82106
}
83107
} else {
84-
attribute.value_ = override.overrideValue;
108+
Object overrideValue = override.overrideValue;
109+
if (IS_SPOTIFY_LEGACY_APP_TARGET) {
110+
((com.spotify.useraccount.v1.AccountAttribute) attribute).value_ = overrideValue;
111+
} else {
112+
((com.spotify.remoteconfig.internal.AccountAttribute) attribute).value_ = overrideValue;
113+
}
85114
}
86115
}
87116
} catch (Exception ex) {
88117
Logger.printException(() -> "overrideAttribute failure", ex);
89118
}
90119
}
120+
121+
/**
122+
* Injection point. Remove station data from Google assistant URI.
123+
*/
124+
public static String removeStationString(String spotifyUriOrUrl) {
125+
return spotifyUriOrUrl.replace("spotify:station:", "spotify:");
126+
}
127+
128+
/**
129+
* Injection point. Remove ads sections from home.
130+
*/
131+
public static void removeHomeSections(List<Section> sections) {
132+
try {
133+
sections.removeIf(section -> REMOVED_HOME_SECTIONS.contains(section.featureTypeCase_));
134+
} catch (Exception ex) {
135+
Logger.printException(() -> "Remove home sections failure", ex);
136+
}
137+
}
91138
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package com.spotify.home.evopage.homeapi.proto;
2+
3+
public final class Section {
4+
public static final int VIDEO_BRAND_AD_FIELD_NUMBER = 20;
5+
public static final int IMAGE_BRAND_AD_FIELD_NUMBER = 21;
6+
public int featureTypeCase_;
7+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package com.spotify.useraccount.v1;
2+
3+
/**
4+
* Used for target 8.6.98.900. Class is still present in newer app targets.
5+
*/
6+
public class AccountAttribute {
7+
public Object value_;
8+
}

extensions/tiktok/src/main/java/app/revanced/extension/tiktok/settings/preference/ReVancedPreferenceFragment.java

-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
import app.revanced.extension.tiktok.settings.preference.categories.FeedFilterPreferenceCategory;
1010
import app.revanced.extension.tiktok.settings.preference.categories.ExtensionPreferenceCategory;
1111
import app.revanced.extension.tiktok.settings.preference.categories.SimSpoofPreferenceCategory;
12-
import org.jetbrains.annotations.NotNull;
1312

1413
/**
1514
* Preference fragment for ReVanced settings

extensions/twitter/src/main/java/app/revanced/twitter/patches/hook/twifucker/TwiFucker.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,7 @@ internal object TwiFucker {
163163

164164
private fun JSONObject.entryIsWhoToFollow(): Boolean =
165165
optString("entryId").let {
166-
it.startsWith("whoToFollow-") || it.startsWith("who-to-follow-") || it.startsWith("connect-module-")
166+
it.startsWith("whoToFollow-") || it.startsWith("who-to-follow-") || it.startsWith("connect-module-") || it.startsWith("who-to-subscribe-")
167167
}
168168

169169
private fun JSONObject.itemContainsPromotedUser(): Boolean =

0 commit comments

Comments
 (0)