From f8aeb6da105f92bcd6cf4eeac5e2263028069daf Mon Sep 17 00:00:00 2001 From: partisan Date: Tue, 27 May 2025 18:56:59 +0200 Subject: [PATCH] Some final changes --- .forgejo/workflows/release.yaml | 3 - .gitignore | 3 +- README.md | 12 ++- .../xyz/pulse}/ExampleInstrumentedTest.kt | 0 .../weforge/xyz/pulse/MainActivity.kt | 19 ++++ .../xyz/pulse/PopupSettingsFragment.kt | 56 ++++++++---- .../partisan/weforge/xyz/pulse/PopupWindow.kt | 2 +- .../partisan/weforge/xyz/pulse/Preferences.kt | 14 ++- .../weforge/xyz/pulse/WelcomeActivity.kt | 6 +- app/src/main/res/layout/fragment_donate.xml | 8 ++ app/src/main/res/menu/main_menu.xml | 81 ++++++++++-------- app/src/main/res/values/strings.xml | 2 + data/screenshot-redirecting.png | Bin 93791 -> 0 bytes data/screenshot.png | Bin 130074 -> 0 bytes .../metadata/android/en-US/changelogs/15.txt | 6 ++ .../android/en-US/images/featureGraphic.png | Bin 166530 -> 145446 bytes .../metadata/android/en-US/images/icon.png | Bin 61473 -> 56837 bytes .../en-US/images/phoneScreenshots/1.png | Bin 142863 -> 167134 bytes .../en-US/images/phoneScreenshots/2.png | Bin 66645 -> 71264 bytes .../en-US/images/phoneScreenshots/3.png | Bin 82560 -> 85772 bytes .../en-US/images/phoneScreenshots/4.png | Bin 86959 -> 96991 bytes .../en-US/images/phoneScreenshots/5.png | Bin 100120 -> 110754 bytes .../en-US/images/phoneScreenshots/6.png | Bin 113207 -> 124223 bytes gradle/wrapper/gradle-wrapper.jar | Bin 43764 -> 45674 bytes gradle/wrapper/gradle-wrapper.properties | 2 +- gradlew | 2 +- 26 files changed, 154 insertions(+), 62 deletions(-) rename app/src/androidTest/java/{me/lucky/red => partisan/weforge/xyz/pulse}/ExampleInstrumentedTest.kt (100%) delete mode 100644 data/screenshot-redirecting.png delete mode 100644 data/screenshot.png diff --git a/.forgejo/workflows/release.yaml b/.forgejo/workflows/release.yaml index 40c841a..452681c 100644 --- a/.forgejo/workflows/release.yaml +++ b/.forgejo/workflows/release.yaml @@ -1,9 +1,6 @@ name: Android Release Build on: - push: - tags: - - '*' workflow_dispatch: {} jobs: diff --git a/.gitignore b/.gitignore index f36e40f..9a16767 100644 --- a/.gitignore +++ b/.gitignore @@ -14,4 +14,5 @@ .cxx local.properties release-key.jks -check.py \ No newline at end of file +check.py +round.sh \ No newline at end of file diff --git a/README.md b/README.md index 545e2d6..9ac9d9e 100644 --- a/README.md +++ b/README.md @@ -30,11 +30,19 @@ Redirecting outgoing calls to E2EE apps.

- Main screen + Main screen      - Redirecting popup + Redirecting popup + +      + + Redirecting popup + +      + + Redirecting popup

