20
CHANGELOG.md
|
@ -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)*
|
||||
----------------------------
|
||||
|
||||
|
|
|
@ -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.
|
||||
|
||||
|
|
|
@ -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'
|
||||
}
|
||||
|
|
|
@ -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">
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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()
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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()
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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() {}
|
||||
|
||||
|
|
|
@ -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()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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()
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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))
|
||||
|
|
|
@ -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
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -6,4 +6,8 @@ interface WeekFragmentListener {
|
|||
fun updateHoursTopMargin(margin: Int)
|
||||
|
||||
fun getCurrScrollY(): Int
|
||||
|
||||
fun updateRowHeight(rowHeight: Int)
|
||||
|
||||
fun getFullFragmentHeight(): Int
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
||||
|
|
|
@ -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">
|
||||
|
||||
|
|
|
@ -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>
|
||||
|
||||
|
|
|
@ -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" />
|
||||
|
|
Before Width: | Height: | Size: 4.4 KiB After Width: | Height: | Size: 4.3 KiB |
Before Width: | Height: | Size: 2.8 KiB After Width: | Height: | Size: 2.5 KiB |
Before Width: | Height: | Size: 5.9 KiB After Width: | Height: | Size: 5.8 KiB |
Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 10 KiB |
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 14 KiB |
|
@ -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 & 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>
|
||||
|
||||
|
|
|
@ -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 & 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 & 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>
|
||||
|
||||
|
|
|
@ -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 & appointment reminder for any day</string>
|
||||
<string name="app_long_description">
|
||||
সাধারণ ক্যালেন্ডার প্রো একটি সম্পূর্ণ কাস্টমাইজযোগ্য, অফলাইন ক্যালেন্ডার যা একটি ক্যালেন্ডারের ঠিক কী করা উচিত সেটার জন্য ডিজাইন করা হয়েছে। <b>কোনও জটিল ফিচার, অপ্রয়োজনীয় অনুমতি এবং কোনও বিজ্ঞাপন নেই!</b>
|
||||
|
||||
|
|
|
@ -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 & 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 & 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>
|
||||
|
||||
|
|
|
@ -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 & 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>
|
||||
|
||||
|
|
|
@ -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 & 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 & 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>
|
||||
|
|
|
@ -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 & 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 & 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>
|
||||
|
|
|
@ -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">Απλό Ημερολόγιο 2020. Προγραμματισμός & υπενθύμιση συνάντησης για κάθε ημέρα</string>
|
||||
<string name="app_long_description">
|
||||
Το Απλό Ημερολόγιο Pro είναι ένα ημερολόγιο πλήρως προσαρμόσιμο εκτός σύνδεσης που έχει σχεδιαστεί για να κάνει ακριβώς αυτό που υπόσχεται. <b>Δεν υπάρχουν περίπλοκες λειτουργίες, περιττά δικαιώματα και διαφημίσεις!</b>
|
||||
|
||||
|
|
|
@ -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 & 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>
|
||||
|
||||
|
|
|
@ -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 n’a é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 n’a é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 l’application.</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 n’entendez aucun son, essayez d’entrer dans les paramètres de l’appli,
|
||||
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 n’est 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">L’application 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 d’un événement, vous devez d’abord activer le sélecteur de fuseau horaire dans les paramètres de l’application, puis le modifier sur l’écran Détails de l’événement. Il est désactivé par défaut car la plupart des gens n’en 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 & Reminders</string>
|
||||
<string name="app_title">Simple Calendar Pro - Evénements & 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>
|
||||
|
||||
|
|
|
@ -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 & 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 & 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>
|
||||
|
||||
|
|
|
@ -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 & 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>
|
||||
|
||||
|
|
|
@ -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 & 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 & 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>
|
||||
|
||||
|
|
|
@ -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 & 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 & 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>
|
||||
|
||||
|
|
|
@ -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 & 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 & 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>
|
||||
|
||||
|
|
|
@ -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 & 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 & 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>
|
||||
|
||||
|
|
|
@ -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 & 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 & 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>
|
||||
|
||||
|
|
|
@ -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 & 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 & 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>
|
||||
|
||||
|
|
|
@ -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 & 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>
|
||||
|
||||
|
|
|
@ -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 & 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 & 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>
|
||||
|
||||
|
|
|
@ -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 - 일정 & 알림</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 & appointment reminder for any day</string>
|
||||
<string name="app_long_description">
|
||||
Simple Calendar Pro는 캘린더의 기능을 정확하게 수행하도록 설계된 사용자 정의 오프라인 캘린더입니다. <b>복잡한 기능, 불필요한 권한 및 광고가 없습니다!</b>
|
||||
|
||||
|
|
|
@ -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 & 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 & 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>
|
||||
|
||||
|
|
|
@ -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 & 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 & 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 & 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>
|
|
@ -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 & 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 & 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>
|
||||
|
||||
|
|
|
@ -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 & 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 & 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>
|
||||
|
|
|
@ -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 & 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 & 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>
|
||||
|
||||
|
|
|
@ -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 & 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 & 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>
|
||||
|
||||
|
|
|
@ -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 & 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 & 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>
|
||||
|
||||
|
|
|
@ -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 & 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>
|
||||
|
||||
|
|
|
@ -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 & appointment reminder for any day</string>
|
||||
<string name="app_long_description">
|
||||
Simple Calendar Pro — это полностью настраиваемый автономный календарь, предназначенный для выполнения именно того, что должен делать календарь. <b>Никаких непонятных функций, ненужных разрешений и рекламы!</b>
|
||||
|
||||
|
|
|
@ -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>
|
||||
|
||||
|
|
|
@ -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 & 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 & 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>
|
||||
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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">Açı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 & 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 & 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 & 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 & 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 & güvenlik sağlar
|
||||
✔️ Minimum izin gerekir
|
||||
✔️ Sadeliğe vurgu - bir takvimin yapması gerekeni yapar!
|
||||
✔️ Açık kaynak
|
||||
✔️ Tamamen özelleştirilebilir temalar & takvim / etkinlik widget'ları
|
||||
✔️ Tamamen özelleştirilebilir temalar & 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 & 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>
|
||||
|
|
|
@ -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 & appointment reminder for any day</string>
|
||||
<string name="app_long_description">
|
||||
Простий Календар Pro - це офлайн-календар з дуже гнучкими налаштуваннями, призначений робити саме те, що календар повинен робити. <b>Не містить складних особливостей, лише необхідні дозволи та без реклами!</b>
|
||||
|
||||
|
|
|
@ -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 & appointment reminder for any day</string>
|
||||
<string name="app_long_description">
|
||||
简易行事历Pro是一个高度自定义,完全旨在于行事历应该做什么的离线行事历。 <b>没有复杂的功能、非必要的权限和广告!</b>
|
||||
|
||||
|
|
|
@ -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 & appointment reminder for any day</string>
|
||||
<string name="app_long_description">
|
||||
簡易行事曆Pro是一個高度自訂化,完全旨在於行事曆應該做什麼的離線行事曆。 <b>沒有複雜的功能、非必要的權限和廣告!</b>
|
||||
|
||||
|
|
|
@ -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 & appointment reminder for any day</string>
|
||||
<string name="app_long_description">
|
||||
簡易行事曆Pro是一個高度自訂化,完全旨在於行事曆應該做什麼的離線行事曆。 <b>沒有複雜的功能、非必要的權限和廣告!</b>
|
||||
|
||||
|
|
|
@ -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>
|
||||
|
||||
|
|
|
@ -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 & 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 & 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>
|
||||
|
||||
|
|
|
@ -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"
|
||||
|
||||
|
|
|
@ -0,0 +1,2 @@
|
|||
* Added a Go To Today menu button at the event list view too
|
||||
* Some translation and stability improvements
|
|
@ -0,0 +1,2 @@
|
|||
* Remember the last used folder at ics exporting
|
||||
* Do not request the Storage permission on Android 10+, use Scoped Storage
|
|
@ -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
|
After Width: | Height: | Size: 21 KiB |
Before Width: | Height: | Size: 84 KiB After Width: | Height: | Size: 21 KiB |
Before Width: | Height: | Size: 127 KiB After Width: | Height: | Size: 174 KiB |
Before Width: | Height: | Size: 85 KiB After Width: | Height: | Size: 149 KiB |
Before Width: | Height: | Size: 100 KiB After Width: | Height: | Size: 154 KiB |
Before Width: | Height: | Size: 97 KiB After Width: | Height: | Size: 146 KiB |
Before Width: | Height: | Size: 152 KiB After Width: | Height: | Size: 125 KiB |
Before Width: | Height: | Size: 77 KiB After Width: | Height: | Size: 207 KiB |
After Width: | Height: | Size: 5.1 KiB |
Before Width: | Height: | Size: 3.9 KiB After Width: | Height: | Size: 15 KiB |
After Width: | Height: | Size: 24 KiB |
|
@ -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
|
||||
|
|