Merge pull request #31 from SimpleMobileTools/master

upd
This commit is contained in:
solokot 2020-04-15 18:38:36 +03:00 committed by GitHub
commit e2760ebb28
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
91 changed files with 895 additions and 460 deletions

View File

@ -1,6 +1,26 @@
Changelog
==========
Version 6.9.1 *(2020-03-25)*
----------------------------
* Allow zooming the weekly view with vertical gestures
* Allow scrolling through the whole weeky view, use Start time only as the default time
* Updating the app icon
* Other stability, translation and UX improvements
Version 6.9.0 *(2020-03-18)*
----------------------------
* Remember the last used folder at ics exporting
* Do not request the Storage permission on Android 10+, use Scoped Storage
Version 6.8.5 *(2020-03-08)*
----------------------------
* Added a Go To Today menu button at the event list view too
* Some translation and stability improvements
Version 6.8.4 *(2020-02-07)*
----------------------------

View File

@ -1,5 +1,5 @@
# Simple Calendar
<img alt="Logo" src="app/src/main/res/mipmap-xxxhdpi/ic_launcher.png" width="80" />
<img alt="Logo" src="fastlane/metadata/android/en-US/images/icon.png" width="120" />
A simple calendar with events and a customizable widget.

View File

@ -18,8 +18,8 @@ android {
applicationId "com.simplemobiletools.calendar.pro"
minSdkVersion 21
targetSdkVersion 29
versionCode 171
versionName "6.8.4"
versionCode 174
versionName "6.9.1"
multiDexEnabled true
setProperty("archivesBaseName", "calendar")
vectorDrawables.useSupportLibrary = true
@ -64,12 +64,12 @@ android {
}
dependencies {
implementation 'com.simplemobiletools:commons:5.22.7'
implementation 'com.simplemobiletools:commons:5.23.10'
implementation 'joda-time:joda-time:2.10.1'
implementation 'androidx.multidex:multidex:2.0.1'
implementation 'androidx.constraintlayout:constraintlayout:2.0.0-beta2'
implementation 'androidx.constraintlayout:constraintlayout:2.0.0-beta4'
kapt 'androidx.room:room-compiler:2.2.2'
implementation 'androidx.room:room-runtime:2.2.2'
annotationProcessor 'androidx.room:room-compiler:2.2.2'
kapt 'androidx.room:room-compiler:2.2.4'
implementation 'androidx.room:room-runtime:2.2.4'
annotationProcessor 'androidx.room:room-compiler:2.2.4'
}

View File

@ -6,12 +6,16 @@
android:installLocation="auto">
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_CONTACTS"/>
<uses-permission android:name="android.permission.VIBRATE"/>
<uses-permission android:name="android.permission.READ_CALENDAR"/>
<uses-permission android:name="android.permission.WRITE_CALENDAR"/>
<uses-permission android:name='android.permission.WAKE_LOCK'/>
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<uses-permission
android:name="android.permission.WRITE_EXTERNAL_STORAGE"
android:maxSdkVersion="28" />
<uses-permission
android:name="android.permission.USE_FINGERPRINT"
tools:node="remove"/>
@ -25,7 +29,6 @@
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_launcher_name"
android:requestLegacyExternalStorage="true"
android:roundIcon="@mipmap/ic_launcher"
android:supportsRtl="true"
android:theme="@style/AppTheme">

View File

@ -411,7 +411,12 @@ class EventActivity : SimpleActivity() {
mEventStartDateTime = dateTime
val addMinutes = if (intent.getBooleanExtra(NEW_EVENT_SET_HOUR_DURATION, false)) {
60
// if an event is created at 23:00 on the weekly view, make it end on 23:59 by default to avoid spanning across multiple days
if (mEventStartDateTime.hourOfDay == 23) {
59
} else {
60
}
} else {
config.defaultDuration
}

View File

@ -1,6 +1,7 @@
package com.simplemobiletools.calendar.pro.activities
import android.annotation.SuppressLint
import android.app.Activity
import android.app.SearchManager
import android.content.Context
import android.content.Intent
@ -48,11 +49,15 @@ import kotlinx.android.synthetic.main.activity_main.*
import org.joda.time.DateTime
import org.joda.time.DateTimeZone
import java.io.FileOutputStream
import java.io.OutputStream
import java.text.SimpleDateFormat
import java.util.*
import kotlin.collections.ArrayList
class MainActivity : SimpleActivity(), RefreshRecyclerViewListener {
private val PICK_IMPORT_SOURCE_INTENT = 1
private val PICK_EXPORT_FILE_INTENT = 2
private var showCalDAVRefreshToast = false
private var mShouldFilterBeVisible = false
private var mIsSearchOpen = false
@ -61,6 +66,7 @@ class MainActivity : SimpleActivity(), RefreshRecyclerViewListener {
private var shouldGoToTodayBeVisible = false
private var goToTodayButton: MenuItem? = null
private var currentFragments = ArrayList<MyFragmentHolder>()
private var eventTypesToExport = ArrayList<Long>()
private var mStoredTextColor = 0
private var mStoredBackgroundColor = 0
@ -173,7 +179,7 @@ class MainActivity : SimpleActivity(), RefreshRecyclerViewListener {
menu.apply {
goToTodayButton = findItem(R.id.go_to_today)
findItem(R.id.filter).isVisible = mShouldFilterBeVisible
findItem(R.id.go_to_today).isVisible = shouldGoToTodayBeVisible && config.storedView != EVENTS_LIST_VIEW
findItem(R.id.go_to_today).isVisible = shouldGoToTodayBeVisible || config.storedView == EVENTS_LIST_VIEW
findItem(R.id.go_to_date).isVisible = config.storedView != EVENTS_LIST_VIEW
}
@ -227,6 +233,16 @@ class MainActivity : SimpleActivity(), RefreshRecyclerViewListener {
checkIsViewIntent()
}
override fun onActivityResult(requestCode: Int, resultCode: Int, resultData: Intent?) {
super.onActivityResult(requestCode, resultCode, resultData)
if (requestCode == PICK_IMPORT_SOURCE_INTENT && resultCode == Activity.RESULT_OK && resultData != null && resultData.data != null) {
tryImportEventsFromFile(resultData.data!!)
} else if (requestCode == PICK_EXPORT_FILE_INTENT && resultCode == Activity.RESULT_OK && resultData != null && resultData.data != null) {
val outputStream = contentResolver.openOutputStream(resultData.data!!)
exportEventsTo(eventTypesToExport, outputStream)
}
}
private fun storeStateVariables() {
config.apply {
mStoredIsSundayFirst = isSundayFirst
@ -360,7 +376,7 @@ class MainActivity : SimpleActivity(), RefreshRecyclerViewListener {
private fun checkIsViewIntent() {
if (intent?.action == Intent.ACTION_VIEW && intent.data != null) {
val uri = intent.data
if (uri?.authority?.equals("com.android.calendar") == true) {
if (uri?.authority?.equals("com.android.calendar") == true || uri?.authority?.substringAfter("@") == "com.android.calendar") {
if (uri.path!!.startsWith("/events")) {
ensureBackgroundThread {
// intents like content://com.android.calendar/events/1756
@ -375,8 +391,9 @@ class MainActivity : SimpleActivity(), RefreshRecyclerViewListener {
toast(R.string.caldav_event_not_found, Toast.LENGTH_LONG)
}
}
} else if (intent?.extras?.getBoolean("DETAIL_VIEW", false) == true) {
} else if (uri.path!!.startsWith("/time") || intent?.extras?.getBoolean("DETAIL_VIEW", false) == true) {
// clicking date on a third party widget: content://com.android.calendar/time/1507309245683
// or content://0@com.android.calendar/time/1584958526435
val timestamp = uri.pathSegments.last()
if (timestamp.areDigitsOnly()) {
openDayAt(timestamp.toLong())
@ -738,9 +755,17 @@ class MainActivity : SimpleActivity(), RefreshRecyclerViewListener {
}
private fun tryImportEvents() {
handlePermission(PERMISSION_READ_STORAGE) {
if (it) {
importEvents()
if (isQPlus()) {
Intent(Intent.ACTION_GET_CONTENT).apply {
addCategory(Intent.CATEGORY_OPENABLE)
type = "text/calendar"
startActivityForResult(this, PICK_IMPORT_SOURCE_INTENT)
}
} else {
handlePermission(PERMISSION_READ_STORAGE) {
if (it) {
importEvents()
}
}
}
}
@ -781,29 +806,43 @@ class MainActivity : SimpleActivity(), RefreshRecyclerViewListener {
}
private fun tryExportEvents() {
handlePermission(PERMISSION_WRITE_STORAGE) {
if (it) {
exportEvents()
if (isQPlus()) {
ExportEventsDialog(this, config.lastExportPath, true) { file, eventTypes ->
eventTypesToExport = eventTypes
Intent(Intent.ACTION_CREATE_DOCUMENT).apply {
type = "text/calendar"
putExtra(Intent.EXTRA_TITLE, file.name)
addCategory(Intent.CATEGORY_OPENABLE)
startActivityForResult(this, PICK_EXPORT_FILE_INTENT)
}
}
} else {
handlePermission(PERMISSION_WRITE_STORAGE) {
if (it) {
ExportEventsDialog(this, config.lastExportPath, false) { file, eventTypes ->
getFileOutputStream(file.toFileDirItem(this), true) {
exportEventsTo(eventTypes, it)
}
}
}
}
}
}
private fun exportEvents() {
FilePickerDialog(this, pickFile = false, showFAB = true) {
ExportEventsDialog(this, it) { exportPastEvents, file, eventTypes ->
ensureBackgroundThread {
val events = eventsHelper.getEventsToExport(exportPastEvents, eventTypes)
if (events.isEmpty()) {
toast(R.string.no_entries_for_exporting)
} else {
IcsExporter().exportEvents(this, file, events, true) {
toast(when (it) {
IcsExporter.ExportResult.EXPORT_OK -> R.string.exporting_successful
IcsExporter.ExportResult.EXPORT_PARTIAL -> R.string.exporting_some_entries_failed
else -> R.string.exporting_failed
})
}
}
private fun exportEventsTo(eventTypes: ArrayList<Long>, outputStream: OutputStream?) {
ensureBackgroundThread {
val events = eventsHelper.getEventsToExport(eventTypes)
if (events.isEmpty()) {
toast(R.string.no_entries_for_exporting)
} else {
IcsExporter().exportEvents(this, outputStream, events, true) {
toast(when (it) {
IcsExporter.ExportResult.EXPORT_OK -> R.string.exporting_successful
IcsExporter.ExportResult.EXPORT_PARTIAL -> R.string.exporting_some_entries_failed
else -> R.string.exporting_failed
})
}
}
}

View File

@ -1,5 +1,6 @@
package com.simplemobiletools.calendar.pro.activities
import android.app.Activity
import android.app.TimePickerDialog
import android.content.Intent
import android.content.res.Resources
@ -20,10 +21,12 @@ import com.simplemobiletools.commons.models.RadioItem
import kotlinx.android.synthetic.main.activity_settings.*
import org.joda.time.DateTime
import java.io.File
import java.io.InputStream
import java.util.*
class SettingsActivity : SimpleActivity() {
private val GET_RINGTONE_URI = 1
private val PICK_IMPORT_SOURCE_INTENT = 2
lateinit var res: Resources
private var mStoredPrimaryColor = 0
@ -51,7 +54,6 @@ class SettingsActivity : SimpleActivity() {
setupWeekNumbers()
setupShowGrid()
setupWeeklyStart()
setupWeeklyEnd()
setupVibrate()
setupReminderSound()
setupReminderAudioStream()
@ -105,6 +107,9 @@ class SettingsActivity : SimpleActivity() {
if (requestCode == GET_RINGTONE_URI && resultCode == RESULT_OK && resultData != null) {
val newAlarmSound = storeNewYourAlarmSound(resultData)
updateReminderSound(newAlarmSound)
} else if (requestCode == PICK_IMPORT_SOURCE_INTENT && resultCode == Activity.RESULT_OK && resultData != null && resultData.data != null) {
val inputStream = contentResolver.openInputStream(resultData.data!!)
parseFile(inputStream)
}
}
@ -293,32 +298,11 @@ class SettingsActivity : SimpleActivity() {
settings_start_weekly_at.text = getHoursString(config.startWeeklyAt)
settings_start_weekly_at_holder.setOnClickListener {
val items = ArrayList<RadioItem>()
(0..24).mapTo(items) { RadioItem(it, getHoursString(it)) }
(0..16).mapTo(items) { RadioItem(it, getHoursString(it)) }
RadioGroupDialog(this@SettingsActivity, items, config.startWeeklyAt) {
if (it as Int >= config.endWeeklyAt) {
toast(R.string.day_end_before_start)
} else {
config.startWeeklyAt = it
settings_start_weekly_at.text = getHoursString(it)
}
}
}
}
private fun setupWeeklyEnd() {
settings_end_weekly_at.text = getHoursString(config.endWeeklyAt)
settings_end_weekly_at_holder.setOnClickListener {
val items = ArrayList<RadioItem>()
(0..24).mapTo(items) { RadioItem(it, getHoursString(it)) }
RadioGroupDialog(this@SettingsActivity, items, config.endWeeklyAt) {
if (it as Int <= config.startWeeklyAt) {
toast(R.string.day_end_before_start)
} else {
config.endWeeklyAt = it
settings_end_weekly_at.text = getHoursString(it)
}
config.startWeeklyAt = it as Int
settings_start_weekly_at.text = getHoursString(it)
}
}
}
@ -670,7 +654,6 @@ class SettingsActivity : SimpleActivity() {
put(WIDGET_TEXT_COLOR, config.widgetTextColor)
put(WEEK_NUMBERS, config.showWeekNumbers)
put(START_WEEKLY_AT, config.startWeeklyAt)
put(END_WEEKLY_AT, config.endWeeklyAt)
put(VIBRATE, config.vibrateOnReminder)
put(LAST_EVENT_REMINDER_MINUTES, config.lastEventReminderMinutes1)
put(LAST_EVENT_REMINDER_MINUTES_2, config.lastEventReminderMinutes2)
@ -703,14 +686,18 @@ class SettingsActivity : SimpleActivity() {
private fun setupImportSettings() {
settings_import_holder.setOnClickListener {
handlePermission(PERMISSION_READ_STORAGE) {
if (it) {
FilePickerDialog(this) {
ensureBackgroundThread {
try {
parseFile(it)
} catch (e: Exception) {
showErrorToast(e)
if (isQPlus()) {
Intent(Intent.ACTION_GET_CONTENT).apply {
addCategory(Intent.CATEGORY_OPENABLE)
type = "text/plain"
startActivityForResult(this, PICK_IMPORT_SOURCE_INTENT)
}
} else {
handlePermission(PERMISSION_READ_STORAGE) {
if (it) {
FilePickerDialog(this) {
ensureBackgroundThread {
parseFile(File(it).inputStream())
}
}
}
@ -719,8 +706,12 @@ class SettingsActivity : SimpleActivity() {
}
}
private fun parseFile(path: String) {
val inputStream = File(path).inputStream()
private fun parseFile(inputStream: InputStream?) {
if (inputStream == null) {
toast(R.string.unknown_error_occurred)
return
}
var importedItems = 0
val configValues = LinkedHashMap<String, Any>()
inputStream.bufferedReader().use {
@ -756,7 +747,6 @@ class SettingsActivity : SimpleActivity() {
WIDGET_TEXT_COLOR -> config.widgetTextColor = value.toInt()
WEEK_NUMBERS -> config.showWeekNumbers = value.toBoolean()
START_WEEKLY_AT -> config.startWeeklyAt = value.toInt()
END_WEEKLY_AT -> config.endWeeklyAt = value.toInt()
VIBRATE -> config.vibrateOnReminder = value.toBoolean()
LAST_EVENT_REMINDER_MINUTES -> config.lastEventReminderMinutes1 = value.toInt()
LAST_EVENT_REMINDER_MINUTES_2 -> config.lastEventReminderMinutes2 = value.toInt()
@ -784,8 +774,10 @@ class SettingsActivity : SimpleActivity() {
}
}
toast(if (configValues.size > 0) R.string.settings_imported_successfully else R.string.no_entries_for_importing)
runOnUiThread {
val msg = if (configValues.size > 0) R.string.settings_imported_successfully else R.string.no_entries_for_importing
toast(msg)
setupSettingItems()
updateWidgets()
}

View File

@ -40,15 +40,7 @@ class EventListAdapter(activity: SimpleActivity, var listItems: ArrayList<ListIt
init {
setupDragListener(true)
var firstNonPastSectionIndex = -1
listItems.forEachIndexed { index, listItem ->
if (firstNonPastSectionIndex == -1 && listItem is ListSection) {
if (!listItem.isPastSection) {
firstNonPastSectionIndex = index
}
}
}
val firstNonPastSectionIndex = listItems.indexOfFirst { it is ListSection && !it.isPastSection }
if (firstNonPastSectionIndex != -1) {
activity.runOnUiThread {
recyclerView.scrollToPosition(firstNonPastSectionIndex)

View File

@ -21,7 +21,7 @@ class MyWeekPagerAdapter(fm: FragmentManager, private val mWeekTimestamps: List<
val fragment = WeekFragment()
fragment.arguments = bundle
fragment.mListener = mListener
fragment.listener = mListener
mFragments.put(position, fragment)
return fragment
@ -37,4 +37,9 @@ class MyWeekPagerAdapter(fm: FragmentManager, private val mWeekTimestamps: List<
mFragments[pos + i]?.updateCalendar()
}
}
fun updateNotVisibleScaleLevel(pos: Int) {
mFragments[pos - 1]?.updateNotVisibleViewScaleLevel()
mFragments[pos + 1]?.updateNotVisibleViewScaleLevel()
}
}

View File

@ -6,18 +6,38 @@ import androidx.appcompat.app.AlertDialog
import com.simplemobiletools.calendar.pro.R
import com.simplemobiletools.calendar.pro.activities.SimpleActivity
import com.simplemobiletools.calendar.pro.adapters.FilterEventTypeAdapter
import com.simplemobiletools.calendar.pro.extensions.config
import com.simplemobiletools.calendar.pro.extensions.eventsHelper
import com.simplemobiletools.commons.dialogs.FilePickerDialog
import com.simplemobiletools.commons.extensions.*
import com.simplemobiletools.commons.helpers.ensureBackgroundThread
import kotlinx.android.synthetic.main.dialog_export_events.view.*
import java.io.File
import java.util.*
class ExportEventsDialog(val activity: SimpleActivity, val path: String, val callback: (exportPastEvents: Boolean, file: File, eventTypes: ArrayList<Long>) -> Unit) {
class ExportEventsDialog(val activity: SimpleActivity, val path: String, val hidePath: Boolean,
val callback: (file: File, eventTypes: ArrayList<Long>) -> Unit) {
private var realPath = if (path.isEmpty()) activity.internalStoragePath else path
val config = activity.config
init {
val view = (activity.layoutInflater.inflate(R.layout.dialog_export_events, null) as ViewGroup).apply {
export_events_folder.text = activity.humanizePath(path)
export_events_folder.text = activity.humanizePath(realPath)
export_events_filename.setText("${activity.getString(R.string.events)}_${activity.getCurrentFormattedDateTime()}")
export_events_checkbox.isChecked = config.exportPastEvents
if (hidePath) {
export_events_folder_label.beGone()
export_events_folder.beGone()
} else {
export_events_folder.setOnClickListener {
activity.hideKeyboard(export_events_filename)
FilePickerDialog(activity, realPath, false, showFAB = true) {
export_events_folder.text = activity.humanizePath(it)
realPath = it
}
}
}
activity.eventsHelper.getEventTypes(activity, false) {
val eventTypes = HashSet<String>()
@ -43,15 +63,20 @@ class ExportEventsDialog(val activity: SimpleActivity, val path: String, val cal
when {
filename.isEmpty() -> activity.toast(R.string.empty_name)
filename.isAValidFilename() -> {
val file = File(path, "$filename.ics")
if (file.exists()) {
val file = File(realPath, "$filename.ics")
if (!hidePath && file.exists()) {
activity.toast(R.string.name_taken)
return@setOnClickListener
}
val eventTypes = (view.export_events_types_list.adapter as FilterEventTypeAdapter).getSelectedItemsList()
callback(view.export_events_checkbox.isChecked, file, eventTypes)
dismiss()
ensureBackgroundThread {
config.lastExportPath = file.absolutePath.getParentPath()
config.exportPastEvents = view.export_events_checkbox.isChecked
val eventTypes = (view.export_events_types_list.adapter as FilterEventTypeAdapter).getSelectedItemsList()
callback(file, eventTypes)
dismiss()
}
}
else -> activity.toast(R.string.invalid_name)
}

View File

@ -8,9 +8,7 @@ import com.simplemobiletools.calendar.pro.helpers.*
import com.simplemobiletools.calendar.pro.models.Event
import com.simplemobiletools.commons.activities.BaseSimpleActivity
import com.simplemobiletools.commons.dialogs.RadioGroupDialog
import com.simplemobiletools.commons.extensions.hideKeyboard
import com.simplemobiletools.commons.extensions.sharePathIntent
import com.simplemobiletools.commons.extensions.toast
import com.simplemobiletools.commons.extensions.*
import com.simplemobiletools.commons.helpers.ensureBackgroundThread
import com.simplemobiletools.commons.models.RadioItem
import java.io.File
@ -26,9 +24,11 @@ fun BaseSimpleActivity.shareEvents(ids: List<Long>) {
}
val events = eventsDB.getEventsWithIds(ids) as ArrayList<Event>
IcsExporter().exportEvents(this, file, events, false) {
if (it == IcsExporter.ExportResult.EXPORT_OK) {
sharePathIntent(file.absolutePath, BuildConfig.APPLICATION_ID)
getFileOutputStream(file.toFileDirItem(this), true) {
IcsExporter().exportEvents(this, it, events, false) {
if (it == IcsExporter.ExportResult.EXPORT_OK) {
sharePathIntent(file.absolutePath, BuildConfig.APPLICATION_ID)
}
}
}
}

View File

@ -525,3 +525,9 @@ fun Context.getWidgetSmallFontSize() = getWidgetMediumFontSize() - 3f
fun Context.getWidgetMediumFontSize() = resources.getDimension(R.dimen.day_text_size) / resources.displayMetrics.density
fun Context.getWidgetLargeFontSize() = getWidgetMediumFontSize() + 3f
fun Context.getWidgetExtraLargeFontSize() = getWidgetMediumFontSize() + 6f
fun Context.getWeeklyViewItemHeight(): Float {
val defaultHeight = resources.getDimension(R.dimen.weekly_view_row_height)
val multiplier = config.weeklyViewItemHeightMultiplier
return defaultHeight * multiplier
}

View File

@ -6,6 +6,7 @@ import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.recyclerview.widget.LinearLayoutManager
import com.simplemobiletools.calendar.pro.R
import com.simplemobiletools.calendar.pro.activities.EventActivity
import com.simplemobiletools.calendar.pro.activities.MainActivity
@ -18,6 +19,7 @@ import com.simplemobiletools.calendar.pro.helpers.Formatter
import com.simplemobiletools.calendar.pro.models.Event
import com.simplemobiletools.calendar.pro.models.ListEvent
import com.simplemobiletools.calendar.pro.models.ListItem
import com.simplemobiletools.calendar.pro.models.ListSection
import com.simplemobiletools.commons.extensions.*
import com.simplemobiletools.commons.helpers.MONTH_SECONDS
import com.simplemobiletools.commons.interfaces.RefreshRecyclerViewListener
@ -187,7 +189,13 @@ class EventListFragment : MyFragmentHolder(), RefreshRecyclerViewListener {
checkEvents()
}
override fun goToToday() {}
override fun goToToday() {
val listItems = context!!.getEventListItems(mEvents)
val firstNonPastSectionIndex = listItems.indexOfFirst { it is ListSection && !it.isPastSection }
if (firstNonPastSectionIndex != -1) {
(mView.calendar_events_list.layoutManager as LinearLayoutManager).scrollToPositionWithOffset(firstNonPastSectionIndex, 0)
}
}
override fun showGoToDateDialog() {}

View File

@ -1,15 +1,12 @@
package com.simplemobiletools.calendar.pro.fragments
import android.annotation.SuppressLint
import android.content.Intent
import android.content.res.Resources
import android.graphics.Rect
import android.graphics.drawable.ColorDrawable
import android.os.Bundle
import android.util.Range
import android.view.LayoutInflater
import android.view.MotionEvent
import android.view.View
import android.view.ViewGroup
import android.view.*
import android.widget.ImageView
import android.widget.RelativeLayout
import android.widget.TextView
@ -17,10 +14,7 @@ import androidx.collection.LongSparseArray
import androidx.fragment.app.Fragment
import com.simplemobiletools.calendar.pro.R
import com.simplemobiletools.calendar.pro.activities.EventActivity
import com.simplemobiletools.calendar.pro.extensions.config
import com.simplemobiletools.calendar.pro.extensions.eventsHelper
import com.simplemobiletools.calendar.pro.extensions.seconds
import com.simplemobiletools.calendar.pro.extensions.touch
import com.simplemobiletools.calendar.pro.extensions.*
import com.simplemobiletools.calendar.pro.helpers.*
import com.simplemobiletools.calendar.pro.helpers.Formatter
import com.simplemobiletools.calendar.pro.interfaces.WeekFragmentListener
@ -38,64 +32,92 @@ import org.joda.time.Days
import java.util.*
class WeekFragment : Fragment(), WeeklyCalendar {
private val CLICK_DURATION_THRESHOLD = 150
private val PLUS_FADEOUT_DELAY = 5000L
private val MIN_SCALE_FACTOR = 0.3f
private val MAX_SCALE_FACTOR = 5f
private val MIN_SCALE_DIFFERENCE = 0.02f
private val SCALE_RANGE = MAX_SCALE_FACTOR - MIN_SCALE_FACTOR
var mListener: WeekFragmentListener? = null
private var mWeekTimestamp = 0L
private var mRowHeight = 0f
private var minScrollY = -1
private var maxScrollY = -1
var listener: WeekFragmentListener? = null
private var weekTimestamp = 0L
private var rowHeight = 0f
private var todayColumnIndex = -1
private var clickStartTime = 0L
private var primaryColor = 0
private var lastHash = 0
private var prevScaleSpanY = 0f
private var scaleCenterPercent = 0f
private var defaultRowHeight = 0f
private var screenHeight = 0
private var rowHeightsAtScale = 0f
private var prevScaleFactor = 0f
private var mWasDestroyed = false
private var isFragmentVisible = false
private var wasFragmentInit = false
private var wasExtraHeightAdded = false
private var dimPastEvents = true
private var wasScaled = false
private var selectedGrid: View? = null
private var currentTimeView: ImageView? = null
private var events = ArrayList<Event>()
private var allDayHolders = ArrayList<RelativeLayout>()
private var allDayRows = ArrayList<HashSet<Int>>()
private var currEvents = ArrayList<Event>()
private var eventTypeColors = LongSparseArray<Int>()
private var eventTimeRanges = LinkedHashMap<String, ArrayList<EventWeeklyView>>()
private lateinit var inflater: LayoutInflater
private lateinit var mView: View
private lateinit var mScrollView: MyScrollView
private lateinit var mCalendar: WeeklyCalendarImpl
private lateinit var mRes: Resources
private lateinit var mConfig: Config
private lateinit var scrollView: MyScrollView
private lateinit var res: Resources
private lateinit var config: Config
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
mRes = context!!.resources
mConfig = context!!.config
mRowHeight = mRes.getDimension(R.dimen.weekly_view_row_height)
minScrollY = (mRowHeight * mConfig.startWeeklyAt).toInt()
mWeekTimestamp = arguments!!.getLong(WEEK_START_TIMESTAMP)
dimPastEvents = mConfig.dimPastEvents
res = context!!.resources
config = context!!.config
rowHeight = context!!.getWeeklyViewItemHeight()
defaultRowHeight = res.getDimension(R.dimen.weekly_view_row_height)
weekTimestamp = arguments!!.getLong(WEEK_START_TIMESTAMP)
dimPastEvents = config.dimPastEvents
primaryColor = context!!.getAdjustedPrimaryColor()
allDayRows.add(HashSet())
mCalendar = WeeklyCalendarImpl(this, context!!)
}
@SuppressLint("ClickableViewAccessibility")
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
this.inflater = inflater
mView = inflater.inflate(R.layout.fragment_week, container, false)
mScrollView = mView.week_events_scrollview
mScrollView.setOnScrollviewListener(object : MyScrollView.ScrollViewListener {
val fullHeight = context!!.getWeeklyViewItemHeight().toInt() * 24
mView = inflater.inflate(R.layout.fragment_week, container, false).apply {
scrollView = week_events_scrollview
week_horizontal_grid_holder.layoutParams.height = fullHeight
week_events_columns_holder.layoutParams.height = fullHeight
val scaleDetector = getViewScaleDetector()
scrollView.setOnTouchListener { view, motionEvent ->
scaleDetector.onTouchEvent(motionEvent)
if (motionEvent.action == MotionEvent.ACTION_UP && wasScaled) {
scrollView.isScrollable = true
wasScaled = false
true
} else {
false
}
}
}
scrollView.setOnScrollviewListener(object : MyScrollView.ScrollViewListener {
override fun onScrollChanged(scrollView: MyScrollView, x: Int, y: Int, oldx: Int, oldy: Int) {
checkScrollLimits(y)
}
})
mScrollView.onGlobalLayout {
updateScrollY(Math.max(mListener?.getCurrScrollY() ?: 0, minScrollY))
scrollView.onGlobalLayout {
if (fullHeight < scrollView.height) {
scrollView.layoutParams.height = fullHeight - context!!.resources.getDimension(R.dimen.one_dp).toInt()
}
val initialScrollY = (rowHeight * config.startWeeklyAt).toInt()
updateScrollY(Math.max(listener?.getCurrScrollY() ?: 0, initialScrollY))
}
wasFragmentInit = true
@ -105,28 +127,13 @@ class WeekFragment : Fragment(), WeeklyCalendar {
override fun onResume() {
super.onResume()
context!!.eventsHelper.getEventTypes(activity!!, false) {
it.map { eventTypeColors.put(it.id!!, it.color) }
it.map {
eventTypeColors.put(it.id!!, it.color)
}
}
setupDayLabels()
updateCalendar()
mScrollView.onGlobalLayout {
if (context == null) {
return@onGlobalLayout
}
minScrollY = (mRowHeight * mConfig.startWeeklyAt).toInt()
maxScrollY = (mRowHeight * mConfig.endWeeklyAt).toInt()
val bounds = Rect()
week_events_holder.getGlobalVisibleRect(bounds)
maxScrollY -= bounds.bottom - bounds.top
if (minScrollY > maxScrollY)
maxScrollY = -1
checkScrollLimits(mScrollView.scrollY)
}
}
override fun onPause() {
@ -143,25 +150,33 @@ class WeekFragment : Fragment(), WeeklyCalendar {
super.setMenuVisibility(menuVisible)
isFragmentVisible = menuVisible
if (isFragmentVisible && wasFragmentInit) {
mListener?.updateHoursTopMargin(mView.week_top_holder.height)
checkScrollLimits(mScrollView.scrollY)
listener?.updateHoursTopMargin(mView.week_top_holder.height)
checkScrollLimits(scrollView.scrollY)
// fix some glitches like at swiping from a fully scaled out fragment will all-day events to an empty one
val fullFragmentHeight = (listener?.getFullFragmentHeight() ?: 0) - mView.week_top_holder.height
if (scrollView.height < fullFragmentHeight) {
config.weeklyViewItemHeightMultiplier = fullFragmentHeight / 24 / defaultRowHeight
updateViewScale()
listener?.updateRowHeight(rowHeight.toInt())
}
}
}
fun updateCalendar() {
mCalendar.updateWeeklyCalendar(mWeekTimestamp)
WeeklyCalendarImpl(this, context!!).updateWeeklyCalendar(weekTimestamp)
}
private fun setupDayLabels() {
var curDay = Formatter.getDateTimeFromTS(mWeekTimestamp)
val textColor = mConfig.textColor
var curDay = Formatter.getDateTimeFromTS(weekTimestamp)
val textColor = config.textColor
val todayCode = Formatter.getDayCodeFromDateTime(DateTime())
for (i in 0..6) {
val dayCode = Formatter.getDayCodeFromDateTime(curDay)
val dayLetters = mRes.getStringArray(R.array.week_day_letters).toMutableList() as ArrayList<String>
val dayLetters = res.getStringArray(R.array.week_day_letters).toMutableList() as ArrayList<String>
val dayLetter = dayLetters[curDay.dayOfWeek - 1]
mView.findViewById<TextView>(mRes.getIdentifier("week_day_label_$i", "id", context!!.packageName)).apply {
mView.findViewById<TextView>(res.getIdentifier("week_day_label_$i", "id", context!!.packageName)).apply {
text = "$dayLetter\n${curDay.dayOfMonth}"
setTextColor(if (todayCode == dayCode) primaryColor else textColor)
if (todayCode == dayCode) {
@ -173,12 +188,8 @@ class WeekFragment : Fragment(), WeeklyCalendar {
}
private fun checkScrollLimits(y: Int) {
if (minScrollY != -1 && y < minScrollY) {
mScrollView.scrollY = minScrollY
} else if (maxScrollY != -1 && y > maxScrollY) {
mScrollView.scrollY = maxScrollY
} else if (isFragmentVisible) {
mListener?.scrollTo(y)
if (isFragmentVisible) {
listener?.scrollTo(y)
}
}
@ -186,45 +197,89 @@ class WeekFragment : Fragment(), WeeklyCalendar {
(0..6).map { getColumnWithId(it) }
.forEachIndexed { index, layout ->
layout.removeAllViews()
val gestureDetector = getViewGestureDetector(layout, index)
layout.setOnTouchListener { view, motionEvent ->
checkGridClick(motionEvent, index, layout)
gestureDetector.onTouchEvent(motionEvent)
true
}
}
}
private fun checkGridClick(event: MotionEvent, index: Int, view: ViewGroup) {
when (event.action) {
MotionEvent.ACTION_DOWN -> clickStartTime = System.currentTimeMillis()
MotionEvent.ACTION_UP -> {
if (System.currentTimeMillis() - clickStartTime < CLICK_DURATION_THRESHOLD) {
selectedGrid?.animation?.cancel()
selectedGrid?.beGone()
private fun getViewGestureDetector(view: ViewGroup, index: Int): GestureDetector {
return GestureDetector(context, object : GestureDetector.SimpleOnGestureListener() {
override fun onSingleTapUp(event: MotionEvent): Boolean {
selectedGrid?.animation?.cancel()
selectedGrid?.beGone()
val hour = (event.y / mRowHeight).toInt()
selectedGrid = (inflater.inflate(R.layout.week_grid_item, null, false) as ImageView).apply {
view.addView(this)
background = ColorDrawable(primaryColor)
layoutParams.width = view.width
layoutParams.height = mRowHeight.toInt()
y = hour * mRowHeight
applyColorFilter(primaryColor.getContrastColor())
val hour = (event.y / rowHeight).toInt()
selectedGrid = (inflater.inflate(R.layout.week_grid_item, null, false) as ImageView).apply {
view.addView(this)
background = ColorDrawable(primaryColor)
layoutParams.width = view.width
layoutParams.height = rowHeight.toInt()
y = hour * rowHeight
applyColorFilter(primaryColor.getContrastColor())
setOnClickListener {
val timestamp = mWeekTimestamp + index * DAY_SECONDS + hour * 60 * 60
Intent(context, EventActivity::class.java).apply {
putExtra(NEW_EVENT_START_TS, timestamp)
putExtra(NEW_EVENT_SET_HOUR_DURATION, true)
startActivity(this)
}
}
animate().alpha(0f).setStartDelay(PLUS_FADEOUT_DELAY).withEndAction {
beGone()
setOnClickListener {
val timestamp = weekTimestamp + index * DAY_SECONDS + hour * 60 * 60
Intent(context, EventActivity::class.java).apply {
putExtra(NEW_EVENT_START_TS, timestamp)
putExtra(NEW_EVENT_SET_HOUR_DURATION, true)
startActivity(this)
}
}
animate().setStartDelay(PLUS_FADEOUT_DELAY).alpha(0f).withEndAction {
beGone()
}
}
return super.onSingleTapUp(event)
}
}
})
}
private fun getViewScaleDetector(): ScaleGestureDetector {
return ScaleGestureDetector(context, object : ScaleGestureDetector.SimpleOnScaleGestureListener() {
override fun onScale(detector: ScaleGestureDetector): Boolean {
val percent = (prevScaleSpanY - detector.currentSpanY) / screenHeight
prevScaleSpanY = detector.currentSpanY
val wantedFactor = config.weeklyViewItemHeightMultiplier - (SCALE_RANGE * percent)
var newFactor = Math.max(Math.min(wantedFactor, MAX_SCALE_FACTOR), MIN_SCALE_FACTOR)
if (scrollView.height > defaultRowHeight * newFactor * 24) {
newFactor = scrollView.height / 24f / defaultRowHeight
}
if (Math.abs(newFactor - prevScaleFactor) > MIN_SCALE_DIFFERENCE) {
prevScaleFactor = newFactor
config.weeklyViewItemHeightMultiplier = newFactor
updateViewScale()
listener?.updateRowHeight(rowHeight.toInt())
val targetY = rowHeightsAtScale * rowHeight - scaleCenterPercent * getVisibleHeight()
scrollView.scrollTo(0, targetY.toInt())
}
return super.onScale(detector)
}
override fun onScaleBegin(detector: ScaleGestureDetector): Boolean {
scaleCenterPercent = detector.focusY / scrollView.height
rowHeightsAtScale = (scrollView.scrollY + scaleCenterPercent * getVisibleHeight()) / rowHeight
scrollView.isScrollable = false
prevScaleSpanY = detector.currentSpanY
prevScaleFactor = config.weeklyViewItemHeightMultiplier
wasScaled = true
screenHeight = context!!.realScreenSize.y
return super.onScaleBegin(detector)
}
})
}
private fun getVisibleHeight(): Float {
val fullContentHeight = rowHeight * 24
val visibleRatio = scrollView.height / fullContentHeight
return fullContentHeight * visibleRatio
}
override fun updateWeeklyCalendar(events: ArrayList<Event>) {
@ -234,16 +289,32 @@ class WeekFragment : Fragment(), WeeklyCalendar {
}
lastHash = newHash
this.events = events
activity!!.runOnUiThread {
if (context != null && activity != null && isAdded) {
addEvents()
val replaceDescription = config.replaceDescription
val sorted = events.sortedWith(
compareBy<Event> { it.startTS }.thenBy { it.endTS }.thenBy { it.title }.thenBy { if (replaceDescription) it.location else it.description }
).toMutableList() as ArrayList<Event>
currEvents = sorted
addEvents(sorted)
}
}
}
private fun addEvents() {
private fun updateViewScale() {
rowHeight = context?.getWeeklyViewItemHeight() ?: return
val oneDp = context!!.resources.getDimension(R.dimen.one_dp).toInt()
val fullHeight = Math.max(rowHeight.toInt() * 24, scrollView.height + oneDp)
scrollView.layoutParams.height = fullHeight - oneDp
mView.week_horizontal_grid_holder.layoutParams.height = fullHeight
mView.week_events_columns_holder.layoutParams.height = fullHeight
addEvents(currEvents)
}
private fun addEvents(events: ArrayList<Event>) {
initGrid()
allDayHolders.clear()
allDayRows.clear()
@ -253,15 +324,13 @@ class WeekFragment : Fragment(), WeeklyCalendar {
addNewLine()
val fullHeight = mRes.getDimension(R.dimen.weekly_view_events_height)
val minuteHeight = fullHeight / (24 * 60)
val minimalHeight = mRes.getDimension(R.dimen.weekly_view_minimal_event_height).toInt()
val density = Math.round(context!!.resources.displayMetrics.density)
val minuteHeight = rowHeight / 60
val minimalHeight = res.getDimension(R.dimen.weekly_view_minimal_event_height).toInt()
val density = Math.round(res.displayMetrics.density)
var hadAllDayEvent = false
val replaceDescription = mConfig.replaceDescription
val sorted = events.sortedWith(compareBy<Event> { it.startTS }.thenBy { it.endTS }.thenBy { it.title }.thenBy { if (replaceDescription) it.location else it.description })
for (event in sorted) {
for (event in events) {
val startDateTime = Formatter.getDateTimeFromTS(event.startTS)
val endDateTime = Formatter.getDateTimeFromTS(event.endTS)
if (!event.getIsAllDay() && Formatter.getDayCodeFromDateTime(startDateTime) == Formatter.getDayCodeFromDateTime(endDateTime)) {
@ -279,14 +348,14 @@ class WeekFragment : Fragment(), WeeklyCalendar {
}
}
for (event in sorted) {
for (event in events) {
val startDateTime = Formatter.getDateTimeFromTS(event.startTS)
val endDateTime = Formatter.getDateTimeFromTS(event.endTS)
if (event.getIsAllDay() || Formatter.getDayCodeFromDateTime(startDateTime) != Formatter.getDayCodeFromDateTime(endDateTime)) {
hadAllDayEvent = true
addAllDayEvent(event)
} else {
val dayOfWeek = startDateTime.plusDays(if (mConfig.isSundayFirst) 1 else 0).dayOfWeek - 1
val dayOfWeek = startDateTime.plusDays(if (config.isSundayFirst) 1 else 0).dayOfWeek - 1
val layout = getColumnWithId(dayOfWeek)
val startMinutes = startDateTime.minuteOfDay
@ -343,7 +412,11 @@ class WeekFragment : Fragment(), WeeklyCalendar {
}
}
minHeight = if (event.startTS == event.endTS) minimalHeight else (duration * minuteHeight).toInt() - 1
minHeight = if (event.startTS == event.endTS) {
minimalHeight
} else {
(duration * minuteHeight).toInt() - 1
}
}
setOnClickListener {
Intent(context, EventActivity::class.java).apply {
@ -377,12 +450,11 @@ class WeekFragment : Fragment(), WeeklyCalendar {
mView.week_events_holder.removeView(currentTimeView)
}
currentTimeView = (inflater.inflate(R.layout.week_now_marker, null, false) as ImageView)
currentTimeView!!.apply {
currentTimeView = (inflater.inflate(R.layout.week_now_marker, null, false) as ImageView).apply {
applyColorFilter(primaryColor)
mView.week_events_holder.addView(this, 0)
val extraWidth = (todayColumn.width * 0.3).toInt()
val markerHeight = mRes.getDimension(R.dimen.weekly_view_now_height).toInt()
val markerHeight = res.getDimension(R.dimen.weekly_view_now_height).toInt()
(layoutParams as RelativeLayout.LayoutParams).apply {
width = todayColumn.width + extraWidth
height = markerHeight
@ -396,7 +468,7 @@ class WeekFragment : Fragment(), WeeklyCalendar {
private fun checkTopHolderHeight() {
mView.week_top_holder.onGlobalLayout {
if (isFragmentVisible && activity != null && !mWasDestroyed) {
mListener?.updateHoursTopMargin(mView.week_top_holder.height)
listener?.updateHoursTopMargin(mView.week_top_holder.height)
}
}
}
@ -418,11 +490,11 @@ class WeekFragment : Fragment(), WeeklyCalendar {
val startDateTime = Formatter.getDateTimeFromTS(event.startTS)
val endDateTime = Formatter.getDateTimeFromTS(event.endTS)
val minTS = Math.max(startDateTime.seconds(), mWeekTimestamp)
val maxTS = Math.min(endDateTime.seconds(), mWeekTimestamp + WEEK_SECONDS)
val minTS = Math.max(startDateTime.seconds(), weekTimestamp)
val maxTS = Math.min(endDateTime.seconds(), weekTimestamp + WEEK_SECONDS)
// fix a visual glitch with all-day events or events lasting multiple days starting at midnight on monday, being shown the previous week too
if (minTS == maxTS && (minTS - mWeekTimestamp == WEEK_SECONDS.toLong())) {
if (minTS == maxTS && (minTS - weekTimestamp == WEEK_SECONDS.toLong())) {
return
}
@ -430,7 +502,7 @@ class WeekFragment : Fragment(), WeeklyCalendar {
val numDays = Days.daysBetween(Formatter.getDateTimeFromTS(minTS).toLocalDate(), Formatter.getDateTimeFromTS(maxTS).toLocalDate()).days
val daysCnt = if (numDays == 1 && isStartTimeDay) 0 else numDays
val startDateTimeInWeek = Formatter.getDateTimeFromTS(minTS)
val firstDayIndex = (startDateTimeInWeek.dayOfWeek - if (mConfig.isSundayFirst) 0 else 1) % 7
val firstDayIndex = (startDateTimeInWeek.dayOfWeek - if (config.isSundayFirst) 0 else 1) % 7
var doesEventFit: Boolean
val cnt = allDayRows.size - 1
@ -488,22 +560,27 @@ class WeekFragment : Fragment(), WeeklyCalendar {
mView.week_top_holder.onGlobalLayout {
if (activity != null && !mWasDestroyed) {
if (isFragmentVisible) {
mListener?.updateHoursTopMargin(mView.week_top_holder.height)
listener?.updateHoursTopMargin(mView.week_top_holder.height)
}
if (!wasExtraHeightAdded) {
maxScrollY += mView.week_all_day_holder.height
wasExtraHeightAdded = true
}
}
}
}
private fun getColumnWithId(id: Int) = mView.findViewById<ViewGroup>(mRes.getIdentifier("week_column_$id", "id", context!!.packageName))
private fun getColumnWithId(id: Int) = mView.findViewById<ViewGroup>(res.getIdentifier("week_column_$id", "id", context!!.packageName))
fun updateScrollY(y: Int) {
if (wasFragmentInit) {
mScrollView.scrollY = y
scrollView.scrollY = y
}
}
fun updateNotVisibleViewScaleLevel() {
if (!isFragmentVisible) {
updateViewScale()
}
}
}

View File

@ -8,20 +8,19 @@ import android.view.ViewGroup
import android.widget.DatePicker
import android.widget.TextView
import androidx.appcompat.app.AlertDialog
import androidx.appcompat.app.AppCompatActivity
import androidx.viewpager.widget.ViewPager
import com.simplemobiletools.calendar.pro.R
import com.simplemobiletools.calendar.pro.activities.MainActivity
import com.simplemobiletools.calendar.pro.adapters.MyWeekPagerAdapter
import com.simplemobiletools.calendar.pro.extensions.config
import com.simplemobiletools.calendar.pro.extensions.getWeeklyViewItemHeight
import com.simplemobiletools.calendar.pro.extensions.seconds
import com.simplemobiletools.calendar.pro.helpers.Formatter
import com.simplemobiletools.calendar.pro.helpers.WEEK_START_DATE_TIME
import com.simplemobiletools.calendar.pro.interfaces.WeekFragmentListener
import com.simplemobiletools.calendar.pro.views.MyScrollView
import com.simplemobiletools.commons.extensions.getDialogTheme
import com.simplemobiletools.commons.extensions.setupDialogStuff
import com.simplemobiletools.commons.extensions.updateActionBarSubtitle
import com.simplemobiletools.commons.extensions.updateActionBarTitle
import com.simplemobiletools.commons.extensions.*
import com.simplemobiletools.commons.helpers.WEEK_SECONDS
import com.simplemobiletools.commons.views.MyViewPager
import kotlinx.android.synthetic.main.fragment_week_holder.view.*
@ -48,6 +47,10 @@ class WeekFragmentsHolder : MyFragmentHolder(), WeekFragmentListener {
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
weekHolder = inflater.inflate(R.layout.fragment_week_holder, container, false) as ViewGroup
weekHolder!!.background = ColorDrawable(context!!.config.backgroundColor)
val itemHeight = context!!.getWeeklyViewItemHeight().toInt()
weekHolder!!.week_view_hours_holder.setPadding(0, 0, 0, itemHeight)
viewPager = weekHolder!!.week_view_view_pager
viewPager!!.id = (System.currentTimeMillis() % 100000).toInt()
setupFragment()
@ -57,6 +60,7 @@ class WeekFragmentsHolder : MyFragmentHolder(), WeekFragmentListener {
private fun setupFragment() {
val weekTSs = getWeekTimestamps(currentWeekTS)
val weeklyAdapter = MyWeekPagerAdapter(activity!!.supportFragmentManager, weekTSs, this)
val itemHeight = context!!.getWeeklyViewItemHeight().toInt()
val textColor = context!!.config.textColor
weekHolder!!.week_view_hours_holder.removeAllViews()
@ -66,6 +70,7 @@ class WeekFragmentsHolder : MyFragmentHolder(), WeekFragmentListener {
(layoutInflater.inflate(R.layout.weekly_view_hour_textview, null, false) as TextView).apply {
text = formattedHours
setTextColor(textColor)
height = itemHeight
weekHolder!!.week_view_hours_holder.addView(this)
}
}
@ -122,12 +127,12 @@ class WeekFragmentsHolder : MyFragmentHolder(), WeekFragmentListener {
if (startDateTime.year != DateTime().year) {
newTitle += " - ${startDateTime.year}"
}
(activity as MainActivity).updateActionBarTitle(newTitle)
(activity as AppCompatActivity).updateActionBarTitle(newTitle)
} else {
val endMonthName = Formatter.getMonthName(context!!, endDateTime.monthOfYear)
(activity as MainActivity).updateActionBarTitle("$startMonthName - $endMonthName")
(activity as AppCompatActivity).updateActionBarTitle("$startMonthName - $endMonthName")
}
(activity as MainActivity).updateActionBarSubtitle("${getString(R.string.week)} ${startDateTime.plusDays(3).weekOfWeekyear}")
(activity as AppCompatActivity).updateActionBarSubtitle("${getString(R.string.week)} ${startDateTime.plusDays(3).weekOfWeekyear}")
}
override fun goToToday() {
@ -196,9 +201,27 @@ class WeekFragmentsHolder : MyFragmentHolder(), WeekFragmentListener {
}
override fun updateHoursTopMargin(margin: Int) {
weekHolder?.week_view_hours_divider?.layoutParams?.height = margin
weekHolder?.week_view_hours_scrollview?.requestLayout()
weekHolder?.apply {
week_view_hours_divider?.layoutParams?.height = margin
week_view_hours_scrollview?.requestLayout()
week_view_hours_scrollview?.onGlobalLayout {
week_view_hours_scrollview.scrollY = weekScrollY
}
}
}
override fun getCurrScrollY() = weekScrollY
override fun updateRowHeight(rowHeight: Int) {
val childCnt = weekHolder!!.week_view_hours_holder.childCount
for (i in 0..childCnt) {
val textView = weekHolder!!.week_view_hours_holder.getChildAt(i) as? TextView ?: continue
textView.layoutParams.height = rowHeight
}
weekHolder!!.week_view_hours_holder.setPadding(0, 0, 0, rowHeight)
(viewPager!!.adapter as? MyWeekPagerAdapter)?.updateNotVisibleScaleLevel(viewPager!!.currentItem)
}
override fun getFullFragmentHeight() = weekHolder!!.week_view_holder.height
}

View File

@ -2,6 +2,7 @@ package com.simplemobiletools.calendar.pro.helpers
import android.content.Context
import android.media.AudioManager
import com.simplemobiletools.calendar.pro.R
import com.simplemobiletools.calendar.pro.extensions.config
import com.simplemobiletools.calendar.pro.extensions.scheduleCalDAVSync
import com.simplemobiletools.commons.extensions.getDefaultAlarmTitle
@ -24,10 +25,6 @@ class Config(context: Context) : BaseConfig(context) {
get() = prefs.getInt(START_WEEKLY_AT, 7)
set(startWeeklyAt) = prefs.edit().putInt(START_WEEKLY_AT, startWeeklyAt).apply()
var endWeeklyAt: Int
get() = prefs.getInt(END_WEEKLY_AT, 23)
set(endWeeklyAt) = prefs.edit().putInt(END_WEEKLY_AT, endWeeklyAt).apply()
var vibrateOnReminder: Boolean
get() = prefs.getBoolean(VIBRATE, false)
set(vibrate) = prefs.edit().putBoolean(VIBRATE, vibrate).apply()
@ -174,4 +171,16 @@ class Config(context: Context) : BaseConfig(context) {
var allowChangingTimeZones: Boolean
get() = prefs.getBoolean(ALLOW_CHANGING_TIME_ZONES, false)
set(allowChangingTimeZones) = prefs.edit().putBoolean(ALLOW_CHANGING_TIME_ZONES, allowChangingTimeZones).apply()
var lastExportPath: String
get() = prefs.getString(LAST_EXPORT_PATH, "")!!
set(lastExportPath) = prefs.edit().putString(LAST_EXPORT_PATH, lastExportPath).apply()
var exportPastEvents: Boolean
get() = prefs.getBoolean(EXPORT_PAST_EVENTS, false)
set(exportPastEvents) = prefs.edit().putBoolean(EXPORT_PAST_EVENTS, exportPastEvents).apply()
var weeklyViewItemHeightMultiplier: Float
get() = prefs.getFloat(WEEKLY_VIEW_ITEM_HEIGHT_MULTIPLIER, 1f)
set(weeklyViewItemHeightMultiplier) = prefs.edit().putFloat(WEEKLY_VIEW_ITEM_HEIGHT_MULTIPLIER, weeklyViewItemHeightMultiplier).apply()
}

View File

@ -41,7 +41,6 @@ const val YEAR = 31536000
// Shared Preferences
const val WEEK_NUMBERS = "week_numbers"
const val START_WEEKLY_AT = "start_weekly_at"
const val END_WEEKLY_AT = "end_weekly_at"
const val VIBRATE = "vibrate"
const val REMINDER_SOUND_URI = "reminder_sound_uri"
const val REMINDER_SOUND_TITLE = "reminder_sound_title"
@ -73,6 +72,9 @@ const val DEFAULT_START_TIME = "default_start_time"
const val DEFAULT_DURATION = "default_duration"
const val DEFAULT_EVENT_TYPE_ID = "default_event_type_id"
const val ALLOW_CHANGING_TIME_ZONES = "allow_changing_time_zones"
const val LAST_EXPORT_PATH = "last_export_path"
const val EXPORT_PAST_EVENTS = "export_past_events"
const val WEEKLY_VIEW_ITEM_HEIGHT_MULTIPLIER = "weekly_view_item_height_multiplier"
// repeat_rule for monthly and yearly repetition
const val REPEAT_SAME_DAY = 1 // i.e. 25th every month, or 3rd june (if yearly repetition)

View File

@ -401,10 +401,10 @@ class EventsHelper(val context: Context) {
return events
}
fun getEventsToExport(includePast: Boolean, eventTypes: ArrayList<Long>): ArrayList<Event> {
fun getEventsToExport(eventTypes: ArrayList<Long>): ArrayList<Event> {
val currTS = getNowSeconds()
var events = ArrayList<Event>()
if (includePast) {
if (config.exportPastEvents) {
events.addAll(eventsDB.getAllEventsWithTypes(eventTypes))
} else {
events.addAll(eventsDB.getOneTimeFutureEventsWithTypes(currTS, eventTypes))

View File

@ -7,13 +7,11 @@ import com.simplemobiletools.calendar.pro.helpers.IcsExporter.ExportResult.*
import com.simplemobiletools.calendar.pro.models.CalDAVCalendar
import com.simplemobiletools.calendar.pro.models.Event
import com.simplemobiletools.commons.activities.BaseSimpleActivity
import com.simplemobiletools.commons.extensions.getFileOutputStream
import com.simplemobiletools.commons.extensions.toast
import com.simplemobiletools.commons.extensions.writeLn
import com.simplemobiletools.commons.helpers.ensureBackgroundThread
import com.simplemobiletools.commons.models.FileDirItem
import java.io.BufferedWriter
import java.io.File
import java.io.OutputStream
class IcsExporter {
enum class ExportResult {
@ -24,60 +22,57 @@ class IcsExporter {
private var eventsFailed = 0
private var calendars = ArrayList<CalDAVCalendar>()
fun exportEvents(activity: BaseSimpleActivity, file: File, events: ArrayList<Event>, showExportingToast: Boolean, callback: (result: ExportResult) -> Unit) {
val fileDirItem = FileDirItem(file.absolutePath, file.name)
activity.getFileOutputStream(fileDirItem, true) {
if (it == null) {
callback(EXPORT_FAIL)
return@getFileOutputStream
fun exportEvents(activity: BaseSimpleActivity, outputStream: OutputStream?, events: ArrayList<Event>, showExportingToast: Boolean, callback: (result: ExportResult) -> Unit) {
if (outputStream == null) {
callback(EXPORT_FAIL)
return
}
ensureBackgroundThread {
calendars = activity.calDAVHelper.getCalDAVCalendars("", false)
if (showExportingToast) {
activity.toast(R.string.exporting)
}
ensureBackgroundThread {
calendars = activity.calDAVHelper.getCalDAVCalendars("", false)
if (showExportingToast) {
activity.toast(R.string.exporting)
}
outputStream.bufferedWriter().use { out ->
out.writeLn(BEGIN_CALENDAR)
out.writeLn(CALENDAR_PRODID)
out.writeLn(CALENDAR_VERSION)
for (event in events) {
out.writeLn(BEGIN_EVENT)
event.title.replace("\n", "\\n").let { if (it.isNotEmpty()) out.writeLn("$SUMMARY:$it") }
event.description.replace("\n", "\\n").let { if (it.isNotEmpty()) out.writeLn("$DESCRIPTION$it") }
event.importId.let { if (it.isNotEmpty()) out.writeLn("$UID$it") }
event.eventType.let { out.writeLn("$CATEGORY_COLOR${activity.eventTypesDB.getEventTypeWithId(it)?.color}") }
event.eventType.let { out.writeLn("$CATEGORIES${activity.eventTypesDB.getEventTypeWithId(it)?.title}") }
event.lastUpdated.let { out.writeLn("$LAST_MODIFIED:${Formatter.getExportedTime(it)}") }
event.location.let { if (it.isNotEmpty()) out.writeLn("$LOCATION:$it") }
it.bufferedWriter().use { out ->
out.writeLn(BEGIN_CALENDAR)
out.writeLn(CALENDAR_PRODID)
out.writeLn(CALENDAR_VERSION)
for (event in events) {
out.writeLn(BEGIN_EVENT)
event.title.replace("\n", "\\n").let { if (it.isNotEmpty()) out.writeLn("$SUMMARY:$it") }
event.description.replace("\n", "\\n").let { if (it.isNotEmpty()) out.writeLn("$DESCRIPTION$it") }
event.importId.let { if (it.isNotEmpty()) out.writeLn("$UID$it") }
event.eventType.let { out.writeLn("$CATEGORY_COLOR${activity.eventTypesDB.getEventTypeWithId(it)?.color}") }
event.eventType.let { out.writeLn("$CATEGORIES${activity.eventTypesDB.getEventTypeWithId(it)?.title}") }
event.lastUpdated.let { out.writeLn("$LAST_MODIFIED:${Formatter.getExportedTime(it)}") }
event.location.let { if (it.isNotEmpty()) out.writeLn("$LOCATION:$it") }
if (event.getIsAllDay()) {
out.writeLn("$DTSTART;$VALUE=$DATE:${Formatter.getDayCodeFromTS(event.startTS)}")
out.writeLn("$DTEND;$VALUE=$DATE:${Formatter.getDayCodeFromTS(event.endTS + DAY)}")
} else {
event.startTS.let { out.writeLn("$DTSTART:${Formatter.getExportedTime(it * 1000L)}") }
event.endTS.let { out.writeLn("$DTEND:${Formatter.getExportedTime(it * 1000L)}") }
}
out.writeLn("$STATUS$CONFIRMED")
Parser().getRepeatCode(event).let { if (it.isNotEmpty()) out.writeLn("$RRULE$it") }
fillReminders(event, out)
fillIgnoredOccurrences(event, out)
eventsExported++
out.writeLn(END_EVENT)
if (event.getIsAllDay()) {
out.writeLn("$DTSTART;$VALUE=$DATE:${Formatter.getDayCodeFromTS(event.startTS)}")
out.writeLn("$DTEND;$VALUE=$DATE:${Formatter.getDayCodeFromTS(event.endTS + DAY)}")
} else {
event.startTS.let { out.writeLn("$DTSTART:${Formatter.getExportedTime(it * 1000L)}") }
event.endTS.let { out.writeLn("$DTEND:${Formatter.getExportedTime(it * 1000L)}") }
}
out.writeLn(END_CALENDAR)
}
callback(when {
eventsExported == 0 -> EXPORT_FAIL
eventsFailed > 0 -> EXPORT_PARTIAL
else -> EXPORT_OK
})
out.writeLn("$STATUS$CONFIRMED")
Parser().getRepeatCode(event).let { if (it.isNotEmpty()) out.writeLn("$RRULE$it") }
fillReminders(event, out)
fillIgnoredOccurrences(event, out)
eventsExported++
out.writeLn(END_EVENT)
}
out.writeLn(END_CALENDAR)
}
callback(when {
eventsExported == 0 -> EXPORT_FAIL
eventsFailed > 0 -> EXPORT_PARTIAL
else -> EXPORT_OK
})
}
}

View File

@ -6,4 +6,8 @@ interface WeekFragmentListener {
fun updateHoursTopMargin(margin: Int)
fun getCurrScrollY(): Int
fun updateRowHeight(rowHeight: Int)
fun getFullFragmentHeight(): Int
}

View File

@ -2,9 +2,12 @@ package com.simplemobiletools.calendar.pro.views
import android.content.Context
import android.util.AttributeSet
import android.view.MotionEvent
import android.widget.ScrollView
class MyScrollView : ScrollView {
var isScrollable = true
constructor(context: Context) : super(context)
constructor(context: Context, attrs: AttributeSet) : super(context, attrs)
@ -22,6 +25,22 @@ class MyScrollView : ScrollView {
scrollViewListener?.onScrollChanged(this, x, y, oldx, oldy)
}
override fun onTouchEvent(event: MotionEvent): Boolean {
return if (isScrollable) {
super.onTouchEvent(event)
} else {
true
}
}
override fun onInterceptTouchEvent(event: MotionEvent): Boolean {
return if (isScrollable) {
super.onInterceptTouchEvent(event)
} else {
false
}
}
interface ScrollViewListener {
fun onScrollChanged(scrollView: MyScrollView, x: Int, y: Int, oldx: Int, oldy: Int)
}

View File

@ -6,6 +6,7 @@ import android.graphics.Paint
import android.util.AttributeSet
import android.view.View
import com.simplemobiletools.calendar.pro.R
import com.simplemobiletools.calendar.pro.extensions.getWeeklyViewItemHeight
class WeeklyViewGrid(context: Context, attrs: AttributeSet, defStyle: Int) : View(context, attrs, defStyle) {
private val ROWS_CNT = 24
@ -20,7 +21,7 @@ class WeeklyViewGrid(context: Context, attrs: AttributeSet, defStyle: Int) : Vie
override fun onDraw(canvas: Canvas) {
super.onDraw(canvas)
val rowHeight = height / ROWS_CNT.toFloat()
val rowHeight = context.getWeeklyViewItemHeight()
for (i in 0 until ROWS_CNT) {
val y = rowHeight * i.toFloat()
canvas.drawLine(0f, y, width.toFloat(), y, paint)

View File

@ -1,9 +0,0 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="#FFFFFFFF"
android:pathData="M15.41,7.41L14,6l-6,6 6,6 1.41,-1.41L10.83,12z"/>
</vector>

View File

@ -1,9 +0,0 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="#FFFFFFFF"
android:pathData="M10,6L8.59,7.41 13.17,12l-4.58,4.59L10,18l6,-6z"/>
</vector>

View File

@ -661,37 +661,6 @@
</RelativeLayout>
<RelativeLayout
android:id="@+id/settings_end_weekly_at_holder"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/selectableItemBackground"
android:paddingStart="@dimen/normal_margin"
android:paddingTop="@dimen/bigger_margin"
android:paddingEnd="@dimen/normal_margin"
android:paddingBottom="@dimen/bigger_margin">
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/settings_end_weekly_at_label"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_toStartOf="@+id/settings_end_weekly_at"
android:paddingStart="@dimen/medium_margin"
android:paddingEnd="@dimen/medium_margin"
android:text="@string/end_day_at"/>
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/settings_end_weekly_at"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_marginEnd="@dimen/small_margin"
android:background="@null"
android:clickable="false"/>
</RelativeLayout>
<View
android:id="@+id/monthly_view_divider"
android:layout_width="match_parent"
@ -1014,7 +983,6 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/bigger_margin"
android:layout_marginLeft="@dimen/bigger_margin"
android:layout_marginTop="@dimen/activity_margin"
android:text="@string/migrating"
android:textAllCaps="true"
@ -1037,7 +1005,6 @@
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:paddingStart="@dimen/medium_margin"
android:paddingLeft="@dimen/medium_margin"
android:text="@string/export_settings"/>
</RelativeLayout>
@ -1059,7 +1026,6 @@
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:paddingStart="@dimen/medium_margin"
android:paddingLeft="@dimen/medium_margin"
android:text="@string/import_settings"/>
</RelativeLayout>

View File

@ -22,12 +22,12 @@
<com.simplemobiletools.calendar.pro.views.WeeklyViewGrid
android:id="@+id/week_horizontal_grid_holder"
android:layout_width="match_parent"
android:layout_height="@dimen/weekly_view_events_height"/>
android:layout_height="wrap_content"/>
<LinearLayout
android:id="@+id/week_events_columns_holder"
android:layout_width="match_parent"
android:layout_height="@dimen/weekly_view_events_height"
android:layout_height="wrap_content"
android:background="@android:color/transparent"
android:orientation="horizontal">

View File

@ -34,8 +34,7 @@
android:id="@+id/week_view_hours_holder"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
android:paddingBottom="@dimen/weekly_view_row_height"/>
android:orientation="vertical"/>
</com.simplemobiletools.calendar.pro.views.MyScrollView>

View File

@ -1,10 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<com.simplemobiletools.commons.views.MyTextView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/weekly_view_hour_textview"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="bottom|center_horizontal"
android:minHeight="@dimen/weekly_view_row_height"
android:paddingStart="@dimen/small_margin"
android:paddingEnd="@dimen/small_margin"
android:textSize="@dimen/normal_text_size"/>
android:textSize="@dimen/normal_text_size" />

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.4 KiB

After

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.8 KiB

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.9 KiB

After

Width:  |  Height:  |  Size: 5.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 14 KiB

View File

@ -124,7 +124,6 @@
<string name="override_event_types">تجاوز أنواع الأحداث في الملف</string>
<!-- Event details -->
<string name="title">العنوان</string>
<string name="location">الموقع</string>
<string name="description">الوصف</string>
<string name="all_day">كامل اليوم</string>
@ -253,7 +252,7 @@
<!-- App title has to have less than 50 characters. If you cannot squeeze it, just remove a part of it -->
<string name="app_title">التقويم البسيط الاحترافي - مناسبات وتنبيهات</string>
<!-- Short description has to have less than 80 chars -->
<string name="app_short_description">سيتم تنبيهك بكل اللحظات المهمة في حياتك</string>
<string name="app_short_description">Simple mobile 2020 calendar. Schedule planner &amp; appointment reminder for any day</string>
<string name="app_long_description">
Simple Calendar Pro is a fully customizable, offline calendar designed to do exactly what a calendar should do. <b>No complicated features, unnecessary permissions and no ads!</b>

View File

@ -124,7 +124,6 @@
<string name="override_event_types">Faylın içərisində hadisə tiplərini üstünə yaz</string>
<!-- Event details -->
<string name="title">Başlıq</string>
<string name="location">Məkan</string>
<string name="description">Əlavələr</string>
<string name="all_day">Bütün-gün</string>
@ -247,7 +246,7 @@
<!-- App title has to have less than 50 characters. If you cannot squeeze it, just remove a part of it -->
<string name="app_title">Simple Calendar Pro - Events &amp; Reminders</string>
<!-- Short description has to have less than 80 chars -->
<string name="app_short_description">Be notified of the important moments in your life.</string>
<string name="app_short_description">Simple mobile 2020 calendar. Schedule planner &amp; appointment reminder for any day</string>
<string name="app_long_description">
Simple Calendar Pro is a fully customizable, offline calendar designed to do exactly what a calendar should do. <b>No complicated features, unnecessary permissions and no ads!</b>

View File

@ -128,7 +128,6 @@
<string name="override_event_types">ফাইলটিতে ইভেন্ট টাইপগুলি ওভাররাইড করুন</string>
<!-- Event details -->
<string name="title">টাইটেল</string>
<string name="location">লোকেশন</string>
<string name="description">বর্ণনা</string>
<string name="all_day">সারাদিন</string>
@ -250,7 +249,7 @@
<!-- App title has to have less than 50 characters. If you cannot squeeze it, just remove a part of it -->
<string name="app_title">সাধারণ ক্যালেন্ডার প্রো - ইভেন্ট এবং রিমাইন্ডার</string>
<!-- Short description has to have less than 80 chars -->
<string name="app_short_description">আপনার জীবনের গুরুত্বপূর্ণ মুহুর্তগুলিতে অবহিত হন।</string>
<string name="app_short_description">Simple mobile 2020 calendar. Schedule planner &amp; appointment reminder for any day</string>
<string name="app_long_description">
সাধারণ ক্যালেন্ডার প্রো একটি সম্পূর্ণ কাস্টমাইজযোগ্য, অফলাইন ক্যালেন্ডার যা একটি ক্যালেন্ডারের ঠিক কী করা উচিত সেটার জন্য ডিজাইন করা হয়েছে। <b>কোনও জটিল ফিচার, অপ্রয়োজনীয় অনুমতি এবং কোনও বিজ্ঞাপন নেই!</b>

View File

@ -124,7 +124,6 @@
<string name="override_event_types">Override event types in the file</string>
<!-- Event details -->
<string name="title">Titl</string>
<string name="location">Lec\'hiadur</string>
<string name="description">Deskrivadur</string>
<string name="all_day">Devezh-pad</string>
@ -247,7 +246,7 @@
<!-- App title has to have less than 50 characters. If you cannot squeeze it, just remove a part of it -->
<string name="app_title">Simple Calendar Pro - Events &amp; Reminders</string>
<!-- Short description has to have less than 80 chars -->
<string name="app_short_description">Be notified of the important moments in your life.</string>
<string name="app_short_description">Simple mobile 2020 calendar. Schedule planner &amp; appointment reminder for any day</string>
<string name="app_long_description">
Simple Calendar Pro is a fully customizable, offline calendar designed to do exactly what a calendar should do. <b>No complicated features, unnecessary permissions and no ads!</b>

View File

@ -124,7 +124,6 @@
<string name="override_event_types">Přepsat typy událostí v souboru</string>
<!-- Event details -->
<string name="title">Název</string>
<string name="location">Lokace</string>
<string name="description">Popis</string>
<string name="all_day">Celý den</string>
@ -247,7 +246,7 @@
<!-- App title has to have less than 50 characters. If you cannot squeeze it, just remove a part of it -->
<string name="app_title">Jednoduchý kalendář Pro - Události a připomínky</string>
<!-- Short description has to have less than 80 chars -->
<string name="app_short_description">Nezmeškejte důležité okamžiky svého života.</string>
<string name="app_short_description">Simple mobile 2020 calendar. Schedule planner &amp; appointment reminder for any day</string>
<string name="app_long_description">
Jednoduchý kalendář Pro je plně přizpůsobitelný offline kalendář vytvořený přesně pro to, co by kalendáře měly dělat. <b>Žádné zbytečné funkce, nepotřebná oprávnění, ani reklamy!</b>

View File

@ -124,7 +124,6 @@
<string name="override_event_types">Overskriv begivenhedstyper i filen</string>
<!-- Event details -->
<string name="title">Titel</string>
<string name="location">Sted</string>
<string name="description">Beskrivelse</string>
<string name="all_day">Hele dagen</string>
@ -244,7 +243,7 @@
<!-- App title has to have less than 50 characters. If you cannot squeeze it, just remove a part of it -->
<string name="app_title">Simpel kalender Pro - Begivenheder &amp; påmindelser</string>
<!-- Short description has to have less than 80 chars -->
<string name="app_short_description">Bliv mindet om vigtige tidspunkter i dit liv.</string>
<string name="app_short_description">Simpel mobil 2020-kalender. Planlægningsværktøj &amp; aftalepåmindelser for hver dag.</string>
<string name="app_long_description">
Simpel kalender Pro kan tilpasses helt efter din smag, offline kalender er designet til at gøre præcis hvad en kalender skal kunne. <b>Ingen indviklede funktioner, ingen overflødige tilladelser og ingen reklamer!</b>
@ -280,7 +279,7 @@
<b>Se hele suiten af Simple værktøjer her:</b>
https://www.simplemobiletools.com
<b>Standalone website of Simple Calendar Pro:</b>
<b>Simple Calendar Pros hjemmeside:</b>
https://www.simplemobiletools.com/calendar
<b>Facebook:</b>

View File

@ -99,7 +99,7 @@
<string name="reminder">Erinnerung</string>
<string name="before">vorher</string>
<string name="add_another_reminder">Weitere Erinnerung hinzufügen</string>
<string name="event_reminders">Termin-Erinnerungen</string>
<string name="event_reminders">Terminerinnerungen</string>
<!-- Event attendees -->
<string name="add_another_attendee">Teilnehmer hinzufügen</string>
@ -110,21 +110,20 @@
<string name="invited">Eingeladen</string>
<!-- Time zones -->
<string name="enter_a_country">Enter a country or time zone</string>
<string name="enter_a_country">Region, Stadt oder Zeitversatz eingeben</string>
<!-- Export / Import -->
<string name="import_events">Termine importieren</string>
<string name="export_events">Termine exportieren</string>
<string name="import_events_from_ics">Termine aus .ics-Datei importieren</string>
<string name="export_events_to_ics">Termine als .ics-Datei exportieren</string>
<string name="default_event_type">Standard-Termintyp</string>
<string name="import_events_from_ics">Termine aus ics-Datei importieren</string>
<string name="export_events_to_ics">Termine als ics-Datei exportieren</string>
<string name="default_event_type">Standardtermintyp</string>
<string name="export_past_events_too">Vergangene Termine auch exportieren</string>
<string name="include_event_types">Termintypen miteinbeziehen</string>
<string name="filename_without_ics">Dateiname (ohne .ics)</string>
<string name="override_event_types">Termintypen in der Datei überschreiben</string>
<!-- Event details -->
<string name="title">Titel</string>
<string name="location">Ort</string>
<string name="description">Beschreibung</string>
<string name="all_day">Ganztags</string>
@ -139,9 +138,9 @@
<string name="type_already_exists">Typ mit diesem Namen existiert bereits</string>
<string name="color">Farbe</string>
<string name="regular_event">Regulärer Termin</string>
<string name="cannot_delete_default_type">Standard-Termintyp kann nicht gelöscht werden</string>
<string name="cannot_delete_default_type">Standardtermintyp kann nicht gelöscht werden</string>
<string name="select_event_type">Wähle einen Termintyp aus</string>
<string name="move_events_into_default">Betroffene Termine in den Standard-Termintyp verschieben</string>
<string name="move_events_into_default">Betroffene Termine in den Standardtermintyp verschieben</string>
<string name="remove_affected_events">Betroffene Termine dauerhaft löschen</string>
<string name="unsync_caldav_calendar">Um einen CalDAV-Kalender zu entfernen, musst du ihn desynchronisieren</string>
@ -174,7 +173,7 @@
<string name="loop_reminders">Erinnerungen wiederholen bis sie verworfen werden</string>
<string name="dim_past_events">Vergangene Termine ausgrauen</string>
<string name="events">Termine</string>
<string name="reminder_stream">Audio-Ausgabekanal für Erinnerungen</string>
<string name="reminder_stream">Audioausgabekanal für Erinnerungen</string>
<string name="system_stream">Medien</string>
<string name="alarm_stream">Wecker</string>
<string name="notification_stream">Benachrichtigung</string>
@ -186,13 +185,13 @@
<string name="view_to_open_from_widget">Ansicht beim Öffnen durch das Terminlisten-Widget</string>
<string name="last_view">Letzte Ansicht</string>
<string name="new_events">Neue Termine</string>
<string name="default_start_time">Standard-Anfangszeit</string>
<string name="default_start_time">Standardanfangszeit</string>
<string name="next_full_hour">Nächste volle Stunde</string>
<string name="default_duration">Standard-Dauer</string>
<string name="default_duration">Standarddauer</string>
<string name="last_used_one">Zuletzt verwendete</string>
<string name="other_time">Andere Zeit</string>
<string name="highlight_weekends">Wochenenden in einigen Ansichten hervorheben</string>
<string name="allow_changing_time_zones">Allow changing event time zones</string>
<string name="allow_changing_time_zones">Zeitzone kann geändert werden</string>
<!-- CalDAV sync -->
<string name="caldav">CalDAV</string>
@ -207,7 +206,7 @@
<string name="synchronization_completed">Synchronisation erfolgreich</string>
<string name="select_a_different_caldav_color">Wähle eine andere Farbe (wird möglicherweise nur lokal angewendet)</string>
<string name="insufficient_permissions">Dir fehlt die Berechtigung zum Ändern des gewählten Kalenders</string>
<string name="caldav_event_not_found">Event not found. Please enable CalDAV sync for the appropriate calendar in the app settings.</string>
<string name="caldav_event_not_found">Der Termin wurde nicht gefunden. Bitte aktiviere die Synchronisierung für den Kalender in den Einstellungen.</string>
<!-- alternative versions for some languages, use the same translations if you are not sure what this means -->
<!-- used in repetition, like "Every last Sunday" -->
@ -239,16 +238,16 @@
Für andere Kalender benötigst du einen Synchronisierungsadapter, wie z. B. DAVx5.</string>
<string name="faq_3_title">Ich sehe die Erinnerungen, aber ich höre keinen Ton. Was kann ich tun?</string>
<string name="faq_3_text">Erinnerungen nicht nur anzeigen, sondern Töne dazu abspielen ist ebenfalls stark vom jeweiligen (Android) System abhängig. Wenn Du keine Töne hörst, versuche in den App Einstellungen,
die Option \"Audio-Ausgabekanal für Erinnerungen\" anzuklicken und eine andere Option auszuwählen. Wenn das immer noch nichts ändert, prüfe Deine Lautstärkeeinstellungen. of der gewählte Kanal nicht auf lautlos steht.</string>
<string name="faq_4_title">Does the app support time zones?</string>
<string name="faq_4_text">Yes, it does. By default all events are created in your current time zone. If you want to change an events\' time zone,
you will first have to enable the time zone picker at the app settings, then change it at the Event Details screen. It is disabled by default as most people won\'t need it.</string>
die Option \"Audioausgabekanal für Erinnerungen\" anzuklicken und eine andere Option auszuwählen. Wenn das immer noch nichts ändert, prüfe Deine Lautstärkeeinstellungen. of der gewählte Kanal nicht auf lautlos steht.</string>
<string name="faq_4_title">Unterstützt diese Kalender-App Zeitzonen?</string>
<string name="faq_4_text">Ja. Standardmäßig werden alle neuen Termine in der aktuellen Zeitzone des Gerätes erstellt. Um die Zeitzone eines Termins ändern zu können muss die Option \"Zeitzone kann geändert werden\"
in den Einstellungen aktiviert sein. Die Zeitzone eines Termins kann dann beim Anlegen oder Bearbeiten geändert werden. In den Standardeinstellungen ist dies nicht aktiv, da die meisten Anwender die Möglichkeit nicht benötigen werden.</string>
<!-- Strings displayed only on Google Playstore. Optional, but good to have -->
<!-- App title has to have less than 50 characters. If you cannot squeeze it, just remove a part of it -->
<string name="app_title">Simple Calendar Pro - Termine &amp; Erinnerungen</string>
<!-- Short description has to have less than 80 chars -->
<string name="app_short_description">Be notified of the important moments in your life.</string>
<string name="app_short_description">Simple mobile 2020 calendar. Schedule planner &amp; appointment reminder for any day</string>
<string name="app_long_description">
Simple Calendar Pro ist ein vollständig anpassbarer Offline-Kalender, der genau das bietet, was man von einem Kalender erwartet. <b>Keine umständlichen Funktionen, keine unnötigen Berechtigungen und keine Werbung!</b>
@ -284,7 +283,7 @@
<b>Einen Überblick über die komplette Suite von Simple Tools gibt es hier:</b>
https://www.simplemobiletools.com
<b>Standalone website of Simple Calendar Pro:</b>
<b>Eigene Website von Simple Calendar Pro:</b>
https://www.simplemobiletools.com/calendar
<b>Facebook:</b>

View File

@ -124,7 +124,6 @@
<string name="override_event_types">Κατάργηση τύπων εκδηλώσεων στο αρχείο</string>
<!-- Event details -->
<string name="title">Τίτλος</string>
<string name="location">Τοποθεσία</string>
<string name="description">Περιγραφή</string>
<string name="all_day">Ημερήσια</string>
@ -247,7 +246,7 @@
<!-- App title has to have less than 50 characters. If you cannot squeeze it, just remove a part of it -->
<string name="app_title">Απλό Ημερολόγιο Pro - Εκδηλώσεων &amp; Ειδοποιήσεων</string>
<!-- Short description has to have less than 80 chars -->
<string name="app_short_description">Ενημερώνεστε για τις σημαντικές στιγμές της ζωή σας.</string>
<string name="app_short_description">Απλό Ημερολόγιο 2020. Προγραμματισμός &amp; υπενθύμιση συνάντησης για κάθε ημέρα</string>
<string name="app_long_description">
Το Απλό Ημερολόγιο Pro είναι ένα ημερολόγιο πλήρως προσαρμόσιμο εκτός σύνδεσης που έχει σχεδιαστεί για να κάνει ακριβώς αυτό που υπόσχεται. <b>Δεν υπάρχουν περίπλοκες λειτουργίες, περιττά δικαιώματα και διαφημίσεις!</b>

View File

@ -124,7 +124,6 @@
<string name="override_event_types">Sobreescribir tipos de evento en el archivo</string>
<!-- Event details -->
<string name="title">Título</string>
<string name="location">Ubicación</string>
<string name="description">Descripción</string>
<string name="all_day">Todo el día</string>
@ -247,7 +246,7 @@
<!-- App title has to have less than 50 characters. If you cannot squeeze it, just remove a part of it -->
<string name="app_title">Calendario Simple Pro - Eventos y Recordatorios</string>
<!-- Short description has to have less than 80 chars -->
<string name="app_short_description">Se notificado de los momentos importantes en tu vida.</string>
<string name="app_short_description">Simple mobile 2020 calendar. Schedule planner &amp; appointment reminder for any day</string>
<string name="app_long_description">
Calendario Simple Pro es un calendario fuera de línea, totalmente personalizable y diseñado para hacer exactamente lo que debe hacer un calendario. <b> ¡Sin funcionalidades complicadas, permisos innecesarios y sin anuncios! </b>

View File

@ -86,14 +86,14 @@
<string name="birthdays">Anniversaires</string>
<string name="add_birthdays">Ajouter les anniversaires des contacts</string>
<string name="no_birthdays">Aucun anniversaire n\a été trouvé</string>
<string name="no_new_birthdays">No new birthdays have been found</string>
<string name="no_new_birthdays">Aucun nouvel anniversaire na été trouvé</string>
<string name="birthdays_added">Anniversaires ajoutés avec succès</string>
<!-- Anniversaries -->
<string name="anniversaries">Anniversaires d\évènements</string>
<string name="add_anniversaries">Ajouter des anniversaires d\évènements de contact</string>
<string name="no_anniversaries">Aucun anniversaire d\évènements n\a été trouvé</string>
<string name="no_new_anniversaries">No new anniversaries have been found</string>
<string name="no_new_anniversaries">Aucun nouvel anniversaire na été trouvé</string>
<string name="anniversaries_added">Anniversaires d\évènements ajoutés avec succès</string>
<!-- Event Reminders -->
@ -111,7 +111,7 @@
<string name="invited">Invité</string>
<!-- Time zones -->
<string name="enter_a_country">Enter a country or time zone</string>
<string name="enter_a_country">Entrez un pays ou un fuseau horaire</string>
<!-- Export / Import -->
<string name="import_events">Importer des événements</string>
@ -125,7 +125,6 @@
<string name="override_event_types">Remplacer les types d\événement dans le fichier</string>
<!-- Event details -->
<string name="title">Titre</string>
<string name="location">Lieu</string>
<string name="description">Description</string>
<string name="all_day">Journée</string>
@ -179,7 +178,7 @@
<string name="system_stream">System</string>
<string name="alarm_stream">Alarme</string>
<string name="notification_stream">Notification</string>
<string name="ring_stream">Ring</string>
<string name="ring_stream">Sonnerie</string>
<string name="use_last_event_reminders">Utiliser les rappels des derniers événements comme valeur par défaut pour un nouvel événement</string>
<string name="default_reminder_1">Rappel par défaut 1</string>
<string name="default_reminder_2">Rappel par défaut 2</string>
@ -192,8 +191,8 @@
<string name="default_duration">Durée par défaut</string>
<string name="last_used_one">Identique au dernier</string>
<string name="other_time">Autre moment</string>
<string name="highlight_weekends">Highlight weekends on some views</string>
<string name="allow_changing_time_zones">Allow changing event time zones</string>
<string name="highlight_weekends">Mettez en surbrillance les week-ends sur certaines vues</string>
<string name="allow_changing_time_zones">Autoriser la modification des fuseaux horaires des événements</string>
<!-- CalDAV sync -->
<string name="caldav">CalDAV</string>
@ -208,7 +207,7 @@
<string name="synchronization_completed">La synchronisation est terminée</string>
<string name="select_a_different_caldav_color">Sélectionnez une couleur différente (peut être appliqué localement uniquement)</string>
<string name="insufficient_permissions">Vous n\êtes pas autorisé à écrire dans l\agenda sélectionné</string>
<string name="caldav_event_not_found">Event not found. Please enable CalDAV sync for the appropriate calendar in the app settings.</string>
<string name="caldav_event_not_found">Événement introuvable. Veuillez activer la synchronisation CalDAV pour le calendrier approprié dans les paramètres de lapplication.</string>
<!-- alternative versions for some languages, use the same translations if you are not sure what this means -->
<!-- used in repetition, like "Every last Sunday" -->
@ -240,15 +239,14 @@
<string name="faq_3_title">Je vois les rappels visuels, mais n\entends aucun son. Que puis-je faire?</string>
<string name="faq_3_text">Pas seulement l\affichage du rappel, mais la lecture de l\audio est également énormément affectée par le système. Si vous nentendez aucun son, essayez dentrer dans les paramètres de lappli,
en appuyant sur l\option « Flux audio utilisé par les rappels » et en la modifiant. Si cela ne fonctionne toujours pas, vérifiez vos paramètres audio, si le flux particulier nest pas mis en sourdine.</string>
<string name="faq_4_title">Does the app support time zones?</string>
<string name="faq_4_text">Yes, it does. By default all events are created in your current time zone. If you want to change an events\' time zone,
you will first have to enable the time zone picker at the app settings, then change it at the Event Details screen. It is disabled by default as most people won\'t need it.</string>
<string name="faq_4_title">Lapplication prend-elle en charge les fuseaux horaires?</string>
<string name="faq_4_text">Oui. Par défaut, tous les événements sont créés dans votre fuseau horaire actuel. Si vous souhaitez modifier le fuseau horaire dun événement, vous devez dabord activer le sélecteur de fuseau horaire dans les paramètres de lapplication, puis le modifier sur lécran Détails de lévénement. Il est désactivé par défaut car la plupart des gens nen auront pas besoin.</string>
<!-- Strings displayed only on Google Playstore. Optional, but good to have -->
<!-- App title has to have less than 50 characters. If you cannot squeeze it, just remove a part of it -->
<string name="app_title">Simple Calendar Pro - Events &amp; Reminders</string>
<string name="app_title">Simple Calendar Pro - Evénements &amp; Rappels</string>
<!-- Short description has to have less than 80 chars -->
<string name="app_short_description">Be notified of the important moments in your life.</string>
<string name="app_short_description">Calendrier mobile 2020. Planificat. d\'horaire; rappel de RDV n\'importe quel jour</string>
<string name="app_long_description">
Simple Calendar Pro is a fully customizable, offline calendar designed to do exactly what a calendar should do. <b>No complicated features, unnecessary permissions and no ads!</b>

View File

@ -124,7 +124,6 @@
<string name="override_event_types">Sobreescribir tipos de evento no ficheiro</string>
<!-- Event details -->
<string name="title">Título</string>
<string name="location">Localización</string>
<string name="description">Descrición</string>
<string name="all_day">Todo o día</string>
@ -247,7 +246,7 @@
<!-- App title has to have less than 50 characters. If you cannot squeeze it, just remove a part of it -->
<string name="app_title">Simple Calendar Pro - Events &amp; Reminders</string>
<!-- Short description has to have less than 80 chars -->
<string name="app_short_description">Be notified of the important moments in your life.</string>
<string name="app_short_description">Simple mobile 2020 calendar. Schedule planner &amp; appointment reminder for any day</string>
<string name="app_long_description">
Simple Calendar Pro is a fully customizable, offline calendar designed to do exactly what a calendar should do. <b>No complicated features, unnecessary permissions and no ads!</b>

View File

@ -124,7 +124,6 @@
<string name="override_event_types">שנה סוגי אירועים בקובץ</string>
<!-- Event details -->
<string name="title">כותרת</string>
<string name="location">מיקום</string>
<string name="description">תיאור</string>
<string name="all_day">כל היום</string>
@ -247,7 +246,7 @@
<!-- App title has to have less than 50 characters. If you cannot squeeze it, just remove a part of it -->
<string name="app_title">Simple Calendar Pro - יומן פשוט</string>
<!-- Short description has to have less than 80 chars -->
<string name="app_short_description">Be notified of the important moments in your life.</string>
<string name="app_short_description">Simple mobile 2020 calendar. Schedule planner &amp; appointment reminder for any day</string>
<string name="app_long_description">
Simple Calendar Pro is a fully customizable, offline calendar designed to do exactly what a calendar should do. <b>No complicated features, unnecessary permissions and no ads!</b>

View File

@ -124,7 +124,6 @@
<string name="override_event_types">Override event types in the file</string>
<!-- Event details -->
<string name="title">शीर्षक</string>
<string name="location">Location</string>
<string name="description">विवरण</string>
<string name="all_day">All-day</string>
@ -247,7 +246,7 @@
<!-- App title has to have less than 50 characters. If you cannot squeeze it, just remove a part of it -->
<string name="app_title">Simple Calendar Pro - Events &amp; Reminders</string>
<!-- Short description has to have less than 80 chars -->
<string name="app_short_description">Be notified of the important moments in your life.</string>
<string name="app_short_description">Simple mobile 2020 calendar. Schedule planner &amp; appointment reminder for any day</string>
<string name="app_long_description">
Simple Calendar Pro is a fully customizable, offline calendar designed to do exactly what a calendar should do. <b>No complicated features, unnecessary permissions and no ads!</b>

View File

@ -124,7 +124,6 @@
<string name="override_event_types">Override event types in the file</string>
<!-- Event details -->
<string name="title">Naslov</string>
<string name="location">Lokacija</string>
<string name="description">Opis</string>
<string name="all_day">Cjelodnevni</string>
@ -247,7 +246,7 @@
<!-- App title has to have less than 50 characters. If you cannot squeeze it, just remove a part of it -->
<string name="app_title">Simple Calendar Pro - Events &amp; Reminders</string>
<!-- Short description has to have less than 80 chars -->
<string name="app_short_description">Be notified of the important moments in your life.</string>
<string name="app_short_description">Simple mobile 2020 calendar. Schedule planner &amp; appointment reminder for any day</string>
<string name="app_long_description">
Simple Calendar Pro is a fully customizable, offline calendar designed to do exactly what a calendar should do. <b>No complicated features, unnecessary permissions and no ads!</b>

View File

@ -124,7 +124,6 @@
<string name="override_event_types">Override event types in the file</string>
<!-- Event details -->
<string name="title">Név</string>
<string name="location">Location</string>
<string name="description">Leírás</string>
<string name="all_day">All-day</string>
@ -247,7 +246,7 @@
<!-- App title has to have less than 50 characters. If you cannot squeeze it, just remove a part of it -->
<string name="app_title">Simple Calendar Pro - Events &amp; Reminders</string>
<!-- Short description has to have less than 80 chars -->
<string name="app_short_description">Be notified of the important moments in your life.</string>
<string name="app_short_description">Simple mobile 2020 calendar. Schedule planner &amp; appointment reminder for any day</string>
<string name="app_long_description">
Simple Calendar Pro is a fully customizable, offline calendar designed to do exactly what a calendar should do. <b>No complicated features, unnecessary permissions and no ads!</b>

View File

@ -124,7 +124,6 @@
<string name="override_event_types">Timpa kategori acara di dalam berkas</string>
<!-- Event details -->
<string name="title">Judul</string>
<string name="location">Lokasi</string>
<string name="description">Deskripsi</string>
<string name="all_day">Sepanjang hari</string>
@ -247,7 +246,7 @@
<!-- App title has to have less than 50 characters. If you cannot squeeze it, just remove a part of it -->
<string name="app_title">Simple Calendar Pro - Acara &amp; Pengingat</string>
<!-- Short description has to have less than 80 chars -->
<string name="app_short_description">Selalu mengingatkan semua momen penting dalam hidup anda.</string>
<string name="app_short_description">Simple mobile 2020 calendar. Schedule planner &amp; appointment reminder for any day</string>
<string name="app_long_description">
Simple Calendar Pro adalah kalender luring sederhana yang mudah digunakan dan dibuat sesuai dengan fungsi-fungsi dasar sebuah kalender. <b>Tanpa fitur yang terlalu rumit, perizinan yang tidak diperlukan dan sama sekali tanpa iklan!</b>

View File

@ -124,7 +124,6 @@
<string name="override_event_types">Timpa kategori acara di dalam berkas</string>
<!-- Event details -->
<string name="title">Judul</string>
<string name="location">Lokasi</string>
<string name="description">Deskripsi</string>
<string name="all_day">Sepanjang hari</string>
@ -247,7 +246,7 @@
<!-- App title has to have less than 50 characters. If you cannot squeeze it, just remove a part of it -->
<string name="app_title">Simple Calendar Pro - Acara &amp; Pengingat</string>
<!-- Short description has to have less than 80 chars -->
<string name="app_short_description">Selalu mengingatkan semua momen penting dalam hidup anda.</string>
<string name="app_short_description">Simple mobile 2020 calendar. Schedule planner &amp; appointment reminder for any day</string>
<string name="app_long_description">
Simple Calendar Pro adalah kalender luring sederhana yang mudah digunakan dan dibuat sesuai dengan fungsi-fungsi dasar sebuah kalender. <b>Tanpa fitur yang terlalu rumit, perizinan yang tidak diperlukan dan sama sekali tanpa iklan!</b>

View File

@ -124,7 +124,6 @@
<string name="override_event_types">Sovrascrivi i tipi di eventi nel file</string>
<!-- Event details -->
<string name="title">Titolo</string>
<string name="location">Posizione</string>
<string name="description">Descrizione</string>
<string name="all_day">Tutto il giorno</string>
@ -247,7 +246,7 @@
<!-- App title has to have less than 50 characters. If you cannot squeeze it, just remove a part of it -->
<string name="app_title">Semplice Calendario Pro - Eventi &amp; Promemoria</string>
<!-- Short description has to have less than 80 chars -->
<string name="app_short_description">Be notified of the important moments in your life.</string>
<string name="app_short_description">Simple mobile 2020 calendar. Schedule planner &amp; appointment reminder for any day</string>
<string name="app_long_description">
Semplice Calendario Pro è un calendario offline completamente personalizzabile progettato per fare esattamente quello che un calendario dovrebbe fare. <b>Non ci sono funzionalità complicate, permessi non necessari e senza pubblicità!</b>

View File

@ -124,7 +124,6 @@
<string name="override_event_types">שנה סוגי אירועים בקובץ</string>
<!-- Event details -->
<string name="title">כותרת</string>
<string name="location">מיקום</string>
<string name="description">תיאור</string>
<string name="all_day">כל היום</string>
@ -247,7 +246,7 @@
<!-- App title has to have less than 50 characters. If you cannot squeeze it, just remove a part of it -->
<string name="app_title">Simple Calendar Pro - יומן פשוט</string>
<!-- Short description has to have less than 80 chars -->
<string name="app_short_description">Be notified of the important moments in your life.</string>
<string name="app_short_description">Simple mobile 2020 calendar. Schedule planner &amp; appointment reminder for any day</string>
<string name="app_long_description">
Simple Calendar Pro is a fully customizable, offline calendar designed to do exactly what a calendar should do. <b>No complicated features, unnecessary permissions and no ads!</b>

View File

@ -124,7 +124,6 @@
<string name="override_event_types">ファイル内の予定の種類を上書きする</string>
<!-- Event details -->
<string name="title">タイトル</string>
<string name="location">場所</string>
<string name="description">説明</string>
<string name="all_day">終日</string>
@ -247,7 +246,7 @@
<!-- App title has to have less than 50 characters. If you cannot squeeze it, just remove a part of it -->
<string name="app_title">Simple Calendar Pro - Events &amp; Reminders</string>
<!-- Short description has to have less than 80 chars -->
<string name="app_short_description">Be notified of the important moments in your life.</string>
<string name="app_short_description">Simple mobile 2020 calendar. Schedule planner &amp; appointment reminder for any day</string>
<string name="app_long_description">
Simple Calendar Pro is a fully customizable, offline calendar designed to do exactly what a calendar should do. <b>No complicated features, unnecessary permissions and no ads!</b>

View File

@ -124,7 +124,6 @@
<string name="override_event_types">파일에서 일정 유형 재정의</string>
<!-- Event details -->
<string name="title">제목</string>
<string name="location">위치</string>
<string name="description">내용</string>
<string name="all_day">종일</string>
@ -246,7 +245,7 @@
<!-- App title has to have less than 50 characters. If you cannot squeeze it, just remove a part of it -->
<string name="app_title">Simple Calendar Pro - 일정 &amp; 알림</string>
<!-- Short description has to have less than 80 chars -->
<string name="app_short_description">당신의 인생에 있어 중요한 순간을 알립니다.</string>
<string name="app_short_description">Simple mobile 2020 calendar. Schedule planner &amp; appointment reminder for any day</string>
<string name="app_long_description">
Simple Calendar Pro는 캘린더의 기능을 정확하게 수행하도록 설계된 사용자 정의 오프라인 캘린더입니다. <b>복잡한 기능, 불필요한 권한 및 광고가 없습니다!</b>

View File

@ -124,7 +124,6 @@
<string name="override_event_types">Override event types in the file</string>
<!-- Event details -->
<string name="title">Pavadinimas</string>
<string name="location">Vieta</string>
<string name="description">Apibūdinimas</string>
<string name="all_day">Visos dienos</string>
@ -247,7 +246,7 @@
<!-- App title has to have less than 50 characters. If you cannot squeeze it, just remove a part of it -->
<string name="app_title">Simple Calendar Pro - Events &amp; Reminders</string>
<!-- Short description has to have less than 80 chars -->
<string name="app_short_description">Be notified of the important moments in your life.</string>
<string name="app_short_description">Simple mobile 2020 calendar. Schedule planner &amp; appointment reminder for any day</string>
<string name="app_long_description">
Simple Calendar Pro is a fully customizable, offline calendar designed to do exactly what a calendar should do. <b>No complicated features, unnecessary permissions and no ads!</b>

View File

@ -0,0 +1,296 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">Vienkāršais kalendārs</string>
<string name="app_launcher_name">Kalendārs</string>
<string name="change_view">Mainīt skatu</string>
<string name="daily_view">Dienas skats</string>
<string name="weekly_view">Nedēļas skats</string>
<string name="monthly_view">Mēneša skats</string>
<string name="yearly_view">Gada skats</string>
<string name="simple_event_list">Vienkāršs notikumu saraksts</string>
<string name="no_upcoming_events">Izskatās, ka jums nav gaidāmo notikumu.</string>
<string name="go_to_today">Iet uz šodienu</string>
<string name="go_to_date">Iet uz datumu</string>
<string name="upgraded_from_free">Sveiki!\n\n Šķiet, ka esiet paaugstinājuši versiju no vecās bezmaksas lietotnes. Lokāli saglabātie notikumi ir manuāli jāpārceļ, tos eksportējot uz .ics failu un pēc tam importējot. Abas eksporta/importa pogas var atrast galvenā skata izvēlnē.\N\nPēc tam varat noņemt veco versiju, kurai lietotnes iestatījumu augšpusē ir poga \'Upgrade to Pro\'. Pēc tam Jums būs tikai jāveic lietotnes iestatījumu atstatīšana.\N\nTencinam!</string>
<!-- Widget titles -->
<string name="widget_monthly">Mēneša kalendārs</string>
<string name="widget_list">Kalendāra notikumu saraksts</string>
<!-- Event -->
<string name="event">Notikums</string>
<string name="edit_event">Rediģēt notikumu</string>
<string name="new_event">Jauns notikums</string>
<string name="create_new_event">Izveidot jaunu notikumu</string>
<string name="duplicate_event">Notikuma dublikāts</string>
<string name="title_empty">Nosaukums nedrīkst būt atstāts tukšs</string>
<string name="end_before_start">Notikums nevar beigties pirms tā sākuma</string>
<string name="event_added">Notikums veiksmīgi pievienots</string>
<string name="event_updated">Notikums veiksmīgi aktualizēts</string>
<string name="filter_events_by_type">Filtrējiet notikumus pēc tipa</string>
<string name="please_fill_location">Lūdzu, ievadiet/norādiet atrašanās vietu, kuru parādīt kartē</string>
<string name="public_event_notification_text">Gaidāms/Priekšāstāvošs notikums</string>
<!-- Event Repetition -->
<string name="repetition">Atkārtojošs</string>
<string name="no_repetition">Bez atkārtošanās</string>
<string name="daily">Ik dienu</string>
<string name="weekly">Ik nedēļu</string>
<string name="monthly">Ik mēnesi</string>
<string name="yearly">Ik gadu</string>
<string name="weeks_raw">nedēļas</string>
<string name="months_raw">mēneši</string>
<string name="years_raw">gadi</string>
<string name="repeat_till">Atkārtot līdz</string>
<string name="forever">Bezgalīgi</string>
<string name="event_is_repeatable">Notikums ir atkārtojošs</string>
<string name="selection_contains_repetition">Atlasītajos ir atkārtojoši/periodiski notikumi</string>
<string name="delete_one_only">Dzēst tikai šo atlasīto notikumu</string>
<string name="delete_future_occurrences">Dzēst šo un visus turpmākos notikumus</string>
<string name="delete_all_occurrences">Dzēst visus šos notikumus</string>
<string name="update_one_only">Aktualizēt tikai šo atlasīto notikumu</string>
<string name="update_all_occurrences">Aktualizēt šos visus notikumus</string>
<string name="repeat_till_date">Atkārtot līdz datumam</string>
<string name="stop_repeating_after_x">Atkārtot X reizes</string>
<string name="repeat_forever">Atkārtot bezgalīgi</string>
<string name="times">reizes</string>
<string name="repeat">Atkārtot</string>
<string name="repeat_on">Atkārtot iekš</string>
<string name="every_day">Katru dienu</string>
<string name="selected_days">Izvēlētajās dienās</string>
<string name="the_same_day">Šajā pašā dienā</string>
<string name="the_last_day">Pēdējā dienā</string>
<string name="repeat_on_the_same_day_monthly">Atkārtot ik mēnesi vienā un tajā pašā dienā</string>
<string name="repeat_on_the_last_day_monthly">Atkārtot mēneša pēdējā dienā</string>
<string name="repeat_on_the_same_day_yearly">Atkārtot ik gadu vienā un tajā pašā dienā</string>
<string name="repeat_every_m">Atkārtot katru</string>
<string name="every_m">Katru</string>
<string name="first_m">1.</string>
<string name="second_m">2.</string>
<string name="third_m">3.</string>
<string name="fourth_m">4.</string>
<string name="last_m">pēdēj.</string>
<!-- alternative versions for some languages, use the same translations if you are not sure what this means -->
<!-- used in repetition, like "Every first Sunday" -->
<string name="repeat_every_f">Atkārtot katru</string>
<string name="every_f">Katru</string>
<string name="first_f">1.</string>
<string name="second_f">2.</string>
<string name="third_f">3.</string>
<string name="fourth_f">4.</string>
<string name="last_f">pēdēj.</string>
<!-- Birthdays -->
<string name="birthdays">Dzimšanas dienas</string>
<string name="add_birthdays">Pievienot dzimšanas dienas</string>
<string name="no_birthdays">Dzimšanas dienas nav atrastas</string>
<string name="no_new_birthdays">Jaunas dzimšanas dienas nav atrastas</string>
<string name="birthdays_added">Dzimšanas dienas veiksmīgi pievienotas</string>
<!-- Anniversaries -->
<string name="anniversaries">Jubilejas/gadadienas</string>
<string name="add_anniversaries">Pievienot jubileju</string>
<string name="no_anniversaries">Jubilejas nav atrastas</string>
<string name="no_new_anniversaries">Jaunas jubilejas nav atrastas</string>
<string name="anniversaries_added">Jubilejas veiksmīgi pievienotas</string>
<!-- Event Reminders -->
<string name="reminder">Atgādinājums</string>
<string name="before">pirms notikuma</string>
<string name="add_another_reminder">Pievienot vēl vienu atgādinājumu</string>
<string name="event_reminders">Notikumu atgādinājumi</string>
<!-- Event attendees -->
<string name="add_another_attendee">Pievienot dalībnieku</string>
<string name="my_status">Mans statuss:</string>
<string name="going">Iešu/eju</string>
<string name="not_going">Neiešu/neeju</string>
<string name="maybe_going">Varbūt iešu</string>
<string name="invited">Aicināts</string>
<!-- Time zones -->
<string name="enter_a_country">Ievadiet valsti vai laika joslu</string>
<!-- Export / Import -->
<string name="import_events">Notikumu imports</string>
<string name="export_events">Notikumu eksports</string>
<string name="import_events_from_ics">Importēt notikumus no .ics faila</string>
<string name="export_events_to_ics">Eksportēt notikumus .ics failā</string>
<string name="default_event_type">Notikuma tips pēc noklusējuma</string>
<string name="export_past_events_too">Eksportēt arī pagājušos notikumus</string>
<string name="include_event_types">Ietvert notikumu veidus</string>
<string name="filename_without_ics">Faila nosaukums (bez .ics)</string>
<string name="override_event_types">Ignorēt/nesaglabāt notikumu tipus failā</string>
<!-- Event details -->
<string name="location">Vieta</string>
<string name="description">Apraksts</string>
<string name="all_day">Visu dienu</string>
<!-- Weekly view -->
<string name="week">Nedēļa</string>
<!-- Event types -->
<string name="event_types">Notikumu tipi</string>
<string name="add_new_type">Pievienot jaunu tipu</string>
<string name="edit_type">Rediģēt tipu</string>
<string name="type_already_exists">Tips ar šādu nosaukumu jau pastāv</string>
<string name="color">Krāsa</string>
<string name="regular_event">Regulārs notikums</string>
<string name="cannot_delete_default_type">Noklusēto notikuma tipu nevar izdzēst</string>
<string name="select_event_type">Izvēlieties notikuma tipu</string>
<string name="move_events_into_default">Atzīmēto/ietekmēto notikumu tipu nomainīt uz noklusējuma</string>
<string name="remove_affected_events">Izdzēst atzīmētos/ietekmētos notikumus pavisam</string>
<string name="unsync_caldav_calendar">Lai izdzēstu CalDAV kalendāru, jāatspējo sinhronizācija ar to</string>
<!-- Holidays -->
<string name="holidays">Svētku dienas</string>
<string name="add_holidays">Pievienot svētku dienas</string>
<string name="national_holidays">Valsts svētki</string>
<string name="religious_holidays">Reliģiskie svētki</string>
<string name="holidays_imported_successfully">Svētku dienas tika veiksmīgi importētas ar notikuma tipu “Svētki”</string>
<string name="importing_some_holidays_failed">Dažas svētku dienas neizdevās importēt</string>
<string name="importing_holidays_failed">Svētku dienu imports neizdevās</string>
<!-- Settings -->
<string name="manage_event_types">Notikumu tipu pārvaldība</string>
<string name="start_day_at">Sākt dienu plkst.</string>
<string name="end_day_at">Beigt dienu plkst.</string>
<string name="week_numbers">Rādīt nedēļu kārtas skaitļus</string>
<string name="vibrate">Atgādināt, vibrējot</string>
<string name="reminder_sound">Atgādināt ar skaņu</string>
<string name="no_ringtone_picker">Nav atrasta programma zvana signāla iestatīšanai</string>
<string name="no_ringtone_selected">Nav</string>
<string name="day_end_before_start">Diena nevar beigties pirms tās sākuma</string>
<string name="caldav_sync">CalDAV sinhronizācija</string>
<string name="event_lists">Notikumu saraksti</string>
<string name="display_past_events">Rādīt pagājušos notikumus</string>
<string name="replace_description_with_location">Aizstāt notikuma aprakstu ar atrašanās vietu</string>
<string name="delete_all_events">Dzēst visus notikumus</string>
<string name="delete_all_events_confirmation">Tiešām vēlaties dzēst visus notikumus? Tas gan neietekmēs notikumu tipus un citus iestatījumus.</string>
<string name="show_a_grid">Rādīt režģi</string>
<string name="loop_reminders">Cikliski atgādinājumi, līdz tiek noņemti</string>
<string name="dim_past_events">Pagājušos notikumus rādīt blāvus</string>
<string name="events">Notikumi</string>
<string name="reminder_stream">Audio straume, kuru izmanto atgādinājumi</string>
<string name="system_stream">Sistēma</string>
<string name="alarm_stream">Modinātājs</string>
<string name="notification_stream">Paziņojums</string>
<string name="ring_stream">Zvans</string>
<string name="use_last_event_reminders">Izmantojiet pagājušo notikumu atgādinājumus kā noklusējuma iestatījumus jauniem notikumiem</string>
<string name="default_reminder_1">Noklusējuma atgādinājums #1</string>
<string name="default_reminder_2">Noklusējuma atgādinājums #2</string>
<string name="default_reminder_3">Noklusējuma atgādinājums #3</string>
<string name="view_to_open_from_widget">Skata režīms, kas atveras no notikumu saraksta logrīka</string>
<string name="last_view">Pēdējais izmantotais skats</string>
<string name="new_events">Jauni notikumi</string>
<string name="default_start_time">Sākuma laiks pēc noklusējuma</string>
<string name="next_full_hour">Nākamā pilnā stunda</string>
<string name="default_duration">Ilgums pēc noklusējuma</string>
<string name="last_used_one">Pēdējais izmantotais</string>
<string name="other_time">Cits</string>
<string name="highlight_weekends">Iezīmēt/izcelt nedēļas nogales dažos skatos/režīmos</string>
<string name="allow_changing_time_zones">Atļaut mainīt notikuma laika joslu</string>
<!-- CalDAV sync -->
<string name="caldav">CalDAV</string>
<string name="select_caldav_calendars">Atzīmējiet sinhronizējamos kalendārus</string>
<string name="manage_synced_calendars">Pārvaldiet sinhronizējamos kalendārus</string>
<string name="store_locally_only">Glabāt tikai vietēji</string>
<string name="refresh_caldav_calendars">Aktualizēt kalendārus no CalDAV</string>
<string name="refreshing">Notiek aktualizēšana ...</string>
<string name="refreshing_complete">Aktualizācija pabeigta</string>
<string name="editing_calendar_failed">Kalendāra rediģēšana neizdevās</string>
<string name="syncing">Notiek sinhronizēšana ...</string>
<string name="synchronization_completed">Sinhronizācija pabeigta</string>
<string name="select_a_different_caldav_color">Izvēlieties citu krāsu (var tikt izmantota tikai lokāli)</string>
<string name="insufficient_permissions">Jums izvēlētajā kalendārā rakstīt nav ļauts</string>
<string name="caldav_event_not_found">Notikums nav atrasts. Lūdzu, lietotnes iestatījumos iespējojiet CalDAV sinhronizāciju attiecīgajam kalendāram.</string>
<!-- alternative versions for some languages, use the same translations if you are not sure what this means -->
<!-- used in repetition, like "Every last Sunday" -->
<string name="monday_alt">pirmdiena</string>
<string name="tuesday_alt">otrdiena</string>
<string name="wednesday_alt">trešdiena</string>
<string name="thursday_alt">ceturtdiena</string>
<string name="friday_alt">piektdiena</string>
<string name="saturday_alt">sestdiena</string>
<string name="sunday_alt">svētdiena</string>
<!-- List widget config example events -->
<string name="sample_title_1">Apmācība</string>
<string name="sample_description_1">Kāju diena</string>
<string name="sample_title_2">Tikšanās ar Krišu Jāni Kariņu</string>
<string name="sample_description_2">Pie līkās priedes</string>
<string name="sample_title_3">Olaines novada domes sēde</string>
<string name="sample_title_4">Vakariņas ar Dačuku</string>
<string name="sample_description_4">Dieva ausī</string>
<string name="sample_title_5">Laiks tējot</string>
<!-- FAQ -->
<string name="faq_1_title">Kā izdzēst svētku dienas, kas importētas, izmantojot pogu \“Pievienot svētkus\”?</string>
<string name="faq_1_text">Šādi izveidotas svētku dienas tiek piešķirts jauns notikumu tips - \“Svētku dienas\”. Dodieties uz sadaļu \"Iestatījumi \" -> \"Notikumu tipu pārvaldīšana/", tad ilgs nospiediens uz āttiecīgā notikuma tipa un tā izdzēšana ar nospiedienu uz /"misenes/".</string>
<string name="faq_2_title">Vai iespējams sinhronizēt notikumus, izmantojot Google kalendāru vai citu pakalpojumu, kas atbalsta CalDAV?</string>
<string name="faq_2_text">Jā, vienkārši lietotnes iestatījumos iespējojiet \ "CalDAV Sync \" un atlasiet sinhronizējamos kalendārus. Tomēr jums būs nepieciešama trešās puses programma, kas veic sinhronizāciju starp ierīci un serveri.
Ja vēlaties sinhronizēt Google kalendāru, minēto funkciju veiks tā oficiālā lietotne. Citiem kalendāriem Jums būs nepieciešams trešās puses veidots sinhronizācijas rīks, piemēram, DAVx5.</string>
<string name="faq_3_title">Es redzu vizuālos atgādinājumus, bet nedzirdu skaņu. Kā rīkoties?</string>
<string name="faq_3_text">Gan atgādinājuma parādīšana, gan skaņu atskaņošana ir visai atkarīga no sistēmas. Ja nav dzirdama skaņa, atveriet lietotnes iestatījumus, nospiediet \"Atgādinājumiem izmantotā audio straume\" un nomainiet tās vērtību. Ja skaņas nav joprojām, pārbaudiet skaņas iestatījumos, vai šī straume nav izslēgta.</string>
<string name="faq_4_title">Vai lietotne atbalsta laika joslas?</string>
<string name="faq_4_text">Jā, atbalsta. Pēc noklusējuma visi notikumi tiek izveidoti tābrīža iesatītajā laika joslā. Ja vēlaties mainīt notikuma laika joslu, vispirms jāiespējo laika joslu izvēlnis lietotnes iestatījumos, pēc tam to var mainīt Notikuma informācijas skatā. Pēc noklusējuma funkcija ir atspējota, jo vairumam tā nav noderīga.</string>
<!-- Strings displayed only on Google Playstore. Optional, but good to have -->
<!-- App title has to have less than 50 characters. If you cannot squeeze it, just remove a part of it -->
<string name="app_title">Simple Calendar Pro - Notikumi &amp; atgādinājumi</string>
<!-- Short description has to have less than 80 chars -->
<string name="app_short_description">Vienkāršs mobilais 2020.g. kalendārs. Plānotājs &amp; tikšanos atgādinātājs ikdienai</string>
<string name="app_long_description">
Simple Calendar Pro ir elasīgi pielāgojams autonoms bezsaistes kalendārs, kas paredzēts tām funkcijām, kuras kalendāram jāīsteno.<b>Bez sarežģītām iespējām, funkcijas izpildei nevajadzīgu atļauju pieprasījumiem un uzbāzīgām reklāmām!</b>
Neatkarīgi no tā, vai jūs organizējat vienreizējus vai atkārtojošos regulārus pasākumus, dzimšanas dienas, jubilejas, lietišķas tikšanās, randiņus vai ko citu, Simple Calendar Pro padara to par <b>viegli padarāmu</b>. Izmantojot neticami plašu un elastīgu <b>pielāgošanas iespēju paleti</b>, Jūs varat veidot pielāgotus notikumu atgādinājumus, paziņojumu skaņas, kalendāra logrīkus un lietotnes izskatus.
Dienas, nedēļas un mēneša skati padara Jūsu gaidāmo notikumu un tikšanos caurskati zibenīgu. Jūs pat visu varat apskatīt kā vienkāršu notikumu sarakstu, nevis kalendāra skatu, un tā <b>precīzi zināt, kas un kad notiks Jūsu dzīvē.</b>
----------------------------------------------------------
<b>Simple Calendar Pro Īpašības &amp; priekšrocības</b>
----------------------------------------------------------
✔️ Nav reklāmu vai kaitinošu uznirstošo logu
✔️ Nav nepieciešama piekļuve internetam, sniedzot lielāku privātumu un drošību
✔️ Nepieciešams dot tikai minimālāko atļauju komplektu
✔️ Uzsvars uz vienkāršību - dara tikai to, kas kalendāram jādara!
✔️ Atklātais kods
✔️ Pilnībā pielāgojamas ādiņas un kalendāra/notikumu logrīki
✔️ Tulkots 30 valodās
✔️ Eksportējiet iestatījumus uz .txt failu, lai tos importētu citā ierīcē
✔️ Atbalstīta kalendāra CalDAV sinhronizācija, lai sinhronizētu notikumus dažādās Jūsu ierīcēs
✔️ Kalendāra dienas, nedēļas, mēneša, gada un notikumu skati
✔️ Notikumu eksports un imports, izmantojot .ics failus
✔️ Iespēja iestatīt vairākus notikuma atgādinājumus, pielāgot notikumu atgādinājumu skaņu un vibrāciju
✔️ Atgādinājumu atlikšanas iespēja
✔️ Viegli pievienojamas svētku dienas, dzimšanas dienas, jubilejas un tikšanās
✔️ Pielāgojami notikumi: sākuma laiks, ilgums, atgādinājumi u.c.
✔️ Iespēja pievienot notikuma apmeklētājus katram notikumam
✔️ Izmantojams gan kā personīgais, gan biznesa kalendārs
✔️ Izvēle starp atgādinājumiem un e-pasta paziņojumiem, lai atgādinātu par notikumu
LEJUPIELĀDĒ SIMPLE CALENDAR PRO - VIENKĀRŠU AUTONOMU KALENDĀRU BEZ REKLĀMĀM!
<b> Pilnu Vienkāršo Rīku (Simple Tools) komplektu skatiet šeit: </b>
https://www.simplemobiletools.com
<b>Lietotnes Simple Calendar Pro vietne:</b>
https://www.simplemobiletools.com/calendar
<b>Facebook:</b>
https://www.facebook.com/simplemobiletools
<b>Reddit:</b>
https://www.reddit.com/r/SimpleMobileTools
</string>
<!--
Nav izdevies uziet kādus tulkojumus? Tie atrodami
https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res
-->
</resources>

View File

@ -124,7 +124,6 @@
<string name="override_event_types">Overstyr hendelsestyper i filen</string>
<!-- Event details -->
<string name="title">Tittel</string>
<string name="location">Sted</string>
<string name="description">Beskrivelse</string>
<string name="all_day">Hele dagen</string>
@ -247,7 +246,7 @@
<!-- App title has to have less than 50 characters. If you cannot squeeze it, just remove a part of it -->
<string name="app_title">Simple Calendar Pro - Events &amp; Reminders</string>
<!-- Short description has to have less than 80 chars -->
<string name="app_short_description">Be notified of the important moments in your life.</string>
<string name="app_short_description">Simple mobile 2020 calendar. Schedule planner &amp; appointment reminder for any day</string>
<string name="app_long_description">
Simple Calendar Pro is a fully customizable, offline calendar designed to do exactly what a calendar should do. <b>No complicated features, unnecessary permissions and no ads!</b>

View File

@ -124,7 +124,6 @@
<string name="override_event_types">Afspraaktypes uit het bestand negeren</string>
<!-- Event details -->
<string name="title">Titel</string>
<string name="location">Locatie</string>
<string name="description">Beschrijving</string>
<string name="all_day">Hele dag</string>
@ -247,7 +246,7 @@
<!-- App title has to have less than 50 characters. If you cannot squeeze it, just remove a part of it -->
<string name="app_title">Eenvoudige Agenda Pro - Afspraken &amp; Herinneringen</string>
<!-- Short description has to have less than 80 chars -->
<string name="app_short_description">Houd de volledige controle over de belangrijke momenten in je leven.</string>
<string name="app_short_description">Simple mobile 2020 calendar. Schedule planner &amp; appointment reminder for any day</string>
<string name="app_long_description">
Eenvoudige Agenda Pro is een volledig aan te passen offline agenda, ontwikkeld om precies te doen waar een agenda voor bedoeld is. <b>Geen ingewikkelde poespas of onnodige machtigingen, en zonder advertenties!</b>
@ -280,10 +279,10 @@
DOWNLOAD EENVOUDIGE AGENDA PRO DE AGENDA ZONDER ADVERTENTIES!
<b>Kijk ook eens naar de hele collectie apps van Simple Tools:</b>
<b>Probeer ook eens de andere apps van Simple Tools:</b>
https://www.simplemobiletools.com
<b>Standalone website of Simple Calendar Pro:</b>
<b>Website voor Eenvoudige Agenda Pro:</b>
https://www.simplemobiletools.com/calendar
<b>Facebook:</b>

View File

@ -124,7 +124,6 @@
<string name="override_event_types">Override event types in the file</string>
<!-- Event details -->
<string name="title">Tittel</string>
<string name="location">Sted</string>
<string name="description">Beskrivelse</string>
<string name="all_day">Hele dagen</string>
@ -247,7 +246,7 @@
<!-- App title has to have less than 50 characters. If you cannot squeeze it, just remove a part of it -->
<string name="app_title">Simple Calendar Pro - Events &amp; Reminders</string>
<!-- Short description has to have less than 80 chars -->
<string name="app_short_description">Be notified of the important moments in your life.</string>
<string name="app_short_description">Simple mobile 2020 calendar. Schedule planner &amp; appointment reminder for any day</string>
<string name="app_long_description">
Simple Calendar Pro is a fully customizable, offline calendar designed to do exactly what a calendar should do. <b>No complicated features, unnecessary permissions and no ads!</b>

View File

@ -124,7 +124,6 @@
<string name="override_event_types">Nadpisz typy wydarzeń w pliku</string>
<!-- Event details -->
<string name="title">Tytuł</string>
<string name="location">Lokalizacja</string>
<string name="description">Opis</string>
<string name="all_day">Całodniowe</string>
@ -245,7 +244,7 @@
<!-- App title has to have less than 50 characters. If you cannot squeeze it, just remove a part of it -->
<string name="app_title">Simple Calendar Pro - Events &amp; Reminders</string>
<!-- Short description has to have less than 80 chars -->
<string name="app_short_description">Be notified of the important moments in your life.</string>
<string name="app_short_description">Simple mobile 2020 calendar. Schedule planner &amp; appointment reminder for any day</string>
<string name="app_long_description">
Simple Calendar Pro is a fully customizable, offline calendar designed to do exactly what a calendar should do. <b>No complicated features, unnecessary permissions and no ads!</b>

View File

@ -124,7 +124,6 @@
<string name="override_event_types">Substituir os tipos de eventos no arquivo</string>
<!-- Event details -->
<string name="title">Título</string>
<string name="location">Localização</string>
<string name="description">Descrição</string>
<string name="all_day">O dia todo</string>
@ -247,7 +246,7 @@ selecionando a opção \"Fonte de áudio usada pelos lembretes\" e modificando o
<!-- App title has to have less than 50 characters. If you cannot squeeze it, just remove a part of it -->
<string name="app_title">Simple Calendar Pro - Events &amp; Reminders</string>
<!-- Short description has to have less than 80 chars -->
<string name="app_short_description">Be notified of the important moments in your life.</string>
<string name="app_short_description">Simple mobile 2020 calendar. Schedule planner &amp; appointment reminder for any day</string>
<string name="app_long_description">
Simple Calendar Pro is a fully customizable, offline calendar designed to do exactly what a calendar should do. <b>No complicated features, unnecessary permissions and no ads!</b>

View File

@ -124,7 +124,6 @@
<string name="override_event_types">Substituir tipo de eventos no ficheiro</string>
<!-- Event details -->
<string name="title">Título</string>
<string name="location">Location</string>
<string name="description">Descrição</string>
<string name="all_day">Todo o dia</string>
@ -247,7 +246,7 @@
<!-- App title has to have less than 50 characters. If you cannot squeeze it, just remove a part of it -->
<string name="app_title">Simple Calendar Pro - Eventos e lembretes</string>
<!-- Short description has to have less than 80 chars -->
<string name="app_short_description">Notificações sobre os momentos importantes da sua vida.</string>
<string name="app_short_description">Simple mobile 2020 calendar. Schedule planner &amp; appointment reminder for any day</string>
<string name="app_long_description">
Simple Calendar Pro é um calendário local, criado para fazer o que um calendário deve fazer. <b>Funcionalidades simples, apenas as permissões estritamente necessárias e sem anúncios!</b>

View File

@ -124,7 +124,6 @@
<string name="override_event_types">Переопределять типы событий в файле</string>
<!-- Event details -->
<string name="title">Заголовок</string>
<string name="location">Место</string>
<string name="description">Описание</string>
<string name="all_day">Весь день</string>
@ -247,7 +246,7 @@
<!-- App title has to have less than 50 characters. If you cannot squeeze it, just remove a part of it -->
<string name="app_title">Simple Calendar Pro - события и напоминания</string>
<!-- Short description has to have less than 80 chars -->
<string name="app_short_description">Не пропустите важные моменты своей жизни.</string>
<string name="app_short_description">Simple mobile 2020 calendar. Schedule planner &amp; appointment reminder for any day</string>
<string name="app_long_description">
Simple Calendar Pro — это полностью настраиваемый автономный календарь, предназначенный для выполнения именно того, что должен делать календарь. <b>Никаких непонятных функций, ненужных разрешений и рекламы!</b>

View File

@ -124,7 +124,6 @@
<string name="override_event_types">Nahradiť typy udalostí v súbore</string>
<!-- Event details -->
<string name="title">Názov</string>
<string name="location">Miesto</string>
<string name="description">Popis</string>
<string name="all_day">Celodenná</string>
@ -247,7 +246,7 @@
<!-- App title has to have less than 50 characters. If you cannot squeeze it, just remove a part of it -->
<string name="app_title">Jednoduchý kalendár Pro - Udalosti a pripomienky</string>
<!-- Short description has to have less than 80 chars -->
<string name="app_short_description">Nezmeškajte dôležité chvíle vášho života.</string>
<string name="app_short_description">Mobilný kalendár 2020. Efektívny plánovač a manažér stretnutí počas celého dňa.</string>
<string name="app_long_description">
Jednoduchý kalendár Pro je prispôsobiteľný offline kalendár vytvorený presne na to, čo by kalendáre mali zvládať.<b>Nenachádzajú sa tu žiadne nepotrebné funkcie, nepotrebné oprávnenia, ani reklamy!</b>

View File

@ -124,7 +124,6 @@
<string name="override_event_types">Ignorera händelsetyper i filen</string>
<!-- Event details -->
<string name="title">Titel</string>
<string name="location">Plats</string>
<string name="description">Beskrivning</string>
<string name="all_day">Heldag</string>
@ -247,7 +246,7 @@
<!-- App title has to have less than 50 characters. If you cannot squeeze it, just remove a part of it -->
<string name="app_title">Simple Calendar Pro - Events &amp; Reminders</string>
<!-- Short description has to have less than 80 chars -->
<string name="app_short_description">Be notified of the important moments in your life.</string>
<string name="app_short_description">Simple mobile 2020 calendar. Schedule planner &amp; appointment reminder for any day</string>
<string name="app_long_description">
Simple Calendar Pro is a fully customizable, offline calendar designed to do exactly what a calendar should do. <b>No complicated features, unnecessary permissions and no ads!</b>

View File

@ -6,8 +6,6 @@
<dimen name="monthly_day_height">60dp</dimen>
<dimen name="weekly_view_row_height">90dp</dimen>
<dimen name="weekly_view_row_minus_one_height">89dp</dimen>
<dimen name="weekly_view_events_height">2160dp</dimen> <!-- weekly_view_row_height * 24 hours -->
<dimen name="weekly_view_minimal_event_height">15dp</dimen>
<dimen name="meta_text_size">20sp</dimen>

View File

@ -11,7 +11,7 @@
<string name="no_upcoming_events">Yaklaşan etkinlikleriniz yok gibi görünüyor.</string>
<string name="go_to_today">Bugüne git</string>
<string name="go_to_date">Tarihe git</string>
<string name="upgraded_from_free">Selam,\n\neski ücretsiz uygulamadan yeni sürüme geçmiş gibi görünüyorsunuz. Yerel olarak saklanan etkinlikleri bir .ics dosyasına aktarıp ardından içe aktararak elle taşımanız gerekiyor. Her iki dışa/içe aktar düğmesini ana ekran menüsünde bulabilirsiniz.\n\nArdından, uygulama ayarlarının üstünde \'Pro'ya Yükselt\' düğmesine sahip eski sürümü kaldırabilirsiniz. Daha sonra yalnızca uygulama ayarlarınızı sıfırlamanız gerekir.\n\nTeşekkürler!</string>
<string name="upgraded_from_free">Selam,\n\neski ücretsiz uygulamadan yeni sürüme geçmiş gibi görünüyorsunuz. Yerel olarak saklanan etkinlikleri bir .ics dosyasına aktarıp ardından içe aktararak elle taşımanız gerekiyor. Her iki dışa/içe aktar düğmesini ana ekran menüsünde bulabilirsiniz.\n\nArdından, uygulama ayarlarının üstünde \'Pro\'ya Yükselt\' düğmesine sahip eski sürümü kaldırabilirsiniz. Daha sonra yalnızca uygulama ayarlarınızı sıfırlamanız gerekir.\n\nTeşekkürler!</string>
<!-- Widget titles -->
<string name="widget_monthly">Aylık takvim</string>
@ -124,7 +124,6 @@
<string name="override_event_types">Dosyadaki etkinlik türlerini geçersiz kıl</string>
<!-- Event details -->
<string name="title">Başlık</string>
<string name="location">Konum</string>
<string name="description">ıklama</string>
<string name="all_day">Tüm-gün</string>
@ -243,13 +242,13 @@
<!-- Strings displayed only on Google Playstore. Optional, but good to have -->
<!-- App title has to have less than 50 characters. If you cannot squeeze it, just remove a part of it -->
<string name="app_title">Basit Takvim Pro - Etkinlikler &amp; Hatırlatıcılar</string>
<string name="app_title">Basit Takvim Pro - Etkinlikler ve Hatırlatıcılar</string>
<!-- Short description has to have less than 80 chars -->
<string name="app_short_description">Hayatınızdaki önemli anlardan haberdar olun.</string>
<string name="app_short_description">Simple mobile 2020 calendar. Schedule planner &amp; appointment reminder for any day</string>
<string name="app_long_description">
Basit Takvim Pro, bir takvimin tam olarak yapması gerekeni yapmak için tasarlanmış, tamamen özelleştirilebilir, çevrimdışı bir takvimdir. <b>Karmaşık özellikler, gereksiz izinler ve reklam içermez!</b>
İster tekli ister tekrarlayan etkinlikler, doğum günleri, yıldönümleri, iş toplantıları, randevular veya başka bir şey organize ediyor olun, Basit Takvim Pro <b>düzenli kalmanızı kolaylaştırır</b>. İnanılmaz çeşitli <b>özelleştirme seçenekleri</b> ile etkinlik hatırlatıcılarını, bildirim seslerini, takvim widget'larını ve uygulamanın görünümünü özelleştirebilirsiniz.
İster tekli ister tekrarlayan etkinlikler, doğum günleri, yıldönümleri, iş toplantıları, randevular veya başka bir şey organize ediyor olun, Basit Takvim Pro <b>düzenli kalmanızı kolaylaştırır</b>. İnanılmaz çeşitli <b>özelleştirme seçenekleri</b> ile etkinlik hatırlatıcılarını, bildirim seslerini, takvim widget\'larını ve uygulamanın görünümünü özelleştirebilirsiniz.
Günlük, haftalık ve aylık görünümler, yaklaşan etkinliklerinizi &amp; randevularınızı kontrol etmeyi kolaylaştırır. Her şeyi takvim görünümü yerine basit bir etkinlik listesi olarak bile görüntüleyebilirsiniz, böylece <b> hayatınızda neyin ne zaman geldiğini tam olarak bilirsiniz.</b>
@ -257,12 +256,12 @@
<b>Basit Takvim Pro Özellikleri &amp; Avantajları</b>
----------------------------------------------------------
✔️ Reklam veya rahatsız edici pop-up'lar yoktur
✔️ Reklam veya rahatsız edici pop-up\'lar yoktur
✔️ İnternet erişimi gerekmez, size daha fazla gizlilik &amp; güvenlik sağlar
✔️ Minimum izin gerekir
✔️ Sadeliğe vurgu - bir takvimin yapması gerekeni yapar!
✔️ Açık kaynak
✔️ Tamamen özelleştirilebilir temalar &amp; takvim / etkinlik widget'ları
✔️ Tamamen özelleştirilebilir temalar &amp; takvim / etkinlik widget\'ları
✔️ 29 dile çevrilmiş
✔️ Başka bir cihazda içe aktarmak için ayarları .txt dosyalarına aktarma
✔️ Cihazlar arasında etkinlikleri senkronize etmek için CalDAV takvim senkronizasyonu desteği
@ -276,12 +275,12 @@
✔️ Kişisel takvim veya iş takvimi olarak kullanma
✔️ Bir etkinlik hakkında sizi uyarmak için hatırlatıcılar &amp; e-posta bildirimleri arasından seçim yapma
BASİT TAKVİM PRO'YU İNDİR - REKLAMSIZ BASİT ÇEVRİMDIŞI TAKVİM!
BASİT TAKVİM PRO\'YU İNDİRİN - REKLAMSIZ BASİT ÇEVRİMDIŞI TAKVİM!
<b>Basit Araçlar paketinin tamamını buradan inceleyin:</b>
https://www.simplemobiletools.com
<b>Basit Takvim Pro'nun bağımsız web sitesi:</b>
<b>Basit Takvim Pro\'nun bağımsız web sitesi:</b>
https://www.simplemobiletools.com/calendar
<b>Facebook:</b>

View File

@ -124,7 +124,6 @@
<string name="override_event_types">Змінити тип подій у файлі</string>
<!-- Event details -->
<string name="title">Назва</string>
<string name="location">Місце</string>
<string name="description">Описання</string>
<string name="all_day">Цілий день</string>
@ -247,7 +246,7 @@
<!-- App title has to have less than 50 characters. If you cannot squeeze it, just remove a part of it -->
<string name="app_title">Простий Календар Pro - Події і Нагадування</string>
<!-- Short description has to have less than 80 chars -->
<string name="app_short_description">Be notified of the important moments in your life.</string>
<string name="app_short_description">Simple mobile 2020 calendar. Schedule planner &amp; appointment reminder for any day</string>
<string name="app_long_description">
Простий Календар Pro - це офлайн-календар з дуже гнучкими налаштуваннями, призначений робити саме те, що календар повинен робити. <b>Не містить складних особливостей, лише необхідні дозволи та без реклами!</b>

View File

@ -124,7 +124,6 @@
    <string name="override_event_types">覆盖档案内的活动类型</string>
    <!-- Event details -->
    <string name="title">标题</string>
    <string name="location">地点</string>
    <string name="description">描述</string>
    <string name="all_day">全天</string>
@ -247,7 +246,7 @@
    <!-- App title has to have less than 50 characters. If you cannot squeeze it, just remove a part of it -->
    <string name="app_title">简易行事历 Pro - 活动&amp;约会</string>
    <!-- Short description has to have less than 80 chars -->
    <string name="app_short_description">Be notified of the important moments in your life.</string>
    <string name="app_short_description">Simple mobile 2020 calendar. Schedule planner &amp; appointment reminder for any day</string>
    <string name="app_long_description">
        简易行事历Pro是一个高度自定义完全旨在于行事历应该做什么的离线行事历。 <b>没有复杂的功能、非必要的权限和广告!</b>

View File

@ -124,7 +124,6 @@
<string name="override_event_types">覆寫檔案內的活動類型</string>
<!-- Event details -->
<string name="title">標題</string>
<string name="location">地點</string>
<string name="description">描述</string>
<string name="all_day">全天</string>
@ -247,7 +246,7 @@
<!-- App title has to have less than 50 characters. If you cannot squeeze it, just remove a part of it -->
<string name="app_title">簡易行事曆 Pro - 活動&amp;約會</string>
<!-- Short description has to have less than 80 chars -->
<string name="app_short_description">Be notified of the important moments in your life.</string>
<string name="app_short_description">Simple mobile 2020 calendar. Schedule planner &amp; appointment reminder for any day</string>
<string name="app_long_description">
簡易行事曆Pro是一個高度自訂化完全旨在於行事曆應該做什麼的離線行事曆。 <b>沒有複雜的功能、非必要的權限和廣告!</b>

View File

@ -124,7 +124,6 @@
<string name="override_event_types">覆寫檔案內的活動類型</string>
<!-- Event details -->
<string name="title">標題</string>
<string name="location">地點</string>
<string name="description">描述</string>
<string name="all_day">全天</string>
@ -247,7 +246,7 @@
<!-- App title has to have less than 50 characters. If you cannot squeeze it, just remove a part of it -->
<string name="app_title">簡易行事曆 Pro - 活動和約會</string>
<!-- Short description has to have less than 80 chars -->
<string name="app_short_description">通知你生命中的重要時刻。</string>
<string name="app_short_description">Simple mobile 2020 calendar. Schedule planner &amp; appointment reminder for any day</string>
<string name="app_long_description">
簡易行事曆Pro是一個高度自訂化完全旨在於行事曆應該做什麼的離線行事曆。 <b>沒有複雜的功能、非必要的權限和廣告!</b>

View File

@ -7,7 +7,6 @@
<dimen name="monthly_day_height">40dp</dimen>
<dimen name="weekly_view_row_height">60dp</dimen>
<dimen name="weekly_view_events_height">1440dp</dimen> <!-- weekly_view_row_height * 24 hours -->
<dimen name="weekly_view_minimal_event_height">10dp</dimen>
<dimen name="weekly_view_now_height">10dp</dimen>

View File

@ -124,7 +124,6 @@
<string name="override_event_types">Override event types in the file</string>
<!-- Event details -->
<string name="title">Title</string>
<string name="location">Location</string>
<string name="description">Description</string>
<string name="all_day">All-day</string>
@ -247,7 +246,7 @@
<!-- App title has to have less than 50 characters. If you cannot squeeze it, just remove a part of it -->
<string name="app_title">Simple Calendar Pro - Events &amp; Reminders</string>
<!-- Short description has to have less than 80 chars -->
<string name="app_short_description">Be notified of the important moments in your life.</string>
<string name="app_short_description">Simple mobile 2020 calendar. Schedule planner &amp; appointment reminder for any day</string>
<string name="app_long_description">
Simple Calendar Pro is a fully customizable, offline calendar designed to do exactly what a calendar should do. <b>No complicated features, unnecessary permissions and no ads!</b>

View File

@ -1,7 +1,7 @@
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
ext.kotlin_version = '1.3.61'
ext.kotlin_version = '1.3.70'
repositories {
google()
@ -10,7 +10,7 @@ buildscript {
}
dependencies {
classpath 'com.android.tools.build:gradle:3.5.3'
classpath 'com.android.tools.build:gradle:3.6.1'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
classpath "de.timfreiheit.resourceplaceholders:placeholders:0.3"

View File

@ -0,0 +1,2 @@
* Added a Go To Today menu button at the event list view too
* Some translation and stability improvements

View File

@ -0,0 +1,2 @@
* Remember the last used folder at ics exporting
* Do not request the Storage permission on Android 10+, use Scoped Storage

View File

@ -0,0 +1,4 @@
* Allow zooming the weekly view with vertical gestures
* Allow scrolling through the whole weeky view, use Start time only as the default time
* Updating the app icon
* Other stability, translation and UX improvements

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 84 KiB

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 127 KiB

After

Width:  |  Height:  |  Size: 174 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 85 KiB

After

Width:  |  Height:  |  Size: 149 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 100 KiB

After

Width:  |  Height:  |  Size: 154 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 97 KiB

After

Width:  |  Height:  |  Size: 146 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 152 KiB

After

Width:  |  Height:  |  Size: 125 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 77 KiB

After

Width:  |  Height:  |  Size: 207 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.9 KiB

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

View File

@ -1,6 +1,6 @@
#Sun Aug 25 21:51:10 CEST 2019
#Mon Mar 16 12:20:31 CET 2020
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-5.4.1-all.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.4-all.zip