diff --git a/.github/workflows/android.yml b/.github/workflows/android.yml
index b2d9391a2b..74edf8eb34 100644
--- a/.github/workflows/android.yml
+++ b/.github/workflows/android.yml
@@ -1,25 +1,27 @@
name: Android CI with Gradle
on:
- pull_request:
push:
- workflow_dispatch:
+ branches:
+ - '*'
+ pull_request:
+ branches: [ master ]
jobs:
build:
+
runs-on: ubuntu-latest
+
steps:
- name: Checkout
- uses: actions/checkout@v4
- with:
- submodules: recursive
- - name: set up JDK 17
- uses: actions/setup-java@v4.2.1
+ uses: actions/checkout@v3
+ - name: set up JDK 11
+ uses: actions/setup-java@v3.6.0
with:
distribution: 'zulu'
- java-version: '17'
+ java-version: '11'
- name: Restore Cache
- uses: actions/cache@v4.0.2
+ uses: actions/cache@v3.0.11
with:
path: |
~/.gradle/caches
@@ -27,13 +29,17 @@ jobs:
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*') }}
restore-keys: |
${{ runner.os }}-gradle-
+ - name: Checkout submodules # checkout rest
+ shell: bash
+ run: |
+ git submodule update --init
- name: Validate Gradle Wrapper
- uses: gradle/wrapper-validation-action@v2
+ uses: gradle/wrapper-validation-action@v1
- name: Build with Gradle
run: |
./gradlew :app:assembleDebug
- name: Upload APK
- uses: actions/upload-artifact@v4
+ uses: actions/upload-artifact@v3
with:
name: Etar_apk
path: app/build/outputs/apk/debug/app-debug.apk
diff --git a/README.md b/README.md
index f1d0aae52a..b06cceaf43 100644
--- a/README.md
+++ b/README.md
@@ -18,10 +18,11 @@ this app would be just a dream. So thanks to them!
## Features
- Month view.
- Week, day & agenda view.
+- view task on day, week, month and agenda view
- Uses Android calendar sync. Works with Google Calendar, Exchange, etc.
- Material designed.
- Support offline calendar.
-- Agenda widget.
+- Agenda and task widget.
- Multilingual UI.
## How to use Etar
@@ -36,6 +37,8 @@ Sync your calendar to a server:
need yet another app, e. g. DAVx5. That’s necessary because a Caldav client
isn't included in Etar.
+ The following [link](https://ownyourbits.com/2017/12/30/sync-nextcloud-tasks-calendars-and-contacts-on-your-android-device/) provides a tutorial how to use Nextcloud + DAVx5 + Etar.
+
### Technical explanation
On Android there are "Calendar providers". These can be calendars that are
synchronized with a cloud service or local calendars. Basically any app
diff --git a/app/build.gradle b/app/build.gradle
index 8a5d0353cc..805094ccba 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -10,15 +10,13 @@ editorconfig {
}
android {
- namespace 'ws.xsoh.etar'
- testNamespace 'com.android.calendar.tests'
- compileSdk 34
+ compileSdk 33
defaultConfig {
minSdk 21
- targetSdk 34
- versionCode 43
- versionName "1.0.43"
+ targetSdk 33
+ versionCode 34
+ versionName "1.0.34"
applicationId "ws.xsoh.etar"
testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner'
}
@@ -75,52 +73,42 @@ android {
}
lint {
- lintConfig = file("lint.xml")
- // TODO: Resolve lint errors due to 363aa9c237a33e9e1a40bdfd9039dcaaa855a5a0
+ checkReleaseBuilds false
+ // Or, if you prefer, you can continue to check for errors in release builds,
+ // but continue the build even when errors are found:
abortOnError false
}
compileOptions {
coreLibraryDesugaringEnabled true
- sourceCompatibility JavaVersion.VERSION_17
- targetCompatibility JavaVersion.VERSION_17
+ sourceCompatibility JavaVersion.VERSION_11
+ targetCompatibility JavaVersion.VERSION_11
}
kotlinOptions {
- jvmTarget = "17"
+ jvmTarget = "11"
}
-
- useLibrary 'android.test.base'
- useLibrary 'android.test.mock'
-
- androidResources {
- generateLocaleConfig true
- }
-
}
dependencies {
// Core
- implementation 'androidx.core:core-ktx:1.12.0'
+ implementation 'androidx.core:core-ktx:1.8.0'
implementation fileTree(include: ['*.jar', '*.aar'], dir: 'libs')
- implementation 'androidx.preference:preference:1.2.1'
- implementation 'androidx.appcompat:appcompat:1.6.1'
- implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
- implementation 'com.google.android.material:material:1.11.0'
+ implementation 'androidx.preference:preference:1.1.1'
+ implementation 'androidx.appcompat:appcompat:1.4.1'
+ implementation 'androidx.constraintlayout:constraintlayout:2.1.3'
+ implementation 'com.google.android.material:material:1.5.0'
testImplementation 'junit:junit:4.13.2'
- coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.4'
+ coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.8'
// Coroutines
- def coroutines_version = "1.8.0"
+ def coroutines_version = "1.6.0"
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:$coroutines_version"
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$coroutines_version"
- // https://mvnrepository.com/artifact/org.dmfs/lib-recur
- implementation 'org.dmfs:lib-recur:0.16.0'
-
}
preBuild.dependsOn (":aarGen")
diff --git a/app/lint.xml b/app/lint.xml
deleted file mode 100644
index db997a5369..0000000000
--- a/app/lint.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-
-
-
-
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 3b1b75d19d..f1eaa681b5 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -30,16 +30,19 @@
-
-
-
+
+
+
+
-
-
-
+
+
+
+
+
@@ -52,6 +55,8 @@
+
+
@@ -268,9 +272,7 @@
-
+
diff --git a/app/src/main/assets/backward b/app/src/main/assets/backward
index 421f2ec6b9..7685c7429c 100644
--- a/app/src/main/assets/backward
+++ b/app/src/main/assets/backward
@@ -4,33 +4,54 @@
# 2009-05-17 by Arthur David Olson.
# This file provides links from old or merged timezone names to current ones.
-# Many names changed in 1993 and in 1995, and many merged names moved here
-# in the period from 2013 through 2022. Several of these names are
+# Many names changed in late 1993. Several of these names are
# also present in the file 'backzone', which has data important only
# for pre-1970 timestamps and so is out of scope for tzdb proper.
-# Although this file is optional and tzdb will work if you omit it by
-# building with 'make BACKWARD=', in practice downstream users
-# typically use this file for backward compatibility.
-
-# This file is divided into sections, one for each major reason for a
-# backward compatibility link. Each section is sorted by link name.
-
-# A "#= TARGET1" comment labels each link inserted only because some
-# .zi parsers (including tzcode through 2022e) mishandle links to links.
-# The comment says what the target would be if these parsers were fixed
-# so that data could contain links to links. For example, the line
-# "Link Australia/Sydney Australia/ACT #= Australia/Canberra" would be
-# "Link Australia/Canberra Australia/ACT" were it not that data lines
-# refrain from linking to links like Australia/Canberra, which means
-# the Australia/ACT line links instead to Australia/Sydney,
-# Australia/Canberra's target.
-
-
-# Pre-1993 naming conventions
-
-# Link TARGET LINK-NAME #= TARGET1
-Link Australia/Sydney Australia/ACT #= Australia/Canberra
+# Link TARGET LINK-NAME
+Link Africa/Nairobi Africa/Asmera
+Link Africa/Abidjan Africa/Timbuktu
+Link America/Argentina/Catamarca America/Argentina/ComodRivadavia
+Link America/Adak America/Atka
+Link America/Argentina/Buenos_Aires America/Buenos_Aires
+Link America/Argentina/Catamarca America/Catamarca
+Link America/Panama America/Coral_Harbour
+Link America/Argentina/Cordoba America/Cordoba
+Link America/Tijuana America/Ensenada
+Link America/Indiana/Indianapolis America/Fort_Wayne
+Link America/Nuuk America/Godthab
+Link America/Indiana/Indianapolis America/Indianapolis
+Link America/Argentina/Jujuy America/Jujuy
+Link America/Indiana/Knox America/Knox_IN
+Link America/Kentucky/Louisville America/Louisville
+Link America/Argentina/Mendoza America/Mendoza
+Link America/Toronto America/Montreal
+Link America/Rio_Branco America/Porto_Acre
+Link America/Argentina/Cordoba America/Rosario
+Link America/Tijuana America/Santa_Isabel
+Link America/Denver America/Shiprock
+Link America/Puerto_Rico America/Virgin
+Link Pacific/Auckland Antarctica/South_Pole
+Link Asia/Ashgabat Asia/Ashkhabad
+Link Asia/Kolkata Asia/Calcutta
+Link Asia/Shanghai Asia/Chongqing
+Link Asia/Shanghai Asia/Chungking
+Link Asia/Dhaka Asia/Dacca
+Link Asia/Shanghai Asia/Harbin
+Link Asia/Urumqi Asia/Kashgar
+Link Asia/Kathmandu Asia/Katmandu
+Link Asia/Macau Asia/Macao
+Link Asia/Yangon Asia/Rangoon
+Link Asia/Ho_Chi_Minh Asia/Saigon
+Link Asia/Jerusalem Asia/Tel_Aviv
+Link Asia/Thimphu Asia/Thimbu
+Link Asia/Makassar Asia/Ujung_Pandang
+Link Asia/Ulaanbaatar Asia/Ulan_Bator
+Link Atlantic/Faroe Atlantic/Faeroe
+Link Europe/Oslo Atlantic/Jan_Mayen
+Link Australia/Sydney Australia/ACT
+Link Australia/Sydney Australia/Canberra
+Link Australia/Hobart Australia/Currie
Link Australia/Lord_Howe Australia/LHI
Link Australia/Sydney Australia/NSW
Link Australia/Darwin Australia/North
@@ -40,7 +61,7 @@ Link Australia/Hobart Australia/Tasmania
Link Australia/Melbourne Australia/Victoria
Link Australia/Perth Australia/West
Link Australia/Broken_Hill Australia/Yancowinna
-Link America/Rio_Branco Brazil/Acre #= America/Porto_Acre
+Link America/Rio_Branco Brazil/Acre
Link America/Noronha Brazil/DeNoronha
Link America/Sao_Paulo Brazil/East
Link America/Manaus Brazil/West
@@ -60,36 +81,17 @@ Link Pacific/Easter Chile/EasterIsland
Link America/Havana Cuba
Link Africa/Cairo Egypt
Link Europe/Dublin Eire
-# Vanguard section, for most .zi parsers.
-#Link GMT Etc/GMT
-#Link GMT Etc/GMT+0
-#Link GMT Etc/GMT-0
-#Link GMT Etc/GMT0
-#Link GMT Etc/Greenwich
-# Rearguard section, for TZUpdater 2.3.2 and earlier.
-Link Etc/GMT Etc/GMT+0
-Link Etc/GMT Etc/GMT-0
-Link Etc/GMT Etc/GMT0
-Link Etc/GMT Etc/Greenwich
-# End of rearguard section.
Link Etc/UTC Etc/UCT
-Link Etc/UTC Etc/Universal
-Link Etc/UTC Etc/Zulu
+Link Europe/London Europe/Belfast
+Link Europe/Chisinau Europe/Tiraspol
Link Europe/London GB
Link Europe/London GB-Eire
-# Vanguard section, for most .zi parsers.
-#Link GMT GMT+0
-#Link GMT GMT-0
-#Link GMT GMT0
-#Link GMT Greenwich
-# Rearguard section, for TZUpdater 2.3.2 and earlier.
Link Etc/GMT GMT+0
Link Etc/GMT GMT-0
Link Etc/GMT GMT0
Link Etc/GMT Greenwich
-# End of rearguard section.
Link Asia/Hong_Kong Hongkong
-Link Africa/Abidjan Iceland #= Atlantic/Reykjavik
+Link Atlantic/Reykjavik Iceland
Link Asia/Tehran Iran
Link Asia/Jerusalem Israel
Link America/Jamaica Jamaica
@@ -101,8 +103,14 @@ Link America/Mazatlan Mexico/BajaSur
Link America/Mexico_City Mexico/General
Link Pacific/Auckland NZ
Link Pacific/Chatham NZ-CHAT
-Link America/Denver Navajo #= America/Shiprock
+Link America/Denver Navajo
Link Asia/Shanghai PRC
+Link Pacific/Kanton Pacific/Enderbury
+Link Pacific/Honolulu Pacific/Johnston
+Link Pacific/Pohnpei Pacific/Ponape
+Link Pacific/Pago_Pago Pacific/Samoa
+Link Pacific/Chuuk Pacific/Truk
+Link Pacific/Chuuk Pacific/Yap
Link Europe/Warsaw Poland
Link Europe/Lisbon Portugal
Link Asia/Taipei ROC
@@ -126,194 +134,3 @@ Link Etc/UTC UTC
Link Etc/UTC Universal
Link Europe/Moscow W-SU
Link Etc/UTC Zulu
-
-
-# Two-part names that were renamed mostly to three-part names in 1995
-
-# Link TARGET LINK-NAME #= TARGET1
-Link America/Argentina/Buenos_Aires America/Buenos_Aires
-Link America/Argentina/Catamarca America/Catamarca
-Link America/Argentina/Cordoba America/Cordoba
-Link America/Indiana/Indianapolis America/Indianapolis
-Link America/Argentina/Jujuy America/Jujuy
-Link America/Indiana/Knox America/Knox_IN
-Link America/Kentucky/Louisville America/Louisville
-Link America/Argentina/Mendoza America/Mendoza
-Link America/Puerto_Rico America/Virgin #= America/St_Thomas
-Link Pacific/Pago_Pago Pacific/Samoa
-
-
-# Pre-2013 practice, which typically had a Zone per zone.tab line
-
-# Link TARGET LINK-NAME
-Link Africa/Abidjan Africa/Accra
-Link Africa/Nairobi Africa/Addis_Ababa
-Link Africa/Nairobi Africa/Asmara
-Link Africa/Abidjan Africa/Bamako
-Link Africa/Lagos Africa/Bangui
-Link Africa/Abidjan Africa/Banjul
-Link Africa/Maputo Africa/Blantyre
-Link Africa/Lagos Africa/Brazzaville
-Link Africa/Maputo Africa/Bujumbura
-Link Africa/Abidjan Africa/Conakry
-Link Africa/Abidjan Africa/Dakar
-Link Africa/Nairobi Africa/Dar_es_Salaam
-Link Africa/Nairobi Africa/Djibouti
-Link Africa/Lagos Africa/Douala
-Link Africa/Abidjan Africa/Freetown
-Link Africa/Maputo Africa/Gaborone
-Link Africa/Maputo Africa/Harare
-Link Africa/Nairobi Africa/Kampala
-Link Africa/Maputo Africa/Kigali
-Link Africa/Lagos Africa/Kinshasa
-Link Africa/Lagos Africa/Libreville
-Link Africa/Abidjan Africa/Lome
-Link Africa/Lagos Africa/Luanda
-Link Africa/Maputo Africa/Lubumbashi
-Link Africa/Maputo Africa/Lusaka
-Link Africa/Lagos Africa/Malabo
-Link Africa/Johannesburg Africa/Maseru
-Link Africa/Johannesburg Africa/Mbabane
-Link Africa/Nairobi Africa/Mogadishu
-Link Africa/Lagos Africa/Niamey
-Link Africa/Abidjan Africa/Nouakchott
-Link Africa/Abidjan Africa/Ouagadougou
-Link Africa/Lagos Africa/Porto-Novo
-Link America/Puerto_Rico America/Anguilla
-Link America/Puerto_Rico America/Antigua
-Link America/Puerto_Rico America/Aruba
-Link America/Panama America/Atikokan
-Link America/Puerto_Rico America/Blanc-Sablon
-Link America/Panama America/Cayman
-Link America/Phoenix America/Creston
-Link America/Puerto_Rico America/Curacao
-Link America/Puerto_Rico America/Dominica
-Link America/Puerto_Rico America/Grenada
-Link America/Puerto_Rico America/Guadeloupe
-Link America/Puerto_Rico America/Kralendijk
-Link America/Puerto_Rico America/Lower_Princes
-Link America/Puerto_Rico America/Marigot
-Link America/Puerto_Rico America/Montserrat
-Link America/Toronto America/Nassau
-Link America/Puerto_Rico America/Port_of_Spain
-Link America/Puerto_Rico America/St_Barthelemy
-Link America/Puerto_Rico America/St_Kitts
-Link America/Puerto_Rico America/St_Lucia
-Link America/Puerto_Rico America/St_Thomas
-Link America/Puerto_Rico America/St_Vincent
-Link America/Puerto_Rico America/Tortola
-Link Pacific/Port_Moresby Antarctica/DumontDUrville
-Link Pacific/Auckland Antarctica/McMurdo
-Link Asia/Riyadh Antarctica/Syowa
-Link Asia/Urumqi Antarctica/Vostok
-Link Europe/Berlin Arctic/Longyearbyen
-Link Asia/Riyadh Asia/Aden
-Link Asia/Qatar Asia/Bahrain
-Link Asia/Kuching Asia/Brunei
-Link Asia/Singapore Asia/Kuala_Lumpur
-Link Asia/Riyadh Asia/Kuwait
-Link Asia/Dubai Asia/Muscat
-Link Asia/Bangkok Asia/Phnom_Penh
-Link Asia/Bangkok Asia/Vientiane
-Link Africa/Abidjan Atlantic/Reykjavik
-Link Africa/Abidjan Atlantic/St_Helena
-Link Europe/Brussels Europe/Amsterdam
-Link Europe/Prague Europe/Bratislava
-Link Europe/Zurich Europe/Busingen
-Link Europe/Berlin Europe/Copenhagen
-Link Europe/London Europe/Guernsey
-Link Europe/London Europe/Isle_of_Man
-Link Europe/London Europe/Jersey
-Link Europe/Belgrade Europe/Ljubljana
-Link Europe/Brussels Europe/Luxembourg
-Link Europe/Helsinki Europe/Mariehamn
-Link Europe/Paris Europe/Monaco
-Link Europe/Berlin Europe/Oslo
-Link Europe/Belgrade Europe/Podgorica
-Link Europe/Rome Europe/San_Marino
-Link Europe/Belgrade Europe/Sarajevo
-Link Europe/Belgrade Europe/Skopje
-Link Europe/Berlin Europe/Stockholm
-Link Europe/Zurich Europe/Vaduz
-Link Europe/Rome Europe/Vatican
-Link Europe/Belgrade Europe/Zagreb
-Link Africa/Nairobi Indian/Antananarivo
-Link Asia/Bangkok Indian/Christmas
-Link Asia/Yangon Indian/Cocos
-Link Africa/Nairobi Indian/Comoro
-Link Indian/Maldives Indian/Kerguelen
-Link Asia/Dubai Indian/Mahe
-Link Africa/Nairobi Indian/Mayotte
-Link Asia/Dubai Indian/Reunion
-Link Pacific/Port_Moresby Pacific/Chuuk
-Link Pacific/Tarawa Pacific/Funafuti
-Link Pacific/Tarawa Pacific/Majuro
-Link Pacific/Pago_Pago Pacific/Midway
-Link Pacific/Guadalcanal Pacific/Pohnpei
-Link Pacific/Guam Pacific/Saipan
-Link Pacific/Tarawa Pacific/Wake
-Link Pacific/Tarawa Pacific/Wallis
-
-
-# Non-zone.tab locations with timestamps since 1970 that duplicate
-# those of an existing location
-
-# Link TARGET LINK-NAME
-Link Africa/Abidjan Africa/Timbuktu
-Link America/Argentina/Catamarca America/Argentina/ComodRivadavia
-Link America/Adak America/Atka
-Link America/Panama America/Coral_Harbour
-Link America/Tijuana America/Ensenada
-Link America/Indiana/Indianapolis America/Fort_Wayne
-Link America/Toronto America/Montreal
-Link America/Toronto America/Nipigon
-Link America/Iqaluit America/Pangnirtung
-Link America/Rio_Branco America/Porto_Acre
-Link America/Winnipeg America/Rainy_River
-Link America/Argentina/Cordoba America/Rosario
-Link America/Tijuana America/Santa_Isabel
-Link America/Denver America/Shiprock
-Link America/Toronto America/Thunder_Bay
-Link America/Edmonton America/Yellowknife
-Link Pacific/Auckland Antarctica/South_Pole
-Link Asia/Shanghai Asia/Chongqing
-Link Asia/Shanghai Asia/Harbin
-Link Asia/Urumqi Asia/Kashgar
-Link Asia/Jerusalem Asia/Tel_Aviv
-Link Europe/Berlin Atlantic/Jan_Mayen
-Link Australia/Sydney Australia/Canberra
-Link Australia/Hobart Australia/Currie
-Link Europe/London Europe/Belfast
-Link Europe/Chisinau Europe/Tiraspol
-Link Europe/Kyiv Europe/Uzhgorod
-Link Europe/Kyiv Europe/Zaporozhye
-Link Pacific/Kanton Pacific/Enderbury
-Link Pacific/Honolulu Pacific/Johnston
-Link Pacific/Port_Moresby Pacific/Yap
-
-
-# Alternate names for the same location
-
-# Link TARGET LINK-NAME #= TARGET1
-Link Africa/Nairobi Africa/Asmera #= Africa/Asmara
-Link America/Nuuk America/Godthab
-Link Asia/Ashgabat Asia/Ashkhabad
-Link Asia/Kolkata Asia/Calcutta
-Link Asia/Shanghai Asia/Chungking #= Asia/Chongqing
-Link Asia/Dhaka Asia/Dacca
-# Istanbul is in both continents.
-Link Europe/Istanbul Asia/Istanbul
-Link Asia/Kathmandu Asia/Katmandu
-Link Asia/Macau Asia/Macao
-Link Asia/Yangon Asia/Rangoon
-Link Asia/Ho_Chi_Minh Asia/Saigon
-Link Asia/Thimphu Asia/Thimbu
-Link Asia/Makassar Asia/Ujung_Pandang
-Link Asia/Ulaanbaatar Asia/Ulan_Bator
-Link Atlantic/Faroe Atlantic/Faeroe
-Link Europe/Kyiv Europe/Kiev
-# Classically, Cyprus is in Asia; e.g. see Herodotus, Histories, I.72.
-# However, for various reasons many users expect to find it under Europe.
-Link Asia/Nicosia Europe/Nicosia
-Link Pacific/Guadalcanal Pacific/Ponape #= Pacific/Pohnpei
-Link Pacific/Port_Moresby Pacific/Truk #= Pacific/Chuuk
diff --git a/app/src/main/assets/zone.tab b/app/src/main/assets/zone.tab
index dbcb61793e..086458fb20 100644
--- a/app/src/main/assets/zone.tab
+++ b/app/src/main/assets/zone.tab
@@ -114,18 +114,23 @@ CA +4606-06447 America/Moncton Atlantic - New Brunswick
CA +5320-06025 America/Goose_Bay Atlantic - Labrador (most areas)
CA +5125-05707 America/Blanc-Sablon AST - QC (Lower North Shore)
CA +4339-07923 America/Toronto Eastern - ON, QC (most areas)
-CA +6344-06828 America/Iqaluit Eastern - NU (most areas)
+CA +4901-08816 America/Nipigon Eastern - ON, QC (no DST 1967-73)
+CA +4823-08915 America/Thunder_Bay Eastern - ON (Thunder Bay)
+CA +6344-06828 America/Iqaluit Eastern - NU (most east areas)
+CA +6608-06544 America/Pangnirtung Eastern - NU (Pangnirtung)
CA +484531-0913718 America/Atikokan EST - ON (Atikokan); NU (Coral H)
CA +4953-09709 America/Winnipeg Central - ON (west); Manitoba
+CA +4843-09434 America/Rainy_River Central - ON (Rainy R, Ft Frances)
CA +744144-0944945 America/Resolute Central - NU (Resolute)
CA +624900-0920459 America/Rankin_Inlet Central - NU (central)
CA +5024-10439 America/Regina CST - SK (most areas)
CA +5017-10750 America/Swift_Current CST - SK (midwest)
-CA +5333-11328 America/Edmonton Mountain - AB; BC (E); NT (E); SK (W)
+CA +5333-11328 America/Edmonton Mountain - AB; BC (E); SK (W)
CA +690650-1050310 America/Cambridge_Bay Mountain - NU (west)
+CA +6227-11421 America/Yellowknife Mountain - NT (central)
CA +682059-1334300 America/Inuvik Mountain - NT (west)
CA +4906-11631 America/Creston MST - BC (Creston)
-CA +5546-12014 America/Dawson_Creek MST - BC (Dawson Cr, Ft St John)
+CA +5946-12014 America/Dawson_Creek MST - BC (Dawson Cr, Ft St John)
CA +5848-12242 America/Fort_Nelson MST - BC (Ft Nelson)
CA +6043-13503 America/Whitehorse MST - Yukon (east)
CA +6404-13925 America/Dawson MST - Yukon (west)
@@ -138,7 +143,7 @@ CG -0416+01517 Africa/Brazzaville
CH +4723+00832 Europe/Zurich
CI +0519-00402 Africa/Abidjan
CK -2114-15946 Pacific/Rarotonga
-CL -3327-07040 America/Santiago most of Chile
+CL -3327-07040 America/Santiago Chile (most areas)
CL -5309-07055 America/Punta_Arenas Region of Magallanes
CL -2709-10926 Pacific/Easter Easter Island
CM +0403+00942 Africa/Douala
@@ -150,10 +155,10 @@ CU +2308-08222 America/Havana
CV +1455-02331 Atlantic/Cape_Verde
CW +1211-06900 America/Curacao
CX -1025+10543 Indian/Christmas
-CY +3510+03322 Asia/Nicosia most of Cyprus
+CY +3510+03322 Asia/Nicosia Cyprus (most areas)
CY +3507+03357 Asia/Famagusta Northern Cyprus
CZ +5005+01426 Europe/Prague
-DE +5230+01322 Europe/Berlin most of Germany
+DE +5230+01322 Europe/Berlin Germany (most areas)
DE +4742+00841 Europe/Busingen Busingen
DJ +1136+04309 Africa/Djibouti
DK +5540+01235 Europe/Copenhagen
@@ -186,7 +191,7 @@ GF +0456-05220 America/Cayenne
GG +492717-0023210 Europe/Guernsey
GH +0533-00013 Africa/Accra
GI +3608-00521 Europe/Gibraltar
-GL +6411-05144 America/Nuuk most of Greenland
+GL +6411-05144 America/Nuuk Greenland (most areas)
GL +7646-01840 America/Danmarkshavn National Park (east coast)
GL +7029-02158 America/Scoresbysund Scoresbysund/Ittoqqortoormiit
GL +7634-06847 America/Thule Thule/Pituffik
@@ -234,7 +239,7 @@ KP +3901+12545 Asia/Pyongyang
KR +3733+12658 Asia/Seoul
KW +2920+04759 Asia/Kuwait
KY +1918-08123 America/Cayman
-KZ +4315+07657 Asia/Almaty most of Kazakhstan
+KZ +4315+07657 Asia/Almaty Kazakhstan (most areas)
KZ +4448+06528 Asia/Qyzylorda Qyzylorda/Kyzylorda/Kzyl-Orda
KZ +5312+06337 Asia/Qostanay Qostanay/Kostanay/Kustanay
KZ +5017+05710 Asia/Aqtobe Aqtobe/Aktobe
@@ -258,12 +263,12 @@ MD +4700+02850 Europe/Chisinau
ME +4226+01916 Europe/Podgorica
MF +1804-06305 America/Marigot
MG -1855+04731 Indian/Antananarivo
-MH +0709+17112 Pacific/Majuro most of Marshall Islands
+MH +0709+17112 Pacific/Majuro Marshall Islands (most areas)
MH +0905+16720 Pacific/Kwajalein Kwajalein
MK +4159+02126 Europe/Skopje
ML +1239-00800 Africa/Bamako
MM +1647+09610 Asia/Yangon
-MN +4755+10653 Asia/Ulaanbaatar most of Mongolia
+MN +4755+10653 Asia/Ulaanbaatar Mongolia (most areas)
MN +4801+09139 Asia/Hovd Bayan-Olgiy, Govi-Altai, Hovd, Uvs, Zavkhan
MN +4804+11430 Asia/Choibalsan Dornod, Sukhbaatar
MO +221150+1133230 Asia/Macau
@@ -275,18 +280,17 @@ MT +3554+01431 Europe/Malta
MU -2010+05730 Indian/Mauritius
MV +0410+07330 Indian/Maldives
MW -1547+03500 Africa/Blantyre
-MX +1924-09909 America/Mexico_City Central Mexico
-MX +2105-08646 America/Cancun Quintana Roo
-MX +2058-08937 America/Merida Campeche, Yucatan
-MX +2540-10019 America/Monterrey Durango; Coahuila, Nuevo Leon, Tamaulipas (most areas)
-MX +2550-09730 America/Matamoros Coahuila, Nuevo Leon, Tamaulipas (US border)
-MX +2838-10605 America/Chihuahua Chihuahua (most areas)
-MX +3144-10629 America/Ciudad_Juarez Chihuahua (US border - west)
-MX +2934-10425 America/Ojinaga Chihuahua (US border - east)
-MX +2313-10625 America/Mazatlan Baja California Sur, Nayarit (most areas), Sinaloa
-MX +2048-10515 America/Bahia_Banderas Bahia de Banderas
-MX +2904-11058 America/Hermosillo Sonora
-MX +3232-11701 America/Tijuana Baja California
+MX +1924-09909 America/Mexico_City Central Time
+MX +2105-08646 America/Cancun Eastern Standard Time - Quintana Roo
+MX +2058-08937 America/Merida Central Time - Campeche, Yucatan
+MX +2540-10019 America/Monterrey Central Time - Durango; Coahuila, Nuevo Leon, Tamaulipas (most areas)
+MX +2550-09730 America/Matamoros Central Time US - Coahuila, Nuevo Leon, Tamaulipas (US border)
+MX +2313-10625 America/Mazatlan Mountain Time - Baja California Sur, Nayarit, Sinaloa
+MX +2838-10605 America/Chihuahua Mountain Time - Chihuahua (most areas)
+MX +2934-10425 America/Ojinaga Mountain Time US - Chihuahua (US border)
+MX +2904-11058 America/Hermosillo Mountain Standard Time - Sonora
+MX +3232-11701 America/Tijuana Pacific Time US - Baja California
+MX +2048-10515 America/Bahia_Banderas Central Time - Bahia de Banderas
MY +0310+10142 Asia/Kuala_Lumpur Malaysia (peninsula)
MY +0133+11020 Asia/Kuching Sabah, Sarawak
MZ -2558+03235 Africa/Maputo
@@ -301,7 +305,7 @@ NO +5955+01045 Europe/Oslo
NP +2743+08519 Asia/Kathmandu
NR -0031+16655 Pacific/Nauru
NU -1901-16955 Pacific/Niue
-NZ -3652+17446 Pacific/Auckland most of New Zealand
+NZ -3652+17446 Pacific/Auckland New Zealand (most areas)
NZ -4357-17633 Pacific/Chatham Chatham Islands
OM +2336+05835 Asia/Muscat
PA +0858-07932 America/Panama
@@ -309,7 +313,7 @@ PE -1203-07703 America/Lima
PF -1732-14934 Pacific/Tahiti Society Islands
PF -0900-13930 Pacific/Marquesas Marquesas Islands
PF -2308-13457 Pacific/Gambier Gambier Islands
-PG -0930+14710 Pacific/Port_Moresby most of Papua New Guinea
+PG -0930+14710 Pacific/Port_Moresby Papua New Guinea (most areas)
PG -0613+15534 Pacific/Bougainville Bougainville
PH +1435+12100 Asia/Manila
PK +2452+06703 Asia/Karachi
@@ -355,7 +359,7 @@ RU +4310+13156 Asia/Vladivostok MSK+07 - Amur River
RU +643337+1431336 Asia/Ust-Nera MSK+07 - Oymyakonsky
RU +5934+15048 Asia/Magadan MSK+08 - Magadan
RU +4658+14242 Asia/Sakhalin MSK+08 - Sakhalin Island
-RU +6728+15343 Asia/Srednekolymsk MSK+08 - Sakha (E); N Kuril Is
+RU +6728+15343 Asia/Srednekolymsk MSK+08 - Sakha (E); North Kuril Is
RU +5301+15839 Asia/Kamchatka MSK+09 - Kamchatka
RU +6445+17729 Asia/Anadyr MSK+09 - Bering Sea
RW -0157+03004 Africa/Kigali
@@ -396,7 +400,9 @@ TT +1039-06131 America/Port_of_Spain
TV -0831+17913 Pacific/Funafuti
TW +2503+12130 Asia/Taipei
TZ -0648+03917 Africa/Dar_es_Salaam
-UA +5026+03031 Europe/Kyiv most of Ukraine
+UA +5026+03031 Europe/Kiev Ukraine (most areas)
+UA +4837+02218 Europe/Uzhgorod Transcarpathia
+UA +4750+03510 Europe/Zaporozhye Zaporozhye and east Lugansk
UG +0019+03225 Africa/Kampala
UM +2813-17722 Pacific/Midway Midway Islands
UM +1917+16637 Pacific/Wake Wake Island
@@ -419,7 +425,7 @@ US +465042-1012439 America/North_Dakota/New_Salem Central - ND (Morton rural)
US +471551-1014640 America/North_Dakota/Beulah Central - ND (Mercer)
US +394421-1045903 America/Denver Mountain (most areas)
US +433649-1161209 America/Boise Mountain - ID (south); OR (east)
-US +332654-1120424 America/Phoenix MST - AZ (except Navajo)
+US +332654-1120424 America/Phoenix MST - Arizona (except Navajo)
US +340308-1181434 America/Los_Angeles Pacific
US +611305-1495401 America/Anchorage Alaska (most areas)
US +581807-1342511 America/Juneau Alaska - Juneau area
@@ -427,7 +433,7 @@ US +571035-1351807 America/Sitka Alaska - Sitka area
US +550737-1313435 America/Metlakatla Alaska - Annette Island
US +593249-1394338 America/Yakutat Alaska - Yakutat
US +643004-1652423 America/Nome Alaska (west)
-US +515248-1763929 America/Adak Alaska - western Aleutians
+US +515248-1763929 America/Adak Aleutian Islands
US +211825-1575130 Pacific/Honolulu Hawaii
UY -345433-0561245 America/Montevideo
UZ +3940+06648 Asia/Samarkand Uzbekistan (west)
diff --git a/app/src/main/java/com/android/calendar/AllInOneActivity.java b/app/src/main/java/com/android/calendar/AllInOneActivity.java
index 80a2e87bdf..bd527f063a 100644
--- a/app/src/main/java/com/android/calendar/AllInOneActivity.java
+++ b/app/src/main/java/com/android/calendar/AllInOneActivity.java
@@ -27,6 +27,9 @@
import android.animation.Animator.AnimatorListener;
import android.animation.ObjectAnimator;
import android.app.DatePickerDialog;
+import android.app.Fragment;
+import android.app.FragmentManager;
+import android.app.FragmentTransaction;
import android.content.AsyncQueryHandler;
import android.content.BroadcastReceiver;
import android.content.ContentResolver;
@@ -72,9 +75,6 @@
import androidx.core.content.ContextCompat;
import androidx.core.view.GravityCompat;
import androidx.drawerlayout.widget.DrawerLayout;
-import androidx.fragment.app.Fragment;
-import androidx.fragment.app.FragmentManager;
-import androidx.fragment.app.FragmentTransaction;
import com.android.calendar.CalendarController.EventHandler;
import com.android.calendar.CalendarController.EventInfo;
@@ -83,6 +83,7 @@
import com.android.calendar.agenda.AgendaFragment;
import com.android.calendar.alerts.AlertService;
import com.android.calendar.month.MonthByWeekFragment;
+import com.android.calendar.persistence.tasks.DmfsOpenTasksContract;
import com.android.calendar.selectcalendars.SelectVisibleCalendarsFragment;
import com.android.calendar.settings.GeneralPreferences;
import com.android.calendar.settings.SettingsActivity;
@@ -208,6 +209,8 @@ public void onAnimationStart(android.animation.Animator animation) {
private MenuItem mSearchMenu;
private MenuItem mControlsMenu;
private MenuItem mViewSettings;
+ private MenuItem mViewAgendaEvents;
+ private MenuItem mViewAgendaTasks;
private Menu mOptionsMenu;
private QueryHandler mHandler;
private final Runnable mHomeTimeUpdater = new Runnable() {
@@ -241,7 +244,7 @@ public void run() {
protected void onNewIntent(Intent intent) {
String action = intent.getAction();
if (DEBUG)
- Log.d(TAG, "New intent received " + intent);
+ Log.d(TAG, "New intent received " + intent.toString());
// Don't change the date if we're just returning to the app's home
if (Intent.ACTION_VIEW.equals(action)
&& !intent.getBooleanExtra(Utils.INTENT_KEY_HOME, false)) {
@@ -267,12 +270,12 @@ protected void onCreate(Bundle icicle) {
// This needs to be created before setContentView
mController = CalendarController.getInstance(this);
+ // Create notification channel
+ AlertService.createChannels(this);
+
// Check and ask for most needed permissions
checkAppPermissions();
- // Create notification channels
- AlertService.createChannels(this);
-
// Get time from intent or icicle
long timeMillis = -1;
int viewType = -1;
@@ -301,7 +304,7 @@ protected void onCreate(Bundle icicle) {
if (DEBUG) {
if (icicle != null && intent != null) {
- Log.d(TAG, "both, icicle:" + icicle + " intent:" + intent);
+ Log.d(TAG, "both, icicle:" + icicle.toString() + " intent:" + intent.toString());
} else {
Log.d(TAG, "not both, icicle:" + icicle + " intent:" + intent);
}
@@ -398,13 +401,19 @@ private void checkAppPermissions() {
!= PackageManager.PERMISSION_GRANTED ||
ContextCompat.checkSelfPermission(this,
Manifest.permission.WRITE_EXTERNAL_STORAGE)
- != PackageManager.PERMISSION_GRANTED)) {
+ != PackageManager.PERMISSION_GRANTED) ||
+ ContextCompat.checkSelfPermission(this, DmfsOpenTasksContract.TASK_READ_PERMISSION)
+ != PackageManager.PERMISSION_GRANTED ||
+ ContextCompat.checkSelfPermission(this, DmfsOpenTasksContract.TASK_WRITE_PERMISSION)
+ != PackageManager.PERMISSION_GRANTED) {
ArrayList permissionsList = new ArrayList<>(Arrays.asList(
Manifest.permission.WRITE_CALENDAR,
Manifest.permission.READ_CALENDAR,
- Manifest.permission.WRITE_EXTERNAL_STORAGE)
- );
+ Manifest.permission.WRITE_EXTERNAL_STORAGE,
+ DmfsOpenTasksContract.TASK_READ_PERMISSION,
+ DmfsOpenTasksContract.TASK_WRITE_PERMISSION
+ ));
// Permission for calendar notifications
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU &&
@@ -420,13 +429,10 @@ private void checkAppPermissions() {
permissionsList.toArray(permissionsArray),
PERMISSIONS_REQUEST_WRITE_CALENDAR);
}
-
}
private void checkAndRequestDisablingDoze() {
- if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) return;
- boolean doNotCheckBatteryOptimization = Utils.getSharedPreference(getApplicationContext(), GeneralPreferences.KEY_DO_NOT_CHECK_BATTERY_OPTIMIZATION, false);
- if (!dozeDisabled() && !doNotCheckBatteryOptimization) {
+ if (!dozeDisabled()) {
Intent intent = new Intent();
intent.setAction(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);
intent.setData(Uri.parse("package:" + getApplicationContext().getPackageName()));
@@ -435,8 +441,6 @@ private void checkAndRequestDisablingDoze() {
}
private Boolean dozeDisabled() {
- if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) return true;
-
String packageName = getApplicationContext().getPackageName();
PowerManager pm = (PowerManager) getApplicationContext().getSystemService(Context.POWER_SERVICE);
return pm.isIgnoringBatteryOptimizations(packageName);
@@ -600,14 +604,6 @@ protected void onResume() {
mController.registerFirstEventHandler(HANDLER_KEY, this);
mOnSaveInstanceStateCalled = false;
- if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.S) {
- if (!Utils.canScheduleAlarms(this)) {
- Intent intent = new Intent();
- intent.setAction(Settings.ACTION_REQUEST_SCHEDULE_EXACT_ALARM);
- startActivity(intent);
- }
- }
-
if (!Utils.isCalendarPermissionGranted(this, true)) {
//If permission is not granted then just return.
Log.d(TAG, "Manifest.permission.READ_CALENDAR is not granted");
@@ -696,7 +692,7 @@ public void onSaveInstanceState(Bundle outState) {
if (mCurrentView == ViewType.EDIT) {
outState.putLong(BUNDLE_KEY_EVENT_ID, mController.getEventId());
} else if (mCurrentView == ViewType.AGENDA) {
- FragmentManager fm = getSupportFragmentManager();
+ FragmentManager fm = getFragmentManager();
Fragment f = fm.findFragmentById(R.id.main_pane);
if (f instanceof AgendaFragment) {
outState.putLong(BUNDLE_KEY_EVENT_ID, ((AgendaFragment) f).getLastShowEventId());
@@ -749,7 +745,7 @@ private void initFragments(long timeMillis, int viewType, Bundle icicle) {
if (DEBUG) {
Log.d(TAG, "Initializing to " + timeMillis + " for view " + viewType);
}
- FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
+ FragmentTransaction ft = getFragmentManager().beginTransaction();
if (mShowCalendarControls) {
Fragment miniMonthFrag = new MonthByWeekFragment(timeMillis, true);
@@ -837,6 +833,31 @@ protected void updateViewSettingsVisiblility() {
}
}
+ protected void updateViewAgentaSwitchVisibility() {
+ if (ContextCompat.checkSelfPermission(this, DmfsOpenTasksContract.TASK_READ_PERMISSION)
+ != PackageManager.PERMISSION_GRANTED) {
+ if (mViewAgendaTasks != null) {
+ mViewAgendaTasks.setVisible(false);
+ mViewAgendaTasks.setEnabled(false);
+ }
+ if (mViewAgendaEvents != null) {
+ mViewAgendaEvents.setVisible(false);
+ mViewAgendaEvents.setEnabled(false);
+ }
+ return;
+ }
+
+ boolean viewAgendaSwitchVisible = mController.getViewType() == ViewType.AGENDA;
+ if (mViewAgendaTasks != null) {
+ mViewAgendaTasks.setVisible(viewAgendaSwitchVisible);
+ mViewAgendaTasks.setEnabled(viewAgendaSwitchVisible);
+ }
+ if (mViewAgendaEvents != null) {
+ mViewAgendaEvents.setVisible(viewAgendaSwitchVisible && !mViewAgendaTasks.isVisible());
+ mViewAgendaEvents.setEnabled(viewAgendaSwitchVisible);
+ }
+ }
+
@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
@@ -881,6 +902,9 @@ public boolean onCreateOptionsMenu(Menu menu) {
mViewSettings = menu.findItem(R.id.action_view_settings);
updateViewSettingsVisiblility();
+ mViewAgendaEvents = menu.findItem(R.id.action_view_agenda_events);
+ mViewAgendaTasks = menu.findItem(R.id.action_view_agenda_tasks);
+ updateViewAgentaSwitchVisibility();
MenuItem menuItem = menu.findItem(R.id.action_today);
@@ -890,8 +914,7 @@ public boolean onCreateOptionsMenu(Menu menu) {
Utils.setTodayIcon(icon, this, mTimeZone);
// Handle warning for disabling battery optimizations
- boolean doNotCheckBatteryOptimization = Utils.getSharedPreference(getApplicationContext(), GeneralPreferences.KEY_DO_NOT_CHECK_BATTERY_OPTIMIZATION, false);
- if (dozeDisabled() || doNotCheckBatteryOptimization) {
+ if (dozeDisabled()) {
MenuItem menuInfoItem = menu.findItem(R.id.action_info);
if (menuInfoItem != null) {
menuInfoItem.setVisible(false);
@@ -980,8 +1003,28 @@ public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth
startActivity(intent);
} else if (itemId == R.id.action_info) {
checkAndRequestDisablingDoze();
+ } else if (itemId == R.id.action_view_agenda_tasks || itemId == R.id.action_view_agenda_events) {
+ FragmentManager manager = getFragmentManager();
+ FragmentTransaction transaction = manager.beginTransaction();
+ long millis = Utils.timeFromIntentInMillis(getIntent());
+ AgendaFragment frag = new AgendaFragment(millis, false);
+
+ if (itemId == R.id.action_view_agenda_tasks) {
+ frag.isTask = true;
+ mOptionsMenu.findItem(R.id.action_view_agenda_events).setVisible(true);
+ } else if (itemId == R.id.action_view_agenda_events) {
+ frag.isTask = false;
+ mOptionsMenu.findItem(R.id.action_view_agenda_tasks).setVisible(true);
+ }
+ item.setVisible(false);
+
+ transaction.replace(R.id.main_pane, frag);
+ mController.registerEventHandler(R.id.main_pane, (EventHandler) frag);
+ transaction.commit();
+
+ return false;
} else {
- return mExtensions.handleItemSelected(item, this);
+ return mExtensions.handleItemSelected(item, this);
}
return true;
@@ -1069,7 +1112,7 @@ private void setMainPane(
// Remove this when transition to and from month view looks fine.
boolean doTransition = viewType != ViewType.MONTH && mCurrentView != ViewType.MONTH;
- FragmentManager fragmentManager = getSupportFragmentManager();
+ FragmentManager fragmentManager = getFragmentManager();
// Check if our previous view was an Agenda view
// TODO remove this if framework ever supports nested fragments
if (mCurrentView == ViewType.AGENDA) {
@@ -1286,7 +1329,7 @@ private void updateSecondaryTitleFields(long visibleMillisSinceEpoch) {
@Override
public long getSupportedEventTypes() {
- return EventType.GO_TO | EventType.VIEW_EVENT | EventType.UPDATE_TITLE;
+ return EventType.GO_TO | EventType.VIEW_EVENT | EventType.UPDATE_TITLE | EventType.VIEW_TASK;
}
@Override
@@ -1353,6 +1396,7 @@ public void handleEvent(EventInfo event) {
}
}
updateViewSettingsVisiblility();
+ updateViewAgentaSwitchVisibility();
displayTime = event.selectedTime != null ? event.selectedTime.toMillis()
: event.startTime.toMillis();
if (!mIsTabletConfig) {
@@ -1410,7 +1454,74 @@ public void handleEvent(EventInfo event) {
EventInfoFragment.DIALOG_WINDOW_STYLE,
null /* No reminders to explicitly pass in. */);
fragment.setDialogParams(event.x, event.y, mActionBar.getHeight());
- FragmentManager fm = getSupportFragmentManager();
+ FragmentManager fm = getFragmentManager();
+ FragmentTransaction ft = fm.beginTransaction();
+ // if we have an old popup replace it
+ Fragment fOld = fm.findFragmentByTag(EVENT_INFO_FRAGMENT_TAG);
+ if (fOld != null && fOld.isAdded()) {
+ ft.remove(fOld);
+ }
+ ft.add(fragment, EVENT_INFO_FRAGMENT_TAG);
+ ft.commit();
+ }
+ }
+ displayTime = event.startTime.toMillis();
+ } else if (event.eventType == EventType.VIEW_TASK) {
+
+ // If in Agenda view and "show_event_details_with_agenda" is "true",
+ // do not create the event info fragment here, it will be created by the Agenda
+ // fragment
+
+ if (mCurrentView == ViewType.AGENDA && mShowEventDetailsWithAgenda) {
+ if (event.startTime != null && event.endTime != null) {
+ // Event is all day , adjust the goto time to local time
+ if (event.isAllDay()) {
+ Utils.convertAlldayUtcToLocal(event.startTime, event.startTime.toMillis(), mTimeZone);
+ Utils.convertAlldayUtcToLocal(event.endTime, event.endTime.toMillis(), mTimeZone);
+ }
+ mController.sendEvent(this, EventType.GO_TO,
+ event.startTime, event.endTime, event.selectedTime,
+ event.id, ViewType.AGENDA,
+ CalendarController.EXTRA_GOTO_TIME, null, null);
+ } else if (event.selectedTime != null) {
+ mController.sendEvent(this, EventType.GO_TO,
+ event.selectedTime, event.selectedTime, event.id,
+ ViewType.AGENDA);
+ }
+ } else {
+ // TODO Fix the temp hack below: && mCurrentView !=
+ // ViewType.AGENDA
+ if (event.selectedTime != null && mCurrentView != ViewType.AGENDA) {
+ mController.sendEvent(this, EventType.GO_TO,
+ event.selectedTime, event.selectedTime, -1,
+ ViewType.CURRENT);
+ }
+ int response = event.getResponse();
+ if ((mCurrentView == ViewType.AGENDA &&
+ mShowEventInfoFullScreenAgenda) || ((mCurrentView
+ == ViewType.DAY || (mCurrentView ==
+ ViewType.WEEK) || mCurrentView ==
+ ViewType.MONTH) &&
+ mShowEventInfoFullScreen)) {
+ // start event info as activity
+ Intent intent = new Intent(Intent.ACTION_VIEW);
+ Uri eventUri = ContentUris.withAppendedId(DmfsOpenTasksContract.Tasks.PROVIDER_URI, event.id);
+ intent.setData(eventUri);
+ intent.setClass(this, EventInfoActivity.class);
+ intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT | Intent.FLAG_ACTIVITY_SINGLE_TOP);
+ intent.putExtra(EXTRA_EVENT_BEGIN_TIME, event.startTime.toMillis());
+ intent.putExtra(EXTRA_EVENT_END_TIME, event.endTime.toMillis());
+ intent.putExtra(ATTENDEE_STATUS, response);
+ startActivity(intent);
+ } else {
+ // start event info as a dialog
+ EventInfoFragment fragment = new EventInfoFragment(this,
+ event.id, event.startTime.toMillis(),
+ event.endTime.toMillis(), response, true,
+ EventInfoFragment.DIALOG_WINDOW_STYLE,
+ null /* No reminders to explicitly pass in. */);
+ fragment.setDialogParams(event.x, event.y, mActionBar.getHeight());
+ FragmentManager fm = getFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
// if we have an old popup replace it
Fragment fOld = fm.findFragmentByTag(EVENT_INFO_FRAGMENT_TAG);
diff --git a/app/src/main/java/com/android/calendar/CalendarController.java b/app/src/main/java/com/android/calendar/CalendarController.java
index ec71caa55b..e01544721b 100644
--- a/app/src/main/java/com/android/calendar/CalendarController.java
+++ b/app/src/main/java/com/android/calendar/CalendarController.java
@@ -40,6 +40,7 @@
import android.util.Pair;
import com.android.calendar.event.EditEventActivity;
+import com.android.calendar.persistence.tasks.DmfsOpenTasksContract;
import com.android.calendar.settings.GeneralPreferences;
import com.android.calendar.settings.SettingsActivity;
import com.android.calendarcommon2.Time;
@@ -426,6 +427,10 @@ public void sendEvent(Object sender, final EventInfo event) {
launchViewEvent(event.id, event.startTime.toMillis(), endTime,
event.getResponse());
return;
+ } else if (event.eventType == EventType.VIEW_TASK) {
+ launchViewTask(event.id, event.startTime.toMillis(), endTime,
+ event.getResponse());
+ return;
} else if (event.eventType == EventType.EDIT_EVENT) {
launchEditEvent(event.id, event.startTime.toMillis(), endTime, true);
return;
@@ -589,6 +594,18 @@ public void launchViewEvent(long eventId, long startMillis, long endMillis, int
mContext.startActivity(intent);
}
+ public void launchViewTask(long eventId, long startMillis, long endMillis, int response) {
+ Intent intent = new Intent(Intent.ACTION_VIEW);
+ Uri eventUri = ContentUris.withAppendedId(DmfsOpenTasksContract.Tasks.PROVIDER_URI, eventId);
+ intent.setData(eventUri);
+ intent.setClass(mContext, AllInOneActivity.class);
+ intent.putExtra(EXTRA_EVENT_BEGIN_TIME, startMillis);
+ intent.putExtra(EXTRA_EVENT_END_TIME, endMillis);
+ intent.putExtra(ATTENDEE_STATUS, response);
+ intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
+ mContext.startActivity(intent);
+ }
+
private void launchEditEvent(long eventId, long startMillis, long endMillis, boolean edit) {
Uri uri = ContentUris.withAppendedId(Events.CONTENT_URI, eventId);
Intent intent = new Intent(Intent.ACTION_EDIT, uri);
@@ -661,6 +678,8 @@ private String eventInfoToString(EventInfo eventInfo) {
tmp = "View details";
} else if ((eventInfo.eventType & EventType.EDIT_EVENT) != 0) {
tmp = "Edit event";
+ } else if ((eventInfo.eventType & EventType.VIEW_TASK) != 0) {
+ tmp = "View task";
} else if ((eventInfo.eventType & EventType.DELETE_EVENT) != 0) {
tmp = "Delete event";
} else if ((eventInfo.eventType & EventType.LAUNCH_SETTINGS) != 0) {
@@ -722,6 +741,8 @@ public interface EventType {
// date range has changed, update the title
final long UPDATE_TITLE = 1L << 10;
+
+ final long VIEW_TASK = 1L << 11;
}
/**
@@ -833,7 +854,7 @@ public boolean isAllDay() {
}
public int getResponse() {
- if (eventType != EventType.VIEW_EVENT) {
+ if (eventType != EventType.VIEW_EVENT && eventType != EventType.VIEW_TASK) {
Log.wtf(TAG, "illegal call to getResponse , wrong event type " + eventType);
return Attendees.ATTENDEE_STATUS_NONE;
}
diff --git a/app/src/main/java/com/android/calendar/CalendarEventModel.java b/app/src/main/java/com/android/calendar/CalendarEventModel.java
index 62884d1e9e..0d40e260e2 100644
--- a/app/src/main/java/com/android/calendar/CalendarEventModel.java
+++ b/app/src/main/java/com/android/calendar/CalendarEventModel.java
@@ -31,6 +31,7 @@
import com.android.calendar.event.EditEventHelper;
import com.android.calendar.event.EventColorCache;
import com.android.calendar.event.ExtendedProperty;
+import com.android.calendar.icalendar.VEvent;
import com.android.calendar.settings.GeneralPreferences;
import com.android.common.Rfc822Validator;
diff --git a/app/src/main/java/com/android/calendar/DayFragment.java b/app/src/main/java/com/android/calendar/DayFragment.java
index 439a685156..692085bf96 100644
--- a/app/src/main/java/com/android/calendar/DayFragment.java
+++ b/app/src/main/java/com/android/calendar/DayFragment.java
@@ -16,6 +16,7 @@
package com.android.calendar;
+import android.app.Fragment;
import android.content.Context;
import android.os.Bundle;
import android.view.LayoutInflater;
@@ -28,8 +29,6 @@
import android.widget.ViewSwitcher;
import android.widget.ViewSwitcher.ViewFactory;
-import androidx.fragment.app.Fragment;
-
import com.android.calendar.CalendarController.EventInfo;
import com.android.calendar.CalendarController.EventType;
import com.android.calendarcommon2.Time;
@@ -100,7 +99,7 @@ public void onCreate(Bundle icicle) {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
- Bundle savedInstanceState) {
+ Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.day_activity, null);
mViewSwitcher = (ViewSwitcher) v.findViewById(R.id.switcher);
diff --git a/app/src/main/java/com/android/calendar/DayView.java b/app/src/main/java/com/android/calendar/DayView.java
index 0a42cb53f2..2785afc77b 100644
--- a/app/src/main/java/com/android/calendar/DayView.java
+++ b/app/src/main/java/com/android/calendar/DayView.java
@@ -225,7 +225,11 @@ public void run() {
@Override
public void run() {
if (mClickedEvent != null) {
- mController.sendEventRelatedEvent(this, EventType.VIEW_EVENT, mClickedEvent.id,
+ long eventType = EventType.VIEW_EVENT;
+ if (mClickedEvent.isTask()) {
+ eventType = EventType.VIEW_TASK;
+ }
+ mController.sendEventRelatedEvent(this, eventType, mClickedEvent.id,
mClickedEvent.startMillis, mClickedEvent.endMillis,
DayView.this.getWidth() / 2, mClickedYLocation,
getSelectedTimeInMillis());
@@ -956,7 +960,7 @@ private void initAccessibilityVariables() {
* @return selected time in UTC milliseconds since the epoch.
*/
long getSelectedTimeInMillis() {
- Time time = new Time(Utils.getTimeZone(mContext, mTZUpdater));
+ Time time = new Time();
time.set(mBaseDate);
time.setJulianDay(mSelectionDay);
time.setHour(mSelectionHour);
@@ -4370,7 +4374,7 @@ public boolean onTouchEvent(MotionEvent ev) {
return true;
default:
- if (DEBUG) Log.e(TAG, "Not MotionEvent " + ev);
+ if (DEBUG) Log.e(TAG, "Not MotionEvent " + ev.toString());
if (mGestureDetector.onTouchEvent(ev)) {
return true;
}
diff --git a/app/src/main/java/com/android/calendar/Event.java b/app/src/main/java/com/android/calendar/Event.java
index 6a31be970d..de32d664f4 100644
--- a/app/src/main/java/com/android/calendar/Event.java
+++ b/app/src/main/java/com/android/calendar/Event.java
@@ -20,6 +20,7 @@
import android.content.ContentUris;
import android.content.Context;
import android.content.SharedPreferences;
+import android.content.pm.PackageManager;
import android.content.res.Resources;
import android.database.Cursor;
import android.net.Uri;
@@ -32,22 +33,27 @@
import android.text.format.DateUtils;
import android.util.Log;
-import com.android.calendar.settings.GeneralPreferences;
+import androidx.core.content.ContextCompat;
-import org.dmfs.rfc5545.DateTime;
-import org.dmfs.rfc5545.iterable.RecurrenceSet;
-import org.dmfs.rfc5545.iterable.instanceiterable.RuleInstances;
-import org.dmfs.rfc5545.recur.RecurrenceRule;
+import com.android.calendar.persistence.tasks.DmfsOpenTasksContract;
+import com.android.calendar.settings.GeneralPreferences;
+import com.android.calendarcommon2.Time;
-import java.text.SimpleDateFormat;
+import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Arrays;
+import java.util.Calendar;
+import java.util.Collections;
+import java.util.Comparator;
import java.util.Date;
+import java.util.GregorianCalendar;
import java.util.Iterator;
import java.util.concurrent.atomic.AtomicInteger;
import ws.xsoh.etar.R;
+import static com.android.calendar.DayView.MILLIS_PER_DAY;
+
// TODO: should Event be Parcelable so it can be passed via Intents?
public class Event implements Cloneable {
@@ -94,6 +100,30 @@ public class Event implements Cloneable {
Instances.ALL_DAY + "=1 OR (" + Instances.END + "-" + Instances.BEGIN + ")>="
+ DateUtils.DAY_IN_MILLIS + " AS " + DISPLAY_AS_ALLDAY, // 20
};
+
+ public static final String[] TASK_PROJECTION = new String[]{DmfsOpenTasksContract.Tasks.COLUMN_TITLE, // 0
+ DmfsOpenTasksContract.Tasks.COLUMN_LOCATION, // 1
+ DmfsOpenTasksContract.Tasks.COLUMN_IS_ALLDAY, // 2
+ DmfsOpenTasksContract.Tasks.COLUMN_LIST_COLOR, // 3
+ DmfsOpenTasksContract.Tasks.COLUMN_TZ, // 4
+ DmfsOpenTasksContract.Tasks.COLUMN_ID, // 5
+ DmfsOpenTasksContract.Tasks.COLUMN_START_DATE, // 6
+ DmfsOpenTasksContract.Tasks.COLUMN_DUE_DATE, // 7
+ DmfsOpenTasksContract.Tasks.COLUMN_ID, // 8
+ DmfsOpenTasksContract.Tasks.COLUMN_START_DATE, // 9
+ DmfsOpenTasksContract.Tasks.COLUMN_DUE_DATE, // 10
+ DmfsOpenTasksContract.Tasks.COLUMN_START_DATE, // 11
+ DmfsOpenTasksContract.Tasks.COLUMN_DUE_DATE, // 12
+ DmfsOpenTasksContract.Tasks.COLUMN_HAS_ALLARMS, // 13
+ DmfsOpenTasksContract.Tasks.COLUMN_RRULE, // 14
+ DmfsOpenTasksContract.Tasks.COLUMN_RDATE, // 15
+ DmfsOpenTasksContract.Tasks.COLUMN_STATUS, // 16
+ DmfsOpenTasksContract.Tasks.COLUMN_ACCOUNT_NAME, // 17
+ DmfsOpenTasksContract.Tasks.COLUMN_ORGANIZER, // 18
+ "0>0", // 19
+ "0>0", // 20
+ };
+
private static final String EVENTS_WHERE = DISPLAY_AS_ALLDAY + "=0";
private static final String ALLDAY_WHERE = DISPLAY_AS_ALLDAY + "=1";
// The indices for the projection array above.
@@ -120,6 +150,13 @@ public class Event implements Cloneable {
private static String mNoTitleString;
private static int mNoColorColor;
+ public static final String AND_BRACKET = " AND (";
+ public static final String CLOSING_BRACKET = " )";
+ public static final String AND = " AND ";
+ public static final String OR = " OR ";
+ public static final String NOT_EQUALS = " != ";
+ public static final String LTE = " <= ";
+ public static final String GTE = " >= ";
public long id;
public int color;
@@ -153,6 +190,7 @@ public class Event implements Cloneable {
public Event nextDown;
private int mColumn;
private int mMaxColumns;
+ private boolean task;
public static final Event newInstance() {
Event e = new Event();
@@ -172,6 +210,7 @@ public static final Event newInstance() {
e.isRepeating = false;
e.status = Events.STATUS_CONFIRMED;
e.selfAttendeeStatus = Attendees.ATTENDEE_STATUS_NONE;
+ e.task = false;
return e;
}
@@ -193,6 +232,7 @@ public static void loadEvents(Context context, ArrayList events, int star
Cursor cEvents = null;
Cursor cAllday = null;
+ Cursor cTasks = null;
events.clear();
try {
@@ -236,6 +276,15 @@ public static void loadEvents(Context context, ArrayList events, int star
buildEventsFromCursor(events, cEvents, context, startDay, endDay);
buildEventsFromCursor(events, cAllday, context, startDay, endDay);
+ // we use tasks as events
+ if (ContextCompat.checkSelfPermission(context, DmfsOpenTasksContract.TASK_READ_PERMISSION)
+ == PackageManager.PERMISSION_GRANTED) {
+ cTasks = instancesQueryForTasks(context.getContentResolver(), TASK_PROJECTION, startDay, endDay);
+
+ buildTasksFromCursor(events, cTasks, context, startDay, endDay);
+ Collections.sort(events, Comparator.comparing(u -> new Date(u.getStartMillis())));
+ }
+
} finally {
if (cEvents != null) {
cEvents.close();
@@ -249,6 +298,116 @@ public static void loadEvents(Context context, ArrayList events, int star
}
}
+ public static Cursor instancesQueryForTasks(ContentResolver cr, String[] projection, int startDay, int endDay) {
+ long startMills = getMillsFromJulian(startDay, true);
+ long endMills = getMillsFromJulian(endDay, false);
+ String taskWhere = DmfsOpenTasksContract.Tasks.COLUMN_STATUS + NOT_EQUALS + DmfsOpenTasksContract.Tasks.STATUS_COMPLETED + AND_BRACKET + DmfsOpenTasksContract.Tasks.COLUMN_DUE_DATE + LTE + endMills + CLOSING_BRACKET + AND_BRACKET + DmfsOpenTasksContract.Tasks.COLUMN_DUE_DATE + GTE + startMills + CLOSING_BRACKET + AND_BRACKET + DmfsOpenTasksContract.Tasks.COLUMN_VISIBLE + " = 1" + CLOSING_BRACKET + AND_BRACKET + DmfsOpenTasksContract.Tasks.COLUMN_DUE_DATE + " != 0" + CLOSING_BRACKET;
+
+ return cr.query(DmfsOpenTasksContract.Tasks.PROVIDER_URI, projection, taskWhere, null, "due ASC, title ASC");
+ }
+
+ public static long getMillsFromJulian(int day, boolean isStart) {
+ GregorianCalendar julianbaseCal = new GregorianCalendar();
+ julianbaseCal.clear();
+ julianbaseCal.set(4713, Calendar.JANUARY, 1, 12, 0, 0);
+ julianbaseCal.set(Calendar.ERA, GregorianCalendar.BC);
+
+ long juliandateMillis = day * (long) (MILLIS_PER_DAY);
+ long mills = juliandateMillis + julianbaseCal.getTimeInMillis();
+ Calendar calendar = Calendar.getInstance();
+ calendar.setTimeInMillis(mills);
+ if (isStart) {
+ calendar.set(Calendar.HOUR_OF_DAY, 0);
+ calendar.set(Calendar.MINUTE, 0);
+ calendar.set(Calendar.SECOND, 0);
+ } else {
+ calendar.set(Calendar.HOUR_OF_DAY, 23);
+ calendar.set(Calendar.MINUTE, 59);
+ calendar.set(Calendar.SECOND, 59);
+ }
+
+ return calendar.getTimeInMillis();
+ }
+
+ public static void buildTasksFromCursor(ArrayList events, Cursor cTasks, Context context, int startDay, int endDay) {
+ if (cTasks == null || events == null) {
+ Log.e(TAG, "buildEventsFromCursor: null cursor or null events list!");
+ return;
+ }
+
+ int count = cTasks.getCount();
+
+ if (count == 0) {
+ return;
+ }
+
+ Resources res = context.getResources();
+ mNoTitleString = res.getString(R.string.no_title_label);
+ mNoColorColor = res.getColor(R.color.event_center);
+ cTasks.moveToPosition(-1);
+
+ while (cTasks.moveToNext()) {
+ Event e = generateTaskFromCursor(cTasks, context);
+ if (e == null) {
+ continue;
+ }
+ if (e.startDay > endDay || e.endDay < startDay) {
+ continue;
+ }
+ events.add(e);
+ }
+ }
+
+ private static Event generateTaskFromCursor(Cursor cTasks, Context context) {
+
+ Event e = new Event();
+
+ e.id = cTasks.getLong(PROJECTION_EVENT_ID_INDEX);
+ e.title = cTasks.getString(PROJECTION_TITLE_INDEX);
+ if (e.title == null || e.title.length() == 0) {
+ e.title = mNoTitleString;
+ }
+ e.endMillis = cTasks.getLong(PROJECTION_END_INDEX);
+
+ e.endTime = getEndMinutes(e.endMillis);
+ e.startTime = e.endTime - 30;
+
+ e.endDay = Time.getJulianDay(e.endMillis, new Time().getGmtOffset());
+ e.startDay = Time.getJulianDay(e.endMillis, new Time().getGmtOffset());
+
+ e.startMillis = cTasks.getLong(PROJECTION_BEGIN_INDEX);
+ if (e.startMillis == 0) {
+
+ Calendar cal = Calendar.getInstance();
+ cal.setTimeInMillis(e.endMillis);
+ cal.add(Calendar.MINUTE, -30);
+ e.startMillis = cal.getTimeInMillis();
+ }
+ e.allDay = cTasks.getInt(PROJECTION_ALL_DAY_INDEX) != 0;
+
+ if (!cTasks.isNull(PROJECTION_COLOR_INDEX)) {
+ // Read the color from the database
+ e.color = Utils.getDisplayColorFromColor(context, cTasks.getInt(PROJECTION_COLOR_INDEX));
+ } else {
+ e.color = mNoColorColor;
+ }
+
+ e.status = cTasks.getInt(PROJECTION_STATUS_INDEX);
+ e.organizer = cTasks.getString(PROJECTION_ORGANIZER_INDEX);
+ if (e.organizer == null) {
+ e.organizer = cTasks.getString(PROJECTION_SELF_ATTENDEE_STATUS_INDEX);
+ }
+ e.task = true;
+ return e;
+ }
+
+ public static int getEndMinutes(long mills) {
+ GregorianCalendar instance = new GregorianCalendar();
+ instance.setGregorianChange(new Date(Long.MAX_VALUE));
+ instance.setTime(new Timestamp(mills));
+ return (instance.get(Calendar.HOUR_OF_DAY) * 60) + instance.get(Calendar.MINUTE);
+ }
+
/**
* Performs a query to return all visible instances in the given range
* that match the given selection. This is a blocking function and
@@ -375,22 +534,6 @@ private static Event generateEventFromCursor(Cursor cEvents, Context context) {
String rdate = cEvents.getString(PROJECTION_RDATE_INDEX);
if (!TextUtils.isEmpty(rrule) || !TextUtils.isEmpty(rdate)) {
e.isRepeating = true;
-
- /** We need to double check a few RRULE conditions that the Android Calendar Provider
- * doesn't handle and shows duplicate events for, namely:
- *
- * - BYSETPOS
- * - BYWEEKNO
- *
- * For these conditions, double check if this event really occurs on this day, if it
- * doesn't, reset the endDay value to 0 so it is removed from the events list.
- *
- * It might make sense to check all rrule's, as there may be other broken sets, but
- * the overhead is probably not worth it at this point.
- **/
- if (rrule instanceof String && (rrule.contains("BYSETPOS=") || rrule.contains("BYWEEKNO="))) {
- e.endDay = checkRRuleEventDate(rrule, e.startMillis, e.endDay);
- }
} else {
e.isRepeating = false;
}
@@ -399,71 +542,6 @@ private static Event generateEventFromCursor(Cursor cEvents, Context context) {
return e;
}
- /** Android's RRULE code is broken in a way the creates additional events in certain
- * circumstances (though never doesn't create the actual event) so let's use another RRULE
- * parser to validate if the event is real or not.
- *
- * In this case we're using lib-recur from https://github.com/dmfs/lib-recur through maven.
- *
- **/
- static int checkRRuleEventDate( String rrule, long startTime, int endDay) {
- // Convert the startTime into some useable Day/Month/Year values.
- Date date = new java.util.Date(startTime);
-
- // We'll use SimpleDateFormat to get the D/M/Y but we also need to set the timezone.
- SimpleDateFormat sdf = new java.text.SimpleDateFormat();
- sdf.setTimeZone(java.util.TimeZone.getTimeZone("GMT"));
-
- sdf.applyPattern("yyyy");
- int startYear = Integer.parseInt(sdf.format(date));
- sdf.applyPattern("MM");
- int startMonth = Integer.parseInt(sdf.format(date)) - 1;
- sdf.applyPattern("dd");
- int startDay = Integer.parseInt(sdf.format(date));
-
- // Parse the recurrence rule.
- RecurrenceRule rule;
- try {
- rule = new RecurrenceRule(rrule);
- } catch (Exception e) {
- // On failure, assume we match and return.
- return endDay;
- }
-
- // Use the Year/Month/Day startTime values to create a firstInstance.
- DateTime firstInstance = new DateTime(startYear, startMonth, startDay);
- RecurrenceSet newRecurrenceSet;
-
- // Wrap the recurrent set creation in a try/catch to ensure we don't run into an invalid
- // rule set that lib-recur can't parse.
- try {
- newRecurrenceSet = new RecurrenceSet(firstInstance, new RuleInstances(rule));
- } catch (Exception e) {
- return endDay;
- }
-
- // Wrap the for loop in a try/catch to ensure we don't run into an invalid
- // rule set that lib-recur can't parse.
- try {
- // Create the recurrence set for the rule, we're only going to look at the first one
- // as it should match the firstInstance if this is a valid event from Android.
- for (DateTime instance:newRecurrenceSet) {
- if (!instance.equals(firstInstance)) {
- // If this isn't a valid event, return 0 so it gets removed from the event list.
- return 0;
- } else {
- // If this is a valid event, return the endDay that we were passed in with.
- return endDay;
- }
- }
- } catch (Exception e) {
- return endDay;
- }
-
- // We should never get here, but add a return just in case.
- return endDay;
- }
-
/**
* Computes a position for each event. Each event is displayed
* as a non-overlapping rectangle. For normal events, these rectangles
@@ -731,4 +809,12 @@ public boolean drawAsAllday() {
// Use >= so we'll pick up Exchange allday events
return allDay || endMillis - startMillis >= DateUtils.DAY_IN_MILLIS;
}
+
+ public boolean isTask() {
+ return task;
+ }
+
+ public void setTask(boolean task) {
+ this.task = task;
+ }
}
diff --git a/app/src/main/java/com/android/calendar/EventInfoActivity.java b/app/src/main/java/com/android/calendar/EventInfoActivity.java
index 72bcb1e825..1bae966abf 100644
--- a/app/src/main/java/com/android/calendar/EventInfoActivity.java
+++ b/app/src/main/java/com/android/calendar/EventInfoActivity.java
@@ -19,6 +19,8 @@
import static android.provider.CalendarContract.EXTRA_EVENT_BEGIN_TIME;
import static android.provider.CalendarContract.EXTRA_EVENT_END_TIME;
+import android.app.FragmentManager;
+import android.app.FragmentTransaction;
import android.content.Intent;
import android.content.res.Resources;
import android.database.ContentObserver;
@@ -31,8 +33,6 @@
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
-import androidx.fragment.app.FragmentManager;
-import androidx.fragment.app.FragmentTransaction;
import com.android.calendar.CalendarEventModel.ReminderEntry;
@@ -140,14 +140,14 @@ protected void onCreate(Bundle icicle) {
// Get the fragment if exists
mInfoFragment = (EventInfoFragment)
- getSupportFragmentManager().findFragmentById(R.id.main_frame);
+ getFragmentManager().findFragmentById(R.id.main_frame);
// Create a new fragment if none exists
if (mInfoFragment == null) {
- FragmentManager fragmentManager = getSupportFragmentManager();
+ FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction ft = fragmentManager.beginTransaction();
- mInfoFragment = new EventInfoFragment(this, mEventId, mStartMillis, mEndMillis,
+ mInfoFragment = new EventInfoFragment(this, intent.getData(), mStartMillis, mEndMillis,
attendeeResponse, isDialog, (isDialog ?
EventInfoFragment.DIALOG_WINDOW_STYLE :
EventInfoFragment.FULL_WINDOW_STYLE),
diff --git a/app/src/main/java/com/android/calendar/EventInfoFragment.java b/app/src/main/java/com/android/calendar/EventInfoFragment.java
index 264ccf3503..77bc0fc650 100644
--- a/app/src/main/java/com/android/calendar/EventInfoFragment.java
+++ b/app/src/main/java/com/android/calendar/EventInfoFragment.java
@@ -28,6 +28,8 @@
import android.animation.ObjectAnimator;
import android.app.Activity;
import android.app.Dialog;
+import android.app.DialogFragment;
+import android.app.FragmentManager;
import android.app.Service;
import android.content.ActivityNotFoundException;
import android.content.ContentProviderOperation;
@@ -96,13 +98,10 @@
import android.widget.TextView;
import android.widget.Toast;
-import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import androidx.constraintlayout.widget.ConstraintLayout;
import androidx.core.content.FileProvider;
-import androidx.fragment.app.DialogFragment;
-import androidx.fragment.app.FragmentManager;
import com.android.calendar.CalendarController.EventInfo;
import com.android.calendar.CalendarController.EventType;
@@ -119,6 +118,8 @@
import com.android.calendar.icalendar.Organizer;
import com.android.calendar.icalendar.VCalendar;
import com.android.calendar.icalendar.VEvent;
+import com.android.calendar.icalendar.VTodo;
+import com.android.calendar.persistence.tasks.DmfsOpenTasksContract;
import com.android.calendar.settings.GeneralPreferences;
import com.android.calendarcommon2.DateException;
import com.android.calendarcommon2.Duration;
@@ -136,6 +137,7 @@
import java.util.Collection;
import java.util.Collections;
import java.util.List;
+import java.util.Objects;
import java.util.stream.Collectors;
import java.util.stream.Stream;
@@ -190,13 +192,26 @@ public class EventInfoFragment extends DialogFragment implements OnCheckedChange
Calendars.ACCOUNT_NAME, // 4
Calendars.ACCOUNT_TYPE // 5
};
+
+ static final String[] TASK_LIST_PROJECTION = new String[]{
+ DmfsOpenTasksContract.TaskLists.COLUMN_ID, // 0
+ DmfsOpenTasksContract.TaskLists.COLUMN_NAME, // 1
+ DmfsOpenTasksContract.TaskLists.COLUMN_LIST_OWNER, // 2
+ "0 AS canOrganizerRespond", // 3
+ DmfsOpenTasksContract.TaskLists.COLUMN_ACCOUNT_NAME, // 4
+ DmfsOpenTasksContract.TaskLists.COLUMN_ACCOUNT_TYPE // 5
+ };
static final int CALENDARS_INDEX_DISPLAY_NAME = 1;
static final int CALENDARS_INDEX_OWNER_ACCOUNT = 2;
static final int CALENDARS_INDEX_OWNER_CAN_RESPOND = 3;
static final int CALENDARS_INDEX_ACCOUNT_NAME = 4;
static final int CALENDARS_INDEX_ACCOUNT_TYPE = 5;
static final String CALENDARS_WHERE = Calendars._ID + "=?";
+
+ static final String TASK_LIST_WHERE = DmfsOpenTasksContract.TaskLists.COLUMN_ID + "=?";
static final String CALENDARS_DUPLICATE_NAME_WHERE = Calendars.CALENDAR_DISPLAY_NAME + "=?";
+
+ static final String TASK_LIST_DUPLICATE_NAME_WHERE = DmfsOpenTasksContract.TaskLists.COLUMN_NAME + "=?";
static final String CALENDARS_VISIBLE_WHERE = Calendars.VISIBLE + "=?";
static final String[] COLORS_PROJECTION = new String[]{
Colors._ID, // 0
@@ -217,10 +232,14 @@ public class EventInfoFragment extends DialogFragment implements OnCheckedChange
private static final int TOKEN_QUERY_VISIBLE_CALENDARS = 1 << 5;
private static final int TOKEN_QUERY_COLORS = 1 << 6;
private static final int TOKEN_QUERY_EXTENDED = 1 << 7;
+ private static final int TOKEN_QUERY_TASK = 3; // 1
+ private static final int TOKEN_QUERY_TASK_LIST = 7; // 2
+ private static final int TOKEN_QUERY_VISIBLE_TASK_LIST = 11 ; // 32
+ private static final int TOKEN_QUERY_DUPLICATE_TASK_LIST = 100; // 8
private static final int TOKEN_QUERY_ALL = TOKEN_QUERY_DUPLICATE_CALENDARS
| TOKEN_QUERY_ATTENDEES | TOKEN_QUERY_CALENDARS | TOKEN_QUERY_EVENT
| TOKEN_QUERY_REMINDERS | TOKEN_QUERY_VISIBLE_CALENDARS | TOKEN_QUERY_COLORS
- | TOKEN_QUERY_EXTENDED;
+ | TOKEN_QUERY_TASK | TOKEN_QUERY_VISIBLE_TASK_LIST | TOKEN_QUERY_DUPLICATE_TASK_LIST |TOKEN_QUERY_TASK_LIST;
public static final File EXPORT_SDCARD_DIRECTORY = new File(
Environment.getExternalStorageDirectory(), "CalendarEvents");
@@ -258,6 +277,36 @@ private enum ShareType {
Events.AVAILABILITY, // 24
Events.ACCESS_LEVEL // 25
};
+
+ private static final String[] TASK_PROJECTION = new String[] {
+ DmfsOpenTasksContract.Tasks.COLUMN_ID, // 0 do not remove; used in DeleteEventHelper
+ DmfsOpenTasksContract.Tasks.COLUMN_TITLE, // 1 do not remove; used in DeleteEventHelper
+ DmfsOpenTasksContract.Tasks.COLUMN_RRULE, // 2 do not remove; used in DeleteEventHelper
+ DmfsOpenTasksContract.Tasks.COLUMN_IS_ALLDAY, // 3 do not remove; used in DeleteEventHelper
+ DmfsOpenTasksContract.Tasks.COLUMN_LIST_ID, // 4 do not remove; used in DeleteEventHelper
+ DmfsOpenTasksContract.Tasks.COLUMN_DTSTART, // 5 do not remove; used in DeleteEventHelper
+ DmfsOpenTasksContract.Tasks.COLUMN_SYNC_ID, // 6 do not remove; used in DeleteEventHelper
+ DmfsOpenTasksContract.Tasks.COLUMN_TZ, // 7 do not remove; used in DeleteEventHelper
+ DmfsOpenTasksContract.Tasks.COLUMN_DESCRIPTION, // 8
+ DmfsOpenTasksContract.Tasks.COLUMN_LOCATION, // 9
+ DmfsOpenTasksContract.Tasks.COLUMN_LIST_ACCESS_LEVEL, // 10
+ DmfsOpenTasksContract.Tasks.COLUMN_LIST_COLOR, // 11
+ DmfsOpenTasksContract.Tasks.COLUMN_COLOR, // 12
+ DmfsOpenTasksContract.Tasks.COLUMN_STATUS, // 13
+ "0 AS hasAttendeeData", // 14
+ DmfsOpenTasksContract.Tasks.COLUMN_ORGANIZER, // 15
+ DmfsOpenTasksContract.Tasks.COLUMN_HAS_ALLARMS, // 16
+ "10 AS maxReminders", // 17
+ "0 AS allowedReminders", // 18
+ "null AS customAppPackage", // 19
+ "null AS customAppUri", // 20
+ DmfsOpenTasksContract.Tasks.COLUMN_DUE_DATE, // 21
+ DmfsOpenTasksContract.Tasks.COLUMN_DURATION, // 22
+ DmfsOpenTasksContract.Tasks.COLUMN_ORIGINAL_INSTANCE_SYNC_ID, // 23 do not remove; used in DeleteEventHelper
+ "0 AS availability", // 24
+ "0 AS accessLevel", // 25
+ DmfsOpenTasksContract.Tasks.COLUMN_ACCOUNT_NAME, // 26
+ };
private static final int EVENT_INDEX_ID = 0;
private static final int EVENT_INDEX_TITLE = 1;
private static final int EVENT_INDEX_RRULE = 2;
@@ -283,6 +332,8 @@ private enum ShareType {
private static final int EVENT_INDEX_DURATION = 22;
private static final int EVENT_INDEX_AVAILABILITY = 24;
private static final int EVENT_INDEX_ACCESS_LEVEL = 25;
+
+ private static final int PROJECTION_SELF_ATTENDEE_STATUS_INDEX = 26;
private static final String[] ATTENDEES_PROJECTION = new String[] {
Attendees._ID, // 0
Attendees.ATTENDEE_NAME, // 1
@@ -344,6 +395,7 @@ private enum ShareType {
private View mView;
private Uri mUri;
private long mEventId;
+ boolean mIsTask = false;
private Cursor mEventCursor;
private Cursor mAttendeesCursor;
private Cursor mCalendarsCursor;
@@ -457,7 +509,7 @@ public void run() {
private int mY = -1;
private int mMinTop; // Dialog cannot be above this location
private boolean mIsTabletConfig;
- private AppCompatActivity mActivity;
+ private Activity mActivity;
private Context mContext;
private final Runnable mTZUpdater = new Runnable() {
@Override
@@ -488,6 +540,9 @@ public EventInfoFragment(Context context, Uri uri, long startMillis, long endMil
setStyle(DialogFragment.STYLE_NO_TITLE, 0);
mUri = uri;
+ if (mUri.getAuthority().equals(DmfsOpenTasksContract.AUTHORITY)) {
+ mIsTask = true;
+ }
mStartMillis = startMillis;
mEndMillis = endMillis;
mAttendeeResponseFromIntent = attendeeResponse;
@@ -497,6 +552,11 @@ public EventInfoFragment(Context context, Uri uri, long startMillis, long endMil
// This may be used to explicitly show certain reminders already known
// about, such as during configuration changes.
mReminders = reminders;
+
+ // when event is a task we haven't an eventId. we get it from URI
+ if (mIsTask) {
+ mEventId = Long.parseLong(mUri.getLastPathSegment());
+ }
}
// This is currently required by the fragment manager.
@@ -610,7 +670,7 @@ public void onNothingSelected(AdapterView> parent) {
final Activity activity = getActivity();
mContext = activity;
dynamicTheme.onCreate(activity);
- mColorPickerDialog = (EventColorPickerDialog) mActivity.getSupportFragmentManager()
+ mColorPickerDialog = (EventColorPickerDialog) activity.getFragmentManager()
.findFragmentByTag(COLOR_PICKER_DIALOG_TAG);
if (mColorPickerDialog != null) {
mColorPickerDialog.setOnColorSelectedListener(this);
@@ -690,14 +750,14 @@ public void onDetach() {
}
@Override
- public void onAttach(@NonNull Context context) {
- super.onAttach(context);
- mActivity = (AppCompatActivity) context;
+ public void onAttach(Activity activity) {
+ super.onAttach(activity);
+ mActivity = activity;
// Ensure that mIsTabletConfig is set before creating the menu.
mIsTabletConfig = Utils.getConfigBool(mActivity, R.bool.tablet_config);
mController = CalendarController.getInstance(mActivity);
mController.registerEventHandler(R.layout.event_info, this);
- mEditResponseHelper = new EditResponseHelper(mActivity);
+ mEditResponseHelper = new EditResponseHelper(activity);
mEditResponseHelper.setDismissListener(
new DialogInterface.OnDismissListener() {
@Override
@@ -742,7 +802,7 @@ public void onDismiss(DialogInterface dialog) {
mEditResponseHelper.setWhichEvents(UPDATE_ALL);
mWhichEvents = mEditResponseHelper.getWhichEvents();
}
- mHandler = new QueryHandler(mActivity);
+ mHandler = new QueryHandler(activity);
if (!mIsDialog) {
setHasOptionsMenu(true);
}
@@ -866,8 +926,13 @@ public void onAnimationEnd(Animator animation) {
mLoadingMsgView.postDelayed(mLoadingMsgAlphaUpdater, LOADING_MSG_DELAY);
// start loading the data
-
- mHandler.startQuery(TOKEN_QUERY_EVENT, null, mUri, EVENT_PROJECTION,
+ int tokenQueryEvent = TOKEN_QUERY_EVENT;
+ String[] projetion = EVENT_PROJECTION;
+ if (mIsTask) {
+ tokenQueryEvent = TOKEN_QUERY_TASK;
+ projetion = TASK_PROJECTION;
+ }
+ mHandler.startQuery(tokenQueryEvent, null, mUri, projetion,
null, null, null);
View b = mView.findViewById(R.id.delete);
@@ -914,15 +979,21 @@ public void onClick(View v) {
}
// Create a listener for the add reminder button
- View reminderAddButton = mView.findViewById(R.id.reminder_add);
- View.OnClickListener addReminderOnClickListener = new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- addReminder();
- mUserModifiedReminders = true;
- }
- };
- reminderAddButton.setOnClickListener(addReminderOnClickListener);
+ if (!mIsTask) {
+ View reminderAddButton = mView.findViewById(R.id.reminder_add);
+ View.OnClickListener addReminderOnClickListener = new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ addReminder();
+ mUserModifiedReminders = true;
+ }
+ };
+ reminderAddButton.setOnClickListener(addReminderOnClickListener);
+ } else {
+ Button reminderAddButton = (Button) mView.findViewById(R.id.reminder_add);
+ reminderAddButton.setText(R.string.event_info_reminders_cannot_add_label);
+ reminderAddButton.setEnabled(false);
+ }
// Set reminders variables
@@ -1160,56 +1231,106 @@ private void shareEvent(ShareType type) {
calendar.addProperty(VCalendar.CALSCALE, "GREGORIAN");
calendar.addProperty(VCalendar.METHOD, "REQUEST");
- VEvent event = new VEvent();
- mEventCursor.moveToFirst();
- // Add event start and end datetime
- if (!mAllDay) {
- String eventTimeZone = mEventCursor.getString(EVENT_INDEX_EVENT_TIMEZONE);
- event.addEventStart(mStartMillis, eventTimeZone);
- event.addEventEnd(mEndMillis, eventTimeZone);
+ String filePrefix;
+ if (mIsTask) {
+ VTodo vtodo = new VTodo();
+ mEventCursor.moveToFirst();
+ // Add event start and end datetime
+ if (!mAllDay) {
+ String eventTimeZone = mEventCursor.getString(EVENT_INDEX_EVENT_TIMEZONE);
+ vtodo.addTodoStart(mStartMillis, eventTimeZone);
+ vtodo.addTodoEnd(mEndMillis, eventTimeZone);
+ } else {
+ // All-day events' start and end time are stored as UTC.
+ // Treat the event start and end time as being in the local time zone and convert them
+ // to the corresponding UTC datetime. If the UTC time is used as is, the ical recipients
+ // will report the wrong start and end time (+/- 1 day) for the event as they will
+ // convert the UTC time to their respective local time-zones
+ String localTimeZone = Utils.getTimeZone(mActivity, mTZUpdater);
+ long eventStart = IcalendarUtils.convertTimeToUtc(mStartMillis, localTimeZone);
+ long eventEnd = IcalendarUtils.convertTimeToUtc(mEndMillis, localTimeZone);
+ vtodo.addTodoStart(eventStart, "UTC");
+ vtodo.addTodoEnd(eventEnd, "UTC");
+ }
+
+ vtodo.addProperty(VEvent.LOCATION, mEventCursor.getString(EVENT_INDEX_EVENT_LOCATION));
+ vtodo.addProperty(VEvent.DESCRIPTION, mEventCursor.getString(EVENT_INDEX_DESCRIPTION));
+ vtodo.addProperty(VEvent.SUMMARY, mEventCursor.getString(EVENT_INDEX_TITLE));
+ vtodo.addOrganizer(new Organizer(mEventOrganizerDisplayName, mEventOrganizerEmail));
+
+ // Add Attendees to event
+ for (Attendee attendee : mAcceptedAttendees) {
+ IcalendarUtils.addAttendeeToTodo(attendee, vtodo);
+ }
+
+ for (Attendee attendee : mDeclinedAttendees) {
+ IcalendarUtils.addAttendeeToTodo(attendee, vtodo);
+ }
+
+ for (Attendee attendee : mTentativeAttendees) {
+ IcalendarUtils.addAttendeeToTodo(attendee, vtodo);
+ }
+
+ for (Attendee attendee : mNoResponseAttendees) {
+ IcalendarUtils.addAttendeeToTodo(attendee, vtodo);
+ }
+
+ // Compose all of the ICalendar objects
+ calendar.addTodo(vtodo);
+
+ filePrefix = vtodo.getProperty(VTodo.SUMMARY);
} else {
- // All-day events' start and end time are stored as UTC.
- // Treat the event start and end time as being in the local time zone and convert them
- // to the corresponding UTC datetime. If the UTC time is used as is, the ical recipients
- // will report the wrong start and end time (+/- 1 day) for the event as they will
- // convert the UTC time to their respective local time-zones
- String localTimeZone = Utils.getTimeZone(mActivity, mTZUpdater);
- long eventStart = IcalendarUtils.convertTimeToUtc(mStartMillis, localTimeZone);
- long eventEnd = IcalendarUtils.convertTimeToUtc(mEndMillis, localTimeZone);
- event.addEventStart(eventStart, "UTC");
- event.addEventEnd(eventEnd, "UTC");
- }
-
- event.addProperty(VEvent.LOCATION, mEventCursor.getString(EVENT_INDEX_EVENT_LOCATION));
- event.addProperty(VEvent.DESCRIPTION, mEventCursor.getString(EVENT_INDEX_DESCRIPTION));
- event.addProperty(VEvent.SUMMARY, mEventCursor.getString(EVENT_INDEX_TITLE));
- event.addOrganizer(new Organizer(mEventOrganizerDisplayName, mEventOrganizerEmail));
-
- // Add Attendees to event
- for (Attendee attendee : mAcceptedAttendees) {
- IcalendarUtils.addAttendeeToEvent(attendee, event);
- }
+ VEvent event = new VEvent();
+ mEventCursor.moveToFirst();
+ // Add event start and end datetime
+ if (!mAllDay) {
+ String eventTimeZone = mEventCursor.getString(EVENT_INDEX_EVENT_TIMEZONE);
+ event.addEventStart(mStartMillis, eventTimeZone);
+ event.addEventEnd(mEndMillis, eventTimeZone);
+ } else {
+ // All-day events' start and end time are stored as UTC.
+ // Treat the event start and end time as being in the local time zone and convert them
+ // to the corresponding UTC datetime. If the UTC time is used as is, the ical recipients
+ // will report the wrong start and end time (+/- 1 day) for the event as they will
+ // convert the UTC time to their respective local time-zones
+ String localTimeZone = Utils.getTimeZone(mActivity, mTZUpdater);
+ long eventStart = IcalendarUtils.convertTimeToUtc(mStartMillis, localTimeZone);
+ long eventEnd = IcalendarUtils.convertTimeToUtc(mEndMillis, localTimeZone);
+ event.addEventStart(eventStart, "UTC");
+ event.addEventEnd(eventEnd, "UTC");
+ }
- for (Attendee attendee : mDeclinedAttendees) {
- IcalendarUtils.addAttendeeToEvent(attendee, event);
- }
+ event.addProperty(VEvent.LOCATION, mEventCursor.getString(EVENT_INDEX_EVENT_LOCATION));
+ event.addProperty(VEvent.DESCRIPTION, mEventCursor.getString(EVENT_INDEX_DESCRIPTION));
+ event.addProperty(VEvent.SUMMARY, mEventCursor.getString(EVENT_INDEX_TITLE));
+ event.addOrganizer(new Organizer(mEventOrganizerDisplayName, mEventOrganizerEmail));
- for (Attendee attendee : mTentativeAttendees) {
- IcalendarUtils.addAttendeeToEvent(attendee, event);
- }
+ // Add Attendees to event
+ for (Attendee attendee : mAcceptedAttendees) {
+ IcalendarUtils.addAttendeeToEvent(attendee, event);
+ }
- for (Attendee attendee : mNoResponseAttendees) {
- IcalendarUtils.addAttendeeToEvent(attendee, event);
- }
+ for (Attendee attendee : mDeclinedAttendees) {
+ IcalendarUtils.addAttendeeToEvent(attendee, event);
+ }
- // Compose all of the ICalendar objects
- calendar.addEvent(event);
+ for (Attendee attendee : mTentativeAttendees) {
+ IcalendarUtils.addAttendeeToEvent(attendee, event);
+ }
+
+ for (Attendee attendee : mNoResponseAttendees) {
+ IcalendarUtils.addAttendeeToEvent(attendee, event);
+ }
+
+ // Compose all of the ICalendar objects
+ calendar.addEvent(event);
+ filePrefix = event.getProperty(VEvent.SUMMARY);
+ }
// Create and share ics file
boolean isShareSuccessful = false;
try {
// Event title serves as the file name prefix
- String filePrefix = event.getProperty(VEvent.SUMMARY);
if (filePrefix == null || filePrefix.length() < 3) {
// Default to a generic filename if event title doesn't qualify
// Prefix length constraint is imposed by File#createTempFile
@@ -1328,7 +1449,7 @@ private void showEventColorPickerDialog() {
mCalendarColor, mIsTabletConfig);
mColorPickerDialog.setOnColorSelectedListener(this);
}
- final FragmentManager fragmentManager = getParentFragmentManager();
+ final FragmentManager fragmentManager = getFragmentManager();
fragmentManager.executePendingTransactions();
if (!mColorPickerDialog.isAdded()) {
mColorPickerDialog.show(fragmentManager, COLOR_PICKER_DIALOG_TAG);
@@ -1830,7 +1951,7 @@ private void addFieldToAccessibilityEvent(List text, TextView tv,
}
}
- private void updateCalendar(View view) {
+ private void updateCalendar(View view, boolean isTaskList) {
mCalendarOwnerAccount = "";
if (mCalendarsCursor != null && mEventCursor != null) {
@@ -1841,10 +1962,18 @@ private void updateCalendar(View view) {
mSyncAccountName = mCalendarsCursor.getString(CALENDARS_INDEX_ACCOUNT_NAME);
// start visible calendars query
- mHandler.startQuery(TOKEN_QUERY_VISIBLE_CALENDARS, null, Calendars.CONTENT_URI,
- CALENDARS_PROJECTION, CALENDARS_VISIBLE_WHERE, new String[] {"1"}, null);
+ if (isTaskList) {
+ mHandler.startQuery(TOKEN_QUERY_VISIBLE_TASK_LIST, null, DmfsOpenTasksContract.TaskLists.PROVIDER_URI,
+ TASK_LIST_PROJECTION, CALENDARS_VISIBLE_WHERE, new String[]{"1"}, null);
+ } else {
+ mHandler.startQuery(TOKEN_QUERY_VISIBLE_CALENDARS, null, Calendars.CONTENT_URI,
+ CALENDARS_PROJECTION, CALENDARS_VISIBLE_WHERE, new String[]{"1"}, null);
+ }
mEventOrganizerEmail = mEventCursor.getString(EVENT_INDEX_ORGANIZER);
+ if (mEventOrganizerEmail == null) {
+ mEventOrganizerEmail = mEventCursor.getString(PROJECTION_SELF_ATTENDEE_STATUS_INDEX);
+ }
mIsOrganizer = mCalendarOwnerAccount.equalsIgnoreCase(mEventOrganizerEmail);
if (!TextUtils.isEmpty(mEventOrganizerEmail) &&
@@ -2088,7 +2217,7 @@ void updateResponse(View view) {
// for simplicity).
// TODO Switch to EditEventHelper.canRespond when this class uses CalendarEventModel.
- if (!mCanModifyCalendar || !mHasAttendeeData || (mIsOrganizer && mNumOfAttendees <= 1) ||
+ if (!mCanModifyCalendar || (mHasAttendeeData && mIsOrganizer && mNumOfAttendees <= 1) ||
(mIsOrganizer && !mOwnerCanRespond)) {
setVisibilityCommon(view, R.id.response_container, View.GONE);
return;
@@ -2443,9 +2572,76 @@ protected void onQueryComplete(int token, Object cookie, Cursor cursor) {
startQuery(TOKEN_QUERY_CALENDARS, null, uri, CALENDARS_PROJECTION,
CALENDARS_WHERE, args, null);
break;
+ case TOKEN_QUERY_TASK:
+ mEventCursor = Utils.matrixCursorFromCursor(cursor);
+ if (!initEventCursor()) {
+ displayEventNotFound();
+ return;
+ }
+ if (!mCalendarColorInitialized) {
+ mCalendarColor = Utils.getDisplayColorFromColor(activity,
+ mEventCursor.getInt(EVENT_INDEX_CALENDAR_COLOR));
+ mCalendarColorInitialized = true;
+ }
+
+ if (!mOriginalColorInitialized) {
+ mOriginalColor = mEventCursor.isNull(EVENT_INDEX_EVENT_COLOR)
+ ? mCalendarColor : Utils.getDisplayColorFromColor(activity,
+ mEventCursor.getInt(EVENT_INDEX_EVENT_COLOR));
+ mOriginalColorInitialized = true;
+ }
+
+ if (!mCurrentColorInitialized) {
+ mCurrentColor = mOriginalColor;
+ mCurrentColorInitialized = true;
+ }
+
+ updateEvent(mView);
+ prepareReminders();
+
+ uri = DmfsOpenTasksContract.TaskLists.PROVIDER_URI;
+ args = new String[]{
+ Long.toString(mEventCursor.getLong(EVENT_INDEX_CALENDAR_ID))};
+ startQuery(TOKEN_QUERY_TASK_LIST, null, uri, TASK_LIST_PROJECTION,
+ TASK_LIST_WHERE, args, null);
+
+ break;
case TOKEN_QUERY_CALENDARS:
mCalendarsCursor = Utils.matrixCursorFromCursor(cursor);
- updateCalendar(mView);
+ updateCalendar(mView, false);
+ // FRAG_TODO fragments shouldn't set the title anymore
+ updateTitle();
+
+ args = new String[]{
+ mCalendarsCursor.getString(CALENDARS_INDEX_ACCOUNT_NAME),
+ mCalendarsCursor.getString(CALENDARS_INDEX_ACCOUNT_TYPE)};
+ uri = Colors.CONTENT_URI;
+ startQuery(TOKEN_QUERY_COLORS, null, uri, COLORS_PROJECTION, COLORS_WHERE, args,
+ null);
+
+ if (!mIsBusyFreeCalendar) {
+ args = new String[]{Long.toString(mEventId)};
+
+ // start attendees query
+ uri = Attendees.CONTENT_URI;
+ startQuery(TOKEN_QUERY_ATTENDEES, null, uri, ATTENDEES_PROJECTION,
+ ATTENDEES_WHERE, args, ATTENDEES_SORT_ORDER);
+ } else {
+ sendAccessibilityEventIfQueryDone(TOKEN_QUERY_ATTENDEES);
+ }
+ if (mHasAlarm) {
+ // start reminders query
+ args = new String[]{Long.toString(mEventId)};
+ uri = Reminders.CONTENT_URI;
+ startQuery(TOKEN_QUERY_REMINDERS, null, uri,
+ REMINDERS_PROJECTION, REMINDERS_WHERE, args, null);
+ } else {
+ sendAccessibilityEventIfQueryDone(TOKEN_QUERY_REMINDERS);
+ }
+ break;
+ case TOKEN_QUERY_TASK_LIST:
+ mCalendarsCursor = Utils.matrixCursorFromCursor(cursor);
+ updateCalendar(mView, true);
// FRAG_TODO fragments shouldn't set the title anymore
updateTitle();
@@ -2543,6 +2739,21 @@ protected void onQueryComplete(int token, Object cookie, Cursor cursor) {
mCurrentQuery |= TOKEN_QUERY_DUPLICATE_CALENDARS;
}
break;
+ case TOKEN_QUERY_VISIBLE_TASK_LIST:
+ if (cursor.getCount() > 1) {
+ // Start duplicate calendars query to detect whether to add the calendar
+ // email to the calendar owner display.
+ String displayName = mCalendarsCursor.getString(CALENDARS_INDEX_DISPLAY_NAME);
+ mHandler.startQuery(TOKEN_QUERY_DUPLICATE_TASK_LIST, null,
+ DmfsOpenTasksContract.TaskLists.PROVIDER_URI, TASK_LIST_PROJECTION,
+ TASK_LIST_DUPLICATE_NAME_WHERE, new String[]{displayName}, null);
+ } else {
+ // Don't need to display the calendar owner when there is only a single
+ // calendar. Skip the duplicate calendars query.
+ setVisibilityCommon(mView, R.id.calendar_container, View.GONE);
+ mCurrentQuery |= TOKEN_QUERY_DUPLICATE_TASK_LIST;
+ }
+ break;
case TOKEN_QUERY_DUPLICATE_CALENDARS:
SpannableStringBuilder sb = new SpannableStringBuilder();
@@ -2561,6 +2772,24 @@ protected void onQueryComplete(int token, Object cookie, Cursor cursor) {
setVisibilityCommon(mView, R.id.calendar_container, View.VISIBLE);
mCalendarName.setText(sb);
break;
+ case TOKEN_QUERY_DUPLICATE_TASK_LIST:
+ sb = new SpannableStringBuilder();
+
+ // Calendar display name
+ calendarName = mCalendarsCursor.getString(CALENDARS_INDEX_DISPLAY_NAME);
+ sb.append(calendarName);
+
+ // Show email account if display name is not unique and
+ // display name != email
+ email = mCalendarsCursor.getString(CALENDARS_INDEX_OWNER_ACCOUNT);
+ if (cursor.getCount() > 1 && !calendarName.equalsIgnoreCase(email) &&
+ Utils.isValidEmail(email)) {
+ sb.append(" (").append(email).append(")");
+ }
+
+ setVisibilityCommon(mView, R.id.calendar_container, View.VISIBLE);
+ setTextCommon(mView, R.id.calendar_name, sb);
+ break;
}
cursor.close();
sendAccessibilityEventIfQueryDone(token);
diff --git a/app/src/main/java/com/android/calendar/GoogleCalendarUriIntentFilter.java b/app/src/main/java/com/android/calendar/GoogleCalendarUriIntentFilter.java
index 68d9bd1cef..d2e8e6d051 100644
--- a/app/src/main/java/com/android/calendar/GoogleCalendarUriIntentFilter.java
+++ b/app/src/main/java/com/android/calendar/GoogleCalendarUriIntentFilter.java
@@ -199,7 +199,7 @@ protected void onCreate(Bundle icicle) {
continue;
}
} catch (DateException e) {
- if (debug) Log.d(TAG, "duration:" + e);
+ if (debug) Log.d(TAG, "duration:" + e.toString());
continue;
}
}
diff --git a/app/src/main/java/com/android/calendar/ImportActivity.java b/app/src/main/java/com/android/calendar/ImportActivity.java
index fa89b44579..cd76ac867e 100644
--- a/app/src/main/java/com/android/calendar/ImportActivity.java
+++ b/app/src/main/java/com/android/calendar/ImportActivity.java
@@ -181,13 +181,9 @@ private void parseCalFile() {
String dtEnd = firstEvent.getProperty(VEvent.DTEND);
String dtEndParam = firstEvent.getPropertyParameters(VEvent.DTEND);
- if (dtEnd != null && !TextUtils.isEmpty(dtEnd)) {
+ if (!TextUtils.isEmpty(dtEnd)) {
calIntent.putExtra(CalendarContract.EXTRA_EVENT_END_TIME,
getLocalTimeFromString(dtEnd, dtEndParam));
- } else {
- // Treat start date as end date if un-specified
- dtEnd = dtStart;
- dtEndParam = dtStartParam;
}
boolean isAllDay = getLocalTimeFromString(dtEnd, dtEndParam)
diff --git a/app/src/main/java/com/android/calendar/SearchActivity.java b/app/src/main/java/com/android/calendar/SearchActivity.java
index 78d9450e5d..4243bad206 100644
--- a/app/src/main/java/com/android/calendar/SearchActivity.java
+++ b/app/src/main/java/com/android/calendar/SearchActivity.java
@@ -18,6 +18,8 @@
import static android.provider.CalendarContract.EXTRA_EVENT_BEGIN_TIME;
import static android.provider.CalendarContract.EXTRA_EVENT_END_TIME;
+import android.app.FragmentManager;
+import android.app.FragmentTransaction;
import android.app.SearchManager;
import android.content.BroadcastReceiver;
import android.content.ContentResolver;
@@ -38,8 +40,6 @@
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.SearchView;
import androidx.core.view.MenuItemCompat;
-import androidx.fragment.app.FragmentManager;
-import androidx.fragment.app.FragmentTransaction;
import com.android.calendar.CalendarController.EventInfo;
import com.android.calendar.CalendarController.EventType;
@@ -165,7 +165,7 @@ protected void onDestroy() {
}
private void initFragments(long timeMillis, String query) {
- FragmentManager fragmentManager = getSupportFragmentManager();
+ FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction ft = fragmentManager.beginTransaction();
AgendaFragment searchResultsFragment = new AgendaFragment(timeMillis, true);
@@ -180,7 +180,7 @@ private void initFragments(long timeMillis, String query) {
private void showEventInfo(EventInfo event) {
if (mShowEventDetailsWithAgenda) {
- FragmentManager fragmentManager = getSupportFragmentManager();
+ FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction ft = fragmentManager.beginTransaction();
mEventInfoFragment = new EventInfoFragment(this, event.id,
@@ -230,7 +230,7 @@ private void deleteEvent(long eventId, long startMillis, long endMillis) {
mDeleteEventHelper.delete(startMillis, endMillis, eventId, -1);
if (mIsMultipane && mEventInfoFragment != null
&& eventId == mCurrentEventId) {
- FragmentManager fragmentManager = getSupportFragmentManager();
+ FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction ft = fragmentManager.beginTransaction();
ft.remove(mEventInfoFragment);
ft.commit();
diff --git a/app/src/main/java/com/android/calendar/Utils.java b/app/src/main/java/com/android/calendar/Utils.java
index 119f4ddff1..135f9c81f3 100644
--- a/app/src/main/java/com/android/calendar/Utils.java
+++ b/app/src/main/java/com/android/calendar/Utils.java
@@ -21,7 +21,6 @@
import android.Manifest;
import android.accounts.Account;
import android.app.Activity;
-import android.app.AlarmManager;
import android.app.PendingIntent;
import android.app.SearchManager;
import android.content.BroadcastReceiver;
@@ -55,7 +54,6 @@
import android.widget.Toast;
import androidx.annotation.NonNull;
-import androidx.annotation.RequiresApi;
import androidx.appcompat.widget.SearchView;
import androidx.core.content.ContextCompat;
import androidx.core.graphics.ColorUtils;
@@ -207,26 +205,6 @@ public class Utils {
private static boolean mAllowWeekForDetailView = false;
private static String sVersion = null;
- @RequiresApi(api = Build.VERSION_CODES.S)
- public static boolean canScheduleAlarms(Context context) {
- AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
- return alarmManager.canScheduleExactAlarms();
- }
-
- /**
- * Returns whether the SDK is the UpsideDownCake release or later.
- */
- public static boolean isUpsideDownCakeOrLater() {
- return Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE;
- }
-
- /**
- * Returns whether the SDK is the Q release or later.
- */
- public static boolean isQOrLater() {
- return Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q;
- }
-
/**
* Returns whether the SDK is the Oreo release or later.
*/
@@ -234,13 +212,6 @@ public static boolean isOreoOrLater() {
return Build.VERSION.SDK_INT >= Build.VERSION_CODES.O;
}
- /**
- * Returns whether the SDK is the Marshmallow release or later.
- */
- public static boolean isMOrLater() {
- return Build.VERSION.SDK_INT >= Build.VERSION_CODES.M;
- }
-
/**
* Returns whether the system supports Material You.
*
@@ -822,9 +793,8 @@ public static long convertAlldayUtcToLocal(Time recycle, long utcTime, String tz
}
recycle.setTimezone(Time.TIMEZONE_UTC);
recycle.set(utcTime);
- Time target = new Time(tz);
- target.set(0, 0, 0, recycle.getDay(), recycle.getMonth(), recycle.getYear());
- return target.normalize();
+ recycle.setTimezone(tz);
+ return recycle.normalize();
}
public static long convertAlldayLocalToUTC(Time recycle, long localTime, String tz) {
@@ -833,9 +803,8 @@ public static long convertAlldayLocalToUTC(Time recycle, long localTime, String
}
recycle.setTimezone(tz);
recycle.set(localTime);
- Time target = new Time(Time.TIMEZONE_UTC);
- target.set(0, 0, 0, recycle.getDay(), recycle.getMonth(), recycle.getYear());
- return target.normalize();
+ recycle.setTimezone(Time.TIMEZONE_UTC);
+ return recycle.normalize();
}
/**
@@ -1182,7 +1151,7 @@ public static HashMap createDNAStrands(int firstJulianDay,
segments.add(i + 1, rhs);
strands.get(rhs.color).count++;
if (DEBUG) {
- Log.d(TAG, "Added rhs, curr:" + currSegment + " i:"
+ Log.d(TAG, "Added rhs, curr:" + currSegment.toString() + " i:"
+ segments.get(i).toString());
}
}
@@ -1201,7 +1170,7 @@ public static HashMap createDNAStrands(int firstJulianDay,
segments.add(i++, lhs);
strands.get(lhs.color).count++;
if (DEBUG) {
- Log.d(TAG, "Added lhs, curr:" + currSegment + " i:"
+ Log.d(TAG, "Added lhs, curr:" + currSegment.toString() + " i:"
+ segments.get(i).toString());
}
}
@@ -1346,7 +1315,7 @@ private static int getPixelOffsetFromMinutes(int minute, int workDayHeight,
private static void addNewSegment(LinkedList segments, Event event,
HashMap strands, int firstJulianDay, int minStart, int minMinutes) {
if (event.startDay > event.endDay) {
- Log.wtf(TAG, "Event starts after it ends: " + event);
+ Log.wtf(TAG, "Event starts after it ends: " + event.toString());
}
// If this is a multiday event split it up by day
if (event.startDay != event.endDay) {
@@ -1787,7 +1756,7 @@ public static BroadcastReceiver setTimeChangesReceiver(Context c, Runnable callb
filter.addAction(Intent.ACTION_LOCALE_CHANGED);
CalendarBroadcastReceiver r = new CalendarBroadcastReceiver(callback);
- ContextCompat.registerReceiver(c, r, filter, ContextCompat.RECEIVER_NOT_EXPORTED);
+ c.registerReceiver(r, filter);
return r;
}
@@ -1985,7 +1954,7 @@ public static Spannable extendedLinkify(String text, boolean lastDitchGeo) {
dialBuilder.append(ch);
}
}
- URLSpan span = new URLSpan("tel:" + dialBuilder);
+ URLSpan span = new URLSpan("tel:" + dialBuilder.toString());
spanText.setSpan(span, start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
phoneCount++;
@@ -2275,18 +2244,4 @@ public static boolean isCalendarPermissionGranted(Context context, boolean showW
}
}
- /**
- * Change a Time object to be the same (year, month, day, hour, minute, second) tuple
- * but in another timezone
- *
- * @param t The Time object to modify
- * @param timezone the new timezone
- */
- public static void changeTimezoneOnly(Time t, String timezone) {
- Time pivot = new Time(timezone);
- pivot.set(t.getSecond(), t.getMinute(), t.getHour(),
- t.getDay(), t.getMonth(), t.getYear());
- t.set(pivot);
- }
-
}
diff --git a/app/src/main/java/com/android/calendar/agenda/AgendaAdapter.java b/app/src/main/java/com/android/calendar/agenda/AgendaAdapter.java
index 331c3d7368..ee230e3610 100644
--- a/app/src/main/java/com/android/calendar/agenda/AgendaAdapter.java
+++ b/app/src/main/java/com/android/calendar/agenda/AgendaAdapter.java
@@ -36,6 +36,7 @@
import com.android.calendar.Utils;
import com.android.calendarcommon2.Time;
+import java.util.Calendar;
import java.util.Formatter;
import java.util.Locale;
import java.util.TimeZone;
@@ -178,6 +179,13 @@ public void bindView(View view, Context context, Cursor cursor) {
// When
long begin = cursor.getLong(AgendaWindowAdapter.INDEX_BEGIN);
long end = cursor.getLong(AgendaWindowAdapter.INDEX_END);
+ String type = cursor.getString(AgendaWindowAdapter.INDEX_TYPE);
+ if (type.equals("task")) {
+ Calendar instance = Calendar.getInstance();
+ instance.setTimeInMillis(end);
+ instance.add(Calendar.MINUTE, -30);
+ begin = instance.getTimeInMillis();
+ }
String eventTz = cursor.getString(AgendaWindowAdapter.INDEX_TIME_ZONE);
int flags = 0;
String whenString;
diff --git a/app/src/main/java/com/android/calendar/agenda/AgendaByDayAdapter.java b/app/src/main/java/com/android/calendar/agenda/AgendaByDayAdapter.java
index ef339bb36f..ddcbedde8b 100644
--- a/app/src/main/java/com/android/calendar/agenda/AgendaByDayAdapter.java
+++ b/app/src/main/java/com/android/calendar/agenda/AgendaByDayAdapter.java
@@ -33,6 +33,7 @@
import com.android.calendarcommon2.Time;
import java.util.ArrayList;
+import java.util.Calendar;
import java.util.Formatter;
import java.util.Iterator;
import java.util.LinkedList;
@@ -299,10 +300,25 @@ public void calculateDays(DayAdapterInfo dayAdapterInfo) {
LinkedList multipleDayList = new LinkedList();
for (int position = 0; cursor.moveToNext(); position++) {
- int startDay = cursor.getInt(AgendaWindowAdapter.INDEX_START_DAY);
+ int startDay;
+ int endDay;
+ long startTime;
+ long endTime;
+ if (dayAdapterInfo.isTask) {
+ long endMills = cursor.getLong(AgendaWindowAdapter.INDEX_END);
+ startDay = Time.getJulianDay(endMills, new Time().getGmtOffset());
+ endDay = Time.getJulianDay(endMills, new Time().getGmtOffset());
+ endTime = endMills;
+ Calendar instance = Calendar.getInstance();
+ instance.add(Calendar.MINUTE, -30);
+ startTime = instance.getTimeInMillis();
+ } else {
+ startDay = cursor.getInt(AgendaWindowAdapter.INDEX_START_DAY);
+ endDay = cursor.getInt(AgendaWindowAdapter.INDEX_END_DAY);
+ startTime = cursor.getLong(AgendaWindowAdapter.INDEX_BEGIN);
+ endTime = cursor.getLong(AgendaWindowAdapter.INDEX_END);
+ }
long id = cursor.getLong(AgendaWindowAdapter.INDEX_EVENT_ID);
- long startTime = cursor.getLong(AgendaWindowAdapter.INDEX_BEGIN);
- long endTime = cursor.getLong(AgendaWindowAdapter.INDEX_END);
long instanceId = cursor.getLong(AgendaWindowAdapter.INDEX_INSTANCE_ID);
boolean allDay = cursor.getInt(AgendaWindowAdapter.INDEX_ALL_DAY) != 0;
if (allDay) {
@@ -365,10 +381,6 @@ public void calculateDays(DayAdapterInfo dayAdapterInfo) {
prevStartDay = startDay;
}
- // If this event spans multiple days, then add it to the multipleDay
- // list.
- int endDay = cursor.getInt(AgendaWindowAdapter.INDEX_END_DAY);
-
// Skip over the days outside of the adapter's range
endDay = Math.min(endDay, dayAdapterInfo.end);
if (endDay > startDay) {
diff --git a/app/src/main/java/com/android/calendar/agenda/AgendaFragment.java b/app/src/main/java/com/android/calendar/agenda/AgendaFragment.java
index 0b1091d3a6..1f0677e37b 100644
--- a/app/src/main/java/com/android/calendar/agenda/AgendaFragment.java
+++ b/app/src/main/java/com/android/calendar/agenda/AgendaFragment.java
@@ -17,6 +17,9 @@
package com.android.calendar.agenda;
import android.app.Activity;
+import android.app.Fragment;
+import android.app.FragmentManager;
+import android.app.FragmentTransaction;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.provider.CalendarContract.Attendees;
@@ -29,10 +32,6 @@
import android.widget.Adapter;
import android.widget.HeaderViewListAdapter;
-import androidx.fragment.app.Fragment;
-import androidx.fragment.app.FragmentManager;
-import androidx.fragment.app.FragmentTransaction;
-
import com.android.calendar.CalendarController;
import com.android.calendar.CalendarController.EventInfo;
import com.android.calendar.CalendarController.EventType;
@@ -83,6 +82,8 @@ public void run() {
private long mLastHandledEventId = -1;
private Time mLastHandledEventTime = null;
+ public boolean isTask = false;
+
public AgendaFragment() {
this(0, false);
}
@@ -128,7 +129,7 @@ public void onCreate(Bundle icicle) {
if (prevTime != -1) {
mTime.set(prevTime);
if (DEBUG) {
- Log.d(TAG, "Restoring time to " + mTime);
+ Log.d(TAG, "Restoring time to " + mTime.toString());
}
}
}
@@ -166,10 +167,12 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container,
lv.setAdapter(a);
if (a instanceof HeaderViewListAdapter) {
mAdapter = (AgendaWindowAdapter) ((HeaderViewListAdapter)a).getWrappedAdapter();
+ mAdapter.isTask = isTask;
lv.setIndexer(mAdapter);
lv.setHeaderHeightListener(mAdapter);
} else if (a instanceof AgendaWindowAdapter) {
mAdapter = (AgendaWindowAdapter)a;
+ mAdapter.isTask = isTask;
lv.setIndexer(mAdapter);
lv.setHeaderHeightListener(mAdapter);
} else {
@@ -214,6 +217,13 @@ public void onResume() {
getActivity());
boolean hideDeclined = prefs.getBoolean(
GeneralPreferences.KEY_HIDE_DECLINED, false);
+ AgendaWindowAdapter.AgendaItem item = mAgendaListView.getFirstVisibleAgendaItem();
+ if (item!=null && item.isTask) {
+ Time t = new Time(mTimeZone);
+ t.set(item.end);
+ mController.setTime(item.end);
+ mTime.set(t.toMillis());
+ }
mAgendaListView.setHideDeclinedEvents(hideDeclined);
if (mLastHandledEventId != -1) {
@@ -388,7 +398,7 @@ private void showEventInfo(EventInfo event, boolean allDay, boolean replaceFragm
// Create a fragment to show the event to the side of the agenda list
if (mShowEventDetailsWithAgenda) {
- FragmentManager fragmentManager = getParentFragmentManager();
+ FragmentManager fragmentManager = getFragmentManager();
if (fragmentManager == null) {
// Got a goto event before the fragment finished attaching,
// stash the event and handle it later.
@@ -457,6 +467,7 @@ public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCoun
Time t = new Time(mTimeZone);
t.setJulianDay(mJulianDayOnTop);
mController.setTime(t.toMillis());
+ mTime.set(t.toMillis());
// Cannot sent a message that eventually may change the layout of the views
// so instead post a runnable that will run when the layout is done
if (!mIsTabletConfig) {
diff --git a/app/src/main/java/com/android/calendar/agenda/AgendaListView.java b/app/src/main/java/com/android/calendar/agenda/AgendaListView.java
index cac2cce019..180ce77bdd 100644
--- a/app/src/main/java/com/android/calendar/agenda/AgendaListView.java
+++ b/app/src/main/java/com/android/calendar/agenda/AgendaListView.java
@@ -37,6 +37,8 @@
import com.android.calendar.agenda.AgendaWindowAdapter.DayAdapterInfo;
import com.android.calendarcommon2.Time;
+import java.util.Calendar;
+
import ws.xsoh.etar.R;
public class AgendaListView extends ListView implements OnItemClickListener {
@@ -182,6 +184,13 @@ public void onItemClick(AdapterView> a, View v, int position, long id) {
!mShowEventDetailsWithAgenda)) {
long startTime = item.begin;
long endTime = item.end;
+ // task has startTime = 0. so we recalculate as -30 muntes from end time for reference
+ if (item.isTask) {
+ Calendar instance = Calendar.getInstance();
+ instance.setTimeInMillis(endTime);
+ instance.add(Calendar.MINUTE, -30);
+ startTime = instance.getTimeInMillis();
+ }
// Holder in view holds the start of the specific part of a multi-day event ,
// use it for the goto
long holderStartTime;
@@ -197,7 +206,11 @@ public void onItemClick(AdapterView> a, View v, int position, long id) {
}
mTime.set(startTime);
CalendarController controller = CalendarController.getInstance(mContext);
- controller.sendEventRelatedEventWithExtra(this, EventType.VIEW_EVENT, item.id,
+ long eventType = EventType.VIEW_EVENT;
+ if (item.isTask) {
+ eventType = EventType.VIEW_TASK;
+ }
+ controller.sendEventRelatedEventWithExtra(this, eventType, item.id,
startTime, endTime, 0, 0, CalendarController.EventInfo.buildViewExtraLong(
Attendees.ATTENDEE_STATUS_NONE, item.allDay), holderStartTime);
}
@@ -281,7 +294,7 @@ public long getFirstVisibleTime(AgendaItem item) {
t.setSecond(second);
if (DEBUG) {
t.normalize();
- Log.d(TAG, "first position had time " + t);
+ Log.d(TAG, "first position had time " + t.toString());
}
return t.normalize();
}
diff --git a/app/src/main/java/com/android/calendar/agenda/AgendaWindowAdapter.java b/app/src/main/java/com/android/calendar/agenda/AgendaWindowAdapter.java
index 97bd4d792c..afe4ce11f7 100644
--- a/app/src/main/java/com/android/calendar/agenda/AgendaWindowAdapter.java
+++ b/app/src/main/java/com/android/calendar/agenda/AgendaWindowAdapter.java
@@ -43,8 +43,10 @@
import com.android.calendar.CalendarController;
import com.android.calendar.CalendarController.EventType;
import com.android.calendar.CalendarController.ViewType;
+import com.android.calendar.Event;
import com.android.calendar.StickyHeaderListView;
import com.android.calendar.Utils;
+import com.android.calendar.persistence.tasks.DmfsOpenTasksContract;
import com.android.calendarcommon2.Time;
import java.util.Date;
@@ -93,6 +95,7 @@ public class AgendaWindowAdapter extends BaseAdapter
public static final int INDEX_OWNER_ACCOUNT = 15;
public static final int INDEX_CAN_ORGANIZER_RESPOND= 16;
public static final int INDEX_TIME_ZONE = 17;
+ public static final int INDEX_TYPE = 18;
static final boolean BASICLOG = false;
static final boolean DEBUGLOG = false;
private static final String TAG = "AgendaWindowAdapter";
@@ -119,6 +122,29 @@ public class AgendaWindowAdapter extends BaseAdapter
Instances.OWNER_ACCOUNT, // 15
Instances.CAN_ORGANIZER_RESPOND, // 16
Instances.EVENT_TIMEZONE, // 17
+ "'event' as type"
+ };
+
+ public static final String[] TASK_PROJECTION = new String[]{
+ DmfsOpenTasksContract.Tasks.COLUMN_ID, // 0
+ DmfsOpenTasksContract.Tasks.COLUMN_TITLE, // 1
+ DmfsOpenTasksContract.Tasks.COLUMN_LOCATION, // 2
+ DmfsOpenTasksContract.Tasks.COLUMN_IS_ALLDAY, // 3
+ DmfsOpenTasksContract.Tasks.COLUMN_HAS_ALLARMS, // 4
+ DmfsOpenTasksContract.Tasks.COLUMN_LIST_COLOR, // 5
+ DmfsOpenTasksContract.Tasks.COLUMN_RRULE, // 6
+ DmfsOpenTasksContract.Tasks.COLUMN_START_DATE, // 7
+ DmfsOpenTasksContract.Tasks.COLUMN_DUE_DATE, // 8
+ DmfsOpenTasksContract.Tasks.COLUMN_ID, // 9
+ DmfsOpenTasksContract.Tasks.COLUMN_START_DATE, // 10
+ DmfsOpenTasksContract.Tasks.COLUMN_DUE_DATE, // 11
+ DmfsOpenTasksContract.Tasks.COLUMN_STATUS, // 12
+ "0>0", // 13
+ DmfsOpenTasksContract.Tasks.COLUMN_ACCOUNT_NAME, // 14
+ DmfsOpenTasksContract.Tasks.COLUMN_ACCOUNT_NAME, // 15
+ "0>0", // 16
+ DmfsOpenTasksContract.Tasks.COLUMN_TZ, // 17
+ "'task' as type" // task
};
// Listview may have a bug where the index/position is not consistent when there's a header.
// position == positionInListView - OFF_BY_ONE_BUG
@@ -211,6 +237,8 @@ public void run() {
private long mSelectedInstanceId = -1;
private AgendaAdapter.ViewHolder mSelectedVH = null;
+ public boolean isTask = false;
+
public AgendaWindowAdapter(Context context,
AgendaListView agendaListView, boolean showEventOnStart) {
mContext = context;
@@ -505,6 +533,7 @@ public AgendaItem getAgendaItemByPosition(final int positionInListView,
if (cursorPosition < info.cursor.getCount()) {
AgendaItem item = buildAgendaItemFromCursor(info.cursor, cursorPosition, isDayHeader);
+ item.isTask = info.isTask;
if (!returnEventStartDay && !isDayHeader) {
item.startDay = info.dayAdapter.findJulianDayFromPosition(positionInAdapter -
info.offset);
@@ -567,8 +596,12 @@ private void sendViewEvent(AgendaItem item, long selectedTime) {
if (DEBUGLOG) {
Log.d(TAG, "Sent (AgendaWindowAdapter): VIEW EVENT: " + new Date(startTime));
}
+ long eventType = EventType.VIEW_EVENT;
+ if (item.isTask) {
+ eventType = EventType.VIEW_TASK;
+ }
CalendarController.getInstance(mContext)
- .sendEventRelatedEventWithExtra(this, EventType.VIEW_EVENT,
+ .sendEventRelatedEventWithExtra(this, eventType,
item.id, startTime, endTime, 0,
0, CalendarController.EventInfo.buildViewExtraLong(
Attendees.ATTENDEE_STATUS_NONE,
@@ -710,6 +743,19 @@ private String buildQuerySelection() {
}
}
+ private String buildQuerySelectionForTasks(QuerySpec queryData) {
+ long startMills = Event.getMillsFromJulian(queryData.start, true);
+ long endMills = Event.getMillsFromJulian(queryData.end, false);
+
+ return DmfsOpenTasksContract.Tasks.COLUMN_STATUS + Event.NOT_EQUALS +
+ DmfsOpenTasksContract.Tasks.STATUS_COMPLETED + Event.AND_BRACKET +
+ DmfsOpenTasksContract.Tasks.COLUMN_DUE_DATE + Event.LTE + endMills +
+ Event.CLOSING_BRACKET + Event.AND_BRACKET + DmfsOpenTasksContract.Tasks.COLUMN_DUE_DATE +
+ Event.GTE + startMills + Event.CLOSING_BRACKET + Event.AND_BRACKET +
+ DmfsOpenTasksContract.Tasks.COLUMN_VISIBLE + " = 1" + Event.CLOSING_BRACKET +
+ Event.AND_BRACKET + DmfsOpenTasksContract.Tasks.COLUMN_DUE_DATE + " != 0" + Event.CLOSING_BRACKET;
+ }
+
private Uri buildQueryUri(int start, int end, String searchQuery) {
Uri rootUri = searchQuery == null ?
Instances.CONTENT_BY_DAY_URI :
@@ -817,18 +863,26 @@ private void doQuery(QuerySpec queryData) {
time.setJulianDay(queryData.start);
Time time2 = new Time(mTimeZone);
time2.setJulianDay(queryData.end);
- Log.v(TAG, "startQuery: " + time + " to "
- + time2 + " then go to " + queryData.goToTime);
+ Log.v(TAG, "startQuery: " + time.toString() + " to "
+ + time2.toString() + " then go to " + queryData.goToTime);
}
mQueryHandler.cancelOperation(0);
if (BASICLOG) queryData.queryStartMillis = System.nanoTime();
- Uri queryUri = buildQueryUri(
- queryData.start, queryData.end, queryData.searchQuery);
- mQueryHandler.startQuery(0, queryData, queryUri,
- PROJECTION, buildQuerySelection(), null,
- AGENDA_SORT_ORDER);
+ //query tasks
+ if (isTask) {
+ queryData.isTask = true;
+ mQueryHandler.startQuery(1, queryData, DmfsOpenTasksContract.Tasks.PROVIDER_URI,
+ TASK_PROJECTION, buildQuerySelectionForTasks(queryData),
+ null, "due ASC, title ASC");
+ } else {
+ Uri queryUri = buildQueryUri(
+ queryData.start, queryData.end, queryData.searchQuery);
+ mQueryHandler.startQuery(0, queryData, queryUri,
+ PROJECTION, buildQuerySelection(), null,
+ AGENDA_SORT_ORDER);
+ }
}
private String formatDateString(int julianDay) {
@@ -969,6 +1023,8 @@ private static class QuerySpec {
int queryType;
long id;
+ boolean isTask = false;
+
public QuerySpec(int queryType) {
this.queryType = queryType;
id = -1;
@@ -1031,6 +1087,8 @@ static class AgendaItem {
long id;
int startDay;
boolean allDay;
+
+ boolean isTask;
}
static class DayAdapterInfo {
@@ -1041,6 +1099,8 @@ static class DayAdapterInfo {
int offset; // offset in position in the list view
int size; // dayAdapter.getCount()
+ boolean isTask = false;
+
public DayAdapterInfo(Context context) {
dayAdapter = new AgendaByDayAdapter(context);
}
@@ -1053,10 +1113,10 @@ public String toString() {
StringBuilder sb = new StringBuilder();
time.setJulianDay(start);
time.normalize();
- sb.append("Start:").append(time);
+ sb.append("Start:").append(time.toString());
time.setJulianDay(end);
time.normalize();
- sb.append(" End:").append(time);
+ sb.append(" End:").append(time.toString());
sb.append(" Offset:").append(offset);
sb.append(" Size:").append(size);
return sb.toString();
@@ -1191,6 +1251,7 @@ protected void onQueryComplete(int token, Object cookie, Cursor cursor) {
if (tempCursor != null) {
AgendaItem item = buildAgendaItemFromCursor(tempCursor, tempCursorPosition,
false);
+ item.isTask = data.isTask;
long selectedTime = findStartTimeFromPosition(newPosition);
if (DEBUGLOG) {
Log.d(TAG, "onQueryComplete: Sending View Event...");
@@ -1358,6 +1419,7 @@ private int processNewCursor(QuerySpec data, Cursor cursor) {
}
// Setup adapter info
+ info.isTask = data.isTask;
info.start = data.start;
info.end = data.end;
info.cursor = cursor;
diff --git a/app/src/main/java/com/android/calendar/alerts/AlertReceiver.java b/app/src/main/java/com/android/calendar/alerts/AlertReceiver.java
index 2af76a4dea..39eea23af9 100644
--- a/app/src/main/java/com/android/calendar/alerts/AlertReceiver.java
+++ b/app/src/main/java/com/android/calendar/alerts/AlertReceiver.java
@@ -17,6 +17,8 @@
package com.android.calendar.alerts;
+import static com.android.calendar.alerts.AlertService.ALERT_CHANNEL_ID;
+
import android.app.Notification;
import android.app.PendingIntent;
import android.app.Service;
@@ -47,8 +49,6 @@
import android.util.Log;
import android.widget.Toast;
-import androidx.annotation.Nullable;
-
import com.android.calendar.DynamicTheme;
import com.android.calendar.Utils;
import com.android.calendar.alerts.AlertService.NotificationWrapper;
@@ -132,21 +132,14 @@ public static void beginStartingService(Context context, Intent intent) {
}
mStartingService.acquire();
- if (Utils.isMOrLater()) {
- if (pm.isIgnoringBatteryOptimizations(context.getPackageName())) {
- if (Utils.isOreoOrLater()) {
- if (Utils.isUpsideDownCakeOrLater() && !Utils.canScheduleAlarms(context)) {
- return;
- }
- context.startForegroundService(intent);
- } else {
- context.startService(intent);
- }
+ if (pm.isIgnoringBatteryOptimizations(context.getPackageName())) {
+ if (Utils.isOreoOrLater()) {
+ context.startForegroundService(intent);
} else {
- Log.d(TAG, "Battery optimizations are not disabled");
+ context.startService(intent);
}
} else {
- context.startService(intent);
+ Log.d(TAG, "Battery optimizations are not disabled");
}
}
}
@@ -199,16 +192,8 @@ private static PendingIntent createDismissAlarmsIntent(Context context, long eve
return PendingIntent.getService(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT | Utils.PI_FLAG_IMMUTABLE);
}
- // if default snooze minute < 0, means the snooze option is disable
- // in this case return null as intent
- @Nullable
private static PendingIntent createSnoozeIntent(Context context, long eventId,
long startMillis, long endMillis, int notificationId) {
-
- if (Utils.getDefaultSnoozeDelayMs(context) < 0L) {
- return null;
- }
-
Intent intent = new Intent();
intent.putExtra(AlertUtils.EVENT_ID_KEY, eventId);
intent.putExtra(AlertUtils.EVENT_START_KEY, startMillis);
@@ -238,10 +223,10 @@ private static PendingIntent createAlertActivityIntent(Context context) {
}
public static NotificationWrapper makeBasicNotification(Context context, String title,
- String summaryText, long startMillis, long endMillis, long eventId, long calendarId,
+ String summaryText, long startMillis, long endMillis, long eventId,
int notificationId, boolean doPopup, int priority) {
Notification n = buildBasicNotification(new Notification.Builder(context),
- context, title, summaryText, startMillis, endMillis, eventId, calendarId, notificationId,
+ context, title, summaryText, startMillis, endMillis, eventId, notificationId,
doPopup, priority, false);
return new NotificationWrapper(n, notificationId, eventId, startMillis, endMillis, doPopup);
}
@@ -255,7 +240,7 @@ public static boolean isResolveIntent(Context context, Intent intent) {
private static Notification buildBasicNotification(Notification.Builder notificationBuilder,
Context context, String title, String summaryText, long startMillis, long endMillis,
- long eventId, long calendarId, int notificationId, boolean doPopup, int priority,
+ long eventId, int notificationId, boolean doPopup, int priority,
boolean addActionButtons) {
Resources resources = context.getResources();
if (title == null || title.length() == 0) {
@@ -274,7 +259,7 @@ private static Notification buildBasicNotification(Notification.Builder notifica
// Create the base notification.
notificationBuilder.setContentTitle(title);
notificationBuilder.setContentText(summaryText);
- notificationBuilder.setSmallIcon(R.drawable.stat_notify_calendar_events);
+ notificationBuilder.setSmallIcon(R.drawable.stat_notify_calendar);
int color = DynamicTheme.getColorId(DynamicTheme.getPrimaryColor(context));
notificationBuilder.setColor(context.getResources().getColor(color));
notificationBuilder.setContentIntent(clickIntent);
@@ -282,7 +267,7 @@ private static Notification buildBasicNotification(Notification.Builder notifica
// Add setting channel ID for Oreo or later
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
- notificationBuilder.setChannelId(UtilsKt.channelId(calendarId));
+ notificationBuilder.setChannelId(ALERT_CHANNEL_ID);
}
if (doPopup) {
@@ -354,10 +339,10 @@ private static Notification buildBasicNotification(Notification.Builder notifica
*/
public static NotificationWrapper makeExpandingNotification(Context context, String title,
String summaryText, String description, long startMillis, long endMillis, long eventId,
- long calendarId, int notificationId, boolean doPopup, int priority) {
+ int notificationId, boolean doPopup, int priority) {
Notification.Builder basicBuilder = new Notification.Builder(context);
Notification notification = buildBasicNotification(basicBuilder, context, title,
- summaryText, startMillis, endMillis, eventId, calendarId, notificationId, doPopup,
+ summaryText, startMillis, endMillis, eventId, notificationId, doPopup,
priority, true);
// Create a new-style expanded notification
@@ -778,11 +763,8 @@ private static Intent createCallActivityIntent(Context context, URLSpan[] urlSpa
@Override
public void onReceive(final Context context, final Intent intent) {
- if (context == null || intent.getAction() == null)
- return;
-
if (AlertService.DEBUG) {
- Log.d(TAG, "onReceive: a=" + intent.getAction() + " " + intent);
+ Log.d(TAG, "onReceive: a=" + intent.getAction() + " " + intent.toString());
}
if (MAP_ACTION.equals(intent.getAction())) {
// Try starting the map action.
@@ -855,10 +837,7 @@ public void onReceive(final Context context, final Intent intent) {
}
private void closeNotificationShade(Context context) {
- // https://developer.android.com/about/versions/12/behavior-changes-all#close-system-dialogs
- if (Build.VERSION.SDK_INT < Build.VERSION_CODES.S) {
- Intent closeNotificationShadeIntent = new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
- context.sendBroadcast(closeNotificationShadeIntent);
- }
+ Intent closeNotificationShadeIntent = new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
+ context.sendBroadcast(closeNotificationShadeIntent);
}
}
diff --git a/app/src/main/java/com/android/calendar/alerts/AlertService.java b/app/src/main/java/com/android/calendar/alerts/AlertService.java
index 1caab2322f..dad8c8421e 100644
--- a/app/src/main/java/com/android/calendar/alerts/AlertService.java
+++ b/app/src/main/java/com/android/calendar/alerts/AlertService.java
@@ -16,9 +16,6 @@
package com.android.calendar.alerts;
-import static android.content.pm.ServiceInfo.FOREGROUND_SERVICE_TYPE_DATA_SYNC;
-import static android.content.pm.ServiceInfo.FOREGROUND_SERVICE_TYPE_SYSTEM_EXEMPTED;
-
import android.Manifest;
import android.annotation.TargetApi;
import android.app.Notification;
@@ -51,7 +48,6 @@
import androidx.core.app.NotificationCompat;
import androidx.core.app.NotificationManagerCompat;
-import androidx.core.app.ServiceCompat;
import androidx.core.content.ContextCompat;
import com.android.calendar.Utils;
@@ -70,7 +66,7 @@
*/
public class AlertService extends Service {
- public static final String ALERT_CHANNEL_GROUP_ID = "alert_channel_group_01";
+ public static final String ALERT_CHANNEL_ID = "alert_channel_01";
public static final String FOREGROUND_CHANNEL_ID = "foreground_channel_01";
// Hard limit to the number of notifications displayed.
@@ -89,7 +85,6 @@ public class AlertService extends Service {
CalendarAlerts.BEGIN, // 9
CalendarAlerts.END, // 10
CalendarAlerts.DESCRIPTION, // 11
- CalendarAlerts.CALENDAR_ID, // 12
};
private static final String TAG = "AlertService";
private static final int ALERT_INDEX_ID = 0;
@@ -104,7 +99,6 @@ public class AlertService extends Service {
private static final int ALERT_INDEX_BEGIN = 9;
private static final int ALERT_INDEX_END = 10;
private static final int ALERT_INDEX_DESCRIPTION = 11;
- private static final int ALERT_INDEX_CALENDAR_ID = 12;
private static final String ACTIVE_ALERTS_SELECTION = "(" + CalendarAlerts.STATE + "=? OR "
+ CalendarAlerts.STATE + "=?) AND " + CalendarAlerts.ALARM_TIME + "<=";
private static final String[] ACTIVE_ALERTS_SELECTION_ARGS = new String[] {
@@ -284,7 +278,7 @@ public static boolean generateAlerts(Context context, NotificationMgr nm,
String summaryText = AlertUtils.formatTimeLocation(context, info.startMillis,
info.allDay, info.location);
notification = AlertReceiver.makeBasicNotification(context, info.eventName,
- summaryText, info.startMillis, info.endMillis, info.eventId, info.calendarId,
+ summaryText, info.startMillis, info.endMillis, info.eventId,
AlertUtils.EXPIRED_GROUP_NOTIFICATION_ID, false,
Notification.PRIORITY_MIN);
} else {
@@ -411,7 +405,7 @@ private static void logEventIdsBumped(List list1,
ids.setLength(ids.length() - 1);
}
if (ids.length() > 0) {
- Log.d(TAG, "Reached max postings, bumping event IDs {" + ids
+ Log.d(TAG, "Reached max postings, bumping event IDs {" + ids.toString()
+ "} to digest.");
}
}
@@ -475,7 +469,6 @@ static int processQuery(final Cursor alertCursor, final Context context,
while (alertCursor.moveToNext()) {
final long alertId = alertCursor.getLong(ALERT_INDEX_ID);
final long eventId = alertCursor.getLong(ALERT_INDEX_EVENT_ID);
- final long calendarId = alertCursor.getLong(ALERT_INDEX_CALENDAR_ID);
final int minutes = alertCursor.getInt(ALERT_INDEX_MINUTES);
final String eventName = alertCursor.getString(ALERT_INDEX_TITLE);
final String description = alertCursor.getString(ALERT_INDEX_DESCRIPTION);
@@ -514,7 +507,6 @@ static int processQuery(final Cursor alertCursor, final Context context,
msgBuilder.append("alertCursor result: alarmTime:").append(alarmTime)
.append(" alertId:").append(alertId)
.append(" eventId:").append(eventId)
- .append(" calendarId:").append(calendarId)
.append(" state: ").append(state)
.append(" minutes:").append(minutes)
.append(" declined:").append(declined)
@@ -594,7 +586,7 @@ static int processQuery(final Cursor alertCursor, final Context context,
// TODO: Prefer accepted events in case of ties.
NotificationInfo newInfo = new NotificationInfo(eventName, location,
- description, beginTime, endTime, eventId, calendarId, allDay, newAlert);
+ description, beginTime, endTime, eventId, allDay, newAlert);
// Adjust for all day events to ensure the right bucket. Don't use the 1/4 event
// duration grace period for these.
@@ -711,8 +703,8 @@ private static void postNotification(NotificationInfo info, String summaryText,
String tickerText = getTickerText(info.eventName, info.location);
NotificationWrapper notification = AlertReceiver.makeExpandingNotification(context,
- info.eventName, summaryText, info.description, info.startMillis, info.endMillis,
- info.eventId, info.calendarId, notificationId, prefs.getDoPopup(), priorityVal);
+ info.eventName, summaryText, info.description, info.startMillis,
+ info.endMillis, info.eventId, notificationId, prefs.getDoPopup(), priorityVal);
boolean quietUpdate = true;
String ringtone = NotificationPrefs.EMPTY_RINGTONE;
@@ -932,23 +924,14 @@ public int onStartCommand(Intent intent, int flags, int startId) {
if (intent != null) {
if (Utils.isOreoOrLater()) {
+
createChannels(this);
Notification notification = new NotificationCompat.Builder(this, FOREGROUND_CHANNEL_ID)
.setContentTitle(getString(R.string.foreground_notification_title))
- .setSmallIcon(R.drawable.stat_notify_refresh_events)
+ .setSmallIcon(R.drawable.stat_notify_calendar)
.setShowWhen(false)
.build();
- if (Utils.isQOrLater()) {
- int serviceType;
- if (Utils.isUpsideDownCakeOrLater()) {
- serviceType = FOREGROUND_SERVICE_TYPE_SYSTEM_EXEMPTED;
- } else {
- serviceType = FOREGROUND_SERVICE_TYPE_DATA_SYNC;
- }
- ServiceCompat.startForeground(this, 1337, notification, serviceType);
- } else {
- startForeground(1337, notification);
- }
+ startForeground(1337, notification);
}
Message msg = mServiceHandler.obtainMessage();
@@ -971,13 +954,16 @@ public IBinder onBind(Intent intent) {
public static void createChannels(Context context) {
if (Utils.isOreoOrLater()) {
- NotificationManager nm =
- (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
+ // Create notification channel
+ NotificationMgr nm = new NotificationMgrWrapper(
+ (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE));
- // Create a channel per calendar (so that the user can turn it off with granularity)
- UtilsKt.createPerCalendarChannels(context, nm);
+ NotificationChannel channel = new NotificationChannel(
+ ALERT_CHANNEL_ID,
+ context.getString(R.string.standalone_app_label),
+ NotificationManager.IMPORTANCE_HIGH);
+ channel.enableLights(true);
- // Create a "Background tasks" channel to keep the app alive
NotificationChannel foregroundChannel = new NotificationChannel(
FOREGROUND_CHANNEL_ID,
context.getString(R.string.foreground_notification_channel_name),
@@ -985,6 +971,7 @@ public static void createChannels(Context context) {
foregroundChannel.setDescription(
context.getString(R.string.foreground_notification_channel_description));
+ nm.createNotificationChannel(channel);
nm.createNotificationChannel(foregroundChannel);
}
}
@@ -1056,19 +1043,17 @@ static class NotificationInfo {
long startMillis;
long endMillis;
long eventId;
- long calendarId;
boolean allDay;
boolean newAlert;
NotificationInfo(String eventName, String location, String description, long startMillis,
- long endMillis, long eventId, long calendarId, boolean allDay, boolean newAlert) {
+ long endMillis, long eventId, boolean allDay, boolean newAlert) {
this.eventName = eventName;
this.location = location;
this.description = description;
this.startMillis = startMillis;
this.endMillis = endMillis;
this.eventId = eventId;
- this.calendarId = calendarId;
this.newAlert = newAlert;
this.allDay = allDay;
}
diff --git a/app/src/main/java/com/android/calendar/alerts/DismissAlarmsService.java b/app/src/main/java/com/android/calendar/alerts/DismissAlarmsService.java
index df92df8ef7..37ffb5969c 100644
--- a/app/src/main/java/com/android/calendar/alerts/DismissAlarmsService.java
+++ b/app/src/main/java/com/android/calendar/alerts/DismissAlarmsService.java
@@ -64,7 +64,7 @@ public IBinder onBind(Intent intent) {
@Override
public void onHandleIntent(Intent intent) {
if (AlertService.DEBUG) {
- Log.d(TAG, "onReceive: a=" + intent.getAction() + " " + intent);
+ Log.d(TAG, "onReceive: a=" + intent.getAction() + " " + intent.toString());
}
long eventId = intent.getLongExtra(AlertUtils.EVENT_ID_KEY, -1);
diff --git a/app/src/main/java/com/android/calendar/alerts/SnoozeAlarmsService.java b/app/src/main/java/com/android/calendar/alerts/SnoozeAlarmsService.java
index a72291f953..876768760a 100644
--- a/app/src/main/java/com/android/calendar/alerts/SnoozeAlarmsService.java
+++ b/app/src/main/java/com/android/calendar/alerts/SnoozeAlarmsService.java
@@ -33,7 +33,6 @@
import androidx.core.content.ContextCompat;
import com.android.calendar.Utils;
-import com.android.calendar.settings.GeneralPreferences;
/**
* Service for asynchronously marking a fired alarm as dismissed and scheduling
@@ -94,10 +93,6 @@ public void onHandleIntent(Intent intent) {
resolver.update(uri, dismissValues, selection, null);
// Add a new alarm
- if (snoozeDelay < 0) {
- snoozeDelay = GeneralPreferences.SNOOZE_DELAY_DEFAULT_TIME * 60L * 1000L;
- }
-
long alarmTime = System.currentTimeMillis() + snoozeDelay;
ContentValues values = AlertUtils.makeContentValues(eventId, eventStart, eventEnd,
alarmTime, 0);
diff --git a/app/src/main/java/com/android/calendar/alerts/SnoozeDelayActivity.java b/app/src/main/java/com/android/calendar/alerts/SnoozeDelayActivity.java
index dd228c4e71..41e9d2c323 100644
--- a/app/src/main/java/com/android/calendar/alerts/SnoozeDelayActivity.java
+++ b/app/src/main/java/com/android/calendar/alerts/SnoozeDelayActivity.java
@@ -24,7 +24,6 @@
import android.widget.TimePicker;
import com.android.calendar.Utils;
-import com.android.calendar.settings.GeneralPreferences;
import ws.xsoh.etar.R;
@@ -56,11 +55,6 @@ protected void onPrepareDialog(int id, Dialog d) {
if (id == DIALOG_DELAY) {
TimePickerDialog tpd = (TimePickerDialog) d;
int delayMinutes = (int) (Utils.getDefaultSnoozeDelayMs(this) / (60L * 1000L));
-
- if (delayMinutes < 0) {
- delayMinutes = GeneralPreferences.SNOOZE_DELAY_DEFAULT_TIME;
- }
-
int hours = delayMinutes / 60;
int minutes = delayMinutes % 60;
diff --git a/app/src/main/java/com/android/calendar/alerts/Utils.kt b/app/src/main/java/com/android/calendar/alerts/Utils.kt
deleted file mode 100644
index 30ba68d187..0000000000
--- a/app/src/main/java/com/android/calendar/alerts/Utils.kt
+++ /dev/null
@@ -1,78 +0,0 @@
-package com.android.calendar.alerts
-
-import android.app.NotificationChannel
-import android.app.NotificationChannelGroup
-import android.app.NotificationManager
-import android.content.Context
-import android.os.Build
-import android.provider.CalendarContract
-import androidx.annotation.RequiresApi
-import androidx.core.database.getStringOrNull
-import com.android.calendar.Utils
-import com.android.calendar.alerts.AlertService.ALERT_CHANNEL_GROUP_ID
-import ws.xsoh.etar.R
-
-
-val PROJECTION = arrayOf(
- CalendarContract.Calendars._ID,
- CalendarContract.Calendars.CALENDAR_DISPLAY_NAME,
-)
-
-data class CalendarChannel(val id: Long, val displayName: String?)
-
-fun channelId(id: Long) = "calendar$id"
-
-@RequiresApi(Build.VERSION_CODES.O)
-fun createPerCalendarChannels(context: Context, nm: NotificationManager) {
- val calendars: MutableList = mutableListOf()
-
- // Make sure we have the right permissions to access the calendar list
- if (!Utils.isCalendarPermissionGranted(context, false)) return
-
- context.contentResolver.query(
- CalendarContract.Calendars.CONTENT_URI,
- PROJECTION,
- null,
- null,
- CalendarContract.Calendars.ACCOUNT_NAME
- )?.use {
- while (it.moveToNext()) {
- val id = it.getLong(PROJECTION.indexOf(CalendarContract.Calendars._ID))
- val displayName =
- it.getStringOrNull(PROJECTION.indexOf(CalendarContract.Calendars.CALENDAR_DISPLAY_NAME))
-
- calendars.add(CalendarChannel(id, displayName))
- }
- }
-
- // Make NotificationChannel group for calendars
- nm.createNotificationChannelGroup(
- NotificationChannelGroup(
- ALERT_CHANNEL_GROUP_ID, context.getString(R.string.calendars)
- )
- )
-
- // Fetch list of existing notification channels
- val toDelete = nm.notificationChannels.filter { channel: NotificationChannel ->
- // Only consider the channels of the calendar group
- channel.group == ALERT_CHANNEL_GROUP_ID
- // And only keep those that don't correspond to calendars (so those we want to delete)
- && !calendars.any { channelId(it.id) == channel.id }
- }
-
- // We want to delete these channels because they don't correspond to any calendars (anymore)
- toDelete.forEach { nm.deleteNotificationChannel(it.id) }
-
- val channels = calendars.map {
- NotificationChannel(
- channelId(it.id),
- if (it.displayName.isNullOrBlank()) context.getString(R.string.preferences_calendar_no_display_name) else it.displayName,
- NotificationManager.IMPORTANCE_HIGH
- ).apply {
- enableLights(true)
- group = ALERT_CHANNEL_GROUP_ID
- }
- }
-
- channels.forEach { nm.createNotificationChannel(it) }
-}
diff --git a/app/src/main/java/com/android/calendar/event/CreateEventDialogFragment.java b/app/src/main/java/com/android/calendar/event/CreateEventDialogFragment.java
index 4303262018..1922918939 100644
--- a/app/src/main/java/com/android/calendar/event/CreateEventDialogFragment.java
+++ b/app/src/main/java/com/android/calendar/event/CreateEventDialogFragment.java
@@ -18,6 +18,7 @@
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
+import android.app.DialogFragment;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
@@ -25,6 +26,7 @@
import android.os.Bundle;
import android.provider.CalendarContract;
import android.provider.CalendarContract.Calendars;
+import android.provider.Settings;
import android.text.Editable;
import android.text.TextWatcher;
import android.text.format.DateUtils;
@@ -36,15 +38,12 @@
import android.widget.TextView;
import android.widget.Toast;
-import androidx.fragment.app.DialogFragment;
-
import com.android.calendar.AsyncQueryService;
import com.android.calendar.CalendarController;
import com.android.calendar.CalendarController.EventType;
import com.android.calendar.CalendarEventModel;
import com.android.calendar.Utils;
import com.android.calendar.settings.GeneralPreferences;
-import com.android.calendar.settings.SettingsActivity;
import com.android.calendarcommon2.Time;
import java.text.ParseException;
@@ -238,10 +237,18 @@ private void setDefaultCalendarView(Cursor cursor) {
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setTitle(R.string.no_syncable_calendars).setIconAttribute(
android.R.attr.alertDialogIcon).setMessage(R.string.no_calendars_found)
- .setPositiveButton(R.string.add_calendar, (dialog, which) -> {
- if (activity != null) {
- Intent nextIntent = new Intent(activity, SettingsActivity.class);
- activity.startActivity(nextIntent);
+ .setPositiveButton(R.string.add_account, new DialogInterface.OnClickListener() {
+
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ if (activity != null) {
+ Intent nextIntent = new Intent(Settings.ACTION_ADD_ACCOUNT);
+ final String[] array = {"com.android.calendar"};
+ nextIntent.putExtra(Settings.EXTRA_AUTHORITIES, array);
+ nextIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP |
+ Intent.FLAG_ACTIVITY_NEW_TASK);
+ activity.startActivity(nextIntent);
+ }
}
})
.setNegativeButton(android.R.string.no, null);
diff --git a/app/src/main/java/com/android/calendar/event/EditEventActivity.java b/app/src/main/java/com/android/calendar/event/EditEventActivity.java
index 7fe0a582b2..c1a9edc60e 100644
--- a/app/src/main/java/com/android/calendar/event/EditEventActivity.java
+++ b/app/src/main/java/com/android/calendar/event/EditEventActivity.java
@@ -20,6 +20,7 @@
import static android.provider.CalendarContract.EXTRA_EVENT_BEGIN_TIME;
import static android.provider.CalendarContract.EXTRA_EVENT_END_TIME;
+import android.app.FragmentTransaction;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
@@ -28,7 +29,6 @@
import android.view.MenuItem;
import androidx.appcompat.app.ActionBar;
-import androidx.fragment.app.FragmentTransaction;
import com.android.calendar.AbstractCalendarActivity;
import com.android.calendar.CalendarController;
@@ -77,7 +77,7 @@ protected void onCreate(Bundle icicle) {
setContentView(binding.getRoot());
setSupportActionBar(binding.include.toolbar);
- mEditFragment = (EditEventFragment) getSupportFragmentManager().findFragmentById(R.id.body_frame);
+ mEditFragment = (EditEventFragment) getFragmentManager().findFragmentById(R.id.body_frame);
mIsMultipane = Utils.getConfigBool(this, R.bool.multiple_pane_config);
@@ -109,7 +109,7 @@ protected void onCreate(Bundle icicle) {
mEditFragment.mShowModifyDialogOnLaunch = getIntent().getBooleanExtra(
CalendarController.EVENT_EDIT_ON_LAUNCH, false);
- FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
+ FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.replace(R.id.body_frame, mEditFragment);
ft.show(mEditFragment);
ft.commit();
@@ -172,19 +172,9 @@ private EventInfo getEventInfoFromIntent(Bundle icicle) {
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == android.R.id.home) {
- onBackPressed();
+ Utils.returnToCalendarHome(this);
return true;
}
return super.onOptionsItemSelected(item);
}
-
- @Override
- public void onBackPressed() {
- if (mEditFragment != null) {
- mEditFragment.onBackPressed();
- return;
- }
-
- super.onBackPressed();
- }
}
diff --git a/app/src/main/java/com/android/calendar/event/EditEventFragment.java b/app/src/main/java/com/android/calendar/event/EditEventFragment.java
index d226abb531..a0ad30938b 100644
--- a/app/src/main/java/com/android/calendar/event/EditEventFragment.java
+++ b/app/src/main/java/com/android/calendar/event/EditEventFragment.java
@@ -22,6 +22,8 @@
import android.Manifest;
import android.app.Activity;
import android.app.AlertDialog;
+import android.app.Fragment;
+import android.app.FragmentManager;
import android.content.AsyncQueryHandler;
import android.content.ContentProviderOperation;
import android.content.ContentResolver;
@@ -60,8 +62,6 @@
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
-import androidx.fragment.app.Fragment;
-import androidx.fragment.app.FragmentManager;
import com.android.calendar.AsyncQueryService;
import com.android.calendar.CalendarController;
@@ -162,7 +162,7 @@ public void onClick(View v) {
mColorPickerDialog.setCalendarColor(mModel.getCalendarColor());
mColorPickerDialog.setColors(colors, mModel.getEventColor());
}
- final FragmentManager fragmentManager = getParentFragmentManager();
+ final FragmentManager fragmentManager = getFragmentManager();
fragmentManager.executePendingTransactions();
if (!mColorPickerDialog.isAdded()) {
mColorPickerDialog.show(fragmentManager, COLOR_PICKER_DIALOG_TAG);
@@ -212,7 +212,7 @@ private void setModelIfDone(int queryType) {
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
- mColorPickerDialog = (EventColorPickerDialog) getActivity().getSupportFragmentManager()
+ mColorPickerDialog = (EventColorPickerDialog) getActivity().getFragmentManager()
.findFragmentByTag(COLOR_PICKER_DIALOG_TAG);
if (mColorPickerDialog != null) {
mColorPickerDialog.setOnColorSelectedListener(this);
@@ -272,7 +272,7 @@ private void startQuery() {
mModel.mCalendarAccessLevel = Calendars.CAL_ACCESS_NONE;
mOutstandingQueries = TOKEN_ALL;
if (DEBUG) {
- Log.d(TAG, "startQuery: uri for event is " + mUri);
+ Log.d(TAG, "startQuery: uri for event is " + mUri.toString());
}
mHandler.startQuery(TOKEN_EVENT, null, mUri, EditEventHelper.EVENT_PROJECTION,
null /* selection */, null /* selection args */, null /* sort order */);
@@ -559,37 +559,19 @@ boolean isEmptyNewEvent() {
return mModel.isEmpty();
}
- public void onBackPressed() {
- if (canSave()) {
- showDiscardConfirmAlert();
- return;
- }
-
- Utils.returnToCalendarHome(getActivity());
- }
-
- private boolean canSave() {
+ @Override
+ public void onPause() {
Activity act = getActivity();
- return mSaveOnDetach && act != null && !mIsReadOnly && !act.isChangingConfigurations()
- && mView.prepareForSave();
- }
-
- private void showDiscardConfirmAlert() {
- new AlertDialog.Builder(getActivity())
- .setMessage(R.string.discard_event_changes)
- .setCancelable(true)
- .setPositiveButton(R.string.discard, ((dialog, which) -> {
- revertEventChanges();
- Utils.returnToCalendarHome(getActivity());
- dialog.cancel();
- }))
- .setNegativeButton(R.string.cancel, ((dialog, which) -> dialog.cancel()))
- .show();
- }
-
- private void revertEventChanges() {
- mOnDone.setDoneCode(Utils.DONE_REVERT);
+ if (mSaveOnDetach && act != null && !mIsReadOnly && !act.isChangingConfigurations()
+ && mView.prepareForSave()) {
+ mOnDone.setDoneCode(Utils.DONE_SAVE);
mOnDone.run();
+ }
+ if (act !=null && (Build.VERSION.SDK_INT < 23 ||
+ ContextCompat.checkSelfPermission(EditEventFragment.this.getActivity(),
+ Manifest.permission.READ_CONTACTS) == PackageManager.PERMISSION_GRANTED))
+ act.finish();
+ super.onPause();
}
@Override
diff --git a/app/src/main/java/com/android/calendar/event/EditEventHelper.java b/app/src/main/java/com/android/calendar/event/EditEventHelper.java
index b7126a8d80..39fdf576a1 100644
--- a/app/src/main/java/com/android/calendar/event/EditEventHelper.java
+++ b/app/src/main/java/com/android/calendar/event/EditEventHelper.java
@@ -23,6 +23,7 @@
import android.database.Cursor;
import android.graphics.drawable.Drawable;
import android.net.Uri;
+import android.provider.CalendarContract;
import android.provider.CalendarContract.Attendees;
import android.provider.CalendarContract.Calendars;
import android.provider.CalendarContract.Colors;
diff --git a/app/src/main/java/com/android/calendar/event/EditEventView.java b/app/src/main/java/com/android/calendar/event/EditEventView.java
index 8c83296846..cce2478c93 100644
--- a/app/src/main/java/com/android/calendar/event/EditEventView.java
+++ b/app/src/main/java/com/android/calendar/event/EditEventView.java
@@ -16,8 +16,10 @@
package com.android.calendar.event;
+import android.app.Activity;
import android.app.AlertDialog;
import android.app.DatePickerDialog;
+import android.app.FragmentManager;
import android.app.ProgressDialog;
import android.app.Service;
import android.app.TimePickerDialog;
@@ -34,6 +36,7 @@
import android.provider.CalendarContract.Calendars;
import android.provider.CalendarContract.Events;
import android.provider.CalendarContract.Reminders;
+import android.provider.Settings;
import android.text.InputFilter;
import android.text.TextUtils;
import android.text.format.DateFormat;
@@ -64,10 +67,8 @@
import android.widget.TextView.OnEditorActionListener;
import android.widget.TimePicker;
-import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.SwitchCompat;
import androidx.constraintlayout.widget.ConstraintLayout;
-import androidx.fragment.app.FragmentManager;
import com.android.calendar.CalendarEventModel;
import com.android.calendar.CalendarEventModel.Attendee;
@@ -80,7 +81,6 @@
import com.android.calendar.event.EditEventHelper.EditDoneRunnable;
import com.android.calendar.recurrencepicker.RecurrencePickerDialog;
import com.android.calendar.settings.GeneralPreferences;
-import com.android.calendar.settings.SettingsActivity;
import com.android.calendarcommon2.EventRecurrence;
import com.android.calendarcommon2.Time;
import com.android.common.Rfc822InputFilter;
@@ -99,8 +99,10 @@
import java.util.Arrays;
import java.util.Formatter;
import java.util.HashMap;
+import java.util.List;
import java.util.Locale;
import java.util.TimeZone;
+import java.util.stream.Collectors;
import ws.xsoh.etar.R;
@@ -172,7 +174,7 @@ public class EditEventView implements View.OnClickListener, DialogInterface.OnCa
private ProgressDialog mLoadingCalendarsDialog;
private AlertDialog mNoCalendarsDialog;
- private AppCompatActivity mActivity;
+ private Activity mActivity;
private EditDoneRunnable mDone;
private View mView;
private CalendarEventModel mModel;
@@ -222,7 +224,7 @@ public class EditEventView implements View.OnClickListener, DialogInterface.OnCa
private ArrayList mUnsupportedReminders = new ArrayList();
private String mRrule;
- public EditEventView(AppCompatActivity activity, View view, EditDoneRunnable done) {
+ public EditEventView(Activity activity, View view, EditDoneRunnable done) {
mActivity = activity;
mView = view;
@@ -357,7 +359,7 @@ public void onNothingSelected(AdapterView> arg0) {
// Display loading screen
setModel(null);
- FragmentManager fm = activity.getSupportFragmentManager();
+ FragmentManager fm = activity.getFragmentManager();
RecurrencePickerDialog rpd = (RecurrencePickerDialog) fm
.findFragmentByTag(FRAG_TAG_RECUR_PICKER);
if (rpd != null) {
@@ -421,12 +423,12 @@ public void onTimeZoneSet(TimeZoneInfo tzi) {
private void setTimezone(String timeZone) {
mTimezone = timeZone;
- Utils.changeTimezoneOnly(mStartTime, mTimezone);
- Utils.changeTimezoneOnly(mEndTime, mTimezone);
- long startMillis = mStartTime.normalize();
+ mStartTime.setTimezone(mTimezone);
+ long timeMillis = mStartTime.normalize();
+ mEndTime.setTimezone(mTimezone);
mEndTime.normalize();
- populateTimezone(startMillis);
+ populateTimezone(timeMillis);
}
private void populateTimezone(long eventStartTime) {
@@ -445,7 +447,7 @@ private void showTimezoneDialog() {
b.putLong(TimeZonePickerDialog.BUNDLE_START_TIME_MILLIS, mStartTime.toMillis());
b.putString(TimeZonePickerDialog.BUNDLE_TIME_ZONE, mTimezone);
- FragmentManager fm = mActivity.getSupportFragmentManager();
+ FragmentManager fm = mActivity.getFragmentManager();
TimeZonePickerDialog tzpd = (TimeZonePickerDialog) fm
.findFragmentByTag(FRAG_TAG_TIME_ZONE_PICKER);
if (tzpd != null) {
@@ -539,7 +541,7 @@ public void onClick(View view) {
// TODO may be more efficient to serialize and pass in EventRecurrence
b.putString(RecurrencePickerDialog.BUNDLE_RRULE, mRrule);
- FragmentManager fm = mActivity.getSupportFragmentManager();
+ FragmentManager fm = mActivity.getFragmentManager();
RecurrencePickerDialog rpd = (RecurrencePickerDialog) fm
.findFragmentByTag(FRAG_TAG_RECUR_PICKER);
if (rpd != null) {
@@ -592,7 +594,10 @@ public void onClick(DialogInterface dialog, int which) {
mDone.setDoneCode(Utils.DONE_REVERT);
mDone.run();
if (which == DialogInterface.BUTTON_POSITIVE) {
- Intent nextIntent = new Intent(mActivity, SettingsActivity.class);
+ Intent nextIntent = new Intent(Settings.ACTION_ADD_ACCOUNT);
+ final String[] array = {"com.android.calendar"};
+ nextIntent.putExtra(Settings.EXTRA_AUTHORITIES, array);
+ nextIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
mActivity.startActivity(nextIntent);
}
}
@@ -656,54 +661,36 @@ private boolean fillModelFromUI() {
}
if (mModel.mAllDay) {
- // Reset start and end time without touching date;
- // in model, increment the monthDay by 1, and set
+ // Reset start and end time, increment the monthDay by 1, and set
// the timezone to UTC, as required for all-day events.
+ mTimezone = Time.TIMEZONE_UTC;
mStartTime.setHour(0);
mStartTime.setMinute(0);
mStartTime.setSecond(0);
- mStartTime.normalize();
- Time modelStartTime = new Time(Time.TIMEZONE_UTC);
- modelStartTime.set(0, 0, 0, mStartTime.getDay(), mStartTime.getMonth(), mStartTime.getYear());
- mModel.mStart = modelStartTime.normalize();
+ mStartTime.setTimezone(mTimezone);
+ mModel.mStart = mStartTime.normalize();
mEndTime.setHour(0);
mEndTime.setMinute(0);
mEndTime.setSecond(0);
- mEndTime.normalize();
- Time modelEndTime = new Time(Time.TIMEZONE_UTC);
- modelEndTime.set(0, 0, 0, mEndTime.getDay(), mEndTime.getMonth(), mEndTime.getYear());
- // When a user see the event duration as "X - Y" (e.g. Oct. 28 - Oct. 29), model's end time
- // should be Y + 1 (Oct.30), but display end time should be Y (Oct. 29).
+ mEndTime.setTimezone(mTimezone);
+ // When a user see the event duration as "X - Y" (e.g. Oct. 28 - Oct. 29), end time
+ // should be Y + 1 (Oct.30).
final long normalizedEndTimeMillis =
- modelEndTime.normalize() + DateUtils.DAY_IN_MILLIS;
+ mEndTime.normalize() + DateUtils.DAY_IN_MILLIS;
if (normalizedEndTimeMillis < mModel.mStart) {
- // mModel.mEnd should be midnight of the next day of mStart
- // but mEndTime same day as mStart
+ // mEnd should be midnight of the next day of mStart.
mModel.mEnd = mModel.mStart + DateUtils.DAY_IN_MILLIS;
- modelEndTime.set(mModel.mStart);
- // cannot set to mModel.mStart because mEndTime is not necessarily in the same timezone,
- // so midnight of same day is not same absolute time point in millis
- mEndTime.set(0, 0, 0, modelStartTime.getDay(), modelStartTime.getMonth(), modelStartTime.getYear());
- mEndTime.normalize();
} else {
mModel.mEnd = normalizedEndTimeMillis;
}
-
- mModel.mTimezone = Time.TIMEZONE_UTC;
-
- // refresh UI to new start & end times
- setDate(mStartDateButton, mStartTime.toMillis());
- setTime(mStartTimeButton, mStartTime.toMillis());
- setDate(mEndDateButton, mEndTime.toMillis());
- setTime(mEndTimeButton, mEndTime.toMillis());
} else {
mStartTime.setTimezone(mTimezone);
mEndTime.setTimezone(mTimezone);
mModel.mStart = mStartTime.toMillis();
mModel.mEnd = mEndTime.toMillis();
- mModel.mTimezone = mTimezone;
}
+ mModel.mTimezone = mTimezone;
mModel.mAccessLevel = mAccessLevelSpinner.getSelectedItemPosition();
// TODO set correct availability value
mModel.mAvailability = mAvailabilityValues.get(mAvailabilitySpinner
@@ -845,22 +832,20 @@ public void setModel(CalendarEventModel model) {
boolean canRespond = EditEventHelper.canRespond(model);
- {
- long begin = model.mStart;
- long end = model.mEnd;
- mTimezone = model.mTimezone; // this will be UTC for all day events
+ long begin = model.mStart;
+ long end = model.mEnd;
+ mTimezone = model.mTimezone; // this will be UTC for all day events
- // Set up the starting times
- if (begin > 0) {
- mStartTime.setTimezone(mTimezone);
- mStartTime.set(begin);
- mStartTime.normalize();
- }
- if (end > 0) {
- mEndTime.setTimezone(mTimezone);
- mEndTime.set(end);
- mEndTime.normalize();
- }
+ // Set up the starting times
+ if (begin > 0) {
+ mStartTime.setTimezone(mTimezone);
+ mStartTime.set(begin);
+ mStartTime.normalize();
+ }
+ if (end > 0) {
+ mEndTime.setTimezone(mTimezone);
+ mEndTime.set(end);
+ mEndTime.normalize();
}
mRrule = model.mRrule;
@@ -882,9 +867,6 @@ public void setModel(CalendarEventModel model) {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
setAllDayViewsVisibility(isChecked);
- if(!isChecked) {
- resetToDefaultDuration();
- }
}
});
@@ -893,37 +875,10 @@ public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (model.mAllDay) {
mAllDayCheckBox.setChecked(true);
// put things back in local time for all day events
- // and force time at midnight
- // also be robust against model having non-normalised all day event
- // (start or end not midnight UTC or timezone not UTC), and force that
mTimezone = Utils.getTimeZone(mActivity, null);
- {
- int year = mStartTime.getYear();
- int month = mStartTime.getMonth();
- int day = mStartTime.getDay();
- mStartTime.setTimezone(Time.TIMEZONE_UTC);
- mStartTime.set(0, 0, 0, day, month, year);
- model.mStart = mStartTime.normalize();
- mStartTime.setTimezone(mTimezone);
- mStartTime.set(0, 0, 0, day, month, year);
- mStartTime.normalize();
- }
- {
- int year = mEndTime.getYear();
- int month = mEndTime.getMonth();
- int day = mEndTime.getDay();
- mEndTime.setTimezone(Time.TIMEZONE_UTC);
- mEndTime.set(0, 0, 0, day, month, year);
- model.mEnd = mEndTime.normalize();
- mEndTime.setTimezone(mTimezone);
- mEndTime.set(0, 0, 0, day, month, year);
- mEndTime.normalize();
- }
- // refresh UI to new start & end times
- setDate(mStartDateButton, mStartTime.toMillis());
- setTime(mStartTimeButton, mStartTime.toMillis());
- setDate(mEndDateButton, mEndTime.toMillis());
- setTime(mEndTimeButton, mEndTime.toMillis());
+ mStartTime.setTimezone(mTimezone);
+ mEndTime.setTimezone(mTimezone);
+ mEndTime.normalize();
} else {
mAllDayCheckBox.setChecked(false);
}
@@ -1143,7 +1098,7 @@ public void setCalendarsCursor(Cursor cursor, boolean userVisible, long selected
AlertDialog.Builder builder = new AlertDialog.Builder(mActivity);
builder.setTitle(R.string.no_syncable_calendars).setIconAttribute(
android.R.attr.alertDialogIcon).setMessage(R.string.no_calendars_found)
- .setPositiveButton(R.string.add_calendar, this)
+ .setPositiveButton(R.string.add_account, this)
.setNegativeButton(android.R.string.no, this).setOnCancelListener(this);
mNoCalendarsDialog = builder.show();
return;
@@ -1433,15 +1388,6 @@ private void setTime(TextView view, long millis) {
view.setText(timeString);
}
- protected void resetToDefaultDuration() {
- mEndTime.setDay(mEndTime.getDay() - 1);
- mEndTime.set(mStartTime.normalize() +
- Utils.getDefaultEventDurationInMillis(mActivity));
- long endMillis = mEndTime.normalize();
- setDate(mEndDateButton, endMillis);
- setTime(mEndTimeButton, endMillis);
- }
-
/**
* @param isChecked
*/
diff --git a/app/src/main/java/com/android/calendar/event/EventViewUtils.java b/app/src/main/java/com/android/calendar/event/EventViewUtils.java
index 997a569757..52642bc09f 100644
--- a/app/src/main/java/com/android/calendar/event/EventViewUtils.java
+++ b/app/src/main/java/com/android/calendar/event/EventViewUtils.java
@@ -46,24 +46,11 @@ private EventViewUtils() {
// if the given minutes is 63, then this returns the string "63 minutes".
// As another example, if the given minutes is 120, then this returns
// "2 hours".
- // if minute is < 0, returns `None`
public static String constructReminderLabel(Context context, int minutes, boolean abbrev) {
Resources resources = context.getResources();
-
- if (minutes < 0) {
- return resources.getString(R.string.no_snooze_label);
- }
-
int value, resId;
- if (minutes == Integer.MIN_VALUE) {
- value = 0;
- resId = R.string.no_reminder_label;
-
- String format = resources.getString(resId, value);
- return String.format(format, value);
-
- } else if (minutes % 60 != 0 || minutes == 0) {
+ if (minutes % 60 != 0 || minutes == 0) {
value = minutes;
if (abbrev) {
resId = R.plurals.Nmins;
diff --git a/app/src/main/java/com/android/calendar/event/ExtendedProperty.java b/app/src/main/java/com/android/calendar/event/ExtendedProperty.java
index 118a89a796..a2c7e00e21 100644
--- a/app/src/main/java/com/android/calendar/event/ExtendedProperty.java
+++ b/app/src/main/java/com/android/calendar/event/ExtendedProperty.java
@@ -1,6 +1,7 @@
package com.android.calendar.event;
import android.content.ContentResolver;
+import android.content.ContentUris;
import android.net.Uri;
import android.provider.CalendarContract;
import android.provider.CalendarContract.ExtendedProperties;
diff --git a/app/src/main/java/com/android/calendar/icalendar/IcalendarUtils.java b/app/src/main/java/com/android/calendar/icalendar/IcalendarUtils.java
index 8473cb3859..75ad6d7c2e 100644
--- a/app/src/main/java/com/android/calendar/icalendar/IcalendarUtils.java
+++ b/app/src/main/java/com/android/calendar/icalendar/IcalendarUtils.java
@@ -276,6 +276,33 @@ public static void addAttendeeToEvent(CalendarEventModel.Attendee attendee, VEve
event.addAttendee(vAttendee);
}
+ public static void addAttendeeToTodo(CalendarEventModel.Attendee attendee, VTodo vTodo) {
+ if (attendee == null || vTodo == null) return;
+ Attendee vAttendee = new Attendee();
+ vAttendee.addProperty(Attendee.CN, attendee.mName);
+
+ String participationStatus;
+ switch (attendee.mStatus) {
+ case CalendarContract.Attendees.ATTENDEE_STATUS_ACCEPTED:
+ participationStatus = "ACCEPTED";
+ break;
+ case CalendarContract.Attendees.ATTENDEE_STATUS_DECLINED:
+ participationStatus = "DECLINED";
+ break;
+ case CalendarContract.Attendees.ATTENDEE_STATUS_TENTATIVE:
+ participationStatus = "TENTATIVE";
+ break;
+ case CalendarContract.Attendees.ATTENDEE_STATUS_NONE:
+ default:
+ participationStatus = "NEEDS-ACTION";
+ break;
+ }
+ vAttendee.addProperty(Attendee.PARTSTAT, participationStatus);
+ vAttendee.mEmail = attendee.mEmail;
+
+ vTodo.addAttendee(vAttendee);
+ }
+
/**
* Returns an iCalendar formatted UTC date-time
* ex: 20141120T120000Z for noon on Nov 20, 2014
diff --git a/app/src/main/java/com/android/calendar/icalendar/VCalendar.java b/app/src/main/java/com/android/calendar/icalendar/VCalendar.java
index 8799eb4357..c45ddecd73 100644
--- a/app/src/main/java/com/android/calendar/icalendar/VCalendar.java
+++ b/app/src/main/java/com/android/calendar/icalendar/VCalendar.java
@@ -49,6 +49,7 @@ public class VCalendar {
// Stores attributes and their corresponding values belonging to the Calendar object
public HashMap mProperties;
public LinkedList mEvents; // Events that belong to this Calendar object
+ public LinkedList mTodos; // Todos that belong to this Calendar object
/**
* Constructor
@@ -56,6 +57,7 @@ public class VCalendar {
public VCalendar() {
mProperties = new HashMap();
mEvents = new LinkedList();
+ mTodos = new LinkedList();
}
/**
@@ -82,6 +84,12 @@ public void addEvent(VEvent event) {
if (event != null) mEvents.add(event);
}
+ public void addTodo(VTodo todo) {
+ if (todo != null) {
+ mTodos.add(todo);
+ }
+ }
+
/**
*
* @return
@@ -90,6 +98,10 @@ public LinkedList getAllEvents() {
return mEvents;
}
+ public LinkedList getAllTodos() {
+ return mTodos;
+ }
+
/**
* Returns the iCal representation of the calendar and all of its inherent components
* @return
@@ -111,6 +123,10 @@ public String getICalFormattedString() {
output.append(event.getICalFormattedString());
}
+ for (VTodo todo : mTodos) {
+ output.append(todo.getICalFormattedString());
+ }
+
output.append("END:VCALENDAR\n");
return output.toString();
@@ -129,6 +145,11 @@ public void populateFromString(ArrayList input) {
VEvent event = new VEvent();
event.populateFromEntries(iter);
mEvents.add(event);
+ } else if (line.contains("BEGIN:VTODO")) {
+ iter.previous();
+ VTodo todo = new VTodo();
+ todo.populateFromEntries(iter);
+ mTodos.add(todo);
} else if (line.contains("END:VCALENDAR")) {
break;
}
diff --git a/app/src/main/java/com/android/calendar/icalendar/VTodo.java b/app/src/main/java/com/android/calendar/icalendar/VTodo.java
new file mode 100644
index 0000000000..dac29265af
--- /dev/null
+++ b/app/src/main/java/com/android/calendar/icalendar/VTodo.java
@@ -0,0 +1,252 @@
+/*
+ * Copyright (C) 2014-2016 The CyanogenMod Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.calendar.icalendar;
+
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.ListIterator;
+import java.util.UUID;
+
+/**
+ * Models the Todo/VTodo component of the iCalendar format
+ */
+public class VTodo {
+
+ // Valid property identifiers for an todo component
+ // TODO: only a partial list of attributes has been implemented, implement the rest
+ public static String CLASS = "CLASS";
+ public static String CREATED = "CREATED";
+ public static String LOCATION = "LOCATION";
+ public static String ORGANIZER = "ORGANIZER";
+ public static String PRIORITY = "PRIORITY";
+ public static String SEQ = "SEQ";
+ public static String STATUS = "STATUS";
+ public static String UID = "UID";
+ public static String URL = "URL";
+ public static String DTSTART = "DTSTART";
+ public static String DTEND = "DTEND";
+ public static String DURATION = "DURATION";
+ public static String DTSTAMP = "DTSTAMP";
+ public static String SUMMARY = "SUMMARY";
+ public static String DESCRIPTION = "DESCRIPTION";
+ public static String ATTENDEE = "ATTENDEE";
+ public static String CATEGORIES = "CATEGORIES";
+
+ // Stores the -arity of the attributes that this component can have
+ private static HashMap sPropertyList = new HashMap();
+
+ // Initialize the approved list of mProperties for a calendar vtodo
+ static {
+ sPropertyList.put(CLASS, 1);
+ sPropertyList.put(CREATED, 1);
+ sPropertyList.put(LOCATION, 1);
+ sPropertyList.put(ORGANIZER, 1);
+ sPropertyList.put(PRIORITY, 1);
+ sPropertyList.put(SEQ, 1);
+ sPropertyList.put(STATUS, 1);
+ sPropertyList.put(UID, 1);
+ sPropertyList.put(URL, 1);
+ sPropertyList.put(DTSTART, 1);
+ sPropertyList.put(DTEND, 1);
+ sPropertyList.put(DURATION, 1);
+ sPropertyList.put(DTSTAMP, 1);
+ sPropertyList.put(SUMMARY, 1);
+ sPropertyList.put(DESCRIPTION, 1);
+
+ sPropertyList.put(ATTENDEE, Integer.MAX_VALUE);
+ sPropertyList.put(CATEGORIES, Integer.MAX_VALUE);
+ sPropertyList.put(CATEGORIES, Integer.MAX_VALUE);
+ }
+
+ // Stores attributes and their corresponding values belonging to the VTodo component
+ public HashMap mProperties;
+ public HashMap mPropertyParameters;
+
+ public LinkedList mAttendees;
+ public Organizer mOrganizer;
+
+ /**
+ * Constructor
+ */
+ public VTodo() {
+ mProperties = new HashMap();
+ mPropertyParameters = new HashMap();
+ mAttendees = new LinkedList();
+
+ // Generate and add a unique identifier to this todo - iCal requisite
+ addProperty(UID, UUID.randomUUID().toString() + "@ws.xsoh.etar");
+ addTimeStamp();
+ }
+
+ /**
+ * For adding unary properties. For adding other property attributes , use the respective
+ * component methods to create and add these special components.
+ *
+ * @param property
+ * @param value
+ * @return
+ */
+ public boolean addProperty(String property, String value) {
+ // Only unary-properties for now
+ if (sPropertyList.containsKey(property) && sPropertyList.get(property) == 1 &&
+ value != null) {
+ mProperties.put(property, IcalendarUtils.cleanseString(value));
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Returns the value of the requested vtodo property or null if there isn't one
+ */
+ public String getProperty(String property) {
+ return mProperties.get(property);
+ }
+
+ /**
+ * Returns the parameters of the requested vtodo property or null if there isn't one
+ */
+ public String getPropertyParameters(String property) {
+ return mPropertyParameters.get(property);
+ }
+
+ /**
+ * Add attendees to the vtodo
+ *
+ * @param attendee
+ */
+ public void addAttendee(Attendee attendee) {
+ if (attendee != null) mAttendees.add(attendee);
+ }
+
+ /**
+ * Add an Organizer to the vtodo
+ *
+ * @param organizer
+ */
+ public void addOrganizer(Organizer organizer) {
+ if (organizer != null) mOrganizer = organizer;
+ }
+
+ /**
+ * Add an start date-time to the vtodo
+ */
+ public void addTodoStart(long startMillis, String timeZone) {
+ if (startMillis < 0) return;
+
+ String formattedDateTime = IcalendarUtils.getICalFormattedDateTime(startMillis, timeZone);
+ addProperty(DTSTART, formattedDateTime);
+ }
+
+ /**
+ * Add an end date-time for todo
+ */
+ public void addTodoEnd(long endMillis, String timeZone) {
+ if (endMillis < 0) return;
+
+ String formattedDateTime = IcalendarUtils.getICalFormattedDateTime(endMillis, timeZone);
+ addProperty(DTEND, formattedDateTime);
+ }
+
+ /**
+ * Timestamps the todos with the current date-time
+ */
+ private void addTimeStamp() {
+ String formattedDateTime = IcalendarUtils.getICalFormattedDateTime(
+ System.currentTimeMillis(), "UTC");
+ addProperty(DTSTAMP, formattedDateTime);
+ }
+
+ /**
+ * Returns the iCal representation of the Todo component
+ */
+ public String getICalFormattedString() {
+ StringBuilder sb = new StringBuilder();
+
+ // Add Todo properties
+ sb.append("BEGIN:VTODO\n");
+ for (String property : mProperties.keySet()) {
+ sb.append(property + ":" + mProperties.get(property) + "\n");
+ }
+
+ // Enforce line length requirements
+ sb = IcalendarUtils.enforceICalLineLength(sb);
+
+ sb.append(mOrganizer.getICalFormattedString());
+
+ // Add Todo Attendees
+ for (Attendee attendee : mAttendees) {
+ sb.append(attendee.getICalFormattedString());
+ }
+
+ sb.append("END:VTODO\n");
+
+ return sb.toString();
+ }
+
+ public void populateFromEntries(ListIterator iter) {
+ while (iter.hasNext()) {
+ String line = iter.next();
+ if (line.contains("BEGIN:VTODO")) {
+ // Continue
+ } else if (line.startsWith("END:VTODO")) {
+ break;
+ } else if (line.startsWith("ORGANIZER")) {
+ String entry = parseTillNextAttribute(iter, line);
+ mOrganizer = Organizer.populateFromICalString(entry);
+ } else if (line.startsWith("ATTENDEE")) {
+ // Go one previous, so VTodo, parses current line
+ iter.previous();
+
+ // Offload to Attendee for parsing
+ Attendee attendee = new Attendee();
+ attendee.populateFromEntries(iter);
+ mAttendees.add(attendee);
+ } else if (line.contains(":")) {
+ String entry = parseTillNextAttribute(iter, line);
+ int indexOfFirstColon = entry.indexOf(":");
+ int indexOfFirstParamDelimiter = entry.indexOf(";");
+ String key;
+ if (indexOfFirstParamDelimiter != -1 && indexOfFirstParamDelimiter < indexOfFirstColon) {
+ key = entry.substring(0, indexOfFirstParamDelimiter);
+ String params = entry.substring(indexOfFirstParamDelimiter + 1, indexOfFirstColon);
+ mPropertyParameters.put(key, params);
+ } else {
+ key = entry.substring(0, indexOfFirstColon);
+ }
+ String value = entry.substring(indexOfFirstColon + 1);
+ mProperties.put(key, value);
+ }
+ }
+ }
+
+ public static String parseTillNextAttribute(ListIterator iter, String currentLine) {
+ StringBuilder parse = new StringBuilder();
+ parse.append(currentLine);
+ while (iter.hasNext()) {
+ String line = iter.next();
+ if (line.startsWith(" ")) {
+ parse.append(line.replaceFirst(" ", ""));
+ } else {
+ iter.previous();
+ break;
+ }
+ }
+ return parse.toString();
+ }
+
+}
diff --git a/app/src/main/java/com/android/calendar/month/MonthByWeekFragment.java b/app/src/main/java/com/android/calendar/month/MonthByWeekFragment.java
index 7cd2a5132b..331f29319a 100644
--- a/app/src/main/java/com/android/calendar/month/MonthByWeekFragment.java
+++ b/app/src/main/java/com/android/calendar/month/MonthByWeekFragment.java
@@ -17,7 +17,12 @@
package com.android.calendar.month;
import android.app.Activity;
+import android.app.FragmentManager;
+import android.app.LoaderManager;
import android.content.ContentUris;
+import android.content.CursorLoader;
+import android.content.Loader;
+import android.content.pm.PackageManager;
import android.content.res.Resources;
import android.database.Cursor;
import android.graphics.drawable.StateListDrawable;
@@ -39,12 +44,7 @@
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
-import androidx.annotation.NonNull;
-import androidx.fragment.app.FragmentManager;
-import androidx.loader.app.LoaderManager;
-import androidx.loader.content.CursorLoader;
-import androidx.loader.content.Loader;
-
+import androidx.core.content.ContextCompat;
import com.android.calendar.CalendarController;
import com.android.calendar.CalendarController.EventInfo;
import com.android.calendar.CalendarController.EventType;
@@ -53,10 +53,14 @@
import com.android.calendar.Event;
import com.android.calendar.Utils;
import com.android.calendar.event.CreateEventDialogFragment;
+import com.android.calendar.persistence.tasks.DmfsOpenTasksContract;
import com.android.calendarcommon2.Time;
import java.util.ArrayList;
import java.util.Calendar;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.Date;
import java.util.HashMap;
import java.util.List;
@@ -137,8 +141,8 @@ public void run() {
@Override
public void run() {
if (!mIsDetached) {
- mLoader = (CursorLoader) LoaderManager.getInstance(MonthByWeekFragment.this)
- .initLoader(0, null, MonthByWeekFragment.this);
+ mLoader = (CursorLoader) getLoaderManager().initLoader(0, null,
+ MonthByWeekFragment.this);
}
}
};
@@ -146,7 +150,7 @@ public void run() {
@Override
public void handleMessage(Message msg) {
- final FragmentManager manager = getParentFragmentManager();
+ final FragmentManager manager = getFragmentManager();
if (manager != null) {
Time day = (Time) msg.obj;
mEventDialog = new CreateEventDialogFragment(day);
@@ -174,7 +178,8 @@ public MonthByWeekFragment(long initialTime, boolean isMiniMonth) {
private Uri updateUri() {
SimpleWeekView child = (SimpleWeekView) mListView.getChildAt(0);
if (child != null) {
- mFirstLoadedJulianDay = child.getFirstJulianDay();
+ int julianDay = child.getFirstJulianDay();
+ mFirstLoadedJulianDay = julianDay;
}
// -1 to ensure we get all day events from any time zone
mTempTime.setJulianDay(mFirstLoadedJulianDay - 1);
@@ -311,13 +316,10 @@ public void onActivityCreated(Bundle savedInstanceState) {
// To get a smoother transition when showing this fragment, delay loading of events until
// the fragment is expended fully and the calendar controls are gone.
- if (Utils.isCalendarPermissionGranted(mContext, true) && !mIsMiniMonth) {
- if (mShowCalendarControls) {
- mListView.postDelayed(mLoadingRunnable, mEventsLoadingDelay);
- } else {
- mLoader = (CursorLoader) LoaderManager.getInstance(MonthByWeekFragment.this)
- .initLoader(0, null, this);
- }
+ if (mShowCalendarControls) {
+ mListView.postDelayed(mLoadingRunnable, mEventsLoadingDelay);
+ } else {
+ mLoader = (CursorLoader) getLoaderManager().initLoader(0, null, this);
}
mAdapter.setListView(mListView);
}
@@ -337,9 +339,11 @@ protected void setUpHeader() {
}
// TODO
- @NonNull
@Override
public Loader onCreateLoader(int id, Bundle args) {
+ if (mIsMiniMonth) {
+ return null;
+ }
CursorLoader loader;
synchronized (mUpdateLoader) {
mFirstLoadedJulianDay =
@@ -348,8 +352,11 @@ public Loader onCreateLoader(int id, Bundle args) {
mEventUri = updateUri();
String where = updateWhere();
+ if (!Utils.isCalendarPermissionGranted(mContext, true)) {
+ return null;
+ }
loader = new CursorLoader(
- requireActivity(), mEventUri, Event.EVENT_PROJECTION, where,
+ getActivity(), mEventUri, Event.EVENT_PROJECTION, where,
null /* WHERE_CALENDARS_SELECTED_ARGS */, INSTANCES_SORT_ORDER);
loader.setUpdateThrottle(LOADER_THROTTLE_DELAY);
}
@@ -381,7 +388,7 @@ public void doResumeUpdates() {
}
@Override
- public void onLoadFinished(@NonNull Loader loader, Cursor data) {
+ public void onLoadFinished(Loader loader, Cursor data) {
synchronized (mUpdateLoader) {
if (Log.isLoggable(TAG, Log.DEBUG)) {
Log.d(TAG, "Found " + data.getCount() + " cursor entries for uri " + mEventUri);
@@ -399,13 +406,22 @@ public void onLoadFinished(@NonNull Loader loader, Cursor data) {
ArrayList events = new ArrayList();
Event.buildEventsFromCursor(
events, data, mContext, mFirstLoadedJulianDay, mLastLoadedJulianDay);
+
+ if (ContextCompat.checkSelfPermission(mContext, DmfsOpenTasksContract.TASK_READ_PERMISSION)
+ == PackageManager.PERMISSION_GRANTED) {
+ Cursor cTasks = Event.instancesQueryForTasks(mContext.getContentResolver(), Event.TASK_PROJECTION, mFirstLoadedJulianDay, mLastLoadedJulianDay);
+ Event.buildTasksFromCursor(events, cTasks, mContext, mFirstLoadedJulianDay, mLastLoadedJulianDay);
+
+ Collections.sort(events, Comparator.comparing(u -> new Date(u.getStartMillis())));
+ }
+
((MonthByWeekAdapter) mAdapter).setEvents(mFirstLoadedJulianDay,
mLastLoadedJulianDay - mFirstLoadedJulianDay + 1, events);
}
}
@Override
- public void onLoaderReset(@NonNull Loader loader) {
+ public void onLoaderReset(Loader loader) {
}
@Override
diff --git a/app/src/main/java/com/android/calendar/month/MonthListView.java b/app/src/main/java/com/android/calendar/month/MonthListView.java
index 02ddf88d50..f4962e5805 100644
--- a/app/src/main/java/com/android/calendar/month/MonthListView.java
+++ b/app/src/main/java/com/android/calendar/month/MonthListView.java
@@ -43,14 +43,10 @@ public class MonthListView extends ListView {
private static int MULTIPLE_MONTH_VELOCITY_THRESHOLD = 2000;
private static int FLING_VELOCITY_DIVIDER = 500;
private static int FLING_TIME = 1000;
- private static int LEFT_RIGHT_DISTANCE = 150;
- private static double LEFT_RIGHT_RATIO = 1.25;
// disposable variable used for time calculations
protected Time mTempTime;
private long mDownActionTime;
- private float mLeftRightActionLeft;
- private float mLeftRightActionRight;
private final Rect mFirstViewRect = new Rect();
Context mListContext;
@@ -113,13 +109,9 @@ private boolean processEvent (MotionEvent ev) {
case MotionEvent.ACTION_DOWN:
mTracker.clear();
mDownActionTime = SystemClock.uptimeMillis();
- mLeftRightActionLeft = ev.getX();
- mLeftRightActionRight = ev.getY();
break;
// Accumulate velocity and do a custom fling when above threshold
- // and look for left/right swipes as well.
case MotionEvent.ACTION_UP:
- // Check for the fling.
mTracker.addMovement(ev);
mTracker.computeCurrentVelocity(1000); // in pixels per second
float vel = mTracker.getYVelocity ();
@@ -127,17 +119,6 @@ private boolean processEvent (MotionEvent ev) {
doFling(vel);
return true;
}
- // Check for the left/right swipe.
- float leftRightSwipe = mLeftRightActionLeft - ev.getX();
- float leftRightRatio = Math.abs(leftRightSwipe) / Math.abs(mLeftRightActionRight - ev.getY());
- if( Math.abs(leftRightSwipe) > LEFT_RIGHT_DISTANCE && leftRightRatio > LEFT_RIGHT_RATIO ) {
- if( leftRightSwipe > 0 ) {
- doLeftRight(1);
- } else {
- doLeftRight(-1);
- }
- return true;
- }
break;
default:
mTracker.addMovement(ev);
@@ -204,46 +185,6 @@ private void doFling(float velocityY) {
smoothScrollBy(viewsToFling * firstViewHeight + offset, FLING_TIME);
}
- // Do a "snap to start of month" fling
- // Left = +1
- // Right = -1
- private void doLeftRight(int monthsToJump) {
-
- // Stop the list-view movement and take over
- MotionEvent cancelEvent = MotionEvent.obtain(mDownActionTime, SystemClock.uptimeMillis(),
- MotionEvent.ACTION_CANCEL, 0, 0, 0);
- onTouchEvent(cancelEvent);
-
- // Get the day at the top right corner
- int day = getUpperRightJulianDay();
- // Get the day of the first day of the next/previous month
- // (according to scroll direction) and make sure we're crossing
- // the boundry.
- mTempTime.setJulianDay(day + 6);
- mTempTime.setDay(1);
- mTempTime.setMonth(mTempTime.getMonth() + monthsToJump);
- long timeInMillis = mTempTime.normalize();
- // Since each view is 7 days, round the target day up to make sure the
- // scroll will be at least one view.
- int scrollToDay = Time.getJulianDay(timeInMillis, mTempTime.getGmtOffset())
- + ((monthsToJump > 0) ? 6 : 0);
-
- // Since all views have the same height, scroll by pixels instead of
- // "to position".
- // Compensate for the top view offset from the top.
- View firstView = getChildAt(0);
- int firstViewHeight = firstView.getHeight();
- // Get visible part length
- firstView.getLocalVisibleRect(mFirstViewRect);
- int topViewVisiblePart = mFirstViewRect.bottom - mFirstViewRect.top;
- int viewsToFling = (scrollToDay - day) / 7 - ((monthsToJump <= 0) ? 1 : 0);
- int offset = (viewsToFling > 0) ? -(firstViewHeight - topViewVisiblePart
- + SimpleDayPickerFragment.LIST_TOP_OFFSET) : (topViewVisiblePart
- - SimpleDayPickerFragment.LIST_TOP_OFFSET);
- // Fling
- smoothScrollBy(viewsToFling * firstViewHeight + offset, FLING_TIME);
- }
-
// Returns the julian day of the day in the upper right corner
private int getUpperRightJulianDay() {
SimpleWeekView child = (SimpleWeekView) getChildAt(0);
diff --git a/app/src/main/java/com/android/calendar/month/SimpleDayPickerFragment.java b/app/src/main/java/com/android/calendar/month/SimpleDayPickerFragment.java
index 143ef9cccd..59a6fa5768 100644
--- a/app/src/main/java/com/android/calendar/month/SimpleDayPickerFragment.java
+++ b/app/src/main/java/com/android/calendar/month/SimpleDayPickerFragment.java
@@ -17,6 +17,7 @@
package com.android.calendar.month;
import android.app.Activity;
+import android.app.ListFragment;
import android.content.Context;
import android.database.DataSetObserver;
import android.os.Bundle;
@@ -34,8 +35,6 @@
import android.widget.ListView;
import android.widget.TextView;
-import androidx.fragment.app.ListFragment;
-
import com.android.calendar.DynamicTheme;
import com.android.calendar.Utils;
import com.android.calendarcommon2.Time;
diff --git a/app/src/main/java/com/android/calendar/month/SimpleWeekView.java b/app/src/main/java/com/android/calendar/month/SimpleWeekView.java
index aab255912f..3e9376c79f 100644
--- a/app/src/main/java/com/android/calendar/month/SimpleWeekView.java
+++ b/app/src/main/java/com/android/calendar/month/SimpleWeekView.java
@@ -157,7 +157,7 @@ public class SimpleWeekView extends View {
protected int mSelectedRight = -1;
// The timezone to display times/dates in (used for determining when Today
// is)
- protected String mTimeZone;
+ protected String mTimeZone = Utils.getCurrentTimezone();
protected int mBGColor;
protected int mSelectedWeekBGColor;
@@ -181,8 +181,6 @@ public SimpleWeekView(Context context) {
mWeekNumColor = DynamicTheme.getColor(context, "month_week_num_color");
mSelectedDayLine = res.getDrawable(R.drawable.dayline_minical_holo_light);
- mTimeZone = Utils.getTimeZone(context, mTZUpdater);
-
if (mScale == 0) {
mScale = context.getResources().getDisplayMetrics().density;
if (mScale != 1) {
@@ -201,14 +199,6 @@ public SimpleWeekView(Context context) {
initView();
}
- private final Runnable mTZUpdater = new Runnable() {
- @Override
- public void run() {
- String tz = Utils.getTimeZone(getContext(), this);
- mTimeZone = tz;
- }
- };
-
/**
* Sets all the parameters for displaying this week. The only required
* parameter is the week number. Other parameters have a default value and
diff --git a/app/src/main/java/com/android/calendar/persistence/Calendar.kt b/app/src/main/java/com/android/calendar/persistence/Calendar.kt
index fd67f94f90..c08820126d 100644
--- a/app/src/main/java/com/android/calendar/persistence/Calendar.kt
+++ b/app/src/main/java/com/android/calendar/persistence/Calendar.kt
@@ -30,4 +30,5 @@ data class Calendar(val id: Long,
val visible: Boolean,
val syncEvents: Boolean,
val isPrimary: Boolean,
- val isLocal: Boolean)
+ val isLocal: Boolean,
+ val isTasks: Boolean)
diff --git a/app/src/main/java/com/android/calendar/persistence/CalendarRepository.kt b/app/src/main/java/com/android/calendar/persistence/CalendarRepository.kt
index 0fa3d73a3b..ea9da6a3e4 100644
--- a/app/src/main/java/com/android/calendar/persistence/CalendarRepository.kt
+++ b/app/src/main/java/com/android/calendar/persistence/CalendarRepository.kt
@@ -26,6 +26,7 @@ import android.content.Context
import android.net.Uri
import android.provider.CalendarContract
import androidx.lifecycle.LiveData
+import com.android.calendar.persistence.tasks.DmfsOpenTasksContract
import ws.xsoh.etar.R
@@ -42,7 +43,11 @@ internal class CalendarRepository(val application: Application) {
private var contentResolver = application.contentResolver
- private var allCalendars: CalendarLiveData = CalendarLiveData(application.applicationContext)
+ private var allCalendars: CalendarLiveData
+
+ init {
+ allCalendars = CalendarLiveData(application.applicationContext)
+ }
fun getCalendarsOrderedByAccount(): LiveData> {
return allCalendars
@@ -66,7 +71,24 @@ internal class CalendarRepository(val application: Application) {
val isPrimary = it.getInt(PROJECTION_INDEX_IS_PRIMARY) == 1
val isLocal = accountType == CalendarContract.ACCOUNT_TYPE_LOCAL
- calendars.add(Calendar(id, accountName, accountType, name, displayName, color, visible, syncEvents, isPrimary, isLocal))
+ calendars.add(Calendar(id, accountName, accountType, name, displayName, color, visible, syncEvents, isPrimary, isLocal, false))
+ }
+ }
+
+ context.contentResolver.query(taskListsUri, TASKLIST_PROJECTION, null, null, null)?.use {
+ while (it.moveToNext()) {
+ val id = it.getLong(0)
+ val accountName = it.getString(1)
+ val accountType = it.getString(2)
+ val name = it.getString(4)
+ val displayName = it.getString(4)
+ val color = it.getInt(5)
+ val visible = it.getInt(6) == 1
+ val syncEvents = it.getInt(7) == 1
+ val isPrimary = true
+ val isLocal = accountType == CalendarContract.ACCOUNT_TYPE_LOCAL
+
+ calendars.add(Calendar(id, accountName, accountType, name, displayName, color, visible, syncEvents, isPrimary, isLocal, true))
}
}
return calendars
@@ -74,6 +96,7 @@ internal class CalendarRepository(val application: Application) {
companion object {
private val uri = CalendarContract.Calendars.CONTENT_URI
+ private val taskListsUri = DmfsOpenTasksContract.TaskLists.PROVIDER_URI
private val PROJECTION = arrayOf(
CalendarContract.Calendars._ID,
@@ -87,6 +110,18 @@ internal class CalendarRepository(val application: Application) {
CalendarContract.Calendars.SYNC_EVENTS,
CalendarContract.Calendars.IS_PRIMARY
)
+
+ private val TASKLIST_PROJECTION = arrayOf(
+ DmfsOpenTasksContract.TaskLists.COLUMN_ID,
+ DmfsOpenTasksContract.TaskLists.COLUMN_ACCOUNT_NAME,
+ DmfsOpenTasksContract.TaskLists.COLUMN_ACCOUNT_TYPE,
+ DmfsOpenTasksContract.TaskLists.COLUMN_LIST_OWNER,
+ DmfsOpenTasksContract.TaskLists.COLUMN_NAME,
+ DmfsOpenTasksContract.TaskLists.COLUMN_COLOR,
+ DmfsOpenTasksContract.TaskLists.COLUMN_VISIBLE,
+ DmfsOpenTasksContract.TaskLists.COLUMN_SYNC_ENABLE
+ )
+
const val PROJECTION_INDEX_ID = 0
const val PROJECTION_INDEX_ACCOUNT_NAME = 1
const val PROJECTION_INDEX_ACCOUNT_TYPE = 2
@@ -178,23 +213,43 @@ internal class CalendarRepository(val application: Application) {
return contentResolver.delete(calUri, null, null) == 1
}
- fun queryAccount(calendarId: Long): Account? {
- val calendarUri = ContentUris.withAppendedId(CalendarContract.Calendars.CONTENT_URI, calendarId)
- contentResolver.query(calendarUri, ACCOUNT_PROJECTION, null, null, null)?.use {
- if (it.moveToFirst()) {
- val accountName = it.getString(PROJECTION_ACCOUNT_INDEX_NAME)
- val accountType = it.getString(PROJECTION_ACCOUNT_INDEX_TYPE)
- return Account(accountName, accountType)
+ fun queryAccount(calendarId: Long, isTask: Boolean): Account? {
+ if (isTask) {
+ val taskUri =
+ ContentUris.withAppendedId(DmfsOpenTasksContract.TaskLists.PROVIDER_URI, calendarId)
+ contentResolver.query(taskUri, ACCOUNT_PROJECTION, null, null, null)?.use {
+ if (it.moveToFirst()) {
+ val accountName = it.getString(PROJECTION_ACCOUNT_INDEX_NAME)
+ val accountType = it.getString(PROJECTION_ACCOUNT_INDEX_TYPE)
+ return Account(accountName, accountType)
+ }
+ }
+ } else {
+ val calendarUri =
+ ContentUris.withAppendedId(CalendarContract.Calendars.CONTENT_URI, calendarId)
+ contentResolver.query(calendarUri, ACCOUNT_PROJECTION, null, null, null)?.use {
+ if (it.moveToFirst()) {
+ val accountName = it.getString(PROJECTION_ACCOUNT_INDEX_NAME)
+ val accountType = it.getString(PROJECTION_ACCOUNT_INDEX_TYPE)
+ return Account(accountName, accountType)
+ }
}
}
return null
}
- fun queryNumberOfEvents(calendarId: Long): Long? {
+ fun queryNumberOfEvents(calendarId: Long, isTask: Boolean): Long? {
val args = arrayOf(calendarId.toString())
- contentResolver.query(CalendarContract.Events.CONTENT_URI, PROJECTION_COUNT_EVENTS, WHERE_COUNT_EVENTS, args, null)?.use {
- if (it.moveToFirst()) {
- return it.getLong(PROJECTION_COUNT_EVENTS_INDEX_COUNT)
+ if (isTask) {
+ val cursor = contentResolver.query(DmfsOpenTasksContract.Tasks.PROVIDER_URI, null, WHERE_COUNT_TASKS, args, null)
+ val count = cursor?.count?.toLong()
+ cursor?.close()
+ return count
+ } else {
+ contentResolver.query(CalendarContract.Events.CONTENT_URI, PROJECTION_COUNT_EVENTS, WHERE_COUNT_EVENTS, args, null)?.use {
+ if (it.moveToFirst()) {
+ return it.getLong(PROJECTION_COUNT_EVENTS_INDEX_COUNT)
+ }
}
}
return null
@@ -213,6 +268,7 @@ internal class CalendarRepository(val application: Application) {
)
const val PROJECTION_COUNT_EVENTS_INDEX_COUNT = 0
const val WHERE_COUNT_EVENTS = CalendarContract.Events.CALENDAR_ID + "=?"
+ const val WHERE_COUNT_TASKS = DmfsOpenTasksContract.Tasks.COLUMN_LIST_ID + "=?"
const val DEFAULT_COLOR_KEY = "1"
diff --git a/app/src/main/java/com/android/calendar/persistence/tasks/DmfsOpenTasksContract.java b/app/src/main/java/com/android/calendar/persistence/tasks/DmfsOpenTasksContract.java
new file mode 100644
index 0000000000..7b6a32ef31
--- /dev/null
+++ b/app/src/main/java/com/android/calendar/persistence/tasks/DmfsOpenTasksContract.java
@@ -0,0 +1,63 @@
+package com.android.calendar.persistence.tasks;
+
+import android.net.Uri;
+import android.provider.BaseColumns;
+
+public class DmfsOpenTasksContract implements BaseColumns {
+ public static final String AUTHORITY = "org.dmfs.tasks";
+
+ public static final String TASK_READ_PERMISSION = "org.dmfs.permission.READ_TASKS";
+ public static final String TASK_WRITE_PERMISSION = "org.dmfs.permission.WRITE_TASKS";
+
+ public static final String ACCOUNT_TYPE_LOCAL = "org.dmfs.account.LOCAL";
+
+ public static class Tasks {
+
+ public static final Uri PROVIDER_URI = Uri.parse("content://" + AUTHORITY + "/tasks");
+
+ public static final String COLUMN_ID = "_id";
+ public static final String COLUMN_TITLE = "title";
+ public static final String COLUMN_LOCATION = "location";
+ public static final String COLUMN_DUE_DATE = "due";
+ public static final String COLUMN_VISIBLE = "visible";
+ public static final String COLUMN_IS_ALLDAY = "is_allday";
+ public static final String COLUMN_HAS_ALLARMS = "has_alarms";
+ public static final String COLUMN_RRULE = "rrule";
+ public static final String COLUMN_RDATE = "rdate";
+ public static final String COLUMN_START_DATE = "dtstart";
+ public static final String COLUMN_COLOR = "task_color";
+ public static final String COLUMN_TZ = "tz";
+ public static final String COLUMN_STATUS = "status";
+ public static final String COLUMN_ORGANIZER = "organizer";
+ public static final String COLUMN_ACCOUNT_NAME = "account_name";
+ public static final String COLUMN_LIST_ID = "list_id";
+
+ public static final String COLUMN_DTSTART = "dtstart";
+ public static final String COLUMN_SYNC_ID = "_sync_id";
+
+ public static final String COLUMN_DESCRIPTION = "description";
+ public static final String COLUMN_LIST_ACCESS_LEVEL = "list_access_level";
+ public static final String COLUMN_LIST_COLOR = "list_color";
+ public static final String COLUMN_DURATION = "duration";
+ public static final String COLUMN_ORIGINAL_INSTANCE_SYNC_ID = "original_instance_sync_id";
+
+
+ public static final int STATUS_COMPLETED = 2;
+ }
+
+ public static class TaskLists {
+
+ public static final Uri PROVIDER_URI = Uri.parse("content://" + AUTHORITY + "/tasklists");
+
+ public static final String COLUMN_ID = "_id";
+ public static final String COLUMN_NAME = "list_name";
+ public static final String COLUMN_COLOR = "list_color";
+ public static final String COLUMN_ACCOUNT_NAME = "account_name";
+ public static final String COLUMN_ACCOUNT_TYPE = "account_type";
+ public static final String COLUMN_LIST_OWNER = "list_owner";
+ public static final String COLUMN_VISIBLE = "visible";
+ public static final String COLUMN_SYNC_ENABLE = "sync_enabled";
+ }
+
+ public static final String PERMISSION = "org.dmfs.permission.READ_TASKS";
+}
diff --git a/app/src/main/java/com/android/calendar/recurrencepicker/RecurrencePickerDialog.java b/app/src/main/java/com/android/calendar/recurrencepicker/RecurrencePickerDialog.java
index 67588e28a8..171768e996 100644
--- a/app/src/main/java/com/android/calendar/recurrencepicker/RecurrencePickerDialog.java
+++ b/app/src/main/java/com/android/calendar/recurrencepicker/RecurrencePickerDialog.java
@@ -18,6 +18,7 @@
import android.app.Activity;
import android.app.DatePickerDialog;
+import android.app.DialogFragment;
import android.content.Context;
import android.content.res.Configuration;
import android.content.res.Resources;
@@ -54,7 +55,6 @@
import android.widget.ToggleButton;
import androidx.appcompat.widget.SwitchCompat;
-import androidx.fragment.app.DialogFragment;
import com.android.calendar.Utils;
import com.android.calendarcommon2.EventRecurrence;
@@ -412,7 +412,7 @@ static private void copyModelToEventRecurrence(final RecurrenceModel model,
if (!canHandleRecurrenceRule(er)) {
throw new IllegalStateException("UI generated recurrence that it can't handle. ER:"
- + er + " Model: " + model);
+ + er.toString() + " Model: " + model.toString());
}
}
diff --git a/app/src/main/java/com/android/calendar/selectcalendars/SelectCalendarsSimpleAdapter.java b/app/src/main/java/com/android/calendar/selectcalendars/SelectCalendarsSimpleAdapter.java
index 522fb1818b..ab23330925 100644
--- a/app/src/main/java/com/android/calendar/selectcalendars/SelectCalendarsSimpleAdapter.java
+++ b/app/src/main/java/com/android/calendar/selectcalendars/SelectCalendarsSimpleAdapter.java
@@ -16,10 +16,13 @@
package com.android.calendar.selectcalendars;
+import android.app.FragmentManager;
import android.content.Context;
+import android.content.res.Configuration;
import android.content.res.Resources;
import android.database.Cursor;
import android.graphics.Rect;
+import android.graphics.drawable.Drawable;
import android.provider.CalendarContract.Calendars;
import android.view.LayoutInflater;
import android.view.TouchDelegate;
@@ -31,8 +34,6 @@
import android.widget.ListAdapter;
import android.widget.TextView;
-import androidx.fragment.app.FragmentManager;
-
import com.android.calendar.CalendarColorPickerDialog;
import com.android.calendar.DynamicTheme;
import com.android.calendar.Utils;
diff --git a/app/src/main/java/com/android/calendar/selectcalendars/SelectVisibleCalendarsFragment.java b/app/src/main/java/com/android/calendar/selectcalendars/SelectVisibleCalendarsFragment.java
index 8bfab6f2fd..2f1b391400 100644
--- a/app/src/main/java/com/android/calendar/selectcalendars/SelectVisibleCalendarsFragment.java
+++ b/app/src/main/java/com/android/calendar/selectcalendars/SelectVisibleCalendarsFragment.java
@@ -17,6 +17,7 @@
package com.android.calendar.selectcalendars;
import android.app.Activity;
+import android.app.Fragment;
import android.content.ContentUris;
import android.content.ContentValues;
import android.database.Cursor;
@@ -29,8 +30,6 @@
import android.widget.AdapterView;
import android.widget.ListView;
-import androidx.fragment.app.Fragment;
-
import com.android.calendar.AsyncQueryService;
import com.android.calendar.CalendarController;
import com.android.calendar.CalendarController.EventInfo;
@@ -134,7 +133,7 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container,
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
mAdapter = new SelectCalendarsSimpleAdapter(mContext, mCalendarItemLayout, null,
- getParentFragmentManager());
+ getFragmentManager());
mList.setAdapter(mAdapter);
mList.setOnItemClickListener(this);
}
diff --git a/app/src/main/java/com/android/calendar/settings/CalendarColorPickerDialogX.kt b/app/src/main/java/com/android/calendar/settings/CalendarColorPickerDialogX.kt
index 523b231114..be8c67de12 100644
--- a/app/src/main/java/com/android/calendar/settings/CalendarColorPickerDialogX.kt
+++ b/app/src/main/java/com/android/calendar/settings/CalendarColorPickerDialogX.kt
@@ -107,7 +107,7 @@ class CalendarColorPickerDialogX : ColorPickerDialogX() {
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
val dialog = super.onCreateDialog(savedInstanceState)
- queryService = QueryService(requireActivity())
+ queryService = QueryService(activity!!)
if (mColors == null) {
startQuery()
}
@@ -194,7 +194,7 @@ class CalendarColorPickerDialogX : ColorPickerDialogX() {
}
private fun useDefaultColors() {
- val warningDialog = AlertDialog.Builder(requireActivity())
+ val warningDialog = AlertDialog.Builder(activity!!)
.setTitle(R.string.preferences_calendar_color_warning_title)
.setMessage(R.string.preferences_calendar_color_warning_message)
.setPositiveButton(R.string.preferences_calendar_color_warning_button) { dialogInterface, _ ->
diff --git a/app/src/main/java/com/android/calendar/settings/CalendarDataStore.kt b/app/src/main/java/com/android/calendar/settings/CalendarDataStore.kt
index ceb46942d4..f652fdd7fb 100644
--- a/app/src/main/java/com/android/calendar/settings/CalendarDataStore.kt
+++ b/app/src/main/java/com/android/calendar/settings/CalendarDataStore.kt
@@ -19,17 +19,21 @@ package com.android.calendar.settings
import android.content.ContentUris
import android.content.ContentValues
+import android.net.Uri
import android.provider.CalendarContract
import androidx.fragment.app.FragmentActivity
import androidx.preference.PreferenceDataStore
+import com.android.calendar.persistence.tasks.DmfsOpenTasksContract
/**
* Custom data store for preferences that saves/retrieves settings of an individual calendar
* from Android's calendar database.
*/
-class CalendarDataStore(activity: FragmentActivity, calendarId: Long) : PreferenceDataStore() {
+class CalendarDataStore(activity: FragmentActivity, calendarId: Long, isTask: Boolean) : PreferenceDataStore() {
private var contentResolver = activity.contentResolver
private var calendarUri = ContentUris.withAppendedId(CalendarContract.Calendars.CONTENT_URI, calendarId)
+ private var taskListrUri = ContentUris.withAppendedId(DmfsOpenTasksContract.TaskLists.PROVIDER_URI, calendarId)
+ private var isTask = isTask
companion object {
private val PROJECTION = arrayOf(
@@ -39,6 +43,14 @@ class CalendarDataStore(activity: FragmentActivity, calendarId: Long) : Preferen
CalendarContract.Calendars.CALENDAR_COLOR,
CalendarContract.Calendars.CALENDAR_DISPLAY_NAME
)
+
+ private val TASKLIST_PROJECTION = arrayOf(
+ DmfsOpenTasksContract.TaskLists.COLUMN_ID,
+ DmfsOpenTasksContract.TaskLists.COLUMN_SYNC_ENABLE,
+ DmfsOpenTasksContract.TaskLists.COLUMN_VISIBLE,
+ DmfsOpenTasksContract.TaskLists.COLUMN_COLOR,
+ DmfsOpenTasksContract.TaskLists.COLUMN_NAME
+ )
}
private fun mapPreferenceKeyToDatabaseKey(key: String?): String {
@@ -51,18 +63,38 @@ class CalendarDataStore(activity: FragmentActivity, calendarId: Long) : Preferen
}
}
+ private fun mapPreferenceKeyToDatabaseKeyForTaskList(key: String?): String {
+ return when (key) {
+ CalendarPreferences.SYNCHRONIZE_KEY -> DmfsOpenTasksContract.TaskLists.COLUMN_SYNC_ENABLE
+ CalendarPreferences.VISIBLE_KEY -> DmfsOpenTasksContract.TaskLists.COLUMN_VISIBLE
+ CalendarPreferences.COLOR_KEY -> DmfsOpenTasksContract.TaskLists.COLUMN_COLOR
+ CalendarPreferences.DISPLAY_NAME_KEY -> DmfsOpenTasksContract.TaskLists.COLUMN_NAME
+ else -> throw UnsupportedOperationException("unsupported preference key")
+ }
+ }
+
override fun putBoolean(key: String?, value: Boolean) {
- val databaseKey = mapPreferenceKeyToDatabaseKey(key)
+ val databaseKey: String
+ val uri: Uri;
+ if (!isTask) {
+ databaseKey = mapPreferenceKeyToDatabaseKey(key)
+ uri = calendarUri
+ } else {
+ databaseKey = mapPreferenceKeyToDatabaseKeyForTaskList(key)
+ uri = taskListrUri
+ }
val values = ContentValues()
values.put(databaseKey, if (value) 1 else 0)
- contentResolver.update(calendarUri, values, null, null)
+ contentResolver.update(uri, values, null, null)
}
override fun getBoolean(key: String?, defValue: Boolean): Boolean {
- val databaseKey = mapPreferenceKeyToDatabaseKey(key)
+ val databaseKey: String = getValues(key)["databaseKey"] as String
+ val uri: Uri = getValues(key)["uri"] as Uri
+ val projection: Array = getValues(key)["projection"] as Array
- contentResolver.query(calendarUri, PROJECTION, null, null, null)?.use {
+ contentResolver.query(uri, projection, null, null, null)?.use {
if (it.moveToFirst()) {
return it.getInt(it.getColumnIndex(databaseKey)) == 1
}
@@ -71,17 +103,20 @@ class CalendarDataStore(activity: FragmentActivity, calendarId: Long) : Preferen
}
override fun putInt(key: String?, value: Int) {
- val databaseKey = mapPreferenceKeyToDatabaseKey(key)
+ val databaseKey: String = getValues(key)["databaseKey"] as String
+ val uri: Uri = getValues(key)["uri"] as Uri
val values = ContentValues()
values.put(databaseKey, value)
- contentResolver.update(calendarUri, values, null, null)
+ contentResolver.update(uri, values, null, null)
}
override fun getInt(key: String?, defValue: Int): Int {
- val databaseKey = mapPreferenceKeyToDatabaseKey(key)
+ val databaseKey: String = getValues(key)["databaseKey"] as String
+ val uri: Uri = getValues(key)["uri"] as Uri
+ val projection: Array = getValues(key)["projection"] as Array
- contentResolver.query(calendarUri, PROJECTION, null, null, null)?.use {
+ contentResolver.query(uri, projection, null, null, null)?.use {
if (it.moveToFirst()) {
return it.getInt(it.getColumnIndex(databaseKey))
}
@@ -90,17 +125,20 @@ class CalendarDataStore(activity: FragmentActivity, calendarId: Long) : Preferen
}
override fun putString(key: String?, value: String?) {
- val databaseKey = mapPreferenceKeyToDatabaseKey(key)
+ val databaseKey: String = getValues(key)["databaseKey"] as String
+ val uri: Uri = getValues(key)["uri"] as Uri
val values = ContentValues()
values.put(databaseKey, value)
- contentResolver.update(calendarUri, values, null, null)
+ contentResolver.update(uri, values, null, null)
}
override fun getString(key: String?, defValue: String?): String? {
- val databaseKey = mapPreferenceKeyToDatabaseKey(key)
+ val databaseKey: String = getValues(key)["databaseKey"] as String
+ val uri: Uri = getValues(key)["uri"] as Uri
+ val projection: Array = getValues(key)["projection"] as Array
- contentResolver.query(calendarUri, PROJECTION, null, null, null)?.use {
+ contentResolver.query(uri, projection, null, null, null)?.use {
if (it.moveToFirst()) {
return it.getString(it.getColumnIndex(databaseKey))
}
@@ -108,4 +146,18 @@ class CalendarDataStore(activity: FragmentActivity, calendarId: Long) : Preferen
return defValue
}
+ private fun getValues(key: String?) : Map {
+ var returnMap = HashMap();
+ if (!isTask) {
+ returnMap.put("databaseKey",mapPreferenceKeyToDatabaseKey(key))
+ returnMap.put("uri", calendarUri)
+ returnMap.put("projection", PROJECTION)
+ } else {
+ returnMap.put("databaseKey",mapPreferenceKeyToDatabaseKeyForTaskList(key))
+ returnMap.put("uri", taskListrUri)
+ returnMap.put("projection", TASKLIST_PROJECTION)
+ }
+ return returnMap
+ }
+
}
diff --git a/app/src/main/java/com/android/calendar/settings/CalendarPreferences.kt b/app/src/main/java/com/android/calendar/settings/CalendarPreferences.kt
index 4743d602d1..29077ee574 100644
--- a/app/src/main/java/com/android/calendar/settings/CalendarPreferences.kt
+++ b/app/src/main/java/com/android/calendar/settings/CalendarPreferences.kt
@@ -25,7 +25,6 @@ import android.content.pm.PackageManager
import android.graphics.drawable.Drawable
import android.os.Bundle
import android.provider.CalendarContract
-import android.provider.Settings
import android.util.TypedValue
import androidx.appcompat.app.AlertDialog
import androidx.core.content.ContextCompat
@@ -35,27 +34,29 @@ import androidx.preference.PreferenceCategory
import androidx.preference.PreferenceFragmentCompat
import androidx.preference.SwitchPreference
import com.android.calendar.Utils
-import com.android.calendar.alerts.channelId
import com.android.calendar.persistence.CalendarRepository
+import com.android.calendar.persistence.tasks.DmfsOpenTasksContract
import ws.xsoh.etar.R
class CalendarPreferences : PreferenceFragmentCompat() {
private var calendarId: Long = -1
+ private var isTask: Boolean = false;
private lateinit var calendarRepository: CalendarRepository
private lateinit var account: Account
private var numberOfEvents: Long = -1
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
calendarId = requireArguments().getLong(ARG_CALENDAR_ID)
+ isTask = requireArguments().getBoolean(ARG_IS_TASKS)
calendarRepository = CalendarRepository(requireActivity().application)
- account = calendarRepository.queryAccount(calendarId)!!
- numberOfEvents = calendarRepository.queryNumberOfEvents(calendarId)!!
+ account = calendarRepository.queryAccount(calendarId, isTask)!!
+ numberOfEvents = calendarRepository.queryNumberOfEvents(calendarId, isTask)!!
// use custom data store to save/retrieve calendar preferences in Android's calendar database
val preferenceManager = preferenceManager
- preferenceManager.preferenceDataStore = CalendarDataStore(requireActivity(), calendarId)
+ preferenceManager.preferenceDataStore = CalendarDataStore(requireActivity(), calendarId, isTask)
populatePreferences()
}
@@ -71,6 +72,7 @@ class CalendarPreferences : PreferenceFragmentCompat() {
val screen = preferenceManager.createPreferenceScreen(context)
val isLocalAccount = account.type == CalendarContract.ACCOUNT_TYPE_LOCAL
+ || account.type == DmfsOpenTasksContract.ACCOUNT_TYPE_LOCAL
val currentColor = preferenceManager.preferenceDataStore!!.getInt(COLOR_KEY, -1)
val authenticatorInfo = getAuthenticatorInfo(account)
@@ -87,25 +89,35 @@ class CalendarPreferences : PreferenceFragmentCompat() {
title = getString(R.string.preferences_calendar_color)
icon = getColorIcon(currentColor)
}
- colorPreference.setOnPreferenceClickListener {
- displayCalendarColorPicker()
- true
+ // disable it cause we need a sync adapter to update tasks db
+ if (!isTask) {
+ colorPreference.setOnPreferenceClickListener {
+ displayCalendarColorPicker()
+ true
+ }
}
val displayNamePreference = EditTextPreference(context).apply {
key = DISPLAY_NAME_KEY
title = getString(R.string.preferences_calendar_display_name)
dialogTitle = getString(R.string.preferences_calendar_display_name)
}
- displayNamePreference.setOnPreferenceChangeListener { _, newValue ->
- activity?.title = newValue as String
- true
+ // disable it cause we need a sync adapter to update tasks db
+ if (!isTask) {
+ displayNamePreference.setOnPreferenceChangeListener { _, newValue ->
+ activity?.title = newValue as String
+ true
+ }
}
+
val deletePreference = Preference(context).apply {
title = getString(R.string.preferences_calendar_delete)
}
- deletePreference.setOnPreferenceClickListener {
- deleteCalendar()
- true
+ // disable it cause we need a sync adapter to update tasks db
+ if (!isTask) {
+ deletePreference.setOnPreferenceClickListener {
+ deleteCalendar()
+ true
+ }
}
val configurePreference = Preference(context).apply {
title = getString(R.string.preferences_calendar_configure_account, authenticatorInfo?.label)
@@ -135,25 +147,13 @@ class CalendarPreferences : PreferenceFragmentCompat() {
isSelectable = false
}
+
if (!isLocalAccount) {
screen.addPreference(synchronizePreference)
}
-
screen.addPreference(visiblePreference)
-
- if(Utils.isOreoOrLater()){
- val notificationPreference = Preference(context).apply {
- title = getString(R.string.preferences_manage_notifications)
- intent = Intent(Settings.ACTION_CHANNEL_NOTIFICATION_SETTINGS).apply {
- putExtra(Settings.EXTRA_APP_PACKAGE, context.packageName)
- putExtra(Settings.EXTRA_CHANNEL_ID, channelId(this@CalendarPreferences.calendarId))
- }
- }
- screen.addPreference(notificationPreference)
- }
-
screen.addPreference(colorPreference)
- if (isLocalAccount) {
+ if (isLocalAccount && !isTask) {
screen.addPreference(displayNamePreference)
screen.addPreference(deletePreference)
}
@@ -258,7 +258,7 @@ class CalendarPreferences : PreferenceFragmentCompat() {
const val COLOR_PICKER_DIALOG_TAG = "CalendarColorPickerDialog"
const val ARG_CALENDAR_ID = "calendarId"
-
+ const val ARG_IS_TASKS = "isTasks"
const val SYNCHRONIZE_KEY = "synchronize"
const val VISIBLE_KEY = "visible"
const val COLOR_KEY = "color"
diff --git a/app/src/main/java/com/android/calendar/settings/GeneralPreferences.kt b/app/src/main/java/com/android/calendar/settings/GeneralPreferences.kt
index 1597105392..c5d9b03d9d 100644
--- a/app/src/main/java/com/android/calendar/settings/GeneralPreferences.kt
+++ b/app/src/main/java/com/android/calendar/settings/GeneralPreferences.kt
@@ -64,7 +64,6 @@ class GeneralPreferences : PreferenceFragmentCompat(),
private lateinit var colorPref: Preference
private lateinit var realEventColors: SwitchPreference
private lateinit var pureBlackNightModePref: SwitchPreference
- private lateinit var doNotCheckBatteryOptimizationPref: SwitchPreference
private lateinit var defaultStartPref: ListPreference
private lateinit var hideDeclinedPref: SwitchPreference
private lateinit var weekStartPref: ListPreference
@@ -74,7 +73,6 @@ class GeneralPreferences : PreferenceFragmentCompat(),
private lateinit var homeTzPref: Preference
private lateinit var popupPref: SwitchPreference
private lateinit var snoozeDelayPref: ListPreference
- private lateinit var useDefaultCustomSnoozeDelayPref: Preference
private lateinit var defaultReminderPref: ListPreference
private lateinit var copyDbPref: Preference
private lateinit var skipRemindersPref: ListPreference
@@ -110,7 +108,6 @@ class GeneralPreferences : PreferenceFragmentCompat(),
colorPref = preferenceScreen.findPreference(KEY_COLOR_PREF)!!
realEventColors = preferenceScreen.findPreference(KEY_REAL_EVENT_COLORS)!!
pureBlackNightModePref = preferenceScreen.findPreference(KEY_PURE_BLACK_NIGHT_MODE)!!
- doNotCheckBatteryOptimizationPref = preferenceScreen.findPreference(KEY_DO_NOT_CHECK_BATTERY_OPTIMIZATION)!!
defaultStartPref = preferenceScreen.findPreference(KEY_DEFAULT_START)!!
hideDeclinedPref = preferenceScreen.findPreference(KEY_HIDE_DECLINED)!!
weekStartPref = preferenceScreen.findPreference(KEY_WEEK_START_DAY)!!
@@ -120,7 +117,6 @@ class GeneralPreferences : PreferenceFragmentCompat(),
homeTzPref = preferenceScreen.findPreference(KEY_HOME_TZ)!!
popupPref = preferenceScreen.findPreference(KEY_ALERTS_POPUP)!!
snoozeDelayPref = preferenceScreen.findPreference(KEY_DEFAULT_SNOOZE_DELAY)!!
- useDefaultCustomSnoozeDelayPref = preferenceScreen.findPreference(KEY_USE_CUSTOM_SNOOZE_DELAY)!!
defaultReminderPref = preferenceScreen.findPreference(KEY_DEFAULT_REMINDER)!!
copyDbPref = preferenceScreen.findPreference(KEY_OTHER_COPY_DB)!!
skipRemindersPref = preferenceScreen.findPreference(KEY_OTHER_REMINDERS_RESPONDED)!!
@@ -158,7 +154,6 @@ class GeneralPreferences : PreferenceFragmentCompat(),
buildSnoozeDelayEntries()
buildDefaultReminderPrefEntries()
- handleUseCustomSnoozeDelayVisibility()
defaultEventDurationPref.summary = defaultEventDurationPref.entry
themePref.summary = themePref.entry
weekStartPref.summary = weekStartPref.entry
@@ -191,10 +186,6 @@ class GeneralPreferences : PreferenceFragmentCompat(),
initializeColorMap()
}
- private fun handleUseCustomSnoozeDelayVisibility() {
- useDefaultCustomSnoozeDelayPref.isEnabled = Integer.parseInt(snoozeDelayPref.value) >= 0
- }
-
private fun showColorPickerDialog() {
val colorPickerDialog = ColorPickerDialogX()
val selectedColorName = Utils.getSharedPreference(activity, KEY_COLOR_PREF, "teal")
@@ -240,7 +231,7 @@ class GeneralPreferences : PreferenceFragmentCompat(),
override fun onStart() {
super.onStart()
- preferenceScreen.sharedPreferences?.registerOnSharedPreferenceChangeListener(this)
+ preferenceScreen.sharedPreferences.registerOnSharedPreferenceChangeListener(this)
setPreferenceListeners(this)
}
@@ -251,7 +242,6 @@ class GeneralPreferences : PreferenceFragmentCompat(),
themePref.onPreferenceChangeListener = listener
colorPref.onPreferenceChangeListener = listener
pureBlackNightModePref.onPreferenceChangeListener = listener
- doNotCheckBatteryOptimizationPref.onPreferenceChangeListener = listener
defaultStartPref.onPreferenceChangeListener = listener
hideDeclinedPref.onPreferenceChangeListener = listener
weekStartPref.onPreferenceChangeListener = listener
@@ -268,13 +258,12 @@ class GeneralPreferences : PreferenceFragmentCompat(),
}
override fun onStop() {
- preferenceScreen.sharedPreferences?.unregisterOnSharedPreferenceChangeListener(this)
+ preferenceScreen.sharedPreferences.unregisterOnSharedPreferenceChangeListener(this)
super.onStop()
}
- override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences, key: String?) {
+ override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences, key: String) {
val a = activity ?: return
- key ?: return
BackupManager.dataChanged(a.packageName)
@@ -362,7 +351,6 @@ class GeneralPreferences : PreferenceFragmentCompat(),
snoozeDelayPref -> {
snoozeDelayPref.value = newValue as String
snoozeDelayPref.summary = snoozeDelayPref.entry
- handleUseCustomSnoozeDelayVisibility()
}
defaultStartPref -> {
val i = defaultStartPref.findIndexOfValue(newValue as String)
@@ -415,8 +403,8 @@ class GeneralPreferences : PreferenceFragmentCompat(),
defaultReminderPref.entries = entries
}
- override fun onPreferenceTreeClick(preference: Preference): Boolean {
- when (preference.key) {
+ override fun onPreferenceTreeClick(preference: Preference?): Boolean {
+ when (preference!!.key) {
KEY_COLOR_PREF -> {
showColorPickerDialog()
return true
@@ -524,7 +512,6 @@ class GeneralPreferences : PreferenceFragmentCompat(),
const val KEY_THEME_PREF = "pref_theme"
const val KEY_COLOR_PREF = "pref_color"
const val KEY_REAL_EVENT_COLORS = "pref_real_event_colors"
- const val KEY_DO_NOT_CHECK_BATTERY_OPTIMIZATION = "pref_do_not_check_battery_optimization"
const val KEY_PURE_BLACK_NIGHT_MODE = "pref_pure_black_night_mode"
const val KEY_DEFAULT_START = "preferences_default_start"
const val KEY_HIDE_DECLINED = "preferences_hide_declined"
@@ -541,8 +528,8 @@ class GeneralPreferences : PreferenceFragmentCompat(),
const val KEY_ALERTS_POPUP = "preferences_alerts_popup"
const val KEY_SHOW_CONTROLS = "preferences_show_controls"
const val KEY_DEFAULT_REMINDER = "preferences_default_reminder"
- const val NO_REMINDER = -2147483648
- const val NO_REMINDER_STRING = "-2147483648"
+ const val NO_REMINDER = -1
+ const val NO_REMINDER_STRING = "-1"
const val REMINDER_DEFAULT_TIME = 10 // in minutes
const val KEY_USE_CUSTOM_SNOOZE_DELAY = "preferences_custom_snooze_delay"
const val KEY_DEFAULT_SNOOZE_DELAY = "preferences_default_snooze_delay"
diff --git a/app/src/main/java/com/android/calendar/settings/MainListPreferences.kt b/app/src/main/java/com/android/calendar/settings/MainListPreferences.kt
index eacc79f3d5..2cc265da2b 100644
--- a/app/src/main/java/com/android/calendar/settings/MainListPreferences.kt
+++ b/app/src/main/java/com/android/calendar/settings/MainListPreferences.kt
@@ -75,9 +75,9 @@ class MainListPreferences : PreferenceFragmentCompat() {
val accountCategoryUniqueKey = "account_category_${calendar.accountName}_${calendar.accountType}"
var accountCategory = screen.findPreference(accountCategoryUniqueKey)
if (accountCategory == null) {
- accountCategory = PreferenceCategory(requireContext()).apply {
+ accountCategory = PreferenceCategory(context).apply {
key = accountCategoryUniqueKey
- title = calendar.accountName
+ title = if (calendar.isTasks) "My task" else calendar.accountName
icon = ContextCompat.getDrawable(requireContext(), R.drawable.ic_account_circle)
order = if (calendar.isLocal) 10 else 11 // show offline calendar first
isOrderingAsAdded = false // use alphabetic ordering for children
@@ -86,10 +86,10 @@ class MainListPreferences : PreferenceFragmentCompat() {
}
// add preference per calendar if not already present
- val calendarUniqueKey = "calendar_preference_${calendar.id}"
+ val calendarUniqueKey = "calendar_preference_${calendar.id}_${calendar.name}"
var calendarPreference = screen.findPreference(calendarUniqueKey)
if (calendarPreference == null) {
- calendarPreference = Preference(requireContext())
+ calendarPreference = Preference(context)
accountCategory.addPreference(calendarPreference)
}
calendarPreference.apply {
@@ -97,11 +97,12 @@ class MainListPreferences : PreferenceFragmentCompat() {
title = if (calendar.displayName.isNullOrBlank()) getString(R.string.preferences_calendar_no_display_name) else calendar.displayName
fragment = CalendarPreferences::class.java.name
order = if (calendar.isPrimary) 1 else 2 // primary calendar is first, others are alphabetically ordered below
- icon = getCalendarIcon(calendar.color, calendar.visible, calendar.syncEvents)
+ icon = getCalendarIcon(calendar.color, calendar.visible, calendar.syncEvents, calendar.isTasks)
summary = getCalendarSummary(calendar.visible, calendar.syncEvents)
}
// pass-through calendar id for CalendarPreferences
calendarPreference.extras.putLong(CalendarPreferences.ARG_CALENDAR_ID, calendar.id)
+ calendarPreference.extras.putBoolean(CalendarPreferences.ARG_IS_TASKS, calendar.isTasks)
}
// remove preferences for calendars no longer existing
@@ -138,11 +139,17 @@ class MainListPreferences : PreferenceFragmentCompat() {
}
}
- private fun getCalendarIcon(color: Int, visible: Boolean, syncEvents: Boolean): Drawable {
+ private fun getCalendarIcon(color: Int, visible: Boolean, syncEvents: Boolean, isTask: Boolean): Drawable {
val icon = if (!syncEvents) {
ContextCompat.getDrawable(requireContext(), R.drawable.ic_sync_off_light)
- } else if (visible) {
+ } else if (visible && !isTask) {
ContextCompat.getDrawable(requireContext(), R.drawable.circle)
+ } else if (visible && isTask) {
+ ContextCompat.getDrawable(requireContext(), R.drawable.square)
+ } else if (!visible && !isTask) {
+ ContextCompat.getDrawable(requireContext(), R.drawable.circle_outline)
+ } else if (!visible && isTask) {
+ ContextCompat.getDrawable(requireContext(), R.drawable.square_outline)
} else {
ContextCompat.getDrawable(requireContext(), R.drawable.circle_outline)
}
@@ -152,12 +159,12 @@ class MainListPreferences : PreferenceFragmentCompat() {
}
private fun addGeneralPreferences(screen: PreferenceScreen) {
- val generalPreference = Preference(requireContext()).apply {
+ val generalPreference = Preference(context).apply {
title = getString(R.string.preferences_list_general)
icon = ContextCompat.getDrawable(requireContext(), R.drawable.ic_settings)
fragment = GeneralPreferences::class.java.name
}
- val addCaldavPreference = Preference(requireContext()).apply {
+ val addCaldavPreference = Preference(context).apply {
title = getString(R.string.preferences_list_add_remote)
icon = ContextCompat.getDrawable(requireContext(), R.drawable.ic_add)
}
@@ -165,7 +172,7 @@ class MainListPreferences : PreferenceFragmentCompat() {
launchDavX5Login()
true
}
- val addEtesyncPreference = Preference(requireContext()).apply {
+ val addEtesyncPreference = Preference(context).apply {
title = getString(R.string.preferences_list_add_remote_etesync)
icon = ContextCompat.getDrawable(requireContext(), R.drawable.ic_add)
}
@@ -173,7 +180,7 @@ class MainListPreferences : PreferenceFragmentCompat() {
launchAddEtesync()
true
}
- val addOfflinePreference = Preference(requireContext()).apply {
+ val addOfflinePreference = Preference(context).apply {
title = getString(R.string.preferences_list_add_offline)
icon = ContextCompat.getDrawable(requireContext(), R.drawable.ic_add)
}
diff --git a/app/src/main/java/com/android/calendar/settings/QuickResponsePreferences.kt b/app/src/main/java/com/android/calendar/settings/QuickResponsePreferences.kt
index 6e167d788a..312f85c957 100644
--- a/app/src/main/java/com/android/calendar/settings/QuickResponsePreferences.kt
+++ b/app/src/main/java/com/android/calendar/settings/QuickResponsePreferences.kt
@@ -53,7 +53,7 @@ class QuickResponsePreferences : PreferenceFragmentCompat(), Preference.OnPrefer
responsePreferences = arrayOfNulls(responses.size)
for ((i, response) in responses.withIndex()) {
- val responsePreference = EditTextPreference(requireActivity()).apply {
+ val responsePreference = EditTextPreference(activity).apply {
setDialogTitle(R.string.quick_response_settings_edit_title)
title = response
text = response
diff --git a/app/src/main/java/com/android/calendar/settings/SettingsActivity.kt b/app/src/main/java/com/android/calendar/settings/SettingsActivity.kt
index 8f43082098..6ec224f14e 100644
--- a/app/src/main/java/com/android/calendar/settings/SettingsActivity.kt
+++ b/app/src/main/java/com/android/calendar/settings/SettingsActivity.kt
@@ -81,7 +81,7 @@ class SettingsActivity : AppCompatActivity(),
val args = pref.extras
val fragment = supportFragmentManager.fragmentFactory.instantiate(
classLoader,
- pref.fragment!!
+ pref.fragment
).apply {
arguments = args
setTargetFragment(caller, 0)
diff --git a/app/src/main/java/com/android/calendar/settings/ViewDetailsPreferences.kt b/app/src/main/java/com/android/calendar/settings/ViewDetailsPreferences.kt
index 420876785e..aa2868235e 100644
--- a/app/src/main/java/com/android/calendar/settings/ViewDetailsPreferences.kt
+++ b/app/src/main/java/com/android/calendar/settings/ViewDetailsPreferences.kt
@@ -77,7 +77,7 @@ class ViewDetailsPreferences : PreferenceFragmentCompat() {
val newEntries = Arrays.copyOf(entries, entries.size - 1)
displayTime.entries = newEntries
}
- if (displayTime.entry == null || displayTime.entry!!.isEmpty()) {
+ if (displayTime.entry == null || displayTime.entry.isEmpty()) {
displayTime.value = getDefaultTimeToShow(activity).toString()
}
}
@@ -169,11 +169,11 @@ class ViewDetailsPreferences : PreferenceFragmentCompat() {
return if (Utils.getConfigBool(context, R.bool.show_time_in_month)) TimeVisibility.SHOW_TIME_RANGE_BELOW.value else TimeVisibility.SHOW_NONE.value
}
- fun getPreferences(context: Context?): Preferences {
+ fun getPreferences(context: Context?): Preferences? {
return Preferences(context!!)
}
- fun setDefaultValues(context: Context) {
+ fun setDefaultValues(context: Context?) {
PreferenceManager.setDefaultValues(context, SHARED_PREFS_NAME, Context.MODE_PRIVATE,
R.xml.view_details_preferences, true)
}
diff --git a/app/src/main/java/com/android/calendar/widget/CalendarAppWidgetModel.java b/app/src/main/java/com/android/calendar/widget/CalendarAppWidgetModel.java
index d454d6ba33..f3ea893762 100644
--- a/app/src/main/java/com/android/calendar/widget/CalendarAppWidgetModel.java
+++ b/app/src/main/java/com/android/calendar/widget/CalendarAppWidgetModel.java
@@ -28,6 +28,10 @@
import com.android.calendarcommon2.Time;
import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.Date;
import java.util.LinkedList;
import java.util.List;
import java.util.TimeZone;
@@ -50,7 +54,7 @@ class CalendarAppWidgetModel {
public CalendarAppWidgetModel(Context context, String timeZone) {
mNow = System.currentTimeMillis();
Time time = new Time(timeZone);
- time.set(mNow); // This is needed for gmtoff to be set
+ time.set(System.currentTimeMillis()); // This is needed for gmtoff to be set
mTodayJulianDay = Time.getJulianDay(mNow, time.getGmtOffset());
mMaxJulianDay = mTodayJulianDay + CalendarAppWidgetService.MAX_DAYS - 1;
mEventInfos = new ArrayList(50);
@@ -59,12 +63,14 @@ public CalendarAppWidgetModel(Context context, String timeZone) {
mContext = context;
}
- public void buildFromCursor(Cursor cursor, String timeZone) {
+ public void buildFromCursor(Cursor cursor, String timeZone, Boolean isTask) {
+ final Time recycle = new Time(timeZone);
final ArrayList> mBuckets =
new ArrayList>(CalendarAppWidgetService.MAX_DAYS);
for (int i = 0; i < CalendarAppWidgetService.MAX_DAYS; i++) {
mBuckets.add(new LinkedList());
}
+ recycle.set(System.currentTimeMillis());
mShowTZ = !TextUtils.equals(timeZone, Utils.getCurrentTimezone());
if (mShowTZ) {
mHomeTZName = TimeZone.getTimeZone(timeZone).getDisplayName(false, TimeZone.SHORT);
@@ -78,20 +84,32 @@ public void buildFromCursor(Cursor cursor, String timeZone) {
final boolean allDay = cursor.getInt(CalendarAppWidgetService.INDEX_ALL_DAY) != 0;
long start = cursor.getLong(CalendarAppWidgetService.INDEX_BEGIN);
long end = cursor.getLong(CalendarAppWidgetService.INDEX_END);
+ if (isTask) {
+ Calendar instance = Calendar.getInstance();
+ instance.setTimeInMillis(end);
+ instance.add(Calendar.MINUTE, -30);
+ start = instance.getTimeInMillis();
+ }
final String title = cursor.getString(CalendarAppWidgetService.INDEX_TITLE);
final String location =
cursor.getString(CalendarAppWidgetService.INDEX_EVENT_LOCATION);
// we don't compute these ourselves because it seems to produce the
// wrong endDay for all day events
- final int startDay = cursor.getInt(CalendarAppWidgetService.INDEX_START_DAY);
- final int endDay = cursor.getInt(CalendarAppWidgetService.INDEX_END_DAY);
+ final int startDay;
+ final int endDay;
+ if (isTask) {
+ startDay = Time.getJulianDay(start, new Time().getGmtOffset());
+ endDay = Time.getJulianDay(end, new Time().getGmtOffset());
+ } else {
+ startDay = cursor.getInt(CalendarAppWidgetService.INDEX_START_DAY);
+ endDay = cursor.getInt(CalendarAppWidgetService.INDEX_END_DAY);
+ }
final int color = cursor.getInt(CalendarAppWidgetService.INDEX_COLOR);
final int selfStatus = cursor
.getInt(CalendarAppWidgetService.INDEX_SELF_ATTENDEE_STATUS);
// Adjust all-day times into local timezone
if (allDay) {
- final Time recycle = new Time();
start = Utils.convertAlldayUtcToLocal(recycle, start, tz);
end = Utils.convertAlldayUtcToLocal(recycle, end, tz);
}
@@ -110,18 +128,34 @@ public void buildFromCursor(Cursor cursor, String timeZone) {
int i = mEventInfos.size();
mEventInfos.add(populateEventInfo(eventId, allDay, start, end, startDay, endDay, title,
location, color, selfStatus));
+ }
+ }
+
+ public void populateBuckets(String timeZone) {
+ final Time recycle = new Time(timeZone);
+ recycle.set(System.currentTimeMillis());
+ Collections.sort(mEventInfos, Comparator.comparing(u -> new Date(u.start)));
+
+ final ArrayList> mBuckets =
+ new ArrayList>(CalendarAppWidgetService.MAX_DAYS);
+ for (int i = 0; i < CalendarAppWidgetService.MAX_DAYS; i++) {
+ mBuckets.add(new LinkedList());
+ }
+ int i = 0;
+ for (EventInfo mEventInfo : mEventInfos) {
// populate the day buckets that this event falls into
- int from = Math.max(startDay, mTodayJulianDay);
- int to = Math.min(endDay, mMaxJulianDay);
+ int from = Math.max(Time.getJulianDay(mEventInfo.start, new Time().getGmtOffset()), mTodayJulianDay);
+ int to = Math.min(Time.getJulianDay(mEventInfo.end, new Time().getGmtOffset()), mMaxJulianDay);
for (int day = from; day <= to; day++) {
LinkedList bucket = mBuckets.get(day - mTodayJulianDay);
RowInfo rowInfo = new RowInfo(RowInfo.TYPE_MEETING, i);
- if (allDay) {
+ if (mEventInfo.allDay) {
bucket.addFirst(rowInfo);
} else {
bucket.add(rowInfo);
}
}
+ i++;
}
int day = mTodayJulianDay;
@@ -130,11 +164,12 @@ public void buildFromCursor(Cursor cursor, String timeZone) {
if (!bucket.isEmpty()) {
// We don't show day header in today
if (day != mTodayJulianDay) {
- final Time recycle = new Time(timeZone);
final DayInfo dayInfo = populateDayInfo(day, recycle);
// Add the day header
final int dayIndex = mDayInfos.size();
- mDayInfos.add(dayInfo);
+ if (!mDayInfos.contains(dayInfo)) {
+ mDayInfos.add(dayInfo);
+ }
mRowInfos.add(new RowInfo(RowInfo.TYPE_DAY, dayIndex));
}
@@ -204,16 +239,15 @@ private EventInfo populateEventInfo(long eventId, boolean allDay, long start, lo
private DayInfo populateDayInfo(int julianDay, Time recycle) {
long millis = recycle.setJulianDay(julianDay);
- int flags =
- DateUtils.FORMAT_ABBREV_ALL |
- DateUtils.FORMAT_SHOW_DATE |
- DateUtils.FORMAT_SHOW_WEEKDAY;
+ int flags = DateUtils.FORMAT_ABBREV_ALL | DateUtils.FORMAT_SHOW_DATE;
String label;
if (julianDay == mTodayJulianDay + 1) {
+ flags |= DateUtils.FORMAT_SHOW_WEEKDAY;
label = mContext.getString(R.string.agenda_tomorrow,
Utils.formatDateRange(mContext, millis, millis, flags));
} else {
+ flags |= DateUtils.FORMAT_SHOW_WEEKDAY;
label = Utils.formatDateRange(mContext, millis, millis, flags);
}
return new DayInfo(julianDay, label);
diff --git a/app/src/main/java/com/android/calendar/widget/CalendarAppWidgetProvider.java b/app/src/main/java/com/android/calendar/widget/CalendarAppWidgetProvider.java
index 427cadabeb..bfcbd594fc 100644
--- a/app/src/main/java/com/android/calendar/widget/CalendarAppWidgetProvider.java
+++ b/app/src/main/java/com/android/calendar/widget/CalendarAppWidgetProvider.java
@@ -42,6 +42,8 @@
import com.android.calendar.event.EditEventActivity;
import com.android.calendarcommon2.Time;
+import java.util.Calendar;
+
import ws.xsoh.etar.R;
/**
@@ -139,7 +141,7 @@ public void onReceive(Context context, Intent intent) {
// coming in without extras, which AppWidgetProvider then blocks.
final String action = intent.getAction();
if (LOGD)
- Log.d(TAG, "AppWidgetProvider got the intent: " + intent);
+ Log.d(TAG, "AppWidgetProvider got the intent: " + intent.toString());
if (Utils.getWidgetUpdateAction(context).equals(action)) {
if (!isWidgetSupported(context)) {
return;
diff --git a/app/src/main/java/com/android/calendar/widget/CalendarAppWidgetService.java b/app/src/main/java/com/android/calendar/widget/CalendarAppWidgetService.java
index d26d10f414..50b2b771da 100644
--- a/app/src/main/java/com/android/calendar/widget/CalendarAppWidgetService.java
+++ b/app/src/main/java/com/android/calendar/widget/CalendarAppWidgetService.java
@@ -24,6 +24,7 @@
import android.content.CursorLoader;
import android.content.Intent;
import android.content.Loader;
+import android.content.pm.PackageManager;
import android.content.res.Resources;
import android.database.Cursor;
import android.database.MatrixCursor;
@@ -40,8 +41,11 @@
import android.widget.RemoteViews;
import android.widget.RemoteViewsService;
+import androidx.core.content.ContextCompat;
import com.android.calendar.DynamicTheme;
+import com.android.calendar.Event;
import com.android.calendar.Utils;
+import com.android.calendar.persistence.tasks.DmfsOpenTasksContract;
import com.android.calendar.widget.CalendarAppWidgetModel.DayInfo;
import com.android.calendar.widget.CalendarAppWidgetModel.EventInfo;
import com.android.calendar.widget.CalendarAppWidgetModel.RowInfo;
@@ -70,6 +74,19 @@ public class CalendarAppWidgetService extends RemoteViewsService {
Instances.DISPLAY_COLOR,
Instances.SELF_ATTENDEE_STATUS,
};
+
+ static final String[] TASK_PROJECTION = new String[]{
+ DmfsOpenTasksContract.Tasks.COLUMN_IS_ALLDAY,
+ DmfsOpenTasksContract.Tasks.COLUMN_START_DATE,
+ DmfsOpenTasksContract.Tasks.COLUMN_DUE_DATE,
+ DmfsOpenTasksContract.Tasks.COLUMN_TITLE,
+ DmfsOpenTasksContract.Tasks.COLUMN_LOCATION,
+ DmfsOpenTasksContract.Tasks.COLUMN_ID,
+ DmfsOpenTasksContract.Tasks.COLUMN_START_DATE,
+ DmfsOpenTasksContract.Tasks.COLUMN_DUE_DATE,
+ DmfsOpenTasksContract.Tasks.COLUMN_LIST_COLOR,
+ "1 as selfAttendeeStatus",
+ };
static final int INDEX_ALL_DAY = 0;
static final int INDEX_BEGIN = 1;
static final int INDEX_END = 2;
@@ -173,7 +190,7 @@ public CalendarFactory() {
protected static CalendarAppWidgetModel buildAppWidgetModel(
Context context, Cursor cursor, String timeZone) {
CalendarAppWidgetModel model = new CalendarAppWidgetModel(context, timeZone);
- model.buildFromCursor(cursor, timeZone);
+ model.buildFromCursor(cursor, timeZone, false);
return model;
}
@@ -511,6 +528,20 @@ public void onLoadComplete(Loader loader, Cursor cursor) {
MatrixCursor matrixCursor = Utils.matrixCursorFromCursor(cursor);
try {
mModel = buildAppWidgetModel(mContext, matrixCursor, tz);
+ long begin = now - DateUtils.DAY_IN_MILLIS;
+ long end = now + SEARCH_DURATION + DateUtils.DAY_IN_MILLIS;
+
+ int mFirstLoadedJulianDay = Time.getJulianDay(begin, new Time().getGmtOffset());
+ int mLastLoadedJulianDay = Time.getJulianDay(end, new Time().getGmtOffset());
+
+ if (ContextCompat.checkSelfPermission(mContext, DmfsOpenTasksContract.TASK_READ_PERMISSION)
+ == PackageManager.PERMISSION_GRANTED) {
+ Cursor cTasks = Event.instancesQueryForTasks(mContext.getContentResolver(), TASK_PROJECTION, mFirstLoadedJulianDay, mLastLoadedJulianDay);
+ MatrixCursor matrixCursorTasks = Utils.matrixCursorFromCursor(cTasks);
+ mModel.buildFromCursor(matrixCursorTasks, tz, true);
+ }
+
+ mModel.populateBuckets(tz);
} finally {
if (matrixCursor != null) {
matrixCursor.close();
diff --git a/app/src/main/res/drawable-hdpi/stat_notify_calendar.webp b/app/src/main/res/drawable-hdpi/stat_notify_calendar.webp
new file mode 100644
index 0000000000..9e40ee5950
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/stat_notify_calendar.webp differ
diff --git a/app/src/main/res/drawable-mdpi/stat_notify_calendar.webp b/app/src/main/res/drawable-mdpi/stat_notify_calendar.webp
new file mode 100644
index 0000000000..30e7634cce
Binary files /dev/null and b/app/src/main/res/drawable-mdpi/stat_notify_calendar.webp differ
diff --git a/app/src/main/res/drawable-xhdpi/stat_notify_calendar.webp b/app/src/main/res/drawable-xhdpi/stat_notify_calendar.webp
new file mode 100644
index 0000000000..27a6e85d05
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/stat_notify_calendar.webp differ
diff --git a/app/src/main/res/drawable-xxhdpi/stat_notify_calendar.webp b/app/src/main/res/drawable-xxhdpi/stat_notify_calendar.webp
new file mode 100644
index 0000000000..cfe7869efd
Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/stat_notify_calendar.webp differ
diff --git a/app/src/main/res/drawable-xxxhdpi/stat_notify_calendar.webp b/app/src/main/res/drawable-xxxhdpi/stat_notify_calendar.webp
new file mode 100644
index 0000000000..bec7a2487b
Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/stat_notify_calendar.webp differ
diff --git a/app/src/main/res/drawable/ic_colorpicker.xml b/app/src/main/res/drawable/ic_colorpicker.xml
index af5a4d14ec..4abeea58f9 100644
--- a/app/src/main/res/drawable/ic_colorpicker.xml
+++ b/app/src/main/res/drawable/ic_colorpicker.xml
@@ -1,4 +1,4 @@
-
diff --git a/app/src/main/res/drawable/ic_error_outline.xml b/app/src/main/res/drawable/ic_error_outline.xml
deleted file mode 100644
index 7b4fbf9a26..0000000000
--- a/app/src/main/res/drawable/ic_error_outline.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-
-
-
diff --git a/app/src/main/res/drawable/square.xml b/app/src/main/res/drawable/square.xml
new file mode 100644
index 0000000000..70bc1b65bf
--- /dev/null
+++ b/app/src/main/res/drawable/square.xml
@@ -0,0 +1,10 @@
+
+
+
+
diff --git a/app/src/main/res/drawable/square_outline.xml b/app/src/main/res/drawable/square_outline.xml
new file mode 100644
index 0000000000..c6bba3d544
--- /dev/null
+++ b/app/src/main/res/drawable/square_outline.xml
@@ -0,0 +1,10 @@
+
+
+
+
diff --git a/app/src/main/res/drawable/stat_notify_calendar_events.xml b/app/src/main/res/drawable/stat_notify_calendar_events.xml
deleted file mode 100644
index 64be285eb3..0000000000
--- a/app/src/main/res/drawable/stat_notify_calendar_events.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-
-
-
-
-
diff --git a/app/src/main/res/drawable/stat_notify_refresh_events.xml b/app/src/main/res/drawable/stat_notify_refresh_events.xml
deleted file mode 100644
index f2fede3523..0000000000
--- a/app/src/main/res/drawable/stat_notify_refresh_events.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-
-
-
-
-
-
-
diff --git a/app/src/main/res/layout/edit_event_all.xml b/app/src/main/res/layout/edit_event_all.xml
index 37fd4252bb..e4858ae2c4 100644
--- a/app/src/main/res/layout/edit_event_all.xml
+++ b/app/src/main/res/layout/edit_event_all.xml
@@ -59,7 +59,7 @@
android:inputType="textAutoCorrect|textCapSentences"
android:minHeight="48dip"
android:singleLine="true"
- android:textSize="20sp"
+ android:textSize="24sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
@@ -137,17 +137,19 @@
android:id="@+id/change_color_new_event"
android:layout_width="0dp"
android:layout_height="wrap_content"
- android:layout_marginEnd="24dp"
- android:layout_marginTop="20dp"
+ android:layout_marginEnd="32dp"
android:background="?android:attr/selectableItemBackground"
android:contentDescription="@string/choose_event_color_label"
android:enabled="false"
android:scaleType="center"
+ android:scaleX="2"
+ android:scaleY="2"
android:src="@drawable/ic_colorpicker"
+ android:tint="?attr/colorButtonNormal"
android:visibility="invisible"
app:layout_constraintBottom_toBottomOf="@+id/calendar_selector_group_icon"
app:layout_constraintEnd_toEndOf="parent"
- app:layout_constraintTop_toTopOf="@+id/view" />
+ app:layout_constraintTop_toTopOf="@+id/calendar_selector_group_icon" />
-
-
+
@@ -273,11 +273,9 @@
android:layout_height="wrap_content"
android:layout_marginStart="12dp"
android:layout_marginEnd="32dp"
- android:layout_marginTop="8dp"
android:background="?android:attr/selectableItemBackground"
android:contentDescription="@string/accessibility_pick_time_zone"
- android:gravity="start"
- android:lineSpacingExtra="4dp"
+ android:gravity="start|center_vertical"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@+id/timezone_icon"
app:layout_constraintTop_toBottomOf="@+id/end_date" />
@@ -415,7 +413,7 @@
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="12dp"
- android:layout_marginEnd="24dp"
+ android:layout_marginEnd="32dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@+id/attendees_icon"
app:layout_constraintTop_toBottomOf="@+id/view2">
@@ -446,7 +444,7 @@
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="12dp"
- android:layout_marginEnd="24dp"
+ android:layout_marginEnd="32dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@+id/where_icon"
app:layout_constraintTop_toBottomOf="@+id/add_attendees_row">
@@ -478,7 +476,7 @@
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="12dp"
- android:layout_marginEnd="24dp"
+ android:layout_marginEnd="32dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@+id/description_icon"
app:layout_constraintTop_toBottomOf="@+id/where_row">
@@ -510,7 +508,7 @@
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="12dp"
- android:layout_marginEnd="24dp"
+ android:layout_marginEnd="32dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@+id/url_icon"
app:layout_constraintTop_toBottomOf="@+id/description_row">
@@ -583,7 +581,7 @@
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="4dp"
- android:layout_marginEnd="24dp"
+ android:layout_marginEnd="16dp"
android:focusable="true"
android:orientation="vertical"
android:translationY="-6dp"
@@ -628,7 +626,7 @@
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
- android:layout_marginEnd="16dp"
+ android:layout_marginEnd="32dp"
android:contentDescription="@string/accessibility_reminder_showmeas"
android:entries="@array/availability"
android:prompt="@string/presence_label"
@@ -663,7 +661,7 @@
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
- android:layout_marginEnd="16dp"
+ android:layout_marginEnd="32dp"
android:contentDescription="@string/accessibility_reminder_privacy"
android:entries="@array/visibility"
android:prompt="@string/privacy_label"
diff --git a/app/src/main/res/layout/edit_reminder_item.xml b/app/src/main/res/layout/edit_reminder_item.xml
index 22da2f4cf9..b78074ba36 100644
--- a/app/src/main/res/layout/edit_reminder_item.xml
+++ b/app/src/main/res/layout/edit_reminder_item.xml
@@ -17,8 +17,7 @@
+ android:layout_height="wrap_content">
@@ -46,7 +44,9 @@
android:layout_height="wrap_content"
android:contentDescription="@string/accessibility_reminder_type"
android:entries="@array/reminder_methods_labels"
- android:gravity="top|start"
+ android:gravity="top|end"
+ android:paddingStart="0dp"
+ android:paddingEnd="28dp"
app:layout_constraintEnd_toStartOf="@+id/reminder_remove"
app:layout_constraintStart_toEndOf="@+id/reminder_minutes_value"
app:layout_constraintTop_toTopOf="@+id/reminder_minutes_value" />
@@ -58,9 +58,6 @@
android:layout_height="wrap_content"
android:contentDescription="@string/accessibility_remove_reminder"
android:gravity="center_vertical"
- android:layout_marginTop="2dp"
- android:padding="4dp"
- android:paddingEnd="0dp"
app:layout_constraintBottom_toBottomOf="@+id/reminder_method_value"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="@+id/reminder_method_value" />
diff --git a/app/src/main/res/layout/event_info.xml b/app/src/main/res/layout/event_info.xml
index 55d9017e9b..bf9824e20e 100644
--- a/app/src/main/res/layout/event_info.xml
+++ b/app/src/main/res/layout/event_info.xml
@@ -311,16 +311,16 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="4dip"
- android:layout_marginStart="12dp"
- android:layout_marginEnd="12dp"
+ android:layout_marginStart="4dip"
+ android:layout_marginEnd="8dip"
android:orientation="vertical" />
Yfory am %s
- %1$s, %2$s
+
+ %1$s, %2$s
+
(Dim teitl)
- Dim munudau
@@ -91,6 +93,8 @@
Preifatrwydd
Ychwanegu nodyn atgoffa
Dim calendrau
+ Cyn medru ychwanegu digwyddiad, rhaid ychwanegu o leiaf un cyfrif Calendr i dy ddyfais a gwneud calendr yn weladwy. Tapia Creu Cyfrif i ychwanegu cyfrif (os wyt ti newydd ychwanegu cyfrif, rho gynnig arall arni ar ôl aros iddo gysoni). Neu tapia Diddymu a sicrhau bod o leiaf un calendr yn weladwy.
+ Ychwanegu cyfrif
Calendr:
Trefnydd:
Dewisa liw i\'r digwyddiad
@@ -261,12 +265,16 @@
+ Digwyddiad newydd
Digwyddiad %1$s o %2$s.
- - %d digwyddiadau
+ - 0 digwyddiadau
- 1 digwyddiad
- - <xliff:g xmlns:xliff=\"urn:oasis:names:tc:xliff:document:1.2\" id=\"count\">%d</xlif</xliff:g><xliff:g xmlns:xliff=\"urn:oasis:names:tc:xliff:document:1.2\" id=\"count\"><xliff:g xmlns:xliff=\"urn:oasis:names:tc:xliff:document:1.2\" id=\"count\">f:g> ddigwyddiad
- - %d digwyddiad
- - %d digwyddiad
- - %d digwyddiad
+ -
+ %d ddigwyddiad
+ -
+ %d digwyddiad
+ -
+ %d digwyddiad
+ -
+ %d digwyddiad
- 0 digwyddiadau
diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml
index 887c8d27b7..11d0a4ce75 100644
--- a/app/src/main/res/values-da/strings.xml
+++ b/app/src/main/res/values-da/strings.xml
@@ -76,6 +76,8 @@
"Fortrolighed"
"Tilføj påmindelse"
"Der er ingen kalendere"
+ "Før du kan tilføje en begivenhed, skal du tilføje mindst én Kalender-konto til din enhed og gøre en kalender synlig. Tryk på Tilføj konto for at tilføje en konto (hvis du lige har tilføjet en konto, så vent til den er færdig med at synkronisere, og prøv så igen). Eller tryk på Annuller, og sørg for, at mindst én kalender er synlig."
+ "Tilføj konto"
"Kalender:"
"Organisator:"
"Vælg begivenhedsfarve"
diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml
index df61946b2c..6f029283de 100644
--- a/app/src/main/res/values-de/strings.xml
+++ b/app/src/main/res/values-de/strings.xml
@@ -80,6 +80,8 @@
"Datenschutz"
"Erinnerung hinzufügen"
"Keine Kalender"
+ "Damit Sie einen Termin hinzufügen können, müssen Sie mindestens ein Kalender-Konto zu Ihrem Gerät hinzufügen und einen Kalender sichtbar machen. Tippen Sie zum Hinzufügen eines Kontos auf \"Konto hinzufügen\". Falls Sie gerade ein Konto hinzugefügt haben, warten Sie, bis die Synchronisierung abgeschlossen ist, und versuchen Sie es dann erneut. Sie können auch auf \"Abbrechen\" tippen und sich vergewissern, dass mindestens ein Kalender sichtbar ist."
+ "Konto hinzufügen"
"Kalender:"
Organisator:
"Terminfarbe auswählen"
@@ -305,13 +307,13 @@
Offline-Kalender hinzufügen
Offline-Kalender hinzufügen
Geben Sie einen Kalendernamen ein!
- Offline-Kalender sind NICHT mit einem Cloud-Service synchronisiert und nur auf deinem Telefon verfügbar.
+ Offline-Kalender sind NICHT mit einem Cloud-Service synchronisiert und nur auf Ihrem Telefon verfügbar.
Kalender hinzufügen
Name
Abbrechen
Warnung
Ich verstehe
- Willst du diesen Kalender wirklich löschen\?
+ Wollen Sie diesen Kalender wirklich löschen\?
Kalender löschen
Abbrechen
Über Etar
@@ -345,10 +347,4 @@
Echte Terminfarben verwenden
Info
Duplizieren
- URL
- Bevor du einen Termin hinzufügen kannst, musst du mindestens einen Kalender auf deinem Gerät hinzufügen
- Kalender hinzufügen
- Benachrichtigungen verwalten
- Akku-Optimierung nicht überprüfen
- Kalender
\ No newline at end of file
diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml
index e4b4108041..6858063ac3 100644
--- a/app/src/main/res/values-el/strings.xml
+++ b/app/src/main/res/values-el/strings.xml
@@ -76,6 +76,8 @@
"Απόρρητο"
"Προσθήκη υπενθύμισης"
"Δεν υπάρχουν ημερολόγια"
+ Για να μπορέσετε να προσθέσετε ένα συμβάν, πρέπει να προσθέσετε στη συσκευή σας τουλάχιστον έναν λογαριασμό στο Ημερολόγιο και να κάνετε το ημερολόγιο ορατό. Αγγίξτε την επιλογή \"Προσθήκη λογαριασμού\" για να προσθέσετε έναν λογαριασμό (σε περίπτωση που μόλις προσθέσατε έναν λογαριασμό, περιμένετε να ολοκληρωθεί ο συγχρονισμός του και προσπαθήστε ξανά). Εναλλακτικά, αγγίξτε την επιλογή \"Ακύρωση\" και βεβαιωθείτε ότι τουλάχιστον ένα ημερολόγιο είναι ορατό.
+ "Προσθήκη λογαριασμού"
"Ημερολόγιο:"
"Διοργανωτής:"
"Επιλέξτε το χρώμα συμβάντος"
diff --git a/app/src/main/res/values-en-rGB/strings.xml b/app/src/main/res/values-en-rGB/strings.xml
index 1b5d5cea16..8bd81803e0 100644
--- a/app/src/main/res/values-en-rGB/strings.xml
+++ b/app/src/main/res/values-en-rGB/strings.xml
@@ -76,6 +76,8 @@
"Privacy"
"Add reminder"
"No calendars"
+ "Before you can add an event, you must add at least one Calendar account to your device and make a calendar visible. Touch Add Account to add an account (if you\'ve just added an account, wait for it to finish syncing and try again). Or touch Cancel and make sure that at least one calendar is visible."
+ "Add account"
"Calendar:"
"Organiser:"
"Choose event colour"
@@ -344,6 +346,4 @@
- %d weeks
Info
- Duplicate
- URL
-
+
\ No newline at end of file
diff --git a/app/src/main/res/values-eo/strings.xml b/app/src/main/res/values-eo/strings.xml
index 1a2a877942..bad65d113c 100644
--- a/app/src/main/res/values-eo/strings.xml
+++ b/app/src/main/res/values-eo/strings.xml
@@ -22,6 +22,7 @@
Kalendara koloro
Okazaĵa koloro
Kalendaro:
+ Aldoni konton
Ne estas kalendaroj
Aldoni memorigilon
Privateco
@@ -271,28 +272,4 @@
Horzono
Komenca tempo
ŝanĝi finan daton
- Tempo defaŭlta de memorigilo
- Sciigoj nepraj por interna sinkronigo. Vi povas sekure kaŝi tiun ĉi kanalon.
- Antaŭ vi eblas aldoni okazaĵon, si devas aldoni malpleje unu konton kalendaran al sia aparato kaj vidigi kalendaron. Tuŝu Aldoni Konton por aldoni konton (se vi ĵus aldonis konton, atendu ĝin finote sinkroniĝi kaj provu ree). Aŭ tuŝu Forigi kaj certigu malpleje unu kalendaron esti videblan.
- Horplanas memorigilojn novajn…
- Ŝanĝi tiun ĉi kaj estontajn okazaĵojn
- Vido antaŭe uzita
- Tempo defaŭlta de memorigilo
- Vidigas kalendarojn kaj tempojn de okazaĵoj en via hejma horzono kiam vojaĝi
- Ĉiam uzi malfruon defaŭltan de ripeto
- Agordi malfruon de ripeto
- Demandi malfruon de ripeto kiam ripeti memorigojn
- Demandi malfruon de ripeto de memorigo
- Daŭro defaŭlta de malfruo de ripeto
- Malfruo defaŭlta de ripeto
- Ignori memorigojn
- Ignori memorigojn
- Forigi ĉeestanton
- Aldoni ĉeestanton
- URL
- Duplikati
- Ŝanĝi ĉiujn eventojn el la serio
- Aranĝo de monata vido (vertikala)
- Aranĝo de monata vido (horizontala)
- Uzi kolorojn realajn por okazaĵoj
-
+
\ No newline at end of file
diff --git a/app/src/main/res/values-es-rUS/strings.xml b/app/src/main/res/values-es-rUS/strings.xml
index 709f265a18..651d2ef43e 100644
--- a/app/src/main/res/values-es-rUS/strings.xml
+++ b/app/src/main/res/values-es-rUS/strings.xml
@@ -77,6 +77,8 @@
"Privacidad"
"Agregar recordatorio"
"No hay calendarios"
+ "Para poder agregar un evento, primero debes agregar al menos una cuenta de Calendar a tu dispositivo y hacer visible un calendario. Para ello, toca Agregar cuenta (si acabas de agregar una cuenta, aguarda a que finalice su sincronización y vuelve a intentarlo). También puedes tocar Cancelar y asegurarte de que pueda verse al menos un calendario."
+ "Agregar cuenta"
"Calendario:"
"Organizador:"
Elige un color para el evento
@@ -346,4 +348,4 @@
Cancelar
entiendo
¿Realmente quieres eliminar este calendario\?
-
+
\ No newline at end of file
diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml
index 125af61347..a212ead91d 100644
--- a/app/src/main/res/values-es/strings.xml
+++ b/app/src/main/res/values-es/strings.xml
@@ -42,9 +42,9 @@
- %d días
- - %d semana
- - %d semana
- - %d semana
+
+ - Semanas %d
+ - Semanas %d
"Actualizar"
"Mostrar día"
@@ -81,6 +81,8 @@
"Privacidad"
"Añadir recordatorio"
No hay calendarios
+ "Para añadir eventos, añade al menos una cuenta de Calendar al dispositivo y haz visible un calendario. Para ello, toca Añadir cuenta (si ya lo has hecho, espera a que finalice la sincronización y vuelve a intentarlo). También puedes tocar Cancelar y comprobar que al menos un calendario sea visible."
+ "Añadir cuenta"
"Calendario:"
"Organizador:"
"Seleccionar color del evento"
@@ -362,11 +364,4 @@
Usar colores de eventos reales
Información
Duplicado
- Dirección URL
- Antes de poder añadir un evento, debes añadir al menos un calendario a tu dispositivo
- Añadir un calendario
- Gestionar las notificaciones
- No comprobar la optimización de la batería
- ¡Use bajo su propio riesgo! Las notificaciones dejarán de funcionar, el widget dejará de actualizarse y los servicios en segundo plano se bloquearán. Pero no se le preguntará de nuevo si desea habilitar el servicio en segundo plano.
- Calendarios
\ No newline at end of file
diff --git a/app/src/main/res/values-et/strings.xml b/app/src/main/res/values-et/strings.xml
index 17b9968d53..d236d8b6e2 100644
--- a/app/src/main/res/values-et/strings.xml
+++ b/app/src/main/res/values-et/strings.xml
@@ -77,6 +77,8 @@
"Privaatsus"
"Lisa meeldetuletus"
"Kalendrid puuduvad"
+ "Enne kui saate lisada sündmusi, peate seadmesse lisama vähemalt ühe kalendri konto ja muutma kalendri nähtavaks. Konto lisamiseks puudutage käsku Lisa konto (kui lisasite äsja konto, oodake, kuni see lõpetab sünkroonimise, ja proovige uuesti). Teise võimalusena puudutage käsku Tühista ja veenduge, et vähemalt üks kalender on nähtav."
+ "Lisa konto"
"Kalender:"
"Korraldaja:"
"Vali sündmuse värv"
@@ -236,4 +238,4 @@
Avalik
Puudub
after start of event
-
+
\ No newline at end of file
diff --git a/app/src/main/res/values-eu/strings.xml b/app/src/main/res/values-eu/strings.xml
index 76f048d525..a3129ef7ea 100644
--- a/app/src/main/res/values-eu/strings.xml
+++ b/app/src/main/res/values-eu/strings.xml
@@ -47,6 +47,7 @@
Pribatutasuna
Gehitu jakinarazpena
Egutegirik ez
+ Gehitu kontua
Egutegia:
Antolatzailea:
Aukeratu gertaeraren kolorea
@@ -220,6 +221,7 @@
- %d. astea
- %d. astea
+ Gertaera bat gehitu aurretik, gutxienez Egutegi bat gehitu behar duzu zure gailuan eta egutegia ikusgarri bezala markatu. Ukitu Gehitu Kontua kontu bat gehitzeko (kontu bat gehitu baduzu, itxaron sinkronizazioa bukatu arte eta saiatu berriz). Edo ukitu Utzi eta ziurtatu gutxienez egutegi bat dagoela ikusgarri.
Ukitu gertaerak ikusteko %1$s baino geroago
Aldi baterako gertaera
; %s arte
@@ -326,4 +328,4 @@
Erabili gertaera kolore errealak
Informazioa
-
+
\ No newline at end of file
diff --git a/app/src/main/res/values-fa/strings.xml b/app/src/main/res/values-fa/strings.xml
index f8e4753d9c..06026e7f5b 100644
--- a/app/src/main/res/values-fa/strings.xml
+++ b/app/src/main/res/values-fa/strings.xml
@@ -77,6 +77,8 @@
"رازداری"
"افزودن یادآور"
"تقویمی موجود نیست"
+ "قبل از اینکه بتوانید یک رویداد اضافه کنید، باید حداقل یک حساب تقویم به دستگاه خود اضافه کرده و تقویمی را قابل مشاهده کنید. برای افزودن یک حساب، \"افزودن حساب\" را لمس کنید (اگر بتازگی حسابی اضافه کردهاید، منتظر بمانید تا همگامسازی آن تمام شود و سپس دوباره امتحان کنید). همچنین میتوانید \"لغو\" را لمس کرده و اطمینان حاصل کنید که حداقل یک تقویم قابل مشاهده است."
+ "افزودن حساب"
"تقویم:"
"سازمان دهنده:"
"انتخاب رنگ رویداد"
@@ -236,4 +238,4 @@
عمومی
هیچکدام
after start of event
-
+
\ No newline at end of file
diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml
index 92a833a7cd..2b3812de4e 100644
--- a/app/src/main/res/values-fi/strings.xml
+++ b/app/src/main/res/values-fi/strings.xml
@@ -76,6 +76,8 @@
"Tietosuoja"
"Lisää muistutus"
"Ei kalentereita"
+ "Ennen kuin voit lisätä tapahtuman, sinun on lisättävä laitteeseen vähintään yksi kalenteritili ja otettava kalenteri näkyviin. Lisää tili koskettamalla Lisää tili (jos olet jo lisännyt tilin, odota synkronoinnin valmistumista ja yritä uudelleen). Tai kosketa Peruuta ja varmista, että vähintään yksi kalenteri on näkyvissä."
+ "Lisää tili"
"Kalenteri:"
"Järjestäjä:"
"Valitse tapahtuman väri"
@@ -330,4 +332,4 @@
Hälytyksen synkronointi
Ei mitään
after start of event
-
+
\ No newline at end of file
diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml
index 2369fd6adf..b3a936d4a6 100644
--- a/app/src/main/res/values-fr/strings.xml
+++ b/app/src/main/res/values-fr/strings.xml
@@ -23,27 +23,22 @@
"(Sans titre)"
- 1 minute
- - %d minutes
- %d minutes
- 1 min
- - %d min
- %d min
- 1 h
- - %d h
- %d h
- 1 j
- - %d j
- %d j
- semaine %d
- - semaine %d
- semaine %d
"Actualiser"
@@ -82,6 +77,8 @@
"Confidentialité"
"Ajouter un rappel"
"Aucun agenda"
+ Avant d’ajouter un évènement, vous devez ajouter au moins un agenda à votre appareil et activer sa visibilité. Pour cela, appuyez sur « Ajouter un compte », ou sur « Annuler » si vous pensez qu’au moins un agenda est visible (vérifiez que c’est bien le cas). Si vous venez d’ajouter un compte, patientez jusqu’à la fin de la synchronisation, puis réessayez.
+ "Ajouter un compte"
"Agenda :"
"Organisateur :"
Sélectionner la couleur de l’évènement
@@ -131,19 +128,16 @@
; jusqu’à %s
- ; une seule fois
- - ; %d fois
- - ; %d fois
+ - ; %d plusieurs fois
- - Quotidien
- - Tous les %d jours
- - Tous les %d jours
+ - "Quotidien"
+ - "Tous les %d jours"
- Tous les jours en semaine (lun–ven)
+ Jours en semaine (lun–ven)
- Hebdomadaire, le %2$s
- - Toutes les %1$d semaines, le %2$s
- - Toutes les %1$d semaines, le %2$s
+ - Toutes les %1$d semaines le %2$s
Mensuellement
Annuellement
@@ -187,8 +181,7 @@
"Version"
- +1
- - +%d
- - +%d
+ - +%d
Aucun évènement à venir
"Test"
@@ -215,34 +208,28 @@
Évènement %1$s sur %2$s.
- 1 évènement
- - %d évènements
- %d évènements
- +1 évènement
- - +%d évènements
- +%d évènements
Évènement sélectionné
- - Chaque jour
- - Tous les %d jours
+ - Chaque %d jour
- Tous les %d jours
- - Chaque semaine
- - Toutes les %d semaines
- - Toutes les %d semaines
+ - Chaque %d semaine
+ - Toutes les %d semaines
- - Chaque mois
- - Tous les %d mois
- - Tous les %d mois
+ - Chaque %d mois
+ - Tous les %d mois
- - Chaque année
- - Tous les %d ans
- - Tous les %d ans
+ - Chaque %d année
+ - Tous les %d ans
"le même jour chaque mois"
"Toujours"
@@ -250,9 +237,8 @@
Jusqu’au %s
Pour une série d’évènements
- - Pour %d évènement
- - Pour %d évènements
- - Pour %d évènements
+ - Pour %d évènement
+ - Pour %d évènements
"modifier la date de fin"
Par défaut
@@ -353,16 +339,12 @@
Mode pure nuit noire
Aucun
- - 1 sem.
- - %d sem.
- - %d sem.
+ - 1 semaine
+ - %d semaines
Enregistrement des nouveaux rappels…
après démarrage évènement
Utiliser couleurs évènements
Information
Dupliquer
- URL
- Ajouter un agenda
- Avant d’ajouter un évènement, vous devez ajouter au moins un agenda à votre appareil
\ No newline at end of file
diff --git a/app/src/main/res/values-gd/strings.xml b/app/src/main/res/values-gd/strings.xml
index d26ae0bc04..86c0dd3e1d 100644
--- a/app/src/main/res/values-gd/strings.xml
+++ b/app/src/main/res/values-gd/strings.xml
@@ -201,6 +201,8 @@
Tagh dath an tachartais
Eagraiche:
Mìosachan:
+ Cuir cunntas ris
+ Mus cuir thu tachartas ris, feumaidh tu cunntas mìosachain a chur ris an uidheam agad agus mìosachan a nochdadh. Suath ri “Cuir cunntas ris” a chur cunntas ris (ma tha thu dìreach air cunntas a chur ris, fuirich gus am bi an sioncronachadh deiseil is feuch ris a-rithist an uairsin). No suath ri “Sguir dheth” agus dèan cinnteach gu bheil mìosachan a nochdas ann.
Chan eil mìosachan ann
Cuir cuimhneachan ris
Prìobhaideachd
@@ -334,4 +336,4 @@
- %d seachdain
Chan eil gin
-
+
\ No newline at end of file
diff --git a/app/src/main/res/values-gl/strings.xml b/app/src/main/res/values-gl/strings.xml
index fd807d3692..b9974bd7d8 100644
--- a/app/src/main/res/values-gl/strings.xml
+++ b/app/src/main/res/values-gl/strings.xml
@@ -247,6 +247,8 @@
Elixe a cor do evento
Organizador:
Calendario:
+ Engadir conta
+ Antes de poder engadir un evento, debes engadir polo menos unha conta de calendario ao teu dispositivo e facer visible un calendario. Preme en Engadir Conta para engadir unha conta (se acabas de engadir unha conta, agarda a que remate de sincronizarse e inténtao de novo). Ou preme Cancelar e asegúrate de que polo menos un calendario está visible.
Sen calendarios
Engadir recordatorio
Privacidade
@@ -326,4 +328,4 @@
Información
Programando novos recordatorios…
Duplicar
-
+
\ No newline at end of file
diff --git a/app/src/main/res/values-hi/strings.xml b/app/src/main/res/values-hi/strings.xml
index cbfbe2e915..8448aeeb25 100644
--- a/app/src/main/res/values-hi/strings.xml
+++ b/app/src/main/res/values-hi/strings.xml
@@ -77,6 +77,8 @@
"गोपनीयता"
"अनुस्मारक जोड़ें"
"कोई कैलेंडर नहीं"
+ "आप कोई ईवेंट जोड़ें उसके पहले, आपको अपने उपकरण में कम से कम एक कैलेंडर खाता जोड़ना होगा और कैलेंडर को दृश्यमान बनाना होगा. कोई खाता जोड़ने के लिए खाता जोड़ें स्पर्श करें (यदि आपने अभी कोई खाता जोड़ा है, तो इसका समन्वयन पूरा होने की प्रतीक्षा करें और पुन: प्रयास करें). या रद्द करें स्पर्श करें और सुनिश्चित करें कि कम से कम एक कैलेंडर दृश्यमान है."
+ "खाता जोड़ें"
"कैलेंडर:"
"आयोजक:"
"ईवेंट का रंग चुनें"
@@ -237,4 +239,4 @@
सार्वजनिक
कोई नहीं
after start of event
-
+
\ No newline at end of file
diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml
index 7605254eb0..ebfbb1a06d 100644
--- a/app/src/main/res/values-hr/strings.xml
+++ b/app/src/main/res/values-hr/strings.xml
@@ -81,6 +81,8 @@
"Privatnost"
Dodaj podsjetnik
"Nema kalendara"
+ Prije nego što ćeš moći dodati događaj moraš dodati barem jedan račun za kalendar na svoj uređaj i kalendar učiniti vidljivim. Za dodavanje računa, dodirni „Dodaj račun” (ako si upravo dodao/la račun, pričekaj dovršavanje sinkronizacije i pokušaj ponovo) ili dodirni „Odustani” i provjeri, je li barem jedan kalendar vidljiv.
+ Dodaj račun
"Kalendar:"
"Organizator:"
Odaberi boju za događaj
@@ -362,7 +364,4 @@
Koristi boje stvarnog događaja
Informacije
Dupliciraj
- URL
- Prije dodavanje događaja moraš dodati barem jedan kalendar na svoj uređaj
- Dodaj kalendar
\ No newline at end of file
diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml
index a3661305fe..1c7f8c98ef 100644
--- a/app/src/main/res/values-hu/strings.xml
+++ b/app/src/main/res/values-hu/strings.xml
@@ -76,6 +76,8 @@
"Adatvédelem"
Emlékeztető hozzáadása
"Nincs naptár"
+ "Esemény hozzáadása előtt adjon hozzá legalább egy Naptárfiókot a készülékhez, és tegye láthatóvá a naptárat. Érintse meg a \"Fiók hozzáadása\" lehetőséget fiók hozzáadásához (ha épp most adott hozzá egy fiókot, akkor várja meg a szinkronizálás végét, majd próbálkozzon újra). Vagy érintse meg a Mégse lehetőséget, és bizonyosodjon meg, hogy legalább egy naptár látható."
+ "Fiók hozzáadása"
"Naptár:"
"Szervező:"
"Válasszon egy eseményszínt"
diff --git a/app/src/main/res/values-in/strings.xml b/app/src/main/res/values-in/strings.xml
index 8fbb3e3f1f..e7abb6ec5b 100644
--- a/app/src/main/res/values-in/strings.xml
+++ b/app/src/main/res/values-in/strings.xml
@@ -71,6 +71,8 @@
Pribadi
Tambah pengingat
Tidak ada kalender
+ Sebelum Anda bisa menambahkan acara, Anda harus menambahkan setidaknya satu akun Kalender ke perangkat dan buat kalender terlihat. Sentuh Tambah Akun untuk menambah akun (jika Anda baru saja menambahkan akun, tunggu sampai akun selesai disinkronkan dan coba lagi). Atau sentuh Batal dan pastikan setidaknya satu kalender terlihat.
+ Tambah akun
"Kalender:"
"Penyelenggara:"
"Pilih warna acara"
@@ -328,7 +330,4 @@
Gunakan warna acara asli
Info
Duplikat
- URL
- Sebelum Anda bisa menambahkan acara, Anda harus menambahkan setidaknya satu kalender ke perangkat Anda
- Tambah kalender
\ No newline at end of file
diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml
index 59a06bfbcc..750af55415 100644
--- a/app/src/main/res/values-it/strings.xml
+++ b/app/src/main/res/values-it/strings.xml
@@ -42,7 +42,7 @@
- %d giorni
- - Settimana %d
+
- Settimana %d
- Settimana %d
@@ -85,6 +85,8 @@
"Privacy"
"Aggiungi promemoria"
"Nessun calendario"
+ "Prima di poter aggiungere un evento, devi aggiungere almeno un account Calendar al dispositivo e impostare un calendario come visibile. Tocca Aggiungi account per aggiungere un account (se hai appena aggiunto un account, attendi che venga completata la sincronizzazione e riprova). In alternativa, tocca Annulla e assicurati che sia visibile almeno un calendario."
+ "Aggiungi account"
"Calendario:"
"Agenda:"
"Scegli colore evento"
@@ -126,7 +128,7 @@
"Dettagli"
"Modifica"
"Elimina"
- Fatto
+ "Salva"
"Annulla"
"Ignora tutto"
"Posticipa"
@@ -241,9 +243,9 @@
- Ogni %d mesi
- - Ogni %d anno
- - Ogni %d anni
- - Ogni %d anni
+ - Ogni <xliff:g xmlns:xliff=\"urn:oasis:names:tc:xliff:document:1.2\" id=\"count\"> anno
+ - Ogni <xliff:g xmlns:xliff=\"urn:oasis:names:tc:xliff:document:1.2\" id=\"count\"> anni
+ - Ogni <xliff:g xmlns:xliff=\"urn:oasis:names:tc:xliff:document:1.2\" id=\"count\"> anni
"lo stesso giorno ogni mese"
"Sempre"
@@ -251,9 +253,9 @@
"Fino al giorno: %s"
"Per una serie di eventi"
- - Per %d evento
- - Per %d eventi
- - Per %d eventi
+ - Per <xliff:g xmlns:xliff=\"urn:oasis:names:tc:xliff:document:1.2\" id=\"event_count\"> evento
+ - Per <xliff:g xmlns:xliff=\"urn:oasis:names:tc:xliff:document:1.2\" id=\"event_count\"> eventi
+ - Per <xliff:g xmlns:xliff=\"urn:oasis:names:tc:xliff:document:1.2\" id=\"event_count\"> eventi
"modifica data di fine"
Etar richiede le autorizzazioni di lettura e scrittura del calendario per funzionare. Riprova.
@@ -297,7 +299,7 @@
Importazione del calendario non riuscita
Impossibile interpretare la data inserita: %s
Scegli file da importare
- Non mostrare l\'ora
+ No
Solo tempo di inizio
Ora di inizio e fine
Ora di inizio e fine sotto all\'evento
@@ -362,11 +364,4 @@
Sdoppia
Usa colori di eventi reali
Informazioni
- URL
- Prima di poter aggiungere un evento, devi aggiungere almeno un calendario al tuo dispositivo
- Aggiungi calendario
- Usa a tuo rischio! Le notifiche non funzioneranno più, il widget non si aggiornerà e i servizi in secondo piano verranno terminati. Ma non ti verrà più chiesto se vuoi attivare il servizio in secondo piano.
- Non controllare l\'ottimizzazione della batteria
- Gestisci le notifiche
- Calendari
\ No newline at end of file
diff --git a/app/src/main/res/values-iw/strings.xml b/app/src/main/res/values-iw/strings.xml
index b88ab40f58..c1ac5090fd 100644
--- a/app/src/main/res/values-iw/strings.xml
+++ b/app/src/main/res/values-iw/strings.xml
@@ -49,7 +49,7 @@
- שבוע %d
- שבוע %d
- שבוע %d
-
+
רענן
הצג יום
@@ -86,6 +86,8 @@
"פרטיות"
הוספת תזכורת
"אין לוחות שנה"
+ לפני שיתאפשר לך להוסיף אירוע, עליך להוסיף חשבון לוח שנה אחד לפחות למכשיר שלך ושלוח השנה הזה יהיה גלוי. יש לגעת בהוספת חשבון כדי להוסיף חשבון (אם הרגע הוספת חשבון, יש להמתין לסיום סנכרונו ואז לנסות שוב. לחלופין, לגעת בביטול ולוודא שלפחות לוח שנה אחד זמין.
+ הוספת חשבון
לוח שנה:
ארגון:
בחירת צבע אירוע
@@ -379,7 +381,4 @@
להשתמש בצבעי האירוע האמתיים
פרטים
שכפול
- כתובת
- הוספת לוח שנה
- לפני שיתאפשר לך להוסיף אירוע, יש להוסיף לפחות לוח שנה אחד למכשיר שלך
\ No newline at end of file
diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml
index b38c247e1e..de9ddb9832 100644
--- a/app/src/main/res/values-ja/strings.xml
+++ b/app/src/main/res/values-ja/strings.xml
@@ -17,24 +17,28 @@
"日時"
"今日"
"明日"
- 今日の %s
- 明日の %s
- %1$s、%2$s
- (タイトルなし)
+ "今日の%s"
+ "明日の%s"
+ %1$s, %2$s
+ "(タイトルなし)"
- - %d 分
+ - "1分"
+ - "%d分"
- - %d 分
+ - "1分"
+ - "%d分"
- - %d 時間
+ - "1時間"
+ - "%d時間"
- - %d 日
+ - "1日"
+ - "%d日"
- - 第 %d 週
+ - "第%d週"
"更新"
"日付を表示"
@@ -52,10 +56,10 @@
"コントロールを非表示"
"コントロールを表示"
"同期するカレンダー"
- 予定の名前
+ "タイトル"
"場所"
"説明"
- 参加者
+ "ゲスト"
"予定を作成しました。"
"予定を保存しました。"
"予定は空のため保存できません。"
@@ -64,85 +68,90 @@
"保存"
"カレンダーの通知"
"予定を表示"
- 予定への招待
+ "会議への招待状"
"終日"
"カレンダー"
"外部向け表示"
"公開設定"
- リマインダーを追加
+ "通知を追加"
"カレンダーがありません"
+ "予定を追加するには、端末に少なくとも1つのカレンダーアカウントを追加してカレンダーを表示できるようにする必要があります。アカウントを追加するには[アカウントを追加]をタップします(アカウントを追加したばかりの場合は、同期の完了を待って再試行してください)。または[キャンセル]をタップして、カレンダーが表示できるかどうかを確認してください。"
+ "アカウントを追加"
"カレンダー:"
"主催者:"
"予定の色を選択"
"予定の色"
- カレンダーのデフォルトの色に設定
+ "デフォルトのカレンダーの色に設定"
"カレンダーの色"
- 色を選択
+ "カラーピッカー"
"参加しますか?"
- 承諾
+ "はい"
"未定"
- 辞退
- 参加者にメールを送信
+ "いいえ"
+ "ゲストにメールを送信"
"主催者にメールを送信"
- メールを送信:
- 予定が見つかりません。
+ "メールに次を含める:"
+ "イベントが見つかりません。"
"地図"
"発信"
"クイック返信"
- 参加者へのデフォルトの返事を編集
+ "ゲストへメールを送るときのデフォルトの返事を編集"
"クイック返信"
- クイック返信を選択
- メールプログラムが見つかりませんでした
+ "クイック返信の選択"
+ "メールプログラムが見つかりません"
- "数分遅れています。"
- "10分ほどで着きます。"
- "先に始めていてください。"
- "申し訳ありませんが、行けません。日程を変更する必要があります。"
- オリジナルの返信…
- 主催者:
- リマインダー
+ "カスタム返信を作成…"
+ "主催:"
+ "通知"
"今日: %1$s"
"昨日: %1$s"
"明日: %1$s"
- 読み込み中…
- タップして %1$s より前の予定を表示
- タップして %1$s より後の予定を表示
+ "読み込み中..."
+ "タップして%1$sより前の予定を表示"
+ "タップして%1$sより後の予定を表示"
"マイカレンダーを検索"
"詳細"
"編集"
"削除"
"完了"
"キャンセル"
- すべて無視
+ "通知を消去"
"スヌーズ"
"繰り返しなし"
- (%s まで)
+ "(%sまで)"
- - (%d 回)
+ - "(1回)"
+ - "(%d回)"
- - %d 日ごと
+ - "毎日"
+ - "%d日ごと"
"平日(月~金)"
- - %1$d 週間ごとの %2$s
+ - "毎週%2$s"
+ - "%1$d週間ごとの%2$s"
- 毎月
+ "月次"
"毎年"
- カスタム(スマートフォンではカスタマイズ不可)
- この予定のみを変更
- 繰り返しの予定すべてを変更
- これ以降の予定すべてを変更
+ "カスタム(端末ではカスタマイズ不可)"
+ "この予定のみを変更する"
+ "一連の定期的な予定すべてを変更する"
+ "これ以降の予定すべてを変更する"
"新しい予定"
"新しい予定"
"この予定を削除しますか?"
- %s を削除しますか?
+ "%sを削除しますか?"
"出欠状況を変更"
"設定"
"カレンダーの表示設定"
- 通知とリマインダー
- 辞退した予定を隠す
+ "通知とリマインダ"
+ "辞退した予定を非表示"
"週の開始日"
"週の開始日"
"検索履歴を消去"
@@ -150,190 +159,100 @@
"検索履歴を消去しました。"
"通知"
"バイブレーション"
- 通知音
+ "音声"
"ポップアップ通知"
- デフォルトのリマインダー時間
- デフォルトのリマインダー時間
+ "デフォルトの通知時間"
+ "リマインダ通知"
"10"
- 自宅のタイムゾーンを使用
- 旅行中も自宅のタイムゾーンでカレンダーと予定時刻を表示します
- 自宅のタイムゾーン
- 週番号を表示
- ビルド バージョン
+ "自宅タイムゾーン"
+ "旅行中も自宅のタイムゾーンでカレンダーと予定時間を表示する"
+ "自宅タイムゾーン"
+ "第何週かを表示"
+ "ビルドバージョン"
- "+1"
- "+%d"
"近日中の予定はありません"
- 試験運用
- リマインダーをスキップ
- リマインダーをスキップ
+ "試験運用版"
+ "通知をスキップ"
+ "通知をスキップ"
"データベースを送信"
- %s を検索中…
+ "%sを検索中..."
"参加者を削除"
"開始日"
- 開始時刻
+ "開始時間"
"終了日"
- 終了時刻
+ "終了時間"
"タイムゾーン"
- 予定を繰り返す
- リマインダーを追加
- リマインダーを削除
+ "定期的な予定を作成する"
+ "通知を追加"
+ "通知を削除"
"参加者を追加"
"終日"
- リマインダーの時間
- リマインダーのタイプ
+ "通知の時間"
+ "通知のタイプ"
"外部向け表示"
"公開設定"
"新しい予定を追加"
- 予定 %2$s 件中 %1$s 件目
+ "%2$s件中%1$s件目の予定"
- - %d 件の予定
+ - "予定1件"
+ - "予定%d件"
- - +%d 件の予定
+ - "他1件の予定"
+ - "他%d件の予定"
"選択した予定"
- - %d 日ごと
+ - "繰り返す間隔: %d日"
+ - "繰り返す間隔: %d日"
- - %d 週間ごと
+ - "繰り返す間隔: %d週間"
+ - "繰り返す間隔: %d週間"
- - %d か月
+ - "繰り返す間隔: %dか月"
+ - "繰り返す間隔: %dか月"
- - %d 年ごと
+ - "繰り返す間隔: %d年"
+ - "繰り返す間隔: %d年"
"毎月同じ日"
- 永久に繰り返し
+ "終了日なし"
"終了日:"
- %s まで
- 予定の回数
+ "%sまで"
+ "回数"
- - %d 回繰り返す
+ - "%d回繰り返す"
+ - "%d回繰り返す"
- 終了日を変更
+ "終了日を変更します"
デフォルト
- 非公開
- 公開
- スヌーズ時間を確認
- リマインダーをスヌーズする場合、その都度スヌーズ遅延時間を確認します
- リマインダーをスヌーズする場合、デフォルトのスヌーズ遅延を使用します
+ 限定公開
+ 一般公開
+ スヌーズ遅延を尋ねる
+ リマインダーをスヌーズする場合、その都度スヌーズ遅延時間を尋ねる
+ リマインダーをスヌーズする場合、デフォルトのスヌーズ遅延を使用する
スヌーズ遅延を設定
デフォルトのスヌーズ遅延時間
デフォルトのスヌーズ遅延
ブラック
- ダーク
- ライト
+ ダークテーマ
+ ライトテーマ
システムのデフォルト
テーマ
- 月表示レイアウト(横画面)
- 月表示レイアウト(縦画面)
- 地図アプリがインストールされていません
- 辞退しました。
+ 月表示レイアウト(横)
+ 月表示レイアウト(ポートレート)
+ マップアプリがインストールされていません
+ 拒否しました。
承諾しました。
- 表示設定
- 日付を選択して移動…
- 共有
+ 設定を表示
+ 移動…
+ 共有する
なし
- イベントの開始後に通知する
-
- - %d 週間
-
- 情報
- 内部の同期に必要な通知です。このチャンネルは非表示にしても問題ありません。
- 未定にしました。
- 新しいリマインダーを作成中…
- バックグラウンドタスク
- 複製
- 1 週間の日数
- 最後に使用した表示
- 1 週間の日数
- デフォルトの予定の期間
- メインの色
- 実際の予定の色で表示
- ピュアブラックのナイトモード
- 起動時の表示
- 表示設定
- 時刻表示
- 場所表示
- 予定の最大行数
- 開発者
- 更新履歴
- ライセンス
- 問題を報告
- © 2015-%1$s The Etar Project. Portions © 2005-%1$s The Android Open Source Project.
- ソースコード
- 15 分
- 色
- カレンダーの色
- Etar が正常に動作するためにカレンダーの読み書きの権限が必要です。もう一度お試しください。
- 2 日
- 3 日
- 4 日
- 5 日
- 6 日
- 7 日
- 0 分
- 30 分
- 1 時間
- 1 時間 30 分
- 2 時間
- SD カードにエクスポート
- インポートするものがありません
- カレンダーのインポートに失敗しました
- 予定の共有中にエラーが発生しました
- 予定の送信先:
- 予定がエクスポートされました: %1$s
- 予定をインポート
- 設定されたタイムゾーンを読み込めませんでした: %s
- 設定された日付を読み込めませんでした: %s
- インポートするファイルを選択
- 時間を表示しない
- 開始時刻のみ
- 開始時刻と終了時刻
- 名前のないカレンダー
- オフラインのカレンダー
- 予定の下に開始時刻と終了時刻を表示
- 予定 %1$d 件
- 名前を変更
- カレンダーの情報
- 予定を表示
- 警告
- 確認しました
- このカレンダーを本当に削除しますか?
- カレンダーを削除
- キャンセル
- 同期されていません
- CalDAV カレンダーを追加
- 全般設定
- EteSync カレンダーを追加
- 予定は表示されていません
- オフラインのカレンダーを追加
- オフラインのカレンダーを追加
- カレンダー名を入力してください!
- オフラインのカレンダーはクラウドサービスと同期されず、あなたの端末でのみ利用できます。
- カレンダーを追加
- 名前
- キャンセル
- Etar について
- オフラインのカレンダー
- 必要な権限が拒否されました。予定を編集するには、設定アプリから権限を許可してください
- %1$s アカウント
- このカレンダーを同期
- カレンダーを削除
- カレンダーを再同期すると、色の変更が元に戻ることがあります。
-\n
-\nDAVx⁵ ではカレンダーの色の変更を無効にして、この問題の発生を防ぐことができます。
- 機密
- %1$s でカレンダーを設定
- URL
- 予定を追加するには、端末にカレンダーアカウントを少なくとも 1 つ追加してカレンダーを表示できるようにする必要があります
- カレンダーを追加
- 電池の最適化にチェックをつけないでください
- 通知を管理
- ご自身の責任で使用してください! 通知がなくなり、ウィジェットも更新されなくなり、バックグラウンドサービスがクラッシュします。バックグラウンドサービスを有効にすれば問題ありません。
- カレンダー
+ after start of event
\ No newline at end of file
diff --git a/app/src/main/res/values-kk/strings.xml b/app/src/main/res/values-kk/strings.xml
index 5c7cb94bc7..00175504d6 100644
--- a/app/src/main/res/values-kk/strings.xml
+++ b/app/src/main/res/values-kk/strings.xml
@@ -43,8 +43,8 @@
Күн тәртібі
Жаңарту
- - 1-апта
- - %d-апта
+ - %d апта
+ - %d апта
- 1 күн
@@ -71,7 +71,7 @@
Авторлар
© 2015-%1$s Etar жобасы. Ішінара © 2005-%1$s The Android Open Source Project.
Апта нөмірін көрсету
- Үй уақыт белдеуім
+ Үй уақыт белдеуі
10
EteSync күнтізбесін қосу
CalDAV күнтізбесін қосу
@@ -135,8 +135,8 @@
Ертең сағат %s
Бүгін сағат %s
Оқиғадағы жолдардың ең көп саны
- «Жоқ» деп жауап берді.
- «Иә» деп жауап берді.
+ «Жоқ» деп жауап берілді.
+ «Иә» деп жауап берілді.
- Әр %d күн сайын
- Әр %d күн сайын
@@ -160,46 +160,4 @@
Оқиғаны қарау
Күнді көрсету
after start of event
- Ақпарат
- «Мүмкін» деп жауап берді.
- Мүмкін
- Қоңырау шалу
- Қараңғы
- Ертең, %1$s
- Бүгін, %1$s
- Шақыруды қабылдайсыз ба\?
-
- - 1 апта
- - %d апта
-
- Кеше, %1$s
- URL
- Кейіп
- Жылдам жауап
- Үй уақыт белдеуі
- Ақшыл
- Негізгі түс
- Көшірмесін жасау
- Оқиға жасалды.
- Күнтізбе қосу
- Күнтізбе мәлімдемелері
- Жаңартулар жіберіледі.
- Қонақтар
- Бәрін жасыру
- Оқиға түсін таңдау
- Шақырулар жіберіледі.
- Орын
- Бір реттік оқиға
- Күнтізбе көрінісін баптау
- Осы оқиғаны ғана өзгерту
- Апта басталатын күн
- Фондағы тапсырмалар
- Жылдам жауаптар
- Діріл
- Дайын
- Жылдам жауап таңдаңыз
- Жүйедегідей
- Апта басталатын күн
- Оқиғаны көру
- Мәліметтер
\ No newline at end of file
diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml
index dbff832e42..def4c4824c 100644
--- a/app/src/main/res/values-ko/strings.xml
+++ b/app/src/main/res/values-ko/strings.xml
@@ -75,6 +75,8 @@
"공개여부"
"알림 추가"
"캘린더 없음"
+ "일정을 추가하기 전에 기기에 하나 이상의 캘린더 계정을 추가하고 캘린더를 표시해야 합니다. 계정 추가를 터치하여 계정을 추가합니다(계정을 추가한 다음 동기화가 완료될 때까지 기다렸다가 다시 시도합니다). 또는 취소를 터치하고 적어도 하나의 캘린더가 표시되도록 합니다."
+ "계정 추가"
"캘린더:"
"주최자:"
"일정 색상 선택"
@@ -289,4 +291,4 @@
Foreground 알림 내부 경계 태세를 동기화에 필요하다. 음소거 해달라
없음
after start of event
-
+
\ No newline at end of file
diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml
index 679b6e6c3a..93ee651c3c 100644
--- a/app/src/main/res/values-lt/strings.xml
+++ b/app/src/main/res/values-lt/strings.xml
@@ -81,6 +81,8 @@
"Privatumas"
"Pridėti priminimą"
"Nėra kalendorių"
+ "Jei norite pridėti įvykį, savo įrenginyje turite pridėti bent vieną Kalendoriaus paskyrą ir padaryti kalendorių matomą. Jei norite pridėti paskyrą, palieskite „Pridėti paskyrą“ (jei paskyrą ką tik pridėjote, palaukite, kol ji bus sinchronizuota, ir bandykite dar kartą). Arba palieskite „Atšaukti“ ir įsitikinkite, kad matomas bent vienas kalendorius."
+ "Pridėti paskyrą"
"Kalendorius:"
"Tvarkytuvė:"
"Pasirinkti įvykio spalvą"
@@ -362,9 +364,4 @@
Informacija
Naudoti tikras įvykio spalvas
Dubliuoti
- Tvarkyti pranešimus
- Kalendoriai
- Nuoroda
- Prieš pridėdami įvykį, turite į įrenginį pridėti bent vieną kalendorių
- Pridėti kalendorių
\ No newline at end of file
diff --git a/app/src/main/res/values-lv/strings.xml b/app/src/main/res/values-lv/strings.xml
index 6c4a890f29..16f3bc0eb7 100644
--- a/app/src/main/res/values-lv/strings.xml
+++ b/app/src/main/res/values-lv/strings.xml
@@ -77,6 +77,8 @@
"Konfidencialitāte"
"Pievienot atgādin."
"Nav kalendāru"
+ "Lai pievienotu kādu pasākumu, vispirms savā ierīcē pievienojiet vismaz vienu kontu pakalpojumā Kalendārs un padariet redzamu konkrētu kalendāru. Lai pievienotu kontu, pieskarieties vienumam Pievienot kontu (ja tikko jau pievienojāt kontu, gaidiet, kamēr tas tiek sinhronizēts, un mēģiniet vēlreiz). Varat arī pieskarties vienumam Atcelt un padarīt redzamu vismaz vienu kalendāru."
+ "Pievienot kontu"
"Kalendārs:"
"Rīkotājs:"
"Izvēlieties notikuma teksta krāsu"
@@ -236,4 +238,4 @@
Publisks
Nav
after start of event
-
+
\ No newline at end of file
diff --git a/app/src/main/res/values-ms/strings.xml b/app/src/main/res/values-ms/strings.xml
index 4f9854b9f4..9f00065c2d 100644
--- a/app/src/main/res/values-ms/strings.xml
+++ b/app/src/main/res/values-ms/strings.xml
@@ -77,6 +77,8 @@
"Privasi"
"Tambah peringatan"
"Tiada kalendar"
+ "Sebelum anda dapat menambahkan sesuatu acara, anda mesti menambahkan sekurang-kurangnya satu akaun Kalendar pada peranti anda dan menjadikan kalendar dapat dilihat. Sentuh Tambah Akaun untuk menambahkan akaun (jika anda baru sahaja menambahkan akaun, tunggu sehingga ia selesai menyegerak dan cuba lagi). Jika tidak, sentuh Batal dan pastikan sekurang-kurangnya satu kalendar kelihatan."
+ "Tambah akaun"
"Kalendar"
"Penganjur:"
"Pilih warna acara"
@@ -236,4 +238,4 @@
Awam
Tiada
after start of event
-
+
\ No newline at end of file
diff --git a/app/src/main/res/values-nb/strings.xml b/app/src/main/res/values-nb/strings.xml
index e3e4d61b34..a95d0385ba 100644
--- a/app/src/main/res/values-nb/strings.xml
+++ b/app/src/main/res/values-nb/strings.xml
@@ -80,6 +80,8 @@
"Personvern"
"Legg til påminnelse"
"Ingen kalendre"
+ "Før du kan legge til en aktivitet, må du tilordne enheten din minst én Kalender-konto samt sørge for at du har en synlig kalender. Trykk på Legg til konto for å legge til en konto (Hvis du akkurat har gjort det, bør du vente til kontoen er synkronisert og prøve på nytt). Alternativt kan du trykke på Avbryt og sørge for at minst én kalender er synlig."
+ "Legg til en konto"
"Kalender:"
"Arrangør:"
"Velg aktivitetsfarge"
@@ -344,4 +346,4 @@
- %d uker
Info
-
+
\ No newline at end of file
diff --git a/app/src/main/res/values-ne/strings.xml b/app/src/main/res/values-ne/strings.xml
index 6375d1f922..fa5b2d9dfb 100644
--- a/app/src/main/res/values-ne/strings.xml
+++ b/app/src/main/res/values-ne/strings.xml
@@ -53,10 +53,11 @@
भोलि
पात्रोको रङ्ग
विवरण
+ खाता थप्नुहोस्
घटनाको लागि रङ्ग छान्नुहोस्
भोलि %s
- १ दिन
- %d दिनहरु
-
+
\ No newline at end of file
diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml
index 99cd6877ad..efd4cb565d 100644
--- a/app/src/main/res/values-nl/strings.xml
+++ b/app/src/main/res/values-nl/strings.xml
@@ -76,6 +76,8 @@
"Privacy"
"Herinnering toevoegen"
"Geen agenda\'s"
+ Een gebeurtenis toevoegen kan alleen als minimaal één agenda zichtbaar is. Voeg eventueel via instellingen een agenda toe en wacht tot het synchroniseren is voltooid en probeer opnieuw.
+ "Account toevoegen"
"Agenda:"
"Organisator:"
Kies een gebeurteniskleur
@@ -345,7 +347,4 @@
Echte kleuren gebruiken voor gebeurtenissen
Info
Dupliceren
- URL
- Voor je een gebeurtenis kunt toevoegen, moet je minstens één agenda aan je toestel toevoegen
- Kalender toevoegen
-
+
\ No newline at end of file
diff --git a/app/src/main/res/values-nn/strings.xml b/app/src/main/res/values-nn/strings.xml
deleted file mode 100644
index 2b675c2e7d..0000000000
--- a/app/src/main/res/values-nn/strings.xml
+++ /dev/null
@@ -1,299 +0,0 @@
-
-
- Slett hende
-
- - 1 time
- - %d timar
-
- I morgon
- Ingen
- Veke
- Månad
- Gå til …
- Innstillingar
- Vis knappar
- Ingen kalendrar
- Kalender:
- Vel leten til hendet
- Kalenderlet
- Letval
- Kan henda
- Send e-brev til gjestar
- Send e-brev til
- Fann ikkje hendet.
- Kart
- Ingen kartapp lagd inn
- Ring
- Snøggsvar
- Brigd forvalde svar for e-brev til gjestar
- Fann ikkje nokon e-brev-app
- Rit ditt eige …
- Tilskipar:
- Påminningar
- I morgon, %1$s
- Hentar …
- Søk i mine kalendrar
- Gjentakande hendeval
- Slett
- Mangfald (1)
- Gøym
- ; fram til %s
-
- - Dagleg
- - Kvar %d. dag
-
- Månadleg
- Årleg
- Ljos
- Nytta røynlege hendeletar
- Kolsvart nattmodus
- Vising ved byrjing
- Visingsval
- Vis stad
- Grense for mengd liner i eit hende
- Førre nytta vising
- Dagar i veka
- Dagar i veka
- Slett søk
- Tak bort alle søka du har gjord
- Søkehistorikk tømt.
- Risting
- Ljod
- Forvald påminningstid
- 10
- Eiga tidssone
- Løyve
- Kjeldekode
- Ingen komande kalenderhende
- Hopp over påminningar
- Hopp over påminningar
- Send databasen
- Endedato
- Gjenta hende
- Legg til påminning
- Vis meg som
- Privat
- + Nytt hende
-
- - 1 hende
- - %d hende
-
-
- - +1 hende
- - +%d hende
-
- Valt hende
- Inntil ein viss dato
- Brigd endedato
- Kravde tilgjenge vart ikkje gjeve. For å kunne brigde hende må du gå til innstillingappen og gje dei
- Vanleg
- Løynd
- Privat
- Open
- 2 dagar
- 3 dagar
- 4 dagar
- 5 dagar
- 0 minutt
- 15 minutt
- 30 minutt
- 1 time
- Send hendet til:
- Før ut til ytre gøyme
- Hendet ført ut: %1$s
- Før inn hende
- Det er ingenting å føre inn
- Kunne ikkje føre inn til kalenderen
- Tidssona du oppgav er uforståeleg: %s
- Skjøna ikkje gjeven dato: %s
- Vel ei fil å føra inn
- Ikkje vis tid
- Berre byrjingstid
- Byrjing- og endetid
- Byrjing- og endetid under hendet
- Namnlaus kalender
- %1$s-konto
- Set opp kalender i %1$s
- %1$d hende
- Slett kalender
- Byt namn
- Kalenderopplysingar
- Let
- Synkroniser denne kalenderen
- Åtvaring
- Brigde av let kan verta gløymt når kalenderen vert synkronisert att.
-\n
-\nDu kan slå av «Handsam kalenderletar» i DAVx⁵ for å hindre dette ifrå å henda.
- Eg skjønar
- Vil du sanneleg slette denne kalenderen\?
- Slett kalender
- Avbryt
- Hende vert ikkje vist
- Hovudinnstillingar
- Legg til ein CalDAV-kalender
- Rit inn eit kalendernamn.
- Legg til kalender
- Namn
- Avbryt
- Om Etar
- Etter hendebyrjing
- Når
- Kalender
- I dag
- I dag kl. %s
- I morgon kl. %s
- %1$s, %2$s
-
- - 1 min
- - %d min
-
- (Utan namn)
-
- - 1 minutt
- - %d minutt
-
-
- - 1 dag
- - %d dagar
-
-
- - 1 veke
- - %d veker
-
- Dag
-
-
- - Veke %d
-
- Vis dag
- Vis hende
- Nytt hende
- Brigd hende
- Del
- I dag
- Søk
- Skjul knappar
- Vis innstillingar
- Hendenamn
- Svara «ja».
- Stad
- Utgreiing
- Gjestar
- Gøymde hendet.
- Laga hendet.
- Laga ikkje tomt hende.
- Innbydingar vert send.
- Svara «kan henda».
- Svara «nei».
- Gøym
- Kalendervarsel
- Vis hende
- Møteinnbyding
- Heile dagen
- Kalender
- Vis meg som
- Legg til påminning
- Varsel og påminningar
- Før du kan leggja til eit hende, må du leggja til minst ein kalenderkonto til eininga di og syrge for at ein kalender er synleg. Trykk på «legg til konto» for å leggja til ein konto (om du nyleg la til ein konto, vent til han er synkronisert og røyn att). Eller trykk «avbryt» og sjå til at minst ein kalender er synleg.
- Tilskipar:
- Hendelet
- Set som forvald kalenderlet
- Nei
- Kjem du\?
- Ja
- Send e-brev til tilskiparen
- I dag, %1$s
- Snøggsvar
- Vel snøggsvar
- I går, %1$s
- Trykk for å visa hende ifrå etter %1$s
- Trykk for å visa hende ifrå før %1$s
- Brigd
- Avbryt
- Ikkje gjentak
- Kvardagar (mån-fre)
-
- - Kvar veke på %2$s
- - Kvar %1$d. veke på %2$s
-
- Brigd berre dette hendet
- Nytt hende
- Brigd hendet og gjentakingane dess
- Kalendervisingsinnstillingar
- Svart
- Brigd denne og alle komande hende
- Nytt hende
- Vil du slette dette hendet\?
- Vil du slette %s\?
- Brigd svar
- Innstillingar
- Månadsvisingsoppsett (ståande)
- Månadsvisingsoppsett (liggjande)
- Systemforval
- Hovudlet
- Vising
- Hovudlet
- Mørk
- Endetid
- Byrjingsdato
- Tak bort påminning
- Byrjingstid
- Tidssone
- Heildagshende
- Påminningstid
- Påminningsslag
- Hende %1$s av %2$s.
- Til %s
-
- - Kvar %d veke
- - Kvar %d. veke
-
-
- - Kvar %d dag
- - Kvar %d. dag
-
- På same dag kvar månad
- I all framtid
- Skjul avviste hende
- Vis tid
- Veke byrjar på
- Veke byrjar på
- Forvald hendelengd
- Varsel
- Oppsprettsvarsel
- Forvald påminningstid
- Nytta eiga tidssone
- Vis kalendrar og hendetider i di eiga tidssone når du ferdast
- Vis veketal
- Søkjer i %s …
- © 2015-%1$s Etar Project. Portions © 2005-%1$s Android Open Source Project.
- Utgjevar
- Utgåve
- Brigdelogg
-
- - +1
- - +%d
-
- Etar krev tilgjenge til å lesa og rite kalender for å verke. Røyn att.
-
- - For %d hende
- - For %d hende
-
- 2 timar
- 6 dagar
- 7 dagar
- 1,5 timar
- Vis hende
- Ikkje synkronisert
- Legg til ein EteSync-kalender
- Krev varsel for å gjera indre synkroniseringar. Du kan trygt skjula denne sambandslina.
- Vent litt
- Spør om kvar lenge du vil vente med påminningar når du set dei på vent
- Tak bort deltakar
- Legg til deltakar
- Forvald ventetid
- Forvald ventetid
- Vel ventetid
- Nytta forvald ventetid kvar gong
- Skjul alle
-
diff --git a/app/src/main/res/values-or/strings.xml b/app/src/main/res/values-or/strings.xml
deleted file mode 100644
index cb8462d4ae..0000000000
--- a/app/src/main/res/values-or/strings.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-
-
- ସେଟିଂ
- ସୂଚନା
- ଵର୍ଣ୍ଣନା
- ସନ୍ଧାନ
- ଆଜି
- ଆସନ୍ତାକାଲି
- ଆଜି
- କେବେ
- Etar ସମ୍ବନ୍ଧରେ
-
-
- - ସପ୍ତାହ %d
-
-
\ No newline at end of file
diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml
index 8b63be6b66..30aa5d2d3a 100644
--- a/app/src/main/res/values-pl/strings.xml
+++ b/app/src/main/res/values-pl/strings.xml
@@ -46,9 +46,9 @@
- tydzień %d
- - tydzień %d
- - tydzień %d
- - tydzień %d
+ - tygodnie %d
+ - tygodni %d
+ - tygodni %d
"Odśwież"
"Pokaż dzień"
@@ -85,6 +85,8 @@
"Prywatność"
"Dodaj przypomnienie"
"Brak kalendarzy"
+ "Przed utworzeniem wydarzenia musisz dodać do urządzenia konto z Kalendarzem i ustawić wybrany kalendarz jako widoczny. Wybierz „Dodaj konto” (jeśli właśnie to zrobiłeś, poczekaj na zakończenie synchronizacji i spróbuj ponownie). Możesz też dotknąć Anuluj i upewnić się, że co najmniej jeden kalendarz jest widoczny."
+ "Dodaj konto"
"Kalendarz:"
"Organizator:"
"Wybierz kolor wydarzenia"
@@ -176,7 +178,7 @@
"Domyślne przypomnienie"
"Domyślne przypomnienie"
"10"
- Używaj domowej strefy czasowej
+ "Domowa strefa czasowa"
"Godziny będą podawane w domowej strefie czasowej (nawet w podróży)"
"Domowa strefa czasowa"
"Pokaż numer tygodnia"
@@ -375,11 +377,4 @@
Używaj prawdziwych kolorów wydarzenia
Informacje
Duplikat
- URL
- Zanim będzie można dodać wydarzenie, należy dodać do urządzenia co najmniej jeden kalendarz
- Dodaj kalendarz
- Nie sprawdzaj optymalizacji baterii
- Zarządzanie powiadomieniami
- Kalendarze
- Używasz tej opcji na własne ryzyko! Powiadomienia nie będą już działać, widżet nie będzie już aktualizowany, a usługi działające w tle ulegną awarii. Ale nie będziesz już więcej pytany, czy chcesz włączyć usługę w tle.
-
+
\ No newline at end of file
diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml
index e93ed93a6c..19100a1da6 100644
--- a/app/src/main/res/values-pt-rBR/strings.xml
+++ b/app/src/main/res/values-pt-rBR/strings.xml
@@ -48,6 +48,8 @@
Privacidade
Adicionar lembrete
Nenhuma agenda disponível
+ Antes de adicionar um evento, você deve adicionar pelo menos uma conta do Agenda a seu dispositivo e tornar uma agenda visível. Toque em \"Adicionar conta\" para adicionar uma conta (caso tenha adicionado uma conta recentemente, aguarde o fim da sincronização e tente novamente). Ou toque em \"Cancelar\" e certifique-se de que pelo menos uma agenda esteja visível.
+ Adicionar conta
Agenda:
Organizador:
Escolher cor do evento
@@ -325,8 +327,4 @@
after start of event
Duplicar
Usar cores reais de evento
- URL
- Informação
- Adicionar calendário
- Antes que você possa adicionar um evento, você deve adicionar pelo menos um calendário no seu dispositivo.
\ No newline at end of file
diff --git a/app/src/main/res/values-pt-rPT/strings.xml b/app/src/main/res/values-pt-rPT/strings.xml
index aae4da86a9..ae2f8e06a7 100644
--- a/app/src/main/res/values-pt-rPT/strings.xml
+++ b/app/src/main/res/values-pt-rPT/strings.xml
@@ -76,6 +76,8 @@
"Privacidade"
"Adicionar lembrete"
"Sem calendários"
+ Antes de poder adicionar um evento, tem de adicionar pelo menos uma conta do Calendário e torná-lo visível. Toque em Adicionar conta para adicionar uma conta (se acabou de adicionar uma conta, aguarde que a sincronização esteja concluída). Em alternativa, toque em Cancelar e certifique-se que está visível pelo menos um calendário.
+ "Adicionar conta"
"Calendário:"
"Organizador:"
Escolher cor do evento
@@ -319,8 +321,8 @@
Aviso
Calendário sem nome
5 dias
- A alteração da cor poderá ser revertida durante as sincronizações.
-\n
+ A alteração da cor poderá ser revertida durante as sincronizações.
+\n
\nEm DAVx⁵, a opção \"Gerir cores do calendário\" pode ser desativada.
Calendário local
Predefinições do sistema
@@ -342,10 +344,4 @@
A agendar novos lembretes…
after start of event
- Info
- Duplicado
- Usar cores de eventos reais
- URL
- Antes de poder adicionar um evento, tem de adicionar pelo menos um calendário no seu dispositivo.
- Adicionar calendário
\ No newline at end of file
diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml
index eb2508f17c..dd05c48b0c 100644
--- a/app/src/main/res/values-pt/strings.xml
+++ b/app/src/main/res/values-pt/strings.xml
@@ -20,33 +20,28 @@
Hoje, às %s
Amanhã, às %s
%1$s, %2$s
- (Sem título)
+ (sem título)
- 1 minuto
- - %d minutos
- %d minutos
- 1 min.
- - %d min.
- %d min.
- 1 hora
- - %d horas
- %d horas
- 1 dia
- - %d dias
- %d dias
- Semana %d
- - Semana %d
- Semana %d
- Recarregar
+ "Atualizar"
"Mostrar dia"
Agenda
"Dia"
@@ -66,11 +61,11 @@
"Localização"
"Descrição"
"Convidados"
- Evento criado
- Evento guardado
- Evento vazio não criado
- Os convites serão enviados
- As atualizações serão enviadas
+ "Evento criado."
+ Evento guardado.
+ "Evento vazio não criado."
+ "Os convites serão enviados."
+ "As atualizações serão enviadas."
Guardar
Notificações do calendário
Ver evento
@@ -80,12 +75,14 @@
"Mostrar-me como"
"Privacidade"
"Adicionar lembrete"
- Não existem calendários
+ Sem calendários
+ Antes de poder adicionar um evento, tem de adicionar pelo menos uma conta do Calendário e torná-lo visível. Toque em Adicionar conta para adicionar uma conta (se acabou de adicionar uma conta, aguarde que a sincronização esteja concluída). Em alternativa, toque em Cancelar e certifique-se que está visível pelo menos um calendário.
+ "Adicionar conta"
Calendário:
"Organizador:"
"Escolher cor do evento"
"Cor do evento"
- Definir como cor padrão do calendário
+ Definir como cor predefinida do calendário
Cor do calendário
"Seletor de cores"
Vai estar presente\?
@@ -95,14 +92,14 @@
Enviar e-mail aos convidados
Enviar e-mail ao organizador
Enviar e-mail com
- Evento não encontrado
+ "Evento não encontrado."
"Mapa"
Ligar
"Respostas rápidas"
- Editar respostas padrão para os e-mails
+ Editar respostas predefinidas em e-mails para convidados
"Resposta rápida"
"Escolher resposta rápida"
- Não foi encontrada uma aplicação de e-mail
+ Não foi encontrada nenhuma aplicação de e-mail
- "Chegarei c/ alguns mins. de atraso."
- "Chegarei em cerca de 10 minutos."
@@ -116,26 +113,24 @@
Ontem, %1$s
Amanhã, %1$s
A carregar…
- Toque para ver os eventos anteriores a %1$s
- Toque para ver os eventos posteriores a %1$s
- Pesquisar calendários
+ Toque para ver os eventos antes de %1$s
+ Toque para ver os eventos posteriores %1$s
+ Pesquisar os meus calendários
"Detalhes"
"Editar"
Eliminar
"Concluído"
"Cancelar"
- Descartar tudo
+ Cancelar tudo
Adiar
"Evento único"
; até %s
- ; uma vez
- - ; %d vezes
- ; %d vezes
- Diariamente
- - A cada %d dias
- A cada %d dias
Todos os dias úteis (seg-sex)
@@ -145,9 +140,9 @@
"Mensalmente"
"Anualmente"
- Personalizado (não pode personalizar no telemóvel)
+ Personalizado (não é possível personalizar no telemóvel)
Alterar apenas este evento
- Alterar todos os eventos da série
+ Alterar todos os eventos nesta série
"Alterar este e todos os eventos futuros"
"Novo evento"
"Novo evento"
@@ -155,32 +150,31 @@
Eliminar %s\?
"Alterar resposta"
Definições
- Definições de vista
+ Definições de visualização
"Notificações e lembretes"
Ocultar eventos recusados
Primeiro dia da semana
Primeiro dia da semana
Limpar histórico de pesquisas
Remover todas as pesquisas efetuadas
- Histórico de pesquisas limpo
+ Histórico de pesquisas limpo.
"Notificações"
"Vibrar"
"Som"
"Notificação pop-up"
- Horário do lembrete
- Horário do lembrete
+ Tempo predefiido do lembrete
+ Tempo predefinido do lembrete
"10"
- Usar fuso horário local
- Mostrar calendários e hora dos eventos no seu fuso horário
- Fuso horário local
+ Usar hora local
+ Mostrar calendários e horas dos eventos no seu fuso horário
+ Fuso horário
Mostrar número da semana
"Versão da compilação"
- +1
- - +%d
- +%d
- Não há eventos futuros no calendário
+ Sem eventos futuros no calendário
Experimental
"Ignorar lembretes"
"Ignorar lembretes"
@@ -202,36 +196,30 @@
"Mostrar-me como"
"Privacidade"
"+ Novo evento"
- Evento %1$s se %2$s.
+ Evento %1$s de %2$s.
- 1 evento
- - %d eventos
- %d eventos
- +1 evento
- - +%d eventos
- +%d eventos
Evento selecionado
- A cada %d dia
- - A cada %d dias
- A cada %d dias
- A cada %d semana
- - A cada %d semanas
- A cada %d semanas
- A cada %d mês
- - A cada %d meses
- A cada %d meses
- A cada %d ano
- - A cada %d anos
- A cada %d anos
"no mesmo dia de cada mês"
@@ -241,26 +229,25 @@
Por um número de eventos
- Durante %d evento
- - Durante %d eventos
- Durante %d eventos
"alterar data de término"
- Padrão
+ Predefinição
Privado
Público
Perguntar tempo para adiar
- Pedir tempo mínimo para adiar lembretes
- Utilizar sempre o tempo padrão
+ Perguntar tempo mínimo para adiar lembretes
+ Utilizar sempre o tempo predefinido
Definir tempo para adiar
- Tempo padrão para adiar
- Atraso padrão para adiar
+ Tempo predefinido para adiar
+ Atraso predefinido para adiar
Partilhar
Ir para…
- Definições de exibição
- Respondeu sim
- Respondeu talvez
- Respondeu não
- Não existe uma aplicação de mapas
+ Definições de vista
+ Respondeu sim.
+ Respondeu talvez.
+ Respondeu não.
+ Não existe nenhuma app de mapas instalada
Vista mensal (vertical)
Vista mensal (horizontal)
Tema
@@ -269,14 +256,14 @@
Preto
Cor principal
Cor principal
- Vista padrão
- Opções de exibição
+ Vista predefinida
+ Detalhes de visualização
Mostrar hora
Mostrar localização
Vista utilizada anteriormente
Dias por semana
Dias por semana
- Duração padrão dos eventos
+ Duração predefinida dos eventos
Reportar erros
Esta aplicação necessita de permissões para ler e gravar no calendário para funcionar corretamente. Tente novamente.
As permissões necessárias foram recusadas. Ative as permissões nas definições para poder editar eventos.
@@ -288,13 +275,13 @@
1 hora e meia
2 horas
Surgiram erros ao partilhar o evento
- Enviar evento para:
+ Enviar evento a:
Exportar para o cartão SD
Evento exportado com sucesso: %1$s
Importar evento
Nada para importar
Falha ao importar para o calendário
- Não foi possível perceber a data indicada: %s
+ Não foi possível processar a data indicada: %s
Escolha o ficheiro a importar
Não mostrar hora
Apenas hora de início
@@ -302,9 +289,9 @@
Hora de início e de término para além do evento
Número máximo de linhas no evento
Tarefas em segundo plano
- As notificações são necessárias para a sincronização interna. Pode ocultar este canal com segurança.
+ Notificações necessárias para a sincronização interna. Pode ocultar este canal com segurança.
Conta %1$s
- Eliminar calendário
+ Remover calendário
Alterar nome
Cor
Mostrar eventos
@@ -317,9 +304,9 @@
Cancelar
Aviso
Percebi
- Eliminar calendário
+ Remover calendário
Cancelar
- Acerca
+ Sobre o Etar
Calendário local
© 2015-%1$s The Etar Project. Portions © 2005-%1$s The Android Open Source Project.
Autores
@@ -327,44 +314,37 @@
Licença
Código-fonte
Calendário sem nome
- Não foi possível perceber o fuso horário: %s
+ Incapaz de entender o fuso horário: %s
Adicionar calendário local
Adicionar calendário local
Introduza um nome!
Os calendários locais não são sincronizados e apenas estão disponíveis no seu dispositivo.
- A alteração da cor pode ser revertida durante a sincronização.
+ A alteração da cor poderá ser revertida durante as sincronizações.
\n
\nEm DAVx⁵, a opção \"Gerir cores do calendário\" pode ser desativada.
- Tem a certeza de que deseja eliminar este calendário?
+ Tem a certeza de que deseja remover este calendário\?
Calendário local
Configurar calendário em %1$s
%1$d eventos
- Informações do calendário
+ Informação do calendário
7 dias
6 dias
5 dias
4 dias
3 dias
2 dias
- Definições do sistema
+ Predefinições do sistema
Adicionar calendário EteSync
Adicionar calendário CalDAV
- Modo preto puro
+ Modo escuro em preto puro
Nenhum
- 1 semana
- - %d semanas
- %d semanas
A agendar novos lembretes…
- após iniciar um evento
+ after start of event
Usar cores de eventos reais
- Informação
+ Info
Duplicar
- URL
- Antes de criar um evento, tem de adicionar, pelo menos, um calendário no seu dispositivo
- Adicionar calendário
- Não verificar otimização de bateria
- Gerir notificações
- Calendários
\ No newline at end of file
diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml
index 659dad30c2..098db3254d 100644
--- a/app/src/main/res/values-ro/strings.xml
+++ b/app/src/main/res/values-ro/strings.xml
@@ -42,9 +42,9 @@
- %d de zile
- - Săptămâna %d
- - De săptămâni %d
- - Săptămâni %d
+ - Week %d
+ - Weeks %d
+ - Weeks %d
"Actualizaţi"
"Afişaţi ziua"
@@ -81,6 +81,8 @@
"Confidenţialitate"
"Adăugaţi memento"
"Niciun calendar"
+ "Înainte de a putea adăuga un eveniment, trebuie să adăugaţi cel puţin un cont Calendar pe dispozitiv şi să faceţi un calendar vizibil. Atingeţi „Adăugaţi un cont” pentru a adăuga un cont (dacă tocmai aţi adăugat un cont, aşteptaţi să se termine sincronizarea şi încercaţi din nou). Sau atingeţi „Anulaţi” şi asiguraţi-vă că cel puţin un calendar este vizibil."
+ "Adăugaţi un cont"
"Calendar:"
"Organizator:"
"Alegeți o culoare pentru eveniment"
@@ -362,11 +364,4 @@
Utilizați culorile reale ale evenimentului
Informații
Duplicat
- URL
- Înainte de a putea adăuga un eveniment, trebuie să adăugați cel puțin un calendar pe dispozitivul dumneavoastră
- Adăugați un calendar
- Gestionați notificările
- Nu verificați optimizarea bateriei
- Utilizați pe propriul risc! Notificările nu vor mai funcționa, widget-urile nu se vor mai actualiza și serviciile din fundal se vor bloca. Dar nu veți mai fi întrebat din nou dacă doriți să activați serviciul de fundal.
- Calendare
\ No newline at end of file
diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml
index ea701e9bc2..90e3ae645d 100644
--- a/app/src/main/res/values-ru/strings.xml
+++ b/app/src/main/res/values-ru/strings.xml
@@ -46,7 +46,7 @@
- %d дней
- - Неделя %d
+
- Неделя %d
- Неделя %d
- Неделя %d
@@ -86,6 +86,8 @@
"Конфиденциальность"
"Добавить напоминание"
"Нет календарей"
+ Добавить событие можно только в видимый календарь, связанный с аккаунтом Google. Нажмите \"Добавить аккаунт\" или, если аккаунт уже добавлен, дождитесь окончания синхронизации и повторите попытку. Либо нажмите \"Отмена\" и сделайте видимым хотя бы один календарь.
+ "Добавить аккаунт"
"Календарь:"
"Организатор:"
Выбрать цвет события
@@ -262,7 +264,7 @@
Спрашивать период отсрочки напоминания
Использовать значение по умолчанию
Отложить на\u2026
- Время повтора по умолчанию
+ Повтор по умолчанию
Повтор по умолчанию
Перейти…
Получен ответ \"да\".
@@ -372,11 +374,4 @@
Использовать реальные цвета событий
Информация
Дублировать
- Ссылка
- Прежде чем добавить событие, необходимо создать на устройстве хотя бы один календарь
- Добавить календарь
- Управление уведомлениями
- Не проверять оптимизацию батареи
- Используйте на свой страх! Уведомления больше не будут работать, виджеты не будут обновляться и произойдёт сбой фоновых сервисов. Но вас больше не спросят, хотите ли вы включить фоновый сервис.
- Календари
\ No newline at end of file
diff --git a/app/src/main/res/values-sat/strings.xml b/app/src/main/res/values-sat/strings.xml
deleted file mode 100644
index 638ca3320c..0000000000
--- a/app/src/main/res/values-sat/strings.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-
-
- ᱜᱟᱯᱟ
- ᱜᱟᱯᱟ %s ᱨᱮ
- (ᱪᱮᱫ ᱧᱩᱛᱩᱢ ᱵᱟᱹᱱᱩᱜ ᱠᱟᱫᱟ)
- ᱵᱟᱹᱱᱩᱜᱼᱟ
- ᱠᱮᱞᱮᱱᱰᱚᱨ
- ᱛᱤᱥᱚᱜ
- ᱛᱮᱦᱮᱧ
- %1$s, %2$s
- ᱛᱮᱦᱮᱧ %s ᱨᱮ
-
\ No newline at end of file
diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml
index d48e36dfc7..43490a67c4 100644
--- a/app/src/main/res/values-sk/strings.xml
+++ b/app/src/main/res/values-sk/strings.xml
@@ -19,32 +19,28 @@
"Zajtra"
"Dnes o %s"
"Zajtra o %s"
- %1$s, %2$s
+
+ %1$s, %2$s
+
"(Bez názvu)"
- - 1 minúta
- - %d minúty
- - %d minút
+ - "1 minúta"
+ - "%d min."
- - 1 min
- - %d minúty
- - %d minút
+ - "1 min."
+ - "%d min"
- - 1 hodina
- - %d hodiny
- - %d hodín
+ - "1 hodina"
+ - "%d hod."
- - 1 deň
- - %d dni
- - %d dní
+ - "1 deň"
+ - "%d d."
- - Týždeň %d
- - Týždeň %d
- - Týždeň %d
+ - "týždeň %d"
"Obnoviť"
"Zobraziť deň"
@@ -81,6 +77,8 @@
"Ochrana osobných údajov"
"Pridať pripomienku"
"Žiadne kalendáre"
+ "Pred pridaním udalosti musíte do zariadenia pridať aspoň jeden účet služby Kalendár a nastaviť kalendár ako viditeľný. Ak chcete pridať účet, dotknite sa možnosti Pridať účet (ak ste účet práve pridali, počkajte na dokončenie jeho synchronizácie a skúste to znova). Prípadne sa dotknite možnosti Zrušiť a skontrolujte, či je viditeľný aspoň jeden kalendár."
+ "Pridať účet"
"Kalendár:"
"Organizátor:"
"Vyberte farbu udalosti"
@@ -99,7 +97,7 @@
"Mapa"
"Zavolať"
"Rýchle odpovede"
- Upraviť predvolené reakcie pri e-mailových hostí
+ "Upraviť predv. odp."
"Rýchla odpoveď"
"Vyberte rýchlu odpoveď"
"E-mailový program sa nepodarilo nájsť"
@@ -109,7 +107,7 @@
- "Začnite bezo mňa."
- "Je mi ľúto, ale nestíham. Naplánujeme to na inokedy."
- Napíšte vlastnú…
+ "Napíšte vlastnú..."
"Organizátor:"
"Pripomienky"
"dnes, %1$s"
@@ -129,20 +127,17 @@
"Jednorazová udalosť"
", do %s"
- - ; jednorazovo
- - ; pre %d razy
- - ; pre %d krát
+ - ", jednorazovo"
+ - ", %d-krát"
- - Denne
- - Vždy po %d dňoch
- - Vždy po %d dňoch
+ - "Denne"
+ - "Vždy po %d dňoch"
"Každý pracovný deň (Po. – Pi.)"
- - Každý týždeň v %2$s
- - Raz za %1$d týždne v %2$s
- - Raz za %1$d týždňov v %2$s
+ - "Každý týždeň v %2$s"
+ - "Raz za %1$d týžd. v %2$s"
"Mesačne"
"Ročne"
@@ -171,15 +166,14 @@
"Predvolený čas pripomienky"
"Predvolený čas pripomienky"
"10"
- Použite domáce časové pásmo
+ "Použiť domáce č.p."
"Kalendáre a časy udal. sa zobr. vždy v domovskom čas. pásme"
"Domov. čas. pásmo"
"Zobrazovať číslo týždňa"
"Verzia zostavy"
- - +1
- - +%d
- - +%d
+ - "+1"
+ - "+%d"
"Žiadne ďalšie udalosti v kalendári"
"Experimentálne"
@@ -205,35 +199,29 @@
"Pridať novú udalosť"
"Udalosť %1$s z %2$s."
- - 1 udalosť
- - %d udalosti
- - %d udalostí
+ - "1 udalosť"
+ - "Počet udalostí: %d"
- - +1 udalosť
- - +%d udalosti
- - +%d udalostí
+ - "+1 udalosť"
+ - "+ďalšie udalosti (%d)"
"Vybratá udalosť"
- - Raz za %d deň
- - Raz za %d dni
- - Raz za %d dní
+ - "Raz za %d d."
+ - "Raz za %d d."
- - Raz za %d týždeň
- - Raz za %d týždne
- - Raz za %d týždňov
+ - "Raz za %d týžd."
+ - "Raz za %d týžd."
- - Raz za %d mesiac
- - Raz za %d mesiace
- - Raz za %d mesiacov
+ - "Raz za %d mes."
+ - "Raz za %d mes."
- - Raz za %d rok
- - Raz za %d roky
- - Raz za %d rokov
+ - "Raz za %d r."
+ - "Raz za %d r."
"mesačne v ten istý deň"
"Stále"
@@ -241,9 +229,8 @@
"Do %s"
"Pre určitý počet udalostí"
- - Pre %d udalosť
- - Pre %d udalosti
- - Pre %d udalostí
+ - "Pre %d udalosť"
+ - "Pre %d udalosti/-í"
"zmeniť dátum ukončenia"
Predvolené
@@ -285,7 +272,7 @@
Pri zdieľaní udalosti sa vyskytli problémy
Odoslať udalosť na:
Exportovať na kartu SD
- Udalosť bola úspešne exportovaná: %1$s
+ Udalosť bola úspešne exportovaná: %1s
Importovať udalosť
Nič na importovanie
Importovanie do kalendára zlyhalo
@@ -297,72 +284,11 @@
Zobraziť podrobnosti
Čas zobrazenia
Zobrazenie polohy
- Neukazujte čas
+ Nie
Len čas začatia
Čas začatia a ukončenia
Počiatočný a koncový čas pod udalosťou
Maximálny počet riadkov v udalosti
Žiadne
- po štarte akcie
- Použiť skutočné farby udalostí
- Autori
- 3 dni
- Nastaviť kalendár v %1$s
- Úlohy na pozadí
- 6 dní
- Názov
- Pridať kalendár
- Zrušiť
- Informácie
- Plánovanie nových pripomienok…
- Oznámenia vyžadované pre internú synchronizáciu. Tento kanál môžete pokojne skryť.
- 2 dni
-
- - 1 týždeň
- - %d týždne
- - %d týždňov
-
- Duplikovať
- Predvolené systémom
- Čisto čierny nočný režim
- Zoznam zmien
- Licencia
- 4 dni
- 7 dní
- Nie je možné pochopiť dané časové pásmo: %s
- Nepomenovaný kalendár
- Účet %1$s
- Zmeniť názov
- Informácie o kalendári
- Farba
- Synchronizovat tento kalendár
- Výstraha
- Zmena farby sa môže vrátiť pri opätovnej synchronizácii kalendára.
-\n
-\nV DAVx⁵ „Správa farby kalendárov“ možno toto správanie zakázať.
- Rozumiem
- Offline kalendáre NIE SÚ synchronizované a sú dostupné len vo vašom telefóne.
- Zrušiť
- O Etare
- Odstrániť kalendár
- Udalosti sa nezobrazujú
- Všeobecné nastavenia
- Pridať kalendár CalDAV
- Pridať kalendár EteSync
- Pridať offline kalendár
- Pridať offline kalendár
- Zadajte názov kalendára!
- © 2015-%1$s The Etar Project. Časti © 2005-%1$s The Android Open Source Project.
- Zobrazovať udalosti
- Zdroj
- 5 dní
- Nesynchronizované
- Offline kalendár
- Udalostí: %1$d
- Naozaj chcete odstrániť tento kalendár\?
- Offline kalendár
- Odstrániť kalendár
- URL
- Pred pridaním udalosti musíte do zariadenia pridať aspoň jeden kalendár
- Pridať kalendár
-
+ after start of event
+
\ No newline at end of file
diff --git a/app/src/main/res/values-sl/strings.xml b/app/src/main/res/values-sl/strings.xml
index 628281bf33..c4a30afab0 100644
--- a/app/src/main/res/values-sl/strings.xml
+++ b/app/src/main/res/values-sl/strings.xml
@@ -19,37 +19,28 @@
"Jutri"
"Danes ob %s"
"Jutri ob %s"
- %1$s, %2$s
+
+ %1$s, %2$s
+
"(Brez naslova)"
- - 1 minuta
- - %d minuti
- - %d minute
- - %d minut
+ - "1 minuta"
+ - "%d min"
- - 1 min.
- - %d min.
- - %d min.
- - %d min.
+ - "1 min"
+ - "%d min"
- - 1 ura
- - %d uri
- - %d ure
- - %d ur
+ - "1 ura"
+ - "%d ur"
- - 1 dan
- - %d dni
- - %d dni
- - %d dni
+ - "1 dan"
+ - "%d dni"
- - %d. teden
- - %d. teden
- - %d. teden
- - %d. teden
+ - "%d. teden"
"Osveži"
"Pokaži dan"
@@ -86,6 +77,8 @@
"Zasebnost"
"Dodaj opomnik"
"Ni koledarjev"
+ "Pred dodajanjem dogodka morate v napravo dodati vsaj en račun za Etar Koledar in narediti koledar viden. Dotaknite se možnosti »Dodaj račun«, da dodate račun (če ste ga pravkar dodali, počakajte, da se sinhroniziranje konča, in poskusite znova). Lahko se tudi dotaknete možnosti »Prekliči« in se prepričate, da je viden vsaj en koledar."
+ "Dodaj račun"
"Koledar:"
"Organizator:"
"Izberite barvo dogodka"
@@ -134,23 +127,17 @@
"Enkraten dogodek"
"– do %s"
- - ; enkrat
- - ; %d krat
- - ; %d krat
- - ; %d krat
+ - "– enkrat"
+ - "– tolikokrat: %d"
- - Dnevno
- - Vsaka %d dni
- - Vsake %d dni
- - Vsakih %d dni
+ - "Dnevno"
+ - "Vsakih toliko dni: %d"
"Vsak delovni dan (pon–pet)"
- - Tedensko v %2$s
- - Vsaka %1$d tedna v %2$s
- - Vsake %1$d tedne v %2$s
- - Vsakih %1$d tednov v %2$s
+ - "Tedensko: %2$s"
+ - "%2$s – na vsakih toliko tednov: %1$d"
"Mesečno"
"Letno"
@@ -185,17 +172,15 @@
"Pokaži številko tedna"
"Delovna različica"
- - +1
- - +%d
- - +%d
- - +%d
+ - "+1"
+ - "+ %d"
"Ni prihajajočih dogodkov v koledarju"
"Poskusne"
"Preskoči opomnike"
"Preskoči opomnike"
"Pošlji zbirko podatkov"
- Iskanje %s…
+ "Iskanje %s ..."
"Odstrani udeleženca"
"Datum začetka"
"Čas začetka"
@@ -214,16 +199,12 @@
"+ Nov dogodek"
"Dogodek %1$s od %2$s."
- - 1 dogodek
- - %d dogodka
- - %d dogodki
- - %d dogodkov
+ - "1 dogodek"
+ - "Št. dogodkov: %d"
- - +1 dogodek
- - +%d dogodka
- - +%d dogodke
- - +%d dogodkov
+ - "Še 1 dogodek"
+ - "Še toliko dogodkov: %d"
"Izbrani dogodek"
@@ -256,113 +237,5 @@
Zasebno
Javno
Brez
- po začetku dogodka
- Pojdi na…
- Delite
- 2 uri
- Izvozi na kartico SD
- Načrtovanje novih opomnikov…
- Nameščene ni nobene aplikacije z zemljevidi
- Etar za pravilno delovanje potrebuje dovoljenja za branje in pisanje koledarja. Prosimo, poskusite znova.
- 5 dni
- Informacije
- Opravila v ozadju
- Popolnoma črn nočni način
- Privzeti pogled
- Največje število vrstic v dogodku
- 3 dni
-
- - 1 teden
- - %d tedna
- - %d tedni
- - %d tednov
-
- Podvoji
- Postavitev pogleda meseca (pokončno)
- Svetla
- Postavitev pogleda meseca (ležeče)
- Tema
- Sistemsko privzeto
- Temna
- Črna
- Osnovna barva
- Osnovna barva
- Možnosti prikaza
- Predhodno uporabljen pogled
- Dni na teden
- Privzeto trajanje dogodka
- Dni na teden
- Vprašaj za zakasnitev dremeža, kadar koli se sproži opomnik za dremež
- Vedno uporabi privzeto zakasnitev dremeža
- Zahtevaj opomnik zakasnitve dremeža
- Nastavi zakasnitev dremeža
- Privzeti čas zakasnitve za dremež
- Privzeta zakasnitev dremeža
- © 2015-%1$s Projekt Etar. Določeni deli. © 2005-%1$s Android odprtokodni projekt.
- Avtorji
- Dnevnik sprememb
- Licenca
- Poročajte o težavah
- Vir
- Zahtevana dovoljenja so bila zavrnjena in jih morate omogočiti v aplikaciji Nastavitve, če želite urejati dogodke
- Zaupno
- 2 dneva
- 4 dni
- 6 dni
- 7 dni
- 0 minut
- 15 minut
- 30 minut
- 1 ura
- 1,5 ure
- Med deljenjem dogodka so se pojavile težave
- Deli dogodek z:
- Dogodek je bil uspešno izvožen: %1$s
- Uvozi dogodek
- Ničesar ni za uvoziti
- Uvoz v koledar ni uspel
- Ni mogoče prepoznati danega časovnega pasu: %s
- Ni mogoče prepoznati danega datuma: %s
- Izberite datoteko za uvoz
- Začetni in končni čas
- Začetni in končni čas pod dogodkom
- Neimenovani koledar
- %1$s račun
- Samo čas začetka
- Koledar brez povezave
- Konfigurirajte koledar v %1$s
- %1$d dogodki
- Izbriši koledar
- Spremeni ime
- Informacije o koledarju
- Barva
- Sinhroniziraj ta koledar
- Opozorilo
- Razumem
- Izbriši koledar
- Prekliči
- Ni sinhronizirano
- Dogodki niso prikazani
- Splošne nastavitve
- Dodaj koledar CalDAV
- Dodaj koledar EteSync
- Dodaj koledar brez povezave
- Dodaj koledar brez povezave
- Vnesite ime koledarja!
- Dodaj koledar
- Ime
- Prekliči
- Koledar brez povezave
- Prikaz dogodkov
- Ne pokaži časa
- Spreminjanje barve se lahko razveljavi, ko se koledar znova sinhronizira.
-\n
-\nDa to preprečimo, moramo v DAVx⁵ \"Upravljanje barv koledarja\" onemogočiti.
- Ali res želite izbrisati ta koledar\?
- Koledarji brez povezave NISO sinhronizirani s storitvijo v oblaku in so na voljo samo v vašem telefonu.
- O aplikaciji Etar
- Ogled nastavitev
- Odgovor je bil ne.
- Odgovor je morda.
- Odgovor je pritrdilni.
-
+ after start of event
+
\ No newline at end of file
diff --git a/app/src/main/res/values-sr/strings.xml b/app/src/main/res/values-sr/strings.xml
index 21ea7e0791..92a3644f0e 100644
--- a/app/src/main/res/values-sr/strings.xml
+++ b/app/src/main/res/values-sr/strings.xml
@@ -77,6 +77,8 @@
"Приватност"
"Додај подсетник"
"Нема календара"
+ "Да бисте могли да додате догађај, на уређај морате да додате најмање један налог Календара и да омогућите видљивост календара. Да бисте додали налог, додирните Додај налог (ако сте управо додали налог, сачекајте да се синхронизација заврши и покушајте поново) или додирните Откажи и проверите да ли је најмање један календар видљив."
+ "Додај налог"
"Календар:"
"Организатор:"
"Изабери боју догађаја"
@@ -255,4 +257,4 @@
Прикажи Локацију
Ништа
after start of event
-
+
\ No newline at end of file
diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml
index bc9b12a751..6a2e9ecadf 100644
--- a/app/src/main/res/values-sv/strings.xml
+++ b/app/src/main/res/values-sv/strings.xml
@@ -76,6 +76,8 @@
"Sekretess"
"Lägg till påminnelse"
"Inga kalendrar"
+ "Innan du kan lägga till en händelse måste du lägga till minst ett kalenderkonto på enheten och göra en kalender synlig. Tryck på Lägg till konto (om du precis har lagt till ett konto väntar du tills synkroniseringen är slutförd och försöker sedan igen). Annars trycker du på Avbryt och kontrollerar att minst en kalender visas."
+ "Lägg till konto"
"Kalender:"
"Organisatör:"
"Välj färg på eventet"
@@ -188,7 +190,7 @@
"Lägg till påminnelse"
"Ta bort påminnelse"
"Lägg till deltagare"
- Händelse för hela dagen
+ "Hela dagen"
"Tid för påminnelse"
"Påminnelsetyp"
"Visa mig som"
@@ -201,7 +203,7 @@
- +1 händelse
- - +%d händelser
+ - +<xliff:g xmlns:xliff=\"urn:oasis:names:tc:xliff:document:1.2\" id=\"count\"> händelser
"Markerad händelse"
@@ -217,8 +219,8 @@
- "Med %d månaders intervall"
- - Varje %d år
- - Vartannat %d år
+ - Singular form [teckengräns = 30]
+ - Med %d års intervall
"samma dag varje månad"
"För alltid"
@@ -227,7 +229,7 @@
"Ett antal upprepningar"
- För %d händelse
- - För %d händelser
+ - För %d händelse
"ändra slutdatum"
Standardinställning
@@ -237,8 +239,8 @@
Fråga efter snoozelängd vid snooze av påminnelser
Använd alltid standardsnoozelängd
Välj snoozelängd
- Standardfördröjningstid för snooze
- Standard snooze-fördröjning
+ Standardsnoozelängd
+ Standardsnoozelängd
Gå till…
Svarade ja.
Svarade kanske.
@@ -269,7 +271,7 @@
Fel uppstod när händelsen delades
Skicka händelse till:
Exportera till SD-kort
- Händelse har framgångsrikt exporterats: %1$s
+ Händelse har framgångsrikt exporterats: %1s
Importera händelse
Ingenting att importera
Importering till kalendern misslyckades
@@ -332,7 +334,7 @@
© 2015-%1$sEtar-projektet. Portioner © 2005-%1$sAndroid\'s öppna källkodprojekt.
Rent svart natt-läge
Schemalägger nya påminnelser…
- efter att händelsen har startat
+ after start of event
- 1 vecka
- %d veckor
@@ -344,12 +346,4 @@
\nI DAVx⁵ kan \"Hantera kalenderfärger\" inaktiveras för att förhindra detta.
Ej uppkopplad kalender
Lägg till EteSync-kalender
- URL
- Fördubbla
- Lägg till kalender
- Du måste lägga till minst en kalender i din enhet innan du kan lägga till en händelse
- Hantera aviseringar
- Använd på egen risk! Aviseringar kommer inte längre fungera, widgeten kommer inte längre uppdatera och bakgrundstjänster kommer att krascha, men du kommer inte att bli tillfrågad igen om du vill aktivera bakgrundstjänsten.
- Kalendrar
- Kontrollera inte optimering av batteriet
\ No newline at end of file
diff --git a/app/src/main/res/values-sw/strings.xml b/app/src/main/res/values-sw/strings.xml
index d4310f13e2..f6a8c85d38 100644
--- a/app/src/main/res/values-sw/strings.xml
+++ b/app/src/main/res/values-sw/strings.xml
@@ -77,6 +77,8 @@
"Faragha"
"Ongeza kumbusho"
"Hakuna kalenda"
+ "Kabla ya kuongeza tukio, sharti uongeze angalau akaunti moja ya Kalenda kwenye kifaa chako na ufanye kalenda ionekane. Gusa Ongeza Akaunti ili uongeze akaunti (kama umeongeza akaunti sasa hivi, subiri imalize kusawazishwa na ujaribu tena). Au gusa Ghairi na uhakikishe kuwa angalau kalenda moja inaonekana."
+ "Ongeza akaunti"
"Kalenda:"
"Mwandalizi:"
"Chagua rangi ya tukio"
@@ -236,4 +238,4 @@
Umma
Hamna
after start of event
-
+
\ No newline at end of file
diff --git a/app/src/main/res/values-szl/strings.xml b/app/src/main/res/values-szl/strings.xml
index 05e6beed94..40d80f086d 100644
--- a/app/src/main/res/values-szl/strings.xml
+++ b/app/src/main/res/values-szl/strings.xml
@@ -261,9 +261,11 @@
15 minut
Przidej uczestnika
+ Przidej kōnto
Niysztandardowo (niy idzie przipasować na telefōnie)
Kalyndorz
Kalyndorze do synchrōnizacyje
+ Przed stworzyniym zdarzynio musisz przidać do masziny kōnto z Kalyndorzym i nasztelować ôbrany kalyndorz za widzialny. Ôbier „Przidej kōnto” (jeźli to prawie było zrobiōno, to na kōniec synchrōnizacyje i sprōbuj zaś). Możesz tyż tyknōńć Pociep i dać pozōr, żeby aby jedyn kalyndorz bōł widzialny.
Miano zdarzynio
Dzisiej
Zdarzynie całodniowe
@@ -287,4 +289,4 @@
Informacyje
Napisz do gości
after start of event
-
+
\ No newline at end of file
diff --git a/app/src/main/res/values-th/strings.xml b/app/src/main/res/values-th/strings.xml
index 648e86f0e5..b3fb65856d 100644
--- a/app/src/main/res/values-th/strings.xml
+++ b/app/src/main/res/values-th/strings.xml
@@ -77,6 +77,8 @@
"ข้อมูลส่วนบุคคล"
"เพิ่มการแจ้งเตือน"
"ไม่มีปฏิทิน"
+ "ก่อนที่คุณจะสามารถเพิ่มกิจกรรมได้ คุณต้องเพิ่มบัญชีปฏิทินอย่างน้อยหนึ่งบัญชีลงในอุปกรณ์ของคุณและทำให้ปฏิทินหนึ่งปรากฏให้เห็น แตะ \"เพิ่มบัญชี\" เพื่อเพิ่มบัญชี (หากคุณเพิ่งเพิ่มบัญชี รอให้ซิงค์เสร็จก่อนและลองอีกครั้ง) หรือแตะ \"ยกเลิก\" และตรวจสอบว่ามีอย่างน้อยปฏิทินหนึ่งปรากฏให้เห็น"
+ "เพิ่มบัญชี"
"ปฏิทิน:"
"ผู้จัด:"
"เลือกสีของกิจกรรม"
@@ -236,4 +238,4 @@
สาธารณะ
ไม่มี
after start of event
-
+
\ No newline at end of file
diff --git a/app/src/main/res/values-tl/strings.xml b/app/src/main/res/values-tl/strings.xml
index fab7e4d452..6494229f55 100644
--- a/app/src/main/res/values-tl/strings.xml
+++ b/app/src/main/res/values-tl/strings.xml
@@ -77,6 +77,8 @@
"Privacy"
"Magdagdag ng paalala"
"Walang mga kalendaryo"
+ "Bago ka makapagdagdag ng isang kaganapan, dapat kang magdagdag ng hindi bababa sa isang Calendar account sa iyong device at gawing nakikita ang isang kalendaryo. Pindutin ang Magdagdag ng Account upang magdagdag ng isang account (kung kadaragdag mo lang ng isang account, hintayin itong matapos sa pag-sync at subukang muli). O pindutin ang Kanselahin at tiyaking nakikita ang hindi bababa sa isang kalendaryo."
+ "Magdagdag ng account"
"Kalendaryo:"
"Organizer:"
"Pumili ng kulay ng kaganapan"
@@ -236,4 +238,4 @@
Pampubliko
Wala
after start of event
-
+
\ No newline at end of file
diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml
index 7d863d87bc..920bb4d27f 100644
--- a/app/src/main/res/values-tr/strings.xml
+++ b/app/src/main/res/values-tr/strings.xml
@@ -76,6 +76,8 @@
"Gizlilik"
"Hatırlatıcı ekle"
"Takvim yok"
+ Bir etkinlik ekleyebilmek için öncelikle aygıtınıza en az bir Takvim hesabı eklemeli ve takvimi görünür yapmalısınız. Hesap eklemek için Hesap Ekle\'ye dokunun (hesabı yeni eklediyseniz, eşzamanlamayı bitirmesini bekleyin ve tekrar deneyin). Ya da İptal\'e dokunun ve en az bir takvimin görünür olduğundan emin olun.
+ "Hesap ekle"
"Takvim:"
"Düzenleyici:"
"Etkinlik rengi seçin"
@@ -345,11 +347,4 @@
Gerçek etkinlik renklerini kullan
Bilgi
Kopyala
- URL
- Etkinlik ekleyebilmeniz için aygıtınıza en az bir takvim eklemelisiniz
- Takvim ekle
- Bildirimleri yönet
- Kendi sorumluluğunuzda kullanın! Bildirimler artık çalışmayacak, widget güncellenmeyecek ve arka plan hizmetleri çökecektir. Ancak arka plan hizmetini etkinleştirmek isteyip istemediğiniz tekrar sorulmayacaktır.
- Takvimler
- Pil iyileştirmesini denetleme
\ No newline at end of file
diff --git a/app/src/main/res/values-ug/strings.xml b/app/src/main/res/values-ug/strings.xml
index 12a259f697..7b7f24d368 100644
--- a/app/src/main/res/values-ug/strings.xml
+++ b/app/src/main/res/values-ug/strings.xml
@@ -76,6 +76,8 @@
"شەخسىيەت"
"ئەسكەرتىش قوش"
"يىلنامە يوق"
+ "پائالىيەت قوشۇشتىن ئىلگىرى، سىز ئاز دېگەندە بىر يىلنامە ھېساباتى قوشۇپ، يىلنامەنى كۆرسىتىشىڭىز لازىم. ھېسابات قوشنى چەكسىڭىزلا ھېسابات قوشۇلىدۇ(ئەگەر بايىلا ھېسابات قوشقان بولسىڭىز، ھېساباتنىڭ قەدەمداشلىنىشىنى كۈتۈپ ئاندىن قايتا سىناڭ). ياكى ۋاز كەچنى چېكىپ، ئاز دېگەندە بىر يىلنامەنىڭ كۆرۈنۈشىگە كاپالەتلىك قىلىڭ."
+ "ھېسابات قوش"
"يىلنامە:"
"تەشكىللىگۈچى:"
"پائالىيەت رەڭگىنى تاللاڭ"
diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml
index 1eb16d0c19..3e0c36d7d5 100644
--- a/app/src/main/res/values-uk/strings.xml
+++ b/app/src/main/res/values-uk/strings.xml
@@ -28,10 +28,10 @@
- %d хвилин
- - 1 хв
- - %d хв
- - %d хв
- - %d хв
+ - 1 хвилина
+ - %d хвилини
+ - %d хвилин
+ - %d хвилин
- 1 година
@@ -85,6 +85,8 @@
Приватність
"Додати нагадування"
Немає календарів
+ Перш ніж додавати подію, потрібно додати в пристрій хоча б один обліковий запис служби Календар і зробити календар видимим. Щоб додати обліковий запис, торкніться опції «Додати обліковий запис» (якщо ви його щойно додали, зачекайте завершення синхронізації та повторіть спробу). Або торкніться опції \"Скасувати\" та переконайтеся, що принаймні один календар видимий.
+ "Додати обліковий запис"
"Календар:"
"Організатор:"
"Виберіть колір події"
@@ -178,7 +180,7 @@
Типовий час нагадування
Типовий час нагадування
"10"
- Використовувати домашній часовий пояс
+ Домашній часовий пояс
Показувати календарі й час події у домашньому часовому поясі під час подорожі
Домашній часовий пояс
"Показувати номер тижня"
@@ -361,7 +363,7 @@
Немає
- 1 тиждень
- - %d тижні
+ - %d тижня
- %d тижнів
- %d тижнів
@@ -370,11 +372,4 @@
Використовувати реальні кольори подій
Інформація
Дублікат
- URL-адреса
- Перш ніж додати подію, створіть на своєму пристрої принаймні один календар
- Додати календар
- Керувати сповіщеннями
- Не перевіряти оптимізацію акумулятора
- Використовуйте на свій страх і ризик! Сповіщення більше не працюватимуть, віджет більше не оновлюватиметься, а фонові служби не працюватимуть. Але ви надалі не отримуватимете запити на ввімкнення фонових служб.
- Календарі
\ No newline at end of file
diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml
index 08ac58691c..42d5814fdb 100644
--- a/app/src/main/res/values-vi/strings.xml
+++ b/app/src/main/res/values-vi/strings.xml
@@ -71,6 +71,8 @@
"Bảo mật"
"Thêm lời nhắc"
"Không có lịch"
+ "Trước khi có thể thêm sự kiện, bạn phải thêm ít nhất một tài khoản Lịch vào thiết bị của bạn và đặt lịch ở chế độ hiển thị. Chạm Thêm tài khoản để thêm tài khoản (nếu bạn vừa mới thêm tài khoản, hãy đợi tài khoản đó kết thúc đồng bộ hóa và thử lại). Hoặc chạm vào Hủy và đảm bảo ít nhất một lịch được hiển thị."
+ "Thêm tài khoản"
"Lịch:"
"Người tổ chức:"
"Chọn màu sự kiện"
@@ -332,8 +334,4 @@
after start of event
Sử dụng màu sự kiện thật
Thông tin
- URL
- Nhân đôi
- Thêm lịch
- Trước khi có thể thêm sự kiện, bạn phải thêm ít nhất một lịch vào thiết bị của mình
\ No newline at end of file
diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml
index c8efe3062d..5d0844e472 100644
--- a/app/src/main/res/values-zh-rCN/strings.xml
+++ b/app/src/main/res/values-zh-rCN/strings.xml
@@ -34,7 +34,7 @@
- %d 天
- - 第 %d 周
+ - Week %d
"刷新"
"显示日期"
@@ -71,6 +71,8 @@
"活动性质"
"添加提醒"
"无日历"
+ 在添加活动前,您必须添加至少一个日历帐户并使日历可见。轻触“添加账户”以添加账户(如果您刚刚添加过帐户,请等待其同步完成并重试)。或轻触“取消”并确认至少一个日历可见。
+ "添加帐户"
"日历:"
"组织者:"
"选择活动颜色"
@@ -219,11 +221,11 @@
私人
公开
询问暂停提醒时长
- 每次进行暂停操作时均询问暂停时长
+ 暂停提醒时询问持续时长
总是使用默认的暂停提醒时长
设定暂停提醒的重复时间
默认暂停提醒时长
- 暂停提醒时长默认值
+ 默认暂停提醒时长
手机里没有找到地图
跳转到…
回复是。
@@ -329,11 +331,4 @@
使用真实事件颜色
信息
复制
- URL
- 你必须添加至少一个日历到设备才能添加活动
- 添加日历
- 管理通知
- 日历
- 风险自负!通知将不再工作,小部件将不再更新,后台服务将崩溃。不过如果你想启用后台服务,程序将不再进行询问。
- 不检查电池优化
\ No newline at end of file
diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml
index 0d39cfba11..d8b84a76e5 100644
--- a/app/src/main/res/values-zh-rTW/strings.xml
+++ b/app/src/main/res/values-zh-rTW/strings.xml
@@ -40,7 +40,7 @@
- "%d 天"
- - 第 %d 週
+ - "第 %d 週"
"重新整理"
"顯示天"
@@ -77,6 +77,8 @@
"隱私權"
"新增提醒"
"無日曆"
+ "您必須在裝置上至少新增一個「日曆」帳戶,並將一個日曆設為顯示,才能新增活動。輕觸 [新增帳戶] 即可新增帳戶 (如果您剛剛新增帳戶,請稍候片刻,待帳戶同步處理完成後再試一次);或是輕觸 [取消],並確認至少將一個日曆設為顯示。"
+ "新增帳戶"
"日曆:"
"主辦人:"
"選擇活動顏色"
@@ -242,25 +244,4 @@
預設重響延遲
無
after start of event
- 分享
-
- - %d 週
-
- URL
- 顯示地點
- 暗色系
- 黑色系
- 預設檢視
- 亮色系
- 複製
- 前往…
- 顯示時間
- 檢視設定
- 上次使用的檢視
- 每週天數
- 使用實際的事件顏色
- 主題
- 顯示選項
- 系統預設
- 每週天數
\ No newline at end of file
diff --git a/app/src/main/res/values-zu/strings.xml b/app/src/main/res/values-zu/strings.xml
index 4c56ace80d..f78e8e0604 100644
--- a/app/src/main/res/values-zu/strings.xml
+++ b/app/src/main/res/values-zu/strings.xml
@@ -77,6 +77,8 @@
"Okwangasese"
"Faka isikhumbuzi"
"Awekho amakhalenda"
+ "Ngaphambili kokuthi ufake umcimbi, kufanele ufake noma i-akhawunti yekhalende eyodwa eivayisini yakho bese wenza ikhalenda ukuthi ibonakale. Thinta u-Yengeza i-Akhawunti ukuze wengeze i-akhawunti (uma usana kuyengez i-akhawunti, linda ukuthi iqede ukuvumelanisa bese uphinda uzame futhi). No uthinte u-Khnsela bese uqinisekis ukuthi kuba khona mhlampe eyodwa ikhalende eyodwa ebonakalayo."
+ "Faka i-akhawunti"
"Ikhalenda:"
"Umdidiyeli:"
"Khetha umbala womcimbi"
@@ -241,4 +243,4 @@
Okusesidlangalaleni
Lutho
after start of event
-
+
\ No newline at end of file
diff --git a/app/src/main/res/values/arrays.xml b/app/src/main/res/values/arrays.xml
index 9cd7d32d78..c132e6a036 100644
--- a/app/src/main/res/values/arrays.xml
+++ b/app/src/main/res/values/arrays.xml
@@ -88,7 +88,7 @@
- - "-2147483648"
+ - "-1"
- "0"
- "1"
- "5"
@@ -112,7 +112,6 @@
- - "-1"
- "5"
- "10"
- "15"
diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml
index c37403b0c9..edc22d0d06 100644
--- a/app/src/main/res/values/colors.xml
+++ b/app/src/main/res/values/colors.xml
@@ -102,7 +102,7 @@
#FF333333
#ff6bd697
- #FF555555
+ #FFDDDDDD
#000000
#ff000000
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 7b61a0ed93..b235b6a665 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -41,7 +41,6 @@
None
- None
- 1 minute
@@ -157,7 +156,8 @@
"View settings"
-
+ "View Tasks"
+ "View Events"
@@ -243,10 +243,10 @@
No calendars
- Before you can add an event, you must add at least one calendar to your device
+ Before you can add an event, you must add at least one Calendar account to your device and make a calendar visible. Touch Add Account to add an account (if you just added an account, wait for it to finish syncing and try again). Or touch Cancel and make sure at least one calendar is visible.
- Add calendar
+ Add account
@@ -323,6 +323,8 @@
Reminders
+ Reminders are not available for task
+
@@ -780,8 +782,6 @@
Calendar information
Color
Display events
-
- Manage notifications
Synchronize this calendar
Warning
Changing the color may be reverted when the calendar is synchronized again.\n\nIn DAVx⁵ \'Manage calendar colors\' can be disabled to prevent this.
@@ -807,13 +807,5 @@
after start of event
light
- Don\'t check battery optimization
- Use at your own risk! Notifications will no longer work, widget will no longer update and background services will crash. But you won\'t get asked again if you want to enable the background service.
-
-
- Calendars
- Do you want to discard changes?
- Discard
- Cancel
diff --git a/app/src/main/res/xml-v26/general_preferences.xml b/app/src/main/res/xml-v26/general_preferences.xml
index 18c0098f88..b11b02a8e4 100644
--- a/app/src/main/res/xml-v26/general_preferences.xml
+++ b/app/src/main/res/xml-v26/general_preferences.xml
@@ -143,12 +143,6 @@
app:entries="@array/preferences_skip_reminders_labels"
app:entryValues="@array/preferences_skip_reminders_values"
app:dialogTitle="@string/preferences_reminders_responded_dialog" />
-
-
diff --git a/app/src/main/res/xml/general_preferences.xml b/app/src/main/res/xml/general_preferences.xml
index 03e86f50dc..45f26f2c0a 100644
--- a/app/src/main/res/xml/general_preferences.xml
+++ b/app/src/main/res/xml/general_preferences.xml
@@ -158,12 +158,6 @@
app:entries="@array/preferences_skip_reminders_labels"
app:entryValues="@array/preferences_skip_reminders_values"
app:dialogTitle="@string/preferences_reminders_responded_dialog" />
-
-
diff --git a/build.gradle b/build.gradle
index 87945713ac..6661e9dd93 100644
--- a/build.gradle
+++ b/build.gradle
@@ -1,9 +1,9 @@
plugins {
- id 'com.android.application' version '8.3.1' apply false
- id 'com.android.library' version '8.3.1' apply false
- id 'org.jetbrains.kotlin.android' version '1.9.23' apply false
- id 'org.ec4j.editorconfig' version "0.1.0" apply false
- id "org.jetbrains.gradle.plugin.idea-ext" version "1.1.7" apply true
+ id 'com.android.application' version '7.2.1' apply false
+ id 'com.android.library' version '7.2.1' apply false
+ id 'org.jetbrains.kotlin.android' version '1.7.0' apply false
+ id 'org.ec4j.editorconfig' version "0.0.3" apply false
+ id "org.jetbrains.gradle.plugin.idea-ext" version "1.1.5" apply true
}
// External project configuration start
@@ -24,7 +24,7 @@ configure(external_projects) {
}
}
-tasks.register('aarGen') {
+task aarGen {
description "Generates AAR from the external projects for Etar-Calendar"
def aarTasks = [
':external:calendar:copyAAR',
@@ -37,12 +37,11 @@ tasks.register('aarGen') {
idea.project.settings {
taskTriggers {
- afterSync tasks.named('aarGen')
+ afterSync tasks.getByName('aarGen')
}
}
// External project configuration end
-tasks.register('clean', Delete) {
+task clean(type: Delete) {
delete rootProject.buildDir
- delete 'app/libs'
}
diff --git a/external/calendar b/external/calendar
index 04fe66e252..d47bcc32e0 160000
--- a/external/calendar
+++ b/external/calendar
@@ -1 +1 @@
-Subproject commit 04fe66e252f9c6cf569dfb462004dd99d6e68b00
+Subproject commit d47bcc32e0ed9b6378cebcfe531ee9a8fdcc8a21
diff --git a/external/chips b/external/chips
index 61be1f3921..1031e808ad 160000
--- a/external/chips
+++ b/external/chips
@@ -1 +1 @@
-Subproject commit 61be1f3921fa43df43aaf64526a61ad85bec8689
+Subproject commit 1031e808ada8678fd8a0b2a5473df82f9bfa2f56
diff --git a/external/colorpicker b/external/colorpicker
index 404c08afb3..f89d7747e2 160000
--- a/external/colorpicker
+++ b/external/colorpicker
@@ -1 +1 @@
-Subproject commit 404c08afb3b76681e3454942b71237ca76786613
+Subproject commit f89d7747e2ccdfde48f8510aa956bbee704cf408
diff --git a/external/configuration/common.gradle b/external/configuration/common.gradle
index 5ad0b3efee..be83e3e253 100644
--- a/external/configuration/common.gradle
+++ b/external/configuration/common.gradle
@@ -1,16 +1,11 @@
apply plugin: 'com.android.library'
android {
- compileSdk 33
+ compileSdk 31
defaultConfig {
minSdk 21
- targetSdk 33
- }
-
- buildFeatures {
- renderScript true
- aidl true
+ targetSdk 31
}
sourceSets {
@@ -35,7 +30,6 @@ task cleanAndBuildAAR(type: GradleBuild) {
task copyAAR(type: Copy) {
dependsOn 'cleanAndBuildAAR'
- dependsOn 'bundleReleaseAar'
from 'build/outputs/aar/'
into '../../app/libs/'
include '*-release.aar'
diff --git a/external/ex b/external/ex
index c0270ea348..e39105207b 160000
--- a/external/ex
+++ b/external/ex
@@ -1 +1 @@
-Subproject commit c0270ea3481054ae6543a5f3ac81cebfeac67dc1
+Subproject commit e39105207b05b3ce714661133dac172836ce66a7
diff --git a/external/timezonepicker b/external/timezonepicker
index 03e2abd0d5..eb35cd9ac7 160000
--- a/external/timezonepicker
+++ b/external/timezonepicker
@@ -1 +1 @@
-Subproject commit 03e2abd0d58263e26c3e5a26ed8ff76411b65960
+Subproject commit eb35cd9ac7ec11e5d3970d2128607cf6a4479a85
diff --git a/gradle.properties b/gradle.properties
index 801fd4baa7..342a08a0a6 100755
--- a/gradle.properties
+++ b/gradle.properties
@@ -23,5 +23,3 @@ kotlin.code.style=official
# resources declared in the library itself and none from the library's dependencies,
# thereby reducing the size of the R class for that library
android.nonTransitiveRClass=false
-android.defaults.buildfeatures.buildconfig=true
-android.nonFinalResIds=false
diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar
index e6441136f3..e708b1c023 100644
Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index 3daa4a270b..252a499602 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -1,9 +1,6 @@
-#Tue Apr 02 13:25:03 IST 2024
+#Tue Nov 16 03:59:46 GMT 2021
distributionBase=GRADLE_USER_HOME
+distributionUrl=https\://services.gradle.org/distributions/gradle-7.4.1-bin.zip
distributionPath=wrapper/dists
-distributionSha256Sum=544c35d6bd849ae8a5ed0bcea39ba677dc40f49df7d1835561582da2009b961d
-distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip
-networkTimeout=10000
-validateDistributionUrl=true
-zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
+zipStoreBase=GRADLE_USER_HOME
diff --git a/gradlew b/gradlew
index 1aa94a4269..4f906e0c81 100755
--- a/gradlew
+++ b/gradlew
@@ -1,7 +1,7 @@
-#!/bin/sh
+#!/usr/bin/env sh
#
-# Copyright © 2015-2021 the original authors.
+# Copyright 2015 the original author or authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -17,99 +17,67 @@
#
##############################################################################
-#
-# Gradle start up script for POSIX generated by Gradle.
-#
-# Important for running:
-#
-# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is
-# noncompliant, but you have some other compliant shell such as ksh or
-# bash, then to run this script, type that shell name before the whole
-# command line, like:
-#
-# ksh Gradle
-#
-# Busybox and similar reduced shells will NOT work, because this script
-# requires all of these POSIX shell features:
-# * functions;
-# * expansions «$var», «${var}», «${var:-default}», «${var+SET}»,
-# «${var#prefix}», «${var%suffix}», and «$( cmd )»;
-# * compound commands having a testable exit status, especially «case»;
-# * various built-in commands including «command», «set», and «ulimit».
-#
-# Important for patching:
-#
-# (2) This script targets any POSIX shell, so it avoids extensions provided
-# by Bash, Ksh, etc; in particular arrays are avoided.
-#
-# The "traditional" practice of packing multiple parameters into a
-# space-separated string is a well documented source of bugs and security
-# problems, so this is (mostly) avoided, by progressively accumulating
-# options in "$@", and eventually passing that to Java.
-#
-# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS,
-# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly;
-# see the in-line comments for details.
-#
-# There are tweaks for specific operating systems such as AIX, CygWin,
-# Darwin, MinGW, and NonStop.
-#
-# (3) This script is generated from the Groovy template
-# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
-# within the Gradle project.
-#
-# You can find Gradle at https://github.com/gradle/gradle/.
-#
+##
+## Gradle start up script for UN*X
+##
##############################################################################
# Attempt to set APP_HOME
-
# Resolve links: $0 may be a link
-app_path=$0
-
-# Need this for daisy-chained symlinks.
-while
- APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path
- [ -h "$app_path" ]
-do
- ls=$( ls -ld "$app_path" )
- link=${ls#*' -> '}
- case $link in #(
- /*) app_path=$link ;; #(
- *) app_path=$APP_HOME$link ;;
- esac
+PRG="$0"
+# Need this for relative symlinks.
+while [ -h "$PRG" ] ; do
+ ls=`ls -ld "$PRG"`
+ link=`expr "$ls" : '.*-> \(.*\)$'`
+ if expr "$link" : '/.*' > /dev/null; then
+ PRG="$link"
+ else
+ PRG=`dirname "$PRG"`"/$link"
+ fi
done
+SAVED="`pwd`"
+cd "`dirname \"$PRG\"`/" >/dev/null
+APP_HOME="`pwd -P`"
+cd "$SAVED" >/dev/null
-# This is normally unused
-# shellcheck disable=SC2034
-APP_BASE_NAME=${0##*/}
-# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036)
-APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit
+APP_NAME="Gradle"
+APP_BASE_NAME=`basename "$0"`
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
# Use the maximum available, or set MAX_FD != -1 to use that value.
-MAX_FD=maximum
+MAX_FD="maximum"
warn () {
echo "$*"
-} >&2
+}
die () {
echo
echo "$*"
echo
exit 1
-} >&2
+}
# OS specific support (must be 'true' or 'false').
cygwin=false
msys=false
darwin=false
nonstop=false
-case "$( uname )" in #(
- CYGWIN* ) cygwin=true ;; #(
- Darwin* ) darwin=true ;; #(
- MSYS* | MINGW* ) msys=true ;; #(
- NONSTOP* ) nonstop=true ;;
+case "`uname`" in
+ CYGWIN* )
+ cygwin=true
+ ;;
+ Darwin* )
+ darwin=true
+ ;;
+ MINGW* )
+ msys=true
+ ;;
+ NONSTOP* )
+ nonstop=true
+ ;;
esac
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
@@ -119,9 +87,9 @@ CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
if [ -n "$JAVA_HOME" ] ; then
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
# IBM's JDK on AIX uses strange locations for the executables
- JAVACMD=$JAVA_HOME/jre/sh/java
+ JAVACMD="$JAVA_HOME/jre/sh/java"
else
- JAVACMD=$JAVA_HOME/bin/java
+ JAVACMD="$JAVA_HOME/bin/java"
fi
if [ ! -x "$JAVACMD" ] ; then
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
@@ -130,120 +98,88 @@ Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
else
- JAVACMD=java
- if ! command -v java >/dev/null 2>&1
- then
- die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+ JAVACMD="java"
+ which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
- fi
fi
# Increase the maximum file descriptors if we can.
-if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
- case $MAX_FD in #(
- max*)
- # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked.
- # shellcheck disable=SC2039,SC3045
- MAX_FD=$( ulimit -H -n ) ||
- warn "Could not query maximum file descriptor limit"
- esac
- case $MAX_FD in #(
- '' | soft) :;; #(
- *)
- # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked.
- # shellcheck disable=SC2039,SC3045
- ulimit -n "$MAX_FD" ||
- warn "Could not set maximum file descriptor limit to $MAX_FD"
- esac
+if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
+ MAX_FD_LIMIT=`ulimit -H -n`
+ if [ $? -eq 0 ] ; then
+ if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
+ MAX_FD="$MAX_FD_LIMIT"
+ fi
+ ulimit -n $MAX_FD
+ if [ $? -ne 0 ] ; then
+ warn "Could not set maximum file descriptor limit: $MAX_FD"
+ fi
+ else
+ warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
+ fi
fi
-# Collect all arguments for the java command, stacking in reverse order:
-# * args from the command line
-# * the main class name
-# * -classpath
-# * -D...appname settings
-# * --module-path (only if needed)
-# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables.
+# For Darwin, add options to specify how the application appears in the dock
+if $darwin; then
+ GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
+fi
# For Cygwin or MSYS, switch paths to Windows format before running java
-if "$cygwin" || "$msys" ; then
- APP_HOME=$( cygpath --path --mixed "$APP_HOME" )
- CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" )
-
- JAVACMD=$( cygpath --unix "$JAVACMD" )
-
+if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
+ APP_HOME=`cygpath --path --mixed "$APP_HOME"`
+ CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
+
+ JAVACMD=`cygpath --unix "$JAVACMD"`
+
+ # We build the pattern for arguments to be converted via cygpath
+ ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
+ SEP=""
+ for dir in $ROOTDIRSRAW ; do
+ ROOTDIRS="$ROOTDIRS$SEP$dir"
+ SEP="|"
+ done
+ OURCYGPATTERN="(^($ROOTDIRS))"
+ # Add a user-defined pattern to the cygpath arguments
+ if [ "$GRADLE_CYGPATTERN" != "" ] ; then
+ OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
+ fi
# Now convert the arguments - kludge to limit ourselves to /bin/sh
- for arg do
- if
- case $arg in #(
- -*) false ;; # don't mess with options #(
- /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath
- [ -e "$t" ] ;; #(
- *) false ;;
- esac
- then
- arg=$( cygpath --path --ignore --mixed "$arg" )
+ i=0
+ for arg in "$@" ; do
+ CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
+ CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
+
+ if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
+ eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
+ else
+ eval `echo args$i`="\"$arg\""
fi
- # Roll the args list around exactly as many times as the number of
- # args, so each arg winds up back in the position where it started, but
- # possibly modified.
- #
- # NB: a `for` loop captures its iteration list before it begins, so
- # changing the positional parameters here affects neither the number of
- # iterations, nor the values presented in `arg`.
- shift # remove old arg
- set -- "$@" "$arg" # push replacement arg
+ i=`expr $i + 1`
done
+ case $i in
+ 0) set -- ;;
+ 1) set -- "$args0" ;;
+ 2) set -- "$args0" "$args1" ;;
+ 3) set -- "$args0" "$args1" "$args2" ;;
+ 4) set -- "$args0" "$args1" "$args2" "$args3" ;;
+ 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
+ 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
+ 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
+ 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
+ 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
+ esac
fi
+# Escape application args
+save () {
+ for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
+ echo " "
+}
+APP_ARGS=`save "$@"`
-# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
-DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
-
-# Collect all arguments for the java command:
-# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments,
-# and any embedded shellness will be escaped.
-# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be
-# treated as '${Hostname}' itself on the command line.
-
-set -- \
- "-Dorg.gradle.appname=$APP_BASE_NAME" \
- -classpath "$CLASSPATH" \
- org.gradle.wrapper.GradleWrapperMain \
- "$@"
-
-# Stop when "xargs" is not available.
-if ! command -v xargs >/dev/null 2>&1
-then
- die "xargs is not available"
-fi
-
-# Use "xargs" to parse quoted args.
-#
-# With -n1 it outputs one arg per line, with the quotes and backslashes removed.
-#
-# In Bash we could simply go:
-#
-# readarray ARGS < <( xargs -n1 <<<"$var" ) &&
-# set -- "${ARGS[@]}" "$@"
-#
-# but POSIX shell has neither arrays nor command substitution, so instead we
-# post-process each arg (as a line of input to sed) to backslash-escape any
-# character that might be a shell metacharacter, then use eval to reverse
-# that process (while maintaining the separation between arguments), and wrap
-# the whole thing up as a single "set" statement.
-#
-# This will of course break if any of these variables contains a newline or
-# an unmatched quote.
-#
-
-eval "set -- $(
- printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" |
- xargs -n1 |
- sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' |
- tr '\n' ' '
- )" '"$@"'
+# Collect all arguments for the java command, following the shell quoting and substitution rules
+eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
exec "$JAVACMD" "$@"
diff --git a/gradlew.bat b/gradlew.bat
index 7101f8e467..ac1b06f938 100755
--- a/gradlew.bat
+++ b/gradlew.bat
@@ -14,7 +14,7 @@
@rem limitations under the License.
@rem
-@if "%DEBUG%"=="" @echo off
+@if "%DEBUG%" == "" @echo off
@rem ##########################################################################
@rem
@rem Gradle startup script for Windows
@@ -25,8 +25,7 @@
if "%OS%"=="Windows_NT" setlocal
set DIRNAME=%~dp0
-if "%DIRNAME%"=="" set DIRNAME=.
-@rem This is normally unused
+if "%DIRNAME%" == "" set DIRNAME=.
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%
@@ -41,13 +40,13 @@ if defined JAVA_HOME goto findJavaFromJavaHome
set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
-if %ERRORLEVEL% equ 0 goto execute
+if "%ERRORLEVEL%" == "0" goto execute
-echo. 1>&2
-echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2
-echo. 1>&2
-echo Please set the JAVA_HOME variable in your environment to match the 1>&2
-echo location of your Java installation. 1>&2
+echo.
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
goto fail
@@ -57,11 +56,11 @@ set JAVA_EXE=%JAVA_HOME%/bin/java.exe
if exist "%JAVA_EXE%" goto execute
-echo. 1>&2
-echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2
-echo. 1>&2
-echo Please set the JAVA_HOME variable in your environment to match the 1>&2
-echo location of your Java installation. 1>&2
+echo.
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
goto fail
@@ -76,15 +75,13 @@ set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
:end
@rem End local scope for the variables with windows NT shell
-if %ERRORLEVEL% equ 0 goto mainEnd
+if "%ERRORLEVEL%"=="0" goto mainEnd
:fail
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
rem the _cmd.exe /c_ return code!
-set EXIT_CODE=%ERRORLEVEL%
-if %EXIT_CODE% equ 0 set EXIT_CODE=1
-if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE%
-exit /b %EXIT_CODE%
+if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
+exit /b 1
:mainEnd
if "%OS%"=="Windows_NT" endlocal
diff --git a/metadata/bg/changelogs/10.txt b/metadata/bg/changelogs/10.txt
deleted file mode 100644
index ec3f753369..0000000000
--- a/metadata/bg/changelogs/10.txt
+++ /dev/null
@@ -1 +0,0 @@
-- Добавяне на тъмна тема.
diff --git a/metadata/bg/title.txt b/metadata/bg/title.txt
deleted file mode 100644
index f006515085..0000000000
--- a/metadata/bg/title.txt
+++ /dev/null
@@ -1 +0,0 @@
-Etar - OpenSource Calendar
diff --git a/metadata/cs/changelogs/34.txt b/metadata/cs/changelogs/34.txt
deleted file mode 100644
index 263483ec7b..0000000000
--- a/metadata/cs/changelogs/34.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-- Opravy chyb
-- Nové překlady
diff --git a/metadata/cs/changelogs/35.txt b/metadata/cs/changelogs/35.txt
deleted file mode 100644
index 07cc630354..0000000000
--- a/metadata/cs/changelogs/35.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-- Přidána položka url
-- Opravy chyb
-- Nové překlady
diff --git a/metadata/cs/changelogs/36.txt b/metadata/cs/changelogs/36.txt
deleted file mode 100644
index 263483ec7b..0000000000
--- a/metadata/cs/changelogs/36.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-- Opravy chyb
-- Nové překlady
diff --git a/metadata/de-DE/changelogs/35.txt b/metadata/de-DE/changelogs/35.txt
deleted file mode 100644
index 07f97d3870..0000000000
--- a/metadata/de-DE/changelogs/35.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-- Url Feld hinzugefügt
-- Bugfixes
-- Neue Übersetzungen
diff --git a/metadata/de-DE/changelogs/36.txt b/metadata/de-DE/changelogs/36.txt
deleted file mode 100644
index 9bcf703649..0000000000
--- a/metadata/de-DE/changelogs/36.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-- Fehlerbehebungen
-- Neue Übersetzungen
diff --git a/metadata/de-DE/changelogs/37.txt b/metadata/de-DE/changelogs/37.txt
deleted file mode 100644
index 5da206d145..0000000000
--- a/metadata/de-DE/changelogs/37.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-- Ab Android 13 lässt sich die App Sprache wählen
-- Monatsansicht: Geste Rechts/Links wischen hinzugefügt
-- Fehlerbehebungen
-- Neue Übersetzungen
diff --git a/metadata/de-DE/changelogs/38.txt b/metadata/de-DE/changelogs/38.txt
deleted file mode 100644
index bc1cb2e1ee..0000000000
--- a/metadata/de-DE/changelogs/38.txt
+++ /dev/null
@@ -1 +0,0 @@
-- Absturz bei wiederkehrenden Terminen behoben
diff --git a/metadata/de-DE/changelogs/39.txt b/metadata/de-DE/changelogs/39.txt
deleted file mode 100644
index 0868d74cc3..0000000000
--- a/metadata/de-DE/changelogs/39.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-- Korrektur eines Absturzes in der Monats- und Wochenansicht aufgrund einer ungültigen rrule
-- Fehlerbehebungen
diff --git a/metadata/de-DE/changelogs/40.txt b/metadata/de-DE/changelogs/40.txt
deleted file mode 100644
index 17a96531e0..0000000000
--- a/metadata/de-DE/changelogs/40.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-- Hoffentlich final den Absturz in der Monats- und Wochenansicht aufgrund einer ungültigen rrule behoben
-- Fehlerbehebungen
diff --git a/metadata/de-DE/changelogs/41.txt b/metadata/de-DE/changelogs/41.txt
deleted file mode 100644
index ac5472bda2..0000000000
--- a/metadata/de-DE/changelogs/41.txt
+++ /dev/null
@@ -1 +0,0 @@
-- Buildfehler bei F-Droid behoben
diff --git a/metadata/de-DE/changelogs/42.txt b/metadata/de-DE/changelogs/42.txt
deleted file mode 100644
index bdb7b761b9..0000000000
--- a/metadata/de-DE/changelogs/42.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-- Dialog "Termin erstellen" nicht schließen, wenn das Telefon gedreht wird
-- Kalenderbenachrichtigungen pro Kalender
-- Einstellung hinzugefügt: Batterieoptimierung nicht prüfen
diff --git a/metadata/de-DE/changelogs/43.txt b/metadata/de-DE/changelogs/43.txt
deleted file mode 100644
index ee01ce7b60..0000000000
--- a/metadata/de-DE/changelogs/43.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-- Bestätigungsdialog beim Verlassen während der Terminerstellung
-- Option "Keine Schlummerfunktion" hinzufügt
-- Verbessertes Wischen nach links/rechts und nach oben/unten in der Monatsansicht
-- Kleinere Fehlerbehebungen
diff --git a/metadata/en-US/changelogs/35.txt b/metadata/en-US/changelogs/35.txt
deleted file mode 100644
index cf5e77442a..0000000000
--- a/metadata/en-US/changelogs/35.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-- Add url field
-- Bugfixes
-- New translations
diff --git a/metadata/en-US/changelogs/36.txt b/metadata/en-US/changelogs/36.txt
deleted file mode 100644
index 2c7641c6f6..0000000000
--- a/metadata/en-US/changelogs/36.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-- Bugfixes
-- New translations
diff --git a/metadata/en-US/changelogs/37.txt b/metadata/en-US/changelogs/37.txt
deleted file mode 100644
index 0706c6f6a1..0000000000
--- a/metadata/en-US/changelogs/37.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-- Add per-app language support(android 13+)
-- Add left/right swipe to month view
-- Bugfixes
-- New translations
diff --git a/metadata/en-US/changelogs/38.txt b/metadata/en-US/changelogs/38.txt
deleted file mode 100644
index 0e6d4351ac..0000000000
--- a/metadata/en-US/changelogs/38.txt
+++ /dev/null
@@ -1 +0,0 @@
-- Fix crash on recurring events
diff --git a/metadata/en-US/changelogs/39.txt b/metadata/en-US/changelogs/39.txt
deleted file mode 100644
index a8aa2b1bda..0000000000
--- a/metadata/en-US/changelogs/39.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-- Fix crash on month and week view due to invalid rrule
-- Bugfixes
diff --git a/metadata/en-US/changelogs/40.txt b/metadata/en-US/changelogs/40.txt
deleted file mode 100644
index b7fa1eb8de..0000000000
--- a/metadata/en-US/changelogs/40.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-- Hopefully, finally, fixed a crash on month and week view due to invalid rrule
-- Bugfixes
diff --git a/metadata/en-US/changelogs/41.txt b/metadata/en-US/changelogs/41.txt
deleted file mode 100644
index 0540428ceb..0000000000
--- a/metadata/en-US/changelogs/41.txt
+++ /dev/null
@@ -1 +0,0 @@
-- Fix F-Droid compile error
diff --git a/metadata/en-US/changelogs/42.txt b/metadata/en-US/changelogs/42.txt
deleted file mode 100644
index 786726cb23..0000000000
--- a/metadata/en-US/changelogs/42.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-- Don't close edit event page when phone is rotated
-- Calendar notifications per calendar
-- Add preference: Don't check battery optimization
diff --git a/metadata/en-US/changelogs/43.txt b/metadata/en-US/changelogs/43.txt
deleted file mode 100644
index 7b76578473..0000000000
--- a/metadata/en-US/changelogs/43.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-- Add confirmation dialog on event discard
-- Add no snooze option
-- Improve left/right swipe and up/down swipe in month view
-- Small bugfixes
diff --git a/metadata/eo/short_description.txt b/metadata/eo/short_description.txt
deleted file mode 100644
index bf28cb043e..0000000000
--- a/metadata/eo/short_description.txt
+++ /dev/null
@@ -1 +0,0 @@
-Etar estas kalendaro malfermita-fonta fasonite per Material, por ĉiu!
diff --git a/metadata/eo/title.txt b/metadata/eo/title.txt
deleted file mode 100644
index c67869bd2a..0000000000
--- a/metadata/eo/title.txt
+++ /dev/null
@@ -1 +0,0 @@
-Etar - Kalendaro malfermafonta
diff --git a/metadata/es-ES/changelogs/34.txt b/metadata/es-ES/changelogs/34.txt
deleted file mode 100644
index 0854787045..0000000000
--- a/metadata/es-ES/changelogs/34.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-- Corrección de errores
-- Nuevas traducciones
diff --git a/metadata/es-ES/changelogs/35.txt b/metadata/es-ES/changelogs/35.txt
deleted file mode 100644
index c94b35360d..0000000000
--- a/metadata/es-ES/changelogs/35.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-- Añadido un campo para la url
-- Corrección de errores
-- Nuevas traducciones
diff --git a/metadata/es-ES/changelogs/36.txt b/metadata/es-ES/changelogs/36.txt
deleted file mode 100644
index 0854787045..0000000000
--- a/metadata/es-ES/changelogs/36.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-- Corrección de errores
-- Nuevas traducciones
diff --git a/metadata/es-ES/changelogs/37.txt b/metadata/es-ES/changelogs/37.txt
deleted file mode 100644
index 14183696e5..0000000000
--- a/metadata/es-ES/changelogs/37.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-- Añadir soporte de idioma por aplicación (android 13+)
-- Añadir deslizamiento izquierda/derecha a la vista del mes
-- Corrección de errores
-- Nuevas traducciones
diff --git a/metadata/es-ES/changelogs/38.txt b/metadata/es-ES/changelogs/38.txt
deleted file mode 100644
index 51a5729e06..0000000000
--- a/metadata/es-ES/changelogs/38.txt
+++ /dev/null
@@ -1 +0,0 @@
-- Corrección de los fallos en los eventos recurrentes
diff --git a/metadata/es-ES/changelogs/39.txt b/metadata/es-ES/changelogs/39.txt
deleted file mode 100644
index 4d2bf06cec..0000000000
--- a/metadata/es-ES/changelogs/39.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-- Se corrigió el fallo en la vista de mes y semana debido a una regla no válida
-- Corrección de errores
diff --git a/metadata/es-ES/changelogs/40.txt b/metadata/es-ES/changelogs/40.txt
deleted file mode 100644
index c515159567..0000000000
--- a/metadata/es-ES/changelogs/40.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-- Con suerte, finalmente se solucionó un problema en la vista de mes y semana debido a una regla no válida
-- Corrección de errores
diff --git a/metadata/es-ES/changelogs/41.txt b/metadata/es-ES/changelogs/41.txt
deleted file mode 100644
index f7b281a1d4..0000000000
--- a/metadata/es-ES/changelogs/41.txt
+++ /dev/null
@@ -1 +0,0 @@
-- Corregir el error de compilación en F-Droid
diff --git a/metadata/es-ES/changelogs/42.txt b/metadata/es-ES/changelogs/42.txt
deleted file mode 100644
index 143f2adb82..0000000000
--- a/metadata/es-ES/changelogs/42.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-- No se cierre la página de edición del evento cuando el teléfono está girado
-- Notificaciones calendario por calendario
-- Añadir preferencia: No compruebe la optimización de la batería
diff --git a/metadata/fr-FR/changelogs/24.txt b/metadata/fr-FR/changelogs/24.txt
index dfdc37a7d7..81e6e149b0 100644
--- a/metadata/fr-FR/changelogs/24.txt
+++ b/metadata/fr-FR/changelogs/24.txt
@@ -1,7 +1,7 @@
-– Réduction de la taille de la fonte pour la vue de la semaine
-– Activation des suggestions de recherches récentes
-– Correction de l’exportation vers une carte SD
-– Barre sur les titres des évènements annulés
-– Utilisation du paramètre du système de thème sur Android 10
-– Nouvelles traductions
-– Corrections de bogues
+– Réduction de la taille de la fonte pour la vue de la semaine.
+– Activation des suggestions de recherches récentes.
+– Correction de l’exportation vers une carte SD.
+– Barre sur les titres des évènements annulés.
+– Utilisation du paramètre du système de thème sur Android 10.
+– Nouvelles traductions.
+– Corrections de bogues.
diff --git a/metadata/fr-FR/changelogs/25.txt b/metadata/fr-FR/changelogs/25.txt
index 53f34c33fe..49520d06d1 100644
--- a/metadata/fr-FR/changelogs/25.txt
+++ b/metadata/fr-FR/changelogs/25.txt
@@ -1,4 +1,4 @@
-– Récupération de la base de données des fuseaux horaires
-– Icône de l’application en SVG
-– Reprise et réactivation du widget
-– Nouvelles traductions
+– Récupération de la base de données des fuseaux horaires.
+– Icône de l’application en SVG.
+– Reprise et réactivation du widget.
+– Nouvelles traductions.
diff --git a/metadata/fr-FR/changelogs/26.txt b/metadata/fr-FR/changelogs/26.txt
index d7ddf5c71f..b8eb80697f 100644
--- a/metadata/fr-FR/changelogs/26.txt
+++ b/metadata/fr-FR/changelogs/26.txt
@@ -1,4 +1,4 @@
-– Reprise de la mise en page de l’édition des évènements
-– Abandon de la prise en charge d’Android 4.4
-– Corrections de bogues généraux
-– Nouvelles traductions
+– Reprise de la mise en page de l’édition des évènements.
+– Abandon de la prise en charge d’Android 4.4.
+– Corrections de bogues généraux.
+– Nouvelles traductions.
diff --git a/metadata/fr-FR/changelogs/27.txt b/metadata/fr-FR/changelogs/27.txt
index 48dec0c9ed..54c696068d 100644
--- a/metadata/fr-FR/changelogs/27.txt
+++ b/metadata/fr-FR/changelogs/27.txt
@@ -1,2 +1,2 @@
-– Corrections de bogues généraux
-– Nouvelles traductions
+– Corrections de bogues généraux.
+– Nouvelles traductions.
diff --git a/metadata/fr-FR/changelogs/28.txt b/metadata/fr-FR/changelogs/28.txt
index 48dec0c9ed..54c696068d 100644
--- a/metadata/fr-FR/changelogs/28.txt
+++ b/metadata/fr-FR/changelogs/28.txt
@@ -1,2 +1,2 @@
-– Corrections de bogues généraux
-– Nouvelles traductions
+– Corrections de bogues généraux.
+– Nouvelles traductions.
diff --git a/metadata/fr-FR/changelogs/29.txt b/metadata/fr-FR/changelogs/29.txt
index b279d918ac..8b4e616cc7 100644
--- a/metadata/fr-FR/changelogs/29.txt
+++ b/metadata/fr-FR/changelogs/29.txt
@@ -1,5 +1,5 @@
-– Prise en charge d’Android 12
-– Prise en charge du design Material You
-– Suppression de la connexion au service Android pour la sauvegarde de la base de données (cassée dans la plupart des versions Android)
-– Corrections de bogues généraux
-– Nouvelles traductions
+– Prise en charge d’Android 12.
+– Prise en charge du design Material You.
+– Suppression de la connexion au service Android pour la sauvegarde de la base de données (cassée dans la plupart des versions Android).
+– Corrections de bogues généraux.
+– Nouvelles traductions.
diff --git a/metadata/fr-FR/changelogs/30.txt b/metadata/fr-FR/changelogs/30.txt
index ff0dc4cb60..cdbfb6dbf6 100644
--- a/metadata/fr-FR/changelogs/30.txt
+++ b/metadata/fr-FR/changelogs/30.txt
@@ -1,2 +1,2 @@
-– Correction des notifications sur Android 12
-– Ajout de DecSync et de Birthday Adapter aux applis connues, sans plantage
+– Correction des notifications sur Android 12.
+– Ajout de DecSync et de Birthday Adapter aux apps connues, sans plantage.
diff --git a/metadata/fr-FR/changelogs/31.txt b/metadata/fr-FR/changelogs/31.txt
index 56d8b190e4..71b7d8268a 100644
--- a/metadata/fr-FR/changelogs/31.txt
+++ b/metadata/fr-FR/changelogs/31.txt
@@ -1,2 +1,2 @@
-– Correction du plantage et des notifications sur Android 12
-– Correction du type de média des évènements partagés
+– Correction du plantage et des notifications sur Android 12.
+– Correction du type de média des évènements partagés.
diff --git a/metadata/fr-FR/changelogs/34.txt b/metadata/fr-FR/changelogs/34.txt
deleted file mode 100644
index f3af2d17a1..0000000000
--- a/metadata/fr-FR/changelogs/34.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-– Corrections
-– Nouvelles traductions
diff --git a/metadata/fr-FR/changelogs/35.txt b/metadata/fr-FR/changelogs/35.txt
deleted file mode 100644
index 8b052c6054..0000000000
--- a/metadata/fr-FR/changelogs/35.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-- Champs URL ajouté
-- Correction de bugs
--Nouvelles traductions
diff --git a/metadata/fr-FR/changelogs/36.txt b/metadata/fr-FR/changelogs/36.txt
deleted file mode 100644
index d4832b031a..0000000000
--- a/metadata/fr-FR/changelogs/36.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-- Correction de bugs
-- Nouvelles traductions
diff --git a/metadata/fr-FR/changelogs/37.txt b/metadata/fr-FR/changelogs/37.txt
deleted file mode 100644
index cfebd94d58..0000000000
--- a/metadata/fr-FR/changelogs/37.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-- Ajout du choix de langue par application (android 13)
-- Ajout du balayage gauche/droite dans la vue mois
-- Correction de bugs
-- Nouvelles traductions
diff --git a/metadata/fr-FR/changelogs/38.txt b/metadata/fr-FR/changelogs/38.txt
deleted file mode 100644
index 68b160a77d..0000000000
--- a/metadata/fr-FR/changelogs/38.txt
+++ /dev/null
@@ -1 +0,0 @@
-- Correction d'un crash concernant les évènements récurrents
diff --git a/metadata/he/changelogs/35.txt b/metadata/he/changelogs/35.txt
deleted file mode 100644
index e92626f984..0000000000
--- a/metadata/he/changelogs/35.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-- נוסף שדה כתובת
-- תיקוני תקלות
-- תרגומים חדשים
diff --git a/metadata/he/changelogs/36.txt b/metadata/he/changelogs/36.txt
deleted file mode 100644
index 5495327492..0000000000
--- a/metadata/he/changelogs/36.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-- תיקוני תקלות
-- תרגומים חדשים
diff --git a/metadata/he/changelogs/9.txt b/metadata/he/changelogs/9.txt
deleted file mode 100644
index c333606b3d..0000000000
--- a/metadata/he/changelogs/9.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-- שיפורים למנשק המשתמש.
-- התרגום לשוודית עודכן.
-- תוקנו תקלות.
diff --git a/metadata/hr/changelogs/22.txt b/metadata/hr/changelogs/22.txt
deleted file mode 100644
index e21cd9e3ec..0000000000
--- a/metadata/hr/changelogs/22.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-- Dodan je lokalni kalendar.
-- Dodan je prečac za novi događaj.
-- Novi dizajn postavki.
-- Novi birač datuma i vremena.
-- Licenca je promijenjena na GPLv3.
-- Ispravke grešaka.
-- Novi prijevodi.
diff --git a/metadata/it-IT/changelogs/10.txt b/metadata/it-IT/changelogs/10.txt
deleted file mode 100644
index 1ee306b83c..0000000000
--- a/metadata/it-IT/changelogs/10.txt
+++ /dev/null
@@ -1 +0,0 @@
-- Aggiunto tema scuro.
diff --git a/metadata/it-IT/changelogs/11.txt b/metadata/it-IT/changelogs/11.txt
deleted file mode 100644
index a62c8ae9b9..0000000000
--- a/metadata/it-IT/changelogs/11.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-- Aggiunta un'opzione per selezionare il numero di giorni per settimana.
-- Aggiunta un'opzione per mostrare la vista predefinita all'avvio.
-- Correzione bug.
diff --git a/metadata/it-IT/changelogs/13.txt b/metadata/it-IT/changelogs/13.txt
deleted file mode 100644
index 87b8315563..0000000000
--- a/metadata/it-IT/changelogs/13.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-- Supporta la condivisione di calendari come .ics e l'importazione/esportazione da scheda SD.
-- Rimozione permessi inutilizzati.
-- Correzione impostazioni sonore su Android 6.
-- Correzione di molti bug.
diff --git a/metadata/it-IT/changelogs/14.txt b/metadata/it-IT/changelogs/14.txt
deleted file mode 100644
index bfd5d97608..0000000000
--- a/metadata/it-IT/changelogs/14.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-- Richiesta dei permessi all'esecuzione da Android 6 in poi.
-- Correzione crash all'avvio.
-- Permetti all'utente di restringere lo schermo per mostrare l'intero giorno.
-- Imposta i secondi a zero quando si crea un nuovo evento.
-- Correzioni minori al layout.
-- Correzione di molti bug.
diff --git a/metadata/it-IT/changelogs/15.txt b/metadata/it-IT/changelogs/15.txt
deleted file mode 100644
index ce79bb1937..0000000000
--- a/metadata/it-IT/changelogs/15.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-- Richiedi i permessi all'esecuzione da Android 6 in poi.
-- Supporta la visualizzazione lunare/festiva quando la lingua è il cinese.
-- Aggiornamento delle traduzioni.
-- Correzioni minori al layout.
-- Correzione di molti bug.
diff --git a/metadata/it-IT/changelogs/16.txt b/metadata/it-IT/changelogs/16.txt
deleted file mode 100644
index d8fc780fc4..0000000000
--- a/metadata/it-IT/changelogs/16.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-- Eliminazione del widget, utilizzare Calendar Widget per ora: https://f-droid.org/de/packages/com.plusonelabs.calendar/.
-- Supporto per colori personalizzati negli eventi.
-- Supporto migliore per i file .ics.
-- Aggiunto il tema grigio.
-- Supporta la visibilità confidenziale.
-- Supporta i nuovi canali di notifiche di Android.
-- Correzione di molti bug.
diff --git a/metadata/it-IT/changelogs/17.txt b/metadata/it-IT/changelogs/17.txt
deleted file mode 100644
index ccd848f543..0000000000
--- a/metadata/it-IT/changelogs/17.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-- Migliorata la visualizzazione mese.
-- Il permesso per la lettura dei contatti è di nuovo opzionale.
-- Caselle di testo più belle durante la creazione di eventi.
-- Correzione di bug minori.
diff --git a/metadata/it-IT/changelogs/18.txt b/metadata/it-IT/changelogs/18.txt
deleted file mode 100644
index e13724b16e..0000000000
--- a/metadata/it-IT/changelogs/18.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-- Corretti bug nella visualizzazione mese.
-- Corretto il tema scuro su tablet.
-- Nuove traduzioni.
diff --git a/metadata/it-IT/changelogs/19.txt b/metadata/it-IT/changelogs/19.txt
deleted file mode 100644
index 3507054a9f..0000000000
--- a/metadata/it-IT/changelogs/19.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-- Correzione di bug nelle notifiche.
-- Nuove traduzioni.
diff --git a/metadata/it-IT/changelogs/20.txt b/metadata/it-IT/changelogs/20.txt
deleted file mode 100644
index 7ea4f6fe7e..0000000000
--- a/metadata/it-IT/changelogs/20.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-- Richieste notifiche extra per sincronizzazione interna degli avvisi. Per favore silenziale.
-- Rimossi permessi non più necessari.
-- Icone di notifica colorate.
-- Correzione bug.
-- Nuove traduzioni.
diff --git a/metadata/it-IT/changelogs/21.txt b/metadata/it-IT/changelogs/21.txt
deleted file mode 100644
index 991898ad30..0000000000
--- a/metadata/it-IT/changelogs/21.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-- Correzione bug.
-- Nuove traduzioni.
diff --git a/metadata/it-IT/changelogs/22.txt b/metadata/it-IT/changelogs/22.txt
deleted file mode 100644
index 63da306304..0000000000
--- a/metadata/it-IT/changelogs/22.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-- Aggiunto calendario offline.
-- Aggiunto collegamento per un nuovo evento.
-- Nuovo design delle impostazioni.
-- Nuovo selettore di data e ora.
-- Cambiata la licenza a GPLv3.
-- Correzione bug.
-- Nuove traduzioni.
diff --git a/metadata/it-IT/changelogs/23.txt b/metadata/it-IT/changelogs/23.txt
deleted file mode 100644
index d3a0afbe3e..0000000000
--- a/metadata/it-IT/changelogs/23.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-- Correzione bug per la schermata delle opzioni.
-- Nuove traduzioni.
diff --git a/metadata/it-IT/changelogs/24.txt b/metadata/it-IT/changelogs/24.txt
deleted file mode 100644
index ddbec78f46..0000000000
--- a/metadata/it-IT/changelogs/24.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-- Riduzione della dimensione del testo dei nomi degli eventi nella visualizzazione settimana.
-- Attiva i suggerimenti di ricerca recenti.
-- Correzione dell'esportazione su scheda SD.
-- Barra i titoli degli eventi cancellati.
-- Utilizza le impostazioni del tema di sistema su Android 10.
-- Nuove traduzioni.
-- Correzione di bug
diff --git a/metadata/it-IT/changelogs/25.txt b/metadata/it-IT/changelogs/25.txt
deleted file mode 100644
index f5202dbdfb..0000000000
--- a/metadata/it-IT/changelogs/25.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-- Recupero database dei fusi orari.
-- Icona dell'app in SVG.
-- Risistemazione e riattivazione del widget.
-- Nuove traduzioni
diff --git a/metadata/it-IT/changelogs/26.txt b/metadata/it-IT/changelogs/26.txt
deleted file mode 100644
index 80a46709a9..0000000000
--- a/metadata/it-IT/changelogs/26.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-- Risistemazione del layout della modifica evento.
-- Rimozione supporto per Android 4.4.
-- Correzione generale di bug.
-- Nuove traduzioni
diff --git a/metadata/it-IT/changelogs/27.txt b/metadata/it-IT/changelogs/27.txt
deleted file mode 100644
index ac0b5a1e83..0000000000
--- a/metadata/it-IT/changelogs/27.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-- Correzione generale di bug.
-- Nuove traduzioni
diff --git a/metadata/it-IT/changelogs/28.txt b/metadata/it-IT/changelogs/28.txt
deleted file mode 100644
index ac0b5a1e83..0000000000
--- a/metadata/it-IT/changelogs/28.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-- Correzione generale di bug.
-- Nuove traduzioni
diff --git a/metadata/it-IT/changelogs/29.txt b/metadata/it-IT/changelogs/29.txt
deleted file mode 100644
index bbd2891d24..0000000000
--- a/metadata/it-IT/changelogs/29.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-- Supporto per Android 12.
-- Supporto per il Design Material You.
-- Rimossa la connessione al servizio Android per il backup del database (non funziona su molte versioni Android).
-- Correzione generale di errori.
-- Nuove traduzioni
diff --git a/metadata/it-IT/changelogs/30.txt b/metadata/it-IT/changelogs/30.txt
deleted file mode 100644
index ee33f88dcb..0000000000
--- a/metadata/it-IT/changelogs/30.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-- Correzione delle notifiche su Android 12.
-- Aggiunta di DecSync e Birthday Adapter alle app "conosciute" e non crashare
diff --git a/metadata/it-IT/changelogs/31.txt b/metadata/it-IT/changelogs/31.txt
deleted file mode 100644
index 0ffe83ab83..0000000000
--- a/metadata/it-IT/changelogs/31.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-- Correzione crash e bug su Android 12.
-- Corretto il tipo MIME degli eventi condivisi
diff --git a/metadata/it-IT/changelogs/32.txt b/metadata/it-IT/changelogs/32.txt
deleted file mode 100644
index 84625e0c4d..0000000000
--- a/metadata/it-IT/changelogs/32.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-- Crea e mostra promemoria dopo l'inizio di un evento usando una checkbox
-- Sistemati promemoria con valori negativi
-- Corretti orari invalidi a causa di cambi di fuso orario
-- Opzione per aggiungere un nuovo evento dalla schermata widget
-- Risistemati i colori dei temi
-- Correzione bug
-- Nuove traduzioni
diff --git a/metadata/it-IT/changelogs/33.txt b/metadata/it-IT/changelogs/33.txt
deleted file mode 100644
index 2f437df118..0000000000
--- a/metadata/it-IT/changelogs/33.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-- Aggiunta opzione per duplicare gli eventi
-- Mostra il giorno della settimana su tablet
-- Correzione crash quando si apre un evento con ID molto grande
-- Risistemato il mini calendario nella visualizzazione tablet
-- Aggiunto supporto per le Icone Themed App su Android 13.
-- Mostra gli eventi multigiorno con i punti di inizio e fine corretti
-- Correzione bug
-- Nuove traduzioni
diff --git a/metadata/it-IT/changelogs/34.txt b/metadata/it-IT/changelogs/34.txt
deleted file mode 100644
index ff1eb3a41b..0000000000
--- a/metadata/it-IT/changelogs/34.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-- Bugfixes
-- Nuove traduzioni
diff --git a/metadata/it-IT/changelogs/35.txt b/metadata/it-IT/changelogs/35.txt
deleted file mode 100644
index cd0b6627e2..0000000000
--- a/metadata/it-IT/changelogs/35.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-- Campo aggiungi url
-- Correzione errori
-- Nuove traduzioni
diff --git a/metadata/it-IT/changelogs/36.txt b/metadata/it-IT/changelogs/36.txt
deleted file mode 100644
index 5adf71f6b4..0000000000
--- a/metadata/it-IT/changelogs/36.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-- Correzione di errori
-- Nuove traduzioni
diff --git a/metadata/it-IT/changelogs/37.txt b/metadata/it-IT/changelogs/37.txt
deleted file mode 100644
index e21eb5d695..0000000000
--- a/metadata/it-IT/changelogs/37.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-- Aggiunto supporto alle lingue per-app (Android 13+)
-- Aggiunto swipe sinistra/destra per vista mensile
-- Correzione di errori
-- Nuove traduzioni
diff --git a/metadata/it-IT/changelogs/38.txt b/metadata/it-IT/changelogs/38.txt
deleted file mode 100644
index b12a59dfb3..0000000000
--- a/metadata/it-IT/changelogs/38.txt
+++ /dev/null
@@ -1 +0,0 @@
-- Corretto un errore su eventi ricorrenti
diff --git a/metadata/it-IT/changelogs/39.txt b/metadata/it-IT/changelogs/39.txt
deleted file mode 100644
index a4629da541..0000000000
--- a/metadata/it-IT/changelogs/39.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-- Corretto crash in vista mese e settimana a causa di una regola non valida
-- Correzioni di errori
diff --git a/metadata/it-IT/changelogs/40.txt b/metadata/it-IT/changelogs/40.txt
deleted file mode 100644
index 4050fd153c..0000000000
--- a/metadata/it-IT/changelogs/40.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-- Speriamo, finalmente, corretto un crash nella vista per mese e settimana a cusa di una regola non valida
-- Correzioni di errori
diff --git a/metadata/it-IT/changelogs/41.txt b/metadata/it-IT/changelogs/41.txt
deleted file mode 100644
index 4b320269b3..0000000000
--- a/metadata/it-IT/changelogs/41.txt
+++ /dev/null
@@ -1 +0,0 @@
-- Corretto errore di compilazione su F-Droid
diff --git a/metadata/it-IT/changelogs/42.txt b/metadata/it-IT/changelogs/42.txt
deleted file mode 100644
index b811612ce6..0000000000
--- a/metadata/it-IT/changelogs/42.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-- Non chiudere la pagina di modifica evento quando il telefono viene ruotato
-- Notifiche per ogni calendario
-- Aggiunta preferenza: non controllare l'ottimizzazione della batteria
diff --git a/metadata/it-IT/changelogs/6.txt b/metadata/it-IT/changelogs/6.txt
deleted file mode 100644
index 88ec1c5693..0000000000
--- a/metadata/it-IT/changelogs/6.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-- Rimossi i permessi Internet mantenendo le stesse funzioni.
-- Aggiunto "Vai a..."
-- Correzione: il widget Agenda non si aggiorna tutti i giorni.
diff --git a/metadata/it-IT/changelogs/9.txt b/metadata/it-IT/changelogs/9.txt
deleted file mode 100644
index 452256fe75..0000000000
--- a/metadata/it-IT/changelogs/9.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-- Alcuni miglioramenti UI.
-- Aggiornata la traduzione svedese.
-- Correzione bug.
diff --git a/metadata/it-IT/full_description.txt b/metadata/it-IT/full_description.txt
index ee38767e5a..6efb83a9a7 100644
--- a/metadata/it-IT/full_description.txt
+++ b/metadata/it-IT/full_description.txt
@@ -5,8 +5,7 @@ Caratteristiche:
- Material design.
- Temi chiaro e scuro.
- Libero, open source e assolutamente nessuna pubblicità.
-- Supporta la condivisione di calendari via ics e la possibilità di importare/esportare dalla scheda SD.
-- Interfaccia utente multilingua
+- Supporta la condivisione di calendari via ics e la possibilità di importare/esportare dalla scheda sd.
Errori e feedback: https://github.com/Etar-Group/Etar-Calendar/issues
Codice sorgente: https://github.com/Etar-Group/Etar-Calendar
diff --git a/metadata/it-IT/short_description.txt b/metadata/it-IT/short_description.txt
index aeaae2af4b..3c6dc24171 100644
--- a/metadata/it-IT/short_description.txt
+++ b/metadata/it-IT/short_description.txt
@@ -1 +1 @@
-Etar è un calendario in material design, per tutti!
+Etar è un calendario in material design, per tutti!
\ No newline at end of file
diff --git a/metadata/ja/changelogs/10.txt b/metadata/ja/changelogs/10.txt
deleted file mode 100644
index cf14d5ca77..0000000000
--- a/metadata/ja/changelogs/10.txt
+++ /dev/null
@@ -1 +0,0 @@
-- ダークテーマを追加
diff --git a/metadata/ja/changelogs/11.txt b/metadata/ja/changelogs/11.txt
deleted file mode 100644
index 251fff64eb..0000000000
--- a/metadata/ja/changelogs/11.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-- 1 週間の日数を選択できる機能を追加
-- アプリ開始時のデフォルトの表示を選択できる機能を追加
-- バグ修正
diff --git a/metadata/ja/changelogs/13.txt b/metadata/ja/changelogs/13.txt
deleted file mode 100644
index 3c198390b3..0000000000
--- a/metadata/ja/changelogs/13.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-- ics 形式のカレンダーの共有に対応。SD カードからもインポート/エクスポート可能
-- 使用しない権限を削除
-- Android 6 での音声設定を修正
-- 多数のバグ修正
diff --git a/metadata/ja/changelogs/14.txt b/metadata/ja/changelogs/14.txt
deleted file mode 100644
index fa95f15202..0000000000
--- a/metadata/ja/changelogs/14.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-- Android 6 以上での実行時に権限を要求
-- 開始時のクラッシュを修正
-- 1 日中見やすいように、表示を変更できる機能を追加
-- 新しい予定の作成時にゼロ秒を設定
-- 細かなレイアウトの修正
-- 多数のバグ修正
diff --git a/metadata/ja/changelogs/15.txt b/metadata/ja/changelogs/15.txt
deleted file mode 100644
index 391b813f8c..0000000000
--- a/metadata/ja/changelogs/15.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-- Android 6 以上での実行時に権限を要求
-- 言語を中国語に設定中に月/行事の表示に対応
-- 翻訳を更新
-- 細かなレイアウトの修正
-- 多数のバグ修正
diff --git a/metadata/ja/changelogs/16.txt b/metadata/ja/changelogs/16.txt
deleted file mode 100644
index 06dacf8cb8..0000000000
--- a/metadata/ja/changelogs/16.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-- ウィジェットを削除。このような外部のカレンダーウィジェットの使用を推奨: https://f-droid.org/de/packages/com.plusonelabs.calendar/
-- カスタムカラーの予定に対応
-- ics ファイルへの対応を改善
-- グレーテーマを追加
-- 機密度設定に対応
-- 新しい Android 通知チャンネルに対応
-- 多数のバグ修正
diff --git a/metadata/ja/changelogs/17.txt b/metadata/ja/changelogs/17.txt
deleted file mode 100644
index 316e6978e7..0000000000
--- a/metadata/ja/changelogs/17.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-- 月表示の改善
-- 連絡先の読み取り権限を再び任意化
-- 予定作成のテキストボックスを改良
-- 多数のバグ修正
diff --git a/metadata/ja/changelogs/18.txt b/metadata/ja/changelogs/18.txt
deleted file mode 100644
index 6d29a5f7e2..0000000000
--- a/metadata/ja/changelogs/18.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-- 月表示でのバグを修正
-- 表のダークテーマを修正
-- 翻訳を更新
diff --git a/metadata/ja/changelogs/19.txt b/metadata/ja/changelogs/19.txt
deleted file mode 100644
index 2989f65769..0000000000
--- a/metadata/ja/changelogs/19.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-- 通知のバグを修正
-- 翻訳を更新
diff --git a/metadata/ja/changelogs/20.txt b/metadata/ja/changelogs/20.txt
deleted file mode 100644
index 1419121943..0000000000
--- a/metadata/ja/changelogs/20.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-- 内部の同期のために通知チャンネルを追加しました。非表示にしても問題ありません。
-- 不要になった権限を削除
-- 通知アイコンを色付きに変更
-- バグ修正
-- 翻訳を更新
diff --git a/metadata/ja/changelogs/21.txt b/metadata/ja/changelogs/21.txt
deleted file mode 100644
index 32ff8fa24b..0000000000
--- a/metadata/ja/changelogs/21.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-- バグ修正
-- 翻訳を更新
diff --git a/metadata/ja/changelogs/22.txt b/metadata/ja/changelogs/22.txt
deleted file mode 100644
index fdf8033371..0000000000
--- a/metadata/ja/changelogs/22.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-- オフラインカレンダーを追加
-- 予定の新規作成のショートカットを追加
-- 設定のデザインを一新
-- 日付/時間選択ツールを更新
-- ライセンスを GPLv3 に変更
-- バグ修正
-- 翻訳を更新
diff --git a/metadata/ja/changelogs/23.txt b/metadata/ja/changelogs/23.txt
deleted file mode 100644
index ca0f7c68df..0000000000
--- a/metadata/ja/changelogs/23.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-- オプション画面のバグを修正
-- 翻訳を更新
diff --git a/metadata/ja/changelogs/24.txt b/metadata/ja/changelogs/24.txt
deleted file mode 100644
index aaddef0a8e..0000000000
--- a/metadata/ja/changelogs/24.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-- 週表示での予定名のフォントサイズを縮小
-- 最近の検索のサジェストを有効化
-- SD カードへのエクスポートを修正
-- キャンセルされた予定の件名に取り消し線を表示
-- Android 10 のシステムのテーマ設定を使用するように変更
-- バグ修正
-- 翻訳を更新
diff --git a/metadata/ja/changelogs/25.txt b/metadata/ja/changelogs/25.txt
deleted file mode 100644
index d2235046b2..0000000000
--- a/metadata/ja/changelogs/25.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-- タイムゾーンデータベースを修復
-- アプリアイコンを SVG に変更
-- ウィジェットを再搭載
-- 翻訳を更新
diff --git a/metadata/ja/changelogs/26.txt b/metadata/ja/changelogs/26.txt
deleted file mode 100644
index 14beef97ee..0000000000
--- a/metadata/ja/changelogs/26.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-- 予定編集レイアウトを再搭載
-- Android 4.4 への対応を終了
-- 総合的なバグ修正
-- 翻訳を更新
diff --git a/metadata/ja/changelogs/27.txt b/metadata/ja/changelogs/27.txt
deleted file mode 100644
index 3d08a8a1a5..0000000000
--- a/metadata/ja/changelogs/27.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-- 総合的なバグ修正
-- 翻訳を更新
diff --git a/metadata/ja/changelogs/28.txt b/metadata/ja/changelogs/28.txt
deleted file mode 100644
index 3d08a8a1a5..0000000000
--- a/metadata/ja/changelogs/28.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-- 総合的なバグ修正
-- 翻訳を更新
diff --git a/metadata/ja/changelogs/29.txt b/metadata/ja/changelogs/29.txt
deleted file mode 100644
index 6ca531392d..0000000000
--- a/metadata/ja/changelogs/29.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-- Android 12 に対応
-- Material You デザインに対応
-- データベースのバックアップのための Android サービスへの接続を削除 (ほとんどのバージョンの Android で機能しないため)
-- 総合的なバグ修正
-- 翻訳を更新
diff --git a/metadata/ja/changelogs/30.txt b/metadata/ja/changelogs/30.txt
deleted file mode 100644
index 035a2578f6..0000000000
--- a/metadata/ja/changelogs/30.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-- Android 12 での通知問題を修正
-- DecSync と Birthday Adapter をテストするアプリに追加し、クラッシュしないよう変更
diff --git a/metadata/ja/changelogs/31.txt b/metadata/ja/changelogs/31.txt
deleted file mode 100644
index 33064a1333..0000000000
--- a/metadata/ja/changelogs/31.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-- Android 12 でのクラッシュと通知を修正
-- 予定共有の MIME 形式を修正
diff --git a/metadata/ja/changelogs/32.txt b/metadata/ja/changelogs/32.txt
deleted file mode 100644
index 80ebd64b2c..0000000000
--- a/metadata/ja/changelogs/32.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-- チェックボックスを使用して、イベントの開始後にリマインダーを作成・表示できるように変更
-- リマインダーのデフォルトの値を変更
-- タイムゾーンの変更のため、無効な日時を修正
-- ウィジェットから予定を作成するオプションを追加
-- テーマカラーを再搭載
-- バグ修正
-- 翻訳を更新
diff --git a/metadata/ja/changelogs/33.txt b/metadata/ja/changelogs/33.txt
deleted file mode 100644
index d1feeef251..0000000000
--- a/metadata/ja/changelogs/33.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-- 予定を複製する選択肢を追加
-- タブレット上で平日を表示するよう変更
-- 長い ID をもつ予定を開くとクラッシュする問題を修正
-- タブレット表示でのミニカレンダーを再搭載
-- Android 13 の、テーマに合わせたアイコンに対応
-- 日をまたぐイベントの開始と終了の表示を追加
-- バグ修正
-- 翻訳を更新
diff --git a/metadata/ja/changelogs/34.txt b/metadata/ja/changelogs/34.txt
deleted file mode 100644
index 32ff8fa24b..0000000000
--- a/metadata/ja/changelogs/34.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-- バグ修正
-- 翻訳を更新
diff --git a/metadata/ja/changelogs/35.txt b/metadata/ja/changelogs/35.txt
deleted file mode 100644
index 2ed791980f..0000000000
--- a/metadata/ja/changelogs/35.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-- URL 欄を追加
-- バグ修正
-- 翻訳を更新
diff --git a/metadata/ja/changelogs/36.txt b/metadata/ja/changelogs/36.txt
deleted file mode 100644
index 32ff8fa24b..0000000000
--- a/metadata/ja/changelogs/36.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-- バグ修正
-- 翻訳を更新
diff --git a/metadata/ja/changelogs/37.txt b/metadata/ja/changelogs/37.txt
deleted file mode 100644
index 6ad60d24ee..0000000000
--- a/metadata/ja/changelogs/37.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-- アプリごとの言語設定に対応 (Android 13 以上)
-- 月表示で左右スワイプ操作を追加
-- バグ修正
-- 翻訳を更新
diff --git a/metadata/ja/changelogs/38.txt b/metadata/ja/changelogs/38.txt
deleted file mode 100644
index fd48715592..0000000000
--- a/metadata/ja/changelogs/38.txt
+++ /dev/null
@@ -1 +0,0 @@
-- 予定の繰り返しでのクラッシュを修正
diff --git a/metadata/ja/changelogs/39.txt b/metadata/ja/changelogs/39.txt
deleted file mode 100644
index ab3e940af8..0000000000
--- a/metadata/ja/changelogs/39.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-- 無効な繰り返しルールによる月表示と週表示のクラッシュを修正
-- バグ修正
diff --git a/metadata/ja/changelogs/40.txt b/metadata/ja/changelogs/40.txt
deleted file mode 100644
index 5e5077301a..0000000000
--- a/metadata/ja/changelogs/40.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-- 無効な繰り返しルールによる月表示と週表示のクラッシュに対する、最終的なはずの修正
-- バグ修正
diff --git a/metadata/ja/changelogs/41.txt b/metadata/ja/changelogs/41.txt
deleted file mode 100644
index fe9e72db46..0000000000
--- a/metadata/ja/changelogs/41.txt
+++ /dev/null
@@ -1 +0,0 @@
-- F-Droid のコンパイルエラーを修正
diff --git a/metadata/ja/changelogs/6.txt b/metadata/ja/changelogs/6.txt
deleted file mode 100644
index 01de846cb1..0000000000
--- a/metadata/ja/changelogs/6.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-- 同じ機能を維持した上で、インターネットの権限を削除
-- 日付移動を追加
-- 予定リストが更新されない問題を修正
diff --git a/metadata/ja/changelogs/9.txt b/metadata/ja/changelogs/9.txt
deleted file mode 100644
index 9f2ecc1e5e..0000000000
--- a/metadata/ja/changelogs/9.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-- UI の改善
-- スウェーデン語の翻訳の更新
-- バグ修正
diff --git a/metadata/ja/full_description.txt b/metadata/ja/full_description.txt
deleted file mode 100644
index 490797006b..0000000000
--- a/metadata/ja/full_description.txt
+++ /dev/null
@@ -1,12 +0,0 @@
-機能:
-- 月表示
-- 週間、日、予定リスト表示
-- Android のカレンダー同期を使用。Google カレンダー、Exchange などが動作
-- マテリアルデザイン
-- ダークテーマ、ライトテーマ
-- 無料、オープンソース、本当に広告なし
-- ICS でのカレンダー共有に対応。SD カードからのインポート/エクスポートも可能
-- 多言語 UI
-
-バグ・フィードバック: https://github.com/Etar-Group/Etar-Calendar/issues
-ソースコード: https://github.com/Etar-Group/Etar-Calendar
diff --git a/metadata/ja/short_description.txt b/metadata/ja/short_description.txt
index 4c7a0eece6..11c5bafcc2 100644
--- a/metadata/ja/short_description.txt
+++ b/metadata/ja/short_description.txt
@@ -1 +1 @@
-Etar はすべての人のための、マテリアルデザインのオープンソースのカレンダーです!
+ETARは皆のために、オープンソースのカレンダーをデザイン素材です!
diff --git a/metadata/ja/title.txt b/metadata/ja/title.txt
deleted file mode 100644
index 79e8a67bdc..0000000000
--- a/metadata/ja/title.txt
+++ /dev/null
@@ -1 +0,0 @@
-Etar - オープンソースのカレンダーアプリ
diff --git a/metadata/nl/changelogs/34.txt b/metadata/nl/changelogs/34.txt
deleted file mode 100644
index 91d7f546fe..0000000000
--- a/metadata/nl/changelogs/34.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-- Bug fixes
-- Nieuwe vertalingen
diff --git a/metadata/nl/changelogs/35.txt b/metadata/nl/changelogs/35.txt
deleted file mode 100644
index 91843801eb..0000000000
--- a/metadata/nl/changelogs/35.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-- Url veld toevoegen
-- Bugfixes
-- Nieuwe vertalingen
diff --git a/metadata/nl/changelogs/36.txt b/metadata/nl/changelogs/36.txt
deleted file mode 100644
index 7a10f9d55f..0000000000
--- a/metadata/nl/changelogs/36.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-- Bugfixes
-- Nieuwe vertalingen
diff --git a/metadata/nn/changelogs/10.txt b/metadata/nn/changelogs/10.txt
deleted file mode 100644
index d1624d41a0..0000000000
--- a/metadata/nn/changelogs/10.txt
+++ /dev/null
@@ -1 +0,0 @@
-– Lagd til mørk vising.
diff --git a/metadata/nn/changelogs/11.txt b/metadata/nn/changelogs/11.txt
deleted file mode 100644
index 2c23fcac71..0000000000
--- a/metadata/nn/changelogs/11.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-– Lagt til eit val for å velja dagar i veka.
-– Lagt til eit val for hovudvisinga å verta vist ved byrjing.
-– Avlusingar.
diff --git a/metadata/nn/changelogs/13.txt b/metadata/nn/changelogs/13.txt
deleted file mode 100644
index 40b4329f32..0000000000
--- a/metadata/nn/changelogs/13.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-– Stør kalenderdeling gjennom ics og gjerlegskapen til å føra inn/ut ifrå ytre gøyme.
-– Tok bort unytta løyve.
-– Sette i stand ljodinnstilling i Android 6.
-– Mykje avlusing.
diff --git a/metadata/nn/short_description.txt b/metadata/nn/short_description.txt
deleted file mode 100644
index 7478f018cd..0000000000
--- a/metadata/nn/short_description.txt
+++ /dev/null
@@ -1 +0,0 @@
-Etar er ein kalender med open kjeldekode og «Material Design», laga for alle.
diff --git a/metadata/nn/title.txt b/metadata/nn/title.txt
deleted file mode 100644
index fb68eff83c..0000000000
--- a/metadata/nn/title.txt
+++ /dev/null
@@ -1 +0,0 @@
-Etar - Fri og open kalender
diff --git a/metadata/pl/changelogs/13.txt b/metadata/pl/changelogs/13.txt
deleted file mode 100644
index d7eeec9932..0000000000
--- a/metadata/pl/changelogs/13.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-- Wsparcie udostępniania kalendarzy w formacie ics; możliwość importu/eksportu z/do karty SD.
-- Usunięto niepotrzebne uprawnienia.
-- Naprawiono ustawienia dźwiękowe w Android 6.
-- Poprawki błędów.
diff --git a/metadata/pl/changelogs/34.txt b/metadata/pl/changelogs/34.txt
deleted file mode 100644
index f94b420703..0000000000
--- a/metadata/pl/changelogs/34.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-- Naprawiono znane błędy
-- Nowe tłumaczenia
diff --git a/metadata/ro-RO/changelogs/34.txt b/metadata/ro-RO/changelogs/34.txt
deleted file mode 100644
index 1b8c2a14de..0000000000
--- a/metadata/ro-RO/changelogs/34.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-- Corecții de erori
-- Traduceri noi
diff --git a/metadata/ro-RO/changelogs/35.txt b/metadata/ro-RO/changelogs/35.txt
deleted file mode 100644
index 04b5f59565..0000000000
--- a/metadata/ro-RO/changelogs/35.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-- Adăugați câmpul url
-- Corecții de erori
-- Traduceri noi
diff --git a/metadata/ro-RO/changelogs/36.txt b/metadata/ro-RO/changelogs/36.txt
deleted file mode 100644
index 1b8c2a14de..0000000000
--- a/metadata/ro-RO/changelogs/36.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-- Corecții de erori
-- Traduceri noi
diff --git a/metadata/ro-RO/changelogs/37.txt b/metadata/ro-RO/changelogs/37.txt
deleted file mode 100644
index 9ef5d4baea..0000000000
--- a/metadata/ro-RO/changelogs/37.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-- Adăugați suportul lingvistic pentru fiecare aplicație (android 13+)
-- Adăugați glisarea stânga/dreapta pentru vizualizarea lunară
-- Corecții de erori
-- Traduceri noi
diff --git a/metadata/ro-RO/changelogs/38.txt b/metadata/ro-RO/changelogs/38.txt
deleted file mode 100644
index a01c34dfac..0000000000
--- a/metadata/ro-RO/changelogs/38.txt
+++ /dev/null
@@ -1 +0,0 @@
-- Fix crash pe evenimente recurente
diff --git a/metadata/ro-RO/changelogs/39.txt b/metadata/ro-RO/changelogs/39.txt
deleted file mode 100644
index 962c15044e..0000000000
--- a/metadata/ro-RO/changelogs/39.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-- Corectarea blocării pe vizualizarea lunii și a săptămânii din cauza unei reguli invalide
-- Corecții de erori
diff --git a/metadata/ro-RO/changelogs/40.txt b/metadata/ro-RO/changelogs/40.txt
deleted file mode 100644
index fb9c594bcf..0000000000
--- a/metadata/ro-RO/changelogs/40.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-- Sperăm că, în sfârșit, am rezolvat un accident la vizualizarea lunară și săptămânală din cauza unei reguli invalide
-- Corecții de erori
diff --git a/metadata/ro-RO/changelogs/41.txt b/metadata/ro-RO/changelogs/41.txt
deleted file mode 100644
index 4414a31a8a..0000000000
--- a/metadata/ro-RO/changelogs/41.txt
+++ /dev/null
@@ -1 +0,0 @@
-- Remediați eroarea de compilare F-Droid
diff --git a/metadata/ro-RO/changelogs/42.txt b/metadata/ro-RO/changelogs/42.txt
deleted file mode 100644
index b7a55b6b90..0000000000
--- a/metadata/ro-RO/changelogs/42.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-- Nu închideți pagina de editare a evenimentului atunci când telefonul este rotit
-- Notificări calendaristice pentru fiecare calendar
-- Adăugați preferințe: Nu verificați optimizarea bateriei
diff --git a/metadata/sl/changelogs/10.txt b/metadata/sl/changelogs/10.txt
deleted file mode 100644
index 8b024ded49..0000000000
--- a/metadata/sl/changelogs/10.txt
+++ /dev/null
@@ -1 +0,0 @@
-- Dodana temna tema.
diff --git a/metadata/sl/changelogs/11.txt b/metadata/sl/changelogs/11.txt
deleted file mode 100644
index dcdfc441de..0000000000
--- a/metadata/sl/changelogs/11.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-- Dodajte možnost izbire dnevov na teden.
-- Dodajte možnost za privzeti pogled, ki se prikaže ob zagonu.
-- Popravki napak.
diff --git a/metadata/sl/changelogs/13.txt b/metadata/sl/changelogs/13.txt
deleted file mode 100644
index fe75c6bd9c..0000000000
--- a/metadata/sl/changelogs/13.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-- Dodana podpora za souporabo koledarjev prek ics in možnost uvoza/izvoza iz kartice SD.
-- Možnost odstranitve neuporabljenih dovoljenj.
-- Popravek nastavitev zvoka v operacijskem sistemu Android 6.
-- Veliko ostalih popravkov.
diff --git a/metadata/sl/title.txt b/metadata/sl/title.txt
deleted file mode 100644
index 19b14d70ce..0000000000
--- a/metadata/sl/title.txt
+++ /dev/null
@@ -1 +0,0 @@
-Etar - Odprtokodni koledar
diff --git a/metadata/sv/changelogs/14.txt b/metadata/sv/changelogs/14.txt
deleted file mode 100644
index b30ee993e7..0000000000
--- a/metadata/sv/changelogs/14.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-- Begär åtkomst vid körtid på Android 6 och uppåt.
-- Fixa krasch vid uppstart.
-- Tillåt användaren att krympa skärmen så att hela dagen är synlig.
-- Ställ in sekunder till noll vid skapandet av en ny händelse.
-- Mindre fixar för layouten.
-- Många buggfixar.
diff --git a/metadata/sv/changelogs/15.txt b/metadata/sv/changelogs/15.txt
deleted file mode 100644
index 630de12f5e..0000000000
--- a/metadata/sv/changelogs/15.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-- Begär åtkomst vid körtid för Android 6 och uppåt.
-- Stöd för visning av lunar/festival när språket är Kinesiska.
-- Uppdatera översättningar.
-- Mindre layout-fixar.
-- Massor med buggfixar.
diff --git a/metadata/sv/changelogs/16.txt b/metadata/sv/changelogs/16.txt
deleted file mode 100644
index d9957146f3..0000000000
--- a/metadata/sv/changelogs/16.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-- Släppte widgeten, använd Kalender-widgeten just nu: https://f-droid.org/de/packages/com.plusonelabs.calendar/.
-- Stöd för färganpassade händelser.
-- Bättre stöd för ics-filer.
-- Lägg till grått tema.
-- Stöd synlighet konfidentiellt.
-- Stöd nya aviseringskanaler för Android.
-- Massor av bugg-fixar.
diff --git a/metadata/sv/changelogs/17.txt b/metadata/sv/changelogs/17.txt
deleted file mode 100644
index 9366a6024e..0000000000
--- a/metadata/sv/changelogs/17.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-- Förbättrad månadsvy.
-- Åt6komst för att läsa kontakter är valfritt igen.
-- Snyggare textlådor under skapandet av händelsen.
-- Mindre buggfixar.
diff --git a/metadata/sv/changelogs/18.txt b/metadata/sv/changelogs/18.txt
deleted file mode 100644
index 08e3f14efc..0000000000
--- a/metadata/sv/changelogs/18.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-- Buggar i månadsvyn fixades.
-- Fixade mörkt tema i surfplattor.
-- Nya översättningar.
diff --git a/metadata/sv/changelogs/19.txt b/metadata/sv/changelogs/19.txt
deleted file mode 100644
index 544d1e6c13..0000000000
--- a/metadata/sv/changelogs/19.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-- Buggfix för aviseringar.
-- Nya översättningar.
diff --git a/metadata/sv/changelogs/20.txt b/metadata/sv/changelogs/20.txt
deleted file mode 100644
index 8557ba99e4..0000000000
--- a/metadata/sv/changelogs/20.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-- Extra aviseringar krävs för den interna varningssynk. Vänligen stäng av ljudet.
-- Åtkomster som inte längre behövs togs bort.
-- Färglagd aviseringsikon.
-- Buggfixar.
-- Nya översättningar.
diff --git a/metadata/sv/changelogs/22.txt b/metadata/sv/changelogs/22.txt
deleted file mode 100644
index 070f24c990..0000000000
--- a/metadata/sv/changelogs/22.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-- Lägg till ej uppkopplad kalender.
-- Lägg till genväg för ny händelse.
-- Ny design för Inställningar.
-- Ny väljare för datum och tid.
-- Byt licens till GPLv3.
-- Buggfixar.
-- Nya översättningar.
diff --git a/metadata/sv/changelogs/23.txt b/metadata/sv/changelogs/23.txt
deleted file mode 100644
index b96fd39f70..0000000000
--- a/metadata/sv/changelogs/23.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-- Buggfix för alternativ-rutan.
-- Nya översättningar.
diff --git a/metadata/sv/changelogs/24.txt b/metadata/sv/changelogs/24.txt
deleted file mode 100644
index 22f2ceaf06..0000000000
--- a/metadata/sv/changelogs/24.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-- Minska på typsnittets storlek till händelsernas namn i veckovyn
-- Aktivera senaste sökförslagen
-- Fixa exportering till SD-kort
-- Stryk över titeln för avbrutna händelser
-- Se till att nyttogöra inställningarna för systemets tema i android 10
-- Nya översättningar
-- Buggfixar
diff --git a/metadata/sv/changelogs/25.txt b/metadata/sv/changelogs/25.txt
deleted file mode 100644
index 1e784c2264..0000000000
--- a/metadata/sv/changelogs/25.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-- Återställ tidszonens databas
-- App-ikon för SVG
-- Omarbeta och återaktivera widgeten
-- Nya översättningar
diff --git a/metadata/sv/changelogs/26.txt b/metadata/sv/changelogs/26.txt
deleted file mode 100644
index 9210c87b14..0000000000
--- a/metadata/sv/changelogs/26.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-- Omarbeta redigeringen av händelsens layout
-- Släpp stödet för Android 4.4
-- Generella buggfixar
-- Nya översättningar
diff --git a/metadata/sv/changelogs/29.txt b/metadata/sv/changelogs/29.txt
deleted file mode 100644
index a7ce8c1785..0000000000
--- a/metadata/sv/changelogs/29.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-- Stöd Android 12
-- Stöd designen Material You
-- Ta bort anslutningen till Android-tjänsten för databasens säkerhetskopia (trasig i de flesta Android-versionerna)
-- Generella buggfixar
-- Nya översättningar
diff --git a/metadata/sv/changelogs/32.txt b/metadata/sv/changelogs/32.txt
deleted file mode 100644
index 99c84a1b66..0000000000
--- a/metadata/sv/changelogs/32.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-- Skapa och visa påminnelser efter att händelsen har börjar med en kryssruta
-- Reparera påminnelsen med negativa värden
-- Lös ogiltiga klockslag till följd av byten av tidszoner
-- Alternativ att lägga till ny händelse från widget-rutan
-- Omarbeta tema-färger
-- Buggfixar
-- Nya översättningar
diff --git a/metadata/sv/changelogs/33.txt b/metadata/sv/changelogs/33.txt
deleted file mode 100644
index d6e64050c5..0000000000
--- a/metadata/sv/changelogs/33.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-- Lägg till alternativ för att duplicera händelser
-- Visa veckodagar i surfplattan
-- Fixa krasch vid öppnande av en händelse med ett stort ID
-- Omarbeta mini-kalender i surfplattevyn.
-- Lägg till stöd för tema-baserade app-ikoner i Android 13
-- Visa händelser som pågår i flera dagar med korrekt start och slutpunkter
-- Buggfixar
-- Nya översättningar
diff --git a/metadata/sv/changelogs/34.txt b/metadata/sv/changelogs/34.txt
deleted file mode 100644
index 0eddb76c27..0000000000
--- a/metadata/sv/changelogs/34.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-- Buggfixar
-- Nya översättningar
diff --git a/metadata/sv/changelogs/35.txt b/metadata/sv/changelogs/35.txt
deleted file mode 100644
index 089dddd970..0000000000
--- a/metadata/sv/changelogs/35.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-- Lägg till ett fält för URL
-- Buggfixar
-- Nya översättningar
diff --git a/metadata/sv/changelogs/36.txt b/metadata/sv/changelogs/36.txt
deleted file mode 100644
index 0eddb76c27..0000000000
--- a/metadata/sv/changelogs/36.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-- Buggfixar
-- Nya översättningar
diff --git a/metadata/sv/changelogs/37.txt b/metadata/sv/changelogs/37.txt
deleted file mode 100644
index 3d32770d62..0000000000
--- a/metadata/sv/changelogs/37.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-- Lägg till per app språkstöd (android 13+)
-- Lägg till vänster/höger svep till månadsvy
--Buggfixar
--Nya översättningar
diff --git a/metadata/sv/changelogs/38.txt b/metadata/sv/changelogs/38.txt
deleted file mode 100644
index f196b48953..0000000000
--- a/metadata/sv/changelogs/38.txt
+++ /dev/null
@@ -1 +0,0 @@
-- Fixat krasch på återkommande händelser
diff --git a/metadata/sv/changelogs/39.txt b/metadata/sv/changelogs/39.txt
deleted file mode 100644
index 57fa341de6..0000000000
--- a/metadata/sv/changelogs/39.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-- Fixa krasch i månads och vecko-vyn till följd av felaktig rregel
-- Buggfixar
diff --git a/metadata/sv/changelogs/40.txt b/metadata/sv/changelogs/40.txt
deleted file mode 100644
index a6a547208b..0000000000
--- a/metadata/sv/changelogs/40.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-- Förhoppningsvis, slutligen, fixade en krasch i månads och vecko-vyn till föjd av felatig rregel
-- Buggfixar
diff --git a/metadata/sv/changelogs/41.txt b/metadata/sv/changelogs/41.txt
deleted file mode 100644
index 2d2f71cd71..0000000000
--- a/metadata/sv/changelogs/41.txt
+++ /dev/null
@@ -1 +0,0 @@
-- Fixa kompileringsfel för F-Droid
diff --git a/metadata/sv/changelogs/9.txt b/metadata/sv/changelogs/9.txt
deleted file mode 100644
index d681494630..0000000000
--- a/metadata/sv/changelogs/9.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-- Lite bättre UI-ändringar.
-- Uppdatera översättningen för Svenska.
-- Buggfixar.
diff --git a/metadata/sv/title.txt b/metadata/sv/title.txt
index c1d6b27111..4316228c5e 100644
--- a/metadata/sv/title.txt
+++ b/metadata/sv/title.txt
@@ -1 +1 @@
-Etar - OpenSource-kalender
+Etar - Kalender med öppen källkod
diff --git a/metadata/tr/changelogs/34.txt b/metadata/tr/changelogs/34.txt
deleted file mode 100644
index aeeee794a3..0000000000
--- a/metadata/tr/changelogs/34.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-- Hata düzeltmeleri
-- Yeni çeviriler
diff --git a/metadata/tr/changelogs/35.txt b/metadata/tr/changelogs/35.txt
deleted file mode 100644
index 7f475f19f1..0000000000
--- a/metadata/tr/changelogs/35.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-- URL alanı eklendi
-- Hata düzeltmeleri
-- Yeni çeviriler
diff --git a/metadata/tr/changelogs/36.txt b/metadata/tr/changelogs/36.txt
deleted file mode 100644
index aeeee794a3..0000000000
--- a/metadata/tr/changelogs/36.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-- Hata düzeltmeleri
-- Yeni çeviriler
diff --git a/metadata/tr/changelogs/37.txt b/metadata/tr/changelogs/37.txt
deleted file mode 100644
index 341aff4d87..0000000000
--- a/metadata/tr/changelogs/37.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-- Uygulama başına dil desteği eklendi (android 13+)
-- Ay görünümüne sola/sağa kaydırma özelliği eklendi
-- Hata düzeltmeleri
-- Yeni çeviriler
diff --git a/metadata/tr/changelogs/38.txt b/metadata/tr/changelogs/38.txt
deleted file mode 100644
index 66c5d59b4c..0000000000
--- a/metadata/tr/changelogs/38.txt
+++ /dev/null
@@ -1 +0,0 @@
-- Yinelenen etkinliklerde çökme düzeltildi
diff --git a/metadata/tr/changelogs/39.txt b/metadata/tr/changelogs/39.txt
deleted file mode 100644
index 30ceae3c87..0000000000
--- a/metadata/tr/changelogs/39.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-- Geçersiz kural nedeniyle ay ve hafta görünümündeki çökme düzeltildi
-- Hata düzeltmeleri
diff --git a/metadata/tr/changelogs/40.txt b/metadata/tr/changelogs/40.txt
deleted file mode 100644
index 26787446bd..0000000000
--- a/metadata/tr/changelogs/40.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-- Umarım, nihayet, geçersiz kural nedeniyle ay ve hafta görünümündeki bir çökme düzeltildi
-- Hata düzeltmeleri
diff --git a/metadata/tr/changelogs/41.txt b/metadata/tr/changelogs/41.txt
deleted file mode 100644
index 96a6107c58..0000000000
--- a/metadata/tr/changelogs/41.txt
+++ /dev/null
@@ -1 +0,0 @@
-- F-Droid derleme hatası düzeltildi
diff --git a/metadata/tr/changelogs/42.txt b/metadata/tr/changelogs/42.txt
deleted file mode 100644
index 2d2596ed6e..0000000000
--- a/metadata/tr/changelogs/42.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-- Telefon döndürüldüğünde etkinlik düzenleme sayfası kapatılmasın
-- Takvim başına takvim bildirimleri
-- Tercih eklendi: Pil iyileştirmesi denetlenmesin
diff --git a/metadata/tr/short_description.txt b/metadata/tr/short_description.txt
index 47c75d3f78..cdbc5f8a99 100644
--- a/metadata/tr/short_description.txt
+++ b/metadata/tr/short_description.txt
@@ -1 +1 @@
-Etar, herkes için materyal tasarımlı açık kaynak bir takvim!
+Etar, herkes için material tasarıma sahip açık kaynaklı bir takvimdir!
diff --git a/metadata/uk/changelogs/34.txt b/metadata/uk/changelogs/34.txt
deleted file mode 100644
index 87d5006188..0000000000
--- a/metadata/uk/changelogs/34.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-- Виправлення помилок
-- Нові переклади
diff --git a/metadata/uk/changelogs/35.txt b/metadata/uk/changelogs/35.txt
deleted file mode 100644
index a2068505b4..0000000000
--- a/metadata/uk/changelogs/35.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-- Додано поле url
-- Виправлення помилок
-- Нові переклади
diff --git a/metadata/uk/changelogs/36.txt b/metadata/uk/changelogs/36.txt
deleted file mode 100644
index 87d5006188..0000000000
--- a/metadata/uk/changelogs/36.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-- Виправлення помилок
-- Нові переклади
diff --git a/metadata/uk/changelogs/37.txt b/metadata/uk/changelogs/37.txt
deleted file mode 100644
index 4227033fd3..0000000000
--- a/metadata/uk/changelogs/37.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-- Додана підтримка мов у застосунку ( Android 13+)
-- Додано гортання вліво/вправо до перегляду місяця
-- Виправлення помилок
-- Нові переклади
diff --git a/metadata/uk/changelogs/38.txt b/metadata/uk/changelogs/38.txt
deleted file mode 100644
index 631285b11b..0000000000
--- a/metadata/uk/changelogs/38.txt
+++ /dev/null
@@ -1 +0,0 @@
-- Виправлено збій у повторюваних подіях
diff --git a/metadata/uk/changelogs/39.txt b/metadata/uk/changelogs/39.txt
deleted file mode 100644
index 2d2d30aad3..0000000000
--- a/metadata/uk/changelogs/39.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-- Виправлено збій при перегляді місяця та тижня через невірний rrule
-- Виправлення помилок
diff --git a/metadata/uk/changelogs/40.txt b/metadata/uk/changelogs/40.txt
deleted file mode 100644
index e444f6a0d5..0000000000
--- a/metadata/uk/changelogs/40.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-- Сподіваюсь, нарешті виправлено збій при перегляді місяця та тижня через невірне правило rrule
-- Виправлення помилок
diff --git a/metadata/uk/changelogs/41.txt b/metadata/uk/changelogs/41.txt
deleted file mode 100644
index b850d32aaa..0000000000
--- a/metadata/uk/changelogs/41.txt
+++ /dev/null
@@ -1 +0,0 @@
-- Виправлено помилку компілювання F-Droid
diff --git a/metadata/uk/changelogs/42.txt b/metadata/uk/changelogs/42.txt
deleted file mode 100644
index 5090d1c8ad..0000000000
--- a/metadata/uk/changelogs/42.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-- Не закривати сторінку зміни події, коли телефон повернуто
-- Сповіщення календаря за календарем
-- Додано налаштування: Не перевіряти оптимізацію заряду акумулятора
diff --git a/metadata/vi/changelogs/10.txt b/metadata/vi/changelogs/10.txt
deleted file mode 100644
index 3b91ad50ba..0000000000
--- a/metadata/vi/changelogs/10.txt
+++ /dev/null
@@ -1 +0,0 @@
-- Thêm chủ đề tối.
diff --git a/metadata/vi/changelogs/11.txt b/metadata/vi/changelogs/11.txt
deleted file mode 100644
index 783c6ec596..0000000000
--- a/metadata/vi/changelogs/11.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-- Thêm tùy chọn để chọn ngày trong Tuần.
-- Thêm tùy chọn hiển thị kiểu xem mặc định khi khởi động.
-- Sửa lỗi.
diff --git a/metadata/vi/changelogs/13.txt b/metadata/vi/changelogs/13.txt
deleted file mode 100644
index 4639cd2b61..0000000000
--- a/metadata/vi/changelogs/13.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-- Hỗ trợ chia sẻ lịch qua ics và khả năng nhập/xuất từ thẻ sd.
-- Loại bỏ các quyền không sử dụng.
-- Sửa lỗi cài đặt âm thanh trên Android 6.
-- Rất nhiều bản sửa lỗi.
diff --git a/metadata/vi/changelogs/14.txt b/metadata/vi/changelogs/14.txt
deleted file mode 100644
index 9a8e104b01..0000000000
--- a/metadata/vi/changelogs/14.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-- Yêu cầu quyền khi chạy trên Android 6 trở lên.
-- Khắc phục sự cố khi khởi động.
-- Cho phép người dùng bóp màn hình để có thể nhìn thấy cả ngày.
-- Đặt giây về 0 khi tạo sự kiện mới.
-- Sửa lỗi bố cục nhỏ.
-- Rất nhiều bản sửa lỗi.
diff --git a/metadata/vi/changelogs/15.txt b/metadata/vi/changelogs/15.txt
deleted file mode 100644
index 25b7bed8f0..0000000000
--- a/metadata/vi/changelogs/15.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-- Yêu cầu quyền khi chạy trên Android 6 trở lên.
-- Hỗ trợ hiển thị âm lịch/lễ hội khi Ngôn ngữ là tiếng Trung.
-- Cập nhật bản dịch.
-- Sửa lỗi bố cục nhỏ.
-- Rất nhiều bản sửa lỗi.
diff --git a/metadata/vi/changelogs/16.txt b/metadata/vi/changelogs/16.txt
deleted file mode 100644
index 541a291131..0000000000
--- a/metadata/vi/changelogs/16.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-- Đã bỏ tiện ích này, hãy sử dụng Tiện ích Lịch ngay bây giờ: https://f-droid.org/de/packages/com.plusonelabs.calendar/.
-- Hỗ trợ các sự kiện màu tùy chỉnh.
-- Hỗ trợ tốt hơn cho các tập tin ics.
-- Thêm chủ đề màu xám.
-- Hỗ trợ khả năng hiển thị bí mật.
-- Hỗ trợ các kênh thông báo Android mới.
-- Rất nhiều bản sửa lỗi.
diff --git a/metadata/vi/changelogs/17.txt b/metadata/vi/changelogs/17.txt
deleted file mode 100644
index 84c91719d2..0000000000
--- a/metadata/vi/changelogs/17.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-- Cải thiện chế độ xem tháng.
-- Quyền đọc danh bạ lại là tùy chọn.
-- Hộp văn bản đẹp hơn trong lúc tạo sự kiện.
-- Sửa lỗi nhỏ.
diff --git a/metadata/vi/changelogs/18.txt b/metadata/vi/changelogs/18.txt
deleted file mode 100644
index 7a1db0916b..0000000000
--- a/metadata/vi/changelogs/18.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-- Đã sửa lỗi trong kiểu xem tháng.
-- Đã sửa chủ đề tối trên máy tính bảng.
-- Bản dịch mới.
diff --git a/metadata/vi/changelogs/19.txt b/metadata/vi/changelogs/19.txt
deleted file mode 100644
index 357d409bcf..0000000000
--- a/metadata/vi/changelogs/19.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-- Sửa lỗi thông báo.
-- Bản dịch mới.
diff --git a/metadata/vi/changelogs/20.txt b/metadata/vi/changelogs/20.txt
deleted file mode 100644
index 0d39729fe2..0000000000
--- a/metadata/vi/changelogs/20.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-- Cần thêm thông báo để đồng bộ hóa cảnh báo nội bộ. Hãy tắt tiếng.
-- Không còn yêu cầu quyền không cần thiết.
-- Biểu tượng thông báo màu.
-- Sửa lỗi.
-- Bản dịch mới.
diff --git a/metadata/vi/changelogs/21.txt b/metadata/vi/changelogs/21.txt
deleted file mode 100644
index bd7b7708b2..0000000000
--- a/metadata/vi/changelogs/21.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-- Sửa lỗi.
-- Bản dịch mới.
diff --git a/metadata/vi/changelogs/22.txt b/metadata/vi/changelogs/22.txt
deleted file mode 100644
index 9c4372cd1f..0000000000
--- a/metadata/vi/changelogs/22.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-- Thêm lịch ngoại tuyến.
-- Thêm lối tắt cho sự kiện mới.
-- Thiết kế sở thích mới.
-- Bộ chọn ngày giờ mới.
-- Chuyển giấy phép sang GPLv3.
-- Sửa lỗi.
-- Bản dịch mới.
diff --git a/metadata/vi/changelogs/23.txt b/metadata/vi/changelogs/23.txt
deleted file mode 100644
index 0c7736689f..0000000000
--- a/metadata/vi/changelogs/23.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-- Sửa lỗi hiển thị các tùy chọn.
-- Bản dịch mới.
diff --git a/metadata/vi/changelogs/24.txt b/metadata/vi/changelogs/24.txt
deleted file mode 100644
index 532ea1c7bb..0000000000
--- a/metadata/vi/changelogs/24.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-- Giảm kích thước phông chữ của tên sự kiện trong kiểu xem theo tuần
-- Kích hoạt đề xuất tìm kiếm gần đây
-- Sửa lỗi xuất sang thẻ SD
-- Gạch ngang tiêu đề của các sự kiện bị hủy
-- Tận dụng cài đặt chủ đề hệ thống trên android 10
-- Bản dịch mới
-- Sửa lỗi
diff --git a/metadata/vi/changelogs/25.txt b/metadata/vi/changelogs/25.txt
deleted file mode 100644
index 7e0d7750bb..0000000000
--- a/metadata/vi/changelogs/25.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-- Khôi phục cơ sở dữ liệu múi giờ
-- Biểu tượng ứng dụng SVG
-- Làm lại và kích hoạt lại tiện ích
-- Bản dịch mới
diff --git a/metadata/vi/changelogs/26.txt b/metadata/vi/changelogs/26.txt
deleted file mode 100644
index ac73a1be75..0000000000
--- a/metadata/vi/changelogs/26.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-- Làm lại chỉnh sửa bố cục sự kiện
-- Bỏ hỗ trợ cho Android 4.4
-- Sửa lỗi chung
-- Bản dịch mới
diff --git a/metadata/vi/changelogs/27.txt b/metadata/vi/changelogs/27.txt
deleted file mode 100644
index 0ad7486801..0000000000
--- a/metadata/vi/changelogs/27.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-- Sửa lỗi chung
-- Bản dịch mới
diff --git a/metadata/vi/changelogs/28.txt b/metadata/vi/changelogs/28.txt
deleted file mode 100644
index 0ad7486801..0000000000
--- a/metadata/vi/changelogs/28.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-- Sửa lỗi chung
-- Bản dịch mới
diff --git a/metadata/vi/changelogs/29.txt b/metadata/vi/changelogs/29.txt
deleted file mode 100644
index f4ae72cf6c..0000000000
--- a/metadata/vi/changelogs/29.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-- Hỗ trợ Android 12
-- Hỗ trợ thiết kế Material You
-- Xóa kết nối với dịch vụ Android để sao lưu cơ sở dữ liệu (bị hỏng ở hầu hết các phiên bản Android)
-- Sửa lỗi chung
-- Bản dịch mới
diff --git a/metadata/vi/changelogs/30.txt b/metadata/vi/changelogs/30.txt
deleted file mode 100644
index 928c8c4bf8..0000000000
--- a/metadata/vi/changelogs/30.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-- Sửa thông báo trên Android 12
-- Thêm DecSync và Birthday Adapter vào các ứng dụng "đã biết" và không gặp sự cố
diff --git a/metadata/vi/changelogs/31.txt b/metadata/vi/changelogs/31.txt
deleted file mode 100644
index fc6005f73a..0000000000
--- a/metadata/vi/changelogs/31.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-- Khắc phục sự cố và thông báo trên Android 12
-- Sửa lỗi loại sự kiện chia sẻ MIME
diff --git a/metadata/vi/changelogs/32.txt b/metadata/vi/changelogs/32.txt
deleted file mode 100644
index f63634a618..0000000000
--- a/metadata/vi/changelogs/32.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-- Tạo và hiển thị lời nhắc sau khi bắt đầu sự kiện bằng hộp kiểm
-- Sửa chữa lời nhắc có giá trị âm
-- Sửa thời gian không hợp lệ do thay đổi múi giờ
-- Tùy chọn thêm sự kiện mới từ màn hình tiện ích
-- Làm lại màu chủ đề
-- Sửa lỗi
-- Bản dịch mới
diff --git a/metadata/vi/changelogs/33.txt b/metadata/vi/changelogs/33.txt
deleted file mode 100644
index 6202c30f40..0000000000
--- a/metadata/vi/changelogs/33.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-- Thêm tùy chọn để nhân bản các sự kiện
-- Hiển thị các ngày trong tuần trên máy tính bảng
-- Khắc phục sự cố khi mở sự kiện có ID rất lớn
-- Làm lại lịch thu nhỏ trong chế độ xem máy tính bảng
-- Thêm hỗ trợ cho Biểu tượng ứng dụng theo chủ đề trong Android 13
-- Hiển thị các sự kiện nhiều ngày với điểm bắt đầu và điểm kết thúc chính xác
-- Sửa lỗi
-- Bản dịch mới
diff --git a/metadata/vi/changelogs/34.txt b/metadata/vi/changelogs/34.txt
deleted file mode 100644
index f964b6dfbd..0000000000
--- a/metadata/vi/changelogs/34.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-- Sửa lỗi
-- Bản dịch mới
diff --git a/metadata/vi/changelogs/35.txt b/metadata/vi/changelogs/35.txt
deleted file mode 100644
index e94e6dce7b..0000000000
--- a/metadata/vi/changelogs/35.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-- Thêm khung điền url
-- Sửa lỗi
-- Bản dịch mới
diff --git a/metadata/vi/changelogs/36.txt b/metadata/vi/changelogs/36.txt
deleted file mode 100644
index f964b6dfbd..0000000000
--- a/metadata/vi/changelogs/36.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-- Sửa lỗi
-- Bản dịch mới
diff --git a/metadata/vi/changelogs/37.txt b/metadata/vi/changelogs/37.txt
deleted file mode 100644
index 199f77e246..0000000000
--- a/metadata/vi/changelogs/37.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-- Thêm hỗ trợ ngôn ngữ cho mỗi ứng dụng (android 13 trở lên)
-- Thêm thao tác vuốt sang trái/phải để xem theo tháng
-- Sửa lỗi
-- Bản dịch mới
diff --git a/metadata/vi/changelogs/38.txt b/metadata/vi/changelogs/38.txt
deleted file mode 100644
index ef2d402c60..0000000000
--- a/metadata/vi/changelogs/38.txt
+++ /dev/null
@@ -1 +0,0 @@
-- Khắc phục sự cố xảy ra với sự kiện định kỳ
diff --git a/metadata/vi/changelogs/39.txt b/metadata/vi/changelogs/39.txt
deleted file mode 100644
index 581e210046..0000000000
--- a/metadata/vi/changelogs/39.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-- Khắc phục sự cố khi xem tháng và tuần do quy tắc không hợp lệ
-- Sửa lỗi
diff --git a/metadata/vi/changelogs/40.txt b/metadata/vi/changelogs/40.txt
deleted file mode 100644
index dc94c6b22b..0000000000
--- a/metadata/vi/changelogs/40.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-- Với đầy hi vọng thì cuối cùng đã khắc phục được sự cố khi xem tháng và tuần do quy tắc không hợp lệ
-- Sửa lỗi
diff --git a/metadata/vi/changelogs/6.txt b/metadata/vi/changelogs/6.txt
deleted file mode 100644
index e2ea68082b..0000000000
--- a/metadata/vi/changelogs/6.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-- Loại bỏ quyền truy cập Internet trong khi vẫn giữ nguyên chức năng.
-- Thêm 'Đi tới...'.
-- Khắc phục: Tiện ích lịch biểu không cập nhật hàng ngày.
diff --git a/metadata/vi/changelogs/9.txt b/metadata/vi/changelogs/9.txt
deleted file mode 100644
index c2330caa12..0000000000
--- a/metadata/vi/changelogs/9.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-- Một số thay đổi giao diện người dùng tốt hơn.
-- Cập nhật bản dịch tiếng Thụy Điển.
-- Sửa lỗi.
diff --git a/metadata/vi/full_description.txt b/metadata/vi/full_description.txt
deleted file mode 100644
index f253fefc57..0000000000
--- a/metadata/vi/full_description.txt
+++ /dev/null
@@ -1,12 +0,0 @@
-Tính năng:
-- Kiểu xem tháng.
-- Kiểu xem tuần, ngày và lịch biểu.
-- Sử dụng đồng bộ lịch Android. Hoạt động với Lịch Google, Exchange, vv.
-- Thiết kế Vật liệu.
-- Chủ đề tối và sáng.
-- Miễn phí, nguồn mở và hoàn toàn không có quảng cáo.
-- Hỗ trợ chia sẻ lịch qua ICS và khả năng nhập/xuất từ thẻ SD.
-- Giao diện người dùng đa ngôn ngữ.
-
-Lỗi và phản hồi: https://github.com/Etar-Group/Etar-Calendar/issues
-Mã nguồn: https://github.com/Etar-Group/Etar-Calendar
diff --git a/metadata/vi/short_description.txt b/metadata/vi/short_description.txt
index 9a83d3e715..c4ba50f0d6 100644
--- a/metadata/vi/short_description.txt
+++ b/metadata/vi/short_description.txt
@@ -1 +1 @@
-Etar là một lịch nguồn mở được thiết kế kiểu vật liệu dành cho tất cả mọi người!
+Etar lý nguyên vật liệu thiết kế lịch mã nguồn mở, cho mọi người!
diff --git a/metadata/vi/title.txt b/metadata/vi/title.txt
deleted file mode 100644
index 9abf501aa3..0000000000
--- a/metadata/vi/title.txt
+++ /dev/null
@@ -1 +0,0 @@
-Etar - Lịch nguồn mở
diff --git a/metadata/zgh/title.txt b/metadata/zgh/title.txt
deleted file mode 100644
index 9ce55cb2f8..0000000000
--- a/metadata/zgh/title.txt
+++ /dev/null
@@ -1 +0,0 @@
-ⵉⵜⴰⵔ -ⴰⵙⵎⵍⵓⵙⵙⴰ ⵉⵍⴻⵍⵍⵉ