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