From fafe7e2cd5395878a7fe935b5ae0d48e8edef4c7 Mon Sep 17 00:00:00 2001 From: partisan Date: Wed, 14 May 2025 14:31:05 +0200 Subject: [PATCH] Fancy toggle button for main menu --- .../weforge/xyz/pulse/MainFragment.kt | 28 ++++++++++++++---- .../partisan/weforge/xyz/pulse/Preferences.kt | 20 +++++++++---- .../weforge/xyz/pulse/WelcomeActivity.kt | 1 - app/src/main/res/color/toggle_button_bg.xml | 5 ++++ app/src/main/res/color/toggle_button_icon.xml | 5 ++++ .../res/drawable/ic_power_settings_new_24.xml | 9 ++++++ .../main/res/drawable/toggle_button_bg.xml | 13 +++++++++ .../res/drawable/toggle_button_bg_outline.xml | 8 +++++ app/src/main/res/layout/fragment_main.xml | 29 +++++++++++++++---- app/src/main/res/values/styles.xml | 7 +++++ app/src/main/res/values/themes.xml | 3 +- 11 files changed, 109 insertions(+), 19 deletions(-) create mode 100644 app/src/main/res/color/toggle_button_bg.xml create mode 100644 app/src/main/res/color/toggle_button_icon.xml create mode 100644 app/src/main/res/drawable/ic_power_settings_new_24.xml create mode 100644 app/src/main/res/drawable/toggle_button_bg.xml create mode 100644 app/src/main/res/drawable/toggle_button_bg_outline.xml create mode 100644 app/src/main/res/values/styles.xml diff --git a/app/src/main/java/partisan/weforge/xyz/pulse/MainFragment.kt b/app/src/main/java/partisan/weforge/xyz/pulse/MainFragment.kt index aff9684..f819ae8 100644 --- a/app/src/main/java/partisan/weforge/xyz/pulse/MainFragment.kt +++ b/app/src/main/java/partisan/weforge/xyz/pulse/MainFragment.kt @@ -1,27 +1,43 @@ package partisan.weforge.xyz.pulse import android.os.Bundle +import android.util.Log import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import android.widget.ToggleButton import androidx.fragment.app.Fragment +import com.google.android.material.button.MaterialButton class MainFragment : Fragment() { private lateinit var prefs: Preferences override fun onCreateView( - inflater: LayoutInflater, container: ViewGroup?, + inflater: LayoutInflater, + container: ViewGroup?, savedInstanceState: Bundle? ): View { val view = inflater.inflate(R.layout.fragment_main, container, false) prefs = Preferences(requireContext()) - val toggle = view.findViewById(R.id.toggle) - toggle.isChecked = prefs.isEnabled - toggle.setOnCheckedChangeListener { _, isChecked -> - prefs.isEnabled = isChecked + val toggle = view.findViewById(R.id.toggle) + toggle.isCheckable = true + toggle.isChecked = prefs.isServiceEnabledByUser + + toggle.setOnClickListener { + // the button toggles itself internally since it's checkable + val isNowChecked = toggle.isChecked + prefs.isServiceEnabledByUser = isNowChecked + + // Log.d("ButtonState", """ + // User toggle: $isNowChecked + // Prefs effective state (hasPerms): ${prefs.isEnabled} + // """.trimIndent()) + + toggle.post { + toggle.jumpDrawablesToCurrentState() + toggle.invalidate() + } } return view diff --git a/app/src/main/java/partisan/weforge/xyz/pulse/Preferences.kt b/app/src/main/java/partisan/weforge/xyz/pulse/Preferences.kt index 6616787..ec22994 100644 --- a/app/src/main/java/partisan/weforge/xyz/pulse/Preferences.kt +++ b/app/src/main/java/partisan/weforge/xyz/pulse/Preferences.kt @@ -4,9 +4,9 @@ import android.content.Context import androidx.core.content.edit import androidx.preference.PreferenceManager -class Preferences(ctx: Context) { +class Preferences(private val context: Context) { + companion object { - private const val ENABLED = "enabled" private const val REDIRECTION_DELAY = "redirection_delay" private const val POPUP_POSITION = "popup_position_y" private const val POPUP_ENABLED = "popup_enabled" @@ -17,11 +17,19 @@ class Preferences(ctx: Context) { private const val SERVICE_ENABLED = "service_enabled" } - private val prefs = PreferenceManager.getDefaultSharedPreferences(ctx) + private val prefs = PreferenceManager.getDefaultSharedPreferences(context) - var isEnabled: Boolean - get() = prefs.getBoolean(ENABLED, prefs.getBoolean(SERVICE_ENABLED, false)) - set(value) = prefs.edit { putBoolean(ENABLED, value) } + // Whether user enabled/disabled the service manually by tiggle button + var isServiceEnabledByUser: Boolean + get() = prefs.getBoolean(SERVICE_ENABLED, false) + set(value) = prefs.edit { putBoolean(SERVICE_ENABLED, value) } + + // True only if all required permissions + toggle are satisfied + val isEnabled: Boolean + get() = isServiceEnabledByUser && + hasGeneralPermissions(context) && + hasDrawOverlays(context) && + hasCallRedirectionRole(context) var popupEnabled: Boolean get() = prefs.getBoolean(POPUP_ENABLED, true) diff --git a/app/src/main/java/partisan/weforge/xyz/pulse/WelcomeActivity.kt b/app/src/main/java/partisan/weforge/xyz/pulse/WelcomeActivity.kt index c0577dc..34dbc90 100644 --- a/app/src/main/java/partisan/weforge/xyz/pulse/WelcomeActivity.kt +++ b/app/src/main/java/partisan/weforge/xyz/pulse/WelcomeActivity.kt @@ -64,7 +64,6 @@ class WelcomeActivity : AppCompatActivity() { requestRoleLauncher.launch(roleManager?.createRequestRoleIntent(RoleManager.ROLE_CALL_REDIRECTION)) } else -> { - prefs.isEnabled = true showConfettiAndContinue() } } diff --git a/app/src/main/res/color/toggle_button_bg.xml b/app/src/main/res/color/toggle_button_bg.xml new file mode 100644 index 0000000..1c33f06 --- /dev/null +++ b/app/src/main/res/color/toggle_button_bg.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/app/src/main/res/color/toggle_button_icon.xml b/app/src/main/res/color/toggle_button_icon.xml new file mode 100644 index 0000000..ae21493 --- /dev/null +++ b/app/src/main/res/color/toggle_button_icon.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_power_settings_new_24.xml b/app/src/main/res/drawable/ic_power_settings_new_24.xml new file mode 100644 index 0000000..f134c90 --- /dev/null +++ b/app/src/main/res/drawable/ic_power_settings_new_24.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/toggle_button_bg.xml b/app/src/main/res/drawable/toggle_button_bg.xml new file mode 100644 index 0000000..4d684f6 --- /dev/null +++ b/app/src/main/res/drawable/toggle_button_bg.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/toggle_button_bg_outline.xml b/app/src/main/res/drawable/toggle_button_bg_outline.xml new file mode 100644 index 0000000..a459ecd --- /dev/null +++ b/app/src/main/res/drawable/toggle_button_bg_outline.xml @@ -0,0 +1,8 @@ + + + + + diff --git a/app/src/main/res/layout/fragment_main.xml b/app/src/main/res/layout/fragment_main.xml index 83e7f0d..943850b 100644 --- a/app/src/main/res/layout/fragment_main.xml +++ b/app/src/main/res/layout/fragment_main.xml @@ -1,12 +1,31 @@ - - + + + android:layout_width="96dp" + android:layout_height="96dp" + android:layout_gravity="center" + android:checkable="true" + android:insetTop="0dp" + android:insetBottom="0dp" + android:insetLeft="0dp" + android:insetRight="0dp" + android:text="" + app:icon="@drawable/ic_power_settings_new_24" + app:iconTint="@color/toggle_button_icon" + app:backgroundTint="@color/toggle_button_bg" + app:iconSize="48dp" + app:iconGravity="textTop" + app:iconPadding="0dp" + app:cornerRadius="48dp" /> diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml new file mode 100644 index 0000000..eabcdff --- /dev/null +++ b/app/src/main/res/values/styles.xml @@ -0,0 +1,7 @@ + + + + diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml index ad74a04..1c43235 100644 --- a/app/src/main/res/values/themes.xml +++ b/app/src/main/res/values/themes.xml @@ -8,8 +8,9 @@ @color/teal_200 @color/black - @color/white + @color/white @color/black @style/TextAppearance.Material3.BodyMedium + ?attr/colorSurfaceContainerLowest \ No newline at end of file