diff --git a/CHANGELOG.md b/CHANGELOG.md
index da8277f49..3582dc988 100644
--- a/CHANGELOG.md
+++ b/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)*
----------------------------
diff --git a/README.md b/README.md
index b8c09c9d1..67bd81b98 100644
--- a/README.md
+++ b/README.md
@@ -1,5 +1,5 @@
# Simple Calendar
-
+
A simple calendar with events and a customizable widget.
diff --git a/app/build.gradle b/app/build.gradle
index 0d61ea5f5..91b5cb4fc 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -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'
}
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index daf970ab4..cee3b05d5 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -6,12 +6,16 @@
android:installLocation="auto">
-
-
+
+
+
+
@@ -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">
diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/activities/EventActivity.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/activities/EventActivity.kt
index dfba971f3..715ef3580 100644
--- a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/activities/EventActivity.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/activities/EventActivity.kt
@@ -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
}
diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/activities/MainActivity.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/activities/MainActivity.kt
index 53768d7be..537e9da4e 100644
--- a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/activities/MainActivity.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/activities/MainActivity.kt
@@ -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()
+ private var eventTypesToExport = ArrayList()
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, 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
+ })
}
}
}
diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/activities/SettingsActivity.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/activities/SettingsActivity.kt
index 80adbdcfc..be53e9e29 100644
--- a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/activities/SettingsActivity.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/activities/SettingsActivity.kt
@@ -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()
- (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()
- (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()
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()
}
diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/adapters/EventListAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/adapters/EventListAdapter.kt
index 24e424d60..f75132b73 100644
--- a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/adapters/EventListAdapter.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/adapters/EventListAdapter.kt
@@ -40,15 +40,7 @@ class EventListAdapter(activity: SimpleActivity, var listItems: ArrayList
- 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)
diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/adapters/MyWeekPagerAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/adapters/MyWeekPagerAdapter.kt
index 20ed74f01..1f5379cba 100644
--- a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/adapters/MyWeekPagerAdapter.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/adapters/MyWeekPagerAdapter.kt
@@ -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()
+ }
}
diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/dialogs/ExportEventsDialog.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/dialogs/ExportEventsDialog.kt
index f7aace260..d5e598b08 100644
--- a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/dialogs/ExportEventsDialog.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/dialogs/ExportEventsDialog.kt
@@ -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) -> Unit) {
+class ExportEventsDialog(val activity: SimpleActivity, val path: String, val hidePath: Boolean,
+ val callback: (file: File, eventTypes: ArrayList) -> 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()
@@ -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)
}
diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/extensions/Activity.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/extensions/Activity.kt
index b16310be3..16192b5ce 100644
--- a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/extensions/Activity.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/extensions/Activity.kt
@@ -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) {
}
val events = eventsDB.getEventsWithIds(ids) as ArrayList
- 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)
+ }
}
}
}
diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/extensions/Context.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/extensions/Context.kt
index b1ea0a73d..0e78589bf 100644
--- a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/extensions/Context.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/extensions/Context.kt
@@ -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
+}
diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/fragments/EventListFragment.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/fragments/EventListFragment.kt
index f6b71da11..da553b923 100644
--- a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/fragments/EventListFragment.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/fragments/EventListFragment.kt
@@ -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() {}
diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/fragments/WeekFragment.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/fragments/WeekFragment.kt
index 0c31b2875..01aa3237b 100644
--- a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/fragments/WeekFragment.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/fragments/WeekFragment.kt
@@ -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()
private var allDayHolders = ArrayList()
private var allDayRows = ArrayList>()
+ private var currEvents = ArrayList()
private var eventTypeColors = LongSparseArray()
private var eventTimeRanges = LinkedHashMap>()
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
+ val dayLetters = res.getStringArray(R.array.week_day_letters).toMutableList() as ArrayList
val dayLetter = dayLetters[curDay.dayOfWeek - 1]
- mView.findViewById(mRes.getIdentifier("week_day_label_$i", "id", context!!.packageName)).apply {
+ mView.findViewById(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) {
@@ -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 { it.startTS }.thenBy { it.endTS }.thenBy { it.title }.thenBy { if (replaceDescription) it.location else it.description }
+ ).toMutableList() as ArrayList
+
+ 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) {
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 { 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(mRes.getIdentifier("week_column_$id", "id", context!!.packageName))
+ private fun getColumnWithId(id: Int) = mView.findViewById(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()
}
}
}
diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/fragments/WeekFragmentsHolder.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/fragments/WeekFragmentsHolder.kt
index d626af001..8deba96df 100644
--- a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/fragments/WeekFragmentsHolder.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/fragments/WeekFragmentsHolder.kt
@@ -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
}
diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/helpers/Config.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/helpers/Config.kt
index 43f0667ed..153ba98cd 100644
--- a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/helpers/Config.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/helpers/Config.kt
@@ -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()
}
diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/helpers/Constants.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/helpers/Constants.kt
index eedbdb6cc..e63fde821 100644
--- a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/helpers/Constants.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/helpers/Constants.kt
@@ -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)
diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/helpers/EventsHelper.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/helpers/EventsHelper.kt
index e09774346..87b21ef2b 100644
--- a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/helpers/EventsHelper.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/helpers/EventsHelper.kt
@@ -401,10 +401,10 @@ class EventsHelper(val context: Context) {
return events
}
- fun getEventsToExport(includePast: Boolean, eventTypes: ArrayList): ArrayList {
+ fun getEventsToExport(eventTypes: ArrayList): ArrayList {
val currTS = getNowSeconds()
var events = ArrayList()
- if (includePast) {
+ if (config.exportPastEvents) {
events.addAll(eventsDB.getAllEventsWithTypes(eventTypes))
} else {
events.addAll(eventsDB.getOneTimeFutureEventsWithTypes(currTS, eventTypes))
diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/helpers/IcsExporter.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/helpers/IcsExporter.kt
index ca0c994bc..868bd1567 100644
--- a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/helpers/IcsExporter.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/helpers/IcsExporter.kt
@@ -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()
- fun exportEvents(activity: BaseSimpleActivity, file: File, events: ArrayList, 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, 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
+ })
}
}
diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/interfaces/WeekFragmentListener.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/interfaces/WeekFragmentListener.kt
index 61e74d8d6..ae982cbd3 100644
--- a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/interfaces/WeekFragmentListener.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/interfaces/WeekFragmentListener.kt
@@ -6,4 +6,8 @@ interface WeekFragmentListener {
fun updateHoursTopMargin(margin: Int)
fun getCurrScrollY(): Int
+
+ fun updateRowHeight(rowHeight: Int)
+
+ fun getFullFragmentHeight(): Int
}
diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/views/MyScrollView.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/views/MyScrollView.kt
index f0fd8b125..0d5246157 100644
--- a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/views/MyScrollView.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/views/MyScrollView.kt
@@ -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)
}
diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/views/WeeklyViewGrid.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/views/WeeklyViewGrid.kt
index 4b7db7db5..f4d1ee6a1 100644
--- a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/views/WeeklyViewGrid.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/views/WeeklyViewGrid.kt
@@ -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)
diff --git a/app/src/main/res/drawable/ic_chevron_left_vector.xml b/app/src/main/res/drawable/ic_chevron_left_vector.xml
deleted file mode 100644
index 2a62ae815..000000000
--- a/app/src/main/res/drawable/ic_chevron_left_vector.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-
-
-
diff --git a/app/src/main/res/drawable/ic_chevron_right_vector.xml b/app/src/main/res/drawable/ic_chevron_right_vector.xml
deleted file mode 100644
index eeed48730..000000000
--- a/app/src/main/res/drawable/ic_chevron_right_vector.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-
-
-
diff --git a/app/src/main/res/layout/activity_settings.xml b/app/src/main/res/layout/activity_settings.xml
index 12b08a023..a9be6b66f 100644
--- a/app/src/main/res/layout/activity_settings.xml
+++ b/app/src/main/res/layout/activity_settings.xml
@@ -661,37 +661,6 @@
-
-
-
-
-
-
-
-
@@ -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"/>
diff --git a/app/src/main/res/layout/fragment_week.xml b/app/src/main/res/layout/fragment_week.xml
index cefdadafa..f352f0495 100644
--- a/app/src/main/res/layout/fragment_week.xml
+++ b/app/src/main/res/layout/fragment_week.xml
@@ -22,12 +22,12 @@
+ android:layout_height="wrap_content"/>
diff --git a/app/src/main/res/layout/fragment_week_holder.xml b/app/src/main/res/layout/fragment_week_holder.xml
index ae4290790..925869dad 100644
--- a/app/src/main/res/layout/fragment_week_holder.xml
+++ b/app/src/main/res/layout/fragment_week_holder.xml
@@ -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"/>
diff --git a/app/src/main/res/layout/weekly_view_hour_textview.xml b/app/src/main/res/layout/weekly_view_hour_textview.xml
index 1678b5124..5cca0cdaa 100644
--- a/app/src/main/res/layout/weekly_view_hour_textview.xml
+++ b/app/src/main/res/layout/weekly_view_hour_textview.xml
@@ -1,10 +1,10 @@
+ android:textSize="@dimen/normal_text_size" />
diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png b/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png
index c52d0b740..da48fd393 100644
Binary files a/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png and b/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png b/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png
index 1d9eee303..dd943776e 100644
Binary files a/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png and b/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png differ
diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png
index 72c207c08..61a8cf08e 100644
Binary files a/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png and b/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png differ
diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png
index e21bbfff0..e031d14ee 100644
Binary files a/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png and b/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png differ
diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png
index a5f1c9de8..256af576e 100644
Binary files a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png differ
diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml
index 977c1a5dc..ccc26c703 100644
--- a/app/src/main/res/values-ar/strings.xml
+++ b/app/src/main/res/values-ar/strings.xml
@@ -124,7 +124,6 @@
تجاوز أنواع الأحداث في الملف
- العنوان
الموقع
الوصف
كامل اليوم
@@ -253,7 +252,7 @@
التقويم البسيط الاحترافي - مناسبات وتنبيهات
- سيتم تنبيهك بكل اللحظات المهمة في حياتك
+ Simple mobile 2020 calendar. Schedule planner & appointment reminder for any day
Simple Calendar Pro is a fully customizable, offline calendar designed to do exactly what a calendar should do. No complicated features, unnecessary permissions and no ads!
diff --git a/app/src/main/res/values-az/strings.xml b/app/src/main/res/values-az/strings.xml
index 4b75c1133..e68ff44e1 100644
--- a/app/src/main/res/values-az/strings.xml
+++ b/app/src/main/res/values-az/strings.xml
@@ -124,7 +124,6 @@
Faylın içərisində hadisə tiplərini üstünə yaz
- Başlıq
Məkan
Əlavələr
Bütün-gün
@@ -247,7 +246,7 @@
Simple Calendar Pro - Events & Reminders
- Be notified of the important moments in your life.
+ Simple mobile 2020 calendar. Schedule planner & appointment reminder for any day
Simple Calendar Pro is a fully customizable, offline calendar designed to do exactly what a calendar should do. No complicated features, unnecessary permissions and no ads!
diff --git a/app/src/main/res/values-bn/strings.xml b/app/src/main/res/values-bn/strings.xml
index 2944b6535..61efafc04 100644
--- a/app/src/main/res/values-bn/strings.xml
+++ b/app/src/main/res/values-bn/strings.xml
@@ -128,7 +128,6 @@
ফাইলটিতে ইভেন্ট টাইপগুলি ওভাররাইড করুন
- টাইটেল
লোকেশন
বর্ণনা
সারাদিন
@@ -250,7 +249,7 @@
সাধারণ ক্যালেন্ডার প্রো - ইভেন্ট এবং রিমাইন্ডার
- আপনার জীবনের গুরুত্বপূর্ণ মুহুর্তগুলিতে অবহিত হন।
+ Simple mobile 2020 calendar. Schedule planner & appointment reminder for any day
সাধারণ ক্যালেন্ডার প্রো একটি সম্পূর্ণ কাস্টমাইজযোগ্য, অফলাইন ক্যালেন্ডার যা একটি ক্যালেন্ডারের ঠিক কী করা উচিত সেটার জন্য ডিজাইন করা হয়েছে। কোনও জটিল ফিচার, অপ্রয়োজনীয় অনুমতি এবং কোনও বিজ্ঞাপন নেই!
diff --git a/app/src/main/res/values-br/strings.xml b/app/src/main/res/values-br/strings.xml
index c4d89c9e5..d803a6c23 100644
--- a/app/src/main/res/values-br/strings.xml
+++ b/app/src/main/res/values-br/strings.xml
@@ -124,7 +124,6 @@
Override event types in the file
- Titl
Lec\'hiadur
Deskrivadur
Devezh-pad
@@ -247,7 +246,7 @@
Simple Calendar Pro - Events & Reminders
- Be notified of the important moments in your life.
+ Simple mobile 2020 calendar. Schedule planner & appointment reminder for any day
Simple Calendar Pro is a fully customizable, offline calendar designed to do exactly what a calendar should do. No complicated features, unnecessary permissions and no ads!
diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml
index ca1e1d69c..76c8ea489 100644
--- a/app/src/main/res/values-cs/strings.xml
+++ b/app/src/main/res/values-cs/strings.xml
@@ -124,7 +124,6 @@
Přepsat typy událostí v souboru
- Název
Lokace
Popis
Celý den
@@ -247,7 +246,7 @@
Jednoduchý kalendář Pro - Události a připomínky
- Nezmeškejte důležité okamžiky svého života.
+ Simple mobile 2020 calendar. Schedule planner & appointment reminder for any day
Jednoduchý kalendář Pro je plně přizpůsobitelný offline kalendář vytvořený přesně pro to, co by kalendáře měly dělat. Žádné zbytečné funkce, nepotřebná oprávnění, ani reklamy!
diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml
index e260101aa..f188ed30f 100644
--- a/app/src/main/res/values-da/strings.xml
+++ b/app/src/main/res/values-da/strings.xml
@@ -124,7 +124,6 @@
Overskriv begivenhedstyper i filen
- Titel
Sted
Beskrivelse
Hele dagen
@@ -244,7 +243,7 @@
Simpel kalender Pro - Begivenheder & påmindelser
- Bliv mindet om vigtige tidspunkter i dit liv.
+ Simpel mobil 2020-kalender. Planlægningsværktøj & aftalepåmindelser for hver dag.
Simpel kalender Pro kan tilpasses helt efter din smag, offline kalender er designet til at gøre præcis hvad en kalender skal kunne. Ingen indviklede funktioner, ingen overflødige tilladelser og ingen reklamer!
@@ -280,7 +279,7 @@
Se hele suiten af Simple værktøjer her:
https://www.simplemobiletools.com
- Standalone website of Simple Calendar Pro:
+ Simple Calendar Pros hjemmeside:
https://www.simplemobiletools.com/calendar
Facebook:
diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml
index 9758f715a..ecbf787f9 100644
--- a/app/src/main/res/values-de/strings.xml
+++ b/app/src/main/res/values-de/strings.xml
@@ -99,7 +99,7 @@
Erinnerung
vorher
Weitere Erinnerung hinzufügen
- Termin-Erinnerungen
+ Terminerinnerungen
Teilnehmer hinzufügen
@@ -110,21 +110,20 @@
Eingeladen
- Enter a country or time zone
+ Region, Stadt oder Zeitversatz eingeben
Termine importieren
Termine exportieren
- Termine aus .ics-Datei importieren
- Termine als .ics-Datei exportieren
- Standard-Termintyp
+ Termine aus ics-Datei importieren
+ Termine als ics-Datei exportieren
+ Standardtermintyp
Vergangene Termine auch exportieren
Termintypen miteinbeziehen
Dateiname (ohne .ics)
Termintypen in der Datei überschreiben
- Titel
Ort
Beschreibung
Ganztags
@@ -139,9 +138,9 @@
Typ mit diesem Namen existiert bereits
Farbe
Regulärer Termin
- Standard-Termintyp kann nicht gelöscht werden
+ Standardtermintyp kann nicht gelöscht werden
Wähle einen Termintyp aus
- Betroffene Termine in den Standard-Termintyp verschieben
+ Betroffene Termine in den Standardtermintyp verschieben
Betroffene Termine dauerhaft löschen
Um einen CalDAV-Kalender zu entfernen, musst du ihn desynchronisieren
@@ -174,7 +173,7 @@
Erinnerungen wiederholen bis sie verworfen werden
Vergangene Termine ausgrauen
Termine
- Audio-Ausgabekanal für Erinnerungen
+ Audioausgabekanal für Erinnerungen
Medien
Wecker
Benachrichtigung
@@ -186,13 +185,13 @@
Ansicht beim Öffnen durch das Terminlisten-Widget
Letzte Ansicht
Neue Termine
- Standard-Anfangszeit
+ Standardanfangszeit
Nächste volle Stunde
- Standard-Dauer
+ Standarddauer
Zuletzt verwendete
Andere Zeit
Wochenenden in einigen Ansichten hervorheben
- Allow changing event time zones
+ Zeitzone kann geändert werden
CalDAV
@@ -207,7 +206,7 @@
Synchronisation erfolgreich
Wähle eine andere Farbe (wird möglicherweise nur lokal angewendet)
Dir fehlt die Berechtigung zum Ändern des gewählten Kalenders
- Event not found. Please enable CalDAV sync for the appropriate calendar in the app settings.
+ Der Termin wurde nicht gefunden. Bitte aktiviere die Synchronisierung für den Kalender in den Einstellungen.
@@ -239,16 +238,16 @@
Für andere Kalender benötigst du einen Synchronisierungsadapter, wie z. B. DAVx5.
Ich sehe die Erinnerungen, aber ich höre keinen Ton. Was kann ich tun?
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.
- Does the app support time zones?
- 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.
+ 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.
+ Unterstützt diese Kalender-App Zeitzonen?
+ 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.
Simple Calendar Pro - Termine & Erinnerungen
- Be notified of the important moments in your life.
+ Simple mobile 2020 calendar. Schedule planner & appointment reminder for any day
Simple Calendar Pro ist ein vollständig anpassbarer Offline-Kalender, der genau das bietet, was man von einem Kalender erwartet. Keine umständlichen Funktionen, keine unnötigen Berechtigungen und keine Werbung!
@@ -284,7 +283,7 @@
Einen Überblick über die komplette Suite von Simple Tools gibt es hier:
https://www.simplemobiletools.com
- Standalone website of Simple Calendar Pro:
+ Eigene Website von Simple Calendar Pro:
https://www.simplemobiletools.com/calendar
Facebook:
diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml
index 544b2bdd0..901a4ac64 100644
--- a/app/src/main/res/values-el/strings.xml
+++ b/app/src/main/res/values-el/strings.xml
@@ -124,7 +124,6 @@
Κατάργηση τύπων εκδηλώσεων στο αρχείο
- Τίτλος
Τοποθεσία
Περιγραφή
Ημερήσια
@@ -247,7 +246,7 @@
Απλό Ημερολόγιο Pro - Εκδηλώσεων & Ειδοποιήσεων
- Ενημερώνεστε για τις σημαντικές στιγμές της ζωή σας.
+ Απλό Ημερολόγιο 2020. Προγραμματισμός & υπενθύμιση συνάντησης για κάθε ημέρα
Το Απλό Ημερολόγιο Pro είναι ένα ημερολόγιο πλήρως προσαρμόσιμο εκτός σύνδεσης που έχει σχεδιαστεί για να κάνει ακριβώς αυτό που υπόσχεται. Δεν υπάρχουν περίπλοκες λειτουργίες, περιττά δικαιώματα και διαφημίσεις!
diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml
index f884d29fd..05e07080d 100644
--- a/app/src/main/res/values-es/strings.xml
+++ b/app/src/main/res/values-es/strings.xml
@@ -124,7 +124,6 @@
Sobreescribir tipos de evento en el archivo
- Título
Ubicación
Descripción
Todo el día
@@ -247,7 +246,7 @@
Calendario Simple Pro - Eventos y Recordatorios
- Se notificado de los momentos importantes en tu vida.
+ Simple mobile 2020 calendar. Schedule planner & appointment reminder for any day
Calendario Simple Pro es un calendario fuera de línea, totalmente personalizable y diseñado para hacer exactamente lo que debe hacer un calendario. ¡Sin funcionalidades complicadas, permisos innecesarios y sin anuncios!
diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml
index fa1ad6b33..ab9e859f7 100644
--- a/app/src/main/res/values-fr/strings.xml
+++ b/app/src/main/res/values-fr/strings.xml
@@ -86,14 +86,14 @@
Anniversaires
Ajouter les anniversaires des contacts
Aucun anniversaire n\’a été trouvé
- No new birthdays have been found
+ Aucun nouvel anniversaire n’a été trouvé
Anniversaires ajoutés avec succès
Anniversaires d\’évènements
Ajouter des anniversaires d\’évènements de contact
Aucun anniversaire d\’évènements n\’a été trouvé
- No new anniversaries have been found
+ Aucun nouvel anniversaire n’a été trouvé
Anniversaires d\’évènements ajoutés avec succès
@@ -111,7 +111,7 @@
Invité
- Enter a country or time zone
+ Entrez un pays ou un fuseau horaire
Importer des événements
@@ -125,7 +125,6 @@
Remplacer les types d\’événement dans le fichier
- Titre
Lieu
Description
Journée
@@ -179,7 +178,7 @@
System
Alarme
Notification
- Ring
+ Sonnerie
Utiliser les rappels des derniers événements comme valeur par défaut pour un nouvel événement
Rappel par défaut 1
Rappel par défaut 2
@@ -192,8 +191,8 @@
Durée par défaut
Identique au dernier
Autre moment
- Highlight weekends on some views
- Allow changing event time zones
+ Mettez en surbrillance les week-ends sur certaines vues
+ Autoriser la modification des fuseaux horaires des événements
CalDAV
@@ -208,7 +207,7 @@
La synchronisation est terminée
Sélectionnez une couleur différente (peut être appliqué localement uniquement)
Vous n\’êtes pas autorisé à écrire dans l\’agenda sélectionné
- Event not found. Please enable CalDAV sync for the appropriate calendar in the app settings.
+ Événement introuvable. Veuillez activer la synchronisation CalDAV pour le calendrier approprié dans les paramètres de l’application.
@@ -240,15 +239,14 @@
Je vois les rappels visuels, mais n\’entends aucun son. Que puis-je faire ?
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.
- Does the app support time zones?
- 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.
+ L’application prend-elle en charge les fuseaux horaires?
+ 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.
- Simple Calendar Pro - Events & Reminders
+ Simple Calendar Pro - Evénements & Rappels
- Be notified of the important moments in your life.
+ Calendrier mobile 2020. Planificat. d\'horaire; rappel de RDV n\'importe quel jour
Simple Calendar Pro is a fully customizable, offline calendar designed to do exactly what a calendar should do. No complicated features, unnecessary permissions and no ads!
diff --git a/app/src/main/res/values-gl/strings.xml b/app/src/main/res/values-gl/strings.xml
index 341c39eaf..3e24e9375 100644
--- a/app/src/main/res/values-gl/strings.xml
+++ b/app/src/main/res/values-gl/strings.xml
@@ -124,7 +124,6 @@
Sobreescribir tipos de evento no ficheiro
- Título
Localización
Descrición
Todo o día
@@ -247,7 +246,7 @@
Simple Calendar Pro - Events & Reminders
- Be notified of the important moments in your life.
+ Simple mobile 2020 calendar. Schedule planner & appointment reminder for any day
Simple Calendar Pro is a fully customizable, offline calendar designed to do exactly what a calendar should do. No complicated features, unnecessary permissions and no ads!
diff --git a/app/src/main/res/values-he/strings.xml b/app/src/main/res/values-he/strings.xml
index db6de4b6d..c7c7f4474 100644
--- a/app/src/main/res/values-he/strings.xml
+++ b/app/src/main/res/values-he/strings.xml
@@ -124,7 +124,6 @@
שנה סוגי אירועים בקובץ
- כותרת
מיקום
תיאור
כל היום
@@ -247,7 +246,7 @@
Simple Calendar Pro - יומן פשוט
- Be notified of the important moments in your life.
+ Simple mobile 2020 calendar. Schedule planner & appointment reminder for any day
Simple Calendar Pro is a fully customizable, offline calendar designed to do exactly what a calendar should do. No complicated features, unnecessary permissions and no ads!
diff --git a/app/src/main/res/values-hi-rIN/strings.xml b/app/src/main/res/values-hi-rIN/strings.xml
index b4df4d4e5..15b17c9a2 100644
--- a/app/src/main/res/values-hi-rIN/strings.xml
+++ b/app/src/main/res/values-hi-rIN/strings.xml
@@ -124,7 +124,6 @@
Override event types in the file
- शीर्षक
Location
विवरण
All-day
@@ -247,7 +246,7 @@
Simple Calendar Pro - Events & Reminders
- Be notified of the important moments in your life.
+ Simple mobile 2020 calendar. Schedule planner & appointment reminder for any day
Simple Calendar Pro is a fully customizable, offline calendar designed to do exactly what a calendar should do. No complicated features, unnecessary permissions and no ads!
diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml
index 74afe7394..9fc8aecbd 100644
--- a/app/src/main/res/values-hr/strings.xml
+++ b/app/src/main/res/values-hr/strings.xml
@@ -124,7 +124,6 @@
Override event types in the file
- Naslov
Lokacija
Opis
Cjelodnevni
@@ -247,7 +246,7 @@
Simple Calendar Pro - Events & Reminders
- Be notified of the important moments in your life.
+ Simple mobile 2020 calendar. Schedule planner & appointment reminder for any day
Simple Calendar Pro is a fully customizable, offline calendar designed to do exactly what a calendar should do. No complicated features, unnecessary permissions and no ads!
diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml
index 5d70ee693..055f4726c 100644
--- a/app/src/main/res/values-hu/strings.xml
+++ b/app/src/main/res/values-hu/strings.xml
@@ -124,7 +124,6 @@
Override event types in the file
- Név
Location
Leírás
All-day
@@ -247,7 +246,7 @@
Simple Calendar Pro - Events & Reminders
- Be notified of the important moments in your life.
+ Simple mobile 2020 calendar. Schedule planner & appointment reminder for any day
Simple Calendar Pro is a fully customizable, offline calendar designed to do exactly what a calendar should do. No complicated features, unnecessary permissions and no ads!
diff --git a/app/src/main/res/values-id/strings.xml b/app/src/main/res/values-id/strings.xml
index 28b0d5f77..25338348f 100644
--- a/app/src/main/res/values-id/strings.xml
+++ b/app/src/main/res/values-id/strings.xml
@@ -124,7 +124,6 @@
Timpa kategori acara di dalam berkas
- Judul
Lokasi
Deskripsi
Sepanjang hari
@@ -247,7 +246,7 @@
Simple Calendar Pro - Acara & Pengingat
- Selalu mengingatkan semua momen penting dalam hidup anda.
+ Simple mobile 2020 calendar. Schedule planner & appointment reminder for any day
Simple Calendar Pro adalah kalender luring sederhana yang mudah digunakan dan dibuat sesuai dengan fungsi-fungsi dasar sebuah kalender. Tanpa fitur yang terlalu rumit, perizinan yang tidak diperlukan dan sama sekali tanpa iklan!
diff --git a/app/src/main/res/values-in/strings.xml b/app/src/main/res/values-in/strings.xml
index 28b0d5f77..25338348f 100644
--- a/app/src/main/res/values-in/strings.xml
+++ b/app/src/main/res/values-in/strings.xml
@@ -124,7 +124,6 @@
Timpa kategori acara di dalam berkas
- Judul
Lokasi
Deskripsi
Sepanjang hari
@@ -247,7 +246,7 @@
Simple Calendar Pro - Acara & Pengingat
- Selalu mengingatkan semua momen penting dalam hidup anda.
+ Simple mobile 2020 calendar. Schedule planner & appointment reminder for any day
Simple Calendar Pro adalah kalender luring sederhana yang mudah digunakan dan dibuat sesuai dengan fungsi-fungsi dasar sebuah kalender. Tanpa fitur yang terlalu rumit, perizinan yang tidak diperlukan dan sama sekali tanpa iklan!
diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml
index 3e2d4c56e..e83d7e221 100644
--- a/app/src/main/res/values-it/strings.xml
+++ b/app/src/main/res/values-it/strings.xml
@@ -124,7 +124,6 @@
Sovrascrivi i tipi di eventi nel file
- Titolo
Posizione
Descrizione
Tutto il giorno
@@ -247,7 +246,7 @@
Semplice Calendario Pro - Eventi & Promemoria
- Be notified of the important moments in your life.
+ Simple mobile 2020 calendar. Schedule planner & appointment reminder for any day
Semplice Calendario Pro è un calendario offline completamente personalizzabile progettato per fare esattamente quello che un calendario dovrebbe fare. Non ci sono funzionalità complicate, permessi non necessari e senza pubblicità!
diff --git a/app/src/main/res/values-iw/strings.xml b/app/src/main/res/values-iw/strings.xml
index ee913d308..aa37231b5 100644
--- a/app/src/main/res/values-iw/strings.xml
+++ b/app/src/main/res/values-iw/strings.xml
@@ -124,7 +124,6 @@
שנה סוגי אירועים בקובץ
- כותרת
מיקום
תיאור
כל היום
@@ -247,7 +246,7 @@
Simple Calendar Pro - יומן פשוט
- Be notified of the important moments in your life.
+ Simple mobile 2020 calendar. Schedule planner & appointment reminder for any day
Simple Calendar Pro is a fully customizable, offline calendar designed to do exactly what a calendar should do. No complicated features, unnecessary permissions and no ads!
diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml
index 45c3b1f7d..dbfcc278c 100644
--- a/app/src/main/res/values-ja/strings.xml
+++ b/app/src/main/res/values-ja/strings.xml
@@ -124,7 +124,6 @@
ファイル内の予定の種類を上書きする
- タイトル
場所
説明
終日
@@ -247,7 +246,7 @@
Simple Calendar Pro - Events & Reminders
- Be notified of the important moments in your life.
+ Simple mobile 2020 calendar. Schedule planner & appointment reminder for any day
Simple Calendar Pro is a fully customizable, offline calendar designed to do exactly what a calendar should do. No complicated features, unnecessary permissions and no ads!
diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml
index 678f99a8d..f621e2a61 100644
--- a/app/src/main/res/values-ko/strings.xml
+++ b/app/src/main/res/values-ko/strings.xml
@@ -124,7 +124,6 @@
파일에서 일정 유형 재정의
- 제목
위치
내용
종일
@@ -246,7 +245,7 @@
Simple Calendar Pro - 일정 & 알림
- 당신의 인생에 있어 중요한 순간을 알립니다.
+ Simple mobile 2020 calendar. Schedule planner & appointment reminder for any day
Simple Calendar Pro는 캘린더의 기능을 정확하게 수행하도록 설계된 사용자 정의 오프라인 캘린더입니다. 복잡한 기능, 불필요한 권한 및 광고가 없습니다!
diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml
index 2158ec8b6..d92e1c56e 100644
--- a/app/src/main/res/values-lt/strings.xml
+++ b/app/src/main/res/values-lt/strings.xml
@@ -124,7 +124,6 @@
Override event types in the file
- Pavadinimas
Vieta
Apibūdinimas
Visos dienos
@@ -247,7 +246,7 @@
Simple Calendar Pro - Events & Reminders
- Be notified of the important moments in your life.
+ Simple mobile 2020 calendar. Schedule planner & appointment reminder for any day
Simple Calendar Pro is a fully customizable, offline calendar designed to do exactly what a calendar should do. No complicated features, unnecessary permissions and no ads!
diff --git a/app/src/main/res/values-lv/strings.xml b/app/src/main/res/values-lv/strings.xml
new file mode 100644
index 000000000..297378842
--- /dev/null
+++ b/app/src/main/res/values-lv/strings.xml
@@ -0,0 +1,296 @@
+
+
+ Vienkāršais kalendārs
+ Kalendārs
+ Mainīt skatu
+ Dienas skats
+ Nedēļas skats
+ Mēneša skats
+ Gada skats
+ Vienkāršs notikumu saraksts
+ Izskatās, ka jums nav gaidāmo notikumu.
+ Iet uz šodienu
+ Iet uz datumu
+ 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!
+
+
+ Mēneša kalendārs
+ Kalendāra notikumu saraksts
+
+
+ Notikums
+ Rediģēt notikumu
+ Jauns notikums
+ Izveidot jaunu notikumu
+ Notikuma dublikāts
+ Nosaukums nedrīkst būt atstāts tukšs
+ Notikums nevar beigties pirms tā sākuma
+ Notikums veiksmīgi pievienots
+ Notikums veiksmīgi aktualizēts
+ Filtrējiet notikumus pēc tipa
+ Lūdzu, ievadiet/norādiet atrašanās vietu, kuru parādīt kartē
+ Gaidāms/Priekšāstāvošs notikums
+
+
+ Atkārtojošs
+ Bez atkārtošanās
+ Ik dienu
+ Ik nedēļu
+ Ik mēnesi
+ Ik gadu
+ nedēļas
+ mēneši
+ gadi
+ Atkārtot līdz
+ Bezgalīgi
+ Notikums ir atkārtojošs
+ Atlasītajos ir atkārtojoši/periodiski notikumi
+ Dzēst tikai šo atlasīto notikumu
+ Dzēst šo un visus turpmākos notikumus
+ Dzēst visus šos notikumus
+ Aktualizēt tikai šo atlasīto notikumu
+ Aktualizēt šos visus notikumus
+ Atkārtot līdz datumam
+ Atkārtot X reizes
+ Atkārtot bezgalīgi
+ reizes
+ Atkārtot
+ Atkārtot iekš
+ Katru dienu
+ Izvēlētajās dienās
+ Šajā pašā dienā
+ Pēdējā dienā
+ Atkārtot ik mēnesi vienā un tajā pašā dienā
+ Atkārtot mēneša pēdējā dienā
+ Atkārtot ik gadu vienā un tajā pašā dienā
+ Atkārtot katru
+ Katru
+ 1.
+ 2.
+ 3.
+ 4.
+ pēdēj.
+
+
+
+ Atkārtot katru
+ Katru
+ 1.
+ 2.
+ 3.
+ 4.
+ pēdēj.
+
+
+ Dzimšanas dienas
+ Pievienot dzimšanas dienas
+ Dzimšanas dienas nav atrastas
+ Jaunas dzimšanas dienas nav atrastas
+ Dzimšanas dienas veiksmīgi pievienotas
+
+
+ Jubilejas/gadadienas
+ Pievienot jubileju
+ Jubilejas nav atrastas
+ Jaunas jubilejas nav atrastas
+ Jubilejas veiksmīgi pievienotas
+
+
+ Atgādinājums
+ pirms notikuma
+ Pievienot vēl vienu atgādinājumu
+ Notikumu atgādinājumi
+
+
+ Pievienot dalībnieku
+ Mans statuss:
+ Iešu/eju
+ Neiešu/neeju
+ Varbūt iešu
+ Aicināts
+
+
+ Ievadiet valsti vai laika joslu
+
+
+ Notikumu imports
+ Notikumu eksports
+ Importēt notikumus no .ics faila
+ Eksportēt notikumus .ics failā
+ Notikuma tips pēc noklusējuma
+ Eksportēt arī pagājušos notikumus
+ Ietvert notikumu veidus
+ Faila nosaukums (bez .ics)
+ Ignorēt/nesaglabāt notikumu tipus failā
+
+
+ Vieta
+ Apraksts
+ Visu dienu
+
+
+ Nedēļa
+
+
+ Notikumu tipi
+ Pievienot jaunu tipu
+ Rediģēt tipu
+ Tips ar šādu nosaukumu jau pastāv
+ Krāsa
+ Regulārs notikums
+ Noklusēto notikuma tipu nevar izdzēst
+ Izvēlieties notikuma tipu
+ Atzīmēto/ietekmēto notikumu tipu nomainīt uz noklusējuma
+ Izdzēst atzīmētos/ietekmētos notikumus pavisam
+ Lai izdzēstu CalDAV kalendāru, jāatspējo sinhronizācija ar to
+
+
+ Svētku dienas
+ Pievienot svētku dienas
+ Valsts svētki
+ Reliģiskie svētki
+ Svētku dienas tika veiksmīgi importētas ar notikuma tipu “Svētki”
+ Dažas svētku dienas neizdevās importēt
+ Svētku dienu imports neizdevās
+
+
+ Notikumu tipu pārvaldība
+ Sākt dienu plkst.
+ Beigt dienu plkst.
+ Rādīt nedēļu kārtas skaitļus
+ Atgādināt, vibrējot
+ Atgādināt ar skaņu
+ Nav atrasta programma zvana signāla iestatīšanai
+ Nav
+ Diena nevar beigties pirms tās sākuma
+ CalDAV sinhronizācija
+ Notikumu saraksti
+ Rādīt pagājušos notikumus
+ Aizstāt notikuma aprakstu ar atrašanās vietu
+ Dzēst visus notikumus
+ Tiešām vēlaties dzēst visus notikumus? Tas gan neietekmēs notikumu tipus un citus iestatījumus.
+ Rādīt režģi
+ Cikliski atgādinājumi, līdz tiek noņemti
+ Pagājušos notikumus rādīt blāvus
+ Notikumi
+ Audio straume, kuru izmanto atgādinājumi
+ Sistēma
+ Modinātājs
+ Paziņojums
+ Zvans
+ Izmantojiet pagājušo notikumu atgādinājumus kā noklusējuma iestatījumus jauniem notikumiem
+ Noklusējuma atgādinājums #1
+ Noklusējuma atgādinājums #2
+ Noklusējuma atgādinājums #3
+ Skata režīms, kas atveras no notikumu saraksta logrīka
+ Pēdējais izmantotais skats
+ Jauni notikumi
+ Sākuma laiks pēc noklusējuma
+ Nākamā pilnā stunda
+ Ilgums pēc noklusējuma
+ Pēdējais izmantotais
+ Cits
+ Iezīmēt/izcelt nedēļas nogales dažos skatos/režīmos
+ Atļaut mainīt notikuma laika joslu
+
+
+ CalDAV
+ Atzīmējiet sinhronizējamos kalendārus
+ Pārvaldiet sinhronizējamos kalendārus
+ Glabāt tikai vietēji
+ Aktualizēt kalendārus no CalDAV
+ Notiek aktualizēšana ...
+ Aktualizācija pabeigta
+ Kalendāra rediģēšana neizdevās
+ Notiek sinhronizēšana ...
+ Sinhronizācija pabeigta
+ Izvēlieties citu krāsu (var tikt izmantota tikai lokāli)
+ Jums izvēlētajā kalendārā rakstīt nav ļauts
+ Notikums nav atrasts. Lūdzu, lietotnes iestatījumos iespējojiet CalDAV sinhronizāciju attiecīgajam kalendāram.
+
+
+
+ pirmdiena
+ otrdiena
+ trešdiena
+ ceturtdiena
+ piektdiena
+ sestdiena
+ svētdiena
+
+
+ Apmācība
+ Kāju diena
+ Tikšanās ar Krišu Jāni Kariņu
+ Pie līkās priedes
+ Olaines novada domes sēde
+ Vakariņas ar Dačuku
+ Dieva ausī
+ Laiks tējot
+
+
+ Kā izdzēst svētku dienas, kas importētas, izmantojot pogu \“Pievienot svētkus\”?
+ Šā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/".
+ Vai iespējams sinhronizēt notikumus, izmantojot Google kalendāru vai citu pakalpojumu, kas atbalsta CalDAV?
+ 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.
+ Es redzu vizuālos atgādinājumus, bet nedzirdu skaņu. Kā rīkoties?
+ 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.
+ Vai lietotne atbalsta laika joslas?
+ 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.
+
+
+
+ Simple Calendar Pro - Notikumi & atgādinājumi
+
+ Vienkāršs mobilais 2020.g. kalendārs. Plānotājs & tikšanos atgādinātājs ikdienai
+
+ Simple Calendar Pro ir elasīgi pielāgojams autonoms bezsaistes kalendārs, kas paredzēts tām funkcijām, kuras kalendāram jāīsteno.Bez sarežģītām iespējām, funkcijas izpildei nevajadzīgu atļauju pieprasījumiem un uzbāzīgām reklāmām!
+
+ 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 viegli padarāmu. Izmantojot neticami plašu un elastīgu pielāgošanas iespēju paleti, 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ā precīzi zināt, kas un kad notiks Jūsu dzīvē.
+
+
+ ----------------------------------------------------------
+ Simple Calendar Pro – Īpašības & priekšrocības
+ ----------------------------------------------------------
+
+ ✔️ 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!
+
+ Pilnu Vienkāršo Rīku (Simple Tools) komplektu skatiet šeit:
+ https://www.simplemobiletools.com
+
+ Lietotnes Simple Calendar Pro vietne:
+ https://www.simplemobiletools.com/calendar
+
+ Facebook:
+ https://www.facebook.com/simplemobiletools
+
+ Reddit:
+ https://www.reddit.com/r/SimpleMobileTools
+
+
+
diff --git a/app/src/main/res/values-nb/strings.xml b/app/src/main/res/values-nb/strings.xml
index 240244297..0fd38b5a0 100644
--- a/app/src/main/res/values-nb/strings.xml
+++ b/app/src/main/res/values-nb/strings.xml
@@ -124,7 +124,6 @@
Overstyr hendelsestyper i filen
- Tittel
Sted
Beskrivelse
Hele dagen
@@ -247,7 +246,7 @@
Simple Calendar Pro - Events & Reminders
- Be notified of the important moments in your life.
+ Simple mobile 2020 calendar. Schedule planner & appointment reminder for any day
Simple Calendar Pro is a fully customizable, offline calendar designed to do exactly what a calendar should do. No complicated features, unnecessary permissions and no ads!
diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml
index 7e463cd2c..e5c8d0d6d 100644
--- a/app/src/main/res/values-nl/strings.xml
+++ b/app/src/main/res/values-nl/strings.xml
@@ -124,7 +124,6 @@
Afspraaktypes uit het bestand negeren
- Titel
Locatie
Beschrijving
Hele dag
@@ -247,7 +246,7 @@
Eenvoudige Agenda Pro - Afspraken & Herinneringen
- Houd de volledige controle over de belangrijke momenten in je leven.
+ Simple mobile 2020 calendar. Schedule planner & appointment reminder for any day
Eenvoudige Agenda Pro is een volledig aan te passen offline agenda, ontwikkeld om precies te doen waar een agenda voor bedoeld is. Geen ingewikkelde poespas of onnodige machtigingen, en zonder advertenties!
@@ -280,10 +279,10 @@
DOWNLOAD EENVOUDIGE AGENDA PRO – DE AGENDA ZONDER ADVERTENTIES!
- Kijk ook eens naar de hele collectie apps van Simple Tools:
+ Probeer ook eens de andere apps van Simple Tools:
https://www.simplemobiletools.com
- Standalone website of Simple Calendar Pro:
+ Website voor Eenvoudige Agenda Pro:
https://www.simplemobiletools.com/calendar
Facebook:
diff --git a/app/src/main/res/values-no/strings.xml b/app/src/main/res/values-no/strings.xml
index a555558d9..ad3d1906f 100644
--- a/app/src/main/res/values-no/strings.xml
+++ b/app/src/main/res/values-no/strings.xml
@@ -124,7 +124,6 @@
Override event types in the file
- Tittel
Sted
Beskrivelse
Hele dagen
@@ -247,7 +246,7 @@
Simple Calendar Pro - Events & Reminders
- Be notified of the important moments in your life.
+ Simple mobile 2020 calendar. Schedule planner & appointment reminder for any day
Simple Calendar Pro is a fully customizable, offline calendar designed to do exactly what a calendar should do. No complicated features, unnecessary permissions and no ads!
diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml
index 58b56d0db..e75e8bca9 100644
--- a/app/src/main/res/values-pl/strings.xml
+++ b/app/src/main/res/values-pl/strings.xml
@@ -124,7 +124,6 @@
Nadpisz typy wydarzeń w pliku
- Tytuł
Lokalizacja
Opis
Całodniowe
@@ -245,7 +244,7 @@
Simple Calendar Pro - Events & Reminders
- Be notified of the important moments in your life.
+ Simple mobile 2020 calendar. Schedule planner & appointment reminder for any day
Simple Calendar Pro is a fully customizable, offline calendar designed to do exactly what a calendar should do. No complicated features, unnecessary permissions and no ads!
diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml
index 74be8093d..1c57cd002 100644
--- a/app/src/main/res/values-pt-rBR/strings.xml
+++ b/app/src/main/res/values-pt-rBR/strings.xml
@@ -124,7 +124,6 @@
Substituir os tipos de eventos no arquivo
- Título
Localização
Descrição
O dia todo
@@ -247,7 +246,7 @@ selecionando a opção \"Fonte de áudio usada pelos lembretes\" e modificando o
Simple Calendar Pro - Events & Reminders
- Be notified of the important moments in your life.
+ Simple mobile 2020 calendar. Schedule planner & appointment reminder for any day
Simple Calendar Pro is a fully customizable, offline calendar designed to do exactly what a calendar should do. No complicated features, unnecessary permissions and no ads!
diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml
index fc5c106f2..25f1f275b 100644
--- a/app/src/main/res/values-pt/strings.xml
+++ b/app/src/main/res/values-pt/strings.xml
@@ -124,7 +124,6 @@
Substituir tipo de eventos no ficheiro
- Título
Location
Descrição
Todo o dia
@@ -247,7 +246,7 @@
Simple Calendar Pro - Eventos e lembretes
- Notificações sobre os momentos importantes da sua vida.
+ Simple mobile 2020 calendar. Schedule planner & appointment reminder for any day
Simple Calendar Pro é um calendário local, criado para fazer o que um calendário deve fazer. Funcionalidades simples, apenas as permissões estritamente necessárias e sem anúncios!
diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml
index 61f41872c..0780fd6a8 100644
--- a/app/src/main/res/values-ru/strings.xml
+++ b/app/src/main/res/values-ru/strings.xml
@@ -124,7 +124,6 @@
Переопределять типы событий в файле
- Заголовок
Место
Описание
Весь день
@@ -247,7 +246,7 @@
Simple Calendar Pro - события и напоминания
- Не пропустите важные моменты своей жизни.
+ Simple mobile 2020 calendar. Schedule planner & appointment reminder for any day
Simple Calendar Pro — это полностью настраиваемый автономный календарь, предназначенный для выполнения именно того, что должен делать календарь. Никаких непонятных функций, ненужных разрешений и рекламы!
diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml
index 671258d7f..512395ce4 100644
--- a/app/src/main/res/values-sk/strings.xml
+++ b/app/src/main/res/values-sk/strings.xml
@@ -124,7 +124,6 @@
Nahradiť typy udalostí v súbore
- Názov
Miesto
Popis
Celodenná
@@ -247,7 +246,7 @@
Jednoduchý kalendár Pro - Udalosti a pripomienky
- Nezmeškajte dôležité chvíle vášho života.
+ Mobilný kalendár 2020. Efektívny plánovač a manažér stretnutí počas celého dňa.
Jednoduchý kalendár Pro je prispôsobiteľný offline kalendár vytvorený presne na to, čo by kalendáre mali zvládať.Nenachádzajú sa tu žiadne nepotrebné funkcie, nepotrebné oprávnenia, ani reklamy!
diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml
index ac0bb5795..17192eef5 100644
--- a/app/src/main/res/values-sv/strings.xml
+++ b/app/src/main/res/values-sv/strings.xml
@@ -124,7 +124,6 @@
Ignorera händelsetyper i filen
- Titel
Plats
Beskrivning
Heldag
@@ -247,7 +246,7 @@
Simple Calendar Pro - Events & Reminders
- Be notified of the important moments in your life.
+ Simple mobile 2020 calendar. Schedule planner & appointment reminder for any day
Simple Calendar Pro is a fully customizable, offline calendar designed to do exactly what a calendar should do. No complicated features, unnecessary permissions and no ads!
diff --git a/app/src/main/res/values-sw600dp/dimens.xml b/app/src/main/res/values-sw600dp/dimens.xml
index eb84835a6..bfaaddb56 100644
--- a/app/src/main/res/values-sw600dp/dimens.xml
+++ b/app/src/main/res/values-sw600dp/dimens.xml
@@ -6,8 +6,6 @@
60dp
90dp
- 89dp
- 2160dp
15dp
20sp
diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml
index e2ea94af8..4961c7b4e 100644
--- a/app/src/main/res/values-tr/strings.xml
+++ b/app/src/main/res/values-tr/strings.xml
@@ -11,7 +11,7 @@
Yaklaşan etkinlikleriniz yok gibi görünüyor.
Bugüne git
Tarihe git
- 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!
+ 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!
Aylık takvim
@@ -124,7 +124,6 @@
Dosyadaki etkinlik türlerini geçersiz kıl
- Başlık
Konum
Açıklama
Tüm-gün
@@ -243,13 +242,13 @@
- Basit Takvim Pro - Etkinlikler & Hatırlatıcılar
+ Basit Takvim Pro - Etkinlikler ve Hatırlatıcılar
- Hayatınızdaki önemli anlardan haberdar olun.
+ Simple mobile 2020 calendar. Schedule planner & appointment reminder for any day
Basit Takvim Pro, bir takvimin tam olarak yapması gerekeni yapmak için tasarlanmış, tamamen özelleştirilebilir, çevrimdışı bir takvimdir. Karmaşık özellikler, gereksiz izinler ve reklam içermez!
- İ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 düzenli kalmanızı kolaylaştırır. İnanılmaz çeşitli özelleştirme seçenekleri 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 düzenli kalmanızı kolaylaştırır. İnanılmaz çeşitli özelleştirme seçenekleri 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 hayatınızda neyin ne zaman geldiğini tam olarak bilirsiniz.
@@ -257,12 +256,12 @@
Basit Takvim Pro – Özellikleri & Avantajları
----------------------------------------------------------
- ✔️ 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!
Basit Araçlar paketinin tamamını buradan inceleyin:
https://www.simplemobiletools.com
- Basit Takvim Pro'nun bağımsız web sitesi:
+ Basit Takvim Pro\'nun bağımsız web sitesi:
https://www.simplemobiletools.com/calendar
Facebook:
diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml
index 74f2b1697..3115e511a 100644
--- a/app/src/main/res/values-uk/strings.xml
+++ b/app/src/main/res/values-uk/strings.xml
@@ -124,7 +124,6 @@
Змінити тип подій у файлі
- Назва
Місце
Описання
Цілий день
@@ -247,7 +246,7 @@
Простий Календар Pro - Події і Нагадування
- Be notified of the important moments in your life.
+ Simple mobile 2020 calendar. Schedule planner & appointment reminder for any day
Простий Календар Pro - це офлайн-календар з дуже гнучкими налаштуваннями, призначений робити саме те, що календар повинен робити. Не містить складних особливостей, лише необхідні дозволи та без реклами!
diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml
index 6e2694406..56240c26c 100644
--- a/app/src/main/res/values-zh-rCN/strings.xml
+++ b/app/src/main/res/values-zh-rCN/strings.xml
@@ -124,7 +124,6 @@
覆盖档案内的活动类型
- 标题
地点
描述
全天
@@ -247,7 +246,7 @@
简易行事历 Pro - 活动&约会
- Be notified of the important moments in your life.
+ Simple mobile 2020 calendar. Schedule planner & appointment reminder for any day
简易行事历Pro是一个高度自定义,完全旨在于行事历应该做什么的离线行事历。 没有复杂的功能、非必要的权限和广告!
diff --git a/app/src/main/res/values-zh-rHK/strings.xml b/app/src/main/res/values-zh-rHK/strings.xml
index 8f6e0217e..0e2f3e6fe 100644
--- a/app/src/main/res/values-zh-rHK/strings.xml
+++ b/app/src/main/res/values-zh-rHK/strings.xml
@@ -124,7 +124,6 @@
覆寫檔案內的活動類型
- 標題
地點
描述
全天
@@ -247,7 +246,7 @@
簡易行事曆 Pro - 活動&約會
- Be notified of the important moments in your life.
+ Simple mobile 2020 calendar. Schedule planner & appointment reminder for any day
簡易行事曆Pro是一個高度自訂化,完全旨在於行事曆應該做什麼的離線行事曆。 沒有複雜的功能、非必要的權限和廣告!
diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml
index 4885fd951..dca9d4cd6 100644
--- a/app/src/main/res/values-zh-rTW/strings.xml
+++ b/app/src/main/res/values-zh-rTW/strings.xml
@@ -124,7 +124,6 @@
覆寫檔案內的活動類型
- 標題
地點
描述
全天
@@ -247,7 +246,7 @@
簡易行事曆 Pro - 活動和約會
- 通知你生命中的重要時刻。
+ Simple mobile 2020 calendar. Schedule planner & appointment reminder for any day
簡易行事曆Pro是一個高度自訂化,完全旨在於行事曆應該做什麼的離線行事曆。 沒有複雜的功能、非必要的權限和廣告!
diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml
index 2c2d17fa5..352f020c5 100644
--- a/app/src/main/res/values/dimens.xml
+++ b/app/src/main/res/values/dimens.xml
@@ -7,7 +7,6 @@
40dp
60dp
- 1440dp
10dp
10dp
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index b3c6bcb11..172ff5675 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -124,7 +124,6 @@
Override event types in the file
- Title
Location
Description
All-day
@@ -247,7 +246,7 @@
Simple Calendar Pro - Events & Reminders
- Be notified of the important moments in your life.
+ Simple mobile 2020 calendar. Schedule planner & appointment reminder for any day
Simple Calendar Pro is a fully customizable, offline calendar designed to do exactly what a calendar should do. No complicated features, unnecessary permissions and no ads!
diff --git a/build.gradle b/build.gradle
index 7ed5f8987..ad2a02639 100644
--- a/build.gradle
+++ b/build.gradle
@@ -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"
diff --git a/fastlane/metadata/android/en-US/changelogs/172.txt b/fastlane/metadata/android/en-US/changelogs/172.txt
new file mode 100644
index 000000000..261a409aa
--- /dev/null
+++ b/fastlane/metadata/android/en-US/changelogs/172.txt
@@ -0,0 +1,2 @@
+ * Added a Go To Today menu button at the event list view too
+ * Some translation and stability improvements
diff --git a/fastlane/metadata/android/en-US/changelogs/173.txt b/fastlane/metadata/android/en-US/changelogs/173.txt
new file mode 100644
index 000000000..54def171b
--- /dev/null
+++ b/fastlane/metadata/android/en-US/changelogs/173.txt
@@ -0,0 +1,2 @@
+ * Remember the last used folder at ics exporting
+ * Do not request the Storage permission on Android 10+, use Scoped Storage
diff --git a/fastlane/metadata/android/en-US/changelogs/174.txt b/fastlane/metadata/android/en-US/changelogs/174.txt
new file mode 100644
index 000000000..7626b8dda
--- /dev/null
+++ b/fastlane/metadata/android/en-US/changelogs/174.txt
@@ -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
diff --git a/fastlane/metadata/android/en-US/images/featureGraphic_old.png b/fastlane/metadata/android/en-US/images/featureGraphic_old.png
new file mode 100644
index 000000000..fb8373a60
Binary files /dev/null and b/fastlane/metadata/android/en-US/images/featureGraphic_old.png differ
diff --git a/fastlane/metadata/android/en-US/images/icon.png b/fastlane/metadata/android/en-US/images/icon.png
index 3f9fc85cb..b055efb48 100644
Binary files a/fastlane/metadata/android/en-US/images/icon.png and b/fastlane/metadata/android/en-US/images/icon.png differ
diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/app_1.jpg b/fastlane/metadata/android/en-US/images/phoneScreenshots/app_1.jpg
index b9fd5dcee..4e993623f 100644
Binary files a/fastlane/metadata/android/en-US/images/phoneScreenshots/app_1.jpg and b/fastlane/metadata/android/en-US/images/phoneScreenshots/app_1.jpg differ
diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/app_2.jpg b/fastlane/metadata/android/en-US/images/phoneScreenshots/app_2.jpg
index 3b1a8fbdd..a4a78d7ba 100644
Binary files a/fastlane/metadata/android/en-US/images/phoneScreenshots/app_2.jpg and b/fastlane/metadata/android/en-US/images/phoneScreenshots/app_2.jpg differ
diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/app_3.jpg b/fastlane/metadata/android/en-US/images/phoneScreenshots/app_3.jpg
index d43eca486..8768c8a5d 100644
Binary files a/fastlane/metadata/android/en-US/images/phoneScreenshots/app_3.jpg and b/fastlane/metadata/android/en-US/images/phoneScreenshots/app_3.jpg differ
diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/app_4.jpg b/fastlane/metadata/android/en-US/images/phoneScreenshots/app_4.jpg
index b832cbd5c..8ddbad73e 100644
Binary files a/fastlane/metadata/android/en-US/images/phoneScreenshots/app_4.jpg and b/fastlane/metadata/android/en-US/images/phoneScreenshots/app_4.jpg differ
diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/app_5.jpg b/fastlane/metadata/android/en-US/images/phoneScreenshots/app_5.jpg
index eb04a3776..eaf0a5d41 100644
Binary files a/fastlane/metadata/android/en-US/images/phoneScreenshots/app_5.jpg and b/fastlane/metadata/android/en-US/images/phoneScreenshots/app_5.jpg differ
diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/app_6.jpg b/fastlane/metadata/android/en-US/images/phoneScreenshots/app_6.jpg
index 5119194f9..a9558abb5 100644
Binary files a/fastlane/metadata/android/en-US/images/phoneScreenshots/app_6.jpg and b/fastlane/metadata/android/en-US/images/phoneScreenshots/app_6.jpg differ
diff --git a/fastlane/metadata/android/en-US/images/promo_graphic.png b/fastlane/metadata/android/en-US/images/promo_graphic.png
new file mode 100644
index 000000000..600028a31
Binary files /dev/null and b/fastlane/metadata/android/en-US/images/promo_graphic.png differ
diff --git a/fastlane/metadata/android/en-US/images/raw_screenshots/calendar.xcf b/fastlane/metadata/android/en-US/images/raw_screenshots/calendar.xcf
index baf40f7c2..34162f10b 100644
Binary files a/fastlane/metadata/android/en-US/images/raw_screenshots/calendar.xcf and b/fastlane/metadata/android/en-US/images/raw_screenshots/calendar.xcf differ
diff --git a/fastlane/metadata/android/en-US/images/square.png b/fastlane/metadata/android/en-US/images/square.png
index 989c759b0..e62055d37 100644
Binary files a/fastlane/metadata/android/en-US/images/square.png and b/fastlane/metadata/android/en-US/images/square.png differ
diff --git a/fastlane/metadata/android/en-US/images/square.xcf b/fastlane/metadata/android/en-US/images/square.xcf
index 398ba3813..c72316859 100644
Binary files a/fastlane/metadata/android/en-US/images/square.xcf and b/fastlane/metadata/android/en-US/images/square.xcf differ
diff --git a/fastlane/metadata/android/en-US/images/tv_banner.png b/fastlane/metadata/android/en-US/images/tv_banner.png
new file mode 100644
index 000000000..35fd3b2b9
Binary files /dev/null and b/fastlane/metadata/android/en-US/images/tv_banner.png differ
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index 1f39dbdca..2d407db26 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -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