From 2e78d675291890f53b9333b0c0bdb2d08b095be8 Mon Sep 17 00:00:00 2001 From: Paul Akhamiogu Date: Fri, 3 Sep 2021 19:42:25 +0100 Subject: [PATCH] ref: change timer UI to use RecyclerView - update commons library --- app/build.gradle | 2 +- .../clock/adapters/TimerAdapter.kt | 129 +++++++++++++----- .../clock/fragments/TimerFragment.kt | 121 ++++------------ .../clock/helpers/TimerHelper.kt | 1 - .../clock/interfaces/TimerDao.kt | 2 +- .../clock/services/TimerService.kt | 12 +- app/src/main/res/drawable/ic_add_vector.xml | 11 -- app/src/main/res/layout/fragment_timer.xml | 93 +++---------- app/src/main/res/layout/item_timer.xml | 46 ++++++- app/src/main/res/values-az/strings.xml | 1 + app/src/main/res/values-cs/strings.xml | 1 + app/src/main/res/values-cy/strings.xml | 1 + app/src/main/res/values-da/strings.xml | 1 + app/src/main/res/values-de/strings.xml | 1 + app/src/main/res/values-el/strings.xml | 1 + app/src/main/res/values-es/strings.xml | 1 + app/src/main/res/values-eu/strings.xml | 1 + app/src/main/res/values-fi/strings.xml | 1 + app/src/main/res/values-fr/strings.xml | 1 + app/src/main/res/values-hr/strings.xml | 1 + app/src/main/res/values-id/strings.xml | 1 + app/src/main/res/values-in/strings.xml | 1 + app/src/main/res/values-it/strings.xml | 1 + app/src/main/res/values-ja/strings.xml | 1 + app/src/main/res/values-lt/strings.xml | 1 + app/src/main/res/values-ml/strings.xml | 1 + app/src/main/res/values-nb/strings.xml | 1 + app/src/main/res/values-nl/strings.xml | 1 + app/src/main/res/values-pl/strings.xml | 1 + app/src/main/res/values-pt/strings.xml | 1 + app/src/main/res/values-ru/strings.xml | 1 + app/src/main/res/values-sk/strings.xml | 1 + app/src/main/res/values-sv/strings.xml | 1 + app/src/main/res/values-tr/strings.xml | 1 + app/src/main/res/values-uk/strings.xml | 1 + app/src/main/res/values-zh-rCN/strings.xml | 1 + app/src/main/res/values-zh-rTW/strings.xml | 1 + app/src/main/res/values/strings.xml | 1 + 38 files changed, 219 insertions(+), 227 deletions(-) delete mode 100644 app/src/main/res/drawable/ic_add_vector.xml diff --git a/app/build.gradle b/app/build.gradle index a49054bf..6a149577 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -67,7 +67,7 @@ android { } dependencies { - implementation 'com.github.SimpleMobileTools:Simple-Commons:ac45c5e893' + implementation 'com.github.SimpleMobileTools:Simple-Commons:554dda71a4' implementation 'com.facebook.stetho:stetho:1.5.0' implementation 'androidx.constraintlayout:constraintlayout:2.0.4' implementation 'com.shawnlin:number-picker:2.4.6' diff --git a/app/src/main/kotlin/com/simplemobiletools/clock/adapters/TimerAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/clock/adapters/TimerAdapter.kt index 4a920f11..cd86c346 100644 --- a/app/src/main/kotlin/com/simplemobiletools/clock/adapters/TimerAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/clock/adapters/TimerAdapter.kt @@ -1,5 +1,6 @@ package com.simplemobiletools.clock.adapters +import android.graphics.Color import android.media.AudioManager import android.media.RingtoneManager import android.view.LayoutInflater @@ -14,13 +15,13 @@ import com.simplemobiletools.clock.dialogs.MyTimePickerDialogDialog import com.simplemobiletools.clock.extensions.* import com.simplemobiletools.clock.helpers.PICK_AUDIO_FILE_INTENT_ID import com.simplemobiletools.clock.models.Timer +import com.simplemobiletools.clock.models.TimerEvent import com.simplemobiletools.clock.models.TimerState import com.simplemobiletools.commons.dialogs.SelectAlarmSoundDialog -import com.simplemobiletools.commons.extensions.getDefaultAlarmSound -import com.simplemobiletools.commons.extensions.getFormattedDuration -import com.simplemobiletools.commons.extensions.onTextChangeListener +import com.simplemobiletools.commons.extensions.* import com.simplemobiletools.commons.models.AlarmSound import kotlinx.android.synthetic.main.item_timer.view.* +import org.greenrobot.eventbus.EventBus class TimerAdapter( private val activity: SimpleActivity, @@ -39,6 +40,15 @@ class TimerAdapter( } } + private val config = activity.config + private var textColor = config.textColor + private var primaryColor = config.primaryColor + private var adjustedPrimaryColor = activity.getAdjustedPrimaryColor() + private var contrastColor = adjustedPrimaryColor.getContrastColor() + private var backgroundColor = config.backgroundColor + + private var selectedTimer: Timer? = null + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): TimerViewHolder { return TimerViewHolder(LayoutInflater.from(parent.context).inflate(R.layout.item_timer, parent, false)) } @@ -47,52 +57,78 @@ class TimerAdapter( holder.bind(getItem(position)) } - fun getItemAt(position: Int): Timer { - return getItem(position) + fun updateTextColor(textColor: Int) { + this.textColor = textColor + onRefresh.invoke() + } + + fun updatePrimaryColor(primaryColor: Int) { + this.primaryColor = primaryColor + adjustedPrimaryColor = activity.getAdjustedPrimaryColor() + contrastColor = adjustedPrimaryColor.getContrastColor() + onRefresh.invoke() } inner class TimerViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { init { itemView.timer_label.onTextChangeListener { text -> - updateTimer(getItemAt(adapterPosition).copy(label = text), false) + updateTimer(getItem(adapterPosition).copy(label = text), false) } - itemView.post { - val textColor = activity.config.textColor - itemView.timer_initial_time.colorLeftDrawable(textColor) - itemView.timer_vibrate.colorLeftDrawable(textColor) - itemView.timer_sound.colorLeftDrawable(textColor) - } } fun bind(timer: Timer) { itemView.apply { + post { + timer_initial_time.colorLeftDrawable(textColor) + timer_vibrate.colorLeftDrawable(textColor) + timer_label_image.applyColorFilter(textColor) + timer_sound.colorLeftDrawable(textColor) + timer_play_pause.background = activity.resources.getColoredDrawableWithColor(R.drawable.circle_background_filled, adjustedPrimaryColor) + timer_play_pause.applyColorFilter(if (adjustedPrimaryColor == Color.WHITE) Color.BLACK else Color.WHITE) + timer_reset.applyColorFilter(textColor) + timer_delete.applyColorFilter(textColor) + } + timer_label.setTextColor(textColor) + timer_label.setHintTextColor(textColor.adjustAlpha(0.7f)) //only update when different to prevent flickering and unnecessary updates if (timer_label.text.toString() != timer.label) { timer_label.setText(timer.label) } timer_initial_time.text = timer.seconds.getFormattedDuration() + timer_initial_time.setTextColor(textColor) timer_vibrate.isChecked = timer.vibrate + timer_vibrate.setTextColor(textColor) + timer_vibrate.setColors(textColor, adjustedPrimaryColor, backgroundColor) + timer_vibrate_holder.setOnClickListener { + timer_vibrate.toggle() + updateTimer(timer.copy(vibrate = timer_vibrate.isChecked, channelId = null), false) + } - timer_sound.text = timer.soundTitle - + timer_time.setTextColor(textColor) + timer_time.text = when (timer.state) { + is TimerState.Finished -> 0.getFormattedDuration() + is TimerState.Idle -> timer.seconds.getFormattedDuration() + is TimerState.Paused -> timer.state.tick.getFormattedDuration() + is TimerState.Running -> timer.state.tick.getFormattedDuration() + } timer_time.setOnClickListener { changeDuration(timer) } + timer_initial_time.setTextColor(textColor) timer_initial_time.setOnClickListener { changeDuration(timer) } - timer_vibrate_holder.setOnClickListener { - timer_vibrate.toggle() - updateTimer(timer.copy(vibrate = timer_vibrate.isChecked), false) - } + timer_sound.text = timer.soundTitle + timer_sound.setTextColor(textColor) timer_sound.setOnClickListener { + selectedTimer = timer SelectAlarmSoundDialog(activity, timer.soundUri, AudioManager.STREAM_ALARM, PICK_AUDIO_FILE_INTENT_ID, RingtoneManager.TYPE_ALARM, true, onAlarmPicked = { sound -> @@ -110,26 +146,39 @@ class TimerAdapter( }) } - - when (timer.state) { - is TimerState.Finished -> { - timer_time.text = 0.getFormattedDuration() - } - - is TimerState.Idle -> { - timer_time.text = timer.seconds.getFormattedDuration() - } - - is TimerState.Paused -> { - timer_time.text = timer.state.tick.getFormattedDuration() - } - - is TimerState.Running -> { - timer_time.text = timer.state.tick.getFormattedDuration() + timer_delete.applyColorFilter(textColor) + timer_delete.setOnClickListener { + activity.timerHelper.deleteTimer(timer.id!!) { + onRefresh.invoke() } } + + timer_reset.applyColorFilter(textColor) + timer_reset.setOnClickListener { + stopTimer(timer) + } + + + timer_play_pause.setOnClickListener { + when (val state = timer.state) { + is TimerState.Idle -> EventBus.getDefault().post(TimerEvent.Start(timer.id!!, timer.seconds.secondsToMillis)) + is TimerState.Paused -> EventBus.getDefault().post(TimerEvent.Start(timer.id!!, state.tick)) + is TimerState.Running -> EventBus.getDefault().post(TimerEvent.Pause(timer.id!!, state.tick)) + is TimerState.Finished -> EventBus.getDefault().post(TimerEvent.Start(timer.id!!, timer.seconds.secondsToMillis)) + } + } + updateViewStates(timer.state) } } + + private fun updateViewStates(state: TimerState) { + val resetPossible = state is TimerState.Running || state is TimerState.Paused || state is TimerState.Finished + itemView.timer_reset.beInvisibleIf(!resetPossible) + itemView.timer_delete.beInvisibleIf(!(!resetPossible && itemCount > 1)) + val drawableId = if (state is TimerState.Running) R.drawable.ic_pause_vector else R.drawable.ic_play_vector + val iconColor = if (adjustedPrimaryColor == Color.WHITE) Color.BLACK else Color.WHITE + itemView.timer_play_pause.setImageDrawable(activity.resources.getColoredDrawableWithColor(drawableId, iconColor)) + } } private fun changeDuration(timer: Timer) { @@ -139,15 +188,25 @@ class TimerAdapter( } } + fun updateAlarmSoundForSelectedTimer(alarmSound: AlarmSound) { + selectedTimer?.let { updateAlarmSound(it, alarmSound) } + } + fun updateAlarmSound(timer: Timer, alarmSound: AlarmSound) { updateTimer(timer.copy(soundTitle = alarmSound.title, soundUri = alarmSound.uri, channelId = null)) } private fun updateTimer(timer: Timer, refresh: Boolean = true) { - activity.timerHelper.insertOrUpdateTimer(timer){ + activity.timerHelper.insertOrUpdateTimer(timer) { if (refresh) { onRefresh.invoke() } } } + + private fun stopTimer(timer: Timer) { + EventBus.getDefault().post(TimerEvent.Reset(timer.id!!, timer.seconds.secondsToMillis)) + activity.hideTimerNotification() + } + } diff --git a/app/src/main/kotlin/com/simplemobiletools/clock/fragments/TimerFragment.kt b/app/src/main/kotlin/com/simplemobiletools/clock/fragments/TimerFragment.kt index 7568a84f..ef8e7fd8 100644 --- a/app/src/main/kotlin/com/simplemobiletools/clock/fragments/TimerFragment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/clock/fragments/TimerFragment.kt @@ -1,26 +1,22 @@ package com.simplemobiletools.clock.fragments -import android.graphics.Color import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.fragment.app.Fragment -import androidx.viewpager2.widget.ViewPager2 import com.simplemobiletools.clock.R import com.simplemobiletools.clock.activities.SimpleActivity import com.simplemobiletools.clock.adapters.TimerAdapter import com.simplemobiletools.clock.extensions.config -import com.simplemobiletools.clock.extensions.hideTimerNotification -import com.simplemobiletools.clock.extensions.secondsToMillis import com.simplemobiletools.clock.extensions.timerHelper -import com.simplemobiletools.clock.models.Timer import com.simplemobiletools.clock.models.TimerEvent -import com.simplemobiletools.clock.models.TimerState -import com.simplemobiletools.commons.extensions.* +import com.simplemobiletools.commons.extensions.hideKeyboard +import com.simplemobiletools.commons.extensions.updateTextColors import com.simplemobiletools.commons.models.AlarmSound -import kotlinx.android.synthetic.main.fragment_timer.timer_view_pager -import kotlinx.android.synthetic.main.fragment_timer.view.* +import kotlinx.android.synthetic.main.fragment_timer.timer_fragment +import kotlinx.android.synthetic.main.fragment_timer.view.timer_add +import kotlinx.android.synthetic.main.fragment_timer.view.timers_list import org.greenrobot.eventbus.EventBus import org.greenrobot.eventbus.Subscribe import org.greenrobot.eventbus.ThreadMode @@ -30,6 +26,7 @@ class TimerFragment : Fragment() { private lateinit var view: ViewGroup private lateinit var timerAdapter: TimerAdapter private var timerPositionToScrollTo = INVALID_POSITION + private var storedTextColor = 0 override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -47,22 +44,10 @@ class TimerFragment : Fragment() { refreshTimers() } - timer_view_pager.adapter = timerAdapter - //set empty page transformer to disable item animations - timer_view_pager.setPageTransformer { _, _ -> } - timer_view_pager.registerOnPageChangeCallback(object : ViewPager2.OnPageChangeCallback() { - override fun onPageSelected(position: Int) { - updateViews(position) - } - }) - - activity?.let { - val textColor = it.config.textColor - indicator_view.setSelectedDotColor(textColor) - indicator_view.setDotColor(textColor.adjustAlpha(0.5f)) - indicator_view.attachToPager(timer_view_pager) - } + storeStateVariables() + timers_list.adapter = timerAdapter + timers_list.itemAnimator = null timer_add.setOnClickListener { activity?.hideKeyboard(it) @@ -71,70 +56,43 @@ class TimerFragment : Fragment() { } } - activity?.updateTextColors(timer_fragment) - - val textColor = requireContext().config.textColor - timer_play_pause.background = - resources.getColoredDrawableWithColor(R.drawable.circle_background_filled, requireActivity().getAdjustedPrimaryColor()) - timer_play_pause.applyColorFilter(if (activity?.getAdjustedPrimaryColor() == Color.WHITE) Color.BLACK else Color.WHITE) - timer_reset.applyColorFilter(textColor) - - timer_play_pause.setOnClickListener { - val timer = timerAdapter.getItemAt(timer_view_pager.currentItem) - when (val state = timer.state) { - is TimerState.Idle -> EventBus.getDefault().post(TimerEvent.Start(timer.id!!, timer.seconds.secondsToMillis)) - is TimerState.Paused -> EventBus.getDefault().post(TimerEvent.Start(timer.id!!, state.tick)) - is TimerState.Running -> EventBus.getDefault().post(TimerEvent.Pause(timer.id!!, state.tick)) - is TimerState.Finished -> EventBus.getDefault().post(TimerEvent.Start(timer.id!!, timer.seconds.secondsToMillis)) - } - } - - timer_reset.setOnClickListener { - val timer = timerAdapter.getItemAt(timer_view_pager.currentItem) - stopTimer(timer) - } - - timer_delete.setOnClickListener { - val timer = timerAdapter.getItemAt(timer_view_pager.currentItem) - activity?.timerHelper?.deleteTimer(timer.id!!) { - refreshTimers() - } - } - refreshTimers() } return view } - private fun updateViews(position: Int) { - activity?.runOnUiThread { - if (timerAdapter.itemCount > position) { - val timer = timerAdapter.getItemAt(position) - updateViewStates(timer.state) - view.timer_play_pause.beVisible() - } + override fun onResume() { + super.onResume() + requireContext().updateTextColors(timer_fragment) + val configTextColor = requireContext().config.textColor + if (storedTextColor != configTextColor) { + (view.timers_list.adapter as TimerAdapter).updateTextColor(configTextColor) } } + override fun onPause() { + super.onPause() + storeStateVariables() + } + + private fun refreshTimers(scrollToLatest: Boolean = false) { activity?.timerHelper?.getTimers { timers -> timerAdapter.submitList(timers) { - view.timer_view_pager.post { + view.timers_list.post { if (timerPositionToScrollTo != INVALID_POSITION && timerAdapter.itemCount > timerPositionToScrollTo) { - view.timer_view_pager.setCurrentItem(timerPositionToScrollTo, false) + view.timers_list.scrollToPosition(timerPositionToScrollTo) timerPositionToScrollTo = INVALID_POSITION } else if (scrollToLatest) { - view.timer_view_pager.setCurrentItem(0, false) + view.timers_list.scrollToPosition(timers.lastIndex) } - updateViews(timer_view_pager.currentItem) } } } } - private fun stopTimer(timer: Timer) { - EventBus.getDefault().post(TimerEvent.Reset(timer.id!!, timer.seconds.secondsToMillis)) - activity?.hideTimerNotification() + private fun storeStateVariables() { + storedTextColor = requireContext().config.textColor } @Subscribe(threadMode = ThreadMode.MAIN) @@ -142,31 +100,8 @@ class TimerFragment : Fragment() { refreshTimers() } - private fun updateViewStates(state: TimerState) { - val resetPossible = state is TimerState.Running || state is TimerState.Paused || state is TimerState.Finished - view.timer_reset.beInvisibleIf(!resetPossible) - view.timer_delete.beInvisibleIf(!(!resetPossible && timerAdapter.itemCount > 1)) - - val drawableId = if (state is TimerState.Running) { - R.drawable.ic_pause_vector - } else { - R.drawable.ic_play_vector - } - - val iconColor = if (activity?.getAdjustedPrimaryColor() == Color.WHITE) { - Color.BLACK - } else { - Color.WHITE - } - - view.timer_play_pause.setImageDrawable(resources.getColoredDrawableWithColor(drawableId, iconColor)) - } - fun updateAlarmSound(alarmSound: AlarmSound) { - val timer = timerAdapter.getItemAt(timer_view_pager.currentItem) - activity?.timerHelper?.insertOrUpdateTimer(timer.copy(soundTitle = alarmSound.title, soundUri = alarmSound.uri)) { - refreshTimers() - } + timerAdapter.updateAlarmSoundForSelectedTimer(alarmSound) } fun updatePosition(timerId: Long) { @@ -175,7 +110,7 @@ class TimerFragment : Fragment() { if (position != INVALID_POSITION) { activity?.runOnUiThread { if (timerAdapter.itemCount > position) { - view.timer_view_pager.setCurrentItem(position, false) + view.timers_list.scrollToPosition(position) } else { timerPositionToScrollTo = position } diff --git a/app/src/main/kotlin/com/simplemobiletools/clock/helpers/TimerHelper.kt b/app/src/main/kotlin/com/simplemobiletools/clock/helpers/TimerHelper.kt index 433d7e0d..fb6771d4 100644 --- a/app/src/main/kotlin/com/simplemobiletools/clock/helpers/TimerHelper.kt +++ b/app/src/main/kotlin/com/simplemobiletools/clock/helpers/TimerHelper.kt @@ -51,7 +51,6 @@ class TimerHelper(val context: Context) { channelId = config.timerChannelId, ) ) - callback.invoke() } } diff --git a/app/src/main/kotlin/com/simplemobiletools/clock/interfaces/TimerDao.kt b/app/src/main/kotlin/com/simplemobiletools/clock/interfaces/TimerDao.kt index 133c8320..fd64f8d2 100644 --- a/app/src/main/kotlin/com/simplemobiletools/clock/interfaces/TimerDao.kt +++ b/app/src/main/kotlin/com/simplemobiletools/clock/interfaces/TimerDao.kt @@ -9,7 +9,7 @@ import com.simplemobiletools.clock.models.Timer @Dao interface TimerDao { - @Query("SELECT * FROM timers ORDER BY createdAt DESC") + @Query("SELECT * FROM timers ORDER BY createdAt ASC") fun getTimers(): List @Query("SELECT * FROM timers WHERE id=:id") diff --git a/app/src/main/kotlin/com/simplemobiletools/clock/services/TimerService.kt b/app/src/main/kotlin/com/simplemobiletools/clock/services/TimerService.kt index 46e94413..40996000 100644 --- a/app/src/main/kotlin/com/simplemobiletools/clock/services/TimerService.kt +++ b/app/src/main/kotlin/com/simplemobiletools/clock/services/TimerService.kt @@ -49,15 +49,9 @@ class TimerService : Service() { val firstTimer = runningTimers.first() val formattedDuration = (firstTimer.state as TimerState.Running).tick.getFormattedDuration() val contextText = when { - runningTimers.size > 1 -> { - getString(R.string.timer_multiple_notification_msg, runningTimers.size) - } - firstTimer.label.isNotEmpty() -> { - getString(R.string.timer_single_notification_label_msg, firstTimer.label) - } - else -> { - getString(R.string.timer_single_notification_msg, runningTimers.size) - } + runningTimers.size > 1 -> getString(R.string.timer_multiple_notification_msg, runningTimers.size) + firstTimer.label.isNotEmpty() -> getString(R.string.timer_single_notification_label_msg, firstTimer.label) + else -> getString(R.string.timer_single_notification_msg, runningTimers.size) } startForeground(TIMER_RUNNING_NOTIF_ID, notification(formattedDuration, contextText, firstTimer.id!!)) } diff --git a/app/src/main/res/drawable/ic_add_vector.xml b/app/src/main/res/drawable/ic_add_vector.xml deleted file mode 100644 index ccd06b3c..00000000 --- a/app/src/main/res/drawable/ic_add_vector.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - diff --git a/app/src/main/res/layout/fragment_timer.xml b/app/src/main/res/layout/fragment_timer.xml index 10865841..cc93fea1 100644 --- a/app/src/main/res/layout/fragment_timer.xml +++ b/app/src/main/res/layout/fragment_timer.xml @@ -6,87 +6,32 @@ android:layout_width="match_parent" android:layout_height="match_parent"> - + app:layout_constraintTop_toTopOf="parent" + tools:itemCount="3" + tools:listitem="@layout/item_timer" /> - - - - - - - - - - - - + app:rippleColor="@color/pressed_item_foreground" /> diff --git a/app/src/main/res/layout/item_timer.xml b/app/src/main/res/layout/item_timer.xml index d4e0c7aa..1b6b4c39 100644 --- a/app/src/main/res/layout/item_timer.xml +++ b/app/src/main/res/layout/item_timer.xml @@ -3,7 +3,7 @@ xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" - android:layout_height="match_parent"> + android:layout_height="wrap_content"> + + + + + + diff --git a/app/src/main/res/values-az/strings.xml b/app/src/main/res/values-az/strings.xml index 5f379b60..b7242bcd 100644 --- a/app/src/main/res/values-az/strings.xml +++ b/app/src/main/res/values-az/strings.xml @@ -22,6 +22,7 @@ %d timers are running Timer for %s is running %d timer is running + New Timer Saat bölməsi diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index 17156571..59940686 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -22,6 +22,7 @@ %d timers are running Timer for %s is running %d timer is running + New Timer Záložka hodin diff --git a/app/src/main/res/values-cy/strings.xml b/app/src/main/res/values-cy/strings.xml index c84a6548..292bc0ce 100644 --- a/app/src/main/res/values-cy/strings.xml +++ b/app/src/main/res/values-cy/strings.xml @@ -22,6 +22,7 @@ %d timers are running Timer for %s is running %d timer is running + New Timer Tab cloc diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml index f658b461..0bb34aa7 100644 --- a/app/src/main/res/values-da/strings.xml +++ b/app/src/main/res/values-da/strings.xml @@ -22,6 +22,7 @@ %d timers are running Timer for %s is running %d timer is running + New Timer Ur diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 3b64d43b..09c45de3 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -22,6 +22,7 @@ %d timers are running Timer for %s is running %d timer is running + New Timer Uhr diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index 700ed3d6..f3484d66 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -23,6 +23,7 @@ %d timers are running Timer for %s is running %d timer is running + New Timer Ετικέτα Ρολογιού diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 4de9c65a..37b4940a 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -22,6 +22,7 @@ %d timers are running Timer for %s is running %d timer is running + New Timer Pestaña de reloj diff --git a/app/src/main/res/values-eu/strings.xml b/app/src/main/res/values-eu/strings.xml index 952f6bad..cb28eae8 100644 --- a/app/src/main/res/values-eu/strings.xml +++ b/app/src/main/res/values-eu/strings.xml @@ -22,6 +22,7 @@ %d timers are running Timer for %s is running %d timer is running + New Timer Erloju fitxa diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml index 6a8ce234..661fe387 100644 --- a/app/src/main/res/values-fi/strings.xml +++ b/app/src/main/res/values-fi/strings.xml @@ -22,6 +22,7 @@ %d timers are running Timer for %s is running %d timer is running + New Timer   Kello-välilehti diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 6635335f..76321c5e 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -22,6 +22,7 @@ %d timers are running Timer for %s is running %d timer is running + New Timer Horloge diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml index bd991217..c8501371 100644 --- a/app/src/main/res/values-hr/strings.xml +++ b/app/src/main/res/values-hr/strings.xml @@ -22,6 +22,7 @@ %d timers are running Timer for %s is running %d timer is running + New Timer Kartica sata diff --git a/app/src/main/res/values-id/strings.xml b/app/src/main/res/values-id/strings.xml index dd2447f5..79b28da0 100644 --- a/app/src/main/res/values-id/strings.xml +++ b/app/src/main/res/values-id/strings.xml @@ -22,6 +22,7 @@ %d timers are running Timer for %s is running %d timer is running + New Timer Tab jam diff --git a/app/src/main/res/values-in/strings.xml b/app/src/main/res/values-in/strings.xml index dd2447f5..79b28da0 100644 --- a/app/src/main/res/values-in/strings.xml +++ b/app/src/main/res/values-in/strings.xml @@ -22,6 +22,7 @@ %d timers are running Timer for %s is running %d timer is running + New Timer Tab jam diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 68893b2b..711d6397 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -22,6 +22,7 @@ %d timers are running Timer for %s is running %d timer is running + New Timer Scheda orologio diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 6560fd4e..2930c40b 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -22,6 +22,7 @@ %d timers are running Timer for %s is running %d timer is running + New Timer 時計 diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml index 8b4f600f..796624c4 100644 --- a/app/src/main/res/values-lt/strings.xml +++ b/app/src/main/res/values-lt/strings.xml @@ -22,6 +22,7 @@ %d timers are running Timer for %s is running %d timer is running + New Timer Laikrodžio skirtukas diff --git a/app/src/main/res/values-ml/strings.xml b/app/src/main/res/values-ml/strings.xml index 32517ac3..54ee4c5a 100644 --- a/app/src/main/res/values-ml/strings.xml +++ b/app/src/main/res/values-ml/strings.xml @@ -22,6 +22,7 @@ %d timers are running Timer for %s is running %d timer is running + New Timer ക്ലോക്ക് ടാബ് diff --git a/app/src/main/res/values-nb/strings.xml b/app/src/main/res/values-nb/strings.xml index 906aa8a6..cf5fb931 100644 --- a/app/src/main/res/values-nb/strings.xml +++ b/app/src/main/res/values-nb/strings.xml @@ -22,6 +22,7 @@ %d timers are running Timer for %s is running %d timer is running + New Timer Klokke diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index 47ae120b..884d5c77 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -22,6 +22,7 @@ %d timers are running Timer for %s is running %d timer is running + New Timer Tab Klok diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 532e786e..0e07fb25 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -22,6 +22,7 @@ %d timers are running Timer for %s is running %d timer is running + New Timer Zegar diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index db9fc791..2a5237fc 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -22,6 +22,7 @@ %d timers are running Timer for %s is running %d timer is running + New Timer Relógio diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index fb3bbf1b..88233cad 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -22,6 +22,7 @@ %d timers are running Timer for %s is running %d timer is running + New Timer Часы diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index ef249f79..6996e0a7 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -22,6 +22,7 @@ %d timers are running Timer for %s is running %d timer is running + New Timer Okno s časom diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index 9539f017..5a33469a 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -22,6 +22,7 @@ %d timers are running Timer for %s is running %d timer is running + New Timer Fliken Klocka diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index 759f7923..b1bd6367 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -22,6 +22,7 @@ %d timers are running Timer for %s is running %d timer is running + New Timer Saat sekmesi diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 3caeefdf..39dea5fa 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -22,6 +22,7 @@ %d timers are running Timer for %s is running %d timer is running + New Timer Годинник diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 4781772e..62742678 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -22,6 +22,7 @@ %d timers are running Timer for %s is running %d timer is running + New Timer 时钟页面 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index bfda24f9..9a47b674 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -22,6 +22,7 @@ %d timers are running Timer for %s is running %d timer is running + New Timer 時鐘頁面 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 869cbd33..5eda1b79 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -22,6 +22,7 @@ %d timers are running Timer for %s is running %d timer is running + New Timer Clock tab