diff --git a/app/src/androidTest/java/me/lucky/red/ExampleInstrumentedTest.kt b/app/src/androidTest/java/partisan/weforge/xyz/pulse/ExampleInstrumentedTest.kt similarity index 100% rename from app/src/androidTest/java/me/lucky/red/ExampleInstrumentedTest.kt rename to app/src/androidTest/java/partisan/weforge/xyz/pulse/ExampleInstrumentedTest.kt diff --git a/app/src/main/java/partisan/weforge/xyz/pulse/MainActivity.kt b/app/src/main/java/partisan/weforge/xyz/pulse/MainActivity.kt index ecb7e92..77883b6 100644 --- a/app/src/main/java/partisan/weforge/xyz/pulse/MainActivity.kt +++ b/app/src/main/java/partisan/weforge/xyz/pulse/MainActivity.kt @@ -28,6 +28,8 @@ class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = ActivityMainBinding.inflate(layoutInflater) + prefs = Preferences(this) + updateDonationIcon() setContentView(binding.root) prefs = Preferences(this) setSupportActionBar(binding.topAppBar) @@ -50,6 +52,13 @@ class MainActivity : AppCompatActivity() { binding.navigationView.setNavigationItemSelectedListener { item -> when (item.itemId) { + R.id.action_home -> { + supportFragmentManager.popBackStack(null, androidx.fragment.app.FragmentManager.POP_BACK_STACK_INCLUSIVE) + supportFragmentManager.beginTransaction() + .replace(R.id.fragmentContainer, MainFragment()) + .commit() + true + } R.id.action_popup_settings -> { supportFragmentManager.beginTransaction() .replace(R.id.fragmentContainer, PopupSettingsFragment()) @@ -122,6 +131,16 @@ class MainActivity : AppCompatActivity() { } } + private fun updateDonationIcon() { + val donateItem = binding.navigationView.menu.findItem(R.id.action_donate) + donateItem.setIcon( + if (prefs.isDonationActivated) + R.drawable.heart_filled_24 + else + R.drawable.heart_24 + ) + } + fun setAppBarTitle(vararg parts: String) { binding.topAppBar.title = parts.joinToString(" > ") } diff --git a/app/src/main/java/partisan/weforge/xyz/pulse/PopupSettingsFragment.kt b/app/src/main/java/partisan/weforge/xyz/pulse/PopupSettingsFragment.kt index 29eda70..5a504d3 100644 --- a/app/src/main/java/partisan/weforge/xyz/pulse/PopupSettingsFragment.kt +++ b/app/src/main/java/partisan/weforge/xyz/pulse/PopupSettingsFragment.kt @@ -11,6 +11,7 @@ import android.widget.ArrayAdapter import android.widget.AdapterView import android.widget.CompoundButton import android.widget.Spinner +import android.widget.Toast import androidx.fragment.app.Fragment import androidx.core.content.getSystemService import partisan.weforge.xyz.pulse.databinding.FragmentPopupSettingsBinding @@ -34,6 +35,7 @@ class PopupSettingsFragment : Fragment() { override fun onResume() { super.onResume() + updateSpinner() (requireActivity() as? MainActivity)?.apply { setAppBarTitle(getString(R.string.settings_name), getString(R.string.popup_name)) setupPopupToggle(true, prefs.popupEnabled) { isChecked -> @@ -71,21 +73,7 @@ class PopupSettingsFragment : Fragment() { prefs.redirectionDelay = (value * 1000).toLong() } - val effectNames = resources.getStringArray(R.array.popup_effects) - val adapter = ArrayAdapter(requireContext(), android.R.layout.simple_spinner_item, effectNames) - adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item) - binding.popupEffectSpinner.adapter = adapter - - // Select current setting - binding.popupEffectSpinner.setSelection(prefs.popupEffect.ordinal) - - binding.popupEffectSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { - override fun onItemSelected(parent: AdapterView<*>, view: View?, position: Int, id: Long) { - prefs.popupEffect = Preferences.PopupEffect.values()[position] - } - - override fun onNothingSelected(parent: AdapterView<*>) {} - } + updateSpinner() val screenHeight = getScreenHeightPx() binding.popupHeightSlider.valueFrom = 0f @@ -119,6 +107,44 @@ class PopupSettingsFragment : Fragment() { } } + private fun updateSpinner() { + val allEffects = Preferences.PopupEffect.values() + val effectLabels = resources.getStringArray(R.array.popup_effects) + + val availableEffects = prefs.getAvailablePopupEffects() + listOf( + Preferences.PopupEffect.NONE, + Preferences.PopupEffect.RANDOM + ) + + val displayNames = allEffects.mapIndexed { index, effect -> + val baseName = effectLabels.getOrElse(index) { effect.name } + if (!prefs.isDonationActivated && effect !in availableEffects) + "$baseName 🔒" + else + baseName + } + + val adapter = ArrayAdapter(requireContext(), android.R.layout.simple_spinner_item, displayNames) + adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item) + binding.popupEffectSpinner.adapter = adapter + + binding.popupEffectSpinner.setSelection(prefs.popupEffect.ordinal) + + binding.popupEffectSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { + override fun onItemSelected(parent: AdapterView<*>, view: View?, position: Int, id: Long) { + val selectedEffect = allEffects[position] + if (!prefs.isDonationActivated && selectedEffect !in prefs.getAvailablePopupEffects()) { + Toast.makeText(requireContext(), getString(R.string.donate_lock), Toast.LENGTH_SHORT).show() + binding.popupEffectSpinner.setSelection(prefs.popupEffect.ordinal) + } else { + prefs.popupEffect = selectedEffect + } + } + + override fun onNothingSelected(parent: AdapterView<*>) {} + } + } + override fun onDestroyView() { super.onDestroyView() _binding = null diff --git a/app/src/main/java/partisan/weforge/xyz/pulse/PopupWindow.kt b/app/src/main/java/partisan/weforge/xyz/pulse/PopupWindow.kt index 237da52..a2bd984 100644 --- a/app/src/main/java/partisan/weforge/xyz/pulse/PopupWindow.kt +++ b/app/src/main/java/partisan/weforge/xyz/pulse/PopupWindow.kt @@ -174,7 +174,7 @@ class PopupWindow( } val effect = when (prefs.popupEffect) { - PopupEffect.RANDOM -> PopupEffect.values().filter { it != PopupEffect.RANDOM && it != PopupEffect.NONE }.random() + PopupEffect.RANDOM -> prefs.getAvailablePopupEffects().random() else -> prefs.popupEffect } currentEffect = effect 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 cfef7cd..753fdb5 100644 --- a/app/src/main/java/partisan/weforge/xyz/pulse/Preferences.kt +++ b/app/src/main/java/partisan/weforge/xyz/pulse/Preferences.kt @@ -31,7 +31,7 @@ class Preferences(private val context: Context) { // Whether user enabled/disabled the service manually by tiggle button var isServiceEnabledByUser: Boolean - get() = prefs.getBoolean(SERVICE_ENABLED, false) + get() = prefs.getBoolean(SERVICE_ENABLED, true) set(value) = prefs.edit { putBoolean(SERVICE_ENABLED, value) } // True only if all required permissions + toggle are satisfied @@ -110,6 +110,18 @@ class Preferences(private val context: Context) { private fun makeKeyEnabled(mimetype: String) = "enabled_$mimetype" private fun makeKeyPriority(mimetype: String) = "priority_$mimetype" + fun getAvailablePopupEffects(): List { + val locked = listOf( + PopupEffect.FLOP, + PopupEffect.MATRIX, + PopupEffect.SLIDE_SNAP, + PopupEffect.GAMER_MODE + ) + return PopupEffect.values().filter { + isDonationActivated || it !in locked + }.filter { it != PopupEffect.RANDOM && it != PopupEffect.NONE } + } + fun isServiceEnabled(mimetype: String): Boolean { return prefs.getBoolean(makeKeyEnabled(mimetype), 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 0b5a912..e19473b 100644 --- a/app/src/main/java/partisan/weforge/xyz/pulse/WelcomeActivity.kt +++ b/app/src/main/java/partisan/weforge/xyz/pulse/WelcomeActivity.kt @@ -85,20 +85,20 @@ class WelcomeActivity : AppCompatActivity() { binding.konfettiView.visibility = View.VISIBLE binding.konfettiView.start( Party( - speed = 30f, + speed = 25f, maxSpeed = 50f, damping = 0.9f, spread = 360, colors = listOf(0xfce18a, 0xff726d, 0xf4306d, 0xb48def), position = Position.Relative(relativeX, relativeY), - emitter = Emitter(duration = 2, TimeUnit.SECONDS).perSecond(100) + emitter = Emitter(duration = 1, TimeUnit.SECONDS).perSecond(80) ) ) binding.konfettiView.postDelayed({ startActivity(Intent(this, MainActivity::class.java)) finish() - }, 2000) + }, 1500) } } } diff --git a/app/src/main/res/layout/fragment_donate.xml b/app/src/main/res/layout/fragment_donate.xml index f739c47..7efc12e 100644 --- a/app/src/main/res/layout/fragment_donate.xml +++ b/app/src/main/res/layout/fragment_donate.xml @@ -39,6 +39,14 @@ android:clickable="true" android:focusable="true" /> + +