Compare commits

..
12 changed files with 93 additions and 53 deletions
+1 -1
View File
@@ -1 +1 @@
5.1.9-rc0 50109000
5.1.10-rc0 50110000
+8 -8
View File
@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="foss_upgrade_donate_label">تبرع</string>
<string name="foss_upgrade_alreadydonated_label">أنا متبرّع فعلًا</string>
<string name="foss_upgrade_no_money_label">أنفق كل أموالي على AirPods</string>
<string name="upgrade_foss_preamble">CAPod FOSS مجاني ومفتوح المصدر. إذا وجدته مفيدًا، ففكّر في دعم تطويره للمساعدة في استمرار المشروع.</string>
<string name="upgrade_foss_sponsor_action">دعم المشروع</string>
<string name="upgrade_foss_sponsor_subtitle">لا إعلانات. لا تتبع. لا قيود من Google Play.</string>
<string name="upgrade_foss_sponsor_returned_early">هل عدت فعلًا؟ دعمكم يُبقي CAPod حيًا.</string>
<string name="upgrade_badge_label">البرمجيات الحرة (FOSS)</string>
<string name="foss_upgrade_donate_label">تبرُّع</string>
<string name="foss_upgrade_alreadydonated_label">لقد تبرّعتُ بالفعل</string>
<string name="foss_upgrade_no_money_label">أنفق كل أموالي على سمّاعات AirPods</string>
<string name="upgrade_foss_preamble">برنامج CAPod FOSS مجاني ومفتوح المصدر. إذا وجدتهُ مفيدًا، ففكّر في دعم تطويره للمساعدة في استمرار المشروع.</string>
<string name="upgrade_foss_sponsor_action">دعم التطوير</string>
<string name="upgrade_foss_sponsor_subtitle">لا إعلانات. لا تتبُّع. لا قيود من جوجل بلاي.</string>
<string name="upgrade_foss_sponsor_returned_early">هل عدت بالفعل؟ دعمك يُبقي CAPod حيًّا.</string>
<string name="upgrade_badge_label">البرمجيات الحرة والمفتوحة المصدر</string>
</resources>
+2 -2
View File
@@ -5,7 +5,7 @@
<string name="foss_upgrade_no_money_label">Es iztērēju visu savu naudu AirPods austiņām</string>
<string name="upgrade_foss_preamble">CAPod FOSS ir bezmaksas un atkļējkoda. Ja tā ir noderba, apsveriet attīstības sponsēšanu, lai palīdzētu turpināt projektu.</string>
<string name="upgrade_foss_sponsor_action">Sponsorēt attīstību</string>
<string name="upgrade_foss_sponsor_subtitle">Bez reklamām. Bez sekšanas. Bez Google Play saistībām.</string>
<string name="upgrade_foss_sponsor_returned_early">Jau atpakaļ? Jūsu atbalsts uztur CAPod pie dzīvības.</string>
<string name="upgrade_foss_sponsor_subtitle">Bez reklamām. Bez izsekošanas. Bez Google Play saistībām.</string>
<string name="upgrade_foss_sponsor_returned_early">Jau atpakaļ? Tavs atbalsts uztur CAPod esamību.</string>
<string name="upgrade_badge_label">FOSS</string>
</resources>
+7 -7
View File
@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="upgrades_gplay_unavailable_error">خدمات Google Play غير متوفّرة.</string>
<string name="upgrades_no_purchases_found_check_account">لم يتم العثور على أي مشتريات. هل تستخدم الحساب الصحيح؟</string>
<string name="upgrades_gplay_billing_error_label">خطأ في Google Play</string>
<string name="upgrades_gplay_billing_error_description">حدث خطأ في Google Play. يُرجى المحاولة لاحقًا أو إعادة تشغيل هاتفك.\n\nخطأ: %s</string>
<string name="upgrades_gplay_billing_result_error_label">خطأ في فوترة Google Play</string>
<string name="upgrades_gplay_billing_result_error_description">حدث خطأ أثناء طلب تفاصيل عملية الشراء من Google Play. يُرجى مسح ذاكرة التخزين المؤقّت لـ Google Play وإعادة تشغيل هاتفك.\n\nخطأ %s</string>
<string name="upgrade_restore_action">استعادة المشتريات</string>
<string name="upgrades_gplay_unavailable_error">خدمات جوجل بلاي غير متوفّرة.</string>
<string name="upgrades_no_purchases_found_check_account">لم يُعثَر على أيّ مشتريات. هل تستخدم الحساب الصحيح؟</string>
<string name="upgrades_gplay_billing_error_label">خطأ في جوجل بلاي</string>
<string name="upgrades_gplay_billing_error_description">حدث خطأ في سوق جوجل بلاي. يُرجى المحاولة لاحقًا أو إعادة تشغيل هاتفك.\n\nالخطأ: %s</string>
<string name="upgrades_gplay_billing_result_error_label">خطأ في فوترة جوجل بلاي</string>
<string name="upgrades_gplay_billing_result_error_description">حدث خطأ أثناء طلب تفاصيل عملية الشراء من سوق جوجل بلاي. يُرجى مسح ذاكرة التخزين المؤقّت لسوق جوجل بلاي وإعادة تشغيل هاتفك.\n\nالخطأ %s</string>
<string name="upgrade_restore_action">استعادة عملية الشراء</string>
<string name="upgrade_badge_label">النسخة الاحترافية</string>
</resources>
+3 -3
View File
@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="upgrades_gplay_unavailable_error">Google Play pakalpojumi nav pieejami.</string>
<string name="upgrades_no_purchases_found_check_account">Nav atrasts neviens pirkums. Vai izmantojat pareizo kontu?</string>
<string name="upgrades_no_purchases_found_check_account">Nav atrasts neviens pirkums. Vai izmanto pareizo kontu?</string>
<string name="upgrades_gplay_billing_error_label">Google Play kļūda</string>
<string name="upgrades_gplay_billing_error_description">Google Play radās kļūda. Lūdzu, mēģiniet vēlreiz vēlāk vai pārstartējiet tālruni.\n\nKļūda: %s</string>
<string name="upgrades_gplay_billing_error_description">Google Play radās kļūda. Lūgums mēģināt vēlreiz vēlāk vai pārsāknēt tālruni.\n\nKļūda: %s</string>
<string name="upgrades_gplay_billing_result_error_label">Google Play norēķinu kļūda</string>
<string name="upgrades_gplay_billing_result_error_description">Radās kļūda, pieprasot no Google Play jūsu pirkuma informāciju. Notīriet Google Play kešatmiņu un pārstartējiet tālruni.\n\nKļūda %s</string>
<string name="upgrades_gplay_billing_result_error_description">Radās kļūda, pieprasot no Google Play pirkuma informāciju. Jāiztīra Google Play kešatmiņa un pārsāknē tālrunis.\n\nKļūda %s</string>
<string name="upgrade_restore_action">Atjaunot pirkumu</string>
<string name="upgrade_badge_label">Pro</string>
</resources>
@@ -26,8 +26,14 @@ class MonitorModeResolver @Inject constructor(
profilesRepo.profiles,
nudgeCapabilityStore.availability,
) { profiles, nudge ->
val primary = profiles.firstOrNull() ?: return@combine MonitorMode.MANUAL
primary.requiredMode(nudge)
// The mode is driven by the first *addressed* profile, not just the first profile. An
// address-less profile can neither host an AAP session (AapAutoConnect requires an address)
// nor auto-connect, so it can only ever resolve to MANUAL. Letting such a profile sit at the
// top of the list and force MANUAL would silently stop the foreground service that keeps the
// process — and thus background AAP/stem controls — alive for an addressed profile below it.
// No addressed profile at all => genuinely nothing to monitor => MANUAL.
profiles.firstOrNull { !it.address.isNullOrBlank() }?.requiredMode(nudge)
?: MonitorMode.MANUAL
}
.distinctUntilChanged()
.onEach { log(TAG, VERBOSE) { "effectiveMode = $it" } }
+4 -4
View File
@@ -6,10 +6,10 @@
<string name="general_copy_action">نسخ</string>
<string name="general_thank_you_label">شكرًا لك</string>
<string name="general_upgrade_action">ترقية</string>
<string name="common_feature_requires_pro_msg">رقّي للفتح.</string>
<string name="common_upgrade_required_label">يتطلب الترقية</string>
<string name="general_donate_action">تبرع</string>
<string name="general_check_action">تحقق</string>
<string name="common_feature_requires_pro_msg">رقِّ للفتح.</string>
<string name="common_upgrade_required_label">يتطلب ترقية</string>
<string name="general_donate_action">تبرُّع</string>
<string name="general_check_action">فحص</string>
<string name="general_close_action">إغلاق</string>
<string name="general_edit_action">تعديل</string>
<string name="general_save_action">حفظ</string>
+2 -2
View File
@@ -514,8 +514,8 @@
<string name="reaction_sleep_notification_text">%1$s oznámil, že jste usnuli, takže vaše hudba byla pozastavena. Toto můžete vypnout v nastavení zařízení.</string>
<string name="reaction_charged_channel_label">Oznámení o nabití</string>
<string name="reaction_charged_notification_title">Nabíjení dokončeno</string>
<string name="reaction_charged_notification_text_full">%1$s je plně nabitý.</string>
<string name="reaction_charged_notification_text_partial">%1$s byl nabit na %2$d%%.</string>
<string name="reaction_charged_notification_text_full">%1$s je plně nabito.</string>
<string name="reaction_charged_notification_text_partial">%1$s nabito na %2$d%%.</string>
<string name="device_settings_rename_label">Přejmenovat</string>
<string name="device_settings_rename_hint">Název zařízení</string>
<string name="device_settings_rename_confirm">Přejmenovat</string>
+1 -1
View File
@@ -480,7 +480,7 @@
<!-- New device settings -->
<string name="device_settings_category_general_label">Allgemein</string>
<string name="device_settings_microphone_mode_label">Mikrofon</string>
<string name="device_settings_microphone_mode_description">Welches Ohrstöpsel als Mikrofon verwendet wird</string>
<string name="device_settings_microphone_mode_description">Welcher Ohrstöpsel als Mikrofon verwendet wird</string>
<string name="device_settings_microphone_mode_auto">Automatisch</string>
<string name="device_settings_microphone_mode_right">Rechts</string>
<string name="device_settings_microphone_mode_left">Links</string>
+15 -15
View File
@@ -1,34 +1,34 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation">
<string name="general_share_action">Dalīties</string>
<string name="general_share_action">Kopīgot</string>
<string name="general_done_action">Gatavs</string>
<string name="general_cancel_action">Atcelt</string>
<string name="general_copy_action">Kopēt</string>
<string name="general_copy_action">Ievietot starpliktuvē</string>
<string name="general_thank_you_label">Paldies</string>
<string name="general_upgrade_action">Jaunināt</string>
<string name="common_feature_requires_pro_msg">Jauniniet, lai atbloķētu.</string>
<string name="common_upgrade_required_label">Nepieciešams jauninājums</string>
<string name="general_upgrade_action">Uzlabot</string>
<string name="common_feature_requires_pro_msg">Jāuzlabo, lai atslēgtu.</string>
<string name="common_upgrade_required_label">Nepieciešama uzlabošana</string>
<string name="general_donate_action">Ziedot</string>
<string name="general_check_action">Pārbaudīt</string>
<string name="general_close_action">Aizvērt</string>
<string name="general_edit_action">Rediģēt</string>
<string name="general_edit_action">Labot</string>
<string name="general_save_action">Saglabāt</string>
<string name="general_guide_action">Ceļvedis</string>
<string name="general_continue_action">Turpināt</string>
<string name="general_show_action">Rādīt</string>
<string name="general_hide_action">Paslēpt</string>
<string name="general_example_label">Piem.: %s</string>
<string name="upgrade_capod_label">Jaunināt CAPod</string>
<string name="upgrade_capod_description">Iegūstiet papildu funkcijas un atbalstiet izstrādātāju.</string>
<string name="upgrade_preamble">CAPod ir izstrādājusi viena persona. Jaunināšana atbloķē papildu funkcijas un palīdz uzturēt lietotni pie dzīvības.</string>
<string name="upgrade_benefit_themes">Tēmu pielāgošana</string>
<string name="upgrade_benefit_autoplay">Automātiska atskaņošana un pauze</string>
<string name="upgrade_benefit_popups">Uznirstošs logs, atverot futrāli un savienojoties</string>
<string name="upgrade_capod_label">Uzlabot CAPod</string>
<string name="upgrade_capod_description">Iegūsti papildu iespējas un atbalsti izstrādātāju!</string>
<string name="upgrade_preamble">CAPod ir izstrādājis viens cilvēks. Uzlabošana atslēdz papildu iespējas un palīdz uzturēt lietotnes esamību.</string>
<string name="upgrade_benefit_themes">Izskata pielāgošana</string>
<string name="upgrade_benefit_autoplay">Automātiska atskaņošana un apturēšana</string>
<string name="upgrade_benefit_popups">Uznirstošs logs pēc futrāļa atvēršanas un savienošanās</string>
<string name="upgrade_benefit_widgets">Sākuma ekrāna logrīki</string>
<string name="upgrade_benefit_device_settings">Papildu ierīces iestatījumi</string>
<string name="upgrade_benefit_device_controls">Ierīces vadīklēšana — troksnis, kātieni un vairāk</string>
<string name="upgrade_benefit_support">Atbalstiet izstrādātāju</string>
<string name="upgrade_benefit_disclaimer">Funkciju pieejamība atkarīga no jūsu ausţu un ierīces.</string>
<string name="upgrade_benefit_device_controls">Ierīces vadīklas — troksnis, kātieni un vairāk</string>
<string name="upgrade_benefit_support">Izstrādātāja atbalstīšana</string>
<string name="upgrade_benefit_disclaimer">Iespēju pieejamība atkarīga no austiņam un ierīces.</string>
<string name="upgrade_screen_options_description">Vienādas funkcijas, atšķirīgas cenas. Abonements ietver bezmaksas izmēģinājumu un var tikt atcelts jebkurā laikā.</string>
<string name="upgrade_screen_subscription_trial_action">Sākt bezmaksas izmēģinājumu</string>
<string name="upgrade_screen_subscription_action">Abonēt gadā</string>
@@ -100,7 +100,7 @@ class MonitorModeResolverTest : BaseTest() {
}
@Test
fun `multi-profile primary-only - primary case 2 + secondary case 3 - AUTOMATIC`() = runTest {
fun `first addressed profile controls mode - addressed primary case 2 + addressed secondary case 3 - AUTOMATIC`() = runTest {
profilesFlow.value = listOf(
profile(id = "primary", autoConnect = false),
profile(id = "secondary", autoConnect = true),
@@ -111,25 +111,59 @@ class MonitorModeResolverTest : BaseTest() {
}
@Test
fun `multi-profile primary-only - primary case 4 + secondary case 2 - MANUAL`() = runTest {
fun `unpaired primary is skipped when an addressed secondary exists - AUTOMATIC`() = runTest {
profilesFlow.value = listOf(
profile(id = "primary", address = null),
profile(id = "secondary", address = "AA:BB:CC:DD:EE:FF"),
)
resolver.effectiveMode.first() shouldBe MonitorMode.AUTOMATIC
}
@Test
fun `unpaired primary is skipped - addressed autoConnect secondary drives ALWAYS`() = runTest {
profilesFlow.value = listOf(
profile(id = "primary", address = null),
profile(id = "secondary", address = "AA:BB:CC:DD:EE:FF", autoConnect = true),
)
nudgeFlow.value = NudgeAvailability.AVAILABLE
resolver.effectiveMode.first() shouldBe MonitorMode.ALWAYS
}
@Test
fun `blank-address primary is skipped when an addressed secondary exists`() = runTest {
profilesFlow.value = listOf(
profile(id = "primary", address = " "),
profile(id = "secondary", address = "AA:BB:CC:DD:EE:FF", autoConnect = true),
)
nudgeFlow.value = NudgeAvailability.AVAILABLE
resolver.effectiveMode.first() shouldBe MonitorMode.ALWAYS
}
@Test
fun `all profiles unpaired - MANUAL`() = runTest {
profilesFlow.value = listOf(
profile(id = "a", address = null, autoConnect = true),
profile(id = "b", address = "", autoConnect = true),
)
nudgeFlow.value = NudgeAvailability.AVAILABLE
resolver.effectiveMode.first() shouldBe MonitorMode.MANUAL
}
@Test
fun `list reorder makes the secondary primary - mode flips`() = runTest {
val a = profile(id = "a", autoConnect = true)
val b = profile(id = "b", autoConnect = false)
fun `reorder among addressed profiles still flips the mode, unpaired stays ignored`() = runTest {
val unpaired = profile(id = "unpaired", address = null)
val addressedAuto = profile(id = "addressedAuto", autoConnect = true)
val addressedManual = profile(id = "addressedManual", autoConnect = false)
nudgeFlow.value = NudgeAvailability.AVAILABLE
profilesFlow.value = listOf(a, b)
profilesFlow.value = listOf(unpaired, addressedAuto, addressedManual)
resolver.effectiveMode.first() shouldBe MonitorMode.ALWAYS
profilesFlow.value = listOf(b, a)
profilesFlow.value = listOf(unpaired, addressedManual, addressedAuto)
resolver.effectiveMode.first() shouldBe MonitorMode.AUTOMATIC
}
+1 -1
View File
@@ -1,7 +1,7 @@
### Updated by tools/release/bump.sh ###
project.versioning.major=5
project.versioning.minor=1
project.versioning.patch=9
project.versioning.patch=10
project.versioning.build=0
project.versioning.type=rc
#############################