From a8ce00f74ace7447d74c5a1d8d6cc73b40eebf90 Mon Sep 17 00:00:00 2001 From: Matt Van Horn <455140+mvanhorn@users.noreply.github.com> Date: Tue, 3 Nov 2026 04:08:25 -0800 Subject: [PATCH 1/2] fix: separate volume dialog, button and track corner radius controls MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The settings screen now exposes separate dialog, slider track, and selected ringer button radius controls. The existing preference controls dialog backgrounds, while two new preferences control the track and selected button independently and default to zero. Each control retains the −50 to +50 dp range and reset button on Android 16 and later, and changes trigger the SystemUI restart prompt. Refs #987 --- .../drdisagree/iconify/data/keys/XposedKey.kt | 4 +- .../volumepanel/screens/VolumePanelScreen.kt | 37 ++++++++++++------- .../xposed/modules/misc/ComposeShapes.kt | 19 +++++++--- app/src/main/res/values/strings.xml | 3 ++ 4 files changed, 42 insertions(+), 21 deletions(-) diff --git a/app/src/main/java/com/drdisagree/iconify/data/keys/XposedKey.kt b/app/src/main/java/com/drdisagree/iconify/data/keys/XposedKey.kt index b44ced126..97b4a471f 100644 --- a/app/src/main/java/com/drdisagree/iconify/data/keys/XposedKey.kt +++ b/app/src/main/java/com/drdisagree/iconify/data/keys/XposedKey.kt @@ -327,5 +327,7 @@ enum class XposedKey(override val default: Any?) : Key { VOLUME_PANEL_APP_VOLUME(false), VOLUME_PANEL_MULTI_AUDIO_FOCUS(false), VOLUME_CORNER_RADIUS_OFFSET(0f), + VOLUME_TRACK_CORNER_RADIUS_OFFSET(0f), + VOLUME_RINGER_BUTTON_CORNER_RADIUS_OFFSET(0f), HIDE_VOLUME_SLIDER_THUMB(false), -} \ No newline at end of file +} diff --git a/app/src/main/java/com/drdisagree/iconify/features/xposed/volumepanel/screens/VolumePanelScreen.kt b/app/src/main/java/com/drdisagree/iconify/features/xposed/volumepanel/screens/VolumePanelScreen.kt index 70278b667..a61c7b82f 100644 --- a/app/src/main/java/com/drdisagree/iconify/features/xposed/volumepanel/screens/VolumePanelScreen.kt +++ b/app/src/main/java/com/drdisagree/iconify/features/xposed/volumepanel/screens/VolumePanelScreen.kt @@ -17,6 +17,12 @@ import com.drdisagree.iconify.data.keys.XposedKey import com.drdisagree.iconify.features.common.viewmodels.SystemActionViewModel import kotlin.math.roundToInt +private val radiusSliders = listOf( + XposedKey.VOLUME_CORNER_RADIUS_OFFSET to R.string.volume_dialog_radius_title, + XposedKey.VOLUME_TRACK_CORNER_RADIUS_OFFSET to R.string.volume_track_radius_title, + XposedKey.VOLUME_RINGER_BUTTON_CORNER_RADIUS_OFFSET to R.string.volume_ringer_button_radius_title, +) + val volumePanelPreferences = preferenceScreen { category { switch( @@ -45,19 +51,20 @@ val volumePanelPreferences = preferenceScreen { } category(title = stringRes(R.string.section_title_volume_shape)) { - slider( - key = XposedKey.VOLUME_CORNER_RADIUS_OFFSET, - title = stringRes(R.string.volume_corner_radius_offset_title), - summary = { stringRes(R.string.volume_corner_radius_offset_desc) }, - min = -50f, - max = 50f, - valueLabel = { value -> - val offset = value.roundToInt() - if (offset > 0) "+${offset}dp" else "${offset}dp" - }, - showResetButton = true, - isVisible = { Build.VERSION.SDK_INT >= 36 }, - ) + radiusSliders.forEach { (key, title) -> + slider( + key = key, + title = stringRes(title), + min = -50f, + max = 50f, + valueLabel = { value -> + val offset = value.roundToInt() + if (offset > 0) "+${offset}dp" else "${offset}dp" + }, + showResetButton = true, + isVisible = { Build.VERSION.SDK_INT >= 36 }, + ) + } switch( key = XposedKey.HIDE_VOLUME_SLIDER_THUMB, @@ -78,6 +85,8 @@ fun VolumePanelScreen( XposedKey.VOLUME_PANEL_SAFETY_WARNING.name, XposedKey.VOLUME_PANEL_APP_VOLUME.name, XposedKey.VOLUME_CORNER_RADIUS_OFFSET.name, + XposedKey.VOLUME_TRACK_CORNER_RADIUS_OFFSET.name, + XposedKey.VOLUME_RINGER_BUTTON_CORNER_RADIUS_OFFSET.name, XposedKey.HIDE_VOLUME_SLIDER_THUMB.name -> { systemActionViewModel?.shouldRestartSystemUI() } @@ -103,4 +112,4 @@ private fun VolumePanelScreenPreview() { PreviewComposable { VolumePanelScreen(null) } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/drdisagree/iconify/xposed/modules/misc/ComposeShapes.kt b/app/src/main/java/com/drdisagree/iconify/xposed/modules/misc/ComposeShapes.kt index 8dc88c0e6..7c264d208 100644 --- a/app/src/main/java/com/drdisagree/iconify/xposed/modules/misc/ComposeShapes.kt +++ b/app/src/main/java/com/drdisagree/iconify/xposed/modules/misc/ComposeShapes.kt @@ -33,6 +33,8 @@ class ComposeShapes(context: Context) : ModPack(context) { private var inactiveIconCornerRadiusOffset = 0f private var footerButtonsCornerRadiusOffset = 0f private var notificationCornerRadiusOffset = 0f + private var volumeDialogCornerRadiusOffset = 0f + private var volumeRingerButtonCornerRadiusOffset = 0f private var qsSliderStyle = SliderStyle() private var volumeSliderStyle = SliderStyle() private var pillShapeCache: Pair? = null @@ -77,12 +79,15 @@ class ComposeShapes(context: Context) : ModPack(context) { footerButtonsCornerRadiusOffset = getFloat(XposedKey.QS_FOOTER_BUTTONS_CORNER_RADIUS_OFFSET) notificationCornerRadiusOffset = getFloat(XposedKey.NOTIFICATION_CORNER_RADIUS_OFFSET) + volumeDialogCornerRadiusOffset = getFloat(XposedKey.VOLUME_CORNER_RADIUS_OFFSET) + volumeRingerButtonCornerRadiusOffset = + getFloat(XposedKey.VOLUME_RINGER_BUTTON_CORNER_RADIUS_OFFSET) qsSliderStyle = SliderStyle( cornerRadiusOffset = getFloat(XposedKey.QS_BRIGHTNESS_SLIDER_CORNER_RADIUS_OFFSET), hideThumb = getBoolean(XposedKey.HIDE_QS_SLIDER_THUMB) ) volumeSliderStyle = SliderStyle( - cornerRadiusOffset = getFloat(XposedKey.VOLUME_CORNER_RADIUS_OFFSET), + cornerRadiusOffset = getFloat(XposedKey.VOLUME_TRACK_CORNER_RADIUS_OFFSET), hideThumb = getBoolean(XposedKey.HIDE_VOLUME_SLIDER_THUMB) ) } @@ -182,9 +187,10 @@ class ComposeShapes(context: Context) : ModPack(context) { NOTIFICATION_RADIUS_DIMENS.forEach { dimenHook.addOffset(it) { notificationCornerRadiusOffset } } - VOLUME_RADIUS_DIMENS.forEach { - dimenHook.addOffset(it) { volumeSliderStyle.cornerRadiusOffset } + VOLUME_DIALOG_RADIUS_DIMENS.forEach { + dimenHook.addOffset(it) { volumeDialogCornerRadiusOffset } } + dimenHook.addOffset(VOLUME_RINGER_BUTTON_RADIUS_DIMEN) { volumeRingerButtonCornerRadiusOffset } dimenHook.apply() } @@ -465,13 +471,14 @@ class ComposeShapes(context: Context) : ModPack(context) { private const val INACTIVE_ICON_RADIUS_DIMEN = "common_tile_default_inactive_icon_corner_radius" private const val ICON_SHAPE_LABEL = "Icon" - private val VOLUME_RADIUS_DIMENS = listOf( + private val VOLUME_DIALOG_RADIUS_DIMENS = listOf( "volume_dialog_background_corner_radius", "volume_dialog_background_square_corner_radius", "volume_dialog_floating_slider_background_corner_radius", - "volume_dialog_horizontal_background_corner_radius", - "volume_dialog_ringer_selected_button_background_radius" + "volume_dialog_horizontal_background_corner_radius" ) + private const val VOLUME_RINGER_BUTTON_RADIUS_DIMEN = + "volume_dialog_ringer_selected_button_background_radius" private const val ROUNDED_CORNER_SHAPE_CLASS = "androidx.compose.foundation.shape.RoundedCornerShape" private const val CORNER_SIZE_CLASS = "androidx.compose.foundation.shape.CornerSize" diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 4d623dc40..f1dfd8aee 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1095,6 +1095,9 @@ Shape & Slider Corner Radius Dialog, buttons and sliders + Dialog Corner Radius + Slider Track Corner Radius + Selected Ringer Button Corner Radius Hide Slider Thumb Volume sliders Lock Screen From 70d2b6c8966ffd4390b8b29aa8f74fe8b3957542 Mon Sep 17 00:00:00 2001 From: DrDisagree <29881338+Mahmud0808@users.noreply.github.com> Date: Tue, 3 Nov 2026 18:32:04 +0600 Subject: [PATCH 2/2] Shorten volume radius titles and handle hardcoded floating slider radius --- .../xposed/modules/misc/ComposeShapes.kt | 26 +++++++++++++++++++ app/src/main/res/values/strings.xml | 8 +++--- 2 files changed, 29 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/com/drdisagree/iconify/xposed/modules/misc/ComposeShapes.kt b/app/src/main/java/com/drdisagree/iconify/xposed/modules/misc/ComposeShapes.kt index 7c264d208..04c5fe91c 100644 --- a/app/src/main/java/com/drdisagree/iconify/xposed/modules/misc/ComposeShapes.kt +++ b/app/src/main/java/com/drdisagree/iconify/xposed/modules/misc/ComposeShapes.kt @@ -1,5 +1,6 @@ package com.drdisagree.iconify.xposed.modules.misc +import android.annotation.SuppressLint import android.content.Context import android.graphics.drawable.Drawable import android.graphics.drawable.DrawableWrapper @@ -12,6 +13,7 @@ import com.drdisagree.iconify.xposed.ModPack import com.drdisagree.iconify.xposed.core.PackageParam import com.drdisagree.iconify.xposed.core.compose.ComposeToolkit import com.drdisagree.iconify.xposed.core.hook.hookMethodMatchPattern +import com.drdisagree.iconify.xposed.core.layout.hookLayout import com.drdisagree.iconify.xposed.core.hook.proceedWithArgs import com.drdisagree.iconify.xposed.core.reflect.callMethodSilently import com.drdisagree.iconify.xposed.core.reflect.findClass @@ -95,6 +97,7 @@ class ComposeShapes(context: Context) : ModPack(context) { override fun handleLoadPackage(packageParam: PackageParam) { hookDimenOffsets() + hookFloatingVolumeSliderBackground() hookTileCornerRadius() hookSliderTrack() hookSliderThumb() @@ -175,6 +178,26 @@ class ComposeShapes(context: Context) : ModPack(context) { return shape } + @SuppressLint("DiscouragedApi") + private fun hookFloatingVolumeSliderBackground() { + val resources = mContext.resources + if (resources.getIdentifier(VOLUME_FLOATING_SLIDER_RADIUS_DIMEN, "dimen", SYSTEMUI_PACKAGE) != 0) return + if (resources.getIdentifier(VOLUME_FLOATING_SLIDER_LAYOUT, "layout", SYSTEMUI_PACKAGE) == 0) return + + hookLayout() + .packageName(SYSTEMUI_PACKAGE) + .resource("layout", VOLUME_FLOATING_SLIDER_LAYOUT) + .suppressError() + .run { param -> + val offset = volumeDialogCornerRadiusOffset + if (offset == 0f) return@run + + val background = param.view.background?.mutate() as? GradientDrawable ?: return@run + val offsetPx = offset * param.res.displayMetrics.density + background.cornerRadius = (background.cornerRadius + offsetPx).coerceAtLeast(0f) + } + } + private fun hookDimenOffsets() { val dimenHook = ResourceHookManager .hookDimen() @@ -477,6 +500,9 @@ class ComposeShapes(context: Context) : ModPack(context) { "volume_dialog_floating_slider_background_corner_radius", "volume_dialog_horizontal_background_corner_radius" ) + private const val VOLUME_FLOATING_SLIDER_RADIUS_DIMEN = + "volume_dialog_floating_slider_background_corner_radius" + private const val VOLUME_FLOATING_SLIDER_LAYOUT = "volume_dialog_slider_floating" private const val VOLUME_RINGER_BUTTON_RADIUS_DIMEN = "volume_dialog_ringer_selected_button_background_radius" private const val ROUNDED_CORNER_SHAPE_CLASS = diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index f1dfd8aee..b4ddc4b6c 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1093,11 +1093,9 @@ Hide Slider Thumb Brightness slider Shape & Slider - Corner Radius - Dialog, buttons and sliders - Dialog Corner Radius - Slider Track Corner Radius - Selected Ringer Button Corner Radius + Dialog Radius + Track Radius + Ringer Button Radius Hide Slider Thumb Volume sliders Lock Screen