Merge branch 'master' into choose-first-day

This commit is contained in:
Naveen Singh
2025-02-06 13:09:01 +05:30
committed by GitHub
115 changed files with 3520 additions and 149 deletions

View File

@@ -112,7 +112,7 @@ body:
description: |
A picture or video is worth a thousand words.
If applicable, drag and drop screenshots or a screen recording to help explain your problem. If your file is too big for Github to accept, try to compress it (ZIP file), or feel free to paste a link to an image/video hoster here instead.
If applicable, drag and drop screenshots or a screen recording to help explain your problem. If your file is too big for Github to accept, try to compress it (ZIP file), or feel free to paste a link to an image/video instead.
- type: textarea
id: additional-information

View File

@@ -20,14 +20,12 @@ body:
required: true
- label: "I have read the FAQs inside the app (Menu -> About -> FAQs) and my problem isn't listed."
required: true
- label: "**I have taken the time to fill in all the required details. I understand that the bug report will be dismissed otherwise.**"
- label: "**I have taken the time to fill in all the required details. I understand that the request will be dismissed otherwise.**"
required: true
- label: "This issue contains only one feature request."
required: true
- label: "I have read and understood the [contribution guidelines](https://github.com/FossifyOrg/Clock/blob/master/CONTRIBUTING.md)."
required: true
- label: "I optionally [donated](https://fossify.org/donate) to support the Fossify mission."
required: false
- type: textarea
id: feature-description

View File

