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" /> + +