diff --git a/README.md b/README.md index 873ce7bb..8904bf03 100644 --- a/README.md +++ b/README.md @@ -1,15 +1,15 @@ ![](media/math_alarm_github.png) -# Math Alarm :alarm_clock: +# Math Alarm ![Android Build](https://github.com/t-regbs/MathAlarm/workflows/Android%20Build/badge.svg) ![My twitter](https://img.shields.io/twitter/url?style=social&url=https%3A%2F%2Ftwitter.com%2Ftimiaregbs) ![Shield](https://img.shields.io/badge/contributions-welcome-brightgreen) [![Made in Nigeria](https://img.shields.io/badge/made%20in-nigeria-008751.svg?style=flat-square)](https://github.com/acekyd/made-in-nigeria) -A **Kotlin Multiplatform** alarm app for Android and iOS where you solve math problems of varying difficulty to dismiss the alarm. Built with Clean Architecture and shared Kotlin ViewModels, Android Compose, and a native SwiftUI development UI. +Math Alarm is an Android and iOS app that asks you to solve math problems to dismiss an alarm. It shares Kotlin alarm logic and ViewModels, with Compose screens on Android and SwiftUI screens on iOS. Get it on Google Play ## Architecture -The project follows **Clean Architecture** with the **MVVM** pattern: +The project has four modules: - **`:androidApp`** - All Compose screens/navigation/theme/localization/resources, application entry points and Android platform wiring - **`:shared`** - UI-free feature ViewModels, application coordination, data and platform service adapters @@ -18,30 +18,30 @@ The project follows **Clean Architecture** with the **MVVM** pattern: The native migration uses shared Kotlin ViewModels and alarm logic with Compose on Android and SwiftUI on iOS. All native parity screens are implemented. Permanent XCTest/UI targets, native client flows, renderer/resource gates and archive checks are documented in [architecture and build](docs/native-architecture.md) and [testing](docs/testing.md). [Migration progress](docs/native-ui-migration-progress.md) separates implementation evidence from physical AlarmKit, acoustic, minimum-runtime and release acceptance gates. This development build is not yet release ready. -## Technologies Used +## Libraries ### Kotlin Multiplatform * [Kotlin Multiplatform](https://kotlinlang.org/docs/multiplatform.html) - Share code between Android and iOS * [Compose Multiplatform](https://www.jetbrains.com/lp/compose-multiplatform/) - Android declarative UI renderer -### UI & Navigation -* [Material 3](https://m3.material.io/) - Modern Material Design components +### UI and navigation +* [Material 3](https://m3.material.io/) - Material Design components * [Navigation 3](https://developer.android.com/guide/navigation) - Android Compose navigation * [Compottie](https://github.com/alexzhirkevich/compottie) - Android Compose Lottie animations -### Data & Storage +### Data and storage * [Room KMP](https://developer.android.com/kotlin/multiplatform/room) - Multiplatform database with SQLite * [Multiplatform Settings](https://github.com/russhwolf/multiplatform-settings) - Key-value storage across platforms * [Kotlinx Serialization](https://github.com/Kotlin/kotlinx.serialization) - JSON serialization -### Dependency Injection -* [Koin](https://insert-koin.io/) - Lightweight dependency injection framework for KMP +### Dependency injection +* [Koin](https://insert-koin.io/) - Dependency injection for KMP -### Async & Reactive +### Asynchronous code * [Coroutines](https://kotlinlang.org/docs/coroutines-overview.html) - Asynchronous programming * [Kotlinx DateTime](https://github.com/Kotlin/kotlinx-datetime) - Multiplatform date/time library -### Logging & Analytics (Android) +### Logging and analytics on Android * [Kermit](https://github.com/touchlab/Kermit) - Multiplatform logging library * [Firebase Analytics](https://firebase.google.com/docs/analytics) - App analytics * [Firebase Crashlytics](https://firebase.google.com/docs/crashlytics) - Crash reporting @@ -82,9 +82,9 @@ xcodebuild -project iosApp/iosApp.xcodeproj -scheme MathAlarmNative -configurati The PR workflow runs permanent native tests, client flows, nine-locale screenshots and archive packaging on the GitHub-hosted `xcode-27` Apple Silicon image, explicitly selecting Xcode 27.0 (27A266a). Use iPad simulators for layout/navigation checks and a physical iPhone for AlarmKit delivery and audio validation. Signed device builds require your Apple development team and provisioning profile; a simulator build does not establish alarm delivery reliability. ## Contribution -All contributions are welcome. Simply make a PR! +Open a pull request with a description of the change and how you tested it. -## LICENSE +## License ``` MIT License diff --git a/androidApp/src/main/kotlin/com/timilehinaregbesola/mathalarm/utils/strings/EnMathAlarmStrings.kt b/androidApp/src/main/kotlin/com/timilehinaregbesola/mathalarm/utils/strings/EnMathAlarmStrings.kt index 7fdd6a70..84ce10af 100644 --- a/androidApp/src/main/kotlin/com/timilehinaregbesola/mathalarm/utils/strings/EnMathAlarmStrings.kt +++ b/androidApp/src/main/kotlin/com/timilehinaregbesola/mathalarm/utils/strings/EnMathAlarmStrings.kt @@ -6,7 +6,7 @@ import cafe.adriel.lyricist.LyricistStrings val EnMathAlarmStrings = Strings( selectAlarmPrompt = "Select an alarm or create a new one", closeAlarmEditor = "Close this editor?", - closeAlarmEditorMessage = "Any unsaved changes to this alarm will be discarded.", + closeAlarmEditorMessage = "You will lose unsaved changes to this alarm.", discardChanges = "Discard changes", mathDifficultyNames = listOf("Easy", "Medium", "Hard", "Custom"), @@ -29,18 +29,18 @@ val EnMathAlarmStrings = Strings( chooseRange = "Choose range", checkAnswer = "Check answer", nextFeature = "Next", - snoozeAnnouncementTitle = "Snooze on your terms", + snoozeAnnouncementTitle = "Snooze limits and duration", snoozeAnnouncementDescription = "Set a snooze limit, choose a duration from 1–30 minutes, or turn snooze off. New alarms start with 3 snoozes of 5 minutes. Existing alarms keep their snooze limits.", - snoozeAnnouncementInstructions = "Use the Snooze checkbox for a quick on/off toggle. Tap Edit beside it to change the limit and duration.", - whatsNew = "What’s new", - latestFeatures = "Explore the latest features", + snoozeAnnouncementInstructions = "Turn Snooze on or off with the checkbox. Tap Edit beside it to change the limit and duration.", + whatsNew = "What's new", + latestFeatures = "New alarm settings", gotIt = "Got it", tryFeature = "Try it", - challengeAnnouncementTitle = "More ways to wake up", + challengeAnnouncementTitle = "Custom math challenges", challengeAnnouncementInstructions = "Add or edit an alarm, then tap Edit next to Math challenge.", exampleChallenge = "Example challenge", exampleDifficultyMix = { easy, medium -> "Easy: $easy · Medium: $medium" }, - challengeAnnouncementDescription = { maximum -> "Solve up to $maximum questions. Mix difficulties or build a custom challenge that works for you." }, + challengeAnnouncementDescription = { maximum -> "Solve up to $maximum questions. Mix difficulties or create a custom challenge." }, questionCount = ::questionCountEn, challengeSummary = { difficulty, count -> "$difficulty · ${questionCountEn(count)}" }, mixedQuestionTotal = { count, maximum -> "${questionCountEn(count)} total · Maximum $maximum" }, @@ -49,27 +49,27 @@ val EnMathAlarmStrings = Strings( difficultyQuestionLabel = { difficulty -> "Questions: $difficulty" }, decreaseQuestionCount = { label -> "Decrease count: $label" }, increaseQuestionCount = { label -> "Increase count: $label" }, - alarmScheduleFailed = "Couldn’t schedule alarm. Save it again.", - alarmSaveFailed = "Couldn’t save alarm. Try again.", - alarmUpdateFailed = "Couldn’t update alarm. Try again.", - preferenceUpdateFailed = "Couldn’t update settings. Try again.", + alarmScheduleFailed = "Couldn't schedule alarm. Save it again.", + alarmSaveFailed = "Couldn't save alarm. Try again.", + alarmUpdateFailed = "Couldn't update alarm. Try again.", + preferenceUpdateFailed = "Couldn't update settings. Try again.", retry = "Retry", - alarmDismissFailed = "Couldn’t dismiss alarm. Try again.", - alarmSnoozeFailed = "Couldn’t snooze alarm. Try again.", + alarmDismissFailed = "Couldn't dismiss alarm. Try again.", + alarmSnoozeFailed = "Couldn't snooze alarm. Try again.", incorrectAnswer = "Incorrect answer. Try again.", - multipleDays = "Multiple Days", + multipleDays = "Multiple days", greeting = { hour -> when { - hour < 12 -> "Good Morning" + hour < 12 -> "Good morning" hour in 12..17 -> "Afternoon" - else -> "Good Evening" + else -> "Good evening" } }, expand = "Expand", delete = "Delete", edit = "Edit", dateLocale = "en", - skipAnnouncementDescription = "Take a break from your next alarm without changing the rest of your schedule.", + skipAnnouncementDescription = "Skip the next alarm time and keep the rest of your schedule.", skipAnnouncementInstructions = "Expand an enabled alarm and tap Skip next. Available for weekly alarms and alarms with multiple selected days.", skipAnnouncementUndo = "Only the next occurrence is skipped; other selected days stay scheduled. That weekday returns the following week for repeating alarms. Non-repeating alarms keep only their remaining dates. Tap Undo before the skipped time to bring it back. Snoozes and other alarms stay scheduled.", viewAlarms = "View alarms", @@ -79,7 +79,7 @@ val EnMathAlarmStrings = Strings( undo = "Undo", undoSkip = "Undo skip", collapse = "Collapse", - noUpcomingAlarms = "No Upcoming Alarms", + noUpcomingAlarms = "No upcoming alarms", nextAlarmText = "Next alarm:", nextOccurrenceOn = { date -> "Next: $date" }, nextAlarmIn = { hours, minutes -> @@ -89,21 +89,21 @@ val EnMathAlarmStrings = Strings( if (minutes > 0) "$minutes ${if (minutes == 1) "minute" else "minutes"}" else null, ).joinToString(" ") }, - alarmSet = "Alarm Set for", + alarmSet = "Alarm set for", alarmPermissionDialogConfirm = "Confirm", alarmPermissionDialogCancel = "Cancel", alarmPermissionDialogText = "This app requires permission to set alarms.", - alarmPermissionDialogTitle = "Permission Required", + alarmPermissionDialogTitle = "Permission required", clearAlarmDialogConfirm = "Confirm", clearAlarmDialogCancel = "Cancel", - clearAlarmDialogText = "Are you sure you want to clear the alarms?", - clearAlarmDialogTitle = "Clear Alarms", - emptyAlarmList = "Empty Alarm List", - nothingToSee = "Nothing to see here", + clearAlarmDialogText = "Delete all alarms?", + clearAlarmDialogTitle = "Clear alarms", + emptyAlarmList = "No alarms", + nothingToSee = "Add an alarm to get started.", alarms = "Alarms", - deleteAll = "Delete All", + deleteAll = "Delete all", settings = "Settings", - toneUnavailable = "Tone Unavailable", + toneUnavailable = "Tone unavailable", clear = "Clear", maximumSnoozes = "Maximum snoozes", unlimitedSnoozes = "Unlimited", @@ -119,50 +119,50 @@ val EnMathAlarmStrings = Strings( snoozeSettingsSummary = { minutes, limit -> "$minutes min · $limit" }, snooze = "Snooze", enter = "Enter", - noRingtonePicker = "No Ringtone Picker", - alarmTitle = "Alarm Title", + noRingtonePicker = "No ringtone picker", + alarmTitle = "Alarm title", goodDay = "Good day", - defaultAlarmTone = "Alarm Tone (Default)", + defaultAlarmTone = "Default alarm tone", disabledNotificationMessage = "Notifications are disabled for this app.", - disabledNotificationMessageExtended = "Notifications of this application are disabled. Please go to your device settings and enable them.", + disabledNotificationMessageExtended = "Turn on notifications for Math Alarm in your device settings.", ok = "OK", notificationPermissionDialogMessage = "This app requires permission to show notifications.", - repeatWeekly = "Repeat Weekly", + repeatWeekly = "Repeat weekly", vibrate = "Vibrate", - testAlarm = "Test Alarm", + testAlarm = "Test alarm", save = "Save", - easyMath = "Easy Math", - mediumMath = "Medium Math", - hardMath = "Hard Math", - selectHour = "Select Hour", + easyMath = "Easy math", + mediumMath = "Medium math", + hardMath = "Hard math", + selectHour = "Select hour", cancel = "Cancel", input = "Input", picker = "Picker", system = "System", dark = "Dark", light = "Light", - appSettings = "App Settings", + appSettings = "App settings", back = "Back", - colorTheme = "Color Theme", - alarmOrder = "Alarm Order", - alarmOrderDescription = "Choose whether alarms appear by when they were created or by the time they go off.", - creationOrder = "Creation Order", + colorTheme = "Color theme", + alarmOrder = "Alarm order", + alarmOrderDescription = "Sort alarms by creation time or alarm time.", + creationOrder = "Creation order", timeOrder = "Time", help = "Help", - sendFeedback = "Send Feedback", + sendFeedback = "Send feedback", sendFeedbackMessage = "Send feedback to the developer", supportEmail = "aregbestimi@gmail.com", - emailChooserTitle = "Send Email", - defaultSendText = "Default Alarm", + emailChooserTitle = "Send email", + defaultSendText = "Default alarm", shareMathAlarm = "Share Math Alarm", - shareWithOthers = "Check out this cool alarm app", + shareWithOthers = "Try Math Alarm. Solve math problems to dismiss your alarm.", share = "Share", - taskAlarmPermissionDialogText = "In order for alarms to work, Math alarm needs the permission to set alarms. If this permission is not granted, the existing alarms will not work as well.", + taskAlarmPermissionDialogText = "Allow Math Alarm to set alarms. Without this permission, new and existing alarms cannot ring.", taskAlarmPermissionDialogCancel = "Not now", taskAlarmPermissionDialogConfirm = "Grant", notification = "Notification", alert = "Ringtone", - grantPermission = "Grant Permission", + grantPermission = "Grant permission", alarmSound = "Alarm sound", done = "Done", daybreakDescription = "Soft mallets · gentle", @@ -175,7 +175,7 @@ val EnMathAlarmStrings = Strings( previewSound = "Preview", stopSoundPreview = "Stop preview", permissionsExternalStorageText = { tone -> - "It seems that we cannot play $tone, probably because a permission is required. If you want, you can grant the permission. Alternatively, select a different sound. This decision can be changed in System Settings." + "Cannot play $tone. Allow access to the sound or choose another one. You can change permissions in your device settings." } ) diff --git a/androidApp/src/main/res/values/strings.xml b/androidApp/src/main/res/values/strings.xml index cc59b2b0..18ad70b8 100644 --- a/androidApp/src/main/res/values/strings.xml +++ b/androidApp/src/main/res/values/strings.xml @@ -1,21 +1,21 @@ - Set Alarm Time: + Set alarm time - Set Alarm Time + Set alarm time - Set On + Alarm days Repeat - Repeat Weekly - Alarm Settings + Repeat weekly + Alarm settings Vibrate - Alarm Tone + Alarm tone Snooze (0 = OFF) minute(s) - Math Difficulty - Test Alarm + Math difficulty + Test alarm - Add Alarm + Add alarm Set Delete @@ -44,11 +44,11 @@ No snooze allowed - Empty! + No alarms \nTap to\n add an\n alarm Android - Speech Bubble + Speech bubble Message Duplicate alarm detected @@ -62,22 +62,22 @@ days, Alarm tone not available. OK - Clear Alarms + Clear alarms alarm_channel Math Alarm - Math Alarm!! + Math Alarm No ringtone picker - Alarm Tone (Default) + Default alarm tone Ringtone - It seems that we cannot play %s, probably because a permission is required. If you want, you can grant the permission. Alternatively, select a different sound. This decision can be changed in System Settings. + Cannot play %s. Allow access to the sound or choose another one. You can change permissions in your device settings. Math alarms Notifications for alarms - App Updates + App updates Notifications about new app versions Done - In a few mins + Snooze Light Dark @@ -87,10 +87,10 @@ dark system - + @string/pref_theme_system_value Alarms - " In order for alarms to work, Math alarm needs the permission to set alarms. If this permission is not granted, the existing alarms will not work as well." + Allow Math Alarm to set alarms. Without this permission, new and existing alarms cannot ring. Grant Not now diff --git a/iosApp/iosApp/Localizable.xcstrings b/iosApp/iosApp/Localizable.xcstrings index 16ea26cd..b60293d9 100644 --- a/iosApp/iosApp/Localizable.xcstrings +++ b/iosApp/iosApp/Localizable.xcstrings @@ -554,7 +554,7 @@ "en" : { "stringUnit" : { "state" : "translated", - "value" : "A delivered alarm has priority over tone previews." + "value" : "Alarm playback takes priority over sound previews." } }, "es" : { @@ -1091,7 +1091,7 @@ "en" : { "stringUnit" : { "state" : "translated", - "value" : "Alarm Order" + "value" : "Alarm order" } }, "es" : { @@ -1151,7 +1151,7 @@ "en" : { "stringUnit" : { "state" : "translated", - "value" : "Alarm Title" + "value" : "Alarm title" } }, "es" : { @@ -1211,7 +1211,7 @@ "en" : { "stringUnit" : { "state" : "translated", - "value" : "Alarm Tone (Default)" + "value" : "Default alarm tone" } }, "es" : { @@ -1331,7 +1331,7 @@ "en" : { "stringUnit" : { "state" : "translated", - "value" : "Permission Required" + "value" : "Permission required" } }, "es" : { @@ -1631,7 +1631,7 @@ "en" : { "stringUnit" : { "state" : "translated", - "value" : "Couldn’t update alarm. Try again." + "value" : "Couldn't update alarm. Try again." } }, "es" : { @@ -1991,7 +1991,7 @@ "en" : { "stringUnit" : { "state" : "translated", - "value" : "Any unsaved changes to this alarm will be discarded." + "value" : "You will lose unsaved changes to this alarm." } }, "es" : { @@ -2050,7 +2050,7 @@ "en" : { "stringUnit" : { "state" : "translated", - "value" : "App Settings" + "value" : "App settings" } }, "es" : { @@ -2290,7 +2290,7 @@ "en" : { "stringUnit" : { "state" : "translated", - "value" : "Are you sure you want to clear the alarms?" + "value" : "Delete all alarms?" } }, "es" : { @@ -2708,7 +2708,7 @@ "en" : { "stringUnit" : { "state" : "translated", - "value" : "Check out this cool alarm app" + "value" : "Try Math Alarm. Solve math problems to dismiss your alarm." } }, "es" : { @@ -3185,7 +3185,7 @@ "en" : { "stringUnit" : { "state" : "translated", - "value" : "Choose whether alarms appear by when they were created or by the time they go off." + "value" : "Sort alarms by creation time or alarm time." } }, "es" : { @@ -3305,7 +3305,7 @@ "en" : { "stringUnit" : { "state" : "translated", - "value" : "Clear Alarms" + "value" : "Clear alarms" } }, "es" : { @@ -3425,7 +3425,7 @@ "en" : { "stringUnit" : { "state" : "translated", - "value" : "Clear Alarms" + "value" : "Clear alarms" } }, "es" : { @@ -3544,7 +3544,7 @@ "en" : { "stringUnit" : { "state" : "translated", - "value" : "Color Theme" + "value" : "Color theme" } }, "es" : { @@ -3664,7 +3664,7 @@ "en" : { "stringUnit" : { "state" : "translated", - "value" : "Couldn’t dismiss alarm. Try again." + "value" : "Couldn't dismiss alarm. Try again." } }, "es" : { @@ -3723,7 +3723,7 @@ "en" : { "stringUnit" : { "state" : "translated", - "value" : "Couldn’t open the requested action. Try again." + "value" : "Couldn't open the requested action. Try again." } }, "es" : { @@ -3783,7 +3783,7 @@ "en" : { "stringUnit" : { "state" : "translated", - "value" : "Couldn’t prepare this challenge. Try again." + "value" : "Couldn't prepare this challenge. Try again." } }, "es" : { @@ -3843,7 +3843,7 @@ "en" : { "stringUnit" : { "state" : "translated", - "value" : "Couldn’t save alarm. Try again." + "value" : "Couldn't save alarm. Try again." } }, "es" : { @@ -3903,7 +3903,7 @@ "en" : { "stringUnit" : { "state" : "translated", - "value" : "Couldn’t schedule alarm. Save it again." + "value" : "Couldn't schedule alarm. Save it again." } }, "es" : { @@ -3962,7 +3962,7 @@ "en" : { "stringUnit" : { "state" : "translated", - "value" : "Couldn’t send feedback. Try again." + "value" : "Couldn't send feedback. Try again." } }, "es" : { @@ -4022,7 +4022,7 @@ "en" : { "stringUnit" : { "state" : "translated", - "value" : "Couldn’t snooze alarm. Try again." + "value" : "Couldn't snooze alarm. Try again." } }, "es" : { @@ -4082,7 +4082,7 @@ "en" : { "stringUnit" : { "state" : "translated", - "value" : "Couldn’t update alarm. Try again." + "value" : "Couldn't update alarm. Try again." } }, "es" : { @@ -4141,7 +4141,7 @@ "en" : { "stringUnit" : { "state" : "translated", - "value" : "Couldn’t update preferences. Try again." + "value" : "Couldn't update preferences. Try again." } }, "es" : { @@ -4200,7 +4200,7 @@ "en" : { "stringUnit" : { "state" : "translated", - "value" : "Couldn’t update settings. Try again." + "value" : "Couldn't update settings. Try again." } }, "es" : { @@ -4258,7 +4258,7 @@ "en" : { "stringUnit" : { "state" : "translated", - "value" : "Creation Order" + "value" : "Creation order" } }, "es" : { @@ -4556,7 +4556,7 @@ "en" : { "stringUnit" : { "state" : "translated", - "value" : "Alarm Tone (Default)" + "value" : "Default alarm tone" } }, "es" : { @@ -4676,7 +4676,7 @@ "en" : { "stringUnit" : { "state" : "translated", - "value" : "Delete All" + "value" : "Delete all" } }, "es" : { @@ -4736,7 +4736,7 @@ "en" : { "stringUnit" : { "state" : "translated", - "value" : "Delete All" + "value" : "Delete all" } }, "es" : { @@ -4796,7 +4796,7 @@ "en" : { "stringUnit" : { "state" : "translated", - "value" : "Are you sure you want to clear the alarms?" + "value" : "Delete all alarms?" } }, "es" : { @@ -4856,7 +4856,7 @@ "en" : { "stringUnit" : { "state" : "translated", - "value" : "Delivery could not be decoded. It remains queued for retry." + "value" : "Could not read the alarm details. They are saved for another attempt." } }, "es" : { @@ -5873,7 +5873,7 @@ "en" : { "stringUnit" : { "state" : "translated", - "value" : "Empty Alarm List" + "value" : "No alarms" } }, "es" : { @@ -6350,7 +6350,7 @@ "en" : { "stringUnit" : { "state" : "translated", - "value" : "Explore the latest features" + "value" : "New alarm settings" } }, "es" : { @@ -7127,7 +7127,7 @@ "en" : { "stringUnit" : { "state" : "translated", - "value" : "Alarm Title" + "value" : "Alarm title" } }, "es" : { @@ -7305,7 +7305,7 @@ "en" : { "stringUnit" : { "state" : "translated", - "value" : "Make mornings count." + "value" : "Solve math problems to dismiss your alarm." } }, "es" : { @@ -8022,7 +8022,7 @@ "en" : { "stringUnit" : { "state" : "translated", - "value" : "More ways to wake up" + "value" : "Custom math challenges" } }, "es" : { @@ -9263,7 +9263,7 @@ "en" : { "stringUnit" : { "state" : "translated", - "value" : "No Upcoming Alarms" + "value" : "No upcoming alarms" } }, "es" : { @@ -9502,7 +9502,7 @@ "en" : { "stringUnit" : { "state" : "translated", - "value" : "Nothing to see here" + "value" : "Add an alarm to get started." } }, "es" : { @@ -10221,7 +10221,7 @@ "en" : { "stringUnit" : { "state" : "translated", - "value" : "Permission Required" + "value" : "Permission required" } }, "es" : { @@ -10760,7 +10760,7 @@ "en" : { "stringUnit" : { "state" : "translated", - "value" : "Questions are presented from easiest to hardest." + "value" : "Questions go from easiest to hardest." } }, "es" : { @@ -11000,7 +11000,7 @@ "en" : { "stringUnit" : { "state" : "translated", - "value" : "Repeat Weekly" + "value" : "Repeat weekly" } }, "es" : { @@ -11060,7 +11060,7 @@ "en" : { "stringUnit" : { "state" : "translated", - "value" : "Repeat Weekly" + "value" : "Repeat weekly" } }, "es" : { @@ -11480,7 +11480,7 @@ "en" : { "stringUnit" : { "state" : "translated", - "value" : "Select Hour" + "value" : "Select hour" } }, "es" : { @@ -11719,7 +11719,7 @@ "en" : { "stringUnit" : { "state" : "translated", - "value" : "Send Email" + "value" : "Send email" } }, "es" : { @@ -11778,7 +11778,7 @@ "en" : { "stringUnit" : { "state" : "translated", - "value" : "Send Feedback" + "value" : "Send feedback" } }, "es" : { @@ -12312,7 +12312,7 @@ "en" : { "stringUnit" : { "state" : "translated", - "value" : "Snooze on your terms" + "value" : "Snooze limits and duration" } }, "es" : { @@ -12551,7 +12551,7 @@ "en" : { "stringUnit" : { "state" : "translated", - "value" : "Solve up to %@ questions. Mix difficulties or build a custom challenge that works for you." + "value" : "Solve up to %@ questions. Mix difficulties or create a custom challenge." } }, "es" : { @@ -12730,7 +12730,7 @@ "en" : { "stringUnit" : { "state" : "translated", - "value" : "Stop Alarm" + "value" : "Stop alarm" } }, "es" : { @@ -13028,7 +13028,7 @@ "en" : { "stringUnit" : { "state" : "translated", - "value" : "Test Alarm" + "value" : "Test alarm" } }, "es" : { @@ -13208,7 +13208,7 @@ "en" : { "stringUnit" : { "state" : "translated", - "value" : "Empty Alarm List" + "value" : "No alarms" } }, "es" : { @@ -13506,7 +13506,7 @@ "en" : { "stringUnit" : { "state" : "translated", - "value" : "Tone Unavailable" + "value" : "Tone unavailable" } }, "es" : { @@ -13566,7 +13566,7 @@ "en" : { "stringUnit" : { "state" : "translated", - "value" : "Tone preview was interrupted by an alarm." + "value" : "An alarm interrupted the sound preview." } }, "es" : { @@ -13924,7 +13924,7 @@ "en" : { "stringUnit" : { "state" : "translated", - "value" : "Unable to retain delivery acknowledgement. Try again." + "value" : "Could not save the alarm delivery status. Try again." } }, "es" : { @@ -13984,7 +13984,7 @@ "en" : { "stringUnit" : { "state" : "translated", - "value" : "Couldn’t save alarm. Try again." + "value" : "Couldn't save alarm. Try again." } }, "es" : { @@ -14463,7 +14463,7 @@ "en" : { "stringUnit" : { "state" : "translated", - "value" : "What’s new" + "value" : "What's new" } }, "es" : { @@ -14582,7 +14582,7 @@ "en" : { "stringUnit" : { "state" : "translated", - "value" : "Your changes haven’t been saved." + "value" : "Your changes haven't been saved." } }, "es" : { diff --git a/scripts/maestro/ios/editor-preview.yaml b/scripts/maestro/ios/editor-preview.yaml index dcafae5a..3d1c51ec 100644 --- a/scripts/maestro/ios/editor-preview.yaml +++ b/scripts/maestro/ios/editor-preview.yaml @@ -7,7 +7,7 @@ appId: com.timilehinaregbesola.mathalarm - assertVisible: "Alarms" - tapOn: "Add alarm" - assertVisible: "TEST ALARM" -- tapOn: "Alarm Title" +- tapOn: "Alarm title" - inputText: 'Maestro "Wake" draft' - pressKey: Enter - assertVisible: "TEST ALARM" diff --git a/scripts/maestro/ios/ipad-share.yaml b/scripts/maestro/ios/ipad-share.yaml index b2643152..2469cdd1 100644 --- a/scripts/maestro/ios/ipad-share.yaml +++ b/scripts/maestro/ios/ipad-share.yaml @@ -2,7 +2,7 @@ appId: com.timilehinaregbesola.mathalarm --- - launchApp - tapOn: "gearshape" -- assertVisible: "App Settings" +- assertVisible: "App settings" - scrollUntilVisible: element: "Share" direction: DOWN @@ -11,4 +11,4 @@ appId: com.timilehinaregbesola.mathalarm - takeScreenshot: ipad-share-popover - tapOn: point: "10%,20%" -- assertVisible: "App Settings" +- assertVisible: "App settings" diff --git a/scripts/maestro/ios/native-m6-settings.yaml b/scripts/maestro/ios/native-m6-settings.yaml index 7d525be6..129fefc6 100644 --- a/scripts/maestro/ios/native-m6-settings.yaml +++ b/scripts/maestro/ios/native-m6-settings.yaml @@ -17,7 +17,7 @@ appId: com.timilehinaregbesola.mathalarm commands: - tapOn: "More" - tapOn: "Settings" -- assertVisible: "App Settings" +- assertVisible: "App settings" - tapOn: id: appThemePicker - tapOn: "Dark" @@ -27,11 +27,11 @@ appId: com.timilehinaregbesola.mathalarm - takeScreenshot: native-settings-dark - tapOn: id: whatsNewButton -- assertVisible: "More ways to wake up" +- assertVisible: "Custom math challenges" - takeScreenshot: native-announcement-maths - tapOn: id: announcementNext -- assertVisible: "Snooze on your terms" +- assertVisible: "Snooze limits and duration" - takeScreenshot: native-announcement-snooze - tapOn: id: announcementSnoozeExample @@ -61,7 +61,7 @@ appId: com.timilehinaregbesola.mathalarm - takeScreenshot: native-settings-after-restart - tapOn: id: whatsNewButton -- assertVisible: "More ways to wake up" +- assertVisible: "Custom math challenges" - tapOn: id: announcementGotIt - tapOn: @@ -82,7 +82,7 @@ appId: com.timilehinaregbesola.mathalarm point: "5%,20%" - assertVisible: id: appSettingsDone -- assertVisible: "App Settings" +- assertVisible: "App settings" - tapOn: id: feedbackButton - assertVisible: "No email app is available. Email aregbestimi@gmail.com to send feedback." @@ -97,6 +97,6 @@ appId: com.timilehinaregbesola.mathalarm - tapOn: "System" - tapOn: id: alarmSortPicker -- tapOn: "Creation Order" +- tapOn: "Creation order" - tapOn: id: appSettingsDone diff --git a/scripts/maestro/ios/native-m8-release-links.yaml b/scripts/maestro/ios/native-m8-release-links.yaml index f21b58dd..b9dec600 100644 --- a/scripts/maestro/ios/native-m8-release-links.yaml +++ b/scripts/maestro/ios/native-m8-release-links.yaml @@ -16,7 +16,7 @@ appId: com.timilehinaregbesola.mathalarm commands: - tapOn: "More" - tapOn: "Settings" -- assertVisible: "App Settings" +- assertVisible: "App settings" - scrollUntilVisible: element: id: privacyPolicyLink