feat(YouTube - Hide action buttons): Add patch option Hide action buttons by index (Experimental)

This commit is contained in:
inotia00 2025-01-20 02:34:35 +09:00
parent 5dbab47628
commit 70178a0942
6 changed files with 241 additions and 5 deletions

View File

@ -0,0 +1,62 @@
package app.revanced.extension.youtube.patches.player;
import androidx.annotation.Nullable;
import java.util.List;
import app.revanced.extension.shared.settings.BooleanSetting;
import app.revanced.extension.shared.utils.Logger;
import app.revanced.extension.youtube.settings.Settings;
import app.revanced.extension.youtube.shared.VideoInformation;
@SuppressWarnings("unused")
public class ActionButtonsPatch {
public enum ActionButton {
INDEX_7(Settings.HIDE_ACTION_BUTTON_INDEX_7, Settings.HIDE_ACTION_BUTTON_INDEX_LIVE_7, 7),
INDEX_6(Settings.HIDE_ACTION_BUTTON_INDEX_6, Settings.HIDE_ACTION_BUTTON_INDEX_LIVE_6, 6),
INDEX_5(Settings.HIDE_ACTION_BUTTON_INDEX_5, Settings.HIDE_ACTION_BUTTON_INDEX_LIVE_5, 5),
INDEX_4(Settings.HIDE_ACTION_BUTTON_INDEX_4, Settings.HIDE_ACTION_BUTTON_INDEX_LIVE_4, 4),
INDEX_3(Settings.HIDE_ACTION_BUTTON_INDEX_3, Settings.HIDE_ACTION_BUTTON_INDEX_LIVE_3, 3),
INDEX_2(Settings.HIDE_ACTION_BUTTON_INDEX_2, Settings.HIDE_ACTION_BUTTON_INDEX_LIVE_2, 2),
INDEX_1(Settings.HIDE_ACTION_BUTTON_INDEX_1, Settings.HIDE_ACTION_BUTTON_INDEX_LIVE_1, 1),
INDEX_0(Settings.HIDE_ACTION_BUTTON_INDEX_0, Settings.HIDE_ACTION_BUTTON_INDEX_LIVE_0, 0);
private final BooleanSetting generalSetting;
private final BooleanSetting liveSetting;
private final int index;
ActionButton(final BooleanSetting generalSetting, final BooleanSetting liveSetting, final int index) {
this.generalSetting = generalSetting;
this.liveSetting = liveSetting;
this.index = index;
}
}
private static final String TARGET_COMPONENT_TYPE = "LazilyConvertedElement";
private static final String VIDEO_ACTION_BAR_PATH_PREFIX = "video_action_bar.eml";
public static List<Object> hideActionButtonByIndex(@Nullable List<Object> list, @Nullable String identifier) {
try {
if (identifier != null &&
identifier.startsWith(VIDEO_ACTION_BAR_PATH_PREFIX) &&
list != null &&
!list.isEmpty() &&
list.get(0).toString().equals(TARGET_COMPONENT_TYPE)
) {
final int size = list.size();
final boolean isLive = VideoInformation.getLiveStreamState();
for (ActionButton button : ActionButton.values()) {
if (size > button.index && (isLive ? button.liveSetting.get() : button.generalSetting.get())) {
list.remove(button.index);
}
}
}
} catch (Exception ex) {
Logger.printException(() -> "hideActionButtonByIndex failure", ex);
}
return list;
}
}

View File

