diff --git a/app/src/main/java/com/drdisagree/iconify/data/common/Preferences.kt b/app/src/main/java/com/drdisagree/iconify/data/common/Preferences.kt
index 356ede3d0..48f54212f 100644
--- a/app/src/main/java/com/drdisagree/iconify/data/common/Preferences.kt
+++ b/app/src/main/java/com/drdisagree/iconify/data/common/Preferences.kt
@@ -58,6 +58,7 @@ object Preferences {
const val CHIP_STATUS_ICONS_RADIUS_BOTTOM_RIGHT = "xposed_chipstatusiconsradiusbottomright"
const val CHIP_STATUS_ICONS_RADIUS_BOTTOM_LEFT = "xposed_chipstatusiconsradiusbottomleft"
const val VERTICAL_QSTILE_SWITCH = "xposed_verticalqstile"
+ const val HORIZONTAL_QSTILE_SWITCH = "xposed_horizontalqstile"
const val HIDE_QSLABEL_SWITCH = "xposed_hideqslabel"
const val VOLUME_PANEL_PERCENTAGE = "xposed_volumepanelpercentage"
const val VOLUME_PANEL_SAFETY_WARNING = "xposed_volumepanelsafetywarning"
diff --git a/app/src/main/java/com/drdisagree/iconify/ui/fragments/xposed/QuickSettings.kt b/app/src/main/java/com/drdisagree/iconify/ui/fragments/xposed/QuickSettings.kt
index b52393162..04e67aaef 100644
--- a/app/src/main/java/com/drdisagree/iconify/ui/fragments/xposed/QuickSettings.kt
+++ b/app/src/main/java/com/drdisagree/iconify/ui/fragments/xposed/QuickSettings.kt
@@ -1,5 +1,6 @@
package com.drdisagree.iconify.ui.fragments.xposed
+import android.os.Bundle
import com.drdisagree.iconify.R
import com.drdisagree.iconify.data.common.Preferences.COLORED_NOTIFICATION_ALTERNATIVE_SWITCH
import com.drdisagree.iconify.data.common.Preferences.COLORED_NOTIFICATION_ICON_SWITCH
@@ -11,14 +12,19 @@ import com.drdisagree.iconify.data.common.Preferences.FIX_QS_TILE_COLOR
import com.drdisagree.iconify.data.common.Preferences.HIDE_QSLABEL_SWITCH
import com.drdisagree.iconify.data.common.Preferences.HIDE_QS_SILENT_TEXT
import com.drdisagree.iconify.data.common.Preferences.HIDE_STATUS_ICONS_SWITCH
+import com.drdisagree.iconify.data.common.Preferences.HORIZONTAL_QSTILE_SWITCH
import com.drdisagree.iconify.data.common.Preferences.QSPANEL_HIDE_CARRIER
import com.drdisagree.iconify.data.common.Preferences.SELECTED_QS_TEXT_COLOR
import com.drdisagree.iconify.data.common.Preferences.VERTICAL_QSTILE_SWITCH
import com.drdisagree.iconify.ui.activities.MainActivity
import com.drdisagree.iconify.ui.base.ControlledPreferenceFragmentCompat
+import com.drdisagree.iconify.ui.preferences.SwitchPreference
class QuickSettings : ControlledPreferenceFragmentCompat() {
+ private var verticalPref: SwitchPreference? = null
+ private var horizontalPref: SwitchPreference? = null
+
override val title: String
get() = getString(R.string.activity_title_quick_settings)
@@ -31,11 +37,35 @@ class QuickSettings : ControlledPreferenceFragmentCompat() {
override val hasMenu: Boolean
get() = true
+ override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
+ super.onCreatePreferences(savedInstanceState, rootKey)
+
+ verticalPref = findPreference(VERTICAL_QSTILE_SWITCH)
+ horizontalPref = findPreference(HORIZONTAL_QSTILE_SWITCH)
+
+ updateMutualExclusion()
+ }
+
+ private fun updateMutualExclusion() {
+ verticalPref?.let { v ->
+ horizontalPref?.let { h ->
+ h.isEnabled = !v.isChecked
+ v.isEnabled = !h.isChecked
+ }
+ }
+ }
+
override fun updateScreen(key: String?) {
super.updateScreen(key)
when (key) {
VERTICAL_QSTILE_SWITCH,
+ HORIZONTAL_QSTILE_SWITCH -> updateMutualExclusion()
+ }
+
+ when (key) {
+ VERTICAL_QSTILE_SWITCH,
+ HORIZONTAL_QSTILE_SWITCH,
CUSTOM_QS_TEXT_COLOR,
SELECTED_QS_TEXT_COLOR,
HIDE_QSLABEL_SWITCH,
diff --git a/app/src/main/java/com/drdisagree/iconify/xposed/modules/quicksettings/QuickSettings.kt b/app/src/main/java/com/drdisagree/iconify/xposed/modules/quicksettings/QuickSettings.kt
index 257bd91aa..01d24d133 100644
--- a/app/src/main/java/com/drdisagree/iconify/xposed/modules/quicksettings/QuickSettings.kt
+++ b/app/src/main/java/com/drdisagree/iconify/xposed/modules/quicksettings/QuickSettings.kt
@@ -40,6 +40,7 @@ import com.drdisagree.iconify.data.common.Preferences.QQS_TOPMARGIN_PORTRAIT
import com.drdisagree.iconify.data.common.Preferences.QS_TOPMARGIN_LANDSCAPE
import com.drdisagree.iconify.data.common.Preferences.QS_TOPMARGIN_PORTRAIT
import com.drdisagree.iconify.data.common.Preferences.SELECTED_QS_TEXT_COLOR
+import com.drdisagree.iconify.data.common.Preferences.HORIZONTAL_QSTILE_SWITCH
import com.drdisagree.iconify.data.common.Preferences.VERTICAL_QSTILE_SWITCH
import com.drdisagree.iconify.xposed.ModPack
import com.drdisagree.iconify.xposed.modules.extras.utils.DisplayUtils.isLandscape
@@ -88,6 +89,7 @@ class QuickSettings(context: Context) : ModPack(context) {
private var mKeyguardStateController: Any? = null
private val isAtLeastAndroid14 = Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE
private var isVerticalQSTileActive = false
+ private var isHorizontalQSTileActive = false
private var isHideLabelActive = false
private var customQsMarginsEnabled = false
private var qsTilePrimaryTextSize: Float? = null
@@ -98,6 +100,7 @@ class QuickSettings(context: Context) : ModPack(context) {
override fun updatePrefs(vararg key: String) {
Xprefs.apply {
isVerticalQSTileActive = getBoolean(VERTICAL_QSTILE_SWITCH, false)
+ isHorizontalQSTileActive = getBoolean(HORIZONTAL_QSTILE_SWITCH, false)
isHideLabelActive = getBoolean(HIDE_QSLABEL_SWITCH, false)
customQsMarginsEnabled = getBoolean(CUSTOM_QS_MARGIN, false)
qqsTopMarginPort = getSliderInt(QQS_TOPMARGIN_PORTRAIT, 100)
@@ -126,6 +129,7 @@ class QuickSettings(context: Context) : ModPack(context) {
override fun handleLoadPackage(loadPackageParam: LoadPackageParam) {
initQsAccentColor()
setVerticalTiles()
+ setHorizontalTiles()
setQsMargin()
fixQsTileAndLabelColorA14()
fixNotificationColorA14()
@@ -229,6 +233,76 @@ class QuickSettings(context: Context) : ModPack(context) {
}
}
+ private fun setHorizontalTiles() {
+ val qsTileViewImplClass = findClass("$SYSTEMUI_PACKAGE.qs.tileimpl.QSTileViewImpl")
+
+ qsTileViewImplClass
+ .hookConstructor()
+ .runAfter { param ->
+ if (!isHorizontalQSTileActive || isVerticalQSTileActive) return@runAfter
+
+ try {
+ val tile = param.thisObject as LinearLayout
+
+ tile.orientation = LinearLayout.HORIZONTAL
+ tile.gravity = Gravity.CENTER_VERTICAL or Gravity.START
+
+ val labelContainer = param.thisObject.getField(
+ "labelContainer"
+ ) as LinearLayout
+
+ labelContainer.layoutParams = LinearLayout.LayoutParams(
+ 0,
+ LinearLayout.LayoutParams.WRAP_CONTENT,
+ 1f
+ ).apply {
+ marginStart = mContext.toPx(8)
+ }
+
+ (param.thisObject.getField(
+ "label"
+ ) as TextView).apply {
+ textAlignment = View.TEXT_ALIGNMENT_VIEW_START
+ }
+
+ (param.thisObject.getField(
+ "secondaryLabel"
+ ) as TextView).apply {
+ textAlignment = View.TEXT_ALIGNMENT_VIEW_START
+ }
+
+ (param.thisObject.getField("sideView") as View).visibility = View.GONE
+ } catch (throwable: Throwable) {
+ log(this@QuickSettings, throwable)
+ }
+ }
+
+ qsTileViewImplClass
+ .hookMethod("onConfigurationChanged")
+ .runAfter { param ->
+ if (!isHorizontalQSTileActive || isVerticalQSTileActive) return@runAfter
+
+ try {
+ val tile = param.thisObject as LinearLayout
+
+ tile.orientation = LinearLayout.HORIZONTAL
+ tile.gravity = Gravity.CENTER_VERTICAL or Gravity.START
+
+ val labelContainer = param.thisObject.getField(
+ "labelContainer"
+ ) as LinearLayout
+
+ (labelContainer.layoutParams as LinearLayout.LayoutParams).apply {
+ width = 0
+ weight = 1f
+ marginStart = mContext.toPx(8)
+ }
+ } catch (throwable: Throwable) {
+ log(this@QuickSettings, throwable)
+ }
+ }
+ }
+
private fun setQsMargin() {
fun getQqsMargin() = if (mContext.isLandscape) qqsTopMarginLand else qqsTopMarginPort
fun getQsMargin() = if (mContext.isLandscape) qsTopMarginLand else qsTopMarginPort
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index b6bf49cfc..3ee118ec9 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -602,6 +602,8 @@
QS Tile
Vertical QS Tile
Show label below QS icon
+ Horizontal QS Tile
+ Show label beside QS icon (recommended with 2 columns)
Hide QS Tile Label
Use only with vertical tiles
Text Size Scaling
diff --git a/app/src/main/res/xml/xposed_quick_settings.xml b/app/src/main/res/xml/xposed_quick_settings.xml
index e5e1d4a8f..a0fd84064 100644
--- a/app/src/main/res/xml/xposed_quick_settings.xml
+++ b/app/src/main/res/xml/xposed_quick_settings.xml
@@ -57,6 +57,13 @@
android:title="@string/hide_qs_tile_label_title"
app:iconSpaceReserved="false" />
+
+
+