refactor(YouTube - Settings): Back button/gesture closes search instead of exiting (#5439)

This commit is contained in:
MarcaD
2025-07-16 23:26:20 +04:00
committed by GitHub
parent 44da5a71c5
commit 86ec08993c
4 changed files with 45 additions and 29 deletions
@@ -5,6 +5,7 @@ import static app.revanced.extension.shared.Utils.getResourceIdentifier;
import android.annotation.SuppressLint; import android.annotation.SuppressLint;
import android.app.Activity; import android.app.Activity;
import android.content.Context; import android.content.Context;
import android.content.res.Configuration;
import android.preference.PreferenceFragment; import android.preference.PreferenceFragment;
import android.util.TypedValue; import android.util.TypedValue;
import android.view.ViewGroup; import android.view.ViewGroup;
@@ -171,4 +172,10 @@ public class LicenseActivityHook extends Activity {
Utils.setIsDarkModeEnabled(themeOrdinal == 1); Utils.setIsDarkModeEnabled(themeOrdinal == 1);
} }
} }
public static void handleConfigurationChanged(Activity activity, Configuration newConfig) {
if (searchViewController != null) {
searchViewController.handleOrientationChange(newConfig.orientation);
}
}
} }
@@ -95,6 +95,7 @@ public class SearchViewController {
this.originalTitle = toolbar.getTitle(); this.originalTitle = toolbar.getTitle();
this.showSettingsSearchHistory = Settings.SETTINGS_SEARCH_HISTORY.get(); this.showSettingsSearchHistory = Settings.SETTINGS_SEARCH_HISTORY.get();
this.searchHistory = new LinkedList<>(); this.searchHistory = new LinkedList<>();
this.currentOrientation = activity.getResources().getConfiguration().orientation;
StringSetting searchEntries = Settings.SETTINGS_SEARCH_ENTRIES; StringSetting searchEntries = Settings.SETTINGS_SEARCH_ENTRIES;
if (showSettingsSearchHistory) { if (showSettingsSearchHistory) {
String entries = searchEntries.get(); String entries = searchEntries.get();
@@ -208,8 +209,6 @@ public class SearchViewController {
Logger.printException(() -> "navigation click failure", ex); Logger.printException(() -> "navigation click failure", ex);
} }
}); });
monitorOrientationChanges();
} }
/** /**
@@ -292,19 +291,14 @@ public class SearchViewController {
} }
} }
private void monitorOrientationChanges() { public void handleOrientationChange(int newOrientation) {
currentOrientation = activity.getResources().getConfiguration().orientation; if (newOrientation != currentOrientation) {
currentOrientation = newOrientation;
searchView.getViewTreeObserver().addOnGlobalLayoutListener(() -> { if (autoCompleteTextView != null) {
int newOrientation = activity.getResources().getConfiguration().orientation; autoCompleteTextView.dismissDropDown();
if (newOrientation != currentOrientation) { Logger.printDebug(() -> "Orientation changed, search history dismissed");
currentOrientation = newOrientation;
if (autoCompleteTextView != null) {
autoCompleteTextView.dismissDropDown();
Logger.printDebug(() -> "Orientation changed, search history dismissed");
}
} }
}); }
} }
/** /**
@@ -350,14 +344,14 @@ public class SearchViewController {
public static boolean handleBackPress() { public static boolean handleBackPress() {
if (LicenseActivityHook.searchViewController != null if (LicenseActivityHook.searchViewController != null
&& LicenseActivityHook.searchViewController.isSearchExpanded()) { && LicenseActivityHook.searchViewController.isSearchActive()) {
LicenseActivityHook.searchViewController.closeSearch(); LicenseActivityHook.searchViewController.closeSearch();
return true; return true;
} }
return false; return false;
} }
public boolean isSearchExpanded() { public boolean isSearchActive() {
return isSearchActive; return isSearchActive;
} }
@@ -280,7 +280,7 @@ public class ReVancedPreferenceFragment extends AbstractPreferenceFragment {
LicenseActivityHook.setToolbarLayoutParams(toolbar); LicenseActivityHook.setToolbarLayoutParams(toolbar);
if (LicenseActivityHook.searchViewController != null if (LicenseActivityHook.searchViewController != null
&& LicenseActivityHook.searchViewController.isSearchExpanded()) { && LicenseActivityHook.searchViewController.isSearchActive()) {
toolbar.post(() -> LicenseActivityHook.searchViewController.closeSearch()); toolbar.post(() -> LicenseActivityHook.searchViewController.closeSearch());
} }
@@ -235,9 +235,9 @@ val settingsPatch = bytecodePatch(
methods.removeIf { it.name != "onCreate" && !MethodUtil.isConstructor(it) } methods.removeIf { it.name != "onCreate" && !MethodUtil.isConstructor(it) }
} }
// Add context override to force a specific settings language.
licenseActivityOnCreateFingerprint.classDef.apply { licenseActivityOnCreateFingerprint.classDef.apply {
val attachBaseContext = ImmutableMethod( // Add attachBaseContext method to override the context for setting a specific language.
ImmutableMethod(
type, type,
"attachBaseContext", "attachBaseContext",
listOf(ImmutableMethodParameter("Landroid/content/Context;", null, null)), listOf(ImmutableMethodParameter("Landroid/content/Context;", null, null)),
@@ -255,13 +255,10 @@ val settingsPatch = bytecodePatch(
return-void return-void
""" """
) )
} }.let(methods::add)
methods.add(attachBaseContext) // Add onBackPressed method to handle back button presses, delegating to SearchViewController.
} ImmutableMethod(
licenseActivityOnCreateFingerprint.classDef.apply {
val onBackPressed = ImmutableMethod(
type, type,
"onBackPressed", "onBackPressed",
emptyList(), emptyList(),
@@ -269,7 +266,7 @@ val settingsPatch = bytecodePatch(
AccessFlags.PUBLIC.value, AccessFlags.PUBLIC.value,
null, null,
null, null,
MutableMethodImplementation(3) MutableMethodImplementation(3),
).toMutable().apply { ).toMutable().apply {
addInstructions( addInstructions(
""" """
@@ -281,10 +278,28 @@ val settingsPatch = bytecodePatch(
return-void return-void
""" """
) )
}.let(methods::add)
}; // Add onConfigurationChanged method to handle configuration changes (e.g., screen orientation).
methods.add(onBackPressed); ImmutableMethod(
}; type,
"onConfigurationChanged",
listOf(ImmutableMethodParameter("Landroid/content/res/Configuration;", null, null)),
"V",
AccessFlags.PUBLIC.value,
null,
null,
MutableMethodImplementation(3)
).toMutable().apply {
addInstructions(
"""
invoke-super { p0, p1 }, Landroid/app/Activity;->onConfigurationChanged(Landroid/content/res/Configuration;)V
invoke-static { p0, p1 }, $EXTENSION_CLASS_DESCRIPTOR->handleConfigurationChanged(Landroid/app/Activity;Landroid/content/res/Configuration;)V
return-void
"""
)
}.let(methods::add)
}
// Update shared dark mode status based on YT theme. // Update shared dark mode status based on YT theme.
// This is needed because YT allows forcing light/dark mode // This is needed because YT allows forcing light/dark mode