Skip to content

Commit fdf0ac2

Browse files
committed
Merge the نون identity into the CI and dependency work
Two lines of work met here. master had gained CI, Dependabot, an architecture document and a Gradle 9.6.1 wrapper; this branch had replaced the identity. The conflicts were all in the four files that carry the mark, and in every one of them master's side was the old bell with a punctuation pass applied over it. The identity is taken from this branch and the punctuation convention is carried forward into its new comments, so the codebase keeps one style. docs/assets/header-light.svg and header-dark.svg are removed. They drew the old bell in the old teal, so leaving them would have kept the previous logo on the most public surface the project has while the app itself no longer used it. The README goes back to the mark and a heading, which also renders Arabic with GitHub's own fonts instead of hoping the viewer has an Arabic face installed. README stays Arabic-first and short, and keeps what the quality pass added that has value: the CI and release badges, and a link to ARCHITECTURE.md rather than an architecture section. Two feature claims were checked against the source before being written down: the Arabic natural-language entry is real and wired into the editor, and Hijri is date display only, because the editor maps any stored Hijri schedule to its nearest Gregorian one. Re-verified on the upgraded toolchain: 430 tests pass on Gradle 9.6.1, lint reports zero errors, and debug, release and bundle all build.
2 parents 6c1a659 + 4827f2f commit fdf0ac2

66 files changed

