chore: clear out what the own-store branch left behind, and refresh deps
Dead weight, found by reading `lintDebug` rather than by anything breaking. Gone with the deleted `:provider` module: its entire dependency block in the version catalog — jems, rfc5545-datetime, Robolectric, JUnit 4, Hamcrest, Mockito — plus the comments explaining a `provider/PROVENANCE.md` that is not there any more. Only lib-recur survived the deletion and it is now documented where it lives. That block was also the source of most of the catalog's "newer version available" noise. Gone outright: `glance-appwidget` and `glance-material3`, declared but not referenced by a single line, so they were shipping in the APK for nothing. The WorkManager `ListenableWorker` keep rule went with them, since Glance was what dragged WorkManager in; the RoomDatabase keep rule stays and its comment now says why it matters *more* than it did — Room used to arrive transitively through that chain, and is now our own task store. Also gone: thirteen unused resources (twelve strings and a colour), which volunteers on Weblate were translating for nothing; a `SDK_INT < O` branch that cannot be false at minSdk 29; and the `-v26` qualifier on the mipmap folder, unnecessary at the same minSdk. `DemoSeeder` is injected as a `Provider` now. Its call site is `BuildConfig.DEBUG`-gated, i.e. compile-time dead in a release build, but injecting the instance still constructed one on every launch of the shipped app. `ProviderChangeReceiver` gets one intent-filter per authority rather than two `<data>` tags in one filter. Identical behaviour — Android takes the cross product of every data attribute in a filter — but it no longer reads as if it might not, which is what lint's IntentFilterUniqueDataAttributes warns about. Dependency refresh, app-level only: KSP 2.3.11, Hilt 2.60.1, lifecycle 2.11.0, material3 1.5.0-alpha26, JUnit 6.1.3, hilt-navigation-compose 1.4.0. That last one moved `hiltViewModel` into `androidx.hilt.lifecycle.viewmodel.compose`, so nine call sites follow it and the artifact it now lives in is declared rather than inherited. The floret-kit coordinates move into the catalog, version-less, since the composite build substitutes them. Deliberately not touched: AGP, Gradle, Kotlin, the Compose BOM and kotlinx-* — toolchain moves that want their own change and a reproducible-build check, not a release cut. lib-recur stays pinned at 0.12.2 (0.16.0 removed `RecurrenceSet`).
This commit is contained in:
+8
-12
@@ -174,12 +174,11 @@ dependencies {
|
||||
|
||||
implementation(libs.hilt.android)
|
||||
implementation(libs.androidx.hilt.navigation.compose)
|
||||
implementation(libs.androidx.hilt.lifecycle.viewmodel.compose)
|
||||
implementation(libs.androidx.navigation.compose)
|
||||
ksp(libs.hilt.compiler)
|
||||
|
||||
// RFC 5545 recurrence expansion, in-process. Pinned at 0.12.2 — 0.16.0
|
||||
// removed RecurrenceSet. rfc5545-datetime comes with it and is part of its
|
||||
// API surface, so it isn't declared separately.
|
||||
// RFC 5545 recurrence expansion, in-process; see the catalog for the pin.
|
||||
implementation(libs.dmfs.lib.recur)
|
||||
|
||||
implementation(libs.androidx.room.runtime)
|
||||
@@ -189,17 +188,14 @@ dependencies {
|
||||
implementation(libs.androidx.datastore.preferences)
|
||||
implementation(libs.androidx.documentfile)
|
||||
|
||||
implementation(libs.androidx.glance.appwidget)
|
||||
implementation(libs.androidx.glance.material3)
|
||||
|
||||
implementation(libs.kotlinx.datetime)
|
||||
implementation(libs.kotlinx.coroutines.core)
|
||||
implementation("de.jeanlucmakiola.floret:core-time")
|
||||
implementation("de.jeanlucmakiola.floret:core-reminders")
|
||||
implementation("de.jeanlucmakiola.floret:core-locale")
|
||||
implementation("de.jeanlucmakiola.floret:core-crash")
|
||||
implementation("de.jeanlucmakiola.floret:identity")
|
||||
implementation("de.jeanlucmakiola.floret:components")
|
||||
implementation(libs.floret.core.time)
|
||||
implementation(libs.floret.core.reminders)
|
||||
implementation(libs.floret.core.locale)
|
||||
implementation(libs.floret.core.crash)
|
||||
implementation(libs.floret.identity)
|
||||
implementation(libs.floret.components)
|
||||
|
||||
debugImplementation(libs.androidx.ui.tooling)
|
||||
debugImplementation(libs.androidx.ui.test.manifest)
|
||||
|
||||
Vendored
+4
-10
@@ -5,17 +5,11 @@
|
||||
# Room instantiates its generated <Database>_Impl reflectively through a no-arg
|
||||
# constructor. R8 under AGP 9 keeps the class but prunes that constructor, since
|
||||
# nothing calls it directly — Room then throws InstantiationException, reported
|
||||
# as "Failed to create an instance of ...". We pull Room in transitively via
|
||||
# Glance -> WorkManager, whose WorkDatabase is built by WorkManagerInitializer
|
||||
# at startup, so the app died on launch in every minified build (issue #1).
|
||||
# as "Failed to create an instance of ...". This first bit us through a
|
||||
# transitive Room (Glance -> WorkManager -> WorkDatabase, built at startup:
|
||||
# issue #1); Glance is gone and Room is now our own task store, so the rule
|
||||
# matters more, not less — TasksDatabase is built on the first store read.
|
||||
-keep class * extends androidx.room.RoomDatabase { <init>(); }
|
||||
|
||||
# WorkManager likewise looks its workers up by name and calls this constructor
|
||||
# reflectively — same pruning, but it only bites once a worker actually runs
|
||||
# (Glance's widget updates), so keep it explicitly rather than wait for it.
|
||||
-keep class * extends androidx.work.ListenableWorker {
|
||||
<init>(android.content.Context, androidx.work.WorkerParameters);
|
||||
}
|
||||
|
||||
# Compose Compiler may keep its own; defaults are fine
|
||||
-dontwarn org.jetbrains.annotations.**
|
||||
|
||||
@@ -83,16 +83,24 @@
|
||||
<!-- Re-sync reminders when an external provider changes — DAVx5 pulling
|
||||
tasks while Agendula is backgrounded. External mode only: in OWN mode
|
||||
nothing outside the app can change our data, and Room's
|
||||
InvalidationTracker covers our own writes. An intent-filter host must
|
||||
be a literal, so both external authorities are listed. -->
|
||||
InvalidationTracker covers our own writes.
|
||||
|
||||
An intent-filter host must be a literal, so both external authorities
|
||||
are listed — one filter each. Two <data> tags in a single filter would
|
||||
mean the same thing (Android takes the cross product of every data
|
||||
attribute in a filter), but reads as if it might not, which is what
|
||||
lint's IntentFilterUniqueDataAttributes warns about. -->
|
||||
<receiver
|
||||
android:name=".data.reminders.ProviderChangeReceiver"
|
||||
android:exported="true">
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.PROVIDER_CHANGED" />
|
||||
<data android:scheme="content" android:host="org.tasks.opentasks" />
|
||||
<data android:scheme="content" android:host="org.dmfs.tasks" />
|
||||
</intent-filter>
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.PROVIDER_CHANGED" />
|
||||
<data android:scheme="content" android:host="org.tasks.opentasks" />
|
||||
</intent-filter>
|
||||
</receiver>
|
||||
|
||||
<!-- Persists the per-app language on API < 33, where the platform
|
||||
|
||||
@@ -12,7 +12,7 @@ import androidx.compose.runtime.getValue
|
||||
import androidx.compose.runtime.mutableStateOf
|
||||
import androidx.compose.runtime.setValue
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.hilt.navigation.compose.hiltViewModel
|
||||
import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel
|
||||
import androidx.lifecycle.compose.collectAsStateWithLifecycle
|
||||
import androidx.lifecycle.lifecycleScope
|
||||
import dagger.hilt.android.AndroidEntryPoint
|
||||
@@ -27,6 +27,7 @@ import de.jeanlucmakiola.floret.crash.CrashReporter
|
||||
import de.jeanlucmakiola.floret.crash.submitCrashReport
|
||||
import kotlinx.coroutines.launch
|
||||
import javax.inject.Inject
|
||||
import javax.inject.Provider
|
||||
|
||||
/**
|
||||
* Single activity. The theme follows [SettingsViewModel]; [RootScreen] is the
|
||||
@@ -36,7 +37,10 @@ import javax.inject.Inject
|
||||
@AndroidEntryPoint
|
||||
class MainActivity : ComponentActivity() {
|
||||
|
||||
@Inject lateinit var demoSeeder: DemoSeeder
|
||||
// A Provider, not the seeder itself: the call site below is dead in a release
|
||||
// build (`BuildConfig.DEBUG` is a compile-time false), and injecting the
|
||||
// instance would still construct one on every launch of the shipped app.
|
||||
@Inject lateinit var demoSeeder: Provider<DemoSeeder>
|
||||
|
||||
// A captured crash report awaiting the user's decision, surfaced as a dialog
|
||||
// over the app on the next launch (the single-crash path). A startup
|
||||
@@ -63,7 +67,7 @@ class MainActivity : ComponentActivity() {
|
||||
// Debug-only sample data: `am start ... --ez agendula_seed true`. Seeds a
|
||||
// local (non-syncing) demo list once; no-op without the extra.
|
||||
if (BuildConfig.DEBUG && intent.getBooleanExtra(EXTRA_SEED, false)) {
|
||||
lifecycleScope.launch { runCatching { demoSeeder.seed() } }
|
||||
lifecycleScope.launch { runCatching { demoSeeder.get().seed() } }
|
||||
}
|
||||
setContent {
|
||||
val settingsViewModel: SettingsViewModel = hiltViewModel()
|
||||
|
||||
@@ -79,7 +79,6 @@ class TaskNotifier @Inject constructor(
|
||||
}
|
||||
|
||||
private fun ensureChannel() {
|
||||
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) return
|
||||
val manager = context.getSystemService(NotificationManager::class.java)
|
||||
if (manager.getNotificationChannel(CHANNEL_ID) != null) return
|
||||
manager.createNotificationChannel(
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
package de.jeanlucmakiola.agendula.data.tasks
|
||||
|
||||
import android.net.Uri
|
||||
import androidx.core.net.toUri
|
||||
|
||||
/**
|
||||
* The subset of the OpenTasks `TaskContract` that Agendula uses, vendored as
|
||||
@@ -150,7 +151,7 @@ object TasksContract {
|
||||
const val TYPE_MESSAGE = 1
|
||||
}
|
||||
|
||||
fun propertiesUri(authority: String): Uri = Uri.parse("content://$authority/${Properties.PATH}")
|
||||
fun propertiesUri(authority: String): Uri = "content://$authority/${Properties.PATH}".toUri()
|
||||
|
||||
// --- status values (TaskColumns.STATUS_*) --------------------------------
|
||||
const val STATUS_NEEDS_ACTION = 0
|
||||
@@ -161,12 +162,12 @@ object TasksContract {
|
||||
/** Priority 0 means "no priority"; 1 is highest, 9 lowest (iCalendar). */
|
||||
const val PRIORITY_NONE = 0
|
||||
|
||||
fun authorityUri(authority: String): Uri = Uri.parse("content://$authority")
|
||||
fun listsUri(authority: String): Uri = Uri.parse("content://$authority/${Lists.PATH}")
|
||||
fun authorityUri(authority: String): Uri = "content://$authority".toUri()
|
||||
fun listsUri(authority: String): Uri = "content://$authority/${Lists.PATH}".toUri()
|
||||
fun listUri(authority: String, listId: Long): Uri =
|
||||
Uri.parse("content://$authority/${Lists.PATH}/$listId")
|
||||
fun tasksUri(authority: String): Uri = Uri.parse("content://$authority/${Tasks.PATH}")
|
||||
fun instancesUri(authority: String): Uri = Uri.parse("content://$authority/${Instances.PATH}")
|
||||
"content://$authority/${Lists.PATH}/$listId".toUri()
|
||||
fun tasksUri(authority: String): Uri = "content://$authority/${Tasks.PATH}".toUri()
|
||||
fun instancesUri(authority: String): Uri = "content://$authority/${Instances.PATH}".toUri()
|
||||
|
||||
/**
|
||||
* A single occurrence. Updating through this URI is how a *recurring* task is
|
||||
@@ -175,7 +176,7 @@ object TasksContract {
|
||||
* the series anchor, which is what writing to `tasks/<id>` would do.
|
||||
*/
|
||||
fun instanceUri(authority: String, instanceId: Long): Uri =
|
||||
Uri.parse("content://$authority/${Instances.PATH}/$instanceId")
|
||||
"content://$authority/${Instances.PATH}/$instanceId".toUri()
|
||||
|
||||
/** Append the sync-adapter params required to write local-account rows. */
|
||||
fun asSyncAdapter(uri: Uri, accountName: String, accountType: String): Uri =
|
||||
|
||||
@@ -17,7 +17,7 @@ import androidx.compose.ui.Alignment
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.res.stringResource
|
||||
import androidx.compose.ui.unit.dp
|
||||
import androidx.hilt.navigation.compose.hiltViewModel
|
||||
import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel
|
||||
import androidx.lifecycle.compose.collectAsStateWithLifecycle
|
||||
import de.jeanlucmakiola.agendula.R
|
||||
import de.jeanlucmakiola.agendula.ui.common.OnResume
|
||||
|
||||
@@ -65,7 +65,7 @@ import androidx.compose.ui.text.font.FontWeight
|
||||
import androidx.compose.ui.text.style.TextAlign
|
||||
import androidx.compose.ui.text.style.TextDecoration
|
||||
import androidx.compose.ui.unit.dp
|
||||
import androidx.hilt.navigation.compose.hiltViewModel
|
||||
import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel
|
||||
import androidx.lifecycle.compose.collectAsStateWithLifecycle
|
||||
import de.jeanlucmakiola.agendula.R
|
||||
import de.jeanlucmakiola.agendula.domain.Task
|
||||
|
||||
@@ -78,7 +78,7 @@ import androidx.compose.ui.graphics.vector.ImageVector
|
||||
import androidx.compose.ui.res.stringResource
|
||||
import androidx.compose.ui.text.font.FontWeight
|
||||
import androidx.compose.ui.unit.dp
|
||||
import androidx.hilt.navigation.compose.hiltViewModel
|
||||
import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel
|
||||
import androidx.lifecycle.compose.collectAsStateWithLifecycle
|
||||
import de.jeanlucmakiola.agendula.R
|
||||
import de.jeanlucmakiola.floret.time.DayWindow
|
||||
|
||||
@@ -30,7 +30,7 @@ import androidx.compose.ui.graphics.Color
|
||||
import androidx.compose.ui.res.pluralStringResource
|
||||
import androidx.compose.ui.res.stringResource
|
||||
import androidx.compose.ui.unit.dp
|
||||
import androidx.hilt.navigation.compose.hiltViewModel
|
||||
import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel
|
||||
import androidx.lifecycle.compose.collectAsStateWithLifecycle
|
||||
import de.jeanlucmakiola.agendula.R
|
||||
import de.jeanlucmakiola.agendula.data.export.ExportFailure
|
||||
|
||||
@@ -72,7 +72,7 @@ import androidx.compose.ui.text.input.ImeAction
|
||||
import androidx.compose.ui.text.style.TextAlign
|
||||
import androidx.compose.ui.text.style.TextOverflow
|
||||
import androidx.compose.ui.unit.dp
|
||||
import androidx.hilt.navigation.compose.hiltViewModel
|
||||
import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel
|
||||
import androidx.lifecycle.compose.collectAsStateWithLifecycle
|
||||
import de.jeanlucmakiola.agendula.R
|
||||
import de.jeanlucmakiola.agendula.domain.Priority
|
||||
|
||||
@@ -8,7 +8,7 @@ import androidx.compose.animation.scaleOut
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.runtime.LaunchedEffect
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.hilt.navigation.compose.hiltViewModel
|
||||
import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel
|
||||
import androidx.navigation.compose.NavHost
|
||||
import androidx.navigation.compose.composable
|
||||
import androidx.navigation.compose.rememberNavController
|
||||
|
||||
@@ -74,7 +74,7 @@ import androidx.compose.ui.text.style.TextAlign
|
||||
import androidx.compose.ui.unit.dp
|
||||
import androidx.core.content.ContextCompat
|
||||
import androidx.core.net.toUri
|
||||
import androidx.hilt.navigation.compose.hiltViewModel
|
||||
import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel
|
||||
import androidx.lifecycle.compose.collectAsStateWithLifecycle
|
||||
import de.jeanlucmakiola.agendula.R
|
||||
import de.jeanlucmakiola.agendula.data.prefs.ThemeMode
|
||||
|
||||
@@ -87,7 +87,7 @@ import androidx.compose.ui.text.style.TextAlign
|
||||
import androidx.compose.ui.text.style.TextDecoration
|
||||
import androidx.compose.ui.text.style.TextOverflow
|
||||
import androidx.compose.ui.unit.dp
|
||||
import androidx.hilt.navigation.compose.hiltViewModel
|
||||
import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel
|
||||
import androidx.lifecycle.compose.collectAsStateWithLifecycle
|
||||
import de.jeanlucmakiola.agendula.R
|
||||
import de.jeanlucmakiola.floret.time.DayWindow
|
||||
@@ -203,7 +203,7 @@ fun TaskListScreen(
|
||||
},
|
||||
bottomBar = {
|
||||
if (showBottomAddBar) {
|
||||
listId?.let { id -> QuickAddBar(onAdd = { title -> viewModel.quickAdd(title, id) }) }
|
||||
QuickAddBar(onAdd = { title -> viewModel.quickAdd(title, listId) })
|
||||
}
|
||||
},
|
||||
) { inner ->
|
||||
|
||||
@@ -15,9 +15,6 @@
|
||||
<string name="smart_completed">Abgeschlossen</string>
|
||||
<string name="task_detail_title">Aufgabe</string>
|
||||
<string name="task_detail_not_found">Diese Aufgabe ist nicht mehr verfügbar.</string>
|
||||
<string name="edit_task_title">Aufgabe bearbeiten</string>
|
||||
<string name="new_task_title">Neue Aufgabe</string>
|
||||
<string name="field_title">Titel</string>
|
||||
<string name="edit_save_failed">Konnte nicht gespeichert werden. Versuche es erneut.</string>
|
||||
<string name="add_task_hint">Aufgabe hinzufügen</string>
|
||||
<string name="add_subtask_hint">Unteraufgabe hinzufügen</string>
|
||||
@@ -36,11 +33,8 @@
|
||||
<string name="priority_low">Niedrig</string>
|
||||
<string name="priority_medium">Mittel</string>
|
||||
<string name="priority_high">Hoch</string>
|
||||
<string name="detail_mark_complete">Als abgeschlossen markieren</string>
|
||||
<string name="detail_mark_incomplete">Als nicht abgeschlossen markieren</string>
|
||||
<string name="detail_list">Liste</string>
|
||||
<string name="detail_due">Fällig</string>
|
||||
<string name="detail_start">Beginn</string>
|
||||
<string name="detail_priority">Priorität</string>
|
||||
<string name="detail_progress">Fortschritt</string>
|
||||
<string name="detail_subtasks">Unteraufgaben</string>
|
||||
@@ -98,7 +92,6 @@
|
||||
<string name="smart_overdue">Überfällig</string>
|
||||
<string name="smart_upcoming">Anstehend</string>
|
||||
<string name="smart_all">Alle</string>
|
||||
<string name="open_count">%1$d offen</string>
|
||||
<string name="home_today_progress">%1$d von %2$d erledigt</string>
|
||||
<string name="home_today_remaining">%1$d übrig</string>
|
||||
<string name="home_today_all_done">Alles erledigt 🎉</string>
|
||||
@@ -108,7 +101,6 @@
|
||||
<string name="home_due_tomorrow">Morgen</string>
|
||||
<string name="home_search_hint">Aufgaben suchen</string>
|
||||
<string name="home_search_clear">Suche zurücksetzen</string>
|
||||
<string name="home_search_close">Suche schließen</string>
|
||||
<string name="home_search_empty">Keine Aufgaben passen zu „%1$s“</string>
|
||||
<string name="reminder_due_at">Fälligkeiten %1$s</string>
|
||||
<string name="reminder_channel_name">Aufgaben Erinnerungen</string>
|
||||
@@ -118,8 +110,6 @@
|
||||
<string name="onboarding_permission_title">Erlaube Zugriff auf deine Aufgaben</string>
|
||||
<string name="onboarding_permission_body">Agendula benötigt die Berechtigung, deine Aufgaben zu lesen und zu schreiben. Das ist die einzige Berechtigung, die es jemals anfragt.</string>
|
||||
<string name="onboarding_permission_button">Zugriff gewähren</string>
|
||||
<string name="onboarding_install_opentasks">Installiere OpenTasks</string>
|
||||
<string name="onboarding_install_tasksorg">Installiere tasks.org</string>
|
||||
<string name="reminder_onboarding_title">Verpasse nichts, was fällig ist</string>
|
||||
<string name="reminder_onboarding_body">Aufgaben-Apps senden selbst keine Erinnerungen, daher liefert Agendula sie für dich. Schalte sie ein, um eine Benachrichtigung zu erhalten, wenn eine Aufgabe fällig ist.</string>
|
||||
<string name="reminder_onboarding_enable_button">Erinnerungen aktivieren</string>
|
||||
@@ -162,7 +152,6 @@
|
||||
<string name="settings_exact_alarms">Exakter Zeitpunkt</string>
|
||||
<string name="settings_exact_alarms_allowed">Die Erinnerungen erfolgen zum exakten Zeitpunkt</string>
|
||||
<string name="settings_exact_alarms_blocked">Blockiert – tippe, um exakte Erinnerungen zu erlauben</string>
|
||||
<string name="settings_section_tasks">Aufgaben</string>
|
||||
<string name="settings_default_list">Standard-Liste</string>
|
||||
<string name="settings_default_list_first">Erste verfügbare Felder</string>
|
||||
<string name="settings_add_subtask_row">Zeile \"Unteraufgaben hinzufügen\" anzeigen</string>
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="app_name">Agendula</string>
|
||||
<string name="app_tagline">Um app de tarefas em Material 3 Expressive. \nFlorescendo.</string>
|
||||
<string name="task_untitled">Tarefa sem título</string>
|
||||
<string name="back">Voltar</string>
|
||||
<string name="save">Salvar</string>
|
||||
@@ -14,9 +13,6 @@
|
||||
<string name="task_detail_title">Tarefa</string>
|
||||
<string name="task_detail_not_found">Esta tarefa não existe mais.</string>
|
||||
<string name="edit">Editar</string>
|
||||
<string name="edit_task_title">Editar tarefa</string>
|
||||
<string name="new_task_title">Nova tarefa</string>
|
||||
<string name="field_title">Título</string>
|
||||
<string name="field_description">Descrição</string>
|
||||
<string name="edit_save_failed">Não foi possível salvar. Tente novamente.</string>
|
||||
<string name="add_task_hint">Adicionar tarefa</string>
|
||||
@@ -37,11 +33,8 @@
|
||||
<string name="priority_low">Baixa</string>
|
||||
<string name="priority_medium">Média</string>
|
||||
<string name="priority_high">Alta</string>
|
||||
<string name="detail_mark_complete">Marcar como concluído</string>
|
||||
<string name="detail_mark_incomplete">Marcar como não concluído</string>
|
||||
<string name="detail_list">Lista</string>
|
||||
<string name="detail_due">Prazo</string>
|
||||
<string name="detail_start">Inicia</string>
|
||||
<string name="detail_priority">Prioridade</string>
|
||||
<string name="detail_progress">Progresso</string>
|
||||
<string name="detail_subtasks">Subtarefas</string>
|
||||
@@ -100,7 +93,6 @@
|
||||
<string name="smart_overdue">Prazo expirado</string>
|
||||
<string name="smart_upcoming">A seguir</string>
|
||||
<string name="smart_all">Tudo</string>
|
||||
<string name="open_count">%1$d abertos</string>
|
||||
<string name="home_today_progress">%1$d de %2$d concluídos</string>
|
||||
<string name="home_today_remaining">%1$d restantes</string>
|
||||
<string name="home_today_all_done">Tudo pronto 🎉</string>
|
||||
@@ -110,7 +102,6 @@
|
||||
<string name="home_due_tomorrow">Amanhã</string>
|
||||
<string name="home_search_hint">Buscar tarefas</string>
|
||||
<string name="home_search_clear">Limpar buscas</string>
|
||||
<string name="home_search_close">Fechar busca</string>
|
||||
<string name="home_search_empty">Nenhuma tarefa corresponde a \"%1$s\"</string>
|
||||
<string name="reminder_due_at">Termina em %1$s</string>
|
||||
<string name="reminder_channel_name">Lembretes de tarefas</string>
|
||||
@@ -120,8 +111,6 @@
|
||||
<string name="onboarding_permission_title">Permitir acesso às suas tarefas</string>
|
||||
<string name="onboarding_permission_body">O Agendula precisa de permissão para ler e salvar suas tarefas. É tudo o que ele pede.</string>
|
||||
<string name="onboarding_permission_button">Conceder acesso às tarefas</string>
|
||||
<string name="onboarding_install_opentasks">Instalar OpenTasks</string>
|
||||
<string name="onboarding_install_tasksorg">Instalar tasks.org</string>
|
||||
<string name="reminder_onboarding_title">Nunca perca seus prazos</string>
|
||||
<string name="reminder_onboarding_body">Apps de tarefas não enviam lembretes sozinhos, então o Agendula os entrega para você. Ative para receber uma notificação de quando uma tarefa estiver no prazo.</string>
|
||||
<string name="reminder_onboarding_enable_button">Ativar lembretes</string>
|
||||
@@ -166,7 +155,6 @@
|
||||
<string name="settings_exact_alarms">Na hora</string>
|
||||
<string name="settings_exact_alarms_allowed">Lembretes disparam na mesma hora</string>
|
||||
<string name="settings_exact_alarms_blocked">Bloqueado — toque para permitir lembretes na hora</string>
|
||||
<string name="settings_section_tasks">Tarefas</string>
|
||||
<string name="settings_default_list">Lista padrão</string>
|
||||
<string name="settings_default_list_first">Primeira lista disponível</string>
|
||||
<string name="settings_add_subtask_row">Mostrar uma linha \"adicionar subtarefa\"</string>
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
<resources>
|
||||
<!-- Seed color: warm mauve. Material 3 derives Light & Dark schemes from this. -->
|
||||
<color name="seed">#FF7A5C6B</color>
|
||||
<!-- Adaptive icon background -->
|
||||
<color name="ic_launcher_background">#FF7A5C6B</color>
|
||||
</resources>
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
<resources>
|
||||
<string name="app_name">Agendula</string>
|
||||
<string name="app_tagline">A modern Material 3 Expressive task app.\nComing into bloom.</string>
|
||||
|
||||
<!-- Generic -->
|
||||
<string name="task_untitled">Untitled task</string>
|
||||
@@ -21,9 +20,6 @@
|
||||
<string name="edit">Edit</string>
|
||||
|
||||
<!-- Task edit -->
|
||||
<string name="edit_task_title">Edit task</string>
|
||||
<string name="new_task_title">New task</string>
|
||||
<string name="field_title">Title</string>
|
||||
<string name="field_description">Description</string>
|
||||
<string name="edit_save_failed">Could not save. Try again.</string>
|
||||
|
||||
@@ -52,11 +48,8 @@
|
||||
<string name="priority_high">High</string>
|
||||
|
||||
<!-- Task detail -->
|
||||
<string name="detail_mark_complete">Mark complete</string>
|
||||
<string name="detail_mark_incomplete">Mark not complete</string>
|
||||
<string name="detail_list">List</string>
|
||||
<string name="detail_due">Due</string>
|
||||
<string name="detail_start">Starts</string>
|
||||
<string name="detail_priority">Priority</string>
|
||||
<string name="detail_progress">Progress</string>
|
||||
<string name="detail_subtasks">Subtasks</string>
|
||||
@@ -152,7 +145,6 @@
|
||||
<string name="smart_overdue">Overdue</string>
|
||||
<string name="smart_upcoming">Upcoming</string>
|
||||
<string name="smart_all">All</string>
|
||||
<string name="open_count">%1$d open</string>
|
||||
|
||||
<!-- Home: Today progress hero -->
|
||||
<string name="home_today_progress">%1$d of %2$d done</string>
|
||||
@@ -168,7 +160,6 @@
|
||||
<!-- Home: search -->
|
||||
<string name="home_search_hint">Search tasks</string>
|
||||
<string name="home_search_clear">Clear search</string>
|
||||
<string name="home_search_close">Close search</string>
|
||||
<string name="home_search_empty">No tasks match “%1$s”</string>
|
||||
|
||||
<!-- Reminders -->
|
||||
@@ -182,8 +173,6 @@
|
||||
<string name="onboarding_permission_title">Allow access to your tasks</string>
|
||||
<string name="onboarding_permission_body">Agendula needs permission to read and write your tasks. That\'s the only thing it ever asks for.</string>
|
||||
<string name="onboarding_permission_button">Grant task access</string>
|
||||
<string name="onboarding_install_opentasks">Install OpenTasks</string>
|
||||
<string name="onboarding_install_tasksorg">Install tasks.org</string>
|
||||
|
||||
<!-- Reminder onboarding (one-time, after the provider grant) -->
|
||||
<string name="reminder_onboarding_title">Never miss what\'s due</string>
|
||||
@@ -238,7 +227,6 @@
|
||||
<string name="settings_exact_alarms">Exact timing</string>
|
||||
<string name="settings_exact_alarms_allowed">Reminders fire at the exact time</string>
|
||||
<string name="settings_exact_alarms_blocked">Blocked — tap to allow exact reminders</string>
|
||||
<string name="settings_section_tasks">Tasks</string>
|
||||
<string name="settings_default_list">Default list</string>
|
||||
<string name="settings_default_list_first">First available list</string>
|
||||
<string name="settings_add_subtask_row">Show \"add a subtask\" row</string>
|
||||
|
||||
+28
-37
@@ -1,53 +1,42 @@
|
||||
[versions]
|
||||
agp = "9.2.1"
|
||||
kotlin = "2.3.21"
|
||||
ksp = "2.3.9"
|
||||
hilt = "2.59.2"
|
||||
ksp = "2.3.11"
|
||||
hilt = "2.60.1"
|
||||
coreKtx = "1.19.0"
|
||||
appcompat = "1.7.1"
|
||||
lifecycleRuntime = "2.10.0"
|
||||
lifecycleRuntime = "2.11.0"
|
||||
activityCompose = "1.13.0"
|
||||
composeBom = "2026.05.01"
|
||||
# Material 3 Expressive APIs currently live only in the 1.5 alpha line.
|
||||
# Pin explicitly to override the BOM (which ships stable 1.4.0).
|
||||
# Re-evaluate when 1.5.0 stable lands.
|
||||
material3 = "1.5.0-alpha21"
|
||||
material3 = "1.5.0-alpha26"
|
||||
datastore = "1.2.1"
|
||||
# Room — Agendula's own task store (docs/OWN-STORE.md).
|
||||
room = "2.8.4"
|
||||
kotlinxSerialization = "1.8.1"
|
||||
# SAF directory writing for export/backup (DocumentFile).
|
||||
documentfile = "1.1.0"
|
||||
junit = "6.1.0"
|
||||
junitPlatform = "6.1.0"
|
||||
junit = "6.1.3"
|
||||
junitPlatform = "6.1.3"
|
||||
truth = "1.4.5"
|
||||
androidxJunit = "1.3.0"
|
||||
espressoCore = "3.7.0"
|
||||
kotlinxDatetime = "0.7.0"
|
||||
kotlinxCoroutines = "1.10.2"
|
||||
turbine = "1.2.0"
|
||||
hiltNavigationCompose = "1.3.0"
|
||||
hiltNavigationCompose = "1.4.0"
|
||||
navigationCompose = "2.9.0"
|
||||
lifecycleCompose = "2.10.0"
|
||||
lifecycleCompose = "2.11.0"
|
||||
androidxTestRules = "1.7.0"
|
||||
# Glance: 1.1.1 is the latest stable (1.2.0 is still rc, 1.3.0 alpha).
|
||||
glance = "1.1.1"
|
||||
|
||||
# --- :provider (vendored dmfs task provider) ---------------------------------
|
||||
# Versions the upstream 1.4.2 source was written against. These are its runtime
|
||||
# dependencies, not ours — nothing above the data layer touches them, and they
|
||||
# only move when we deliberately resync the fork. See provider/PROVENANCE.md.
|
||||
dmfsJems = "1.43"
|
||||
dmfsRfc5545Datetime = "0.2.4"
|
||||
# RFC 5545 recurrence expansion. The last of the dmfs dependencies: the vendored
|
||||
# `:provider` module that needed the rest was deleted (docs/STORAGE-DECISION.md),
|
||||
# and lib-recur stayed because our own store expands a series in process.
|
||||
# Pinned at 0.12.2 — 0.16.0 removed RecurrenceSet. rfc5545-datetime arrives with
|
||||
# it as part of its API surface, so it is not declared separately.
|
||||
dmfsLibRecur = "0.12.2"
|
||||
# The provider's own test suite is JUnit 4 + Robolectric, unlike the app's
|
||||
# JUnit 5. Kept as upstream wrote it (rewriting ~13 test classes would forfeit
|
||||
# the regression coverage that makes vendoring safe), but on current versions:
|
||||
# upstream pins Robolectric 3.5.1, which predates AGP's resource handling.
|
||||
robolectric = "4.16"
|
||||
junit4 = "4.13.2"
|
||||
hamcrest = "3.0"
|
||||
mockito = "5.20.0"
|
||||
|
||||
[libraries]
|
||||
# AndroidX core
|
||||
@@ -107,8 +96,11 @@ kotlinx-coroutines-test = { group = "org.jetbrains.kotlinx", name = "kotlinx-cor
|
||||
# Test - Flow assertions
|
||||
turbine = { group = "app.cash.turbine", name = "turbine", version.ref = "turbine" }
|
||||
|
||||
# Hilt navigation-compose (for hiltViewModel() in Composables)
|
||||
# Hilt navigation-compose (hiltViewModel() moved out of it in 1.4.0, into
|
||||
# hilt-lifecycle-viewmodel-compose — which it still brings in transitively, but
|
||||
# we call that API directly, so it is declared here rather than inherited)
|
||||
androidx-hilt-navigation-compose = { group = "androidx.hilt", name = "hilt-navigation-compose", version.ref = "hiltNavigationCompose" }
|
||||
androidx-hilt-lifecycle-viewmodel-compose = { group = "androidx.hilt", name = "hilt-lifecycle-viewmodel-compose", version.ref = "hiltNavigationCompose" }
|
||||
|
||||
# Navigation-compose (the NavHost / back stack)
|
||||
androidx-navigation-compose = { group = "androidx.navigation", name = "navigation-compose", version.ref = "navigationCompose" }
|
||||
@@ -118,22 +110,21 @@ androidx-lifecycle-runtime-compose = { group = "androidx.lifecycle", name = "lif
|
||||
# ProcessLifecycleOwner — the WAL checkpoint hangs off ON_STOP.
|
||||
androidx-lifecycle-process = { group = "androidx.lifecycle", name = "lifecycle-process", version.ref = "lifecycleRuntime" }
|
||||
|
||||
# Glance — Jetpack home-screen widgets (Compose-like RemoteViews)
|
||||
androidx-glance-appwidget = { group = "androidx.glance", name = "glance-appwidget", version.ref = "glance" }
|
||||
androidx-glance-material3 = { group = "androidx.glance", name = "glance-material3", version.ref = "glance" }
|
||||
|
||||
# Android tests - GrantPermissionRule
|
||||
androidx-test-rules = { group = "androidx.test", name = "rules", version.ref = "androidxTestRules" }
|
||||
|
||||
# :provider — vendored dmfs task provider (see provider/PROVENANCE.md)
|
||||
dmfs-jems = { group = "org.dmfs", name = "jems", version.ref = "dmfsJems" }
|
||||
dmfs-jems-testing = { group = "org.dmfs", name = "jems-testing", version.ref = "dmfsJems" }
|
||||
dmfs-rfc5545-datetime = { group = "org.dmfs", name = "rfc5545-datetime", version.ref = "dmfsRfc5545Datetime" }
|
||||
# Recurrence expansion for our own store
|
||||
dmfs-lib-recur = { group = "org.dmfs", name = "lib-recur", version.ref = "dmfsLibRecur" }
|
||||
robolectric = { group = "org.robolectric", name = "robolectric", version.ref = "robolectric" }
|
||||
junit4 = { group = "junit", name = "junit", version.ref = "junit4" }
|
||||
hamcrest = { group = "org.hamcrest", name = "hamcrest", version.ref = "hamcrest" }
|
||||
mockito-core = { group = "org.mockito", name = "mockito-core", version.ref = "mockito" }
|
||||
|
||||
# floret-kit — the shared house library, an included build (see settings.gradle.kts).
|
||||
# Deliberately version-less: the composite build substitutes these coordinates
|
||||
# with the submodule's own projects, so a version here would be fiction.
|
||||
floret-core-time = { group = "de.jeanlucmakiola.floret", name = "core-time" }
|
||||
floret-core-reminders = { group = "de.jeanlucmakiola.floret", name = "core-reminders" }
|
||||
floret-core-locale = { group = "de.jeanlucmakiola.floret", name = "core-locale" }
|
||||
floret-core-crash = { group = "de.jeanlucmakiola.floret", name = "core-crash" }
|
||||
floret-identity = { group = "de.jeanlucmakiola.floret", name = "identity" }
|
||||
floret-components = { group = "de.jeanlucmakiola.floret", name = "components" }
|
||||
|
||||
[plugins]
|
||||
android-application = { id = "com.android.application", version.ref = "agp" }
|
||||
|
||||
Reference in New Issue
Block a user