From 7acfcc6d6a92cb32dfed9df1d478bf22ede6f981 Mon Sep 17 00:00:00 2001 From: Francesco146 Date: Fri, 6 Sep 2024 11:06:14 +0200 Subject: [PATCH 1/4] feat(YouTube - Overlay Buttons): Add `Set Brightness` button --- .../patches/overlaybutton/SetBrightness.java | 70 +++++++++++++++++++ .../youtube/settings/Settings.java | 1 + 2 files changed, 71 insertions(+) create mode 100644 app/src/main/java/app/revanced/integrations/youtube/patches/overlaybutton/SetBrightness.java diff --git a/app/src/main/java/app/revanced/integrations/youtube/patches/overlaybutton/SetBrightness.java b/app/src/main/java/app/revanced/integrations/youtube/patches/overlaybutton/SetBrightness.java new file mode 100644 index 0000000000..420cb22d0e --- /dev/null +++ b/app/src/main/java/app/revanced/integrations/youtube/patches/overlaybutton/SetBrightness.java @@ -0,0 +1,70 @@ +package app.revanced.integrations.youtube.patches.overlaybutton; + +import android.view.View; +import android.view.ViewGroup; +import androidx.annotation.Nullable; +import app.revanced.integrations.shared.utils.Logger; +import app.revanced.integrations.youtube.settings.Settings; + +import static app.revanced.integrations.shared.utils.Utils.context; + +@SuppressWarnings("unused") +public class SetBrightness extends BottomControlButton { + @Nullable + private static SetBrightness instance; + + public SetBrightness(ViewGroup bottomControlsViewGroup) { + super( + bottomControlsViewGroup, + "set_brightness_button", + Settings.OVERLAY_BUTTON_SET_BRIGHTNESS, + view -> { + // between: 0 and 255 + int brightness = android.provider.Settings.System.getInt(context.getContentResolver(), android.provider.Settings.System.SCREEN_BRIGHTNESS, 0); + Logger.printInfo(() -> "Brightness: " + brightness); + // TODO: Tap to toggle between minimum and restored brightness + // Restore the previous brightness + // Store the current brightness and set it to minimum + }, + view -> { + // TODO: Long press to set brightness to maximum + return true; + } + ); + } + + /** + * Injection point. + */ + public static void initialize(View bottomControlsViewGroup) { + try { + if (bottomControlsViewGroup instanceof ViewGroup viewGroup) { + instance = new SetBrightness(viewGroup); + } + } catch (Exception ex) { + Logger.printException(() -> "initialize failure", ex); + } + } + + /** + * Injection point. + */ + public static void changeVisibility(boolean showing, boolean animation) { + if (instance != null) { + instance.setVisibility(showing, animation); + changeActivated(instance); + } + } + + public static void changeVisibilityNegatedImmediate() { + if (instance != null) { + instance.setVisibilityNegatedImmediate(); + changeActivated(instance); + } + } + + private static void changeActivated(SetBrightness instance) { + // TODO: Make this dynamic based on the current brightness + instance.changeActivated(true); + } +} diff --git a/app/src/main/java/app/revanced/integrations/youtube/settings/Settings.java b/app/src/main/java/app/revanced/integrations/youtube/settings/Settings.java index 5931cac753..c63f851338 100644 --- a/app/src/main/java/app/revanced/integrations/youtube/settings/Settings.java +++ b/app/src/main/java/app/revanced/integrations/youtube/settings/Settings.java @@ -322,6 +322,7 @@ public class Settings extends BaseSettings { public static final BooleanSetting OVERLAY_BUTTON_COPY_VIDEO_URL = new BooleanSetting("revanced_overlay_button_copy_video_url", FALSE); public static final BooleanSetting OVERLAY_BUTTON_COPY_VIDEO_URL_TIMESTAMP = new BooleanSetting("revanced_overlay_button_copy_video_url_timestamp", FALSE); public static final BooleanSetting OVERLAY_BUTTON_MUTE_VOLUME = new BooleanSetting("revanced_overlay_button_mute_volume", FALSE); + public static final BooleanSetting OVERLAY_BUTTON_SET_BRIGHTNESS = new BooleanSetting("revanced_overlay_button_set_brightness", FALSE); public static final BooleanSetting OVERLAY_BUTTON_EXTERNAL_DOWNLOADER = new BooleanSetting("revanced_overlay_button_external_downloader", FALSE); public static final BooleanSetting OVERLAY_BUTTON_SPEED_DIALOG = new BooleanSetting("revanced_overlay_button_speed_dialog", FALSE); public static final BooleanSetting OVERLAY_BUTTON_TIME_ORDERED_PLAYLIST = new BooleanSetting("revanced_overlay_button_time_ordered_playlist", FALSE); From ed4d150059f7016c9cb3bf10f62ca24a23088521 Mon Sep 17 00:00:00 2001 From: Francesco146 Date: Sun, 22 Sep 2024 17:15:53 +0200 Subject: [PATCH 2/4] feat(YouTube - Overlay buttons): Add basic implementation of the patch --- .../patches/overlaybutton/SetBrightness.java | 60 +++++++++++++++---- 1 file changed, 49 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/app/revanced/integrations/youtube/patches/overlaybutton/SetBrightness.java b/app/src/main/java/app/revanced/integrations/youtube/patches/overlaybutton/SetBrightness.java index 420cb22d0e..e7eb12333b 100644 --- a/app/src/main/java/app/revanced/integrations/youtube/patches/overlaybutton/SetBrightness.java +++ b/app/src/main/java/app/revanced/integrations/youtube/patches/overlaybutton/SetBrightness.java @@ -1,33 +1,65 @@ package app.revanced.integrations.youtube.patches.overlaybutton; +import android.app.Activity; import android.view.View; import android.view.ViewGroup; +import android.view.WindowManager; import androidx.annotation.Nullable; import app.revanced.integrations.shared.utils.Logger; import app.revanced.integrations.youtube.settings.Settings; -import static app.revanced.integrations.shared.utils.Utils.context; +import static app.revanced.integrations.shared.utils.Utils.getActivity; @SuppressWarnings("unused") public class SetBrightness extends BottomControlButton { @Nullable private static SetBrightness instance; + private static float previousBrightness = -2f; - public SetBrightness(ViewGroup bottomControlsViewGroup) { + private SetBrightness(ViewGroup bottomControlsViewGroup) { super( bottomControlsViewGroup, "set_brightness_button", Settings.OVERLAY_BUTTON_SET_BRIGHTNESS, view -> { - // between: 0 and 255 - int brightness = android.provider.Settings.System.getInt(context.getContentResolver(), android.provider.Settings.System.SCREEN_BRIGHTNESS, 0); - Logger.printInfo(() -> "Brightness: " + brightness); - // TODO: Tap to toggle between minimum and restored brightness - // Restore the previous brightness - // Store the current brightness and set it to minimum + try { + Activity activity = getActivity(); + WindowManager.LayoutParams layoutParams = activity.getWindow().getAttributes(); + Logger.printInfo(() -> "Current Brightness: " + layoutParams.screenBrightness); + + if (previousBrightness == -2f) { + previousBrightness = layoutParams.screenBrightness; + } + + float newBrightness = (layoutParams.screenBrightness == 0f) ? previousBrightness : 0f; + layoutParams.screenBrightness = newBrightness; + activity.getWindow().setAttributes(layoutParams); + + if (instance != null) { + changeActivated(instance); + } + + Logger.printInfo(() -> "Brightness set to: " + newBrightness); + } catch (Exception e) { + Logger.printException(() -> "Error toggling brightness", e); + } }, view -> { - // TODO: Long press to set brightness to maximum + try { + Activity activity = getActivity(); + WindowManager.LayoutParams layoutParams = activity.getWindow().getAttributes(); + previousBrightness = layoutParams.screenBrightness; + layoutParams.screenBrightness = 1f; + activity.getWindow().setAttributes(layoutParams); + + if (instance != null) { + changeActivated(instance); + } + + Logger.printInfo(() -> "Brightness set to maximum"); + } catch (Exception e) { + Logger.printException(() -> "Error setting brightness to maximum", e); + } return true; } ); @@ -64,7 +96,13 @@ public static void changeVisibilityNegatedImmediate() { } private static void changeActivated(SetBrightness instance) { - // TODO: Make this dynamic based on the current brightness - instance.changeActivated(true); + try { + Activity activity = getActivity(); + WindowManager.LayoutParams layoutParams = activity.getWindow().getAttributes(); + boolean isMinBrightness = layoutParams.screenBrightness <= 0.4f; + instance.changeActivated(isMinBrightness); + } catch (Exception e) { + Logger.printException(() -> "Error updating activation state", e); + } } } From b350680d1e50e1d05ab5e5cb42b79dbaee964085 Mon Sep 17 00:00:00 2001 From: Francesco146 Date: Sun, 22 Sep 2024 18:16:09 +0200 Subject: [PATCH 3/4] fix(YouTube - Overlay buttons): `previousBrightness` was not initialized properly --- .../youtube/patches/overlaybutton/SetBrightness.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/app/revanced/integrations/youtube/patches/overlaybutton/SetBrightness.java b/app/src/main/java/app/revanced/integrations/youtube/patches/overlaybutton/SetBrightness.java index e7eb12333b..85615324d7 100644 --- a/app/src/main/java/app/revanced/integrations/youtube/patches/overlaybutton/SetBrightness.java +++ b/app/src/main/java/app/revanced/integrations/youtube/patches/overlaybutton/SetBrightness.java @@ -28,7 +28,7 @@ private SetBrightness(ViewGroup bottomControlsViewGroup) { Logger.printInfo(() -> "Current Brightness: " + layoutParams.screenBrightness); if (previousBrightness == -2f) { - previousBrightness = layoutParams.screenBrightness; + previousBrightness = (float) android.provider.Settings.System.getInt(activity.getContentResolver(), android.provider.Settings.System.SCREEN_BRIGHTNESS); } float newBrightness = (layoutParams.screenBrightness == 0f) ? previousBrightness : 0f; @@ -48,7 +48,9 @@ private SetBrightness(ViewGroup bottomControlsViewGroup) { try { Activity activity = getActivity(); WindowManager.LayoutParams layoutParams = activity.getWindow().getAttributes(); - previousBrightness = layoutParams.screenBrightness; + if (previousBrightness == -2f) { + previousBrightness = (float) android.provider.Settings.System.getInt(activity.getContentResolver(), android.provider.Settings.System.SCREEN_BRIGHTNESS); + } layoutParams.screenBrightness = 1f; activity.getWindow().setAttributes(layoutParams); From 49949f41bab741644a1602a3d531de4cd6f60f89 Mon Sep 17 00:00:00 2001 From: Francesco146 Date: Sun, 22 Sep 2024 22:38:53 +0200 Subject: [PATCH 4/4] fix(YouTube - Overlay buttons): Add permissions handling in SetBrightness class --- .../patches/overlaybutton/SetBrightness.java | 77 +++++++++++++------ 1 file changed, 54 insertions(+), 23 deletions(-) diff --git a/app/src/main/java/app/revanced/integrations/youtube/patches/overlaybutton/SetBrightness.java b/app/src/main/java/app/revanced/integrations/youtube/patches/overlaybutton/SetBrightness.java index 85615324d7..9b41bef7fc 100644 --- a/app/src/main/java/app/revanced/integrations/youtube/patches/overlaybutton/SetBrightness.java +++ b/app/src/main/java/app/revanced/integrations/youtube/patches/overlaybutton/SetBrightness.java @@ -1,20 +1,27 @@ package app.revanced.integrations.youtube.patches.overlaybutton; import android.app.Activity; +import android.content.ContentResolver; +import android.content.Context; +import android.content.Intent; +import android.net.Uri; +import android.provider.Settings.System; import android.view.View; import android.view.ViewGroup; -import android.view.WindowManager; import androidx.annotation.Nullable; import app.revanced.integrations.shared.utils.Logger; import app.revanced.integrations.youtube.settings.Settings; +import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK; +import static android.provider.Settings.ACTION_MANAGE_WRITE_SETTINGS; +import static android.provider.Settings.System.SCREEN_BRIGHTNESS; import static app.revanced.integrations.shared.utils.Utils.getActivity; @SuppressWarnings("unused") public class SetBrightness extends BottomControlButton { @Nullable private static SetBrightness instance; - private static float previousBrightness = -2f; + private static int previousBrightness = -1; private SetBrightness(ViewGroup bottomControlsViewGroup) { super( @@ -24,22 +31,32 @@ private SetBrightness(ViewGroup bottomControlsViewGroup) { view -> { try { Activity activity = getActivity(); - WindowManager.LayoutParams layoutParams = activity.getWindow().getAttributes(); - Logger.printInfo(() -> "Current Brightness: " + layoutParams.screenBrightness); + ContentResolver contentResolver = activity.getContentResolver(); - if (previousBrightness == -2f) { - previousBrightness = (float) android.provider.Settings.System.getInt(activity.getContentResolver(), android.provider.Settings.System.SCREEN_BRIGHTNESS); + if (!System.canWrite(activity)) { + Intent intent = new Intent(ACTION_MANAGE_WRITE_SETTINGS); + intent.setData(Uri.parse("package:" + ((Context) activity).getPackageName())); + intent.addFlags(FLAG_ACTIVITY_NEW_TASK); + ((Context) activity).startActivity(intent); + return; } - float newBrightness = (layoutParams.screenBrightness == 0f) ? previousBrightness : 0f; - layoutParams.screenBrightness = newBrightness; - activity.getWindow().setAttributes(layoutParams); + int currentBrightness = System.getInt(contentResolver, SCREEN_BRIGHTNESS); - if (instance != null) { + if (previousBrightness == -1) + previousBrightness = currentBrightness; + + Logger.printInfo(() -> "Current brightness: " + currentBrightness); + + int newBrightness = currentBrightness == 0 ? previousBrightness : 0; + + System.putInt(contentResolver, SCREEN_BRIGHTNESS, newBrightness); + + if (instance != null) changeActivated(instance); - } Logger.printInfo(() -> "Brightness set to: " + newBrightness); + } catch (Exception e) { Logger.printException(() -> "Error toggling brightness", e); } @@ -47,18 +64,33 @@ private SetBrightness(ViewGroup bottomControlsViewGroup) { view -> { try { Activity activity = getActivity(); - WindowManager.LayoutParams layoutParams = activity.getWindow().getAttributes(); - if (previousBrightness == -2f) { - previousBrightness = (float) android.provider.Settings.System.getInt(activity.getContentResolver(), android.provider.Settings.System.SCREEN_BRIGHTNESS); + ContentResolver contentResolver = activity.getContentResolver(); + + if (!System.canWrite(activity)) { + Intent intent = new Intent(ACTION_MANAGE_WRITE_SETTINGS); + intent.setData(Uri.parse("package:" + ((Context) activity).getPackageName())); + intent.addFlags(FLAG_ACTIVITY_NEW_TASK); + ((Context) activity).startActivity(intent); + return true; } - layoutParams.screenBrightness = 1f; - activity.getWindow().setAttributes(layoutParams); - if (instance != null) { + int currentBrightness = System.getInt(contentResolver, SCREEN_BRIGHTNESS); + + // TODO: why previousBrightness is always 0? + if (previousBrightness == -1) + previousBrightness = currentBrightness; + + Logger.printInfo(() -> "Current brightness: " + currentBrightness); + + int newBrightness = currentBrightness == 255 ? previousBrightness : 255; + + System.putInt(contentResolver, SCREEN_BRIGHTNESS, newBrightness); + + if (instance != null) changeActivated(instance); - } - Logger.printInfo(() -> "Brightness set to maximum"); + Logger.printInfo(() -> "Brightness set to: " + newBrightness); + } catch (Exception e) { Logger.printException(() -> "Error setting brightness to maximum", e); } @@ -99,10 +131,9 @@ public static void changeVisibilityNegatedImmediate() { private static void changeActivated(SetBrightness instance) { try { - Activity activity = getActivity(); - WindowManager.LayoutParams layoutParams = activity.getWindow().getAttributes(); - boolean isMinBrightness = layoutParams.screenBrightness <= 0.4f; - instance.changeActivated(isMinBrightness); + ContentResolver contentResolver = getActivity().getContentResolver(); + boolean isBrightnessLowEnough = System.getInt(contentResolver, SCREEN_BRIGHTNESS) <= 120; // less than ~50% + instance.changeActivated(isBrightnessLowEnough); } catch (Exception e) { Logger.printException(() -> "Error updating activation state", e); }