Lines changed: 462 additions & 278 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.gitattributes

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
# Normalise line endings in the repository, check out native on Windows.
2+
* text=auto
3+
4+
# Scripts and wrappers that must keep LF whatever the platform.
5+
gradlew text eol=lf
6+
*.sh text eol=lf
7+
8+
# Windows batch files need CRLF.
9+
*.bat text eol=crlf
10+
11+
# Binary assets, never diffed or line-ending converted.
12+
*.jar binary
13+
*.ttf binary
14+
*.png binary
15+
*.apk binary
16+
*.aab binary
17+
*.keystore binary
18+
19+
# Fonts are third party, keep them out of the language statistics.
20+
Rannah/app/src/main/res/font/* linguist-vendored

.github/dependabot.yml

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
version: 2
2+
updates:
3+
# The Gradle build, including the version catalog in gradle/libs.versions.toml.
4+
- package-ecosystem: gradle
5+
directory: /Rannah
6+
schedule:
7+
interval: monthly
8+
open-pull-requests-limit: 5
9+
commit-message:
10+
prefix: build
11+
# AGP, Kotlin, KSP, Hilt and Room move as one toolchain: the first
12+
# Dependabot round proposed AGP 9.3.1, Hilt 2.60.1, Room 2.8.4 and
13+
# hilt-androidx 1.4.0, and every one of them failed the build against
14+
# AGP 8.7.3 and Kotlin 2.1.0, the Hilt plugin not even applying. Moving
15+
# them is a deliberate, coordinated upgrade, not a monthly chore, so only
16+
# patch updates arrive automatically for this group. Everything else in
17+
# the catalog still gets minor and patch updates.
18+
ignore:
19+
- dependency-name: com.android.*
20+
update-types: [version-update:semver-major, version-update:semver-minor]
21+
- dependency-name: org.jetbrains.kotlin*
22+
update-types: [version-update:semver-major, version-update:semver-minor]
23+
- dependency-name: com.google.devtools.ksp*
24+
update-types: [version-update:semver-major, version-update:semver-minor]
25+
- dependency-name: com.google.dagger:*
26+
update-types: [version-update:semver-major, version-update:semver-minor]
27+
- dependency-name: androidx.hilt:*
28+
update-types: [version-update:semver-major, version-update:semver-minor]
29+
- dependency-name: androidx.room:*
30+
update-types: [version-update:semver-major, version-update:semver-minor]
31+
# The app compiles against SDK 35. Current AndroidX releases expect 36,
32+
# so their minor updates fail the build until the platform moves. Patch
33+
# updates still arrive, and anything that passes CI still gets merged.
34+
- dependency-name: androidx.*
35+
update-types: [version-update:semver-major, version-update:semver-minor]
36+
37+
- package-ecosystem: github-actions
38+
directory: /
39+
schedule:
40+
interval: monthly
41+
open-pull-requests-limit: 3
42+
commit-message:
43+
prefix: ci

.github/workflows/ci.yml

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
name: CI
2+
3+
on:
4+
push:
5+
branches: [master]
6+
pull_request:
7+
workflow_dispatch:
8+
9+
permissions:
10+
contents: read
11+
12+
defaults:
13+
run:
14+
working-directory: Rannah
15+
16+
jobs:
17+
build:
18+
name: Unit tests, lint and debug build
19+
runs-on: ubuntu-latest
20+
steps:
21+
- uses: actions/checkout@v7
22+
23+
- uses: actions/setup-java@v5
24+
with:
25+
distribution: temurin
26+
java-version: 17
27+
cache: gradle
28+
29+
- name: Unit tests
30+
run: ./gradlew testDebugUnitTest --no-daemon
31+
32+
- name: Android Lint
33+
run: ./gradlew lintDebug --no-daemon
34+
35+
- name: Debug build
36+
run: ./gradlew assembleDebug --no-daemon
37+
38+
# The release variant is where minification and resource shrinking run,
39+
# so it is the one that catches a missing ProGuard keep rule. It
40+
# assembles unsigned here: the signing key lives outside the repository.
41+
- name: Release build
42+
run: ./gradlew assembleRelease --no-daemon
43+
44+
- name: Upload reports on failure
45+
if: failure()
46+
uses: actions/upload-artifact@v7
47+
with:
48+
name: reports
49+
path: |
50+
Rannah/app/build/reports/
51+
retention-days: 7

README.md

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@
99

1010
لكل موعد رَنّة
1111

12+
<a href="https://github.com/Mod578/Rannah/actions/workflows/ci.yml"><img src="https://github.com/Mod578/Rannah/actions/workflows/ci.yml/badge.svg?branch=master" alt="حالة البناء"></a>
13+
<a href="https://github.com/Mod578/Rannah/releases/latest"><img src="https://img.shields.io/github/v/release/Mod578/Rannah?label=%D8%A7%D9%84%D8%A5%D8%B5%D8%AF%D8%A7%D8%B1" alt="أحدث إصدار"></a>
14+
1215
</div>
1316

1417
<div dir="rtl">
@@ -19,14 +22,15 @@
1922
## المزايا
2023

2124
- تذكير لمرة واحدة أو يومي أو متكرر بأيام الأسبوع أو شهريًا أو سنويًا
25+
- كتابة التذكير بالعربية الطبيعية، مثل «ذكرني كل يوم الساعة ٩ بالدواء»
2226
- رنين بشاشة كاملة فوق شاشة القفل، بصوت المنبّه
2327
- تأجيل بالمدة الافتراضية، أو بمدة تختارها لرنّة واحدة
2428
- تأكيد الإنجاز بسحب متعمّد على شاشة الرنّة
2529
- تخطي رنّة اليوم مع بقاء التكرار كما هو
2630
- إيقاف التذكير مؤقتًا واستئنافه
2731
- تراجع عن الإنجاز والتخطي والحذف
2832
- سجل لكل تذكير يبيّن ما أُنجز وما تُخطّي وما مرّ دون إجابة
29-
- عرض التاريخ الميلادي والهجري
33+
- عرض التاريخ الهجري إلى جانب الميلادي، مع تعديل الفارق عند الحاجة
3034
- ودجت لتاريخ اليوم والرنّة القادمة
3135
- مظهر نهاري وليلي، أو اتباع مظهر النظام
3236
- واجهة عربية بالكامل من اليمين إلى اليسار
@@ -36,8 +40,11 @@
3640

3741
[تنزيل أحدث إصدار](https://github.com/Mod578/Rannah/releases/latest)
3842

39-
ملف `APK` هو ملف التثبيت المباشر على أندرويد. قد يطلب النظام السماح بالتثبيت
40-
من هذا المصدر.
43+
نزّل ملف `APK` وافتحه، واسمح بالتثبيت من هذا المصدر حين يطلب النظام ذلك. وعند
44+
أول تشغيل امنح إذن التنبيهات وإذن التنبيه في وقته، فبدونهما لا ترنّ التذكيرات
45+
في مواعيدها.
46+
47+
مع كل إصدار ملف `SHA256SUMS.txt` للتحقّق من الملفات.
4148

4249
## الخصوصية
4350

@@ -51,6 +58,10 @@
5158

5259
أندرويد 8.0 أو أحدث.
5360

61+
## للمطوّرين
62+
63+
[بنية المشروع والبناء من المصدر](Rannah/docs/ARCHITECTURE.md) · [الهوية البصرية](Rannah/docs/BRAND.md)
64+
5465
## المطوّر
5566

5667
محمد المطيري

Rannah/app/src/main/java/com/bal/reminders/BalApp.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,8 @@ class BalApp : Application(), Configuration.Provider {
2929
super.onCreate()
3030
notificationPresenter.ensureChannels()
3131
ReconcileWorker.ensureScheduled(this)
32-
// Restore alarms whenever the process starts covers the case where a
33-
// force-stop wiped them and the user just reopened the app and clean up
32+
// Restore alarms whenever the process starts, covers the case where a
33+
// force-stop wiped them and the user just reopened the app, and clean up
3434
// one-time reminders that were completed on a previous day.
3535
appScope.launch {
3636
scheduler.pruneFinished()

Rannah/app/src/main/java/com/bal/reminders/MainActivity.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ class MainActivity : ComponentActivity() {
5757
}
5858
// The system bars carry the app's appearance, not the system's.
5959
// Someone running رَنّة in «نهاري» on a dark-themed phone was
60-
// getting light icons over a light background invisible.
60+
// getting light icons over a light background: invisible.
6161
SideEffect { applyBarAppearance(dark) }
6262
BalTheme(darkTheme = dark) {
6363
BalRoot(

Rannah/app/src/main/java/com/bal/reminders/alarm/AlarmActivity.kt

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -76,8 +76,8 @@ import kotlinx.coroutines.delay
7676
* The full-screen alarm surface, shown over the lock screen while the ringer
7777
* sounds. It offers exactly two answers: «تأجيل» postpones and closes; «تم»
7878
* reveals a deliberate slide-to-confirm, and only completing that slide records
79-
* the occurrence as done. Nothing here a background tap, the back gesture,
80-
* leaving the screen ever counts as completion.
79+
* the occurrence as done. Nothing here: a background tap, the back gesture,
80+
* leaving the screen: ever counts as completion.
8181
*/
8282
@AndroidEntryPoint
8383
class AlarmActivity : ComponentActivity() {
@@ -199,7 +199,7 @@ private fun AlarmScreen(viewModel: AlarmViewModel) {
199199
}
200200
}
201201
// The label reads the setting, so it is always describing what the
202-
// button will actually do including right after the user changed it.
202+
// button will actually do: including right after the user changed it.
203203
val snoozeLabel = context.resources.getQuantityString(
204204
R.plurals.notification_snooze_minutes,
205205
state.defaultSnoozeMinutes,
@@ -217,7 +217,7 @@ private fun AlarmScreen(viewModel: AlarmViewModel) {
217217
horizontalAlignment = Alignment.CenterHorizontally,
218218
verticalArrangement = Arrangement.Center,
219219
) {
220-
// While the ring sounds, the mark breathes a slow swell, the one
220+
// While the ring sounds, the mark breathes: a slow swell, the one
221221
// place motion says "this is happening now". It used to rotate
222222
// about a point 14% down the height, which was a bell's hanging
223223
// loop; the mark has no loop to hang from, and a tilted نون reads
@@ -312,7 +312,7 @@ private fun AlarmScreen(viewModel: AlarmViewModel) {
312312
)
313313
}
314314
Spacer(Modifier.height(8.dp))
315-
// «مدة أخرى»: one quiet, ordinary, focusable button not a
315+
// «مدة أخرى»: one quiet, ordinary, focusable button: not a
316316
// long-press, which TalkBack and switch access cannot reach and
317317
// nobody discovers. Everything it offers lives one layer down,
318318
// so the ringing screen keeps its two large answers.

Rannah/app/src/main/java/com/bal/reminders/alarm/AlarmViewModel.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ class AlarmViewModel @Inject constructor(
9999
confirming.value = false
100100
}
101101

102-
/** «تأجيل»: the global default, applied now not a number frozen into the reminder. */
102+
/** «تأجيل»: the global default, applied now, not a number frozen into the reminder. */
103103
fun snooze() = resolveOnce { id, occurrence ->
104104
scheduler.snooze(id, occurrence, SnoozeRequest.Default)
105105
}

Rannah/app/src/main/java/com/bal/reminders/data/Mappers.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ private const val TYPE_HIJRI_MONTHLY_LEGACY = "hijri_monthly"
2323

2424
/**
2525
* رَنّة dropped categories, priorities, alert modes, follow-up, per-reminder
26-
* alarm options andsince 1.1 the per-reminder snooze length. The columns
26+
* alarm options and, since 1.1, the per-reminder snooze length. The columns
2727
* survive so old databases migrate losslessly (and a downgrade would still
2828
* read); every new row writes these neutral defaults, and nothing in the app
2929
* reads them back. Hijri schedule columns are also preserved so reminders saved

Rannah/app/src/main/java/com/bal/reminders/data/db/BalDatabase.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -96,8 +96,8 @@ abstract class BalDatabase : RoomDatabase() {
9696
* v4: drops `stopMarksCompleted`.
9797
*
9898
* The column let «إيقاف الصوت» record a completion. That made one verb
99-
* mean two things silence a ringer, and assert that an obligation in
100-
* the world was met and which one it meant depended on a switch buried
99+
* mean two things: silence a ringer, and assert that an obligation in
100+
* the world was met, and which one it meant depended on a switch buried
101101
* in customization. رَنّة now has exactly one rule: stopping a sound
102102
* stops a sound. Completion is always its own deliberate act.
103103
*
@@ -183,13 +183,13 @@ abstract class BalDatabase : RoomDatabase() {
183183
/**
184184
* v6: one answer per occurrence, and one global snooze length.
185185
*
186-
* The table shape does not change this migration is entirely about
186+
* The table shape does not change: this migration is entirely about
187187
* data that older builds could produce and 1.1 no longer can:
188188
*
189189
* - An occurrence could hold **both** a `completed` and a `skipped`
190190
* record. The unique index is per (reminder, occurrence, status), so
191191
* SQLite always allowed the pair, and two surfaces racing could write
192-
* it. «تم» is the stronger claimit asserts the task happened so a
192+
* it. «تم» is the stronger claim: it asserts the task happened, so a
193193
* contradicting `skipped` row is dropped and the completion stands.
194194
* - A `missed` record alongside an answer said two things about one
195195
* occurrence. The answer is the later and truer one; the `missed` row

0 commit comments

Comments
 (0)