@ -285,6 +285,23 @@ public class Settings extends BaseSettings {
public static final BooleanSetting HIDE_SHOP_BUTTON = new BooleanSetting("revanced_hide_shop_button", FALSE); public static final BooleanSetting HIDE_SHOP_BUTTON = new BooleanSetting("revanced_hide_shop_button", FALSE);
public static final BooleanSetting HIDE_THANKS_BUTTON = new BooleanSetting("revanced_hide_thanks_button", FALSE); public static final BooleanSetting HIDE_THANKS_BUTTON = new BooleanSetting("revanced_hide_thanks_button", FALSE);
public static final BooleanSetting HIDE_ACTION_BUTTON_INDEX_0 = new BooleanSetting("revanced_hide_action_button_index_0", FALSE);
public static final BooleanSetting HIDE_ACTION_BUTTON_INDEX_1 = new BooleanSetting("revanced_hide_action_button_index_1", FALSE);
public static final BooleanSetting HIDE_ACTION_BUTTON_INDEX_2 = new BooleanSetting("revanced_hide_action_button_index_2", FALSE);
public static final BooleanSetting HIDE_ACTION_BUTTON_INDEX_3 = new BooleanSetting("revanced_hide_action_button_index_3", FALSE);
public static final BooleanSetting HIDE_ACTION_BUTTON_INDEX_4 = new BooleanSetting("revanced_hide_action_button_index_4", FALSE);
public static final BooleanSetting HIDE_ACTION_BUTTON_INDEX_5 = new BooleanSetting("revanced_hide_action_button_index_5", FALSE);
public static final BooleanSetting HIDE_ACTION_BUTTON_INDEX_6 = new BooleanSetting("revanced_hide_action_button_index_6", FALSE);
public static final BooleanSetting HIDE_ACTION_BUTTON_INDEX_7 = new BooleanSetting("revanced_hide_action_button_index_7", FALSE);
public static final BooleanSetting HIDE_ACTION_BUTTON_INDEX_LIVE_0 = new BooleanSetting("revanced_hide_action_button_index_live_0", FALSE);
public static final BooleanSetting HIDE_ACTION_BUTTON_INDEX_LIVE_1 = new BooleanSetting("revanced_hide_action_button_index_live_1", FALSE);
public static final BooleanSetting HIDE_ACTION_BUTTON_INDEX_LIVE_2 = new BooleanSetting("revanced_hide_action_button_index_live_2", FALSE);
public static final BooleanSetting HIDE_ACTION_BUTTON_INDEX_LIVE_3 = new BooleanSetting("revanced_hide_action_button_index_live_3", FALSE);
public static final BooleanSetting HIDE_ACTION_BUTTON_INDEX_LIVE_4 = new BooleanSetting("revanced_hide_action_button_index_live_4", FALSE);
public static final BooleanSetting HIDE_ACTION_BUTTON_INDEX_LIVE_5 = new BooleanSetting("revanced_hide_action_button_index_live_5", FALSE);
public static final BooleanSetting HIDE_ACTION_BUTTON_INDEX_LIVE_6 = new BooleanSetting("revanced_hide_action_button_index_live_6", FALSE);
public static final BooleanSetting HIDE_ACTION_BUTTON_INDEX_LIVE_7 = new BooleanSetting("revanced_hide_action_button_index_live_7", FALSE);
// PreferenceScreen: Player - Ambient mode // PreferenceScreen: Player - Ambient mode
public static final BooleanSetting BYPASS_AMBIENT_MODE_RESTRICTIONS = new BooleanSetting("revanced_bypass_ambient_mode_restrictions", FALSE); public static final BooleanSetting BYPASS_AMBIENT_MODE_RESTRICTIONS = new BooleanSetting("revanced_bypass_ambient_mode_restrictions", FALSE);
public static final BooleanSetting DISABLE_AMBIENT_MODE = new BooleanSetting("revanced_disable_ambient_mode", FALSE, true); public static final BooleanSetting DISABLE_AMBIENT_MODE = new BooleanSetting("revanced_disable_ambient_mode", FALSE, true);

View File

@ -1,16 +1,37 @@
package app.revanced.patches.youtube.player.action package app.revanced.patches.youtube.player.action
import app.revanced.patcher.extensions.InstructionExtensions.getInstruction
import app.revanced.patcher.patch.booleanOption
import app.revanced.patcher.patch.bytecodePatch import app.revanced.patcher.patch.bytecodePatch
import app.revanced.patches.shared.litho.addLithoFilter import app.revanced.patches.shared.litho.addLithoFilter
import app.revanced.patches.shared.litho.emptyComponentsFingerprint
import app.revanced.patches.shared.litho.lithoFilterPatch import app.revanced.patches.shared.litho.lithoFilterPatch
import app.revanced.patches.youtube.utils.compatibility.Constants.COMPATIBLE_PACKAGE import app.revanced.patches.youtube.utils.compatibility.Constants.COMPATIBLE_PACKAGE
import app.revanced.patches.youtube.utils.extension.Constants.COMPONENTS_PATH import app.revanced.patches.youtube.utils.extension.Constants.COMPONENTS_PATH
import app.revanced.patches.youtube.utils.extension.Constants.PLAYER_PATH
import app.revanced.patches.youtube.utils.patch.PatchList.HIDE_ACTION_BUTTONS import app.revanced.patches.youtube.utils.patch.PatchList.HIDE_ACTION_BUTTONS
import app.revanced.patches.youtube.utils.settings.ResourceUtils.addPreference import app.revanced.patches.youtube.utils.settings.ResourceUtils.addPreference
import app.revanced.patches.youtube.utils.settings.settingsPatch import app.revanced.patches.youtube.utils.settings.settingsPatch
import app.revanced.patches.youtube.video.information.videoInformationPatch
import app.revanced.util.Utils.trimIndentMultiline
import app.revanced.util.addInstructionsAtControlFlowLabel
import app.revanced.util.findMethodOrThrow
import app.revanced.util.fingerprint.methodOrThrow
import app.revanced.util.getReference
import app.revanced.util.indexOfFirstInstructionOrThrow
import app.revanced.util.indexOfFirstInstructionReversedOrThrow
import app.revanced.util.indexOfFirstStringInstructionOrThrow
import com.android.tools.smali.dexlib2.Opcode
import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction
import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
import com.android.tools.smali.dexlib2.iface.instruction.ReferenceInstruction
import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction
import com.android.tools.smali.dexlib2.iface.reference.FieldReference
private const val FILTER_CLASS_DESCRIPTOR = private const val FILTER_CLASS_DESCRIPTOR =
"$COMPONENTS_PATH/ActionButtonsFilter;" "$COMPONENTS_PATH/ActionButtonsFilter;"
private const val ACTION_BUTTONS_CLASS_DESCRIPTOR =
"$PLAYER_PATH/ActionButtonsPatch;"
@Suppress("unused") @Suppress("unused")
val actionButtonsPatch = bytecodePatch( val actionButtonsPatch = bytecodePatch(
@ -22,18 +43,73 @@ val actionButtonsPatch = bytecodePatch(
dependsOn( dependsOn(
settingsPatch, settingsPatch,
lithoFilterPatch, lithoFilterPatch,
videoInformationPatch,
)
val hideActionButtonByIndex by booleanOption(
key = "hideActionButtonByIndex",
default = false,
title = "Hide action buttons by index",
description = """
Add an option to hide action buttons by index.
This setting is still experimental, so use it only for debugging purposes.
""".trimIndentMultiline(),
required = true
) )
execute { execute {
addLithoFilter(FILTER_CLASS_DESCRIPTOR) addLithoFilter(FILTER_CLASS_DESCRIPTOR)
var settingArray = arrayOf(
"PREFERENCE_SCREEN: PLAYER",
"SETTINGS: HIDE_ACTION_BUTTONS"
)
if (hideActionButtonByIndex == true) {
componentListFingerprint.methodOrThrow(emptyComponentsFingerprint).apply {
val conversionContextToStringMethod =
findMethodOrThrow(parameters[1].type) {
name == "toString"
}
val identifierReference = with (conversionContextToStringMethod) {
val identifierStringIndex =
indexOfFirstStringInstructionOrThrow(", identifierProperty=")
val identifierStringAppendIndex =
indexOfFirstInstructionOrThrow(identifierStringIndex, Opcode.INVOKE_VIRTUAL)
val identifierStringAppendIndexRegister = getInstruction<FiveRegisterInstruction>(identifierStringAppendIndex).registerD
val identifierAppendIndex =
indexOfFirstInstructionOrThrow(identifierStringAppendIndex + 1, Opcode.INVOKE_VIRTUAL)
val identifierRegister = getInstruction<FiveRegisterInstruction>(identifierAppendIndex).registerD
val identifierIndex = indexOfFirstInstructionReversedOrThrow(identifierAppendIndex) {
opcode == Opcode.IGET_OBJECT &&
getReference<FieldReference>()?.type == "Ljava/lang/String;" &&
(this as? TwoRegisterInstruction)?.registerA == identifierRegister
}
getInstruction<ReferenceInstruction>(identifierIndex).reference
}
val listIndex = implementation!!.instructions.lastIndex
val listRegister = getInstruction<OneRegisterInstruction>(listIndex).registerA
val identifierRegister = listRegister + 1
addInstructionsAtControlFlowLabel(
listIndex, """
move-object/from16 v$identifierRegister, p2
iget-object v$identifierRegister, v$identifierRegister, $identifierReference
invoke-static {v$listRegister, v$identifierRegister}, $ACTION_BUTTONS_CLASS_DESCRIPTOR->hideActionButtonByIndex(Ljava/util/List;Ljava/lang/String;)Ljava/util/List;
move-result-object v$listRegister
"""
)
settingArray += "SETTINGS: HIDE_BUTTONS_BY_INDEX"
}
}
// region add settings // region add settings
addPreference( addPreference(
arrayOf( settingArray,
"PREFERENCE_SCREEN: PLAYER",
"SETTINGS: HIDE_ACTION_BUTTONS"
),
HIDE_ACTION_BUTTONS HIDE_ACTION_BUTTONS
) )

View File

@ -0,0 +1,21 @@
package app.revanced.patches.youtube.player.action
import app.revanced.util.fingerprint.legacyFingerprint
import app.revanced.util.getReference
import app.revanced.util.indexOfFirstInstruction
import app.revanced.util.or
import com.android.tools.smali.dexlib2.AccessFlags
import com.android.tools.smali.dexlib2.Opcode
import com.android.tools.smali.dexlib2.iface.reference.MethodReference
internal val componentListFingerprint = legacyFingerprint(
name = "componentListFingerprint",
returnType = "Ljava/util/List;",
accessFlags = AccessFlags.PRIVATE or AccessFlags.FINAL,
customFingerprint = { method, _ ->
method.indexOfFirstInstruction {
opcode == Opcode.INVOKE_STATIC &&
getReference<MethodReference>()?.name == "nCopies"
} >= 0
}
)

View File

@ -848,6 +848,43 @@ Settings → Autoplay / Playback → Autoplay next video"</string>
<string name="revanced_hide_thanks_button_summary_on">Thanks button is hidden.</string> <string name="revanced_hide_thanks_button_summary_on">Thanks button is hidden.</string>
<string name="revanced_hide_thanks_button_summary_off">Thanks button is shown.</string> <string name="revanced_hide_thanks_button_summary_off">Thanks button is shown.</string>
<!-- PreferenceScreen: Player, PreferenceCategory: Player, PreferenceScreen: Action buttons, PreferenceCategory: Hide by index -->
<string name="revanced_preference_category_hide_by_index">Hide by index</string>
<string name="revanced_hide_action_button_index_0_title">Hide first button</string>
<string name="revanced_hide_action_button_index_0_summary_on">First button is hidden.</string>
<string name="revanced_hide_action_button_index_0_summary_off">First button is shown.</string>
<string name="revanced_hide_action_button_index_1_title">Hide second button</string>
<string name="revanced_hide_action_button_index_1_summary_on">Second button is hidden.</string>
<string name="revanced_hide_action_button_index_1_summary_off">Second button is shown.</string>
<string name="revanced_hide_action_button_index_2_title">Hide third button</string>
<string name="revanced_hide_action_button_index_2_summary_on">Third button is hidden.</string>
<string name="revanced_hide_action_button_index_2_summary_off">Third button is shown.</string>
<string name="revanced_hide_action_button_index_3_title">Hide fourth button</string>
<string name="revanced_hide_action_button_index_3_summary_on">Fourth button is hidden.</string>
<string name="revanced_hide_action_button_index_3_summary_off">Fourth button is shown.</string>
<string name="revanced_hide_action_button_index_4_title">Hide fifth button</string>
<string name="revanced_hide_action_button_index_4_summary_on">Fifth button is hidden.</string>
<string name="revanced_hide_action_button_index_4_summary_off">Fifth button is shown.</string>
<string name="revanced_hide_action_button_index_5_title">Hide sixth button</string>
<string name="revanced_hide_action_button_index_5_summary_on">Sixth button is hidden.</string>
<string name="revanced_hide_action_button_index_5_summary_off">Sixth button is shown.</string>
<string name="revanced_hide_action_button_index_6_title">Hide seventh button</string>
<string name="revanced_hide_action_button_index_6_summary_on">Seventh button is hidden.</string>
<string name="revanced_hide_action_button_index_6_summary_off">Seventh button is shown.</string>
<string name="revanced_hide_action_button_index_7_title">Hide eighth button</string>
<string name="revanced_hide_action_button_index_7_summary_on">Eighth button is hidden.</string>
<string name="revanced_hide_action_button_index_7_summary_off">Eighth button is shown.</string>
<!-- PreferenceScreen: Player, PreferenceCategory: Player, PreferenceScreen: Action buttons, PreferenceCategory: Hide by index in live stream -->
<string name="revanced_preference_category_hide_by_index_live">Hide by index in live stream</string>
<string name="revanced_hide_action_button_index_about_title">About Hide action button by index</string>
<string name="revanced_hide_action_button_index_about_summary">"Hide the action buttons by index before the action buttons are initialized.
- Hiding the action buttons leaves no empty space.
- Index of the action buttons may not always be the same button."</string>
<!-- PreferenceScreen: Player, PreferenceCategory: Player, PreferenceScreen: Ambient mode --> <!-- PreferenceScreen: Player, PreferenceCategory: Player, PreferenceScreen: Ambient mode -->
<string name="revanced_preference_screen_ambient_mode_title">Ambient mode</string> <string name="revanced_preference_screen_ambient_mode_title">Ambient mode</string>
<string name="revanced_preference_screen_ambient_mode_summary">Disable Ambient mode or bypass Ambient mode restrictions.</string> <string name="revanced_preference_screen_ambient_mode_summary">Disable Ambient mode or bypass Ambient mode restrictions.</string>

View File

@ -331,7 +331,30 @@
<SwitchPreference android:title="@string/revanced_hide_playlist_button_title" android:key="revanced_hide_playlist_button" android:summaryOn="@string/revanced_hide_playlist_button_summary_on" android:summaryOff="@string/revanced_hide_playlist_button_summary_off" /> <SwitchPreference android:title="@string/revanced_hide_playlist_button_title" android:key="revanced_hide_playlist_button" android:summaryOn="@string/revanced_hide_playlist_button_summary_on" android:summaryOff="@string/revanced_hide_playlist_button_summary_off" />
<SwitchPreference android:title="@string/revanced_hide_share_button_title" android:key="revanced_hide_share_button" android:summaryOn="@string/revanced_hide_share_button_summary_on" android:summaryOff="@string/revanced_hide_share_button_summary_off" /> <SwitchPreference android:title="@string/revanced_hide_share_button_title" android:key="revanced_hide_share_button" android:summaryOn="@string/revanced_hide_share_button_summary_on" android:summaryOff="@string/revanced_hide_share_button_summary_off" />
<SwitchPreference android:title="@string/revanced_hide_shop_button_title" android:key="revanced_hide_shop_button" android:summaryOn="@string/revanced_hide_shop_button_summary_on" android:summaryOff="@string/revanced_hide_shop_button_summary_off" /> <SwitchPreference android:title="@string/revanced_hide_shop_button_title" android:key="revanced_hide_shop_button" android:summaryOn="@string/revanced_hide_shop_button_summary_on" android:summaryOff="@string/revanced_hide_shop_button_summary_off" />
<SwitchPreference android:title="@string/revanced_hide_thanks_button_title" android:key="revanced_hide_thanks_button" android:summaryOn="@string/revanced_hide_thanks_button_summary_on" android:summaryOff="@string/revanced_hide_thanks_button_summary_off" /> <SwitchPreference android:title="@string/revanced_hide_thanks_button_title" android:key="revanced_hide_thanks_button" android:summaryOn="@string/revanced_hide_thanks_button_summary_on" android:summaryOff="@string/revanced_hide_thanks_button_summary_off" />SETTINGS: HIDE_ACTION_BUTTONS -->
<!-- SETTINGS: HIDE_BUTTONS_BY_INDEX
<PreferenceCategory android:title="@string/revanced_preference_category_hide_by_index" android:layout="@layout/revanced_settings_preferences_category"/>
<SwitchPreference android:title="@string/revanced_hide_action_button_index_0_title" android:key="revanced_hide_action_button_index_0" android:summaryOn="@string/revanced_hide_action_button_index_0_summary_on" android:summaryOff="@string/revanced_hide_action_button_index_0_summary_off" />
<SwitchPreference android:title="@string/revanced_hide_action_button_index_1_title" android:key="revanced_hide_action_button_index_1" android:summaryOn="@string/revanced_hide_action_button_index_1_summary_on" android:summaryOff="@string/revanced_hide_action_button_index_1_summary_off" />
<SwitchPreference android:title="@string/revanced_hide_action_button_index_2_title" android:key="revanced_hide_action_button_index_2" android:summaryOn="@string/revanced_hide_action_button_index_2_summary_on" android:summaryOff="@string/revanced_hide_action_button_index_2_summary_off" />
<SwitchPreference android:title="@string/revanced_hide_action_button_index_3_title" android:key="revanced_hide_action_button_index_3" android:summaryOn="@string/revanced_hide_action_button_index_3_summary_on" android:summaryOff="@string/revanced_hide_action_button_index_3_summary_off" />
<SwitchPreference android:title="@string/revanced_hide_action_button_index_4_title" android:key="revanced_hide_action_button_index_4" android:summaryOn="@string/revanced_hide_action_button_index_4_summary_on" android:summaryOff="@string/revanced_hide_action_button_index_4_summary_off" />
<SwitchPreference android:title="@string/revanced_hide_action_button_index_5_title" android:key="revanced_hide_action_button_index_5" android:summaryOn="@string/revanced_hide_action_button_index_5_summary_on" android:summaryOff="@string/revanced_hide_action_button_index_5_summary_off" />
<SwitchPreference android:title="@string/revanced_hide_action_button_index_6_title" android:key="revanced_hide_action_button_index_6" android:summaryOn="@string/revanced_hide_action_button_index_6_summary_on" android:summaryOff="@string/revanced_hide_action_button_index_6_summary_off" />
<SwitchPreference android:title="@string/revanced_hide_action_button_index_7_title" android:key="revanced_hide_action_button_index_7" android:summaryOn="@string/revanced_hide_action_button_index_7_summary_on" android:summaryOff="@string/revanced_hide_action_button_index_7_summary_off" />
<PreferenceCategory android:title="@string/revanced_preference_category_hide_by_index_live" android:layout="@layout/revanced_settings_preferences_category"/>
<SwitchPreference android:title="@string/revanced_hide_action_button_index_0_title" android:key="revanced_hide_action_button_index_live_0" android:summaryOn="@string/revanced_hide_action_button_index_0_summary_on" android:summaryOff="@string/revanced_hide_action_button_index_0_summary_off" />
<SwitchPreference android:title="@string/revanced_hide_action_button_index_1_title" android:key="revanced_hide_action_button_index_live_1" android:summaryOn="@string/revanced_hide_action_button_index_1_summary_on" android:summaryOff="@string/revanced_hide_action_button_index_1_summary_off" />
<SwitchPreference android:title="@string/revanced_hide_action_button_index_2_title" android:key="revanced_hide_action_button_index_live_2" android:summaryOn="@string/revanced_hide_action_button_index_2_summary_on" android:summaryOff="@string/revanced_hide_action_button_index_2_summary_off" />
<SwitchPreference android:title="@string/revanced_hide_action_button_index_3_title" android:key="revanced_hide_action_button_index_live_3" android:summaryOn="@string/revanced_hide_action_button_index_3_summary_on" android:summaryOff="@string/revanced_hide_action_button_index_3_summary_off" />
<SwitchPreference android:title="@string/revanced_hide_action_button_index_4_title" android:key="revanced_hide_action_button_index_live_4" android:summaryOn="@string/revanced_hide_action_button_index_4_summary_on" android:summaryOff="@string/revanced_hide_action_button_index_4_summary_off" />
<SwitchPreference android:title="@string/revanced_hide_action_button_index_5_title" android:key="revanced_hide_action_button_index_live_5" android:summaryOn="@string/revanced_hide_action_button_index_5_summary_on" android:summaryOff="@string/revanced_hide_action_button_index_5_summary_off" />
<Preference android:title="@string/revanced_hide_action_button_index_about_title" android:selectable="false" android:summary="@string/revanced_hide_action_button_index_about_summary" />SETTINGS: HIDE_BUTTONS_BY_INDEX -->
<!-- SETTINGS: HIDE_ACTION_BUTTONS
</PreferenceScreen>SETTINGS: HIDE_ACTION_BUTTONS --> </PreferenceScreen>SETTINGS: HIDE_ACTION_BUTTONS -->
<!-- SETTINGS: AMBIENT_MODE_CONTROLS <!-- SETTINGS: AMBIENT_MODE_CONTROLS