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 -Logo +Logo 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