@@ -18,7 +18,7 @@ module.exports = async ({github, context}) => {
initialBody = context.payload.comment.body;
} else if (context.eventName == 'issues') {
initialBody = context.payload.issue.body;
} else if (context.eventName == 'pull_request') {
} else if (context.eventName == 'pull_request_target') {
initialBody = context.payload.pull_request.body;
} else {
console.log('Aborting: No body found');
@@ -34,7 +34,7 @@ module.exports = async ({github, context}) => {
// Regex for finding images (simple variant) ![ALT_TEXT](https://*.githubusercontent.com/<number>/<variousHexStringsAnd->.<fileExtension>)
const REGEX_USER_CONTENT_IMAGE_LOOKUP = /\!\[(.*)\]\((https:\/\/[-a-z0-9]+\.githubusercontent\.com\/\d+\/[-0-9a-f]{32,512}\.(jpg|gif|png))\)/gm;
const REGEX_ASSETS_IMAGE_LOCKUP = /\!\[(.*)\]\((https:\/\/github\.com\/[-\w\d]+\/[-\w\d]+\/assets\/\d+\/[\-0-9a-f]{32,512})\)/gm;
const REGEX_ASSETS_IMAGE_LOCKUP = /\!\[(.*)\]\((https:\/\/github\.com\/user-attachments\/assets\/[\-0-9a-f]{36,})\)/gm;
// Check if we found something
let foundSimpleImages = REGEX_USER_CONTENT_IMAGE_LOOKUP.test(initialBody)
@@ -77,7 +77,7 @@ module.exports = async ({github, context}) => {
repo: context.repo.repo,
body: newBody
});
} else if (context.eventName == 'pull_request') {
} else if (context.eventName == 'pull_request_target') {
console.log('Updating pull request', context.payload.pull_request.number);
await github.rest.pulls.update({
pull_number: context.payload.pull_request.number,

View File

@@ -5,21 +5,19 @@ on:
types: [created, edited]
issues:
types: [opened, edited]
pull_request:
pull_request_target:
types: [opened, edited]
permissions:
issues: write
pull-requests: write
jobs:
try-minimize:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v4
with:
token: ${{ secrets.FOSSIFYBOT_TOKEN }}
- uses: actions/setup-node@v3
- uses: actions/setup-node@v4
with:
node-version: 16
@@ -27,9 +25,10 @@ jobs:
run: npm i probe-image-size@7.2.3 --ignore-scripts
- name: Minimize simple images
uses: actions/github-script@v6
uses: actions/github-script@v7
timeout-minutes: 3
with:
github-token: ${{ secrets.FOSSIFYBOT_TOKEN }}
script: |
const script = require('.github/workflows/image-minimizer.js');
await script({github, context});

View File

@@ -1,25 +1,24 @@
name: no-response
# Both `issue_comment` and `scheduled` event types are required for this Action
# to work properly.
on:
issue_comment:
types: [created]
schedule:
# Run daily at midnight.
- cron: '0 0 * * *'
permissions:
issues: write
pull-requests: write
- cron: '0 0 * * *' # Runs daily at midnight
workflow_dispatch:
jobs:
noResponse:
runs-on: ubuntu-latest
steps:
- uses: lee-dohm/no-response@v0.5.0
- uses: actions/stale@v9
with:
token: ${{ github.token }}
repo-token: ${{ secrets.FOSSIFYBOT_TOKEN }}
days-before-stale: -1
# Number of days of inactivity before an issue is closed for lack of response.
daysUntilClose: 30
responseRequiredLabel: waiting for author
days-before-close: 14
only-labels: 'waiting for author'
stale-issue-label: 'waiting for author'
stale-pr-label: 'waiting for author'
remove-stale-when-updated: false
ignore-updates: true
close-issue-message: This issue has been automatically closed due to inactivity. We requested additional information but have not received a response from the original author. Without the requested details, we cannot proceed. If you have or find the information needed, please comment so we can reopen the issue.
close-pr-message: This pull request has been automatically closed due to inactivity. We requested additional information but have not received a response from the original author. Without the requested details, we cannot proceed. If you have the needed information or updates, please reopen the PR or comment so we can continue the review.

9
.github/workflows/pr.yml vendored Normal file
View File

@@ -0,0 +1,9 @@
name: PR
on:
pull_request:
branches: [ master ]
jobs:
call-pr-workflow:
uses: FossifyOrg/.github/.github/workflows/pr.yml@main

10
.github/workflows/testing-build.yml vendored Normal file
View File

@@ -0,0 +1,10 @@
name: Testing build (on PR)
on:
pull_request:
branches: [ master ]
types: [ labeled, opened, synchronize, reopened ]
jobs:
call-testing-build-workflow:
uses: FossifyOrg/.github/.github/workflows/testing-build.yml@main

View File

@@ -2,7 +2,7 @@
Before you report something, read the reporting rules [here](https://github.com/FossifyOrg/General-Discussion#how-do-i-suggest-an-improvement-ask-a-question-or-report-an-issue) please.
### Contributing as a developer
Some instructions about code style and everything that has to be done to increase the change of your code getting accepted can be found at the [General Discussion](https://github.com/FossifyOrg/General-Discussion#contribution-rules-for-developers) section.
Some instructions about code style and everything that has to be done to increase the chance of your code getting accepted can be found at the [General Discussion](https://github.com/FossifyOrg/General-Discussion#contribution-rules-for-developers) section.
### Contributing as a non developer
In case you just want to for example improve a translation, you can find the way of doing it [here](https://github.com/FossifyOrg/General-Discussion#how-can-i-suggest-an-edit-to-a-file).

View File

@@ -1,7 +1,7 @@
# Fossify Clock
<img alt="Logo" src="graphics/icon.webp" width="120" />
<a href="https://f-droid.org/packages/org.fossify.clock/"><img src="https://fdroid.gitlab.io/artwork/badge/get-it-on-en.svg" alt="Get it on F-Droid" height=80/></a> <a href="https://apt.izzysoft.de/fdroid/index/apk/org.fossify.clock"><img src="https://gitlab.com/IzzyOnDroid/repo/-/raw/master/assets/IzzyOnDroid.png" alt="Get it on IzzyOnDroid" height=80/></a>
<a href='https://play.google.com/store/apps/details?id=org.fossify.clock'><img alt='Get it on Google Play' src='https://play.google.com/intl/en_us/badges/static/images/badges/en_badge_web_generic.png' height=80/></a> <a href="https://f-droid.org/packages/org.fossify.clock/"><img src="https://fdroid.gitlab.io/artwork/badge/get-it-on-en.svg" alt="Get it on F-Droid" height=80/></a> <a href="https://apt.izzysoft.de/fdroid/index/apk/org.fossify.clock"><img src="https://gitlab.com/IzzyOnDroid/repo/-/raw/master/assets/IzzyOnDroid.png" alt="Get it on IzzyOnDroid" height=80/></a>
Introducing Fossify Clock the ultimate timekeeping companion designed to enhance your daily routines and promote better sleep habits. With a multitude of functions tailored to your needs, Fossify Clock seamlessly integrates into your life, offering unparalleled convenience and versatility.

View File

@@ -6,7 +6,9 @@ import java.io.FileInputStream
plugins {
alias(libs.plugins.android)
alias(libs.plugins.kotlinAndroid)
alias(libs.plugins.kotlinSerialization)
alias(libs.plugins.ksp)
alias(libs.plugins.detekt)
}
val keystorePropertiesFile: File = rootProject.file("keystore.properties")
@@ -74,7 +76,8 @@ android {
}
compileOptions {
val currentJavaVersionFromLibs = JavaVersion.valueOf(libs.versions.app.build.javaVersion.get())
val currentJavaVersionFromLibs =
JavaVersion.valueOf(libs.versions.app.build.javaVersion.get())
sourceCompatibility = currentJavaVersionFromLibs
targetCompatibility = currentJavaVersionFromLibs
}
@@ -91,10 +94,16 @@ android {
lint {
checkReleaseBuilds = false
abortOnError = false
abortOnError = true
warningsAsErrors = true
baseline = file("lint-baseline.xml")
}
}
detekt {
baseline = file("detekt-baseline.xml")
}
dependencies {
implementation(libs.fossify.commons)
@@ -107,6 +116,7 @@ dependencies {
implementation(libs.numberpicker)
implementation(libs.autofittextview)
implementation(libs.eventbus)
implementation(libs.kotlinx.serialization.json)
implementation(libs.bundles.room)
ksp(libs.androidx.room.compiler)

334
app/detekt-baseline.xml Normal file
View File

@@ -0,0 +1,334 @@
<?xml version="1.0" ?>
<SmellBaseline>
<ManuallySuppressedIssues></ManuallySuppressedIssues>
<CurrentIssues>
<ID>ComplexCondition:IntentHandlerActivity.kt$IntentHandlerActivity$existingTimer != null &amp;&amp; skipUi &amp;&amp; (existingTimer.state is TimerState.Idle || (existingTimer.state is TimerState.Finished &amp;&amp; !existingTimer.oneShot))</ID>
<ID>CyclomaticComplexMethod:IntentHandlerActivity.kt$IntentHandlerActivity$private fun Intent.dismissAlarm()</ID>
<ID>CyclomaticComplexMethod:IntentHandlerActivity.kt$IntentHandlerActivity$private fun Intent.setNewAlarm()</ID>
<ID>EmptyCatchBlock:Context.kt${ }</ID>
<ID>EmptyCatchBlock:ReminderActivity.kt$ReminderActivity${ }</ID>
<ID>EmptyFunctionBlock:AlarmsAdapter.kt$AlarmsAdapter${}</ID>
<ID>EmptyFunctionBlock:StopwatchAdapter.kt$StopwatchAdapter${}</ID>
<ID>EmptyFunctionBlock:TimeZonesAdapter.kt$TimeZonesAdapter${}</ID>
<ID>EmptyFunctionBlock:TimerAdapter.kt$TimerAdapter${}</ID>
<ID>EmptyFunctionBlock:WidgetAnalogueConfigureActivity.kt$WidgetAnalogueConfigureActivity.&lt;no name provided&gt;${}</ID>
<ID>EmptyFunctionBlock:WidgetDigitalConfigureActivity.kt$WidgetDigitalConfigureActivity.&lt;no name provided&gt;${}</ID>
<ID>LongMethod:Constants.kt$fun getAllTimeZones()</ID>
<ID>LongMethod:Context.kt$fun Context.getTimerNotification(timer: Timer, pendingIntent: PendingIntent, addDeleteIntent: Boolean): Notification</ID>
<ID>LongMethod:IntentHandlerActivity.kt$IntentHandlerActivity$private fun Intent.dismissAlarm()</ID>
<ID>LongMethod:IntentHandlerActivity.kt$IntentHandlerActivity$private fun Intent.setNewAlarm()</ID>
<ID>LongMethod:ReminderActivity.kt$ReminderActivity$@SuppressLint("ClickableViewAccessibility") private fun setupAlarmButtons()</ID>
<ID>MagicNumber:AlarmReceiver.kt$AlarmReceiver$1000L</ID>
<ID>MagicNumber:AlarmsAdapter.kt$AlarmsAdapter$60</ID>
<ID>MagicNumber:App.kt$App$1000L</ID>
<ID>MagicNumber:App.kt$App.&lt;no name provided&gt;$1000</ID>
<ID>MagicNumber:ClockFragment.kt$ClockFragment$1000L</ID>
<ID>MagicNumber:ClockFragment.kt$ClockFragment$24</ID>
<ID>MagicNumber:ClockFragment.kt$ClockFragment$3600</ID>
<ID>MagicNumber:ClockFragment.kt$ClockFragment$60</ID>
<ID>MagicNumber:Config.kt$Config$300</ID>
<ID>MagicNumber:Constants.kt$10</ID>
<ID>MagicNumber:Constants.kt$1000</ID>
<ID>MagicNumber:Constants.kt$11</ID>
<ID>MagicNumber:Constants.kt$12</ID>
<ID>MagicNumber:Constants.kt$13</ID>
<ID>MagicNumber:Constants.kt$14</ID>
<ID>MagicNumber:Constants.kt$15</ID>
<ID>MagicNumber:Constants.kt$16</ID>
<ID>MagicNumber:Constants.kt$17</ID>
<ID>MagicNumber:Constants.kt$18</ID>
<ID>MagicNumber:Constants.kt$19</ID>
<ID>MagicNumber:Constants.kt$20</ID>
<ID>MagicNumber:Constants.kt$21</ID>
<ID>MagicNumber:Constants.kt$22</ID>
<ID>MagicNumber:Constants.kt$23</ID>
<ID>MagicNumber:Constants.kt$24</ID>
<ID>MagicNumber:Constants.kt$25</ID>
<ID>MagicNumber:Constants.kt$26</ID>
<ID>MagicNumber:Constants.kt$27</ID>
<ID>MagicNumber:Constants.kt$28</ID>
<ID>MagicNumber:Constants.kt$29</ID>
<ID>MagicNumber:Constants.kt$3</ID>
<ID>MagicNumber:Constants.kt$30</ID>
<ID>MagicNumber:Constants.kt$31</ID>
<ID>MagicNumber:Constants.kt$32</ID>
<ID>MagicNumber:Constants.kt$33</ID>
<ID>MagicNumber:Constants.kt$34</ID>
<ID>MagicNumber:Constants.kt$35</ID>
<ID>MagicNumber:Constants.kt$36</ID>
<ID>MagicNumber:Constants.kt$37</ID>
<ID>MagicNumber:Constants.kt$38</ID>
<ID>MagicNumber:Constants.kt$39</ID>
<ID>MagicNumber:Constants.kt$4</ID>
<ID>MagicNumber:Constants.kt$40</ID>
<ID>MagicNumber:Constants.kt$41</ID>
<ID>MagicNumber:Constants.kt$42</ID>
<ID>MagicNumber:Constants.kt$43</ID>
<ID>MagicNumber:Constants.kt$44</ID>
<ID>MagicNumber:Constants.kt$45</ID>
<ID>MagicNumber:Constants.kt$46</ID>
<ID>MagicNumber:Constants.kt$47</ID>
<ID>MagicNumber:Constants.kt$48</ID>
<ID>MagicNumber:Constants.kt$49</ID>
<ID>MagicNumber:Constants.kt$5</ID>
<ID>MagicNumber:Constants.kt$50</ID>
<ID>MagicNumber:Constants.kt$51</ID>
<ID>MagicNumber:Constants.kt$52</ID>
<ID>MagicNumber:Constants.kt$53</ID>
<ID>MagicNumber:Constants.kt$54</ID>
<ID>MagicNumber:Constants.kt$55</ID>
<ID>MagicNumber:Constants.kt$56</ID>
<ID>MagicNumber:Constants.kt$57</ID>
<ID>MagicNumber:Constants.kt$58</ID>
<ID>MagicNumber:Constants.kt$59</ID>
<ID>MagicNumber:Constants.kt$6</ID>
<ID>MagicNumber:Constants.kt$60</ID>
<ID>MagicNumber:Constants.kt$61</ID>
<ID>MagicNumber:Constants.kt$62</ID>
<ID>MagicNumber:Constants.kt$63</ID>
<ID>MagicNumber:Constants.kt$64</ID>
<ID>MagicNumber:Constants.kt$65</ID>
<ID>MagicNumber:Constants.kt$66</ID>
<ID>MagicNumber:Constants.kt$67</ID>
<ID>MagicNumber:Constants.kt$68</ID>
<ID>MagicNumber:Constants.kt$69</ID>
<ID>MagicNumber:Constants.kt$7</ID>
<ID>MagicNumber:Constants.kt$70</ID>
<ID>MagicNumber:Constants.kt$71</ID>
<ID>MagicNumber:Constants.kt$72</ID>
<ID>MagicNumber:Constants.kt$73</ID>
<ID>MagicNumber:Constants.kt$74</ID>
<ID>MagicNumber:Constants.kt$75</ID>
<ID>MagicNumber:Constants.kt$76</ID>
<ID>MagicNumber:Constants.kt$77</ID>
<ID>MagicNumber:Constants.kt$78</ID>
<ID>MagicNumber:Constants.kt$79</ID>
<ID>MagicNumber:Constants.kt$8</ID>
<ID>MagicNumber:Constants.kt$80</ID>
<ID>MagicNumber:Constants.kt$81</ID>
<ID>MagicNumber:Constants.kt$82</ID>
<ID>MagicNumber:Constants.kt$83</ID>
<ID>MagicNumber:Constants.kt$84</ID>
<ID>MagicNumber:Constants.kt$85</ID>
<ID>MagicNumber:Constants.kt$86</ID>
<ID>MagicNumber:Constants.kt$87</ID>
<ID>MagicNumber:Constants.kt$88</ID>
<ID>MagicNumber:Constants.kt$89</ID>
<ID>MagicNumber:Constants.kt$9</ID>
<ID>MagicNumber:Context.kt$0.4f</ID>
<ID>MagicNumber:Context.kt$1000</ID>
<ID>MagicNumber:Context.kt$12</ID>
<ID>MagicNumber:Context.kt$2</ID>
<ID>MagicNumber:Context.kt$24</ID>
<ID>MagicNumber:Context.kt$3</ID>
<ID>MagicNumber:Context.kt$3600</ID>
<ID>MagicNumber:Context.kt$5</ID>
<ID>MagicNumber:Context.kt$500</ID>
<ID>MagicNumber:Context.kt$60</ID>
<ID>MagicNumber:Context.kt$7</ID>
<ID>MagicNumber:DBHelper.kt$DBHelper$420</ID>
<ID>MagicNumber:DBHelper.kt$DBHelper$540</ID>
<ID>MagicNumber:DismissAlarmReceiver.kt$DismissAlarmReceiver$5</ID>
<ID>MagicNumber:DismissAlarmReceiver.kt$DismissAlarmReceiver$7</ID>
<ID>MagicNumber:EditAlarmDialog.kt$EditAlarmDialog$3</ID>
<ID>MagicNumber:EditAlarmDialog.kt$EditAlarmDialog$4</ID>
<ID>MagicNumber:EditAlarmDialog.kt$EditAlarmDialog$5</ID>
<ID>MagicNumber:EditAlarmDialog.kt$EditAlarmDialog$6</ID>
<ID>MagicNumber:EditAlarmDialog.kt$EditAlarmDialog$60</ID>
<ID>MagicNumber:EditTimerDialog.kt$EditTimerDialog$10</ID>
<ID>MagicNumber:EditTimerDialog.kt$EditTimerDialog$60</ID>
<ID>MagicNumber:IntentHandlerActivity.kt$IntentHandlerActivity$11</ID>
<ID>MagicNumber:IntentHandlerActivity.kt$IntentHandlerActivity$12</ID>
<ID>MagicNumber:IntentHandlerActivity.kt$IntentHandlerActivity$23</ID>
<ID>MagicNumber:IntentHandlerActivity.kt$IntentHandlerActivity$59</ID>
<ID>MagicNumber:IntentHandlerActivity.kt$IntentHandlerActivity$60</ID>
<ID>MagicNumber:Long.kt$100</ID>
<ID>MagicNumber:Long.kt$1000</ID>
<ID>MagicNumber:Long.kt$1000F</ID>
<ID>MagicNumber:MainActivity.kt$MainActivity$3</ID>
<ID>MagicNumber:MyTimePickerDialogDialog.kt$MyTimePickerDialogDialog$3600</ID>
<ID>MagicNumber:MyTimePickerDialogDialog.kt$MyTimePickerDialogDialog$60</ID>
<ID>MagicNumber:ReminderActivity.kt$ReminderActivity$0.1f</ID>
<ID>MagicNumber:ReminderActivity.kt$ReminderActivity$0.2f</ID>
<ID>MagicNumber:ReminderActivity.kt$ReminderActivity$1000L</ID>
<ID>MagicNumber:ReminderActivity.kt$ReminderActivity$2000L</ID>
<ID>MagicNumber:ReminderActivity.kt$ReminderActivity$500</ID>
<ID>MagicNumber:ReminderActivity.kt$ReminderActivity$50f</ID>
<ID>MagicNumber:ReminderActivity.kt$ReminderActivity$7</ID>
<ID>MagicNumber:Stopwatch.kt$Stopwatch.&lt;no name provided&gt;$10</ID>
<ID>MagicNumber:StopwatchService.kt$StopwatchService.&lt;no name provided&gt;$500L</ID>
<ID>MagicNumber:TimeZonesAdapter.kt$TimeZonesAdapter$1000</ID>
<ID>MagicNumber:TimerAdapter.kt$TimerAdapter$0.7f</ID>
<ID>MagicNumber:TimerFragment.kt$TimerFragment$1000</ID>
<ID>MagicNumber:ViewPagerAdapter.kt$ViewPagerAdapter$3</ID>
<ID>MagicNumber:WidgetAnalogueConfigureActivity.kt$WidgetAnalogueConfigureActivity$100</ID>
<ID>MagicNumber:WidgetDigitalConfigureActivity.kt$WidgetDigitalConfigureActivity$100</ID>
<ID>MaxLineLength:AlarmReceiver.kt$AlarmReceiver$NotificationChannel(ALARM_NOTIFICATION_CHANNEL_ID, "Alarm", NotificationManager.IMPORTANCE_HIGH)</ID>
<ID>MaxLineLength:AlarmReceiver.kt$AlarmReceiver$oldNotificationChannelCleanup(notificationManager)</ID>
<ID>MaxLineLength:AlarmReceiver.kt$AlarmReceiver$val</ID>
<ID>MaxLineLength:ClockFragment.kt$ClockFragment$binding.clockTime.textSize = resources.getDimension(R.dimen.clock_text_size_smaller) / resources.displayMetrics.density</ID>
<ID>MaxLineLength:ClockFragment.kt$ClockFragment$val timeZones = requireContext().getAllTimeZonesModified().filter { selectedTimeZoneIDs.contains(it.id) } as ArrayList&lt;MyTimeZone&gt;</ID>
<ID>MaxLineLength:Config.kt$Config$set(increaseVolumeGradually) = prefs.edit().putBoolean(INCREASE_VOLUME_GRADUALLY, increaseVolumeGradually).apply()</ID>
<ID>MaxLineLength:Context.kt$.</ID>
<ID>MaxLineLength:Context.kt$AlarmManagerCompat.setExactAndAllowWhileIdle(alarmManager, 0, dismissalTriggerTime, getEarlyAlarmDismissalIntent(alarm))</ID>
<ID>MaxLineLength:Context.kt$PendingIntent.getActivity(this, alarm.id, intent, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE)</ID>
<ID>MaxLineLength:Context.kt$PendingIntent.getService(this, alarm.id, intent, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE)</ID>
<ID>MaxLineLength:Context.kt$fun Context.getModifiedTimeZoneTitle(id: Int)</ID>
<ID>MaxLineLength:Context.kt$return PendingIntent.getActivity(this, OPEN_ALARMS_TAB_INTENT_ID, intent, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE)</ID>
<ID>MaxLineLength:Context.kt$return PendingIntent.getActivity(this, OPEN_STOPWATCH_TAB_INTENT_ID, intent, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE)</ID>
<ID>MaxLineLength:Context.kt$return PendingIntent.getActivity(this, REMINDER_ACTIVITY_INTENT_ID, intent, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE)</ID>
<ID>MaxLineLength:Context.kt$return PendingIntent.getActivity(this, timerId, intent, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE)</ID>
<ID>MaxLineLength:Context.kt$return PendingIntent.getBroadcast(this, EARLY_ALARM_DISMISSAL_INTENT_ID, intent, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE)</ID>
<ID>MaxLineLength:Context.kt$return PendingIntent.getBroadcast(this, alarm.id, intent, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE)</ID>
<ID>MaxLineLength:Context.kt$return PendingIntent.getBroadcast(this, alarmId, intent, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE)</ID>
<ID>MaxLineLength:Context.kt$return PendingIntent.getBroadcast(this, timerId, intent, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE)</ID>
<ID>MaxLineLength:Context.kt$val dayBits = arrayListOf(MONDAY_BIT, TUESDAY_BIT, WEDNESDAY_BIT, THURSDAY_BIT, FRIDAY_BIT, SATURDAY_BIT, SUNDAY_BIT)</ID>
<ID>MaxLineLength:Context.kt$val fullString = String.format(getString(org.fossify.commons.R.string.time_remaining), formatMinutesToTimeString(totalMinutes))</ID>
<ID>MaxLineLength:DBHelper.kt$DBHelper$"$COL_IS_ENABLED INTEGER, $COL_VIBRATE INTEGER, $COL_SOUND_TITLE TEXT, $COL_SOUND_URI TEXT, $COL_LABEL TEXT, $COL_ONE_SHOT INTEGER)"</ID>
<ID>MaxLineLength:DBHelper.kt$DBHelper$"CREATE TABLE IF NOT EXISTS $ALARMS_TABLE_NAME ($COL_ID INTEGER PRIMARY KEY AUTOINCREMENT, $COL_TIME_IN_MINUTES INTEGER, $COL_DAYS INTEGER, "</ID>
<ID>MaxLineLength:DBHelper.kt$DBHelper$val alarm = Alarm(id, timeInMinutes, days, isEnabled, vibrate, soundTitle, soundUri, label, oneShot)</ID>
<ID>MaxLineLength:DBHelper.kt$DBHelper$val cols = arrayOf(COL_ID, COL_TIME_IN_MINUTES, COL_DAYS, COL_IS_ENABLED, COL_VIBRATE, COL_SOUND_TITLE, COL_SOUND_URI, COL_LABEL, COL_ONE_SHOT)</ID>
<ID>MaxLineLength:EditAlarmDialog.kt$EditAlarmDialog$SelectAlarmSoundDialog</ID>
<ID>MaxLineLength:EditAlarmDialog.kt$EditAlarmDialog$class</ID>
<ID>MaxLineLength:EditAlarmDialog.kt$EditAlarmDialog$val dayLetters = activity.resources.getStringArray(org.fossify.commons.R.array.week_day_letters).toList() as ArrayList&lt;String&gt;</ID>
<ID>MaxLineLength:EditTimeZoneDialog.kt$EditTimeZoneDialog$.</ID>
<ID>MaxLineLength:IntentHandlerActivity.kt$IntentHandlerActivity$&amp;&amp;</ID>
<ID>MaxLineLength:IntentHandlerActivity.kt$IntentHandlerActivity$alarms = alarms.filter { it.timeInMinutes / 60 == hour || it.timeInMinutes / 60 == hour + 12 }</ID>
<ID>MaxLineLength:IntentHandlerActivity.kt$IntentHandlerActivity$it.timeInMinutes == timeInMinutes &amp;&amp; (it.days.isBitSet(dayBitToLookFor) || it.days == dayToLookFor)</ID>
<ID>MaxLineLength:Long.kt$val seconds = TimeUnit.MILLISECONDS.toSeconds(this) - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(this))</ID>
<ID>MaxLineLength:MainActivity.kt$MainActivity$(drawable as LayerDrawable).findDrawableByLayerId(R.id.shortcut_stopwatch_background).applyColorFilter(appIconColor)</ID>
<ID>MaxLineLength:MainActivity.kt$MainActivity$binding.mainTabsHolder.getTabAt(binding.viewPager.currentItem)?.icon?.applyColorFilter(getProperPrimaryColor())</ID>
<ID>MaxLineLength:MainActivity.kt$MainActivity$binding.mainTabsHolder.newTab().setCustomView(org.fossify.commons.R.layout.bottom_tablayout_item)</ID>
<ID>MaxLineLength:MainActivity.kt$MainActivity$faqItems.add(FAQItem(org.fossify.commons.R.string.faq_2_title_commons, org.fossify.commons.R.string.faq_2_text_commons))</ID>
<ID>MaxLineLength:MainActivity.kt$MainActivity$faqItems.add(FAQItem(org.fossify.commons.R.string.faq_6_title_commons, org.fossify.commons.R.string.faq_6_text_commons))</ID>
<ID>MaxLineLength:MainActivity.kt$MainActivity$findItem(R.id.more_apps_from_us).isVisible = !resources.getBoolean(org.fossify.commons.R.bool.hide_google_relations)</ID>
<ID>MaxLineLength:MainActivity.kt$MainActivity$updateMaterialActivityViews(binding.mainCoordinator, binding.mainHolder, useTransparentNavigation = false, useTopSearchMenu = false)</ID>
<ID>MaxLineLength:MyAnalogueTimeWidgetProvider.kt$MyAnalogueTimeWidgetProvider$override</ID>
<ID>MaxLineLength:MyAnalogueTimeWidgetProvider.kt$MyAnalogueTimeWidgetProvider$val pendingIntent = PendingIntent.getActivity(context, OPEN_APP_INTENT_ID, this, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE)</ID>
<ID>MaxLineLength:MyDigitalTimeWidgetProvider.kt$MyDigitalTimeWidgetProvider$override</ID>
<ID>MaxLineLength:MyDigitalTimeWidgetProvider.kt$MyDigitalTimeWidgetProvider$val pendingIntent = PendingIntent.getActivity(context, OPEN_APP_INTENT_ID, this, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE)</ID>
<ID>MaxLineLength:MyTimePickerDialogDialog.kt$MyTimePickerDialogDialog$class</ID>
<ID>MaxLineLength:ReminderActivity.kt$ReminderActivity$arrayOf(binding.reminderSnooze, binding.reminderDraggableBackground, binding.reminderDraggable, binding.reminderDismiss)</ID>
<ID>MaxLineLength:ReminderActivity.kt$ReminderActivity$binding.reminderStop.background = resources.getColoredDrawableWithColor(R.drawable.circle_background_filled, getProperPrimaryColor())</ID>
<ID>MaxLineLength:ReminderActivity.kt$ReminderActivity$binding.reminderText.text = if (isAlarmReminder) getFormattedTime(getPassedSeconds(), false, false) else getString(R.string.time_expired)</ID>
<ID>MaxLineLength:ReminderActivity.kt$ReminderActivity$scheduleVolumeIncrease(MIN_ALARM_VOLUME_FOR_INCREASING_ALARMS.toFloat(), initialAlarmVolume!!.toFloat(), 0)</ID>
<ID>MaxLineLength:SelectAlarmDialog.kt$SelectAlarmDialog$binding.dialogSelectAlarmRadio.addView(radioButton, RadioGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT))</ID>
<ID>MaxLineLength:SelectAlarmDialog.kt$SelectAlarmDialog$setColors(activity.getProperTextColor(), activity.getProperPrimaryColor(), activity.getProperBackgroundColor())</ID>
<ID>MaxLineLength:SelectTimeZonesAdapter.kt$SelectTimeZonesAdapter$class</ID>
<ID>MaxLineLength:SettingsActivity.kt$SettingsActivity$binding.settingsUseEnglishHolder.beVisibleIf((config.wasUseEnglishToggled || Locale.getDefault().language != "en") &amp;&amp; !isTiramisuPlus())</ID>
<ID>MaxLineLength:SettingsActivity.kt$SettingsActivity$updateMaterialActivityViews(binding.settingsCoordinator, binding.settingsHolder, useTransparentNavigation = true, useTopSearchMenu = false)</ID>
<ID>MaxLineLength:StopwatchAdapter.kt$StopwatchAdapter$class</ID>
<ID>MaxLineLength:StopwatchFragment.kt$StopwatchFragment$if (state == Stopwatch.State.RUNNING) org.fossify.commons.R.drawable.ic_pause_vector else org.fossify.commons.R.drawable.ic_play_vector</ID>
<ID>MaxLineLength:StopwatchFragment.kt$StopwatchFragment$stopwatchPlayPause.background = resources.getColoredDrawableWithColor(R.drawable.circle_background_filled, properPrimaryColor)</ID>
<ID>MaxLineLength:StopwatchFragment.kt$StopwatchFragment$var bitmap = requireContext().resources.getColoredBitmap(R.drawable.ic_sorting_triangle_vector, requireContext().getProperPrimaryColor())</ID>
<ID>MaxLineLength:TimeZonesAdapter.kt$TimeZonesAdapter$class</ID>
<ID>MaxLineLength:TimerAdapter.kt$TimerAdapter$is TimerState.Finished -&gt; EventBus.getDefault().post(TimerEvent.Start(timer.id!!, timer.seconds.secondsToMillis))</ID>
<ID>MaxLineLength:TimerAdapter.kt$TimerAdapter$is TimerState.Idle -&gt; EventBus.getDefault().post(TimerEvent.Start(timer.id!!, timer.seconds.secondsToMillis))</ID>
<ID>MaxLineLength:TimerAdapter.kt$TimerAdapter$is TimerState.Running -&gt; EventBus.getDefault().post(TimerEvent.Pause(timer.id!!, state.tick))</ID>
<ID>MaxLineLength:TimerAdapter.kt$TimerAdapter$val resetPossible = state is TimerState.Running || state is TimerState.Paused || state is TimerState.Finished</ID>
<ID>MaxLineLength:TimerFragment.kt$TimerFragment$if</ID>
<ID>MaxLineLength:TimerFragment.kt$TimerFragment$timerAdapter = TimerAdapter(requireActivity() as SimpleActivity, binding.timersList, ::refreshTimers, ::openEditTimer)</ID>
<ID>MaxLineLength:TimerService.kt$TimerService$else -&gt; resources.getQuantityString(R.plurals.timer_notification_msg, runningTimers.size, runningTimers.size)</ID>
<ID>MaxLineLength:TimerService.kt$TimerService$firstTimer.label.isNotEmpty() -&gt; getString(R.string.timer_single_notification_label_msg, firstTimer.label)</ID>
<ID>MaxLineLength:TimerService.kt$TimerService$startForeground(TIMER_RUNNING_NOTIF_ID, notification(formattedDuration, contextText, firstTimer.id!!))</ID>
<ID>MaxLineLength:TimerService.kt$TimerService$startForeground(TIMER_RUNNING_NOTIF_ID, notification(getString(R.string.app_name), getString(R.string.timers_notification_msg), INVALID_TIMER_ID))</ID>
<ID>MaxLineLength:WidgetAnalogueConfigureActivity.kt$WidgetAnalogueConfigureActivity$if</ID>
<ID>MaxLineLength:WidgetDigitalConfigureActivity.kt$WidgetDigitalConfigureActivity$if</ID>
<ID>NestedBlockDepth:AlarmReceiver.kt$AlarmReceiver$override fun onReceive(context: Context, intent: Intent)</ID>
<ID>NestedBlockDepth:Context.kt$fun Context.scheduleNextAlarm(alarm: Alarm, showToast: Boolean)</ID>
<ID>NestedBlockDepth:DBHelper.kt$DBHelper$fun getAlarms(): ArrayList&lt;Alarm&gt;</ID>
<ID>NestedBlockDepth:IntentHandlerActivity.kt$IntentHandlerActivity$private fun Intent.dismissAlarm()</ID>
<ID>NestedBlockDepth:IntentHandlerActivity.kt$IntentHandlerActivity$private fun Intent.setNewAlarm()</ID>
<ID>ReturnCount:Context.kt$fun Context.firstDayOrder(bitMask: Int): Int</ID>
<ID>SwallowedException:Config.kt$Config$e: Exception</ID>
<ID>SwallowedException:Context.kt$e: Exception</ID>
<ID>SwallowedException:Converters.kt$Converters$e: Exception</ID>
<ID>SwallowedException:DBHelper.kt$DBHelper$e: Exception</ID>
<ID>SwallowedException:IntentHandlerActivity.kt$IntentHandlerActivity$e: Exception</ID>
<ID>SwallowedException:ReminderActivity.kt$ReminderActivity$e: Exception</ID>
<ID>TooGenericExceptionCaught:AlarmReceiver.kt$AlarmReceiver$e: Exception</ID>
<ID>TooGenericExceptionCaught:App.kt$App$e: Exception</ID>
<ID>TooGenericExceptionCaught:Config.kt$Config$e: Exception</ID>
<ID>TooGenericExceptionCaught:Context.kt$e: Exception</ID>
<ID>TooGenericExceptionCaught:Converters.kt$Converters$e: Exception</ID>
<ID>TooGenericExceptionCaught:DBHelper.kt$DBHelper$e: Exception</ID>
<ID>TooGenericExceptionCaught:IntentHandlerActivity.kt$IntentHandlerActivity$e: Exception</ID>
<ID>TooGenericExceptionCaught:ReminderActivity.kt$ReminderActivity$e: Exception</ID>
<ID>TooGenericExceptionCaught:StopwatchService.kt$e: Exception</ID>
<ID>TooGenericExceptionCaught:TimerService.kt$TimerService$e: Exception</ID>
<ID>TooGenericExceptionCaught:TimerService.kt$e: Exception</ID>
<ID>TooGenericExceptionThrown:ViewPagerAdapter.kt$ViewPagerAdapter$throw RuntimeException("Trying to fetch unknown fragment id $position")</ID>
<ID>TooManyFunctions:AlarmFragment.kt$AlarmFragment : FragmentToggleAlarmInterface</ID>
<ID>TooManyFunctions:AlarmsAdapter.kt$AlarmsAdapter : MyRecyclerViewAdapter</ID>
<ID>TooManyFunctions:Constants.kt$org.fossify.clock.helpers.Constants.kt</ID>
<ID>TooManyFunctions:Context.kt$org.fossify.clock.extensions.Context.kt</ID>
<ID>TooManyFunctions:DBHelper.kt$DBHelper : SQLiteOpenHelper</ID>
<ID>TooManyFunctions:IntentHandlerActivity.kt$IntentHandlerActivity : SimpleActivity</ID>
<ID>TooManyFunctions:MainActivity.kt$MainActivity : SimpleActivity</ID>
<ID>TooManyFunctions:ReminderActivity.kt$ReminderActivity : SimpleActivity</ID>
<ID>TooManyFunctions:SettingsActivity.kt$SettingsActivity : SimpleActivity</ID>
<ID>TooManyFunctions:StopwatchAdapter.kt$StopwatchAdapter : MyRecyclerViewAdapter</ID>
<ID>TooManyFunctions:StopwatchFragment.kt$StopwatchFragment : Fragment</ID>
<ID>TooManyFunctions:TimeZonesAdapter.kt$TimeZonesAdapter : MyRecyclerViewAdapter</ID>
<ID>TooManyFunctions:TimerAdapter.kt$TimerAdapter : MyRecyclerViewListAdapter</ID>
<ID>TooManyFunctions:ViewPagerAdapter.kt$ViewPagerAdapter : FragmentStatePagerAdapter</ID>
<ID>UnusedParameter:AlarmFragment.kt$AlarmFragment$event: AlarmEvent.Refresh</ID>
<ID>UnusedParameter:MyDigitalTimeWidgetProvider.kt$MyDigitalTimeWidgetProvider$context: Context</ID>
<ID>UnusedParameter:StopwatchService.kt$StopwatchService$event: StopwatchStopService</ID>
<ID>UnusedParameter:TimerFragment.kt$TimerFragment$event: TimerEvent.Refresh</ID>
<ID>UnusedParameter:TimerService.kt$TimerService$event: TimerEvent.Refresh</ID>
<ID>UnusedParameter:TimerService.kt$TimerService$event: TimerStopService</ID>
<ID>UnusedPrivateMember:App.kt$App$@OnLifecycleEvent(Lifecycle.Event.ON_START) private fun onAppForegrounded()</ID>
<ID>UnusedPrivateMember:App.kt$App$@OnLifecycleEvent(Lifecycle.Event.ON_STOP) private fun onAppBackgrounded()</ID>
<ID>VariableNaming:ClockFragment.kt$ClockFragment$private val ONE_SECOND = 1000L</ID>
<ID>VariableNaming:DBHelper.kt$DBHelper$private val ALARMS_TABLE_NAME = "contacts" // wrong table name, ignore it</ID>
<ID>VariableNaming:DBHelper.kt$DBHelper$private val COL_DAYS = "days"</ID>
<ID>VariableNaming:DBHelper.kt$DBHelper$private val COL_ID = "id"</ID>
<ID>VariableNaming:DBHelper.kt$DBHelper$private val COL_IS_ENABLED = "is_enabled"</ID>
<ID>VariableNaming:DBHelper.kt$DBHelper$private val COL_LABEL = "label"</ID>
<ID>VariableNaming:DBHelper.kt$DBHelper$private val COL_ONE_SHOT = "one_shot"</ID>
<ID>VariableNaming:DBHelper.kt$DBHelper$private val COL_SOUND_TITLE = "sound_title"</ID>
<ID>VariableNaming:DBHelper.kt$DBHelper$private val COL_SOUND_URI = "sound_uri"</ID>
<ID>VariableNaming:DBHelper.kt$DBHelper$private val COL_TIME_IN_MINUTES = "time_in_minutes"</ID>
<ID>VariableNaming:DBHelper.kt$DBHelper$private val COL_VIBRATE = "vibrate"</ID>
<ID>VariableNaming:Long.kt$val MSFormat = if (useLongerMSFormat) "%03d" else "%01d"</ID>
<ID>VariableNaming:TimerFragment.kt$TimerFragment$private val INVALID_POSITION = -1</ID>
<ID>WildcardImport:AlarmFragment.kt$import org.fossify.clock.extensions.*</ID>
<ID>WildcardImport:AlarmFragment.kt$import org.fossify.clock.helpers.*</ID>
<ID>WildcardImport:AlarmReceiver.kt$import org.fossify.clock.extensions.*</ID>
<ID>WildcardImport:AlarmsAdapter.kt$import org.fossify.clock.extensions.*</ID>
<ID>WildcardImport:App.kt$import org.fossify.clock.extensions.*</ID>
<ID>WildcardImport:ClockFragment.kt$import org.fossify.clock.extensions.*</ID>
<ID>WildcardImport:Constants.kt$import org.fossify.commons.helpers.*</ID>
<ID>WildcardImport:Context.kt$import android.app.*</ID>
<ID>WildcardImport:Context.kt$import org.fossify.clock.helpers.*</ID>
<ID>WildcardImport:Context.kt$import org.fossify.clock.receivers.*</ID>
<ID>WildcardImport:Context.kt$import org.fossify.commons.extensions.*</ID>
<ID>WildcardImport:Context.kt$import org.fossify.commons.helpers.*</ID>
<ID>WildcardImport:DBHelper.kt$import org.fossify.commons.helpers.*</ID>
<ID>WildcardImport:DismissAlarmReceiver.kt$import org.fossify.clock.extensions.*</ID>
<ID>WildcardImport:EditAlarmDialog.kt$import org.fossify.clock.extensions.*</ID>
<ID>WildcardImport:EditAlarmDialog.kt$import org.fossify.commons.extensions.*</ID>
<ID>WildcardImport:EditTimerDialog.kt$import org.fossify.clock.extensions.*</ID>
<ID>WildcardImport:EditTimerDialog.kt$import org.fossify.commons.extensions.*</ID>
<ID>WildcardImport:IntentHandlerActivity.kt$import org.fossify.clock.extensions.*</ID>
<ID>WildcardImport:IntentHandlerActivity.kt$import org.fossify.clock.helpers.*</ID>
<ID>WildcardImport:IntentHandlerActivity.kt$import org.fossify.clock.models.*</ID>
<ID>WildcardImport:MainActivity.kt$import org.fossify.clock.helpers.*</ID>
<ID>WildcardImport:MainActivity.kt$import org.fossify.commons.extensions.*</ID>
<ID>WildcardImport:MainActivity.kt$import org.fossify.commons.helpers.*</ID>
<ID>WildcardImport:MyDigitalTimeWidgetProvider.kt$import android.graphics.*</ID>
<ID>WildcardImport:ReminderActivity.kt$import android.os.*</ID>
<ID>WildcardImport:ReminderActivity.kt$import org.fossify.clock.extensions.*</ID>
<ID>WildcardImport:ReminderActivity.kt$import org.fossify.commons.extensions.*</ID>
<ID>WildcardImport:SelectAlarmDialog.kt$import org.fossify.commons.extensions.*</ID>
<ID>WildcardImport:SettingsActivity.kt$import org.fossify.commons.extensions.*</ID>
<ID>WildcardImport:SplashActivity.kt$import org.fossify.clock.helpers.*</ID>
<ID>WildcardImport:StopwatchFragment.kt$import org.fossify.commons.extensions.*</ID>
<ID>WildcardImport:TimerAdapter.kt$import org.fossify.commons.extensions.*</ID>
<ID>WildcardImport:TimerDao.kt$import androidx.room.*</ID>
<ID>WildcardImport:ViewPagerAdapter.kt$import org.fossify.clock.helpers.*</ID>
<ID>WildcardImport:WidgetAnalogueConfigureActivity.kt$import org.fossify.commons.extensions.*</ID>
<ID>WildcardImport:WidgetDigitalConfigureActivity.kt$import org.fossify.commons.extensions.*</ID>
</CurrentIssues>
</SmellBaseline>

1811
app/lint-baseline.xml Normal file
View File

File diff suppressed because it is too large Load Diff

View File

@@ -13,10 +13,7 @@ import org.fossify.clock.BuildConfig
import org.fossify.clock.R
import org.fossify.clock.adapters.ViewPagerAdapter
import org.fossify.clock.databinding.ActivityMainBinding
import org.fossify.clock.extensions.config
import org.fossify.clock.extensions.getEnabledAlarms
import org.fossify.clock.extensions.rescheduleEnabledAlarms
import org.fossify.clock.extensions.updateWidgets
import org.fossify.clock.extensions.*
import org.fossify.clock.helpers.*
import org.fossify.commons.databinding.BottomTablayoutItemBinding
import org.fossify.commons.extensions.*
@@ -142,7 +139,7 @@ class MainActivity : SimpleActivity() {
private fun refreshMenuItems() {
binding.mainToolbar.menu.apply {
findItem(R.id.sort).isVisible = binding.viewPager.currentItem == TAB_ALARM
findItem(R.id.sort).isVisible = binding.viewPager.currentItem == getTabIndex(TAB_ALARM)
findItem(R.id.more_apps_from_us).isVisible = !resources.getBoolean(org.fossify.commons.R.bool.hide_google_relations)
}
}
@@ -150,7 +147,7 @@ class MainActivity : SimpleActivity() {
override fun onNewIntent(intent: Intent) {
if (intent.extras?.containsKey(OPEN_TAB) == true) {
val tabToOpen = intent.getIntExtra(OPEN_TAB, TAB_CLOCK)
binding.viewPager.setCurrentItem(tabToOpen, false)
binding.viewPager.setCurrentItem(getTabIndex(tabToOpen), false)
if (tabToOpen == TAB_TIMER) {
val timerId = intent.getIntExtra(TIMER_ID, INVALID_TIMER_ID)
(binding.viewPager.adapter as ViewPagerAdapter).updateTimerPosition(timerId)
@@ -172,8 +169,10 @@ class MainActivity : SimpleActivity() {
override fun onActivityResult(requestCode: Int, resultCode: Int, resultData: Intent?) {
super.onActivityResult(requestCode, resultCode, resultData)
if (requestCode == PICK_AUDIO_FILE_INTENT_ID && resultCode == RESULT_OK && resultData != null) {
storeNewAlarmSound(resultData)
when {
requestCode == PICK_AUDIO_FILE_INTENT_ID && resultCode == RESULT_OK && resultData != null -> {
storeNewAlarmSound(resultData)
}
}
}
@@ -181,8 +180,8 @@ class MainActivity : SimpleActivity() {
val newAlarmSound = storeNewYourAlarmSound(resultData)
when (binding.viewPager.currentItem) {
TAB_ALARM -> getViewPagerAdapter()?.updateAlarmTabAlarmSound(newAlarmSound)
TAB_TIMER -> getViewPagerAdapter()?.updateTimerTabAlarmSound(newAlarmSound)
TAB_ALARM_INDEX -> getViewPagerAdapter()?.updateAlarmTabAlarmSound(newAlarmSound)
TAB_TIMER_INDEX -> getViewPagerAdapter()?.updateTimerTabAlarmSound(newAlarmSound)
}
}
@@ -200,7 +199,7 @@ class MainActivity : SimpleActivity() {
refreshMenuItems()
}
val tabToOpen = intent.getIntExtra(OPEN_TAB, config.lastUsedViewPagerPage)
val tabToOpen = intent.getIntExtra(OPEN_TAB, config.defaultTab)
intent.removeExtra(OPEN_TAB)
if (tabToOpen == TAB_TIMER) {
val timerId = intent.getIntExtra(TIMER_ID, INVALID_TIMER_ID)
@@ -212,7 +211,7 @@ class MainActivity : SimpleActivity() {
}
binding.viewPager.offscreenPageLimit = TABS_COUNT - 1
binding.viewPager.currentItem = tabToOpen
binding.viewPager.currentItem = getTabIndex(tabToOpen)
}
private fun setupTabs() {
@@ -308,4 +307,14 @@ class MainActivity : SimpleActivity() {
config.isSundayFirst = false
}
}
private fun getTabIndex(tabId: Int): Int {
return when (tabId) {
TAB_CLOCK -> TAB_CLOCK_INDEX
TAB_ALARM -> TAB_ALARM_INDEX
TAB_STOPWATCH -> TAB_STOPWATCH_INDEX
TAB_TIMER -> TAB_TIMER_INDEX
else -> config.lastUsedViewPagerPage
}
}
}

View File

@@ -1,30 +1,95 @@
package org.fossify.clock.activities
import android.content.ActivityNotFoundException
import android.content.Intent
import android.net.Uri
import android.os.Bundle
import android.widget.Toast
import androidx.activity.result.contract.ActivityResultContracts
import org.fossify.clock.R
import org.fossify.clock.databinding.ActivitySettingsBinding
import org.fossify.clock.dialogs.ExportDataDialog
import org.fossify.clock.extensions.config
import org.fossify.clock.extensions.dbHelper
import org.fossify.clock.extensions.timerDb
import org.fossify.clock.helpers.DBHelper
import org.fossify.clock.helpers.DEFAULT_MAX_ALARM_REMINDER_SECS
import org.fossify.clock.helpers.DEFAULT_MAX_TIMER_REMINDER_SECS
import org.fossify.clock.helpers.EXPORT_BACKUP_MIME_TYPE
import org.fossify.clock.helpers.ExportHelper
import org.fossify.clock.helpers.IMPORT_BACKUP_MIME_TYPES
import org.fossify.clock.helpers.ImportHelper
import org.fossify.clock.helpers.TAB_ALARM
import org.fossify.clock.helpers.TAB_CLOCK
import org.fossify.clock.helpers.TAB_STOPWATCH
import org.fossify.clock.helpers.TAB_TIMER
import org.fossify.clock.helpers.TimerHelper
import org.fossify.clock.models.AlarmTimerBackup
import org.fossify.commons.dialogs.RadioGroupDialog
import org.fossify.commons.extensions.*
import org.fossify.commons.extensions.beGone
import org.fossify.commons.extensions.beGoneIf
import org.fossify.commons.extensions.beVisible
import org.fossify.commons.extensions.beVisibleIf
import org.fossify.commons.extensions.formatMinutesToTimeString
import org.fossify.commons.extensions.formatSecondsToTimeString
import org.fossify.commons.extensions.getCustomizeColorsString
import org.fossify.commons.extensions.getProperPrimaryColor
import org.fossify.commons.extensions.isOrWasThankYouInstalled
import org.fossify.commons.extensions.launchPurchaseThankYouIntent
import org.fossify.commons.extensions.showErrorToast
import org.fossify.commons.extensions.showPickSecondsDialog
import org.fossify.commons.extensions.toast
import org.fossify.commons.extensions.updateTextColors
import org.fossify.commons.extensions.viewBinding
import org.fossify.commons.helpers.ExportResult
import org.fossify.commons.helpers.IS_CUSTOMIZING_COLORS
import org.fossify.commons.helpers.MINUTE_SECONDS
import org.fossify.commons.helpers.NavigationIcon
import org.fossify.commons.helpers.TAB_LAST_USED
import org.fossify.commons.helpers.ensureBackgroundThread
import org.fossify.commons.helpers.isTiramisuPlus
import org.fossify.commons.models.RadioItem
import java.io.IOException
import java.util.Locale
import kotlin.system.exitProcess
class SettingsActivity : SimpleActivity() {
private val binding: ActivitySettingsBinding by viewBinding(ActivitySettingsBinding::inflate)
private val exportActivityResultLauncher =
registerForActivityResult(ActivityResultContracts.CreateDocument(EXPORT_BACKUP_MIME_TYPE)) { uri ->
if (uri == null) return@registerForActivityResult
ensureBackgroundThread {
try {
exportDataTo(uri)
} catch (e: IOException) {
showErrorToast(e)
}
}
}
private val importActivityResultLauncher =
registerForActivityResult(ActivityResultContracts.OpenDocument()) { uri ->
if (uri == null) return@registerForActivityResult
ensureBackgroundThread {
try {
importData(uri)
} catch (e: Exception) {
showErrorToast(e)
}
}
}
override fun onCreate(savedInstanceState: Bundle?) {
isMaterialActivity = true
super.onCreate(savedInstanceState)
setContentView(binding.root)
updateMaterialActivityViews(binding.settingsCoordinator, binding.settingsHolder, useTransparentNavigation = true, useTopSearchMenu = false)
updateMaterialActivityViews(
mainCoordinatorLayout = binding.settingsCoordinator,
nestedView = binding.settingsHolder,
useTransparentNavigation = true,
useTopSearchMenu = false
)
setupMaterialScrollListener(binding.settingsNestedScrollview, binding.settingsToolbar)
}
@@ -36,6 +101,7 @@ class SettingsActivity : SimpleActivity() {
setupCustomizeColors()
setupUseEnglish()
setupLanguage()
setupDefaultTab()
setupPreventPhoneFromSleeping()
setupStartWeekOn()
setupAlarmMaxReminder()
@@ -44,6 +110,8 @@ class SettingsActivity : SimpleActivity() {
setupTimerMaxReminder()
setupIncreaseVolumeGradually()
setupCustomizeWidgetColors()
setupExportData()
setupImportData()
updateTextColors(binding.settingsHolder)
arrayOf(
@@ -82,12 +150,44 @@ class SettingsActivity : SimpleActivity() {
private fun setupLanguage() {
binding.settingsLanguage.text = Locale.getDefault().displayLanguage
binding.settingsLanguageHolder.beVisibleIf(isTiramisuPlus())
binding.settingsLanguageHolder.setOnClickListener {
launchChangeAppLanguageIntent()
if (isTiramisuPlus()) {
binding.settingsLanguageHolder.beVisible()
binding.settingsLanguageHolder.setOnClickListener {
launchChangeAppLanguageIntent()
}
} else {
binding.settingsLanguageHolder.beGone()
}
}
private fun setupDefaultTab() {
binding.settingsDefaultTab.text = getDefaultTabText()
binding.settingsDefaultTabHolder.setOnClickListener {
val items = arrayListOf(
RadioItem(TAB_CLOCK, getString(R.string.clock)),
RadioItem(TAB_ALARM, getString(org.fossify.commons.R.string.alarm)),
RadioItem(TAB_STOPWATCH, getString(R.string.stopwatch)),
RadioItem(TAB_TIMER, getString(R.string.timer)),
RadioItem(TAB_LAST_USED, getString(org.fossify.commons.R.string.last_used_tab))
)
RadioGroupDialog(this@SettingsActivity, items, config.defaultTab) {
config.defaultTab = it as Int
binding.settingsDefaultTab.text = getDefaultTabText()
}
}
}
private fun getDefaultTabText() = getString(
when (config.defaultTab) {
TAB_CLOCK -> R.string.clock
TAB_ALARM -> org.fossify.commons.R.string.alarm
TAB_STOPWATCH -> R.string.stopwatch
TAB_TIMER -> R.string.timer
else -> org.fossify.commons.R.string.last_used_tab
}
)
private fun setupPreventPhoneFromSleeping() {
binding.settingsPreventPhoneFromSleeping.isChecked = config.preventPhoneFromSleeping
binding.settingsPreventPhoneFromSleepingHolder.setOnClickListener {
@@ -170,11 +270,13 @@ class SettingsActivity : SimpleActivity() {
}
private fun updateAlarmMaxReminderText() {
binding.settingsAlarmMaxReminder.text = formatSecondsToTimeString(config.alarmMaxReminderSecs)
binding.settingsAlarmMaxReminder.text =
formatSecondsToTimeString(config.alarmMaxReminderSecs)
}
private fun updateTimerMaxReminderText() {
binding.settingsTimerMaxReminder.text = formatSecondsToTimeString(config.timerMaxReminderSecs)
binding.settingsTimerMaxReminder.text =
formatSecondsToTimeString(config.timerMaxReminderSecs)
}
private fun setupCustomizeWidgetColors() {
@@ -185,4 +287,77 @@ class SettingsActivity : SimpleActivity() {
}
}
}
private fun setupExportData() {
binding.settingsExportDataHolder.setOnClickListener {
tryExportData()
}
}
private fun setupImportData() {
binding.settingsImportDataHolder.setOnClickListener {
tryImportData()
}
}
private fun exportDataTo(outputUri: Uri) {
val alarms = dbHelper.getAlarms()
val timers = timerDb.getTimers()
if (alarms.isEmpty() && timers.isEmpty()) {
toast(org.fossify.commons.R.string.no_entries_for_exporting)
} else {
ExportHelper(this).exportData(
backup = AlarmTimerBackup(alarms, timers),
outputUri = outputUri,
) {
toast(
when (it) {
ExportResult.EXPORT_OK -> org.fossify.commons.R.string.exporting_successful
else -> org.fossify.commons.R.string.exporting_failed
}
)
}
}
}
private fun tryExportData() {
ExportDataDialog(this, config.lastDataExportPath) { file ->
try {
exportActivityResultLauncher.launch(file.name)
} catch (e: ActivityNotFoundException) {
toast(
id = org.fossify.commons.R.string.system_service_disabled,
length = Toast.LENGTH_LONG
)
} catch (e: Exception) {
showErrorToast(e)
}
}
}
private fun tryImportData() {
try {
importActivityResultLauncher.launch(IMPORT_BACKUP_MIME_TYPES.toTypedArray())
} catch (e: ActivityNotFoundException) {
toast(org.fossify.commons.R.string.system_service_disabled, Toast.LENGTH_LONG)
} catch (e: Exception) {
showErrorToast(e)
}
}
private fun importData(uri: Uri) {
val result = ImportHelper(
context = this,
dbHelper = DBHelper.dbInstance!!,
timerHelper = TimerHelper(this)
).importData(uri)
toast(
when (result) {
ImportHelper.ImportResult.IMPORT_OK -> org.fossify.commons.R.string.importing_successful
ImportHelper.ImportResult.IMPORT_INCOMPLETE -> org.fossify.commons.R.string.no_new_entries_for_importing
ImportHelper.ImportResult.IMPORT_FAIL -> org.fossify.commons.R.string.no_items_found
}
)
}
}

View File

@@ -34,34 +34,34 @@ class ViewPagerAdapter(fm: FragmentManager) : FragmentStatePagerAdapter(fm) {
override fun getCount() = TABS_COUNT
private fun getFragment(position: Int) = when (position) {
0 -> ClockFragment()
1 -> AlarmFragment()
2 -> StopwatchFragment()
3 -> TimerFragment()
TAB_CLOCK_INDEX -> ClockFragment()
TAB_ALARM_INDEX -> AlarmFragment()
TAB_STOPWATCH_INDEX -> StopwatchFragment()
TAB_TIMER_INDEX -> TimerFragment()
else -> throw RuntimeException("Trying to fetch unknown fragment id $position")
}
fun showAlarmSortDialog() {
(fragments[TAB_ALARM] as? AlarmFragment)?.showSortingDialog()
(fragments[TAB_ALARM_INDEX] as? AlarmFragment)?.showSortingDialog()
}
fun updateClockTabAlarm() {
(fragments[TAB_CLOCK] as? ClockFragment)?.updateAlarm()
(fragments[TAB_CLOCK_INDEX] as? ClockFragment)?.updateAlarm()
}
fun updateAlarmTabAlarmSound(alarmSound: AlarmSound) {
(fragments[TAB_ALARM] as? AlarmFragment)?.updateAlarmSound(alarmSound)
(fragments[TAB_ALARM_INDEX] as? AlarmFragment)?.updateAlarmSound(alarmSound)
}
fun updateTimerTabAlarmSound(alarmSound: AlarmSound) {
(fragments[TAB_TIMER] as? TimerFragment)?.updateAlarmSound(alarmSound)
(fragments[TAB_TIMER_INDEX] as? TimerFragment)?.updateAlarmSound(alarmSound)
}
fun updateTimerPosition(timerId: Int) {
(fragments[TAB_TIMER] as? TimerFragment)?.updatePosition(timerId)
(fragments[TAB_TIMER_INDEX] as? TimerFragment)?.updatePosition(timerId)
}
fun startStopWatch() {
(fragments[TAB_STOPWATCH] as? StopwatchFragment)?.startStopWatch()
(fragments[TAB_STOPWATCH_INDEX] as? StopwatchFragment)?.startStopWatch()
}
}

View File

@@ -0,0 +1,76 @@
package org.fossify.clock.dialogs
import android.annotation.SuppressLint
import androidx.appcompat.app.AlertDialog
import org.fossify.clock.R
import org.fossify.clock.databinding.DialogExportDataBinding
import org.fossify.clock.extensions.config
import org.fossify.clock.helpers.DATA_EXPORT_EXTENSION
import org.fossify.commons.activities.BaseSimpleActivity
import org.fossify.commons.extensions.getAlertDialogBuilder
import org.fossify.commons.extensions.getCurrentFormattedDateTime
import org.fossify.commons.extensions.getParentPath
import org.fossify.commons.extensions.internalStoragePath
import org.fossify.commons.extensions.isAValidFilename
import org.fossify.commons.extensions.setupDialogStuff
import org.fossify.commons.extensions.showKeyboard
import org.fossify.commons.extensions.toast
import org.fossify.commons.extensions.value
import org.fossify.commons.helpers.ensureBackgroundThread
import java.io.File
@SuppressLint("SetTextI18n")
class ExportDataDialog(
private val activity: BaseSimpleActivity,
path: String,
private val callback: (file: File) -> Unit,
) {
companion object {
private const val EXPORT_FILE_NAME = "alarms_and_timers"
}
private val realPath = path.ifEmpty { activity.internalStoragePath }
private val config = activity.config
init {
val view = DialogExportDataBinding.inflate(activity.layoutInflater, null, false).apply {
exportDataFilename.setText("${EXPORT_FILE_NAME}_${activity.getCurrentFormattedDateTime()}")
}
activity.getAlertDialogBuilder()
.setPositiveButton(org.fossify.commons.R.string.ok, null)
.setNegativeButton(org.fossify.commons.R.string.cancel, null)
.apply {
activity.setupDialogStuff(
view = view.root,
dialog = this,
titleId = R.string.settings_export_data
) { alertDialog ->
alertDialog.showKeyboard(view.exportDataFilename)
alertDialog.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener {
val filename = view.exportDataFilename.value
when {
filename.isEmpty() -> activity.toast(org.fossify.commons.R.string.empty_name)
filename.isAValidFilename() -> {
val file = File(realPath, "$filename$DATA_EXPORT_EXTENSION")
if (file.exists()) {
activity.toast(org.fossify.commons.R.string.name_taken)
return@setOnClickListener
}
ensureBackgroundThread {
config.lastDataExportPath = file.absolutePath.getParentPath()
callback(file)
alertDialog.dismiss()
}
}
else -> activity.toast(org.fossify.commons.R.string.invalid_name)
}
}
}
}
}
}

View File

@@ -107,6 +107,10 @@ class Config(context: Context) : BaseConfig(context) {
get() = prefs.getBoolean(WAS_INITIAL_WIDGET_SET_UP, false)
set(wasInitialWidgetSetUp) = prefs.edit().putBoolean(WAS_INITIAL_WIDGET_SET_UP, wasInitialWidgetSetUp).apply()
var lastDataExportPath: String
get() = prefs.getString(LAST_DATA_EXPORT_PATH, "")!!
set(lastDataExportPath) = prefs.edit().putString(LAST_DATA_EXPORT_PATH, lastDataExportPath).apply()
var firstDayOfWeek: Int
get() {
val defaultFirstDayOfWeek = Calendar.getInstance(Locale.getDefault()).firstDayOfWeek

View File

@@ -26,6 +26,8 @@ const val INCREASE_VOLUME_GRADUALLY = "increase_volume_gradually"
const val ALARMS_SORT_BY = "alarms_sort_by"
const val STOPWATCH_LAPS_SORT_BY = "stopwatch_laps_sort_by"
const val WAS_INITIAL_WIDGET_SET_UP = "was_initial_widget_set_up"
const val DATA_EXPORT_EXTENSION = ".json"
const val LAST_DATA_EXPORT_PATH = "last_alarms_export_path"
const val FIRST_DAY_OF_WEEK = "first_day_of_week"
const val TABS_COUNT = 4
@@ -51,10 +53,15 @@ const val EARLY_ALARM_DISMISSAL_INTENT_ID = 10002
const val EARLY_ALARM_NOTIF_ID = 10003
const val OPEN_TAB = "open_tab"
const val TAB_CLOCK = 0
const val TAB_ALARM = 1
const val TAB_STOPWATCH = 2
const val TAB_TIMER = 3
const val TAB_CLOCK = 1
const val TAB_ALARM = 2
const val TAB_STOPWATCH = 4
const val TAB_TIMER = 8
const val TAB_CLOCK_INDEX = 0
const val TAB_ALARM_INDEX = 1
const val TAB_STOPWATCH_INDEX = 2
const val TAB_TIMER_INDEX = 3
const val TIMER_ID = "timer_id"
const val INVALID_TIMER_ID = -1
@@ -85,6 +92,17 @@ val DAY_BIT_MAP = mapOf(
Calendar.SATURDAY to SATURDAY_BIT,
)
// Import/export
const val EXPORT_BACKUP_MIME_TYPE = "application/json"
val IMPORT_BACKUP_MIME_TYPES = buildList {
add("application/json")
if (!isPiePlus()) {
// Workaround for https://github.com/FossifyOrg/Messages/issues/88
add("application/octet-stream")
}
}
fun getDefaultTimeZoneTitle(id: Int) = getAllTimeZones().firstOrNull { it.id == id }?.title ?: ""
fun getPassedSeconds(): Int {
@@ -173,12 +191,12 @@ fun getAllTimeZones() = arrayListOf(
MyTimeZone(37, "GMT+02:00 Windhoek", "Africa/Windhoek"),
MyTimeZone(38, "GMT+02:00 Amman", "Asia/Amman"),
MyTimeZone(39, "GMT+02:00 Athens", "Europe/Athens"),
MyTimeZone(40, "GMT+02:00 Istanbul", "Europe/Istanbul"),
MyTimeZone(41, "GMT+02:00 Beirut", "Asia/Beirut"),
MyTimeZone(42, "GMT+02:00 Cairo", "Africa/Cairo"),
MyTimeZone(43, "GMT+02:00 Helsinki", "Europe/Helsinki"),
MyTimeZone(44, "GMT+02:00 Jerusalem", "Asia/Jerusalem"),
MyTimeZone(45, "GMT+02:00 Harare", "Africa/Harare"),
MyTimeZone(40, "GMT+03:00 Istanbul", "Europe/Istanbul"),
MyTimeZone(46, "GMT+03:00 Minsk", "Europe/Minsk"),
MyTimeZone(47, "GMT+03:00 Baghdad", "Asia/Baghdad"),
MyTimeZone(48, "GMT+03:00 Moscow", "Europe/Moscow"),

View File

@@ -0,0 +1,34 @@
package org.fossify.clock.helpers
import android.content.Context
import android.net.Uri
import kotlinx.serialization.ExperimentalSerializationApi
import kotlinx.serialization.json.Json
import kotlinx.serialization.json.encodeToStream
import org.fossify.clock.models.AlarmTimerBackup
import org.fossify.commons.helpers.ExportResult
class ExportHelper(private val context: Context) {
@OptIn(ExperimentalSerializationApi::class)
fun exportData(
backup: AlarmTimerBackup,
outputUri: Uri?,
callback: (result: ExportResult) -> Unit,
) {
if (outputUri == null) {
callback.invoke(ExportResult.EXPORT_FAIL)
return
}
try {
val json = Json { encodeDefaults = true }
context.contentResolver.openOutputStream(outputUri)?.use { out ->
json.encodeToStream(backup, out)
callback.invoke(ExportResult.EXPORT_OK)
} ?: throw NullPointerException("Output stream is null")
} catch (e: Exception) {
callback.invoke(ExportResult.EXPORT_FAIL)
}
}
}

View File

@@ -0,0 +1,109 @@
package org.fossify.clock.helpers
import android.content.Context
import android.net.Uri
import kotlinx.serialization.ExperimentalSerializationApi
import kotlinx.serialization.json.Json
import kotlinx.serialization.json.decodeFromStream
import org.fossify.clock.models.Alarm
import org.fossify.clock.models.AlarmTimerBackup
import org.fossify.clock.models.Timer
import org.fossify.commons.extensions.showErrorToast
class ImportHelper(
private val context: Context,
private val dbHelper: DBHelper,
private val timerHelper: TimerHelper,
) {
enum class ImportResult {
IMPORT_INCOMPLETE,
IMPORT_FAIL,
IMPORT_OK
}
@OptIn(ExperimentalSerializationApi::class)
fun importData(uri: Uri): ImportResult {
return try {
context.contentResolver.openInputStream(uri)?.use { inputStream ->
val backup = Json.decodeFromStream<AlarmTimerBackup>(inputStream)
val importedAlarms = insertAlarms(backup.alarms)
val importedTimers = insertTimers(backup.timers)
when {
importedAlarms > 0 || importedTimers > 0 -> ImportResult.IMPORT_OK
importedAlarms == 0 && importedTimers == 0 -> ImportResult.IMPORT_INCOMPLETE
else -> ImportResult.IMPORT_FAIL
}
} ?: ImportResult.IMPORT_FAIL
} catch (e: Exception) {
context.showErrorToast(e)
ImportResult.IMPORT_FAIL
}
}
private fun insertAlarms(alarms: List<Alarm>): Int {
val existingAlarms = dbHelper.getAlarms()
var insertedCount = 0
alarms.forEach { alarm ->
if (!isAlarmAlreadyInserted(alarm, existingAlarms)) {
if (dbHelper.insertAlarm(alarm) != -1) {
insertedCount++
}
}
}
return insertedCount
}
private fun insertTimers(timers: List<Timer>): Int {
var insertedCount = 0
timers.forEach { timer ->
timerHelper.getTimers { existingTimers ->
timer.id = if (existingTimers.isNotEmpty()) {
existingTimers.last().id?.plus(1)
} else {
1
}
if (!isTimerAlreadyInserted(timer, existingTimers)) {
timerHelper.insertOrUpdateTimer(timer) { id ->
if (id != -1L) {
insertedCount++
}
}
}
}
}
return insertedCount
}
private fun isAlarmAlreadyInserted(alarm: Alarm, existingAlarms: List<Alarm>): Boolean {
for (existingAlarm in existingAlarms) {
if (alarm.timeInMinutes == existingAlarm.timeInMinutes &&
alarm.days == existingAlarm.days &&
alarm.vibrate == existingAlarm.vibrate &&
alarm.soundTitle == existingAlarm.soundTitle &&
alarm.soundUri == existingAlarm.soundUri &&
alarm.label == existingAlarm.label &&
alarm.oneShot == existingAlarm.oneShot
) {
return true
}
}
return false
}
private fun isTimerAlreadyInserted(timer: Timer, existingTimers: List<Timer>): Boolean {
for (existingTimer in existingTimers) {
if (timer.seconds == existingTimer.seconds &&
timer.vibrate == existingTimer.vibrate &&
timer.soundUri == existingTimer.soundUri &&
timer.soundTitle == existingTimer.soundTitle &&
timer.label == existingTimer.label &&
timer.createdAt == existingTimer.createdAt
) {
return true
}
}
return false
}
}

View File

@@ -3,6 +3,7 @@ package org.fossify.clock.models
import androidx.annotation.Keep
@Keep
@kotlinx.serialization.Serializable
data class Alarm(
var id: Int,
var timeInMinutes: Int,

View File

@@ -0,0 +1,10 @@
package org.fossify.clock.models
import androidx.annotation.Keep
@Keep
@kotlinx.serialization.Serializable
data class AlarmTimerBackup(
val alarms: List<Alarm>,
val timers: List<Timer>,
)

View File

@@ -6,6 +6,7 @@ import androidx.room.PrimaryKey
@Entity(tableName = "timers")
@Keep
@kotlinx.serialization.Serializable
data class Timer(
@PrimaryKey(autoGenerate = true) var id: Int?,
var seconds: Int,

View File

@@ -3,16 +3,21 @@ package org.fossify.clock.models
import androidx.annotation.Keep
@Keep
@kotlinx.serialization.Serializable
sealed class TimerState {
@Keep
@kotlinx.serialization.Serializable
object Idle : TimerState()
@Keep
@kotlinx.serialization.Serializable
data class Running(val duration: Long, val tick: Long) : TimerState()
@Keep
@kotlinx.serialization.Serializable
data class Paused(val duration: Long, val tick: Long) : TimerState()
@Keep
@kotlinx.serialization.Serializable
object Finished : TimerState()
}

View File

@@ -133,6 +133,29 @@
</RelativeLayout>
<RelativeLayout
android:id="@+id/settings_default_tab_holder"
style="@style/SettingsHolderTextViewStyle"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<org.fossify.commons.views.MyTextView
android:id="@+id/settings_default_tab_label"
style="@style/SettingsTextLabelStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/default_tab_to_open" />
<org.fossify.commons.views.MyTextView
android:id="@+id/settings_default_tab"
style="@style/SettingsTextValueStyle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/settings_default_tab_label"
tools:text="@string/last_used_tab" />
</RelativeLayout>
<RelativeLayout
android:id="@+id/settings_start_week_on_holder"
style="@style/SettingsHolderTextViewStyle"
@@ -145,7 +168,6 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/start_week_on" />
<org.fossify.commons.views.MyTextView
android:id="@+id/settings_start_week_on"
style="@style/SettingsTextValueStyle"
@@ -291,6 +313,47 @@
tools:text="1 minute" />
</RelativeLayout>
<include
android:id="@+id/settings_timer_tab_divider"
layout="@layout/divider" />
<TextView
android:id="@+id/settings_export_and_import"
style="@style/SettingsSectionLabelStyle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/migrating" />
<RelativeLayout
android:id="@+id/settings_export_data_holder"
style="@style/SettingsHolderTextViewOneLinerStyle"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<org.fossify.commons.views.MyTextView
android:id="@+id/settings_export_data_label"
style="@style/SettingsTextLabelStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/settings_export_data" />
</RelativeLayout>
<RelativeLayout
android:id="@+id/settings_import_data_holder"
style="@style/SettingsHolderTextViewOneLinerStyle"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<org.fossify.commons.views.MyTextView
android:id="@+id/settings_import_data_label"
style="@style/SettingsTextLabelStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/settings_import_data" />
</RelativeLayout>
</LinearLayout>
</androidx.core.widget.NestedScrollView>
</androidx.coordinatorlayout.widget.CoordinatorLayout>

View File

@@ -0,0 +1,27 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/export_data_holder"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:paddingLeft="@dimen/activity_margin"
android:paddingTop="@dimen/activity_margin"
android:paddingRight="@dimen/activity_margin">
<org.fossify.commons.views.MyTextInputLayout
android:id="@+id/export_data_hint"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/filename_without_json">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/export_data_filename"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="@dimen/activity_margin"
android:singleLine="true"
android:textCursorDrawable="@null"
android:textSize="@dimen/normal_text_size" />
</org.fossify.commons.views.MyTextInputLayout>
</LinearLayout>

View File

@@ -43,4 +43,12 @@
<string name="increase_volume_gradually">زيادة الصوت تدريجيا</string>
<string name="faq_1_title">كيف يمكنني تغيير فرز اللفات في علامة التبويب ساعة التوقيت؟</string>
<string name="faq_1_text">ما عليك سوى النقر فوق أي من الأعمدة ، مما يجعل الدورات مرتبة حسب العمود المحدد. بنقرات إضافية ، يمكنك التبديل بين الفرز التصاعدي والتنازلي.</string>
</resources>
<string name="app_launcher_name">الساعة</string>
<string name="clock">الساعة</string>
<string name="timer">المؤقت</string>
<string name="add_alarm">أضف منبهًا</string>
<string name="add_timer">أضف مؤقتًا</string>
<string name="clock_tab">واجهة الساعة</string>
<string name="alarm_tab">واجهة المنبه</string>
<string name="timer_tab">واجهة المؤقت</string>
</resources>

View File

@@ -1,50 +1,50 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_launcher_name">Часовник</string>
<string name="time_zone">Времева зона</string>
<string name="time_zone">Часови пояс</string>
<string name="vibrate">Вибрация</string>
<string name="no_days_selected">Не е избран ден</string>
<string name="clock">Часовник</string>
<string name="timer">Таймер</string>
<string name="timer">Отброяване</string>
<string name="stopwatch">Секундомер</string>
<string name="start_stopwatch">Стартирай хронометъра</string>
<string name="start_stopwatch">Старт на секундомера</string>
<string name="lap">Обиколка</string>
<string name="stopwatch_stopped">Секундомерът е спрян</string>
<string name="timer_stopped">Таймерът е спрян</string>
<string name="max_reminder_duration">Максимално време за напомняне</string>
<string name="timer_stopped">Отброяването е спряно</string>
<string name="max_reminder_duration">Продължителност на напомнянето</string>
<string name="time_expired">Времето изтече</string>
<string name="clock_and_date">Час и дата</string>
<string name="use_text_shadow">Използване на сянка на текста</string>
<string name="swipe_right_to_dismiss">Приплъзнете надясно за да отхвърлите или наляво, за да отложите.</string>
<string name="sort_by_creation_order">Ред на създаване</string>
<string name="sort_by_alarm_time">Време за алармата</string>
<string name="sort_by_day_and_alarm_time">Ден и час на алармата</string>
<string name="swipe_right_to_dismiss">Приплъзнете надясно за изключване, наляво за отлагане.</string>
<string name="sort_by_creation_order">Реда на създаване</string>
<string name="sort_by_alarm_time">Часа на будилника</string>
<string name="sort_by_day_and_alarm_time">Деня и часа на будилника</string>
<string name="analogue_clock">Аналогов часовник</string>
<string name="digital_clock">Цифров часовник</string>
<string name="alarm_dismissed">Алармата е отхвърлена</string>
<string name="select_timer_to_dismiss">Избери таймер за отхвърляне</string>
<string name="select_alarm_to_dismiss">Избери аларма за отхвърляне</string>
<string name="alarm_created">Алармата е създадена</string>
<string name="alarm_snoozed">Алармата е отложена от %s</string>
<string name="no_alarms_found">Няма намерени аларми</string>
<string name="no_timers_found">Няма намерени таймери</string>
<string name="upcoming_alarm">Предстояща аларма</string>
<string name="early_alarm_dismissal">Ранно изключване на алармата</string>
<string name="timers_notification_msg">Таймерите са включени</string>
<string name="timer_single_notification_label_msg">Таймерът за %s е включен</string>
<string name="new_timer">Нов таймер</string>
<string name="alarm_dismissed">Будилникът е изключен</string>
<string name="select_timer_to_dismiss">Изберете отброяване, което да изключите</string>
<string name="select_alarm_to_dismiss">Изберете будилник, което да изключите</string>
<string name="alarm_created">Будилникът е създаден</string>
<string name="alarm_snoozed">Будилникът е отложен с %s</string>
<string name="no_alarms_found">Липсват будилници</string>
<string name="no_timers_found">Липсват отброявания</string>
<string name="upcoming_alarm">Предстоящ будилник</string>
<string name="early_alarm_dismissal">Ранно изключване на будилник</string>
<string name="timers_notification_msg">Отброяванията са включени</string>
<string name="timer_single_notification_label_msg">Отброяването за %s е включено</string>
<string name="new_timer">Ново отброяване</string>
<plurals name="timer_notification_msg">
<item quantity="one">%d таймер е включен</item>
<item quantity="other">%d таймери са включени</item>
<item quantity="one">%d отброяване е включено</item>
<item quantity="other">%d отброявания са включени</item>
</plurals>
<string name="clock_tab">Часовник</string>
<string name="alarm_tab">Аларма</string>
<string name="stopwatch_tab">Таб \"Хронометър</string>
<string name="timer_tab">Таймер</string>
<string name="show_seconds">Покажи секунди</string>
<string name="increase_volume_gradually">Постепенно увеличавай звука</string>
<string name="faq_1_title">Как мога да променя сортирането на обиколките на секундомера\?</string>
<string name="faq_1_text">Просто кликнете на някоя от колонките, това ще ги сортира по тази колонка. С допълнителни кликвания можете да превключвате между възходящо и низходящо сортиране.</string>
<string name="add_timer">Добавяне на таймер</string>
<string name="add_alarm">Добавяне на аларма</string>
</resources>
<string name="alarm_tab">Будилник</string>
<string name="stopwatch_tab">Секундомер</string>
<string name="timer_tab">Отброяване</string>
<string name="show_seconds">Показване на секундите</string>
<string name="increase_volume_gradually">Постепенно усилване на звука</string>
<string name="faq_1_title">Как да променя сортирането на обиколките на секундомера?</string>
<string name="faq_1_text">Просто докоснете на някоя от колоните, така ще сортирате по нея. С допълнителни докосвания можете да превключвате между възходящо и низходящо сортиране.</string>
<string name="add_timer">Добавяне на отброяване</string>
<string name="add_alarm">Добавяне на будилник</string>
</resources>

View File

@@ -14,7 +14,7 @@
<string name="time_expired">El temps ha caducat</string>
<string name="clock_and_date">Rellotge i data</string>
<string name="use_text_shadow">Utilitza l\'ombra del text</string>
<string name="swipe_right_to_dismiss">Feu lliscar el dit cap a la dreta per ignorar, cap a l\'esquerra per posposar.</string>
<string name="swipe_right_to_dismiss">Feu lliscar el dit cap a la dreta per a ignorar, cap a l\'esquerra per a posposar.</string>
<string name="sort_by_creation_order">Ordre de creació</string>
<string name="sort_by_alarm_time">Hora d\'alarma</string>
<string name="sort_by_day_and_alarm_time">Dia i hora d\'alarma</string>
@@ -34,6 +34,7 @@
<string name="new_timer">Temporitzador nou</string>
<plurals name="timer_notification_msg">
<item quantity="one">%d temporitzador en marxa</item>
<item quantity="many">%d temporitzadors en marxa</item>
<item quantity="other">%d temporitzadors en marxa</item>
</plurals>
<string name="clock_tab">Pestanya del rellotge</string>
@@ -47,4 +48,4 @@
<string name="add_timer">Afegeix un temporitzador</string>
<string name="clock">Rellotge</string>
<string name="add_alarm">Afegeix una alarma</string>
</resources>
</resources>

View File

@@ -18,4 +18,8 @@
<string name="show_seconds">Vis sekunder</string>
<string name="faq_1_title">Hvordan kan jeg ændre sortering af mellemtider i stopuret?</string>
<string name="faq_1_text">Klik på den kolonne der skal sorteres efter. Med flere klik kan du skifte mellem stigende og faldende rækkefølge.</string>
</resources>
<string name="clock">Ur</string>
<string name="start_stopwatch">Start stopur</string>
<string name="clock_and_date">Klokketslet og dato</string>
<string name="stopwatch">Stopur</string>
</resources>

View File

@@ -45,4 +45,6 @@
<string name="increase_volume_gradually">Ansteigende Lautstärke</string>
<string name="faq_1_title">Wie kann die Sortierung der Laschen der Stoppuhr geändert werden?</string>
<string name="faq_1_text">Einfach auf eine der Spalten klicken, das wird die Sortierung entsprechend der Spalte anpassen. Weitere Klicks schalten zwischen auf- und absteigender Sortierung um.</string>
</resources>
<string name="timer_tab">Timer</string>
<string name="timer">Timer</string>
</resources>

View File

@@ -0,0 +1,53 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="max_reminder_duration">Fad uasta meabhrúcháin</string>
<string name="time_expired">Am caite</string>
<string name="alarm_snoozed">Aláram snoozed ag %s</string>
<string name="alarm_dismissed">Aláram briste</string>
<string name="select_timer_to_dismiss">Roghnaigh uaineadóir le díbhe</string>
<string name="select_alarm_to_dismiss">Roghnaigh aláram le díbhe</string>
<string name="alarm_created">Aláram cruthaithe</string>
<string name="no_alarms_found">Níor aimsíodh aláraim ar bith</string>
<string name="add_alarm">Cuir aláram leis</string>
<string name="no_timers_found">Níor aimsíodh amadóirí ar bith</string>
<string name="add_timer">Cuir uaineadóir leis</string>
<plurals name="timer_notification_msg">
<item quantity="one">Tá an t-amadóir %d ag rith</item>
<item quantity="two">Tá %d amadóir ag rith</item>
<item quantity="few">Tá %d amadóir ag rith</item>
<item quantity="many">Tá %d amadóir ag rith</item>
<item quantity="other">Tá %d amadóir ag rith</item>
</plurals>
<string name="app_launcher_name">Clog</string>
<string name="time_zone">Crios ama</string>
<string name="vibrate">Creathadh</string>
<string name="no_days_selected">Níl aon lá roghnaithe</string>
<string name="clock">Clog</string>
<string name="timer">Uaireanta</string>
<string name="stopwatch">StopwatchName</string>
<string name="start_stopwatch">Tosaigh stopuaireadóir</string>
<string name="lap">Lap</string>
<string name="stopwatch_stopped">Stop an uaireadóir</string>
<string name="timer_stopped">Cuireadh stop leis an uaineadóir</string>
<string name="clock_and_date">Clog agus dáta</string>
<string name="use_text_shadow">Úsáid scáth téacs</string>
<string name="swipe_right_to_dismiss">Svaidhpeáil ar dheis chun Díbhe, nó ar chlé go Snooze.</string>
<string name="sort_by_creation_order">Ordú cruthaithe</string>
<string name="sort_by_alarm_time">Am aláraim</string>
<string name="sort_by_day_and_alarm_time">Am Lae agus Aláraim</string>
<string name="analogue_clock">Clog analógach</string>
<string name="digital_clock">Clog digiteach</string>
<string name="upcoming_alarm">Aláram atá le teacht</string>
<string name="early_alarm_dismissal">Dífhostú aláraim luath</string>
<string name="timers_notification_msg">Amadóirí ag rith</string>
<string name="timer_single_notification_label_msg">Tá an t- amadóir do %s ag rith</string>
<string name="new_timer">Amadóir Nua</string>
<string name="clock_tab">Cluaisín clog</string>
<string name="alarm_tab">Cluaisín aláraim</string>
<string name="stopwatch_tab">Cluaisín Stopwatch</string>
<string name="timer_tab">Cluaisín uaineadóra</string>
<string name="show_seconds">Taispeáin soicindí</string>
<string name="increase_volume_gradually">Méadaigh an toirt de réir a chéile</string>
<string name="faq_1_title">Conas is féidir liom sórtáil lap a athrú ag an táb stopwatch?</string>
<string name="faq_1_text">Just a cliceáil ar aon cheann de na colúin, a dhéanamh ar an laps a shórtáil ag an gcolún a thugtar. Le cad a tharlaíonn nuair breise is féidir leat scoránaigh idir dul suas agus sórtáil íslitheach.</string>
</resources>

View File

@@ -47,4 +47,5 @@
<string name="select_alarm_to_dismiss">Odaberi alarm za odbacivanje</string>
<string name="alarm_created">Alarm je stvoren</string>
<string name="select_timer_to_dismiss">Odaberi timer za odbacivanje</string>
</resources>
<string name="timer">Timer</string>
</resources>

View File

@@ -6,7 +6,7 @@
<string name="digital_clock">Horologio digital</string>
<string name="stopwatch_tab">Scheda de chronometro</string>
<string name="clock_and_date">Horologio e data</string>
<string name="no_days_selected">Necun dies seligite</string>
<string name="no_days_selected">Necun die selectionate</string>
<string name="alarm_created">Alarma create</string>
<string name="app_launcher_name">Horologio</string>
<string name="no_alarms_found">Necun alarma trovate</string>
@@ -20,10 +20,10 @@
<string name="timer">Temporisator</string>
<string name="timer_tab">Scheda de temporisator</string>
<string name="add_timer">Adder temporisator</string>
<string name="show_seconds">Monstrar le secundas</string>
<string name="show_seconds">Monstrar secundas</string>
<string name="new_timer">Nove temporisator</string>
<string name="add_alarm">Adder alarma</string>
<string name="start_stopwatch">Initiar le chronometro</string>
<string name="start_stopwatch">Initiar chronometro</string>
<string name="analogue_clock">Horologio analogic</string>
<string name="timer_stopped">Le temporisator esseva stoppate</string>
</resources>
</resources>

View File

@@ -18,17 +18,17 @@
<string name="sort_by_day_and_alarm_time">曜日とアラーム時刻</string>
<string name="analogue_clock">アナログ時計</string>
<string name="digital_clock">デジタル時計</string>
<string name="alarm_dismissed">アラームが破棄されました</string>
<string name="alarm_dismissed">アラームを消去しました</string>
<string name="no_alarms_found">アラームが見つかりません</string>
<string name="add_alarm">アラームを追加</string>
<string name="no_timers_found">タイマーが見つかりません</string>
<string name="add_timer">タイマーを追加</string>
<string name="upcoming_alarm">今後のアラーム</string>
<string name="timers_notification_msg">タイマーが作動</string>
<string name="timer_single_notification_label_msg">タイマー %s が作動</string>
<string name="timers_notification_msg">タイマーが作動しています</string>
<string name="timer_single_notification_label_msg">タイマー %s が作動しています</string>
<string name="new_timer">新しいタイマー</string>
<plurals name="timer_notification_msg">
<item quantity="other">%d 個のタイマーが作動</item>
<item quantity="other">%d個のタイマーが作動しています</item>
</plurals>
<string name="clock_tab">時計</string>
<string name="alarm_tab">アラーム</string>
@@ -38,4 +38,12 @@
<string name="increase_volume_gradually">音量を徐々に大きくする</string>
<string name="faq_1_title">ストップウォッチのタブでラップタイムの並べ替えを行うにはどうすればよいですか?</string>
<string name="faq_1_text">特定の列をタップすると、その列でラップタイムが並べ替えられます。さらにもう一度タップすると、昇順と降順の切り替えを行えます。</string>
</resources>
<string name="clock">時計</string>
<string name="stopwatch">ストップウォッチ</string>
<string name="start_stopwatch">ストップウォッチを開始</string>
<string name="select_alarm_to_dismiss">消去するアラームを選択してください</string>
<string name="alarm_created">アラームを作成しました</string>
<string name="alarm_snoozed">%sまでスヌーズ中のアラーム</string>
<string name="early_alarm_dismissal">アラームを事前に消去</string>
<string name="select_timer_to_dismiss">消去するタイマーを選択してください</string>
</resources>

View File

@@ -1,2 +1,49 @@
<?xml version="1.0" encoding="utf-8"?>
<resources></resources>
<resources>
<string name="clock">시계</string>
<string name="timer">타이머</string>
<string name="start_stopwatch">스톱워치 시작</string>
<string name="lap">구간 기록</string>
<string name="timer_stopped">타이머가 중지되었습니다</string>
<string name="max_reminder_duration">알림 최대 지속시간</string>
<string name="time_expired">시간 만료</string>
<string name="clock_and_date">시계 및 날짜</string>
<string name="use_text_shadow">텍스트 그림자 사용</string>
<string name="sort_by_creation_order">생성된 순서</string>
<string name="analogue_clock">아날로그 시계</string>
<string name="digital_clock">디지털 시계</string>
<string name="select_timer_to_dismiss">해제할 타이머를 선택하세요</string>
<string name="select_alarm_to_dismiss">해제할 알람을 선택하세요</string>
<string name="alarm_snoozed">알람이 %s에 의해 스누즈되었습니다</string>
<string name="alarm_dismissed">알람이 해제되었습니다</string>
<string name="alarm_created">알람이 생성되었습니다</string>
<string name="no_alarms_found">알람이 없습니다</string>
<string name="add_alarm">알람 추가하기</string>
<string name="no_timers_found">타이머가 없습니다</string>
<string name="add_timer">타이머 추가하기</string>
<string name="upcoming_alarm">곧 울릴 알람</string>
<string name="early_alarm_dismissal">조기 알람 해제</string>
<string name="timers_notification_msg">타이머가 실행 중입니다</string>
<plurals name="timer_notification_msg">
<item quantity="other">타이머 %d 개가 실행 중입니다</item>
</plurals>
<string name="clock_tab">시계 탭</string>
<string name="alarm_tab">알람 탭</string>
<string name="timer_tab">타이머 탭</string>
<string name="increase_volume_gradually">음량 점점 크게 울리기</string>
<string name="show_seconds">초 단위 표시하기</string>
<string name="faq_1_title">스톱워치 탭에서 구간 기록 정렬을 바꾸려면 어떻게 해야하나요?</string>
<string name="app_launcher_name">시계</string>
<string name="vibrate">진동</string>
<string name="stopwatch">스톱워치</string>
<string name="no_days_selected">선택된 날짜가 없습니다</string>
<string name="time_zone">시간대</string>
<string name="stopwatch_stopped">스톱워치가 중지되었습니다</string>
<string name="swipe_right_to_dismiss">오른쪽으로 밀어 해제하거나, 왼쪽으로 밀어 스누즈합니다.</string>
<string name="sort_by_alarm_time">알람 시간 순서</string>
<string name="sort_by_day_and_alarm_time">날짜와 알람 시간 순서</string>
<string name="timer_single_notification_label_msg">%s 타이머가 실행 중입니다</string>
<string name="new_timer">새로운 타이머</string>
<string name="stopwatch_tab">스톱워치 탭</string>
<string name="faq_1_text">아무 열이나 누르면, 해당 열에 대해 정렬됩니다. 다시 누르면 오름차순과 내림차순 정렬을 바꿀 수 있습니다.</string>
</resources>

View File

@@ -9,40 +9,42 @@
<string name="lap">Ronde</string>
<string name="stopwatch_stopped">Stopwatch is gestopt</string>
<string name="timer_stopped">Timer is gestopt</string>
<string name="max_reminder_duration">Max duur van herinnering</string>
<string name="max_reminder_duration">Maximale herinneringsduur</string>
<string name="time_expired">Tijd verstreken</string>
<string name="clock_and_date">Klok en datum</string>
<string name="use_text_shadow">Tekstschaduw gebruiken</string>
<string name="swipe_right_to_dismiss">Veeg naar rechts voor uitzetten, of naar links voor uitstellen.</string>
<string name="swipe_right_to_dismiss">Veeg naar rechts om te sluiten, of naar links om te sluimeren.</string>
<string name="sort_by_creation_order">Aanmaakvolgorde</string>
<string name="sort_by_alarm_time">Wektijd</string>
<string name="sort_by_day_and_alarm_time">Dag en tijd</string>
<string name="analogue_clock">Analoge klok</string>
<string name="digital_clock">Digitale klok</string>
<string name="alarm_dismissed">Wekker uitgezet</string>
<string name="select_timer_to_dismiss">Timer uitzetten</string>
<string name="select_alarm_to_dismiss">Wekker uitzetten</string>
<string name="select_timer_to_dismiss">Selecteer timer om uit te zetten</string>
<string name="select_alarm_to_dismiss">Selecteer wekker om uit te zetten</string>
<string name="alarm_created">Wekker ingesteld</string>
<string name="alarm_snoozed">Wekker uitgesteld met %s</string>
<string name="no_alarms_found">Geen wekkers</string>
<string name="no_alarms_found">Geen wekkers gevonden</string>
<string name="add_alarm">Wekker toevoegen</string>
<string name="no_timers_found">Geen timers</string>
<string name="no_timers_found">Geen timers gevonden</string>
<string name="add_timer">Timer toevoegen</string>
<string name="upcoming_alarm">Volgende wekker</string>
<string name="early_alarm_dismissal">Wekker vroegtijdig uitzetten</string>
<string name="timers_notification_msg">Timers lopen</string>
<string name="timer_single_notification_label_msg">Timer voor %s loopt</string>
<string name="new_timer">Nieuwe Timer</string>
<string name="timers_notification_msg">Timers actief</string>
<string name="timer_single_notification_label_msg">Timer voor %s actief</string>
<string name="new_timer">Nieuwe timer</string>
<plurals name="timer_notification_msg">
<item quantity="one">%d timer loopt</item>
<item quantity="other">%d timers lopen</item>
<item quantity="one">%d timer actief</item>
<item quantity="other">%d timers actief</item>
</plurals>
<string name="clock_tab">Tab Klok</string>
<string name="alarm_tab">Tab Wekker</string>
<string name="stopwatch_tab">Tab Stopwatch</string>
<string name="timer_tab">Tab Timers</string>
<string name="clock_tab">Tabblad klok</string>
<string name="alarm_tab">Tabblad wekker</string>
<string name="stopwatch_tab">Tabblad stopwatch</string>
<string name="timer_tab">Tabblad timer</string>
<string name="show_seconds">Seconden tonen</string>
<string name="increase_volume_gradually">Volume geleidelijk verhogen</string>
<string name="faq_1_title">Hoe kan ik rondetijden sorteren in de stopwatch?</string>
<string name="faq_1_text">Klik op een van de kolommen om de rondetijden te sorteren op basis van die kolom. Klik nogmaals op dezelfde kolom om de sorteervolgorde om te keren.</string>
</resources>
<string name="stopwatch">Stopwatch</string>
<string name="timer">Timer</string>
</resources>

View File

@@ -48,4 +48,4 @@
<string name="faq_1_title">Como posso alterar a ordem das voltas no Cronómetro\?</string>
<string name="faq_1_text">Basta clicar em qualquer uma das colunas e isso fará com que as voltas sejam ordenadas pela coluna especificada. Com cliques adicionais, pode alternar a ordem de entre crescente e decrescente.</string>
<string name="early_alarm_dismissal">Descartar alarme cedo</string>
</resources>
</resources>

View File

@@ -12,7 +12,7 @@
<string name="stopwatch_stopped">Секундомер остановлен</string>
<string name="timer_stopped">Таймер остановлен</string>
<string name="max_reminder_duration">Максимальная длительность напоминания</string>
<string name="time_expired">Время вышло</string>
<string name="time_expired">Время истекло</string>
<string name="clock_and_date">Часы и дата</string>
<string name="use_text_shadow">Использовать затенение текста</string>
<string name="swipe_right_to_dismiss">Смахивание вправо — отключить, влево — отложить.</string>
@@ -48,5 +48,5 @@
<string name="show_seconds">Показывать секунды</string>
<string name="increase_volume_gradually">Нарастание громкости</string>
<string name="faq_1_title">Как я могу изменить сортировку кругов во вкладке секундомера?</string>
<string name="faq_1_text">Просто нажмите на любую из колонок, и круги отсортируются по этой колонке. Дополнительными нажатиями можно переключаться между сортировкой по возрастанию и по убыванию.</string>
</resources>
<string name="faq_1_text">Просто нажмите на любой из столбцов, и круги отсортируются по этому столбцу. Дополнительными нажатиями можно переключаться между сортировкой по возрастанию и по убыванию.</string>
</resources>

View File

@@ -23,7 +23,7 @@
<string name="alarm_dismissed">Alarmet har avvisats</string>
<string name="select_timer_to_dismiss">Välj timer att avfärda</string>
<string name="select_alarm_to_dismiss">Välj alarm att avfärda</string>
<string name="alarm_created">Alarm skapat</string>
<string name="alarm_created">Alarmet har skapats</string>
<string name="alarm_snoozed">Alarmet snoozar %s</string>
<string name="no_alarms_found">Inga alarm hittades</string>
<string name="add_alarm">Lägg till alarm</string>
@@ -46,4 +46,5 @@
<string name="increase_volume_gradually">Höj volymen gradvis</string>
<string name="faq_1_title">Hur kan jag ändra sortering av varv i fliken stoppur\?</string>
<string name="faq_1_text">Klicka bara på någon av kolumnerna för att sortera varven efter den aktuella kolumnen. Med ytterligare klick kan du växla mellan stigande och fallande sortering.</string>
</resources>
<string name="timer">Timer</string>
</resources>

View File

@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_launcher_name">Đồng hồ</string>
<string name="no_days_selected">Không có ngày nào được chọn</string>
<string name="no_days_selected">Chưa chọn ngày nào</string>
<string name="stopwatch_stopped">Đồng hồ bấm giờ đã bị dừng</string>
<string name="swipe_right_to_dismiss">Vuốt sang phải để Loại bỏ hoặc sang trái để Tạm ẩn.</string>
<string name="time_zone">Múi giờ</string>
@@ -23,7 +23,7 @@
<string name="digital_clock">Đồng hồ kỹ thuật số</string>
<string name="faq_1_text">Chỉ cần nhấn vào bất kỳ cột nào, điều đó sẽ làm cho các vòng được sắp xếp theo cột đã cho. Với những lần nhấn bổ sung, bạn có thể chuyển đổi giữa sắp xếp tăng dần và giảm dần.</string>
<string name="select_timer_to_dismiss">Chọn hẹn giờ để loại bỏ</string>
<string name="alarm_dismissed">Đã loại bỏ báo thức</string>
<string name="alarm_dismissed">Đã bỏ qua báo thức</string>
<string name="select_alarm_to_dismiss">Chọn báo thức để loại bỏ</string>
<string name="alarm_created">Đã tạo báo thức</string>
<string name="alarm_snoozed">Đã tạm ẩn báo thức %s</string>
@@ -40,10 +40,10 @@
<item quantity="other">%d bộ hẹn giờ đang chạy</item>
</plurals>
<string name="clock_tab">Danh mục đồng hồ</string>
<string name="alarm_tab">Danh mục báo thức</string>
<string name="alarm_tab">Tab báo thức</string>
<string name="stopwatch_tab">Danh mục đếm giờ</string>
<string name="timer_tab">Danh mục hẹn giờ</string>
<string name="show_seconds">Hiển thị giây</string>
<string name="increase_volume_gradually">Tăng âm lượng dần dần</string>
<string name="faq_1_title">Làm cách nào tôi có thể thay đổi cách sắp xếp vòng ở danh mục đồng hồ bấm giờ?</string>
</resources>
</resources>

View File

@@ -2,7 +2,7 @@
<resources>
<string name="app_launcher_name">时钟</string>
<string name="time_zone">时区</string>
<string name="vibrate"></string>
<string name="vibrate"></string>
<string name="no_days_selected">未选择哪一天</string>
<string name="clock">时钟</string>
<string name="timer">定时器</string>
@@ -46,4 +46,4 @@
<string name="increase_volume_gradually">音量渐增</string>
<string name="faq_1_title">秒表页面分段的排序如何更改?</string>
<string name="faq_1_text">只要点击任一栏位,就会依据选定的栏位做排序。再多点一下,还能切换递增或者递减顺序。</string>
</resources>
</resources>

View File

@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_launcher_name">簡易時鐘</string>
<string name="app_launcher_name">時鐘</string>
<string name="time_zone">時區</string>
<string name="vibrate">震動</string>
<string name="no_days_selected">未選擇哪一天</string>
@@ -21,4 +21,29 @@
<string name="increase_volume_gradually">音量漸增</string>
<string name="faq_1_title">碼錶頁面分段的排序如何變更?</string>
<string name="faq_1_text">只要點擊任一欄位,就會依選定的欄位做排序。再多點一下,還能切換遞增或遞減的排序。</string>
</resources>
<string name="early_alarm_dismissal">提早解除鬧鐘</string>
<string name="clock">時鐘</string>
<string name="stopwatch">計時器</string>
<string name="start_stopwatch">開始計時</string>
<string name="alarm_dismissed">解除鬧鐘</string>
<string name="select_timer_to_dismiss">選取要解除的計時器</string>
<string name="select_alarm_to_dismiss">選取要解除的鬧鐘</string>
<string name="alarm_created">已建立鬧鐘</string>
<string name="alarm_snoozed">鬧鐘被 %s 以貪睡延後</string>
<string name="no_alarms_found">找不到鬧鐘</string>
<string name="add_alarm">新增鬧鐘</string>
<string name="no_timers_found">找不到計時器</string>
<string name="add_timer">新增計時器</string>
<string name="upcoming_alarm">即將到來的鬧鐘</string>
<string name="timers_notification_msg">計時器正在運作</string>
<string name="timer_single_notification_label_msg">%s 的計時器正在運作</string>
<string name="new_timer">新的計時器</string>
<plurals name="timer_notification_msg">
<item quantity="other">%d 個計時器正在運作</item>
</plurals>
<string name="sort_by_creation_order">建立順序</string>
<string name="sort_by_alarm_time">鬧鐘時間</string>
<string name="sort_by_day_and_alarm_time">日期與鬧鐘時間</string>
<string name="analogue_clock">類比時鐘</string>
<string name="digital_clock">數位時鐘</string>
</resources>

View File

@@ -50,6 +50,8 @@
<string name="timer_tab">Timer tab</string>
<string name="show_seconds">Show seconds</string>
<string name="increase_volume_gradually">Increase volume gradually</string>
<string name="settings_import_data">Import alarms and timers</string>
<string name="settings_export_data">Export alarms and timers</string>
<!-- FAQ -->
<string name="faq_1_title">How can I change lap sorting at the stopwatch tab?</string>

View File

@@ -1,5 +1,7 @@
plugins {
alias(libs.plugins.android).apply(false)
alias(libs.plugins.kotlinAndroid).apply(false)
alias(libs.plugins.kotlinSerialization).apply(false)
alias(libs.plugins.ksp).apply(false)
alias(libs.plugins.detekt).apply(false)
}

View File

@@ -0,0 +1 @@
Fossify Clock

View File

@@ -0,0 +1 @@
* Llançament inicial.

View File

@@ -0,0 +1,32 @@
Presentem el Fossify Clock, l'acompanyant definitiu de control del temps dissenyat per a millorar les vostres rutines diàries i promoure hàbits millors de son. Amb multitud de funcions adaptades a les vostres necessitats, el Fossify Clock s'integra perfectament a la vostra vida, oferint una comoditat i versatilitat incomparables.
⌚ CONTROL DEL TEMPS MULTIFUNCIONAL:
Experimenteu la potència de la gestió versàtil del temps amb el Fossify Clock. Des de servir com a giny de rellotge fins a funcionar com a despertador i cronòmetre, aquesta aplicació és l'eina de referència per a regular les activitats diàries i millorar l'estil de vida general.
⏰ ALARMA PLENA DE CARACTERÍSTIQUES:
Desperteu-vos fresc amb les característiques integrals d'alarma del Fossify Clock. Establiu diverses alarmes amb opcions com selecció de dia, commutador de vibració, etiquetes personalitzades i personalització de tons de trucada. Gaudiu d'un augment gradual del volum i d'un botó de posposar personalitzable per a una experiència agradable en despertar. Amb una interfície fàcil d'usar, la configuració d'alarmes mai ha estat tan fàcil.
⏱️ CRONÒMETRE PRÀCTIC:
Feu un seguiment de les vostres activitats amb precisió utilitzant la funció de cronòmetre del Fossify Clock. Mesureu períodes més llargs o voltes individuals sense esforç. També podeu ordenar les voltes en ordre ascendent o descendent.
⏳ FUNCIONALITAT PRECISA DEL TEMPORITZADOR:
Seguiu les tasques amb la funció versàtil del temporitzador del Fossify Clock. Personalitzeu les preferències de to de trucada, commuteu les vibracions i feu pausa del compte enrere segons les vostres necessitats. Tant si esteu programant intervals de cocció, gestionant sessions d'estudi o assegurant descansos puntuals, el Fossify Clock us dona cobertura amb precisió i facilitat.
🌈 GINY DE RELLOTGE AMB CARACTERÍSTIQUES PERSONALITZABLES:
Transformeu la pantalla d'inici amb el giny de rellotge personalitzable del Fossify Clock. Ajusteu el color del text, el color de fons i la transparència. Trieu entre rellotge analògic o digital per adaptar-vos al vostre estil i accedir fàcilment a la informació de temps essencial d'un cop d'ull.
🎨 INTERFÍCIE I TEMES PERSONALITZABLES:
Gaudiu d'una experiència personalitzada amb el «material design» del Fossify Clock i les opcions de tema fosc. Adapteu l'aplicació a les vostres preferències amb colors i temes personalitzables, potenciant la usabilitat i reduint la tensió ocular, especialment en entorns de poca llum.
🔒 ENFOCAT A LA PRIVADESA:
Tingueu la seguretat de saber que la vostra privadesa està protegida amb el funcionament fora de línia del Fossify Clock. Experimenteu la privadesa, seguretat i estabilitat màxima sense sacrificar la funcionalitat ni la comoditat.
🌐 SENSE PUBLICITAT I DE CODI OBERT:
Digueu adeu als anuncis intrusius i als permisos innecessaris. El Fossify Clock és sense anuncis, totalment de codi obert, i us atorga un control complet sobre la vostra experiència de control del temps.
Actualitzeu les vostres habilitats de gestió del temps, optimitzeu les rutines i prioritzeu millor el son amb el Fossify Clock. Descarregueu-lo ara i preneu el control del vostre temps com mai.
Exploreu més aplicacions de Fossify: https://www.fossify.org
Codi obert: https://www.github.com/FossifyOrg
Uniu-vos a la comunitat a Reddit: https://www.reddit.com/r/Fossify
Connecteu a Telegram: https://t.me/Fossify

View File

@@ -0,0 +1 @@
Aplicació de rellotge de codi obert, lleuger i amb característiques essencials.

View File

@@ -0,0 +1 @@
Fossify Clock

View File

@@ -0,0 +1 @@
* Prvotní vydání.

View File

@@ -0,0 +1,32 @@
Představujeme Hodiny Fossify ultimátní nástroj na sledování času navržený pro vylepšení vašich každodenních rutin a pomohl vám s lepším spánkem. Hodiny Fossify obsahují velké množství funkcí přímo pro vaše potřeby, takže se bezproblémově integrují do vašeho života a poskytují bezkonkurenční pohodlí a všestrannost.
⌚ MULTIFUKNČNÍ ČASOMÍRA:
Vyzkoušejte sílu všestranné správy času pomocí aplikace Hodiny Fossify. Tato aplikace slouží jako widget hodin, budík i stopky a je vaším nástrojem pro regulaci každodenních činností a zlepšení celkového životního stylu.
⏰ BUDÍK BOHATÝ NA FUNKCE:
Díky rozsáhlým funkcím budíku v aplikaci Hodiny Fossify se můžete probouzet svěží. Nastavte si více budíků s možnostmi, jako je výběr dne, přepínání vibrací, vlastní štítky a přizpůsobení vyzvánění. Vychutnejte si postupné zvyšování hlasitosti a přizpůsobitelné tlačítko odložení budíku pro příjemné probuzení. Díky přívětivému uživatelskému rozhraní nebylo nastavování budíků nikdy jednodušší.
⏱️ PRAKTICKÉ STOPKY:
Aplikace Hodiny Fossify umožňuje přesné sledování vašich aktivit pomocí funkce stopek. Bez námahy změříte delší časové úseky nebo jednotlivá kola. Své okruhy můžete také seřadit vzestupně nebo sestupně.
⏳ PŘESNÁ FUNKCE ČASOVAČE:
Díky všestranné funkci časovače aplikace Hodiny Fossify budete mít přehled o svých úkolech. Přizpůsobte si preference vyzvánění, přepínejte vibrace a pozastavujte odpočítávání podle svých potřeb. Ať už časujete intervaly vaření, řídíte studijní sezení nebo zajišťujete včasné přestávky, aplikace Hodiny Fossify vám to umožní s přesností a lehkostí.
🌈 WIDGET HODIN S PŘIZPŮSOBITELNÝMI FUNKCEMI:
Přeměňte svou domovskou obrazovku pomocí přizpůsobitelného widgetu aplikace Hodiny Fossify. Upravte si barvu textu, barvu pozadí a průhlednost. Vyberte si mezi analogovými nebo digitálními hodinami podle svého stylu a snadno získejte přístup k základním informacím o čase na první pohled.
🎨 PŘIZPŮSOBITELNÉ ROZHRANÍ A MOTIVY:
Vychutnejte si přizpůsobené prostředí díky Material Designu a možnostem tmavých motivů v aplikaci Hodiny Fossify. Přizpůsobte si aplikaci podle sebe pomocí přizpůsobitelných barev a motivů, což zvyšuje použitelnost a snižuje namáhání očí, zejména v prostředí se slabým osvětlením.
🔒 PŘÍSTUP ZAMĚŘENÝ PŘEDEVŠÍM NA SOUKROMÍ:
Aplikace Hodiny Fossify funguje v režimu offline a vaše soukromí je chráněno. Zažijte maximální soukromí, bezpečnost a stabilitu, aniž byste museli obětovat funkčnost nebo pohodlí.
🌐 BEZ REKLAM A S OTEVŘENÝM ZDROJOVÝM KÓDEM:
Rozlučte se s vtíravými reklamami a zbytečnými povoleními. Aplikace Hodiny Fossify je bez reklam, plně open-source a poskytuje vám plnou kontrolu nad vaší časomírou.
Vylepšete své dovednosti v oblasti správy času, optimalizujte své rutinní postupy a upřednostněte lepší spánek pomocí aplikace Hodiny Fossify. Stáhněte si je nyní a převezměte kontrolu nad svým časem jako nikdy předtím.
Prozkoumejte další aplikace Fossify: https://www.fossify.org
Otevřený zdrojový kód: https://www.github.com/FossifyOrg
Přidejte se ke komunitě na Redditu: https://www.reddit.com/r/Fossify
Připojte se k Telegramu: https://t.me/Fossify

View File

@@ -0,0 +1 @@
Praktická aplikace hodin s otevřeným zdrojovým kódem a základními funkcemi.

View File

@@ -0,0 +1 @@
Hodiny Fossify

View File

@@ -0,0 +1 @@
* Erste Veröffentlichung.

View File

@@ -0,0 +1,32 @@
Fossify Clock ist der ultimative Begleiter für die Zeitmessung, der deine täglichen Routinen verbessert und deine Schlafgewohnheiten fördert. Mit einer Vielzahl von Funktionen, die auf deine Bedürfnisse zugeschnitten sind, fügt sich Fossify Clock nahtlos in dein Leben ein und bietet unvergleichlichen Komfort und Vielseitigkeit.
⌚ MULTIFUNKTIONALE ZEITMESSUNG:
Erlebe die Macht des vielseitigen Zeitmanagements mit Fossify Clock. Ob als Uhren-Widget, Wecker oder Stoppuhr mit dieser App kannst du deine täglichen Aktivitäten regulieren und deinen Lebensstil verbessern.
⏰ FUNKTIONSREICHER ALARM:
Mit den umfassenden Alarmfunktionen von Fossify Clock wachst du erfrischt auf. Stelle mehrere Alarme mit Optionen wie Tagesauswahl, Vibration, benutzerdefinierte Beschriftung und Klingeltonanpassung ein. Genieße die schrittweise Erhöhung der Lautstärke und eine anpassbare Schlummertaste für ein angenehmes Aufwachen. Dank der bedienfreundlichen Oberfläche war es noch nie so einfach, Alarme einzurichten.
⏱️ PRAKTISCHE STOPPUHR:
Mit der Stoppuhrfunktion von Fossify Clock kannst du deine Aktivitäten genau verfolgen. Messe mühelos längere Zeiträume oder einzelne Runden. Du kannst deine Runden auch in aufsteigender oder absteigender Reihenfolge sortieren.
⏳ PRÄZISE TIMER-FUNKTION:
Mit der vielseitigen Timer-Funktion von Fossify Clock behältst du den Überblick über deine Aufgaben. Du kannst den Klingelton einstellen, die Vibration einschalten und die Countdowns anhalten. Ganz gleich, ob du Kochintervalle zeitlich festlegen, Lernsessions verwalten oder rechtzeitig Pausen einlegen willst, Fossify Clock bietet dir Präzision und Leichtigkeit.
🌈 UHR-WIDGET MIT ANPASSBAREN FUNKTIONEN:
Verändere deinen Startbildschirm mit dem anpassbaren Uhren-Widget von Fossify Clock. Passe Textfarbe, Hintergrundfarbe und Transparenz an. Wähle zwischen analoger oder digitaler Uhr, um deinen Stil zu unterstreichen und die wichtigsten Zeitinformationen auf einen Blick zu sehen.
🎨 ANPASSBARE OBERFLÄCHE UND FARBSCHEMAS:
Genieße ein individuelles Erlebnis mit dem Material Design und den dunklen Farbschemas von Fossify Clock. Passe die App mit anpassbaren Farben und Farbschemas an deine Vorlieben an, um die Bedienfreundlichkeit zu verbessern und die Augen zu entlasten, besonders in schwach beleuchteten Umgebungen.
🔒 PRIVATSPHÄRE STEHT AN ERSTER STELLE:
Du kannst sicher sein, dass deine Privatsphäre durch den Offline-Betrieb von Fossify Clock geschützt ist. Erlebe ein Maximum an Privatsphäre, Sicherheit und Stabilität, ohne auf Funktionalität oder Komfort verzichten zu müssen.
🌐 WERBEFREI & OPEN SOURCE:
Verabschiede dich von aufdringlicher Werbung und unnötigen Berechtigungen. Fossify Clock ist werbefrei, vollständig quelloffen und gibt dir die volle Kontrolle über deine Zeiterfassung.
Verbessere dein Zeitmanagement, optimiere deine Routinen und sorge für besseren Schlaf mit Fossify Clock. Lade die App jetzt herunter und übernimm die Kontrolle über deine Zeit wie nie zuvor.
Entdecke weitere Apps von Fossify: https://www.fossify.org
Open-Source-Code: https://www.github.com/FossifyOrg
Tritt der Community auf Reddit bei: https://www.reddit.com/r/Fossify
Verbinde dich auf Telegram: https://t.me/Fossify

View File

@@ -0,0 +1 @@
Nützliche, schlanke, quelloffene Uhr-App mit grundlegenden Funktionen.

View File

@@ -0,0 +1 @@
Fossify Clock

View File

@@ -0,0 +1 @@
* Versión inicial.

View File

@@ -0,0 +1,32 @@
Presentamos Fossify Clock el compañero de cronometraje definitivo diseñado para mejorar sus rutinas diarias y promover mejores hábitos de sueño. Con una multitud de funciones adaptadas a sus necesidades, Fossify Clock se integra perfectamente en su vida, ofreciendo comodidad y versatilidad sin precedentes.
⌚ CRONOMETRAJE MULTIFUNCIONAL:
Experimente el poder de la gestión del tiempo versátil con Fossify Clock. Desde un widget de reloj hasta un despertador y cronómetro, esta aplicación es tu herramienta preferida para regular tus actividades diarias y mejorar tu estilo de vida en general.
⏰ ALARMA RICA EN CARACTERÍSTICAS:
Despiértese renovado con las funciones de alarma integrales de Fossify Clock. Configure múltiples alarmas con opciones como selección de día, interruptor de vibración, etiquetas personalizadas y personalización de tonos de llamada. Disfrute de un aumento gradual del volumen y un botón de repetición personalizable para una agradable experiencia de despertar. Con una interfaz fácil de usar, la configuración de alarmas nunca ha sido tan fácil.
⏱️ CRONÓMETRO CONVENIENTE:
Realiza un seguimiento de tus actividades con precisión utilizando la función de cronómetro de Fossify Clock. Mida períodos más largos o vueltas individuales sin esfuerzo. También puedes ordenar tus vueltas en orden ascendente o descendente.
⏳ FUNCIONALIDAD DE TEMPORIZADOR PRECISO:
Manténgase al tanto de sus tareas con la versátil función de temporizador de Fossify Clock. Personaliza las preferencias de tonos de llamada, cambia las vibraciones y pausa la cuenta atrás para satisfacer tus necesidades. Ya sea que esté programando intervalos de cocción, administrando sesiones de estudio o asegurando descansos oportunos, Fossify Clock lo tiene cubierto con precisión y facilidad.
🌈 RELOJ WIDGET CON CARACTERÍSTICAS PERSONALIZABLES:
Transforma tu pantalla de inicio con el widget de reloj personalizable de Fossify Clock. Ajuste el color del texto, el color de fondo y la transparencia. Elija entre reloj analógico o digital para adaptarse a su estilo y acceder fácilmente a la información de tiempo esencial de un vistazo.
🎨 INTERFAZ PERSONALIZABLE Y TEMAS:
Disfruta de una experiencia personalizada con material design y opciones de temas oscuros de Fossify Clock. Adapta la aplicación a tus preferencias con colores y temas personalizables, mejorando la usabilidad y reduciendo la fatiga visual, especialmente en entornos con poca luz.
🔒 LA PRIVACIDAD ES LO PRIMERO:
Tenga la seguridad de saber que su privacidad está protegida con el funcionamiento fuera de línea de Fossify Clock. Disfrute de la máxima privacidad, seguridad y estabilidad sin sacrificar funcionalidad o conveniencia.
🌐 SIN ANUNCIOS Y DE CÓDIGO ABIERTO:
Diga adiós a los anuncios intrusivos y a los permisos innecesarios. Fossify Clock está libre de anuncios, es totalmente de código abierto y le otorga un control completo sobre su experiencia de cronometraje.
Mejore sus habilidades de gestión del tiempo, optimice sus rutinas y priorice un mejor sueño con Fossify Clock. Descarga ahora y toma el control de tu tiempo como nunca antes.
Explore más aplicaciones de Fossify: https://www.fossify.org
Código abierto: https://www.github.com/FossifyOrg
Únete a la comunidad en Reddit: https://www.reddit.com/r/Fossify
Conéctese con Telegram: https://t.me/Fossify

View File

@@ -0,0 +1 @@
Reloj práctico, ligero y de código abierto con funciones esenciales.

View File

@@ -0,0 +1 @@
Reloj Fossify

View File

@@ -0,0 +1 @@
* Esmane versioon.

View File

@@ -0,0 +1 @@
Mugav ja lihtne avatud lähtekoodil põhinev kell, milles on kõik vajalik olemas.

View File

@@ -0,0 +1 @@
Fossify kell

View File

@@ -0,0 +1 @@
* Lehenengo bertsioa.

View File

@@ -0,0 +1,32 @@
Fossify erlojua aurkezten dugu: zure eguneroko ohiturak hobetzeko eta lo egiteko ohitura hobeak sustatzeko diseinatutako denbora-konpainia bikaina. Zure beharretara egokitutako funtzio ugarirekin, Fossify erlojua ezin hobeto integratzen da zure bizitzan, erosotasun eta aldakortasun paregabeak eskainiz.
FUNTZUN ANITZEKO kronometroa:
Bizi ezazu denbora-kudeaketa polifazetikoa Fossify Clock-ekin. Erlojuaren widget gisa jardutetik iratzargailu eta kronometro gisa funtzionatzera, aplikazio hau zure eguneroko jarduerak erregulatzeko eta zure bizimodu orokorra hobetzeko tresna erabilgarria da.
EZAUGARRI ABERATSEKO ALARMA:
Esnatu freskatu Fossify erlojuaren alarma-funtzio osoekin. Ezarri alarma anitz egun hautatzeko aukerarekin, bibrazio-aldaketa, etiketa pertsonalizatuak eta dei-tonuak pertsonalizatzea. Gozatu bolumena pixkanaka handitzea eta errepikatzeko botoi pertsonalizagarria esnatzeko esperientzia atsegina izateko. Erabiltzaile-interfazearekin, alarmak konfiguratzea ez da inoiz erraza izan.
KRONOMETRO ZEHATZA:
Jarraitu zure jarduerei zehaztasunez Fossify erlojuaren kronometroaren funtzioa erabiliz. Neurtu denbora luzeagoak edo banakako itzuliak esfortzurik gabe. Zure itzuliak goranzko edo beheranzko ordenan ere ordena ditzakezu.
TENPORIZATOREAREN FUNTZIONALITATEA:
Egon zure zereginen gainean Fossify erlojuaren tenporizadore-funtzio polifazetikoarekin. Pertsonalizatu dei-tonuen hobespenak, aldatu bibrazioak eta pausatu atzerako kontaketa zure beharretara egokitzeko. Sukalde-lanetako tarteak, ikasketa saioak kudeatzen edo atsedenaldi puntualak ziurtatzen ari zaren ala ez, Fossify erlojuak zehaztasun eta erraztasunarekin estali zaitu.
🌈 ERLOUAREN TREPETA PERTSONALIZATZEKO EZAUGARRIEKIN:
Eraldatu zure hasierako pantaila Fossify erlojuaren erloju trepeta pertsonalizagarriarekin. Doitu testuaren kolorea, atzeko planoaren kolorea eta gardentasuna. Aukeratu erloju analogikoa edo digitala zure estilora egokitzeko eta erraz eskura ezazu orduko funtsezko informazioa begiratu batean.
🎨 INTERFAZE ETA GAI PERTSONALIZAGARRIAK:
Gozatu esperientzia pertsonalizatua Fossify erlojuaren materialaren diseinuarekin eta gai iluneko aukerekin. Egokitu aplikazioa zure hobespenetara kolore eta gai pertsonalizatuekin, erabilgarritasuna hobetuz eta begien nekea murriztuz, batez ere argi gutxiko inguruneetan.
🔒 PRIBATUTASUNA-LEHEN HURBILKETA:
Lasai egon zure pribatutasuna Fossify erlojuaren lineaz kanpoko funtzionamenduarekin babestuta dagoela. Bizi ezazu pribatutasun, segurtasun eta egonkortasun handiena funtzionaltasunari edo erosotasunari uko egin gabe.
🌐 IRAGARKI GABE ETA ITURRI IREKIA:
Esan agur iragarki intrusiboei eta beharrezkoak ez diren baimenei. Fossify erlojua iragarkirik gabekoa da, guztiz kode irekikoa, eta zure denbora-esperientziaren kontrol osoa ematen dizu.
Hobetu zure denbora kudeatzeko trebetasunak, optimizatu zure errutinak eta lehenetsi lo hobeago Fossify erlojuarekin. Deskargatu orain eta hartu zure denbora inoiz ez bezala kontrolatu.
Arakatu Fossify aplikazio gehiago: https://www.fossify.org
Iturburu irekiko kodea: https://www.github.com/FossifyOrg
Sartu komunitatean Reddit-en: https://www.reddit.com/r/Fossify
Konektatu Telegram-en: https://t.me/Fossify

View File

@@ -0,0 +1 @@
Erloju-aplikazio arina eta kode irekikoa, funtsezko ezaugarriak dituena.

View File

@@ -0,0 +1 @@
Fossify erlojua

View File

@@ -0,0 +1 @@
* Première parution.

View File

@@ -0,0 +1,2 @@
* Correction de quelques problèmes liés aux alarmes
* Amélioration de l'interface utilisateur, de la traduction et de la stabilité

View File

@@ -0,0 +1,32 @@
Présentation de l'Horloge Fossify l'ultime compagnon du temps, conçu pour enrichir vos routines quotidiennes et de promouvoir de meilleures habitudes de sommeil. Avec une multitude de fonctionnalités faite pour vos besoins, l'Horloge Fossify s'intègre dans votre vie, offrant un confort et une polyvalence inégalés.
⌚ CHRONOMÈTRE MULTIFONCTION :
Découvrez la puissance de la gestion du temps polyvalente avec l'Horloge Fossify. Que ce soit pour servir de widget ou pour fonctionner comme un réveil et un chronomètre, cette application est l'outil idéal pour réguler vos activités quotidiennes et améliorer votre mode de vie global.
⏰ ALARME RICHE EN FONCTIONNALITÉS :
Réveillez-vous en pleine forme grâce aux fonctions d'alarme complètes de l'Horloge Fossify. Réglez plusieurs alarmes avec des options telles que la sélection du jour, la vibration, les étiquettes personnalisées et la personnalisation de la sonnerie. Profitez d'une augmentation progressive du volume et d'un bouton de répétition personnalisable pour une expérience de réveil agréable. Grâce à une interface conviviale, il n'a jamais été aussi facile de régler des alarmes.
⏱️ CHRONOMÈTRE PRATIQUE :
Enregistrez vos activités avec précision en utilisant la fonctionnalité chronomètre de l'Horloge Fossify. Mesurez de longues périodes ou des tours, sans efforts. Vous pouvez aussi trier vos tours dans l'ordre ascendant ou descendant.
⏳ FONCTIONNALITÉ DE MINUTERIE PRÉCISE :
Restez au top de vos tâches grâce à la fonction polyvalente de minuterie de l'Horloge Fossify. Personnalisez vos sonneries, activez les vibrations et mettez en pause les minuteurs en fonction de vos besoins. Que vous chronométriez des intervalles de cuisson, gériez des sessions d'étude ou assuriez des pauses opportunes, l'Horloge Fossify vous couvre avec précision et facilité.
🌈 WIDGET HORLOGE AVEC FONCTIONS PERSONNALISABLES :
Transformez votre écran d'accueil avec le widget horloge personnalisable de l'Horloge Fossify. Ajustez la couleur du texte, la couleur de fond et la transparence. Choisissez entre une horloge analogique ou numérique selon votre style et accédez facilement aux informations essentielles en un coup d'œil.
🎨 INTERFACE ET THÈMES PERSONNALISABLES :
Profitez d'une expérience personnalisée grâce au design matériel et aux options de thème sombre de l'Horloge Fossify. Adaptez l'application à vos préférences avec des couleurs et des thèmes personnalisables, en améliorant la convivialité et en réduisant la fatigue oculaire, en particulier dans les environnements à faible luminosité.
🔒 UNE APPROCHE AXÉE SUR LA PROTECTION DE LA VIE PRIVÉE :
Soyez rassuré en sachant que votre vie privée est protégée grâce au fonctionnement hors ligne de l'Horloge Fossify. Faites l'expérience d'une confidentialité, d'une sécurité et d'une stabilité maximales sans sacrifier fonctionnalités ou confort.
🌐 SANS PUBS & OPEN-SOURCE :
Dites adieu aux publicités intrusives et aux autorisations inutiles. L'Horloge Fossify est sans publicité, entièrement open-source, et vous accorde un contrôle total sur votre chronomètre.
Améliorez vos compétences dans la gestion du temps, optimisez vos routines et donnez la priorité à un meilleur sommeil avec l'Horloge Fossify. Téléchargez maintenant et prenez le contrôle de votre temps comme jamais auparavant.
Explorez plus d'applications Fossify: https://www.fossify.org
Code Open-Source : https://www.github.com/FossifyOrg
Rejoignez la communauté sur Reddit : https://www.reddit.com/r/Fossify
Restez connecté sur Telegram : https://t.me/Fossify

View File

@@ -0,0 +1 @@
Application horloge pratique, légère et open source avec leurs fonctionnalités essentielles.

View File

@@ -0,0 +1 @@
Fossify Horloge

View File

@@ -0,0 +1 @@
* Eisiúint tosaigh.

View File

@@ -0,0 +1,32 @@
Clog Fossify a thabhairt isteach an compánach deiridh ama atá deartha chun do ghnáthaimh laethúla a fheabhsú agus nósanna codlata níos fearr a chur chun cinn. Agus an iliomad feidhmeanna curtha in oiriúint le do chuid riachtanas, comhtháthaíonn Fossify Clock gan uaim isteach i do shaol, ag tairiscint áise agus solúbthachta gan sárú.
⌚ COINNEÁIL ILfheidhmeach:
Taithí a dhéanamh ar chumhacht na bainistíochta ama ildánach le Fossify Clog. Ó fónamh mar ghiuirléid cloig go feidhmiú mar chlog aláraim agus stopuaireadóir, is é an aip seo an uirlis chun do ghníomhaíochtaí laethúla a rialú agus chun do stíl mhaireachtála iomlán a fheabhsú.
⏰ ALARM Saibhir Gné:
Múscail athnuachan le gnéithe cuimsitheacha aláraim Fossify Clock. Socraigh il-aláraim le roghanna amhail roghnú lae, scorán creathadh, lipéid shaincheaptha agus saincheapadh cloigíní. Bain sult as méadú de réir a chéile ar an toirt agus cnaipe snooze inoiriúnaithe le haghaidh eispéireas taitneamhach múscailte. Le comhéadan atá éasca le húsáid, ní raibh sé riamh níos éasca aláraim a shocrú.
⏱️ STOPWATCH Áisiúil:
Rianaigh do ghníomhaíochtaí go beacht trí úsáid a bhaint as feidhm stopuaireadóir Fossify Clock. Déan tréimhsí níos faide nó lapaí aonair a thomhas gan stró. Is féidir leat freisin do laps a shórtáil in ord ardaitheach nó íslitheach.
⏳ FEIDHMÍOCHT AMA BEACHT:
Fan ar bharr do thascanna leis an ngné lasc ama ildánach Fossify Clock. Saincheap roghanna glúnta, scoránaigh creathadh, agus sos comhaireamh síos chun freastal ar do chuid riachtanas. Cibé an bhfuil tú ag uainiú tréimhsí cócaireachta, ag bainistiú seisiúin staidéir, nó ag cinntiú sosanna tráthúla, tá Fossify Clock clúdaithe agat le cruinneas agus gan stró.
🌈 Giuirléid CLOCK LE GNÉITHE CUSPÓIRÍ
Trasfhoirmigh do scáileán baile leis an ngiuirléid clog Inoiriúnaithe Fossify Clock. Coigeartaigh dath an téacs, dath cúlra, agus trédhearcacht. Roghnaigh idir chlog analógach nó clog digiteach a oireann le do stíl agus faigh sracfhéachaint ar eolas riachtanach ama.
🎨 IDIRGHNÍOMHA AGUS TÉAMAÍ CUSTAIMÉADACHA:
Bain sult as taithí phearsantaithe le dearadh ábhar Fossify Clock agus roghanna téama dorcha. Cuir an aip in oiriúint le do chuid sainroghanna le dathanna agus téamaí inoiriúnaithe, ag cur le hinúsáidteacht agus ag laghdú brú súl, go háirithe i dtimpeallachtaí íseal-éadrom.
🔒 PRÍOBHÁIDEACHT - AN CHÉAD CHUR CHUIGE:
Bí cinnte agus fios agat go bhfuil do phríobháideachas cosanta le hoibríocht as líne Fossify Clock. Taithí príobháideacht uasta, slándála, agus cobhsaíocht gan íobairt feidhmiúlacht nó áise.
🌐 AD-SAOR IN AISCE & FOINSE OSCAILTE:
Slán le fógraí ionsáite agus ceadanna neamhriachtanacha. Tá Fossify Clock saor ó fhógraí, foinse oscailte go hiomlán, agus tugann sé smacht iomlán duit ar do thaithí ama ama.
Uasghrádaigh do scileanna bainistíochta ama, barrfheabhsú do ghnáthaimh, agus tosaíocht a thabhairt do chodladh níos fearr le Fossify Clock. Íoslódáil anois agus bain smacht ar do chuid ama mar nach raibh riamh cheana.
Déan tuilleadh aipeanna Fossify a iniúchadh: https://www.fossify.org
Cód Foinse Oscailte: https://www.github.com/FossifyOrg
Bí leis an bpobal ar Reddit: https://www.reddit.com/r/Fossify
Ceangail ar Telegram: https://t.me/Fossify

View File

@@ -0,0 +1 @@
Aip clog foinse oscailte áisiúil, éadrom le gnéithe riachtanacha.

View File

@@ -0,0 +1 @@
Clog Fossify

View File

@@ -0,0 +1 @@
* Versión inicial.

View File

@@ -0,0 +1 @@
* Rilis awal.

View File

@@ -0,0 +1,32 @@
Memperkenalkan Fossify Clock pendamping penunjuk waktu terbaik yang dirancang untuk menyempurnakan rutinitas harian Anda dan meningkatkan kebiasaan tidur yang lebih baik. Dengan berbagai fungsi yang disesuaikan dengan kebutuhan Anda, Fossify Clock terintegrasi dengan mulus ke dalam kehidupan Anda, menawarkan kemudahan dan fleksibilitas yang tak tertandingi.
⌚ PENCATATAN WAKTU MULTIFUNGSI:
Rasakan kekuatan manajemen waktu yang serbaguna dengan Fossify Clock. Dari berfungsi sebagai widget jam hingga berfungsi sebagai jam alarm dan stopwatch, aplikasi ini adalah alat yang tepat untuk mengatur aktivitas harian Anda dan meningkatkan gaya hidup Anda secara keseluruhan.
⏰ ALARM YANG KAYA FITUR:
Bangun dengan segar dengan fitur alarm Fossify Clock yang komprehensif. Atur beberapa alarm dengan opsi seperti pemilihan hari, sakelar getar, label khusus, dan kustomisasi nada dering. Nikmati peningkatan volume secara bertahap dan tombol tunda yang dapat disesuaikan untuk pengalaman bangun yang menyenangkan. Dengan antarmuka yang ramah pengguna, mengatur alarm tidak pernah semudah ini.
⏱️ STOPWATCH YANG NYAMAN:
Lacak aktivitas Anda dengan presisi menggunakan fungsi stopwatch Fossify Clock. Ukur periode yang lebih lama atau putaran individual dengan mudah. Anda juga dapat mengurutkan putaran Anda dalam urutan menaik atau menurun.
⏳ FUNGSI PENGATUR WAKTU YANG TEPAT:
Tetaplah fokus pada tugas Anda dengan fitur pengatur waktu serbaguna Fossify Clock. Sesuaikan preferensi nada dering, alihkan getaran, dan jeda hitung mundur sesuai kebutuhan Anda. Baik Anda mengatur waktu memasak, mengatur sesi belajar, atau memastikan waktu istirahat tepat waktu, Fossify Clock siap membantu Anda dengan presisi dan mudah.
🌈 WIDGET JAM DENGAN FITUR YANG DAPAT DISESUAIKAN:
Ubah layar beranda Anda dengan widget jam Fossify Clock yang dapat disesuaikan. Sesuaikan warna teks, warna latar belakang, dan transparansi. Pilih antara jam analog atau digital yang sesuai dengan gaya Anda dan akses informasi waktu penting dengan mudah dalam sekejap.
🎨 ANTARMUKA DAN TEMA YANG DAPAT DISESUAIKAN:
Nikmati pengalaman yang dipersonalisasi dengan desain material dan opsi tema gelap Fossify Clock. Sesuaikan aplikasi dengan preferensi Anda dengan warna dan tema yang dapat disesuaikan, yang meningkatkan kegunaan dan mengurangi ketegangan mata, terutama di lingkungan dengan cahaya redup.
🔒 PENDEKATAN YANG MENGUTAMAKAN PRIVASI:
Yakinlah bahwa privasi Anda terlindungi dengan operasi offline Fossify Clock. Rasakan privasi, keamanan, dan stabilitas maksimum tanpa mengorbankan fungsionalitas atau kenyamanan.
🌐 BEBAS IKLAN & BERSUMBER TERBUKA:
Ucapkan selamat tinggal pada iklan yang mengganggu dan izin yang tidak perlu. Fossify Clock bebas iklan, sepenuhnya open-source, dan memberi Anda kendali penuh atas pengalaman pencatatan waktu Anda.
Tingkatkan keterampilan manajemen waktu Anda, optimalkan rutinitas Anda, dan prioritaskan tidur yang lebih baik dengan Fossify Clock. Unduh sekarang dan kendalikan waktu Anda seperti yang belum pernah terjadi sebelumnya.
Jelajahi lebih banyak aplikasi Fossify: https://www.fossify.org
Kode Sumber Terbuka: https://www.github.com/FossifyOrg
Bergabunglah dengan komunitas di Reddit: https://www.reddit.com/r/Fossify
Terhubung di Telegram: https://t.me/Fossify

View File

@@ -1 +1 @@
Kombinasi widget jam yang indah, jam alarm, stopwatch, pengatur waktu
Aplikasi jam yang praktis, ringan, bersumber terbuka dengan fitur-fitur penting.

View File

@@ -0,0 +1 @@
* Versione iniziale.

View File

@@ -0,0 +1,32 @@
Orologio Fossify è l'ultimo compagno per la misurazione dell'ora, progettato per migliorare le tue abitudini quotidiane e favorire un sonno migliore. Con una moltitudine di funzioni adatte alle tue esigenze, Orologio Fossify si integra perfettamente nella tua vita, offrendo una comodità e una versatilità senza pari.
⌚ CRONOMETRAGGIO MULTIFUNZIONALE:
Sperimenta la potenza di una gestione versatile del tempo con Orologio Fossify. Dal widget dell'orologio alla sveglia e al cronometro, questa applicazione è lo strumento ideale per regolare le attività quotidiane e migliorare lo stile di vita generale.
⏰ SVEGLIA RICCA DI FUNZIONI:
Svegliati rinfrescato con le funzioni di sveglia complete di Orologio Fossify. Imposta più sveglie con opzioni come la selezione del giorno, l'attivazione della vibrazione, le etichette personalizzate e la personalizzazione della suoneria. L'aumento graduale del volume e il pulsante snooze personalizzabile garantiscono una piacevole esperienza di risveglio. Grazie all'interfaccia intuitiva, impostare le sveglie non è mai stato così facile.
⏱️ COMODO CRONOMETRO:
Traccia le tue attività con precisione grazie alla funzione cronometro di Orologio Fossify. Misura periodi più lunghi o singoli giri senza fatica. È anche possibile ordinare i giri in ordine crescente o decrescente.
⏳ FUNZIONALITÀ DI TIMER PRECISO:
Rimani in cima alle tue attività con la versatile funzione timer di Orologio Fossify. Personalizza le preferenze della suoneria, attiva le vibrazioni e metti in pausa i conti alla rovescia in base alle tue esigenze. Che si tratti di cronometrare gli intervalli di cottura, di gestire le sessioni di studio o di garantire pause tempestive, Orologio Fossify ti copre con precisione e facilità.
🌈 WIDGET OROLOGIO CON FUNZIONI PERSONALIZZABILI:
Trasforma la tua schermata iniziale con il widget orologio personalizzabile di Orologio Fossify. Regola il colore del testo, il colore dello sfondo e la trasparenza. Scegli tra orologio analogico o digitale per adattarlo al tuo stile e accedi facilmente alle informazioni essenziali sull'ora con un solo sguardo.
🎨 INTERFACCIA E TEMI PERSONALIZZABILI:
Goditi un'esperienza personalizzata con il material design di Orologio Fossify e le opzioni dei temi scuri. Adatta l'app alle tue preferenze con colori e temi personalizzabili, migliorando l'usabilità e riducendo l'affaticamento degli occhi, soprattutto in ambienti con scarsa illuminazione.
🔒 APPROCCIO ORIENTATO ALLA PRIVACY:
Sii certo che la tua privacy è protetta grazie al funzionamento offline di Orologio Fossify. Sperimenta la massima privacy, sicurezza e stabilità senza sacrificare la funzionalità o la convenienza.
🌐 SENZA PUBBLICITÀ E OPEN-SOURCE:
Di' addio agli annunci invadenti e alle autorizzazioni non necessarie. Orologio Fossify è privo di pubblicità, completamente open-source e ti garantisce il controllo completo della tua esperienza di misurazione del tempo.
Migliora le tue capacità di gestione del tempo, ottimizza le tue routine e dai priorità a un sonno migliore con Orologio Fossify. Scaricalo subito e prendiil controllo del tuo tempo come mai prima d'ora.
Esplora altre applicazioni Fossify: https://www.fossify.org
Codice open-source: https://www.github.com/FossifyOrg
Unisciti alla comunità su Reddit: https://www.reddit.com/r/Fossify
Connettiti su Telegram: https://t.me/Fossify

View File

@@ -0,0 +1 @@
Un'app per l'orologio pratica, leggera e open-source con funzioni essenziali.

View File

@@ -0,0 +1 @@
Orologio Fossify

View File

@@ -0,0 +1 @@
* 初公開。

View File

@@ -0,0 +1 @@
Fossify時計

View File

@@ -0,0 +1 @@
Handige, lichtgewicht opensource klok met alle essentiële functies.

View File

@@ -0,0 +1,32 @@
Przedstawiamy Fossify Clock najlepszy towarzysz mierzący czas zaprojektowany w celu usprawnienia Twoich codziennych czynności i promowania lepszych nawyków związanych ze snem. Dzięki mnóstwu funkcji dostosowanych do Twoich potrzeb Fossify Clock bezproblemowo integruje się z Twoim życiem, oferując niezrównaną wygodę i wszechstronność.
⌚ WIELOFUNKCYJNY POMIAR CZASU:
Doświadcz mocy wszechstronnego zarządzania czasem z Fossify Clock. Od bycia widżetem zegara po funkcjonowanie jako alarm i stoper aplikacja ta jest Twoim podstawowym narzędziem do regulowania codziennych aktywności i poprawy Twojego ogólnego stylu życia.
⏰ BOGATY W FUNKCJE ALARM:
Obudź się wypoczęty(-a) dzięki kompleksowym funkcjom alarmu Fossify Clock. Ustaw wiele alarmów z opcjami takimi jak wybór dnia, przełączanie wibracji, niestandardowe etykiety i dostosowywanie dzwonka. Ciesz się stopniowym zwiększaniem głośności i konfigurowalnym przyciskiem drzemki, aby zapewnić przyjemne budzenie się. Dzięki przyjaznemu dla użytkownika interfejsowi ustawianie alarmów nigdy nie było prostsze.
⏱️ WYGODNY STOPER:
Śledź swoje aktywności z precyzją, korzystając z funkcji stopera Fossify Clock. Bezproblemowo mierz dłuższe okresy lub pojedyncze okrążenia. Możesz także sortować swoje okrążenia w kolejności rosnącej lub malejącej.
⏳ PRECYZYJNA FUNKCJA MINUTNIKA:
Bądź na bieżąco ze swoimi zadaniami dzięki wszechstronnej funkcji minutnika Fossify Clock. Dostosowuj preferencje dzwonka, przełączaj wibracje i wstrzymuj odliczanie, aby dopasować je do swoich potrzeb. Niezależnie od tego, czy odmierzasz czas gotowania, zarządzasz czasem uczenia się, czy zapewniasz sobie chwilowe przerwy, Fossify Clock zapewni Ci precyzję i łatwość.
🌈 WIDŻET ZEGARA Z KONFIGUROWALNYMI FUNKCJAMI:
Zmień swój ekran główny za pomocą konfigurowalnego widżetu zegara Fossify Clock. Dostosuj kolor tekstu, kolor tła i przezroczystość. Wybierz między zegarem analogowym a cyfrowym, aby dopasować go do Twojego stylu i łatwo uzyskać dostęp do najważniejszych informacji o czasie w mgnieniu oka.
🎨 KONFIGUROWALNY INTERFEJS I MOTYWY:
Ciesz się spersonalizowanym doświadczeniem Fossify Clock dzięki Material Design i opcjom ciemnego motywu. Dostosuj aplikację do swoich preferencji dzięki konfigurowalnym kolorom i motywom, ulepszając użyteczność i redukując zmęczenie oczu szczególnie w warunkach słabego oświetlenia.
🔒 PRZEDE WSZYSTKIM PRYWATNOŚĆ:
Miej pewność, że Twoja prywatność jest chroniona, dzięki działaniu offline Fossify Clock. Doświadcz maksymalnej prywatności, bezpieczeństwa i stabilności bez poświęcania funkcjonalności i wygody.
🌐 BEZ REKLAM I OTWARTOŹRÓDŁOWOŚĆ:
Pożegnaj natrętne reklamy i niepotrzebne uprawnienia. Fossify Clock jest wolny od reklam, w pełni otwartoźródłowy i zapewnia Ci pełną kontrolę nad doświadczeniem pomiaru czasu.
Ulepsz swoje umiejętności zarządzania czasem, zoptymalizuj swoje rutyny i nadaj priorytet lepszemu snu z Fossify Clock. Pobierz teraz i przejmij kontrolę nad swoim czasem jak nigdy dotąd.
Odkryj więcej aplikacji od Fossify: https://www.fossify.org
Kod źródłowy: https://www.github.com/FossifyOrg
Dołącz do społeczności na Reddicie: https://www.reddit.com/r/Fossify
Połącz się na Telegramie: https://t.me/Fossify

View File

@@ -0,0 +1 @@
Poręczna, lekka, otwartoźródłowa aplikacja zegara z niezbędnymi funkcjami

View File

@@ -0,0 +1 @@
Fossify Clock

View File

@@ -0,0 +1 @@
* Versão inicial.

View File

@@ -0,0 +1,32 @@
Introducindo o Relógio Fossify - o companheiro definito para gerencimento de tempo, para melhorar suas rotinas diárias e motivar hábitos de sono melhores. Com uma multitude de funções feitas com suas necessidades em mente, o Relógio Fossify integra diretamente à sua vida, oferecendo conveniência e versatilidade excepcionais.
⌚ MULTIFUNCTIONAL TIMEKEEPING:
Experience the power of versatile time management with Fossify Clock. From serving as a clock widget to functioning as an alarm clock and stopwatch, this app is your go-to tool for regulating your daily activities and improving your overall lifestyle.
⏰ FEATURE-RICH ALARM:
Wake up refreshed with Fossify Clock's comprehensive alarm features. Set multiple alarms with options like day selection, vibration toggle, custom labels and ringtone customization. Enjoy gradual volume increase and a customizable snooze button for a pleasant waking experience. With a user-friendly interface, setting up alarms has never been easier.
⏱️ CONVENIENT STOPWATCH:
Track your activities with precision using Fossify Clock's stopwatch function. Measure longer periods or individual laps effortlessly. You can also sort your laps in ascending or descending order.
⏳ PRECISE TIMER FUNCTIONALITY:
Stay on top of your tasks with Fossify Clock's versatile timer feature. Customize ringtone preferences, toggle vibrations, and pause countdowns to suit your needs. Whether you're timing cooking intervals, managing study sessions, or ensuring timely breaks, Fossify Clock has you covered with precision and ease.
🌈 CLOCK WIDGET WITH CUSTOMIZABLE FEATURES:
Transform your home screen with Fossify Clock's customizable clock widget. Adjust text color, background color, and transparency. Choose between analog or digital clock to suit your style and easily access essential time information at a glance.
🎨 CUSTOMIZABLE INTERFACE AND THEMES:
Enjoy a personalized experience with Fossify Clock's material design and dark theme options. Tailor the app to your preferences with customizable colors and themes, enhancing usability and reducing eye strain, especially in low-light environments.
🔒 PRIVACY-FIRST APPROACH:
Rest assured knowing your privacy is protected with Fossify Clock's offline operation. Experience maximum privacy, security, and stability without sacrificing functionality or convenience.
🌐 AD-FREE & OPEN-SOURCE:
Say goodbye to intrusive ads and unnecessary permissions. Fossify Clock is ad-free, fully open-source, and grants you complete control over your timekeeping experience.
Upgrade your time management skills, optimize your routines, and prioritize better sleep with Fossify Clock. Download now and take control of your time like never before.
Explore more Fossify apps: https://www.fossify.org
Open-Source Code: https://www.github.com/FossifyOrg
Join the community on Reddit: https://www.reddit.com/r/Fossify
Connect on Telegram: https://t.me/Fossify

View File

@@ -0,0 +1 @@
Um app de relógio de código aberto, útil, leve e com funções essenciais.

View File

@@ -0,0 +1 @@
Relógio Fossify

View File

@@ -0,0 +1 @@
* Initial version.

View File

@@ -0,0 +1 @@
Användbar och minimalistisk klockapp med öppen källkod.

View File

@@ -0,0 +1 @@
Fossify Clock

View File

@@ -0,0 +1 @@
* İlk sürüm.

Some files were not shown because too many files have changed in this diff Show More