Merge tag android-5.1.0_r1 into AOSP_5.1_MERGE
Change-Id: Id53e3396f8b33ef71d950363d51d2864535828f2
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index c81ac36..f401d65 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -17,7 +17,7 @@
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
package="com.android.exchange"
- android:versionCode="500064" >
+ android:versionCode="500065" >
<uses-permission
android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
diff --git a/res/mipmap-hdpi/icon.png b/res/mipmap-hdpi/icon.png
index 6fd0a98..608547a 100644
--- a/res/mipmap-hdpi/icon.png
+++ b/res/mipmap-hdpi/icon.png
Binary files differ
diff --git a/res/mipmap-mdpi/icon.png b/res/mipmap-mdpi/icon.png
index 0369413..c028d3a 100644
--- a/res/mipmap-mdpi/icon.png
+++ b/res/mipmap-mdpi/icon.png
Binary files differ
diff --git a/res/mipmap-xhdpi/icon.png b/res/mipmap-xhdpi/icon.png
index 777ef30..7e36d8e 100644
--- a/res/mipmap-xhdpi/icon.png
+++ b/res/mipmap-xhdpi/icon.png
Binary files differ
diff --git a/res/mipmap-xxhdpi/icon.png b/res/mipmap-xxhdpi/icon.png
new file mode 100644
index 0000000..ace512b
--- /dev/null
+++ b/res/mipmap-xxhdpi/icon.png
Binary files differ
diff --git a/res/mipmap-xxxhdpi/icon.png b/res/mipmap-xxxhdpi/icon.png
new file mode 100644
index 0000000..7abdb00
--- /dev/null
+++ b/res/mipmap-xxxhdpi/icon.png
Binary files differ
diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml
index c0f8d18..f813479 100644
--- a/res/values-af/strings.xml
+++ b/res/values-af/strings.xml
@@ -27,7 +27,6 @@
<string name="meeting_recurring" msgid="2752008481765880928">"Wanneer: <xliff:g id="EVENTDATE">%s</xliff:g> (herhalend)"</string>
<string name="meeting_allday" msgid="7251209063071628040">"Wanneer: <xliff:g id="EVENTDATE">%s</xliff:g> (hele dag)"</string>
<string name="meeting_allday_recurring" msgid="4545762363537362545">"Wanneer: <xliff:g id="EVENTDATE">%s</xliff:g> (die hele dag, herhalend)"</string>
- <string name="notification_exchange_calendar_added" msgid="8998454267739748113">"Exchange-kalender bygevoeg"</string>
<string name="app_name" msgid="1707639359526090662">"Exchange-dienste"</string>
<string name="exception_cancel" msgid="8972887597771126871">"Hierdie gebeurtenis is gekanselleer vir: <xliff:g id="DATE">%s</xliff:g>"</string>
<string name="exception_updated" msgid="329192591551400871">"Die details van hierdie gebeurtenis het verander vir: <xliff:g id="DATE">%s</xliff:g>"</string>
diff --git a/res/values-am/strings.xml b/res/values-am/strings.xml
index 90d9d18..81b0f24 100644
--- a/res/values-am/strings.xml
+++ b/res/values-am/strings.xml
@@ -27,7 +27,6 @@
<string name="meeting_recurring" msgid="2752008481765880928">"መቼ፡ <xliff:g id="EVENTDATE">%s</xliff:g>(ድግግሞሽ)"</string>
<string name="meeting_allday" msgid="7251209063071628040">"የሚከተለው ሲሆን፤ <xliff:g id="EVENTDATE">%s</xliff:g> (ሁሉም ቀን)"</string>
<string name="meeting_allday_recurring" msgid="4545762363537362545">"የሚከተለው ሲሆን፤ <xliff:g id="EVENTDATE">%s</xliff:g> (ሁሉም ቀን፣ ተደጋጋሚ)"</string>
- <string name="notification_exchange_calendar_added" msgid="8998454267739748113">"የቀን መቁጠሪያ ልውውጥ ታክሏል"</string>
<string name="app_name" msgid="1707639359526090662">"Exchange አገልግሎቶች"</string>
<string name="exception_cancel" msgid="8972887597771126871">"ይህ ከስተት ለ<xliff:g id="DATE">%s</xliff:g> ተሰርዟል።"</string>
<string name="exception_updated" msgid="329192591551400871">"የዚህ ክስተት ዝርዝሮች ለ፡<xliff:g id="DATE">%s</xliff:g> ተለውጠዋል"</string>
diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml
index 7f7d843..ee7f533 100644
--- a/res/values-ar/strings.xml
+++ b/res/values-ar/strings.xml
@@ -27,7 +27,6 @@
<string name="meeting_recurring" msgid="2752008481765880928">"الموعد: <xliff:g id="EVENTDATE">%s</xliff:g> (متكرر)"</string>
<string name="meeting_allday" msgid="7251209063071628040">"الموعد: <xliff:g id="EVENTDATE">%s</xliff:g> (اليوم كله)"</string>
<string name="meeting_allday_recurring" msgid="4545762363537362545">"الموعد: <xliff:g id="EVENTDATE">%s</xliff:g> (اليوم كله، بشكل متكرر)"</string>
- <string name="notification_exchange_calendar_added" msgid="8998454267739748113">"تمت إضافة تقويم Exchange"</string>
<string name="app_name" msgid="1707639359526090662">"خدمات Exchange"</string>
<string name="exception_cancel" msgid="8972887597771126871">"تم إلغاء هذا الحدث لـ: <xliff:g id="DATE">%s</xliff:g>"</string>
<string name="exception_updated" msgid="329192591551400871">"تم تغيير التفاصيل لهذا الحدث لـ: <xliff:g id="DATE">%s</xliff:g>"</string>
diff --git a/res/values-bg/strings.xml b/res/values-bg/strings.xml
index b46ec1b..9fde3cd 100644
--- a/res/values-bg/strings.xml
+++ b/res/values-bg/strings.xml
@@ -27,7 +27,6 @@
<string name="meeting_recurring" msgid="2752008481765880928">"Кога: <xliff:g id="EVENTDATE">%s</xliff:g> (с повторения)"</string>
<string name="meeting_allday" msgid="7251209063071628040">"Кога: <xliff:g id="EVENTDATE">%s</xliff:g> (цял ден)"</string>
<string name="meeting_allday_recurring" msgid="4545762363537362545">"Кога: <xliff:g id="EVENTDATE">%s</xliff:g> (цял ден, периодично)"</string>
- <string name="notification_exchange_calendar_added" msgid="8998454267739748113">"Добавен е календар от Exchange"</string>
<string name="app_name" msgid="1707639359526090662">"Услуги на Exchange"</string>
<string name="exception_cancel" msgid="8972887597771126871">"Това събитие от <xliff:g id="DATE">%s</xliff:g> е анулирано"</string>
<string name="exception_updated" msgid="329192591551400871">"Подробностите за това събитие са променени за: <xliff:g id="DATE">%s</xliff:g>"</string>
diff --git a/res/values-bn-rBD/strings.xml b/res/values-bn-rBD/strings.xml
index bf3845f..d02d795 100644
--- a/res/values-bn-rBD/strings.xml
+++ b/res/values-bn-rBD/strings.xml
@@ -27,7 +27,6 @@
<string name="meeting_recurring" msgid="2752008481765880928">"কখন: <xliff:g id="EVENTDATE">%s</xliff:g> (পুনরাবৃত্তি)"</string>
<string name="meeting_allday" msgid="7251209063071628040">"কখন: <xliff:g id="EVENTDATE">%s</xliff:g> (সারা দিন)"</string>
<string name="meeting_allday_recurring" msgid="4545762363537362545">"কখন: <xliff:g id="EVENTDATE">%s</xliff:g> (সারা দিন, পুনরাবৃত্তি)"</string>
- <string name="notification_exchange_calendar_added" msgid="8998454267739748113">"Exchange ক্যালেন্ডার জোড়া হয়েছে"</string>
<string name="app_name" msgid="1707639359526090662">"Exchange পরিষেবাদি"</string>
<string name="exception_cancel" msgid="8972887597771126871">"এই তারিখের এই ইভেন্টটি বাতিল করা হয়েছে: <xliff:g id="DATE">%s</xliff:g>"</string>
<string name="exception_updated" msgid="329192591551400871">"এই তারিখের এই ইভেন্টটির বিশদ বিবরণ পরিবর্তন করা হয়েছে: <xliff:g id="DATE">%s</xliff:g>"</string>
diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml
index 10f6b44..e544331 100644
--- a/res/values-ca/strings.xml
+++ b/res/values-ca/strings.xml
@@ -27,7 +27,6 @@
<string name="meeting_recurring" msgid="2752008481765880928">"Quan: <xliff:g id="EVENTDATE">%s</xliff:g> (periòdica)"</string>
<string name="meeting_allday" msgid="7251209063071628040">"Quan: <xliff:g id="EVENTDATE">%s</xliff:g> (tot el dia)"</string>
<string name="meeting_allday_recurring" msgid="4545762363537362545">"Quan: <xliff:g id="EVENTDATE">%s</xliff:g> (tot el dia, periòdic)"</string>
- <string name="notification_exchange_calendar_added" msgid="8998454267739748113">"S\'ha afegit el calendari d\'Exchange."</string>
<string name="app_name" msgid="1707639359526090662">"Serveis d\'Exchange"</string>
<string name="exception_cancel" msgid="8972887597771126871">"Aquest esdeveniment s\'ha cancel·lat al dia <xliff:g id="DATE">%s</xliff:g>"</string>
<string name="exception_updated" msgid="329192591551400871">"Els detalls d\'aquest esdeveniment han canviat al dia <xliff:g id="DATE">%s</xliff:g>"</string>
diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml
index 0d31764..bb6892d 100644
--- a/res/values-cs/strings.xml
+++ b/res/values-cs/strings.xml
@@ -27,7 +27,6 @@
<string name="meeting_recurring" msgid="2752008481765880928">"Kdy: <xliff:g id="EVENTDATE">%s</xliff:g> (pravidelně)"</string>
<string name="meeting_allday" msgid="7251209063071628040">"Kdy: <xliff:g id="EVENTDATE">%s</xliff:g> (celý den)"</string>
<string name="meeting_allday_recurring" msgid="4545762363537362545">"Kdy: <xliff:g id="EVENTDATE">%s</xliff:g> (celý den, opakující se)"</string>
- <string name="notification_exchange_calendar_added" msgid="8998454267739748113">"Kalendář Exchange byl přidán"</string>
<string name="app_name" msgid="1707639359526090662">"Služby Exchange"</string>
<string name="exception_cancel" msgid="8972887597771126871">"Tato událost byla zrušena pro datum: <xliff:g id="DATE">%s</xliff:g>"</string>
<string name="exception_updated" msgid="329192591551400871">"Podrobnosti této události byly změněny pro datum: <xliff:g id="DATE">%s</xliff:g>"</string>
diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml
index 9f88fce..ca6dfa3 100644
--- a/res/values-da/strings.xml
+++ b/res/values-da/strings.xml
@@ -27,7 +27,6 @@
<string name="meeting_recurring" msgid="2752008481765880928">"Hvornår: <xliff:g id="EVENTDATE">%s</xliff:g> (flere gange)"</string>
<string name="meeting_allday" msgid="7251209063071628040">"Hvornår: <xliff:g id="EVENTDATE">%s</xliff:g> (hele dagen)"</string>
<string name="meeting_allday_recurring" msgid="4545762363537362545">"Hvornår: <xliff:g id="EVENTDATE">%s</xliff:g> (hele dagen, tilbagevendende)"</string>
- <string name="notification_exchange_calendar_added" msgid="8998454267739748113">"Exchange-kalender er tilføjet"</string>
<string name="app_name" msgid="1707639359526090662">"Exchange-tjenester"</string>
<string name="exception_cancel" msgid="8972887597771126871">"Denne begivenhed er annulleret for: <xliff:g id="DATE">%s</xliff:g>"</string>
<string name="exception_updated" msgid="329192591551400871">"Oplysningerne om denne begivenhed er ændret for: <xliff:g id="DATE">%s</xliff:g>"</string>
diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml
index 7899e41..46be3e9 100644
--- a/res/values-de/strings.xml
+++ b/res/values-de/strings.xml
@@ -27,7 +27,6 @@
<string name="meeting_recurring" msgid="2752008481765880928">"Wann: <xliff:g id="EVENTDATE">%s</xliff:g> (wiederkehrend)"</string>
<string name="meeting_allday" msgid="7251209063071628040">"Wann: <xliff:g id="EVENTDATE">%s</xliff:g> (ganztägig)"</string>
<string name="meeting_allday_recurring" msgid="4545762363537362545">"Wann: <xliff:g id="EVENTDATE">%s</xliff:g> (ganztägig, wiederkehrend)"</string>
- <string name="notification_exchange_calendar_added" msgid="8998454267739748113">"Exchange-Kalender hinzugefügt"</string>
<string name="app_name" msgid="1707639359526090662">"Exchange-Dienste"</string>
<string name="exception_cancel" msgid="8972887597771126871">"Dieser Termin wurde storniert für: <xliff:g id="DATE">%s</xliff:g>"</string>
<string name="exception_updated" msgid="329192591551400871">"Die Details dieses Termins wurden geändert für: <xliff:g id="DATE">%s</xliff:g>"</string>
diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml
index 7cea09a..1eda34b 100644
--- a/res/values-el/strings.xml
+++ b/res/values-el/strings.xml
@@ -27,7 +27,6 @@
<string name="meeting_recurring" msgid="2752008481765880928">"Πότε: <xliff:g id="EVENTDATE">%s</xliff:g> (επαναλαμβανόμενο)"</string>
<string name="meeting_allday" msgid="7251209063071628040">"Πότε: <xliff:g id="EVENTDATE">%s</xliff:g> (όλη την ημέρα)"</string>
<string name="meeting_allday_recurring" msgid="4545762363537362545">"Πότε: <xliff:g id="EVENTDATE">%s</xliff:g> (όλη την ημέρα, επαναλαμβανόμενα)"</string>
- <string name="notification_exchange_calendar_added" msgid="8998454267739748113">"Προστέθηκε ημερολόγιο Exchange"</string>
<string name="app_name" msgid="1707639359526090662">"Υπηρεσίες Exchange"</string>
<string name="exception_cancel" msgid="8972887597771126871">"Αυτό το συμβάν ακυρώθηκε για: <xliff:g id="DATE">%s</xliff:g>"</string>
<string name="exception_updated" msgid="329192591551400871">"Οι λεπτομέρειες αυτού του συμβάντος άλλαξαν για: <xliff:g id="DATE">%s</xliff:g>"</string>
diff --git a/res/values-en-rGB/strings.xml b/res/values-en-rGB/strings.xml
index e301341..a11ad35 100644
--- a/res/values-en-rGB/strings.xml
+++ b/res/values-en-rGB/strings.xml
@@ -27,7 +27,6 @@
<string name="meeting_recurring" msgid="2752008481765880928">"When: <xliff:g id="EVENTDATE">%s</xliff:g> (recurring)"</string>
<string name="meeting_allday" msgid="7251209063071628040">"When: <xliff:g id="EVENTDATE">%s</xliff:g> (all day)"</string>
<string name="meeting_allday_recurring" msgid="4545762363537362545">"When: <xliff:g id="EVENTDATE">%s</xliff:g> (all day, recurring)"</string>
- <string name="notification_exchange_calendar_added" msgid="8998454267739748113">"Exchange calendar added"</string>
<string name="app_name" msgid="1707639359526090662">"Exchange Services"</string>
<string name="exception_cancel" msgid="8972887597771126871">"This event has been cancelled for: <xliff:g id="DATE">%s</xliff:g>"</string>
<string name="exception_updated" msgid="329192591551400871">"The details of this event have been changed for: <xliff:g id="DATE">%s</xliff:g>"</string>
diff --git a/res/values-en-rIN/strings.xml b/res/values-en-rIN/strings.xml
index e301341..a11ad35 100644
--- a/res/values-en-rIN/strings.xml
+++ b/res/values-en-rIN/strings.xml
@@ -27,7 +27,6 @@
<string name="meeting_recurring" msgid="2752008481765880928">"When: <xliff:g id="EVENTDATE">%s</xliff:g> (recurring)"</string>
<string name="meeting_allday" msgid="7251209063071628040">"When: <xliff:g id="EVENTDATE">%s</xliff:g> (all day)"</string>
<string name="meeting_allday_recurring" msgid="4545762363537362545">"When: <xliff:g id="EVENTDATE">%s</xliff:g> (all day, recurring)"</string>
- <string name="notification_exchange_calendar_added" msgid="8998454267739748113">"Exchange calendar added"</string>
<string name="app_name" msgid="1707639359526090662">"Exchange Services"</string>
<string name="exception_cancel" msgid="8972887597771126871">"This event has been cancelled for: <xliff:g id="DATE">%s</xliff:g>"</string>
<string name="exception_updated" msgid="329192591551400871">"The details of this event have been changed for: <xliff:g id="DATE">%s</xliff:g>"</string>
diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml
index 6ba3b5e..c52100c 100644
--- a/res/values-es-rUS/strings.xml
+++ b/res/values-es-rUS/strings.xml
@@ -27,7 +27,6 @@
<string name="meeting_recurring" msgid="2752008481765880928">"Cuando: <xliff:g id="EVENTDATE">%s</xliff:g> (recurrente)"</string>
<string name="meeting_allday" msgid="7251209063071628040">"Cuándo: <xliff:g id="EVENTDATE">%s</xliff:g> (todo el día)"</string>
<string name="meeting_allday_recurring" msgid="4545762363537362545">"Cuándo: <xliff:g id="EVENTDATE">%s</xliff:g> (todo el día, se repite)"</string>
- <string name="notification_exchange_calendar_added" msgid="8998454267739748113">"Calendario de Exchange agregado"</string>
<string name="app_name" msgid="1707639359526090662">"Servicios de Exchange"</string>
<string name="exception_cancel" msgid="8972887597771126871">"Este evento ha sido cancelado para: <xliff:g id="DATE">%s</xliff:g>"</string>
<string name="exception_updated" msgid="329192591551400871">"Los detalles de este evento se han modificado para: <xliff:g id="DATE">%s</xliff:g>"</string>
diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml
index 46067d5..5a30fd4 100644
--- a/res/values-es/strings.xml
+++ b/res/values-es/strings.xml
@@ -27,7 +27,6 @@
<string name="meeting_recurring" msgid="2752008481765880928">"Cuándo: <xliff:g id="EVENTDATE">%s</xliff:g> (periódico)"</string>
<string name="meeting_allday" msgid="7251209063071628040">"Cuando: <xliff:g id="EVENTDATE">%s</xliff:g> (todo el día)"</string>
<string name="meeting_allday_recurring" msgid="4545762363537362545">"Cuando: <xliff:g id="EVENTDATE">%s</xliff:g> (todo el día, periódico)"</string>
- <string name="notification_exchange_calendar_added" msgid="8998454267739748113">"Se ha añadido un calendario de Exchange"</string>
<string name="app_name" msgid="1707639359526090662">"Servicios de Exchange"</string>
<string name="exception_cancel" msgid="8972887597771126871">"Este evento se ha cancelado el día: <xliff:g id="DATE">%s</xliff:g>"</string>
<string name="exception_updated" msgid="329192591551400871">"Los detalles de este evento se han cambiado al día: <xliff:g id="DATE">%s</xliff:g>"</string>
diff --git a/res/values-et-rEE/strings.xml b/res/values-et-rEE/strings.xml
index 4618fb7..a4d193a 100644
--- a/res/values-et-rEE/strings.xml
+++ b/res/values-et-rEE/strings.xml
@@ -27,7 +27,6 @@
<string name="meeting_recurring" msgid="2752008481765880928">"Millal: <xliff:g id="EVENTDATE">%s</xliff:g> (korduv)"</string>
<string name="meeting_allday" msgid="7251209063071628040">"Toimumisaeg: <xliff:g id="EVENTDATE">%s</xliff:g> (terve päev)"</string>
<string name="meeting_allday_recurring" msgid="4545762363537362545">"Toimumisaeg: <xliff:g id="EVENTDATE">%s</xliff:g> (terve päev, korduv)"</string>
- <string name="notification_exchange_calendar_added" msgid="8998454267739748113">"Exchange\'i kalender on lisatud"</string>
<string name="app_name" msgid="1707639359526090662">"Exchange\'i teenused"</string>
<string name="exception_cancel" msgid="8972887597771126871">"See sündmus on tühistatud: <xliff:g id="DATE">%s</xliff:g>"</string>
<string name="exception_updated" msgid="329192591551400871">"Selle sündmuse andmed on muutunud: <xliff:g id="DATE">%s</xliff:g>"</string>
diff --git a/res/values-eu-rES/strings.xml b/res/values-eu-rES/strings.xml
index 1433080..364a3e3 100644
--- a/res/values-eu-rES/strings.xml
+++ b/res/values-eu-rES/strings.xml
@@ -27,7 +27,6 @@
<string name="meeting_recurring" msgid="2752008481765880928">"Data: <xliff:g id="EVENTDATE">%s</xliff:g> (errepikakorra)"</string>
<string name="meeting_allday" msgid="7251209063071628040">"Noiz: <xliff:g id="EVENTDATE">%s</xliff:g> (egun osoa)"</string>
<string name="meeting_allday_recurring" msgid="4545762363537362545">"Noiz: <xliff:g id="EVENTDATE">%s</xliff:g> (egun osoa, errepikaria)"</string>
- <string name="notification_exchange_calendar_added" msgid="8998454267739748113">"Exchange egutegia gehitu da"</string>
<string name="app_name" msgid="1707639359526090662">"Exchange zerbitzuak"</string>
<string name="exception_cancel" msgid="8972887597771126871">"Data honetako gertaera bertan behera utzi da: <xliff:g id="DATE">%s</xliff:g>"</string>
<string name="exception_updated" msgid="329192591551400871">"Data honetako gertaeraren xehetasunak aldatu egin dira: <xliff:g id="DATE">%s</xliff:g>"</string>
diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml
index a9f0d50..6455291 100644
--- a/res/values-fa/strings.xml
+++ b/res/values-fa/strings.xml
@@ -27,7 +27,6 @@
<string name="meeting_recurring" msgid="2752008481765880928">"زمان: <xliff:g id="EVENTDATE">%s</xliff:g> (تکرار)"</string>
<string name="meeting_allday" msgid="7251209063071628040">"زمان: <xliff:g id="EVENTDATE">%s</xliff:g> (در تمام طول روز)"</string>
<string name="meeting_allday_recurring" msgid="4545762363537362545">"زمان: <xliff:g id="EVENTDATE">%s</xliff:g> (در تمام طول روز، بهصورت تکراری)"</string>
- <string name="notification_exchange_calendar_added" msgid="8998454267739748113">"تقویم Exchange اضافه شد"</string>
<string name="app_name" msgid="1707639359526090662">"سرویسهای Exchange"</string>
<string name="exception_cancel" msgid="8972887597771126871">"این رویداد لغو شده است به مدت: <xliff:g id="DATE">%s</xliff:g>"</string>
<string name="exception_updated" msgid="329192591551400871">"جزئیات این رویداد تغییر کردهاند به مدت: <xliff:g id="DATE">%s</xliff:g>"</string>
diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml
index 1355b87..0892030 100644
--- a/res/values-fi/strings.xml
+++ b/res/values-fi/strings.xml
@@ -27,7 +27,6 @@
<string name="meeting_recurring" msgid="2752008481765880928">"Milloin: <xliff:g id="EVENTDATE">%s</xliff:g> (toistuva)"</string>
<string name="meeting_allday" msgid="7251209063071628040">"Milloin: <xliff:g id="EVENTDATE">%s</xliff:g> (koko päivän)"</string>
<string name="meeting_allday_recurring" msgid="4545762363537362545">"Milloin: <xliff:g id="EVENTDATE">%s</xliff:g> (koko päivän, toistuva)"</string>
- <string name="notification_exchange_calendar_added" msgid="8998454267739748113">"Exchange-kalenteri lisätty"</string>
<string name="app_name" msgid="1707639359526090662">"Exchange Services"</string>
<string name="exception_cancel" msgid="8972887597771126871">"Poikkeus toistuvassa tapahtumassa, peruutettu <xliff:g id="DATE">%s</xliff:g>"</string>
<string name="exception_updated" msgid="329192591551400871">"Poikkeus toistuvassa tapahtumassa, muutettu <xliff:g id="DATE">%s</xliff:g>"</string>
diff --git a/res/values-fr-rCA/strings.xml b/res/values-fr-rCA/strings.xml
index abed2d6..4346331 100644
--- a/res/values-fr-rCA/strings.xml
+++ b/res/values-fr-rCA/strings.xml
@@ -27,7 +27,6 @@
<string name="meeting_recurring" msgid="2752008481765880928">"Date : <xliff:g id="EVENTDATE">%s</xliff:g> (périodique)"</string>
<string name="meeting_allday" msgid="7251209063071628040">"Quand : <xliff:g id="EVENTDATE">%s</xliff:g> (toute la journée)"</string>
<string name="meeting_allday_recurring" msgid="4545762363537362545">"Quand : <xliff:g id="EVENTDATE">%s</xliff:g> (toute la journée, récurrent)"</string>
- <string name="notification_exchange_calendar_added" msgid="8998454267739748113">"Calendrier Exchange ajouté"</string>
<string name="app_name" msgid="1707639359526090662">"Services Exchange"</string>
<string name="exception_cancel" msgid="8972887597771126871">"Cet événement a été annulé pour : <xliff:g id="DATE">%s</xliff:g>"</string>
<string name="exception_updated" msgid="329192591551400871">"Les détails de cet événement ont été modifiés pour : <xliff:g id="DATE">%s</xliff:g>"</string>
diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml
index eda8a1a..9d2a5f6 100644
--- a/res/values-fr/strings.xml
+++ b/res/values-fr/strings.xml
@@ -27,7 +27,6 @@
<string name="meeting_recurring" msgid="2752008481765880928">"Date : <xliff:g id="EVENTDATE">%s</xliff:g> (périodique)"</string>
<string name="meeting_allday" msgid="7251209063071628040">"Quand : <xliff:g id="EVENTDATE">%s</xliff:g> (toute la journée)"</string>
<string name="meeting_allday_recurring" msgid="4545762363537362545">"Quand : <xliff:g id="EVENTDATE">%s</xliff:g> (toute la journée, récurrent)"</string>
- <string name="notification_exchange_calendar_added" msgid="8998454267739748113">"Agenda Exchange ajouté"</string>
<string name="app_name" msgid="1707639359526090662">"Services Exchange"</string>
<string name="exception_cancel" msgid="8972887597771126871">"Cet événement a été annulé pour : <xliff:g id="DATE">%s</xliff:g>"</string>
<string name="exception_updated" msgid="329192591551400871">"Les détails de cet événement ont été modifiés pour : <xliff:g id="DATE">%s</xliff:g>"</string>
diff --git a/res/values-gl-rES/strings.xml b/res/values-gl-rES/strings.xml
index 8bfb3d8..94f6ba5 100644
--- a/res/values-gl-rES/strings.xml
+++ b/res/values-gl-rES/strings.xml
@@ -27,7 +27,6 @@
<string name="meeting_recurring" msgid="2752008481765880928">"Cando: <xliff:g id="EVENTDATE">%s</xliff:g> (repetida)"</string>
<string name="meeting_allday" msgid="7251209063071628040">"Cando: <xliff:g id="EVENTDATE">%s</xliff:g> (todo o día)"</string>
<string name="meeting_allday_recurring" msgid="4545762363537362545">"Cando: <xliff:g id="EVENTDATE">%s</xliff:g> (todo o día, periódica)"</string>
- <string name="notification_exchange_calendar_added" msgid="8998454267739748113">"Calendario de Exchange engadido"</string>
<string name="app_name" msgid="1707639359526090662">"Servizos de Exchange"</string>
<string name="exception_cancel" msgid="8972887597771126871">"Cancelouse este evento data do: <xliff:g id="DATE">%s</xliff:g>"</string>
<string name="exception_updated" msgid="329192591551400871">"Os detalles deste evento cambiáronse o: <xliff:g id="DATE">%s</xliff:g>"</string>
diff --git a/res/values-hi/strings.xml b/res/values-hi/strings.xml
index 6bcdd92..a70df8f 100644
--- a/res/values-hi/strings.xml
+++ b/res/values-hi/strings.xml
@@ -27,7 +27,6 @@
<string name="meeting_recurring" msgid="2752008481765880928">"कब: <xliff:g id="EVENTDATE">%s</xliff:g> (पुनरावर्ती)"</string>
<string name="meeting_allday" msgid="7251209063071628040">"कब: <xliff:g id="EVENTDATE">%s</xliff:g> (पूरा दिन)"</string>
<string name="meeting_allday_recurring" msgid="4545762363537362545">"कब: <xliff:g id="EVENTDATE">%s</xliff:g> (पूरा दिन, पुनरावृत्ति)"</string>
- <string name="notification_exchange_calendar_added" msgid="8998454267739748113">"Exchange कैलेंडर जोड़ा गया"</string>
<string name="app_name" msgid="1707639359526090662">"Exchange Services"</string>
<string name="exception_cancel" msgid="8972887597771126871">"यह ईवेंट इसके लिए रद्द कर दिया गया है: <xliff:g id="DATE">%s</xliff:g>"</string>
<string name="exception_updated" msgid="329192591551400871">"इस ईवेंट का विवरण इसके लिए बदल दिया गया है: <xliff:g id="DATE">%s</xliff:g>"</string>
diff --git a/res/values-hr/strings.xml b/res/values-hr/strings.xml
index 970e3c4..48b60c5 100644
--- a/res/values-hr/strings.xml
+++ b/res/values-hr/strings.xml
@@ -27,7 +27,6 @@
<string name="meeting_recurring" msgid="2752008481765880928">"Kada: <xliff:g id="EVENTDATE">%s</xliff:g> (ponavljanje)"</string>
<string name="meeting_allday" msgid="7251209063071628040">"Kada: <xliff:g id="EVENTDATE">%s</xliff:g> (cijeli dan)"</string>
<string name="meeting_allday_recurring" msgid="4545762363537362545">"Kada: <xliff:g id="EVENTDATE">%s</xliff:g> (cijeli dan, ponavlja se)"</string>
- <string name="notification_exchange_calendar_added" msgid="8998454267739748113">"Dodan je Exchange kalendar"</string>
<string name="app_name" msgid="1707639359526090662">"Exchange Services"</string>
<string name="exception_cancel" msgid="8972887597771126871">"Ovaj je događaj otkazan za: <xliff:g id="DATE">%s</xliff:g>"</string>
<string name="exception_updated" msgid="329192591551400871">"Pojedinosti ovog događaja promijenjene su za: <xliff:g id="DATE">%s</xliff:g>"</string>
diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml
index 7ea1896..8a7a97b 100644
--- a/res/values-hu/strings.xml
+++ b/res/values-hu/strings.xml
@@ -27,7 +27,6 @@
<string name="meeting_recurring" msgid="2752008481765880928">"Időpont: <xliff:g id="EVENTDATE">%s</xliff:g> (ismétlődő)"</string>
<string name="meeting_allday" msgid="7251209063071628040">"Időpont: <xliff:g id="EVENTDATE">%s</xliff:g> (egész nap)"</string>
<string name="meeting_allday_recurring" msgid="4545762363537362545">"Időpont: <xliff:g id="EVENTDATE">%s</xliff:g> (egész nap, ismétlődő)"</string>
- <string name="notification_exchange_calendar_added" msgid="8998454267739748113">"Exchange-naptár hozzáadva"</string>
<string name="app_name" msgid="1707639359526090662">"Exchange szolgáltatások"</string>
<string name="exception_cancel" msgid="8972887597771126871">"Ezt az eseményt törölték: <xliff:g id="DATE">%s</xliff:g>"</string>
<string name="exception_updated" msgid="329192591551400871">"Az esemény részletei a következőre módosultak: <xliff:g id="DATE">%s</xliff:g>"</string>
diff --git a/res/values-hy-rAM/strings.xml b/res/values-hy-rAM/strings.xml
index c2d6b12..5967d07 100644
--- a/res/values-hy-rAM/strings.xml
+++ b/res/values-hy-rAM/strings.xml
@@ -27,7 +27,6 @@
<string name="meeting_recurring" msgid="2752008481765880928">"Երբ` <xliff:g id="EVENTDATE">%s</xliff:g> (ընթացիկ)"</string>
<string name="meeting_allday" msgid="7251209063071628040">"Երբ` <xliff:g id="EVENTDATE">%s</xliff:g> (ամբողջ օրը):"</string>
<string name="meeting_allday_recurring" msgid="4545762363537362545">"Երբ` <xliff:g id="EVENTDATE">%s</xliff:g> (ամբողջ օրը, ընթացիկ)"</string>
- <string name="notification_exchange_calendar_added" msgid="8998454267739748113">"Exchange օրացույցն ավելացված է"</string>
<string name="app_name" msgid="1707639359526090662">"Փոխանակման ծառայություններ"</string>
<string name="exception_cancel" msgid="8972887597771126871">"Այս միջոցառումը չեղարկվել է <xliff:g id="DATE">%s</xliff:g>-ին"</string>
<string name="exception_updated" msgid="329192591551400871">"Այս միջոցառման մանրամասները փոխվել են <xliff:g id="DATE">%s</xliff:g>-ին"</string>
diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml
index 6c409bc..d8039fd 100644
--- a/res/values-in/strings.xml
+++ b/res/values-in/strings.xml
@@ -27,7 +27,6 @@
<string name="meeting_recurring" msgid="2752008481765880928">"Waktu: <xliff:g id="EVENTDATE">%s</xliff:g> (terjadi berulang)"</string>
<string name="meeting_allday" msgid="7251209063071628040">"Kapan: <xliff:g id="EVENTDATE">%s</xliff:g> (sepanjang hari)"</string>
<string name="meeting_allday_recurring" msgid="4545762363537362545">"Kapan: <xliff:g id="EVENTDATE">%s</xliff:g> (sepanjang hari, berulang)"</string>
- <string name="notification_exchange_calendar_added" msgid="8998454267739748113">"Tukar kalender yang ditambahkan"</string>
<string name="app_name" msgid="1707639359526090662">"Layanan Exchange"</string>
<string name="exception_cancel" msgid="8972887597771126871">"Acara ini telah dibatalkan untuk: <xliff:g id="DATE">%s</xliff:g>"</string>
<string name="exception_updated" msgid="329192591551400871">"Detail acara ini telah diubah untuk: <xliff:g id="DATE">%s</xliff:g>"</string>
diff --git a/res/values-is-rIS/strings.xml b/res/values-is-rIS/strings.xml
index 9fc60ed..790586e 100644
--- a/res/values-is-rIS/strings.xml
+++ b/res/values-is-rIS/strings.xml
@@ -27,7 +27,6 @@
<string name="meeting_recurring" msgid="2752008481765880928">"Hvenær: <xliff:g id="EVENTDATE">%s</xliff:g> (endurtekið)"</string>
<string name="meeting_allday" msgid="7251209063071628040">"Hvenær: <xliff:g id="EVENTDATE">%s</xliff:g> (allur dagurinn)"</string>
<string name="meeting_allday_recurring" msgid="4545762363537362545">"Hvenær: <xliff:g id="EVENTDATE">%s</xliff:g> (allur dagurinn, endurtekið)"</string>
- <string name="notification_exchange_calendar_added" msgid="8998454267739748113">"Exchange-dagatali bætt við"</string>
<string name="app_name" msgid="1707639359526090662">"Exchange-þjónusta"</string>
<string name="exception_cancel" msgid="8972887597771126871">"Þessum viðburði var aflýst: <xliff:g id="DATE">%s</xliff:g>"</string>
<string name="exception_updated" msgid="329192591551400871">"Upplýsingum um þennan viðburð var breytt: <xliff:g id="DATE">%s</xliff:g>"</string>
diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml
index b5b900b..b64f557 100644
--- a/res/values-it/strings.xml
+++ b/res/values-it/strings.xml
@@ -27,7 +27,6 @@
<string name="meeting_recurring" msgid="2752008481765880928">"Quando: <xliff:g id="EVENTDATE">%s</xliff:g> (ricorrente)"</string>
<string name="meeting_allday" msgid="7251209063071628040">"Quando: <xliff:g id="EVENTDATE">%s</xliff:g> (tutto il giorno)"</string>
<string name="meeting_allday_recurring" msgid="4545762363537362545">"Quando: <xliff:g id="EVENTDATE">%s</xliff:g> (tutto il giorno, ricorrente)"</string>
- <string name="notification_exchange_calendar_added" msgid="8998454267739748113">"Calendario Exchange aggiunto"</string>
<string name="app_name" msgid="1707639359526090662">"Servizi Exchange"</string>
<string name="exception_cancel" msgid="8972887597771126871">"Questo evento è stato annullato per la data: <xliff:g id="DATE">%s</xliff:g>"</string>
<string name="exception_updated" msgid="329192591551400871">"I dettagli di questo evento sono cambiati per la data: <xliff:g id="DATE">%s</xliff:g>"</string>
diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml
index 0593c2a..d02fe37 100644
--- a/res/values-iw/strings.xml
+++ b/res/values-iw/strings.xml
@@ -27,7 +27,6 @@
<string name="meeting_recurring" msgid="2752008481765880928">"מתי: <xliff:g id="EVENTDATE">%s</xliff:g> (אירוע חוזר)"</string>
<string name="meeting_allday" msgid="7251209063071628040">"מתי: <xliff:g id="EVENTDATE">%s</xliff:g> (כל יום)"</string>
<string name="meeting_allday_recurring" msgid="4545762363537362545">"מתי: <xliff:g id="EVENTDATE">%s</xliff:g> (כל היום, חוזר)"</string>
- <string name="notification_exchange_calendar_added" msgid="8998454267739748113">"נוסף יומן של Exchange"</string>
<string name="app_name" msgid="1707639359526090662">"שירותי Exchange"</string>
<string name="exception_cancel" msgid="8972887597771126871">"אירוע זה בוטל לתאריך: <xliff:g id="DATE">%s</xliff:g>"</string>
<string name="exception_updated" msgid="329192591551400871">"הפרטים של אירוע זה השתנו בתאריך: <xliff:g id="DATE">%s</xliff:g>"</string>
diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml
index 86ada48..e8adf70 100644
--- a/res/values-ja/strings.xml
+++ b/res/values-ja/strings.xml
@@ -27,7 +27,6 @@
<string name="meeting_recurring" msgid="2752008481765880928">"日時: <xliff:g id="EVENTDATE">%s</xliff:g>(定期的)"</string>
<string name="meeting_allday" msgid="7251209063071628040">"日付: <xliff:g id="EVENTDATE">%s</xliff:g>(終日)"</string>
<string name="meeting_allday_recurring" msgid="4545762363537362545">"日付: <xliff:g id="EVENTDATE">%s</xliff:g>(終日、定期的)"</string>
- <string name="notification_exchange_calendar_added" msgid="8998454267739748113">"Exchangeカレンダーを追加しました"</string>
<string name="app_name" msgid="1707639359526090662">"Exchangeサービス"</string>
<string name="exception_cancel" msgid="8972887597771126871">"この予定はキャンセルされました: <xliff:g id="DATE">%s</xliff:g>"</string>
<string name="exception_updated" msgid="329192591551400871">"この予定の詳細が変更されました: <xliff:g id="DATE">%s</xliff:g>"</string>
diff --git a/res/values-ka-rGE/strings.xml b/res/values-ka-rGE/strings.xml
index 87b59dc..fe83afc 100644
--- a/res/values-ka-rGE/strings.xml
+++ b/res/values-ka-rGE/strings.xml
@@ -27,7 +27,6 @@
<string name="meeting_recurring" msgid="2752008481765880928">"როდის: <xliff:g id="EVENTDATE">%s</xliff:g> (განმეორებადი)"</string>
<string name="meeting_allday" msgid="7251209063071628040">"როდის: <xliff:g id="EVENTDATE">%s</xliff:g> (მთელი დღე)"</string>
<string name="meeting_allday_recurring" msgid="4545762363537362545">"როდის: <xliff:g id="EVENTDATE">%s</xliff:g> (მთელი დღე, განმეორებადი)"</string>
- <string name="notification_exchange_calendar_added" msgid="8998454267739748113">"დამატებულია Exchange კალენდარი"</string>
<string name="app_name" msgid="1707639359526090662">"Exchange Services"</string>
<string name="exception_cancel" msgid="8972887597771126871">"ეს ღონისძიება გაუქმებულია: <xliff:g id="DATE">%s</xliff:g>"</string>
<string name="exception_updated" msgid="329192591551400871">"ამ ღონისძიების მონაცემები შეცვლილია: <xliff:g id="DATE">%s</xliff:g>"</string>
diff --git a/res/values-kk-rKZ/strings.xml b/res/values-kk-rKZ/strings.xml
index 1b1c5ed..2a1df06 100644
--- a/res/values-kk-rKZ/strings.xml
+++ b/res/values-kk-rKZ/strings.xml
@@ -27,7 +27,6 @@
<string name="meeting_recurring" msgid="2752008481765880928">"Қашан: <xliff:g id="EVENTDATE">%s</xliff:g> (қайталанады)"</string>
<string name="meeting_allday" msgid="7251209063071628040">"Қашан: <xliff:g id="EVENTDATE">%s</xliff:g> (күні бойы)"</string>
<string name="meeting_allday_recurring" msgid="4545762363537362545">"Қашан: <xliff:g id="EVENTDATE">%s</xliff:g> (күні бойы, қайталанады)"</string>
- <string name="notification_exchange_calendar_added" msgid="8998454267739748113">"Exchange күнтізбесі қосылды"</string>
<string name="app_name" msgid="1707639359526090662">"Exchange қызметтері"</string>
<string name="exception_cancel" msgid="8972887597771126871">"Бұл оқиғадан бас тартылды: <xliff:g id="DATE">%s</xliff:g>"</string>
<string name="exception_updated" msgid="329192591551400871">"Бұл оқиғаның мәліметтері өзгертілді: <xliff:g id="DATE">%s</xliff:g>"</string>
diff --git a/res/values-km-rKH/strings.xml b/res/values-km-rKH/strings.xml
index 97b14b9..be48dc7 100644
--- a/res/values-km-rKH/strings.xml
+++ b/res/values-km-rKH/strings.xml
@@ -27,7 +27,6 @@
<string name="meeting_recurring" msgid="2752008481765880928">"ពេលវេលា៖ <xliff:g id="EVENTDATE">%s</xliff:g> (កើតឡើងច្រើនដង)"</string>
<string name="meeting_allday" msgid="7251209063071628040">"ពេលវេលា៖ <xliff:g id="EVENTDATE">%s</xliff:g> (ពេញមួយថ្ងៃ)"</string>
<string name="meeting_allday_recurring" msgid="4545762363537362545">"ពេលវេលា៖ <xliff:g id="EVENTDATE">%s</xliff:g> (ពេញមួយថ្ងៃ កើតឡើងច្រើនដង)"</string>
- <string name="notification_exchange_calendar_added" msgid="8998454267739748113">"បានបន្ថែមការផ្លាស់ប្ដូរប្រតិទិន"</string>
<string name="app_name" msgid="1707639359526090662">"សេវាកម្មផ្លាស់ប្ដូរ"</string>
<string name="exception_cancel" msgid="8972887597771126871">"ព្រឹត្តិការណ៍នេះត្រូវបានបោះបង់ចោលសម្រាប់៖ <xliff:g id="DATE">%s</xliff:g>"</string>
<string name="exception_updated" msgid="329192591551400871">"ព័ត៌មានលម្អិតនៃព្រឹត្តិការណ៍នេះត្រូវបានប្ដូរសម្រាប់៖ <xliff:g id="DATE">%s</xliff:g>"</string>
diff --git a/res/values-kn-rIN/strings.xml b/res/values-kn-rIN/strings.xml
index 1b7af54..8baebd0 100644
--- a/res/values-kn-rIN/strings.xml
+++ b/res/values-kn-rIN/strings.xml
@@ -27,7 +27,6 @@
<string name="meeting_recurring" msgid="2752008481765880928">"ಯಾವಾಗ: <xliff:g id="EVENTDATE">%s</xliff:g> (ಪುನರಾವರ್ತನೆಯಾಗುತ್ತದೆ)"</string>
<string name="meeting_allday" msgid="7251209063071628040">"ಯಾವಾಗ: <xliff:g id="EVENTDATE">%s</xliff:g> (ಎಲ್ಲಾ ದಿನಗಳು)"</string>
<string name="meeting_allday_recurring" msgid="4545762363537362545">"ಯಾವಾಗ: <xliff:g id="EVENTDATE">%s</xliff:g> (ಎಲ್ಲಾ ದಿನ, ಪುನರಾವರ್ತನೆಯಾಗುತ್ತದೆ)"</string>
- <string name="notification_exchange_calendar_added" msgid="8998454267739748113">"ವಿನಿಮಯ ಕ್ಯಾಲೆಂಡರ್ ಸೇರಿಸಲಾಗಿದೆ"</string>
<string name="app_name" msgid="1707639359526090662">"ವಿನಿಮಯ ಸೇವೆಗಳು"</string>
<string name="exception_cancel" msgid="8972887597771126871">"ಈ ದಿನಾಂಕದಲ್ಲಿ ಈ ಈವೆಂಟ್ ಅನ್ನು ರದ್ದುಗೊಳಿಸಲಾಗಿದೆ: <xliff:g id="DATE">%s</xliff:g>"</string>
<string name="exception_updated" msgid="329192591551400871">"ಈ ಈವೆಂಟ್ನ ವಿವರಗಳನ್ನು ಈ ದಿನಾಂಕದಲ್ಲಿ ಬದಲಿಸಲಾಗಿದೆ:<xliff:g id="DATE">%s</xliff:g>"</string>
diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml
index 0fded43..29c8cb4 100644
--- a/res/values-ko/strings.xml
+++ b/res/values-ko/strings.xml
@@ -27,7 +27,6 @@
<string name="meeting_recurring" msgid="2752008481765880928">"일시: <xliff:g id="EVENTDATE">%s</xliff:g>(반복 일정)"</string>
<string name="meeting_allday" msgid="7251209063071628040">"일시: <xliff:g id="EVENTDATE">%s</xliff:g>(종일)"</string>
<string name="meeting_allday_recurring" msgid="4545762363537362545">"일시: <xliff:g id="EVENTDATE">%s</xliff:g>(종일, 반복)"</string>
- <string name="notification_exchange_calendar_added" msgid="8998454267739748113">"Exchange 캘린더 추가됨"</string>
<string name="app_name" msgid="1707639359526090662">"Exchange 서비스"</string>
<string name="exception_cancel" msgid="8972887597771126871">"<xliff:g id="DATE">%s</xliff:g>에 있을 이 일정이 취소되었습니다."</string>
<string name="exception_updated" msgid="329192591551400871">"<xliff:g id="DATE">%s</xliff:g>에 있을 이 일정의 세부사항이 변경되었습니다."</string>
diff --git a/res/values-ky-rKG/strings.xml b/res/values-ky-rKG/strings.xml
index 87f6c53..98b7775 100644
--- a/res/values-ky-rKG/strings.xml
+++ b/res/values-ky-rKG/strings.xml
@@ -36,8 +36,6 @@
<skip />
<string name="meeting_allday" msgid="7251209063071628040">"Качан: <xliff:g id="EVENTDATE">%s</xliff:g> (бир күн бою)"</string>
<string name="meeting_allday_recurring" msgid="4545762363537362545">"Качан: <xliff:g id="EVENTDATE">%s</xliff:g> (бир күн бою, улам-улам кайталанып)"</string>
- <!-- no translation found for notification_exchange_calendar_added (8998454267739748113) -->
- <skip />
<!-- no translation found for app_name (1707639359526090662) -->
<skip />
<!-- no translation found for exception_cancel (8972887597771126871) -->
diff --git a/res/values-lo-rLA/strings.xml b/res/values-lo-rLA/strings.xml
index 83188d6..805d60d 100644
--- a/res/values-lo-rLA/strings.xml
+++ b/res/values-lo-rLA/strings.xml
@@ -27,7 +27,6 @@
<string name="meeting_recurring" msgid="2752008481765880928">"ເມື່ອ: <xliff:g id="EVENTDATE">%s</xliff:g> (ເກີດຂຶ້ນຊ້ຳໆ)"</string>
<string name="meeting_allday" msgid="7251209063071628040">"ເມື່ອ: <xliff:g id="EVENTDATE">%s</xliff:g> (ຫມົດມື້)"</string>
<string name="meeting_allday_recurring" msgid="4545762363537362545">"ເມື່ອ: <xliff:g id="EVENTDATE">%s</xliff:g> (ຫມົດມື້, ເກີດຂຶ້ນຊ້ຳໆ)"</string>
- <string name="notification_exchange_calendar_added" msgid="8998454267739748113">"ເພີ່ມປະຕິທິນ Exchange ແລ້ວ"</string>
<string name="app_name" msgid="1707639359526090662">"Exchange Services"</string>
<string name="exception_cancel" msgid="8972887597771126871">"ກິດຈະກຳນີ້ໄດ້ຖືກຍົກເລີກສຳລັບ: <xliff:g id="DATE">%s</xliff:g>"</string>
<string name="exception_updated" msgid="329192591551400871">"ລາຍລະອຽດຂອງກິດຈະກຳນີ້ໄດ້ມີການປ່ຽນແປງສໍາລັບ: <xliff:g id="DATE">%s</xliff:g>"</string>
diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml
index c5432d5..c1abf96 100644
--- a/res/values-lt/strings.xml
+++ b/res/values-lt/strings.xml
@@ -27,7 +27,6 @@
<string name="meeting_recurring" msgid="2752008481765880928">"Kada: <xliff:g id="EVENTDATE">%s</xliff:g> (pasikartojantis)"</string>
<string name="meeting_allday" msgid="7251209063071628040">"Kada: <xliff:g id="EVENTDATE">%s</xliff:g> (visą dieną)"</string>
<string name="meeting_allday_recurring" msgid="4545762363537362545">"Kada: <xliff:g id="EVENTDATE">%s</xliff:g> (visą dieną, pasikartojantis)"</string>
- <string name="notification_exchange_calendar_added" msgid="8998454267739748113">"Pridėtas „Exchange“ kalendorius"</string>
<string name="app_name" msgid="1707639359526090662">"„Exchange“ paslaugos"</string>
<string name="exception_cancel" msgid="8972887597771126871">"Šis įvykis atšauktas: <xliff:g id="DATE">%s</xliff:g>"</string>
<string name="exception_updated" msgid="329192591551400871">"Išsami šio įvykio informacija buvo pakeista: <xliff:g id="DATE">%s</xliff:g>"</string>
diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml
index 1936d2c..585443c 100644
--- a/res/values-lv/strings.xml
+++ b/res/values-lv/strings.xml
@@ -27,7 +27,6 @@
<string name="meeting_recurring" msgid="2752008481765880928">"Kad: <xliff:g id="EVENTDATE">%s</xliff:g> (tiek atkārtots)"</string>
<string name="meeting_allday" msgid="7251209063071628040">"Kad: <xliff:g id="EVENTDATE">%s</xliff:g> (visu dienu)"</string>
<string name="meeting_allday_recurring" msgid="4545762363537362545">"Kad: <xliff:g id="EVENTDATE">%s</xliff:g> (visu dienu, atkārtoti)"</string>
- <string name="notification_exchange_calendar_added" msgid="8998454267739748113">"Exchange kalendārs ir pievienots"</string>
<string name="app_name" msgid="1707639359526090662">"Exchange pakalpojumi"</string>
<string name="exception_cancel" msgid="8972887597771126871">"Pasākums šajā datumā ir atcelts: <xliff:g id="DATE">%s</xliff:g>"</string>
<string name="exception_updated" msgid="329192591551400871">"Šī pasākuma dati šādā datumā ir mainīti: <xliff:g id="DATE">%s</xliff:g>"</string>
diff --git a/res/values-mk-rMK/strings.xml b/res/values-mk-rMK/strings.xml
index d2ec181..5c088b9 100644
--- a/res/values-mk-rMK/strings.xml
+++ b/res/values-mk-rMK/strings.xml
@@ -27,7 +27,6 @@
<string name="meeting_recurring" msgid="2752008481765880928">"Кога: <xliff:g id="EVENTDATE">%s</xliff:g> (повторливо)"</string>
<string name="meeting_allday" msgid="7251209063071628040">"Кога: <xliff:g id="EVENTDATE">%s</xliff:g> (цел ден)"</string>
<string name="meeting_allday_recurring" msgid="4545762363537362545">"Кога: <xliff:g id="EVENTDATE">%s</xliff:g> (цел ден, повторливо)"</string>
- <string name="notification_exchange_calendar_added" msgid="8998454267739748113">"Додаден е календар од сметка на Exchange"</string>
<string name="app_name" msgid="1707639359526090662">"Услуги на размена"</string>
<string name="exception_cancel" msgid="8972887597771126871">"Овој настан е откажан за: <xliff:g id="DATE">%s</xliff:g>"</string>
<string name="exception_updated" msgid="329192591551400871">"Деталите на овој настан се променети за: <xliff:g id="DATE">%s</xliff:g>"</string>
diff --git a/res/values-ml-rIN/strings.xml b/res/values-ml-rIN/strings.xml
index 5b795b2..faa7f8c 100644
--- a/res/values-ml-rIN/strings.xml
+++ b/res/values-ml-rIN/strings.xml
@@ -27,7 +27,6 @@
<string name="meeting_recurring" msgid="2752008481765880928">"എപ്പോൾ: <xliff:g id="EVENTDATE">%s</xliff:g> (ആവർത്തിക്കുന്നത്)"</string>
<string name="meeting_allday" msgid="7251209063071628040">"എപ്പോൾ: <xliff:g id="EVENTDATE">%s</xliff:g> (എല്ലാ ദിവസവും)"</string>
<string name="meeting_allday_recurring" msgid="4545762363537362545">"എപ്പോൾ: <xliff:g id="EVENTDATE">%s</xliff:g> (എല്ലാ ദിവസവും, ആവർത്തിക്കുന്നത്)"</string>
- <string name="notification_exchange_calendar_added" msgid="8998454267739748113">"Exchange കലണ്ടർ ചേർത്തു"</string>
<string name="app_name" msgid="1707639359526090662">"Exchange സേവനങ്ങൾ"</string>
<string name="exception_cancel" msgid="8972887597771126871">"ഈ തീയതിയ്ക്കുള്ള ഇവന്റ് റദ്ദാക്കി: <xliff:g id="DATE">%s</xliff:g>"</string>
<string name="exception_updated" msgid="329192591551400871">"ഈ ഇവന്റിനായുള്ള വിശദാംശങ്ങൾ മാറ്റി: <xliff:g id="DATE">%s</xliff:g>"</string>
@@ -35,7 +34,7 @@
<string name="policy_dont_allow_unsigned_apps" msgid="7663879438028397642">"സൈൻ ചെയ്തിട്ടില്ലാത്ത അപ്ലിക്കേഷനുകളെ അനുവദിക്കരുത്"</string>
<string name="policy_dont_allow_unsigned_installers" msgid="8227232531632246827">"സൈൻ ചെയ്തിട്ടില്ലാത്ത അപ്ലിക്കേഷൻ ഇൻസ്റ്റാളറുകളെ അനുവദിക്കരുത്"</string>
<string name="policy_dont_allow_wifi" msgid="8501275982154914194">"Wi-Fi അനുവദിക്കരുത്"</string>
- <string name="policy_dont_allow_text_messaging" msgid="860590081742537792">"വാചക സന്ദേശമയയ്ക്കൽ അനുവദിക്കരുത്"</string>
+ <string name="policy_dont_allow_text_messaging" msgid="860590081742537792">"വാചക സന്ദേശം അനുവദിക്കരുത്"</string>
<string name="policy_dont_allow_pop_imap" msgid="5772539239469636191">"POP3 അല്ലെങ്കിൽ IMAP അക്കൗണ്ടുകൾ അനുവദിക്കരുത്"</string>
<string name="policy_dont_allow_irda" msgid="8230803019935893114">"ഇൻഫ്രാറെഡ് ആശയവിനിമയങ്ങൾ അനുവദിക്കരുത്"</string>
<string name="policy_dont_allow_html" msgid="3909470006782362967">"HTML ഇമെയിൽ അനുവദിക്കരുത്"</string>
diff --git a/res/values-mn-rMN/strings.xml b/res/values-mn-rMN/strings.xml
index 64600b5..9107a1c 100644
--- a/res/values-mn-rMN/strings.xml
+++ b/res/values-mn-rMN/strings.xml
@@ -27,7 +27,6 @@
<string name="meeting_recurring" msgid="2752008481765880928">"Хэзээ: <xliff:g id="EVENTDATE">%s</xliff:g> (давтагддаг)"</string>
<string name="meeting_allday" msgid="7251209063071628040">"Хэзээ: <xliff:g id="EVENTDATE">%s</xliff:g> (бүтэн өдөр)"</string>
<string name="meeting_allday_recurring" msgid="4545762363537362545">"Хэзээ: <xliff:g id="EVENTDATE">%s</xliff:g> (өдрийн турш, давтагддаг)"</string>
- <string name="notification_exchange_calendar_added" msgid="8998454267739748113">"Солигч календарь нэмэгдсэн"</string>
<string name="app_name" msgid="1707639359526090662">"Солигч Үйлчилгээ"</string>
<string name="exception_cancel" msgid="8972887597771126871">"Энэ үйл явдлыг дараах өдөрт цуцалсан: <xliff:g id="DATE">%s</xliff:g>"</string>
<string name="exception_updated" msgid="329192591551400871">"Энэ үйл явдлын мэдээллийг дараах өдөрт өөрчилсөн: <xliff:g id="DATE">%s</xliff:g>"</string>
diff --git a/res/values-mr-rIN/strings.xml b/res/values-mr-rIN/strings.xml
index 9c6471c..1e134a9 100644
--- a/res/values-mr-rIN/strings.xml
+++ b/res/values-mr-rIN/strings.xml
@@ -27,14 +27,13 @@
<string name="meeting_recurring" msgid="2752008481765880928">"केव्हा: <xliff:g id="EVENTDATE">%s</xliff:g> (आवर्ती)"</string>
<string name="meeting_allday" msgid="7251209063071628040">"केव्हा: <xliff:g id="EVENTDATE">%s</xliff:g> (सर्व दिवस)"</string>
<string name="meeting_allday_recurring" msgid="4545762363537362545">"केव्हा: <xliff:g id="EVENTDATE">%s</xliff:g> (सर्व दिवस, आवर्ती)"</string>
- <string name="notification_exchange_calendar_added" msgid="8998454267739748113">"Exchange कॅलेंडर जोडले"</string>
<string name="app_name" msgid="1707639359526090662">"Exchange सेवा"</string>
<string name="exception_cancel" msgid="8972887597771126871">"हा इव्हेंट रद्द केला गेला आहे: <xliff:g id="DATE">%s</xliff:g>"</string>
<string name="exception_updated" msgid="329192591551400871">"यासाठी या इव्हेंटचे तपशील बदलण्यात आले आहेत: <xliff:g id="DATE">%s</xliff:g>"</string>
<string name="policy_dont_allow_storage_cards" msgid="1305111581282078881">"संचयन कार्डना अनुमती देऊ नका"</string>
<string name="policy_dont_allow_unsigned_apps" msgid="7663879438028397642">"स्वाक्षरी न केलेल्या अॅप्स ना अनुमती देऊ नका"</string>
<string name="policy_dont_allow_unsigned_installers" msgid="8227232531632246827">"स्वाक्षरी न केलेल्या अॅप स्थापनकर्त्यांना अनुमती देऊ नका"</string>
- <string name="policy_dont_allow_wifi" msgid="8501275982154914194">"Wi-Fi ला अनुमती देऊ नका"</string>
+ <string name="policy_dont_allow_wifi" msgid="8501275982154914194">"वाय-फाय ला अनुमती देऊ नका"</string>
<string name="policy_dont_allow_text_messaging" msgid="860590081742537792">"मजकूर संदेशनास अनुमती देऊ नका"</string>
<string name="policy_dont_allow_pop_imap" msgid="5772539239469636191">"POP3 किंवा IMAP खात्यांना अनुमती देऊ नका"</string>
<string name="policy_dont_allow_irda" msgid="8230803019935893114">"इन्फ्रारेड संप्रेषणांना अनुमती देऊ नका"</string>
@@ -43,7 +42,7 @@
<string name="policy_dont_allow_consumer_email" msgid="2473755560531860915">"ग्राहक ईमेलला अनुमती देऊ नका"</string>
<string name="policy_dont_allow_internet_sharing" msgid="8926902533477728994">"इंटरनेट सामायिकरणास अनुमती देऊ नका"</string>
<string name="policy_require_smime" msgid="6445017199744800426">"SMIME संदेश आवश्यक"</string>
- <string name="policy_bluetooth_restricted" msgid="2877695021606992022">"Bluetooth वापर प्रतिबंधित करा"</string>
+ <string name="policy_bluetooth_restricted" msgid="2877695021606992022">"ब्लूटूथ वापर प्रतिबंधित करा"</string>
<string name="policy_app_blacklist" msgid="6955451921925210944">"निर्दिष्ट अॅप्स ची अनुमती रद्द करा"</string>
<string name="policy_app_whitelist" msgid="73673250614393830">"केवळ निर्दिष्ट अॅप्स ना अनुमती द्या"</string>
<string name="policy_text_truncation" msgid="2098855720139889616">"मजकूर ईमेल आकार प्रतिबंधित करा"</string>
diff --git a/res/values-ms-rMY/strings.xml b/res/values-ms-rMY/strings.xml
index 52c3366..dfb811c 100644
--- a/res/values-ms-rMY/strings.xml
+++ b/res/values-ms-rMY/strings.xml
@@ -27,7 +27,6 @@
<string name="meeting_recurring" msgid="2752008481765880928">"Bila: <xliff:g id="EVENTDATE">%s</xliff:g> (berulangan)"</string>
<string name="meeting_allday" msgid="7251209063071628040">"Bila: <xliff:g id="EVENTDATE">%s</xliff:g> (sepanjang hari)"</string>
<string name="meeting_allday_recurring" msgid="4545762363537362545">"Bila: <xliff:g id="EVENTDATE">%s</xliff:g> (sepanjang hari, berulang-ulang)"</string>
- <string name="notification_exchange_calendar_added" msgid="8998454267739748113">"Kalendar Exchange ditambahkan"</string>
<string name="app_name" msgid="1707639359526090662">"Perkhidmatan Exchange"</string>
<string name="exception_cancel" msgid="8972887597771126871">"Acara ini sudah dibatalkan untuk: <xliff:g id="DATE">%s</xliff:g>"</string>
<string name="exception_updated" msgid="329192591551400871">"Butiran acara ini telah ditukar kepada: <xliff:g id="DATE">%s</xliff:g>"</string>
diff --git a/res/values-my-rMM/strings.xml b/res/values-my-rMM/strings.xml
index dc188d3..2e9fa56 100644
--- a/res/values-my-rMM/strings.xml
+++ b/res/values-my-rMM/strings.xml
@@ -27,7 +27,6 @@
<string name="meeting_recurring" msgid="2752008481765880928">"အချိန်: <xliff:g id="EVENTDATE">%s</xliff:g> (ထပ်ဖြစ်နေ)"</string>
<string name="meeting_allday" msgid="7251209063071628040">"အချိန်: <xliff:g id="EVENTDATE">%s</xliff:g> (တစ်နေ့လုံး)"</string>
<string name="meeting_allday_recurring" msgid="4545762363537362545">"အချိန်: <xliff:g id="EVENTDATE">%s</xliff:g> (တစ်နေ့လုံး၊ ထပ်ဖြစ်နေ)"</string>
- <string name="notification_exchange_calendar_added" msgid="8998454267739748113">"လဲလှယ်ရေး ပြက္ခဒိန်ကို ထည့်ပြီး"</string>
<string name="app_name" msgid="1707639359526090662">"လဲလှယ်ရေး ၀န်ဆောင်မှုများ"</string>
<string name="exception_cancel" msgid="8972887597771126871">"ဤဖြစ်ရပ်ကို <xliff:g id="DATE">%s</xliff:g> အတွက် ဖျက်သိမ်းလိုက်သည်။"</string>
<string name="exception_updated" msgid="329192591551400871">"ဤဖြစ်ရပ်အတွက် အသေးစိတ်များကို ပြောင်းခဲ့သည်မှာ: <xliff:g id="DATE">%s</xliff:g>"</string>
diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml
index c2b85ba..5bfb9c3 100644
--- a/res/values-nb/strings.xml
+++ b/res/values-nb/strings.xml
@@ -27,7 +27,6 @@
<string name="meeting_recurring" msgid="2752008481765880928">"Når: <xliff:g id="EVENTDATE">%s</xliff:g> (gjentakende)"</string>
<string name="meeting_allday" msgid="7251209063071628040">"Når: <xliff:g id="EVENTDATE">%s</xliff:g> (hele dagen)"</string>
<string name="meeting_allday_recurring" msgid="4545762363537362545">"Når: <xliff:g id="EVENTDATE">%s</xliff:g> (hele dagen, gjentakende)"</string>
- <string name="notification_exchange_calendar_added" msgid="8998454267739748113">"Exchange-kalender er lagt til"</string>
<string name="app_name" msgid="1707639359526090662">"Exchange-tjenester"</string>
<string name="exception_cancel" msgid="8972887597771126871">"Denne aktiviteten er avlyst for: <xliff:g id="DATE">%s</xliff:g>"</string>
<string name="exception_updated" msgid="329192591551400871">"Detaljene for denne aktiviteten er endret for: <xliff:g id="DATE">%s</xliff:g>"</string>
diff --git a/res/values-ne-rNP/strings.xml b/res/values-ne-rNP/strings.xml
index f1ca8fb..5954840 100644
--- a/res/values-ne-rNP/strings.xml
+++ b/res/values-ne-rNP/strings.xml
@@ -27,7 +27,6 @@
<string name="meeting_recurring" msgid="2752008481765880928">"जब: <xliff:g id="EVENTDATE">%s</xliff:g> (पुनरावर्ती)"</string>
<string name="meeting_allday" msgid="7251209063071628040">"जब: <xliff:g id="EVENTDATE">%s</xliff:g> (सबै दिन)"</string>
<string name="meeting_allday_recurring" msgid="4545762363537362545">"जब: <xliff:g id="EVENTDATE">%s</xliff:g> (सबै दिन, पुनरावर्ती)"</string>
- <string name="notification_exchange_calendar_added" msgid="8998454267739748113">"एक्स्चेन्ञ पात्रो थपियो"</string>
<string name="app_name" msgid="1707639359526090662">"सेवाहरु परिवर्तन गर्नुहोस्"</string>
<string name="exception_cancel" msgid="8972887597771126871">"<xliff:g id="DATE">%s</xliff:g> को लागि यस घटना रद्द भयो:"</string>
<string name="exception_updated" msgid="329192591551400871">"<xliff:g id="DATE">%s</xliff:g> को लागि यस घटनाको पूर्ण विवरण परिवर्तन भयो:"</string>
@@ -41,7 +40,7 @@
<string name="policy_dont_allow_html" msgid="3909470006782362967">"HTML इमेललाई अनुमति नदिनुहोस्"</string>
<string name="policy_dont_allow_browser" msgid="241728112385525092">"ब्राउजरहरुलाई अनुमति नदिनुहोस्"</string>
<string name="policy_dont_allow_consumer_email" msgid="2473755560531860915">"उपभोक्ता इ-मेललाई अनुमति नदिनुहोस्"</string>
- <string name="policy_dont_allow_internet_sharing" msgid="8926902533477728994">"ईन्टरनेट साझेदारी अनुमति नदिनुहोस्"</string>
+ <string name="policy_dont_allow_internet_sharing" msgid="8926902533477728994">"इन्टरनेट साझेदारी अनुमति नदिनुहोस्"</string>
<string name="policy_require_smime" msgid="6445017199744800426">"SMIME सान्देशहरुको आवश्यकता छ"</string>
<string name="policy_bluetooth_restricted" msgid="2877695021606992022">"ब्लूटूथ उपयोग प्रतिबन्धित गर्नुहोस्"</string>
<string name="policy_app_blacklist" msgid="6955451921925210944">"निर्दिष्ट अनुप्रयोगहरू अस्वीकार गर्नुहोस्"</string>
diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml
index b6adbd2..5ad17b1 100644
--- a/res/values-nl/strings.xml
+++ b/res/values-nl/strings.xml
@@ -27,7 +27,6 @@
<string name="meeting_recurring" msgid="2752008481765880928">"Wanneer: <xliff:g id="EVENTDATE">%s</xliff:g> (herhalen)"</string>
<string name="meeting_allday" msgid="7251209063071628040">"Wanneer: <xliff:g id="EVENTDATE">%s</xliff:g> (hele dag)"</string>
<string name="meeting_allday_recurring" msgid="4545762363537362545">"Wanneer: <xliff:g id="EVENTDATE">%s</xliff:g> (hele dag, herhalen)"</string>
- <string name="notification_exchange_calendar_added" msgid="8998454267739748113">"Exchange-agenda toegevoegd"</string>
<string name="app_name" msgid="1707639359526090662">"Exchange Services"</string>
<string name="exception_cancel" msgid="8972887597771126871">"Deze afspraak is geannuleerd voor: <xliff:g id="DATE">%s</xliff:g>"</string>
<string name="exception_updated" msgid="329192591551400871">"De details van deze afspraak zijn gewijzigd voor: <xliff:g id="DATE">%s</xliff:g>"</string>
diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml
index 13ac5e3..ad16d37 100644
--- a/res/values-pl/strings.xml
+++ b/res/values-pl/strings.xml
@@ -27,7 +27,6 @@
<string name="meeting_recurring" msgid="2752008481765880928">"Kiedy: <xliff:g id="EVENTDATE">%s</xliff:g> (powtarzane)"</string>
<string name="meeting_allday" msgid="7251209063071628040">"Data: <xliff:g id="EVENTDATE">%s</xliff:g> (cały dzień)"</string>
<string name="meeting_allday_recurring" msgid="4545762363537362545">"Data: <xliff:g id="EVENTDATE">%s</xliff:g> (cały dzień, cykliczne)"</string>
- <string name="notification_exchange_calendar_added" msgid="8998454267739748113">"Dodano kalendarz Exchange"</string>
<string name="app_name" msgid="1707639359526090662">"Usługi Exchange"</string>
<string name="exception_cancel" msgid="8972887597771126871">"To zdarzenie zostało anulowane dla: <xliff:g id="DATE">%s</xliff:g>"</string>
<string name="exception_updated" msgid="329192591551400871">"Szczegóły tego zdarzenia zostały zmienione dla: <xliff:g id="DATE">%s</xliff:g>"</string>
diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml
index 4b2eb8e..fdadf27 100644
--- a/res/values-pt-rPT/strings.xml
+++ b/res/values-pt-rPT/strings.xml
@@ -27,7 +27,6 @@
<string name="meeting_recurring" msgid="2752008481765880928">"Quando: <xliff:g id="EVENTDATE">%s</xliff:g> (periódica)"</string>
<string name="meeting_allday" msgid="7251209063071628040">"Quando: <xliff:g id="EVENTDATE">%s</xliff:g> (todo o dia)"</string>
<string name="meeting_allday_recurring" msgid="4545762363537362545">"Quando: <xliff:g id="EVENTDATE">%s</xliff:g> (todo o dia, recorrente)"</string>
- <string name="notification_exchange_calendar_added" msgid="8998454267739748113">"Calendário do Exchange adicionado"</string>
<string name="app_name" msgid="1707639359526090662">"Serviços do Exchange"</string>
<string name="exception_cancel" msgid="8972887597771126871">"Este evento foi cancelado para: <xliff:g id="DATE">%s</xliff:g>"</string>
<string name="exception_updated" msgid="329192591551400871">"Os detalhes deste evento foram alterados para: <xliff:g id="DATE">%s</xliff:g>"</string>
diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml
index 25fbcac..035207c 100644
--- a/res/values-pt/strings.xml
+++ b/res/values-pt/strings.xml
@@ -27,7 +27,6 @@
<string name="meeting_recurring" msgid="2752008481765880928">"Quando: <xliff:g id="EVENTDATE">%s</xliff:g> (recorrente)"</string>
<string name="meeting_allday" msgid="7251209063071628040">"Quando: <xliff:g id="EVENTDATE">%s</xliff:g> (o dia todo)"</string>
<string name="meeting_allday_recurring" msgid="4545762363537362545">"Quando: <xliff:g id="EVENTDATE">%s</xliff:g> (o dia todo, recorrente)"</string>
- <string name="notification_exchange_calendar_added" msgid="8998454267739748113">"Agenda do Exchange adicionada"</string>
<string name="app_name" msgid="1707639359526090662">"Serviços Exchange"</string>
<string name="exception_cancel" msgid="8972887597771126871">"Este evento foi cancelado para: <xliff:g id="DATE">%s</xliff:g>"</string>
<string name="exception_updated" msgid="329192591551400871">"Os detalhes deste evento foram alterados para: <xliff:g id="DATE">%s</xliff:g>"</string>
diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml
index 302cff4..28a362e 100644
--- a/res/values-ro/strings.xml
+++ b/res/values-ro/strings.xml
@@ -27,7 +27,6 @@
<string name="meeting_recurring" msgid="2752008481765880928">"Când: <xliff:g id="EVENTDATE">%s</xliff:g> (recurent)"</string>
<string name="meeting_allday" msgid="7251209063071628040">"Când: <xliff:g id="EVENTDATE">%s</xliff:g> (toată ziua)"</string>
<string name="meeting_allday_recurring" msgid="4545762363537362545">"Când: <xliff:g id="EVENTDATE">%s</xliff:g> (toată ziua, repetat)"</string>
- <string name="notification_exchange_calendar_added" msgid="8998454267739748113">"S-a adăugat calendarul Exchange"</string>
<string name="app_name" msgid="1707639359526090662">"Servicii Exchange"</string>
<string name="exception_cancel" msgid="8972887597771126871">"Acest eveniment a fost anulat pentru: <xliff:g id="DATE">%s</xliff:g>"</string>
<string name="exception_updated" msgid="329192591551400871">"Detaliile acestui eveniment au fost modificate pentru: <xliff:g id="DATE">%s</xliff:g>"</string>
diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml
index d6fce21..6dae876 100644
--- a/res/values-ru/strings.xml
+++ b/res/values-ru/strings.xml
@@ -27,7 +27,6 @@
<string name="meeting_recurring" msgid="2752008481765880928">"Время: <xliff:g id="EVENTDATE">%s</xliff:g> (повторяющееся)"</string>
<string name="meeting_allday" msgid="7251209063071628040">"Дата: <xliff:g id="EVENTDATE">%s</xliff:g> (весь день)"</string>
<string name="meeting_allday_recurring" msgid="4545762363537362545">"Дата: <xliff:g id="EVENTDATE">%s</xliff:g> (весь день, повторяется)"</string>
- <string name="notification_exchange_calendar_added" msgid="8998454267739748113">"Календарь Exchange добавлен"</string>
<string name="app_name" msgid="1707639359526090662">"Службы Exchange"</string>
<string name="exception_cancel" msgid="8972887597771126871">"Это мероприятие отменено: <xliff:g id="DATE">%s</xliff:g>"</string>
<string name="exception_updated" msgid="329192591551400871">"Сведения об этом мероприятии были изменены: <xliff:g id="DATE">%s</xliff:g>"</string>
diff --git a/res/values-si-rLK/strings.xml b/res/values-si-rLK/strings.xml
index f1df627..842cd0f 100644
--- a/res/values-si-rLK/strings.xml
+++ b/res/values-si-rLK/strings.xml
@@ -27,7 +27,6 @@
<string name="meeting_recurring" msgid="2752008481765880928">"කවදාද: <xliff:g id="EVENTDATE">%s</xliff:g> (ආවර්ත වෙමින්)"</string>
<string name="meeting_allday" msgid="7251209063071628040">"කවදාද: <xliff:g id="EVENTDATE">%s</xliff:g> (සියලුම දින)"</string>
<string name="meeting_allday_recurring" msgid="4545762363537362545">"කවදාද: <xliff:g id="EVENTDATE">%s</xliff:g> (සියලු දින, ආවර්ත වෙමින්)"</string>
- <string name="notification_exchange_calendar_added" msgid="8998454267739748113">"හුවමාරු දින දර්ශනය එකතුකොට ඇත"</string>
<string name="app_name" msgid="1707639359526090662">"හුවමාරු සේවාවන්"</string>
<string name="exception_cancel" msgid="8972887597771126871">"මෙම සිද්ධිය අවලංගු වන්නේ: <xliff:g id="DATE">%s</xliff:g>"</string>
<string name="exception_updated" msgid="329192591551400871">"මෙම සිද්ධියේ තොරතුරු වෙනස් වන්නේ: <xliff:g id="DATE">%s</xliff:g>"</string>
diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml
index 4b46b92..f393b95 100644
--- a/res/values-sk/strings.xml
+++ b/res/values-sk/strings.xml
@@ -27,7 +27,6 @@
<string name="meeting_recurring" msgid="2752008481765880928">"Kedy: <xliff:g id="EVENTDATE">%s</xliff:g> (pravidelne)"</string>
<string name="meeting_allday" msgid="7251209063071628040">"Kedy: <xliff:g id="EVENTDATE">%s</xliff:g> (celý deň)"</string>
<string name="meeting_allday_recurring" msgid="4545762363537362545">"Kedy: <xliff:g id="EVENTDATE">%s</xliff:g> (celý deň, opakujúce sa)"</string>
- <string name="notification_exchange_calendar_added" msgid="8998454267739748113">"Kalendár Exchange bol pridaný"</string>
<string name="app_name" msgid="1707639359526090662">"Exchange Services"</string>
<string name="exception_cancel" msgid="8972887597771126871">"Táto udalosť bola zrušená pre termín: <xliff:g id="DATE">%s</xliff:g>"</string>
<string name="exception_updated" msgid="329192591551400871">"Došlo k zmene podrobností tejto udalosti pre termín: <xliff:g id="DATE">%s</xliff:g>"</string>
diff --git a/res/values-sl/strings.xml b/res/values-sl/strings.xml
index d0f3591..e4f8b02 100644
--- a/res/values-sl/strings.xml
+++ b/res/values-sl/strings.xml
@@ -27,7 +27,6 @@
<string name="meeting_recurring" msgid="2752008481765880928">"Kdaj: <xliff:g id="EVENTDATE">%s</xliff:g> (se ponavlja)"</string>
<string name="meeting_allday" msgid="7251209063071628040">"Kdaj: <xliff:g id="EVENTDATE">%s</xliff:g> (ves dan)"</string>
<string name="meeting_allday_recurring" msgid="4545762363537362545">"Kdaj: <xliff:g id="EVENTDATE">%s</xliff:g> (ves dan, ponavljajoče)"</string>
- <string name="notification_exchange_calendar_added" msgid="8998454267739748113">"Dodan koledar računa Exchange"</string>
<string name="app_name" msgid="1707639359526090662">"Storitve Exchange Services"</string>
<string name="exception_cancel" msgid="8972887597771126871">"Ta dogodek je bil preklican za: <xliff:g id="DATE">%s</xliff:g>"</string>
<string name="exception_updated" msgid="329192591551400871">"Podrobnosti tega dogodka so bile spremenjene: <xliff:g id="DATE">%s</xliff:g>"</string>
diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml
index 2624bf0..89a9b2c 100644
--- a/res/values-sr/strings.xml
+++ b/res/values-sr/strings.xml
@@ -27,7 +27,6 @@
<string name="meeting_recurring" msgid="2752008481765880928">"Када: <xliff:g id="EVENTDATE">%s</xliff:g> (редовно)"</string>
<string name="meeting_allday" msgid="7251209063071628040">"Када: <xliff:g id="EVENTDATE">%s</xliff:g> (цео дан)"</string>
<string name="meeting_allday_recurring" msgid="4545762363537362545">"Када: <xliff:g id="EVENTDATE">%s</xliff:g> (цео дан, понавља се)"</string>
- <string name="notification_exchange_calendar_added" msgid="8998454267739748113">"Додат је Exchange календар"</string>
<string name="app_name" msgid="1707639359526090662">"Exchange услуге"</string>
<string name="exception_cancel" msgid="8972887597771126871">"Овај догађај је отказан за: <xliff:g id="DATE">%s</xliff:g>"</string>
<string name="exception_updated" msgid="329192591551400871">"Детаљи овог догађаја су промењени за: <xliff:g id="DATE">%s</xliff:g>"</string>
diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml
index 04d6002..a21cd97 100644
--- a/res/values-sv/strings.xml
+++ b/res/values-sv/strings.xml
@@ -27,7 +27,6 @@
<string name="meeting_recurring" msgid="2752008481765880928">"När: <xliff:g id="EVENTDATE">%s</xliff:g> (återkommande)"</string>
<string name="meeting_allday" msgid="7251209063071628040">"När: <xliff:g id="EVENTDATE">%s</xliff:g> (hela dagen)"</string>
<string name="meeting_allday_recurring" msgid="4545762363537362545">"När: <xliff:g id="EVENTDATE">%s</xliff:g> (hela dagen, återkommande)"</string>
- <string name="notification_exchange_calendar_added" msgid="8998454267739748113">"Exchange-kalendern har lagts till"</string>
<string name="app_name" msgid="1707639359526090662">"Exchange-tjänster"</string>
<string name="exception_cancel" msgid="8972887597771126871">"Det här händelsen har ställts in för: <xliff:g id="DATE">%s</xliff:g>"</string>
<string name="exception_updated" msgid="329192591551400871">"Den här händelsens information har ändrats för: <xliff:g id="DATE">%s</xliff:g>"</string>
diff --git a/res/values-sw/strings.xml b/res/values-sw/strings.xml
index 295c60e..f6e3d6f 100644
--- a/res/values-sw/strings.xml
+++ b/res/values-sw/strings.xml
@@ -27,7 +27,6 @@
<string name="meeting_recurring" msgid="2752008481765880928">"Wakati: <xliff:g id="EVENTDATE">%s</xliff:g> (itarudiwa)"</string>
<string name="meeting_allday" msgid="7251209063071628040">"Lini: <xliff:g id="EVENTDATE">%s</xliff:g> (siku nzima)"</string>
<string name="meeting_allday_recurring" msgid="4545762363537362545">"Lini: <xliff:g id="EVENTDATE">%s</xliff:g> (siku nzima, inajirudia)"</string>
- <string name="notification_exchange_calendar_added" msgid="8998454267739748113">"Kalenda ya Exchange imeongezwa"</string>
<string name="app_name" msgid="1707639359526090662">"Huduma za Microsoft Exchange"</string>
<string name="exception_cancel" msgid="8972887597771126871">"Tukio hili limeghairiwa kwa: <xliff:g id="DATE">%s</xliff:g>"</string>
<string name="exception_updated" msgid="329192591551400871">"Maelezo ya tukio hili yamebadilishwa kwa: <xliff:g id="DATE">%s</xliff:g>"</string>
diff --git a/res/values-ta-rIN/strings.xml b/res/values-ta-rIN/strings.xml
index 52a8214..0f096df 100644
--- a/res/values-ta-rIN/strings.xml
+++ b/res/values-ta-rIN/strings.xml
@@ -27,7 +27,6 @@
<string name="meeting_recurring" msgid="2752008481765880928">"எப்போது: <xliff:g id="EVENTDATE">%s</xliff:g> (மீண்டும் மீண்டும்)"</string>
<string name="meeting_allday" msgid="7251209063071628040">"எப்போது: <xliff:g id="EVENTDATE">%s</xliff:g> (நாள் முழுதும்)"</string>
<string name="meeting_allday_recurring" msgid="4545762363537362545">"எப்போது: <xliff:g id="EVENTDATE">%s</xliff:g> (நாள் முழுவதும், மீண்டும் மீண்டும்)"</string>
- <string name="notification_exchange_calendar_added" msgid="8998454267739748113">"Exchange கேலெண்டர் சேர்க்கப்பட்டது"</string>
<string name="app_name" msgid="1707639359526090662">"Exchange சேவைகள்"</string>
<string name="exception_cancel" msgid="8972887597771126871">"பின்வரும் நாளிற்கான நிகழ்வு ரத்துசெய்யப்பட்டது: <xliff:g id="DATE">%s</xliff:g>"</string>
<string name="exception_updated" msgid="329192591551400871">"பின்வரும் நாளிற்கான நிகழ்வின் விவரங்கள் மாற்றப்பட்டன: <xliff:g id="DATE">%s</xliff:g>"</string>
diff --git a/res/values-te-rIN/strings.xml b/res/values-te-rIN/strings.xml
index 71c7f1b..f9aad98 100644
--- a/res/values-te-rIN/strings.xml
+++ b/res/values-te-rIN/strings.xml
@@ -27,7 +27,6 @@
<string name="meeting_recurring" msgid="2752008481765880928">"ఎప్పుడు: <xliff:g id="EVENTDATE">%s</xliff:g> (పునరావృతం)"</string>
<string name="meeting_allday" msgid="7251209063071628040">"ఎప్పుడు: <xliff:g id="EVENTDATE">%s</xliff:g> (మొత్తం రోజు)"</string>
<string name="meeting_allday_recurring" msgid="4545762363537362545">"ఎప్పుడు: <xliff:g id="EVENTDATE">%s</xliff:g> (మొత్తం రోజు, పునరావృతం)"</string>
- <string name="notification_exchange_calendar_added" msgid="8998454267739748113">"Exchange క్యాలెండర్ జోడించబడింది"</string>
<string name="app_name" msgid="1707639359526090662">"Exchange సేవలు"</string>
<string name="exception_cancel" msgid="8972887597771126871">"ఈ తేదీన జరగాల్సిన ఈ ఈవెంట్ రద్దు చేయబడింది: <xliff:g id="DATE">%s</xliff:g>"</string>
<string name="exception_updated" msgid="329192591551400871">"ఈ ఈవెంట్ యొక్క వివరాలు ఈ తేదీన మార్చబడ్డాయి: <xliff:g id="DATE">%s</xliff:g>"</string>
diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml
index 2a03340..ab15d7f 100644
--- a/res/values-th/strings.xml
+++ b/res/values-th/strings.xml
@@ -27,7 +27,6 @@
<string name="meeting_recurring" msgid="2752008481765880928">"เวลา: <xliff:g id="EVENTDATE">%s</xliff:g> (เกิดซ้ำ)"</string>
<string name="meeting_allday" msgid="7251209063071628040">"เมื่อ: <xliff:g id="EVENTDATE">%s</xliff:g> (ตลอดวัน)"</string>
<string name="meeting_allday_recurring" msgid="4545762363537362545">"เมื่อ: <xliff:g id="EVENTDATE">%s</xliff:g> (ตลอดวัน เกิดซ้ำ)"</string>
- <string name="notification_exchange_calendar_added" msgid="8998454267739748113">"เพิ่มปฏิทิน Exchange แล้ว"</string>
<string name="app_name" msgid="1707639359526090662">"บริการอีเมล Exchange"</string>
<string name="exception_cancel" msgid="8972887597771126871">"กิจกรรมถูกยกเลิกแล้วในวันที่: <xliff:g id="DATE">%s</xliff:g>"</string>
<string name="exception_updated" msgid="329192591551400871">"วันที่ของกิจกรรมนี้ถูกเปลี่ยนเป็น: <xliff:g id="DATE">%s</xliff:g>"</string>
diff --git a/res/values-tl/strings.xml b/res/values-tl/strings.xml
index 279f86f..bdc01e7 100644
--- a/res/values-tl/strings.xml
+++ b/res/values-tl/strings.xml
@@ -27,7 +27,6 @@
<string name="meeting_recurring" msgid="2752008481765880928">"Kailan: <xliff:g id="EVENTDATE">%s</xliff:g> (paulit-ulit)"</string>
<string name="meeting_allday" msgid="7251209063071628040">"Kailan: <xliff:g id="EVENTDATE">%s</xliff:g> (buong araw)"</string>
<string name="meeting_allday_recurring" msgid="4545762363537362545">"Kailan: <xliff:g id="EVENTDATE">%s</xliff:g> (buong araw, umuulit)"</string>
- <string name="notification_exchange_calendar_added" msgid="8998454267739748113">"Idinagdag ang kalendaryo ng Exchange"</string>
<string name="app_name" msgid="1707639359526090662">"Mga Serbisyo ng Exchange"</string>
<string name="exception_cancel" msgid="8972887597771126871">"Kinansela ang kaganapang ito para sa: <xliff:g id="DATE">%s</xliff:g>"</string>
<string name="exception_updated" msgid="329192591551400871">"Ang mga detalye ng kaganapang ito ay binago para sa: <xliff:g id="DATE">%s</xliff:g>"</string>
diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml
index d4a6350..245ddc4 100644
--- a/res/values-tr/strings.xml
+++ b/res/values-tr/strings.xml
@@ -27,7 +27,6 @@
<string name="meeting_recurring" msgid="2752008481765880928">"Zaman: <xliff:g id="EVENTDATE">%s</xliff:g> (yinelenen)"</string>
<string name="meeting_allday" msgid="7251209063071628040">"Tarih: <xliff:g id="EVENTDATE">%s</xliff:g> (tüm gün)"</string>
<string name="meeting_allday_recurring" msgid="4545762363537362545">"Tarih: <xliff:g id="EVENTDATE">%s</xliff:g> (tüm gün, düzenli)"</string>
- <string name="notification_exchange_calendar_added" msgid="8998454267739748113">"Exchange takvimi eklendi"</string>
<string name="app_name" msgid="1707639359526090662">"Exchange Hizmetleri"</string>
<string name="exception_cancel" msgid="8972887597771126871">"Bu olay şu tarih için iptal edildi: <xliff:g id="DATE">%s</xliff:g>"</string>
<string name="exception_updated" msgid="329192591551400871">"Bu olayın ayrıntıları değiştirildi: <xliff:g id="DATE">%s</xliff:g>"</string>
diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml
index 3664b69..fee5b58 100644
--- a/res/values-uk/strings.xml
+++ b/res/values-uk/strings.xml
@@ -27,7 +27,6 @@
<string name="meeting_recurring" msgid="2752008481765880928">"Коли: <xliff:g id="EVENTDATE">%s</xliff:g> (повтор.)"</string>
<string name="meeting_allday" msgid="7251209063071628040">"Коли: <xliff:g id="EVENTDATE">%s</xliff:g> (увесь день)"</string>
<string name="meeting_allday_recurring" msgid="4545762363537362545">"Коли: <xliff:g id="EVENTDATE">%s</xliff:g> (увесь день, періодично)"</string>
- <string name="notification_exchange_calendar_added" msgid="8998454267739748113">"Додано календар Exchange"</string>
<string name="app_name" msgid="1707639359526090662">"Служби Exchange"</string>
<string name="exception_cancel" msgid="8972887597771126871">"Цю подію було скасовано для: <xliff:g id="DATE">%s</xliff:g>"</string>
<string name="exception_updated" msgid="329192591551400871">"Деталі цієї події змінено на: <xliff:g id="DATE">%s</xliff:g>"</string>
diff --git a/res/values-ur-rPK/strings.xml b/res/values-ur-rPK/strings.xml
index 686e10b..1984b9b 100644
--- a/res/values-ur-rPK/strings.xml
+++ b/res/values-ur-rPK/strings.xml
@@ -27,7 +27,6 @@
<string name="meeting_recurring" msgid="2752008481765880928">"کب: <xliff:g id="EVENTDATE">%s</xliff:g> (اعادی)"</string>
<string name="meeting_allday" msgid="7251209063071628040">"کب: <xliff:g id="EVENTDATE">%s</xliff:g> (تمام دن)"</string>
<string name="meeting_allday_recurring" msgid="4545762363537362545">"کب: <xliff:g id="EVENTDATE">%s</xliff:g> (تمام دن، اعادی)"</string>
- <string name="notification_exchange_calendar_added" msgid="8998454267739748113">"Exchange کیلنڈر شامل ہو گیا"</string>
<string name="app_name" msgid="1707639359526090662">"Exchange سروسز"</string>
<string name="exception_cancel" msgid="8972887597771126871">"یہ ایونٹ منسوخ کر دیا گیا ہے برائے: <xliff:g id="DATE">%s</xliff:g>"</string>
<string name="exception_updated" msgid="329192591551400871">"اس ایونٹ کی تفصیلات کو تبدیل کر دیا گیا ہے برائے: <xliff:g id="DATE">%s</xliff:g>"</string>
diff --git a/res/values-uz-rUZ/strings.xml b/res/values-uz-rUZ/strings.xml
index 2c83d13..a475f17 100644
--- a/res/values-uz-rUZ/strings.xml
+++ b/res/values-uz-rUZ/strings.xml
@@ -27,7 +27,6 @@
<string name="meeting_recurring" msgid="2752008481765880928">"Qachon: <xliff:g id="EVENTDATE">%s</xliff:g> (takrorlanadi)"</string>
<string name="meeting_allday" msgid="7251209063071628040">"Qachon: <xliff:g id="EVENTDATE">%s</xliff:g> (kun bo‘yi)"</string>
<string name="meeting_allday_recurring" msgid="4545762363537362545">"Qachon: <xliff:g id="EVENTDATE">%s</xliff:g> (kun bo‘yi, takrorlanadi)"</string>
- <string name="notification_exchange_calendar_added" msgid="8998454267739748113">"Exchange taqvimi qo‘shildi"</string>
<string name="app_name" msgid="1707639359526090662">"Exchange xizmatlari"</string>
<string name="exception_cancel" msgid="8972887597771126871">"Ushbu tadbir bekor qilindi: <xliff:g id="DATE">%s</xliff:g>"</string>
<string name="exception_updated" msgid="329192591551400871">"Ushbu tadbir tafsilotlari o‘zgartirildi: <xliff:g id="DATE">%s</xliff:g>"</string>
diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml
index 0e2b501..d245a25 100644
--- a/res/values-vi/strings.xml
+++ b/res/values-vi/strings.xml
@@ -27,7 +27,6 @@
<string name="meeting_recurring" msgid="2752008481765880928">"Thời gian: <xliff:g id="EVENTDATE">%s</xliff:g> (lặp lại)"</string>
<string name="meeting_allday" msgid="7251209063071628040">"Thời gian: <xliff:g id="EVENTDATE">%s</xliff:g> (cả ngày)"</string>
<string name="meeting_allday_recurring" msgid="4545762363537362545">"Thời gian: <xliff:g id="EVENTDATE">%s</xliff:g> (cả ngày, lặp lại)"</string>
- <string name="notification_exchange_calendar_added" msgid="8998454267739748113">"Đã thêm lịch Exchange"</string>
<string name="app_name" msgid="1707639359526090662">"Các dịch vụ của Exchange"</string>
<string name="exception_cancel" msgid="8972887597771126871">"Sự kiện này đã bị hủy cho: <xliff:g id="DATE">%s</xliff:g>"</string>
<string name="exception_updated" msgid="329192591551400871">"Chi tiết về sự kiện này đã được thay đổi cho: <xliff:g id="DATE">%s</xliff:g>"</string>
diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml
index 1611844..59c340c 100644
--- a/res/values-zh-rCN/strings.xml
+++ b/res/values-zh-rCN/strings.xml
@@ -27,7 +27,6 @@
<string name="meeting_recurring" msgid="2752008481765880928">"时间:<xliff:g id="EVENTDATE">%s</xliff:g>(重复)"</string>
<string name="meeting_allday" msgid="7251209063071628040">"日期:<xliff:g id="EVENTDATE">%s</xliff:g>(全天)"</string>
<string name="meeting_allday_recurring" msgid="4545762363537362545">"日期:<xliff:g id="EVENTDATE">%s</xliff:g>(全天,循环)"</string>
- <string name="notification_exchange_calendar_added" msgid="8998454267739748113">"已添加Exchange日历"</string>
<string name="app_name" msgid="1707639359526090662">"Exchange服务"</string>
<string name="exception_cancel" msgid="8972887597771126871">"定于以下日期的活动已取消:<xliff:g id="DATE">%s</xliff:g>"</string>
<string name="exception_updated" msgid="329192591551400871">"定于以下日期的活动的详细信息已更改:<xliff:g id="DATE">%s</xliff:g>"</string>
diff --git a/res/values-zh-rHK/strings.xml b/res/values-zh-rHK/strings.xml
index 17bea48..16b89bf 100644
--- a/res/values-zh-rHK/strings.xml
+++ b/res/values-zh-rHK/strings.xml
@@ -27,7 +27,6 @@
<string name="meeting_recurring" msgid="2752008481765880928">"時間:<xliff:g id="EVENTDATE">%s</xliff:g> (週期性)"</string>
<string name="meeting_allday" msgid="7251209063071628040">"時間:<xliff:g id="EVENTDATE">%s</xliff:g> (全日)"</string>
<string name="meeting_allday_recurring" msgid="4545762363537362545">"時間:<xliff:g id="EVENTDATE">%s</xliff:g> (全日,週期性)"</string>
- <string name="notification_exchange_calendar_added" msgid="8998454267739748113">"已新增 Exchange 日曆"</string>
<string name="app_name" msgid="1707639359526090662">"Exchange 服務"</string>
<string name="exception_cancel" msgid="8972887597771126871">"已將以下日期的這項活動取消:<xliff:g id="DATE">%s</xliff:g>"</string>
<string name="exception_updated" msgid="329192591551400871">"已變更此活動於 <xliff:g id="DATE">%s</xliff:g> 時的詳細資料"</string>
diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml
index 169db98..33598c9 100644
--- a/res/values-zh-rTW/strings.xml
+++ b/res/values-zh-rTW/strings.xml
@@ -27,7 +27,6 @@
<string name="meeting_recurring" msgid="2752008481765880928">"時間:<xliff:g id="EVENTDATE">%s</xliff:g> (週期性)"</string>
<string name="meeting_allday" msgid="7251209063071628040">"時間:<xliff:g id="EVENTDATE">%s</xliff:g> (整天)"</string>
<string name="meeting_allday_recurring" msgid="4545762363537362545">"時間:<xliff:g id="EVENTDATE">%s</xliff:g> (整天,週期性)"</string>
- <string name="notification_exchange_calendar_added" msgid="8998454267739748113">"已新增 Exchange 日曆"</string>
<string name="app_name" msgid="1707639359526090662">"Exchange 服務"</string>
<string name="exception_cancel" msgid="8972887597771126871">"已將 <xliff:g id="DATE">%s</xliff:g> 時的此活動取消"</string>
<string name="exception_updated" msgid="329192591551400871">"已變更此活動於 <xliff:g id="DATE">%s</xliff:g> 時的詳細資料"</string>
diff --git a/res/values-zu/strings.xml b/res/values-zu/strings.xml
index 6239b02..ad2509e 100644
--- a/res/values-zu/strings.xml
+++ b/res/values-zu/strings.xml
@@ -27,7 +27,6 @@
<string name="meeting_recurring" msgid="2752008481765880928">"Nini: <xliff:g id="EVENTDATE">%s</xliff:g> (okuvela njalo)"</string>
<string name="meeting_allday" msgid="7251209063071628040">"Nini: <xliff:g id="EVENTDATE">%s</xliff:g> (usuku lonke)"</string>
<string name="meeting_allday_recurring" msgid="4545762363537362545">"Nini: <xliff:g id="EVENTDATE">%s</xliff:g> (usuku lonke, okuqhubekayo)"</string>
- <string name="notification_exchange_calendar_added" msgid="8998454267739748113">"Ukushintsha ikhalenda kufakiwe"</string>
<string name="app_name" msgid="1707639359526090662">"Amasevisi we-Exchange"</string>
<string name="exception_cancel" msgid="8972887597771126871">"Lesi senzakalo sikhanselwe i-<xliff:g id="DATE">%s</xliff:g>"</string>
<string name="exception_updated" msgid="329192591551400871">"Imininingwane yalesenzakalo ishintshelwe:<xliff:g id="DATE">%s</xliff:g>"</string>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 25d5ec5..9fc30e6 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -21,9 +21,9 @@
bulk operation. -->
<!-- Do Not Translate. Unused string. -->
- <!-- Name of Microsoft Exchange account type; used by AccountManager -->
- <string name="exchange_name">Corporate</string>
- <!-- Name of Microsoft Exchange account type; used by AccountManager -->
+ <!-- Short name of Microsoft Exchange account type; used by AccountManager -->
+ <string name="exchange_eas_name" translatable="false">Exchange</string>
+ <!-- Long name of Microsoft Exchange account type; used by AccountManager -->
<string name="exchange_name_alternate">Microsoft Exchange ActiveSync</string>
<!-- Message subject for meeting accepted response. This will be followed
@@ -96,10 +96,6 @@
(all day, recurring)
</string>
- <!-- Notification message in notifications window when calendar sync is
- automatically enabled for pre-existing Exchange accounts on upgrade -->
- <string name="notification_exchange_calendar_added">Exchange calendar added</string>
-
<!-- The name of this APK as shown in manage applications settings. [CHAR LIMIT=30] -->
<string name="app_name" >Exchange Services</string>
diff --git a/src/com/android/exchange/Eas.java b/src/com/android/exchange/Eas.java
index 595f328..2b5a052 100644
--- a/src/com/android/exchange/Eas.java
+++ b/src/com/android/exchange/Eas.java
@@ -35,13 +35,10 @@
public static final String LOG_TAG = "Exchange";
// For debugging
- public static boolean WAIT_DEBUG = false; // DO NOT CHECK IN WITH THIS SET TO TRUE
public static boolean DEBUG = false; // DO NOT CHECK IN WITH THIS SET TO TRUE
// The following two are for user logging (the second providing more detail)
public static boolean USER_LOG = false; // DO NOT CHECK IN WITH THIS SET TO TRUE
- public static boolean PARSER_LOG = false; // DO NOT CHECK IN WITH THIS SET TO TRUE
- public static boolean FILE_LOG = false; // DO NOT CHECK IN WITH THIS SET TO TRUE
public static final String CLIENT_VERSION = "EAS-2.0";
public static final String ACCOUNT_MAILBOX_PREFIX = "__eas";
@@ -129,20 +126,6 @@
public static final int EXCHANGE_ERROR_NOTIFICATION = 0x10;
- public static void setUserDebug(int state) {
- // DEBUG takes precedence and is never true in a user build
- if (!DEBUG) {
- USER_LOG = (state & EmailServiceProxy.DEBUG_BIT) != 0;
- PARSER_LOG = (state & EmailServiceProxy.DEBUG_VERBOSE_BIT) != 0;
- FILE_LOG = (state & EmailServiceProxy.DEBUG_FILE_BIT) != 0;
- if (FILE_LOG || PARSER_LOG) {
- USER_LOG = true;
- }
- LogUtils.d("Eas Debug", "Logging: " + (USER_LOG ? "User " : "") +
- (PARSER_LOG ? "Parser " : "") + (FILE_LOG ? "File" : ""));
- }
- }
-
static public Double getProtocolVersionDouble(String version) {
if (SUPPORTED_PROTOCOL_EX2003.equals(version)) {
return SUPPORTED_PROTOCOL_EX2003_DOUBLE;
diff --git a/src/com/android/exchange/adapter/EmailSyncParser.java b/src/com/android/exchange/adapter/EmailSyncParser.java
index f7d674c..21b2b0c 100644
--- a/src/com/android/exchange/adapter/EmailSyncParser.java
+++ b/src/com/android/exchange/adapter/EmailSyncParser.java
@@ -787,12 +787,16 @@
public void commit() throws RemoteException, OperationApplicationException {
try {
commitImpl(MAX_OPS_PER_BATCH);
- } catch (TransactionTooLargeException e) {
+ } catch (TransactionTooLargeException e1) {
// Try again but apply batch after every message. The max message size defined in
// Eas.EAS12_TRUNCATION_SIZE or Eas.EAS2_5_TRUNCATION_SIZE is small enough to fit
// in a single Binder call.
- LogUtils.w(TAG, "Transaction too large, retrying in single mode", e);
- commitImpl(1);
+ LogUtils.w(TAG, e1, "Transaction too large, retrying in single mode");
+ try {
+ commitImpl(1);
+ } catch (TransactionTooLargeException e2) {
+ LogUtils.wtf(TAG, e2, "Transaction too large with batch size one");
+ }
}
}
@@ -897,16 +901,6 @@
boolean force)
throws RemoteException, OperationApplicationException {
if (force || ops.size() >= maxOpsPerBatch) {
- // STOPSHIP Remove calculating size of data before ship
- if (LogUtils.isLoggable(TAG, Log.DEBUG)) {
- final Parcel parcel = Parcel.obtain();
- for (ContentProviderOperation op : ops) {
- op.writeToParcel(parcel, 0);
- }
- Log.d(TAG, String.format("Committing %d ops total size=%d",
- ops.size(), parcel.dataSize()));
- parcel.recycle();
- }
mContentResolver.applyBatch(EmailContent.AUTHORITY, ops);
ops.clear();
}
diff --git a/src/com/android/exchange/adapter/FolderSyncParser.java b/src/com/android/exchange/adapter/FolderSyncParser.java
index 6db4f60..405202d 100644
--- a/src/com/android/exchange/adapter/FolderSyncParser.java
+++ b/src/com/android/exchange/adapter/FolderSyncParser.java
@@ -42,6 +42,7 @@
import com.android.exchange.Eas;
import com.android.exchange.eas.EasSyncContacts;
import com.android.exchange.eas.EasSyncCalendar;
+import com.android.mail.providers.UIProvider;
import com.android.mail.utils.LogUtils;
import com.google.common.annotations.VisibleForTesting;
@@ -202,8 +203,8 @@
mInitialSync = (mAccount.mSyncKey == null) || "0".equals(mAccount.mSyncKey);
if (mInitialSync) {
// We're resyncing all folders for this account, so nuke any existing ones.
- mContentResolver.delete(Mailbox.CONTENT_URI, WHERE_ACCOUNT_KEY,
- new String[] {mAccountIdAsString});
+ // wipe() will also backup and then restore non default sync settings.
+ wipe();
}
if (nextTag(START_DOCUMENT) != Tags.FOLDER_FOLDER_SYNC)
throw new EasParserException();
@@ -316,10 +317,12 @@
private static class SyncOptions {
private final int mInterval;
private final int mLookback;
+ private final int mSyncState;
- private SyncOptions(int interval, int lookback) {
+ private SyncOptions(int interval, int lookback, int syncState) {
mInterval = interval;
mLookback = lookback;
+ mSyncState = syncState;
}
}
@@ -329,10 +332,12 @@
SyncWindow.SYNC_WINDOW_ACCOUNT + ")";
private static final String[] MAILBOX_STATE_PROJECTION = new String[] {
- MailboxColumns.SERVER_ID, MailboxColumns.SYNC_INTERVAL, MailboxColumns.SYNC_LOOKBACK};
+ MailboxColumns.SERVER_ID, MailboxColumns.SYNC_INTERVAL, MailboxColumns.SYNC_LOOKBACK,
+ MailboxColumns.UI_SYNC_STATUS};
private static final int MAILBOX_STATE_SERVER_ID = 0;
private static final int MAILBOX_STATE_INTERVAL = 1;
private static final int MAILBOX_STATE_LOOKBACK = 2;
+ private static final int MAILBOX_STATE_SYNC_STATUS = 3;
@VisibleForTesting
final HashMap<String, SyncOptions> mSyncOptionsMap = new HashMap<String, SyncOptions>();
@@ -349,9 +354,17 @@
if (c != null) {
try {
while (c.moveToNext()) {
+ int syncStatus = c.getInt(MAILBOX_STATE_SYNC_STATUS);
+ // The only sync status I would ever want to propagate is INITIAL_SYNC_NEEDED.
+ // This is so that after a migration from the old Email to Unified Gmail
+ // won't appear to be empty, but not syncing.
+ if (syncStatus != UIProvider.SyncStatus.INITIAL_SYNC_NEEDED) {
+ syncStatus = UIProvider.SyncStatus.NO_SYNC;
+ }
mSyncOptionsMap.put(c.getString(MAILBOX_STATE_SERVER_ID),
new SyncOptions(c.getInt(MAILBOX_STATE_INTERVAL),
- c.getInt(MAILBOX_STATE_LOOKBACK)));
+ c.getInt(MAILBOX_STATE_LOOKBACK),
+ syncStatus));
}
} finally {
c.close();
@@ -417,6 +430,11 @@
final boolean shouldSync = fromServer && Mailbox.getDefaultSyncStateForType(mailboxType);
cv.put(MailboxColumns.SYNC_INTERVAL, shouldSync ? 1 : 0);
+ if (shouldSync) {
+ cv.put(MailboxColumns.UI_SYNC_STATUS, UIProvider.SyncStatus.INITIAL_SYNC_NEEDED);
+ } else {
+ cv.put(MailboxColumns.UI_SYNC_STATUS, UIProvider.SyncStatus.NO_SYNC);
+ }
// Set basic flags
int flags = 0;
@@ -764,6 +782,12 @@
@Override
protected void wipe() {
+ if (mAccountId == EmailContent.NOT_SAVED) {
+ // This is a dummy account so we don't need to do anything yet.
+ return;
+ }
+
+ // For real accounts, let's go ahead and wipe some data.
EasSyncCalendar.wipeAccountFromContentProvider(mContext,
mAccount.mEmailAddress);
EasSyncContacts.wipeAccountFromContentProvider(mContext,
diff --git a/src/com/android/exchange/adapter/Parser.java b/src/com/android/exchange/adapter/Parser.java
index 6e7e7d8..c4c9218 100644
--- a/src/com/android/exchange/adapter/Parser.java
+++ b/src/com/android/exchange/adapter/Parser.java
@@ -21,6 +21,7 @@
import com.android.exchange.Eas;
import com.android.exchange.EasException;
+import com.android.exchange.service.EasService;
import com.android.exchange.utility.FileLogger;
import com.android.mail.utils.LogUtils;
import com.google.common.annotations.VisibleForTesting;
@@ -68,7 +69,6 @@
private static final int NOT_ENDED = Integer.MIN_VALUE;
private static final int EOF_BYTE = -1;
- private boolean logging = false;
private boolean capture = false;
private ArrayList<Integer> captureArray;
@@ -76,9 +76,6 @@
// The input stream for this parser
private InputStream in;
- // The current tag depth
- private int depth;
-
// The stack of names of tags being processed; used when debug = true
private String[] nameArray = new String[32];
@@ -181,7 +178,6 @@
public Parser(final InputStream in) throws IOException {
setInput(in, true);
- logging = Eas.PARSER_LOG;
}
/**
@@ -191,18 +187,6 @@
*/
public Parser(final Parser parser) throws IOException {
setInput(parser.in, false);
- logging = Eas.PARSER_LOG;
- }
-
- /**
- * Set the debug state of the parser. When debugging is on, every token is logged (LogUtils.v)
- * to the console.
- *
- * @param val the desired state for debug output
- */
- @VisibleForTesting
- public void setDebug(final boolean val) {
- logging = val;
}
protected InputStream getInput() {
@@ -406,7 +390,7 @@
}
void log(final String str) {
- if (!logging) {
+ if (!EasService.getProtocolLogging()) {
return;
}
final String logStr;
@@ -419,8 +403,8 @@
final char [] charArray = new char[startTagArray.size() * 2];
Arrays.fill(charArray, ' ');
final String indent = new String(charArray);
- LogUtils.v(LOG_TAG, "%s", indent + logStr);
- if (Eas.FILE_LOG) {
+ LogUtils.d(LOG_TAG, "%s", indent + logStr);
+ if (EasService.getFileLogging()) {
FileLogger.log(LOG_TAG, logStr);
}
}
@@ -436,7 +420,7 @@
push(id);
}
- private void pop() {
+ protected void pop() {
// Retrieve the now-current startTag from our stack
startTag = startTagArray.removeFirst();
log("</" + startTag + '>');
diff --git a/src/com/android/exchange/adapter/ProvisionParser.java b/src/com/android/exchange/adapter/ProvisionParser.java
index 2cdce4f..4888b8d 100644
--- a/src/com/android/exchange/adapter/ProvisionParser.java
+++ b/src/com/android/exchange/adapter/ProvisionParser.java
@@ -22,6 +22,7 @@
import android.support.v4.content.ContextCompat;
import com.android.emailcommon.provider.Policy;
+import com.android.emailcommon.service.PolicyServiceProxy;
import com.android.exchange.Eas;
import com.android.exchange.R;
import com.android.exchange.eas.EasProvision;
@@ -152,7 +153,16 @@
policy.mPasswordHistory = getValueInt();
break;
case Tags.PROVISION_ALLOW_CAMERA:
+ // We need to check to see if it's possible to disable the camera. It's not
+ // possible on devices with managed profiles.
policy.mDontAllowCamera = (getValueInt() == 0);
+ if (policy.mDontAllowCamera) {
+ // See if it's possible to disable the camera.
+ if (!PolicyServiceProxy.canDisableCamera(mContext)) {
+ tagIsSupported = false;
+ policy.mDontAllowCamera = false;
+ }
+ }
break;
case Tags.PROVISION_ALLOW_SIMPLE_DEVICE_PASSWORD:
// Ignore this unless there's any MSFT documentation for what this means
diff --git a/src/com/android/exchange/adapter/SearchParser.java b/src/com/android/exchange/adapter/SearchParser.java
index 7a65370..8b7bc85 100644
--- a/src/com/android/exchange/adapter/SearchParser.java
+++ b/src/com/android/exchange/adapter/SearchParser.java
@@ -114,7 +114,6 @@
private boolean parseResult(EmailSyncParser parser,
ArrayList<ContentProviderOperation> ops) throws IOException {
- // Get an email sync parser for our incoming message data
boolean res = false;
Message msg = new Message();
while (nextTag(Tags.SEARCH_RESULT) != END) {
@@ -128,7 +127,15 @@
msg.mAccountKey = mAccount.mId;
msg.mMailboxKey = mMailbox.mId;
msg.mFlagLoaded = Message.FLAG_LOADED_COMPLETE;
+ // Delegate parsing of the properties to the EmailSyncParser.
+
+ // We push a new <Properties> tag onto the EmailSyncParser. It will parse
+ // until it consumes the </Properties>
parser.pushTag(tag);
+ // Since the EmailSyncParser is responsible for consuming the </Properties>
+ // tag, we need to remove it from our stack or it will be double counted.
+ pop();
+
parser.addData(msg, tag);
if (msg.mHtml != null) {
msg.mHtml = TextUtilities.highlightTermsInHtml(msg.mHtml, mQuery);
diff --git a/src/com/android/exchange/adapter/Serializer.java b/src/com/android/exchange/adapter/Serializer.java
index d28e4c2..7f696ed 100644
--- a/src/com/android/exchange/adapter/Serializer.java
+++ b/src/com/android/exchange/adapter/Serializer.java
@@ -27,6 +27,7 @@
import android.text.TextUtils;
import com.android.exchange.Eas;
+import com.android.exchange.service.EasService;
import com.android.exchange.utility.FileLogger;
import com.android.mail.utils.LogUtils;
import com.google.common.annotations.VisibleForTesting;
@@ -48,7 +49,6 @@
private int mPendingTag = NOT_PENDING;
private final Deque<String> mNameStack = new ArrayDeque<String>();
private int mTagPage = 0;
- private final boolean mLogging = LogUtils.isLoggable(TAG, LogUtils.VERBOSE);
public Serializer() throws IOException {
this(new ByteArrayOutputStream(), true);
@@ -67,7 +67,6 @@
* Base constructor
* @param outputStream the stream we're serializing to
* @param startDocument whether or not to start a document
- * @param _logging whether or not to log our output
* @throws IOException
*/
public Serializer(final OutputStream outputStream, final boolean startDocument)
@@ -82,7 +81,7 @@
}
void log(final String str) {
- if (!mLogging) {
+ if (!EasService.getProtocolLogging()) {
return;
}
final String logStr;
@@ -95,8 +94,8 @@
final char [] charArray = new char[mNameStack.size() * 2];
Arrays.fill(charArray, ' ');
final String indent = new String(charArray);
- LogUtils.v(TAG, "%s%s", indent, logStr);
- if (Eas.FILE_LOG) {
+ LogUtils.d(TAG, "%s%s", indent, logStr);
+ if (EasService.getFileLogging()) {
FileLogger.log(TAG, logStr);
}
}
diff --git a/src/com/android/exchange/eas/EasAutoDiscover.java b/src/com/android/exchange/eas/EasAutoDiscover.java
index cbcb032..d3927ac 100644
--- a/src/com/android/exchange/eas/EasAutoDiscover.java
+++ b/src/com/android/exchange/eas/EasAutoDiscover.java
@@ -68,22 +68,30 @@
private HostAuth mHostAuth;
private String mRedirectUri;
+
+ private static Account makeAccount(final String username, final String password) {
+ final HostAuth hostAuth = new HostAuth();
+ hostAuth.mLogin = username;
+ hostAuth.mPassword = password;
+ hostAuth.mPort = 443;
+ hostAuth.mProtocol = Eas.PROTOCOL;
+ hostAuth.mFlags = HostAuth.FLAG_SSL | HostAuth.FLAG_AUTHENTICATE;
+ final Account account = new Account();
+ account.mEmailAddress = username;
+ account.mHostAuthRecv = hostAuth;
+ return account;
+ }
+
public EasAutoDiscover(final Context context, final String uri, final int attemptNumber,
final String username, final String password) {
// We don't actually need an account or a hostAuth, but the EasServerConnection requires
// one. Just create dummy values.
- super(context, -1);
+ super(context, makeAccount(username, password));
mAttemptNumber = attemptNumber;
mUri = uri;
mUsername = username;
mPassword = password;
- mHostAuth = new HostAuth();
- mHostAuth.mLogin = mUsername;
- mHostAuth.mPassword = mPassword;
- mHostAuth.mPort = 443;
- mHostAuth.mProtocol = Eas.PROTOCOL;
- mHostAuth.mFlags = HostAuth.FLAG_SSL | HostAuth.FLAG_AUTHENTICATE;
- setAccount(new Account(), mHostAuth);
+ mHostAuth = mAccount.mHostAuthRecv;
}
public static String genUri(final String domain, final int attemptNumber) {
diff --git a/src/com/android/exchange/eas/EasFolderSync.java b/src/com/android/exchange/eas/EasFolderSync.java
index f9853b8..b5e28c1 100644
--- a/src/com/android/exchange/eas/EasFolderSync.java
+++ b/src/com/android/exchange/eas/EasFolderSync.java
@@ -29,7 +29,6 @@
import com.android.exchange.adapter.FolderSyncParser;
import com.android.exchange.adapter.Serializer;
import com.android.exchange.adapter.Tags;
-import com.android.exchange.service.EasService;
import com.android.mail.utils.LogUtils;
import org.apache.http.HttpEntity;
@@ -65,17 +64,6 @@
private Bundle mValidationResult;
/**
- * Constructor for use with {@link EasService} when performing an actual sync.
- * @param context
- * @param accountId
- */
- public EasFolderSync(final Context context, final long accountId) {
- super(context, accountId);
- mStatusOnly = false;
- mPolicy = null;
- }
-
- /**
* Constructor for actually doing folder sync.
* @param context
* @param account
@@ -86,14 +74,20 @@
mPolicy = null;
}
+ private static Account makeAccount(final HostAuth hostAuth) {
+ final Account account = new Account();
+ account.mHostAuthRecv = hostAuth;
+ account.mEmailAddress = hostAuth.mLogin;
+ return account;
+ }
+
/**
* Constructor for account validation.
* @param context
* @param hostAuth
*/
public EasFolderSync(final Context context, final HostAuth hostAuth) {
- super(context, -1);
- setDummyAccount(hostAuth);
+ super(context, makeAccount(hostAuth), hostAuth);
mStatusOnly = true;
}
diff --git a/src/com/android/exchange/eas/EasFullSyncOperation.java b/src/com/android/exchange/eas/EasFullSyncOperation.java
index 8714834..ba81466 100644
--- a/src/com/android/exchange/eas/EasFullSyncOperation.java
+++ b/src/com/android/exchange/eas/EasFullSyncOperation.java
@@ -5,7 +5,6 @@
import android.content.Context;
import android.database.Cursor;
import android.os.Bundle;
-import android.os.RemoteException;
import android.provider.CalendarContract;
import android.provider.ContactsContract;
@@ -31,7 +30,7 @@
private final static String TAG = LogUtils.TAG;
private final static int RESULT_SUCCESS = 0;
- private final static int RESULT_SECURITY_HOLD = -100;
+ public final static int RESULT_SECURITY_HOLD = -100;
public static final int SEND_FAILED = 1;
public static final String MAILBOX_KEY_AND_NOT_SEND_FAILED =
@@ -57,9 +56,9 @@
final Bundle mSyncExtras;
Set<String> mAuthsToSync;
- public EasFullSyncOperation(final Context context, final long accountId,
+ public EasFullSyncOperation(final Context context, final Account account,
final Bundle syncExtras) {
- super(context, accountId);
+ super(context, account);
mSyncExtras = syncExtras;
}
@@ -95,12 +94,12 @@
@Override
public int performOperation() {
- // Make sure the account is loaded if it hasn't already been.
- if (!init(false)) {
- LogUtils.i(LOG_TAG, "Failed to initialize %d before operation EasFullSyncOperation",
- getAccountId());
+ if (!init()) {
+ LogUtils.i(LOG_TAG, "Failed to initialize %d before sending request for operation %s",
+ getAccountId(), getCommand());
return RESULT_INITIALIZATION_FAILURE;
}
+
final android.accounts.Account amAccount = new android.accounts.Account(
mAccount.mEmailAddress, Eas.EXCHANGE_ACCOUNT_MANAGER_TYPE);
mAuthsToSync = EasService.getAuthoritiesToSync(amAccount, AUTHORITIES_TO_SYNC);
@@ -148,6 +147,7 @@
// Do not permit further syncs if we're on security hold.
if ((mAccount.mFlags & Account.FLAGS_SECURITY_HOLD) != 0) {
+ LogUtils.d(TAG, "Account is on security hold %d", mAccount.getId());
return RESULT_SECURITY_HOLD;
}
@@ -240,31 +240,34 @@
return EmailServiceStatus.SUCCESS;
}
- int result = 0;
+ int syncResult = 0;
// Non-mailbox syncs are whole account syncs initiated by the AccountManager and are
// treated as background syncs.
if (mailbox.mType == Mailbox.TYPE_OUTBOX || mailbox.isSyncable()) {
final ContentValues cv = new ContentValues(2);
- updateMailbox(mailbox, cv, isUserSync ?
- EmailContent.SYNC_STATUS_USER : EmailContent.SYNC_STATUS_BACKGROUND);
+ final int syncStatus = isUserSync ?
+ EmailContent.SYNC_STATUS_USER : EmailContent.SYNC_STATUS_BACKGROUND;
+ updateMailbox(mailbox, cv, syncStatus);
try {
if (mailbox.mType == Mailbox.TYPE_OUTBOX) {
return syncOutbox(mailbox.mId);
}
if (hasCallbackMethod) {
- EmailServiceStatus.syncMailboxStatus(mContext.getContentResolver(), mSyncExtras,
- mailbox.mId, EmailServiceStatus.IN_PROGRESS, 0,
+ final int lastSyncResult = UIProvider.createSyncValue(syncStatus,
UIProvider.LastSyncResult.SUCCESS);
+ EmailServiceStatus.syncMailboxStatus(mContext.getContentResolver(), mSyncExtras,
+ mailbox.mId, EmailServiceStatus.IN_PROGRESS, 0, lastSyncResult);
}
final EasSyncBase operation = new EasSyncBase(mContext, mAccount, mailbox);
LogUtils.d(TAG, "IEmailService.syncMailbox account %d", mAccount.mId);
- result = operation.performOperation();
+ syncResult = operation.performOperation();
} finally {
updateMailbox(mailbox, cv, EmailContent.SYNC_STATUS_NONE);
if (hasCallbackMethod) {
+ final int uiSyncResult = translateSyncResultToUiResult(syncResult);
+ final int lastSyncResult = UIProvider.createSyncValue(syncStatus, uiSyncResult);
EmailServiceStatus.syncMailboxStatus(mContext.getContentResolver(), mSyncExtras,
- mailbox.mId, EmailServiceStatus.SUCCESS, 0,
- EasOperation.translateSyncResultToUiResult(result));
+ mailbox.mId, EmailServiceStatus.SUCCESS, 0, lastSyncResult);
}
}
} else {
@@ -272,7 +275,7 @@
LogUtils.d(TAG, "Skipping sync of non syncable folder");
}
- return result;
+ return syncResult;
}
private int syncOutbox(final long mailboxId) {
@@ -304,16 +307,23 @@
if (result == EasOutboxSync.RESULT_ITEM_NOT_FOUND) {
// This can happen if we are using smartReply, and the message we are referring
// to has disappeared from the server. Try again with smartReply disabled.
+ // This should be a legitimate, but unusual case. Log a warning.
+ LogUtils.w(TAG, "WARNING: EasOutboxSync falling back from smartReply");
op = new EasOutboxSync(mContext, mAccount, message, false);
result = op.performOperation();
}
// If we got some connection error or other fatal error, terminate the sync.
- // RESULT_NON_FATAL_ERROR
+ // If we get some non-fatal error, continue.
if (result != EasOutboxSync.RESULT_OK &&
result != EasOutboxSync.RESULT_NON_FATAL_ERROR &&
result > EasOutboxSync.RESULT_OP_SPECIFIC_ERROR_RESULT) {
LogUtils.w(TAG, "Aborting outbox sync for error %d", result);
return result;
+ } else if (result <= EasOutboxSync.RESULT_OP_SPECIFIC_ERROR_RESULT) {
+ // There are several different conditions that can cause outbox syncing to fail,
+ // but they shouldn't prevent us from continuing and trying to downsync
+ // other mailboxes.
+ LogUtils.i(TAG, "Outbox sync failed with result %d", result);
}
}
} finally {
diff --git a/src/com/android/exchange/eas/EasLoadAttachment.java b/src/com/android/exchange/eas/EasLoadAttachment.java
index 9527e51..16e4d0e 100644
--- a/src/com/android/exchange/eas/EasLoadAttachment.java
+++ b/src/com/android/exchange/eas/EasLoadAttachment.java
@@ -19,6 +19,7 @@
import android.content.Context;
import android.os.RemoteException;
+import com.android.emailcommon.provider.Account;
import com.android.emailcommon.provider.EmailContent;
import com.android.emailcommon.provider.EmailContent.Attachment;
import com.android.emailcommon.service.EmailServiceStatus;
@@ -69,15 +70,15 @@
/**
* Constructor for use with {@link EasService} when performing an actual sync.
* @param context Our {@link Context}.
- * @param accountId The id of the account in question (i.e. its id in the database).
+ * @param account The account we're loading the attachment for.
* @param attachmentId The local id of the attachment (i.e. its id in the database).
* @param callback The callback for any status updates.
*/
- public EasLoadAttachment(final Context context, final long accountId, final long attachmentId,
+ public EasLoadAttachment(final Context context, final Account account, final long attachmentId,
final IEmailServiceCallback callback) {
// The account is loaded before performOperation but it is not guaranteed to be available
// before then.
- super(context, accountId);
+ super(context, account);
mCallback = callback;
mAttachmentId = attachmentId;
}
diff --git a/src/com/android/exchange/eas/EasOperation.java b/src/com/android/exchange/eas/EasOperation.java
index ef7d2a8..c633050 100644
--- a/src/com/android/exchange/eas/EasOperation.java
+++ b/src/com/android/exchange/eas/EasOperation.java
@@ -24,6 +24,7 @@
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
+import android.support.annotation.NonNull;
import android.telephony.TelephonyManager;
import android.text.TextUtils;
import android.text.format.DateUtils;
@@ -149,11 +150,8 @@
protected final Context mContext;
- /** The provider id for the account this operation is on. */
- private final long mAccountId;
-
/** The cached {@link Account} state; can be null if it hasn't been loaded yet. */
- protected Account mAccount;
+ protected final Account mAccount;
/** The connection to use for this operation. This is created when {@link #mAccount} is set. */
protected EasServerConnection mConnection;
@@ -164,30 +162,18 @@
}
}
- @VisibleForTesting
- public void replaceEasServerConnection(EasServerConnection connection) {
- mConnection = connection;
- }
-
public static boolean isFatal(int result) {
return result < RESULT_MIN_OK_RESULT;
}
- /**
- * Constructor which defers loading of account and connection info.
- * @param context
- * @param accountId
- */
- protected EasOperation(final Context context, final long accountId) {
- mContext = context;
- mAccountId = accountId;
- }
-
- protected EasOperation(final Context context, final Account account,
+ protected EasOperation(final Context context, @NonNull final Account account,
final EasServerConnection connection) {
- this(context, account.mId);
+ mContext = context;
mAccount = account;
mConnection = connection;
+ if (account == null) {
+ throw new IllegalStateException("Null account in EasOperation");
+ }
}
protected EasOperation(final Context context, final Account account, final HostAuth hostAuth) {
@@ -205,59 +191,21 @@
*/
protected EasOperation(final EasOperation parentOperation) {
mContext = parentOperation.mContext;
- mAccountId = parentOperation.mAccountId;
mAccount = parentOperation.mAccount;
mConnection = parentOperation.mConnection;
}
/**
- * Some operations happen before the account exists (e.g. account validation).
- * These operations cannot use {@link #init}, so instead we make a dummy account and
- * supply a temporary {@link HostAuth}.
- * @param hostAuth
+ * This will always be called at the begining of performOperation and can be overridden
+ * to do whatever setup is needed.
+ * @return true if initialization succeeded, false otherwise.
*/
- protected final void setDummyAccount(final HostAuth hostAuth) {
- mAccount = new Account();
- mAccount.mEmailAddress = hostAuth.mLogin;
- mConnection = new EasServerConnection(mContext, mAccount, hostAuth);
- }
-
- /**
- * Loads (or reloads) the {@link Account} for this operation, and sets up our connection to the
- * server. This can be overridden to add additional functionality, but child implementations
- * should always call super().
- * @param allowReload If false, do not perform a load if we already have an {@link Account}
- * (i.e. just keep the existing one); otherwise allow replacement of the
- * account. Note that this can result in a valid Account being replaced with
- * null if the account no longer exists.
- * @return Whether we now have a valid {@link Account} object.
- */
- public boolean init(final boolean allowReload) {
- if (mAccount == null || allowReload) {
- mAccount = Account.restoreAccountWithId(mContext, getAccountId());
- if (mAccount != null) {
- mConnection = new EasServerConnection(mContext, mAccount,
- mAccount.getOrCreateHostAuthRecv(mContext));
- }
- }
- return (mAccount != null);
- }
-
- /**
- * Sets the account. This is for use in cases where the account is not available upon
- * construction. This will also create the EasServerConnection.
- * @param account
- * @param hostAuth
- */
- protected void setAccount(final Account account, final HostAuth hostAuth) {
- mAccount = account;
- if (mAccount != null) {
- mConnection = new EasServerConnection(mContext, mAccount, hostAuth);
- }
+ public boolean init() {
+ return true;
}
public final long getAccountId() {
- return mAccountId;
+ return mAccount.getId();
}
public final Account getAccount() {
@@ -307,13 +255,19 @@
* @return A result code for the outcome of this operation, as described above.
*/
public int performOperation() {
- // Make sure the account is loaded if it hasn't already been.
- if (!init(false)) {
+ if (!init()) {
LogUtils.i(LOG_TAG, "Failed to initialize %d before sending request for operation %s",
getAccountId(), getCommand());
return RESULT_INITIALIZATION_FAILURE;
}
+ try {
+ return performOperationInternal();
+ } finally {
+ onRequestComplete();
+ }
+ }
+ private int performOperationInternal() {
// We handle server redirects by looping, but we need to protect against too much looping.
int redirectCount = 0;
@@ -454,6 +408,13 @@
// been sent. It will always be called, regardless of the status of the request.
}
+ protected void onRequestComplete() {
+ // This can be overridden to do any cleanup that must happen after the request has
+ // finished. (i.e. either the response has come back and been processed, or some error
+ // has occurred and we have given up.
+ // It will always be called, regardless of the status of the response.
+ }
+
protected int handleHttpError(final int httpStatus) {
// This function can be overriden if the child class needs to change the result code
// based on the http response status.
diff --git a/src/com/android/exchange/eas/EasOutboxSync.java b/src/com/android/exchange/eas/EasOutboxSync.java
index ba25971..60ffc51 100644
--- a/src/com/android/exchange/eas/EasOutboxSync.java
+++ b/src/com/android/exchange/eas/EasOutboxSync.java
@@ -83,10 +83,9 @@
* need to reset any derived values (eg, mIsEas14).
*/
@Override
- public boolean init(final boolean allowReload) {
- final boolean haveValidAccount = super.init(allowReload);
+ public boolean init() {
initEas14();
- return haveValidAccount;
+ return true;
}
private void initEas14() {
@@ -192,30 +191,30 @@
// The parser holds the status
final int status = p.getStatus();
if (CommandStatus.isNeedsProvisioning(status)) {
- LogUtils.w(LOG_TAG, "Needs provisioning sending mail");
+ LogUtils.w(LOG_TAG, "Needs provisioning before sending message: %d",
+ mMessage.mId);
return RESULT_PROVISIONING_ERROR;
- } else if (status == CommandStatus.ITEM_NOT_FOUND &&
- mSmartSendInfo != null) {
+ } else if (status == CommandStatus.ITEM_NOT_FOUND && mSmartSendInfo != null) {
// Let's retry without "smart" commands.
- LogUtils.w(LOG_TAG, "Needs provisioning sending mail");
+ LogUtils.w(LOG_TAG, "ITEM_NOT_FOUND smart sending message: %d", mMessage.mId);
return RESULT_ITEM_NOT_FOUND;
}
-
// TODO: Set syncServerId = SEND_FAILED in DB?
- LogUtils.d(LOG_TAG, "General failure sending mail");
+ LogUtils.w(LOG_TAG, "General failure sending message: %d", mMessage.mId);
return RESULT_SEND_FAILED;
} catch (final EmptyStreamException e) {
// This is actually fine; an empty stream means SendMail succeeded
- LogUtils.d(LOG_TAG, "empty response sending mail");
+ LogUtils.d(LOG_TAG, "Empty response sending message: %d", mMessage.mId);
// Don't return here, fall through so that we'll delete the sent message.
} catch (final IOException e) {
// Parsing failed in some other way.
- LogUtils.w(LOG_TAG, "IOException sending mail");
+ LogUtils.e(LOG_TAG, e, "IOException sending message: %d", mMessage.mId);
return RESULT_IO_ERROR;
}
} else {
// FLAG: Do we need to parse results for earlier versions?
}
+ LogUtils.d(LOG_TAG, "Returning RESULT_OK after sending: %d", mMessage.mId);
mContext.getContentResolver().delete(
ContentUris.withAppendedId(Message.CONTENT_URI, mMessage.mId), null, null);
return RESULT_OK;
@@ -349,8 +348,10 @@
if (reply && forward) {
return null;
}
- // If we don't support SmartForward and it's a forward, then don't proceed.
- if (forward && (account.mFlags & Account.FLAGS_SUPPORTS_SMART_FORWARD) == 0) {
+ // If we don't support SmartForward, then don't proceed.
+ // TODO: For now, we assume that if we do not support Smart Forward, we also don't
+ // support Smart Reply. At some point, perhaps these should be separate flags.
+ if ((account.mFlags & Account.FLAGS_SUPPORTS_SMART_FORWARD) == 0) {
return null;
}
@@ -362,6 +363,7 @@
// First, we need to get the id of the reply/forward message, 0 is the default value
// so we are looking for something greater than 0.
final long refId = Body.restoreBodySourceKey(context, message.mId);
+ LogUtils.d(LOG_TAG, "getSmartSendInfo - found refId: %d for %d", refId, message.mId);
if (refId > 0) {
// Then, we need the serverId and mailboxKey of the message
final String[] colsMailboxKey = Utility.getRowColumns(context, Message.CONTENT_URI,
@@ -405,6 +407,10 @@
requiredAtts = null;
}
return new SmartSendInfo(itemId, collectionId, reply, requiredAtts);
+ } else {
+ LogUtils.w(LOG_TAG,
+ "getSmartSendInfo - Skipping SmartSend, could not find IDs for: %d",
+ message.mId);
}
return null;
}
diff --git a/src/com/android/exchange/eas/EasPing.java b/src/com/android/exchange/eas/EasPing.java
index 8b082e3..d3263d3 100644
--- a/src/com/android/exchange/eas/EasPing.java
+++ b/src/com/android/exchange/eas/EasPing.java
@@ -368,7 +368,8 @@
case Mailbox.TYPE_CONTACTS:
contactsMailboxIds.add(mailboxId);
default:
- LogUtils.e(LOG_TAG, "unexpected collectiontype %d in EasPing", contentType);
+ LogUtils.e(LOG_TAG, "unexpected collectiontype %d in EasPing",
+ contentType);
}
}
} finally {
diff --git a/src/com/android/exchange/eas/EasSearch.java b/src/com/android/exchange/eas/EasSearch.java
index 34869bb..64100f4 100644
--- a/src/com/android/exchange/eas/EasSearch.java
+++ b/src/com/android/exchange/eas/EasSearch.java
@@ -5,6 +5,7 @@
import android.content.SyncResult;
import com.android.emailcommon.Logging;
+import com.android.emailcommon.provider.Account;
import com.android.emailcommon.provider.Mailbox;
import com.android.emailcommon.service.SearchParams;
import com.android.exchange.CommandStatusException;
@@ -39,10 +40,11 @@
final SearchParams mSearchParams;
final long mDestMailboxId;
int mTotalResults;
+ Mailbox mSearchMailbox;
- public EasSearch(final Context context, final long accountId, final SearchParams searchParams,
+ public EasSearch(final Context context, final Account account, final SearchParams searchParams,
final long destMailboxId) {
- super(context, accountId);
+ super(context, account);
mSearchParams = searchParams;
mDestMailboxId = destMailboxId;
}
@@ -72,17 +74,17 @@
}
int res = 0;
- final Mailbox searchMailbox = Mailbox.restoreMailboxWithId(mContext, mDestMailboxId);
+ mSearchMailbox = Mailbox.restoreMailboxWithId(mContext, mDestMailboxId);
// Sanity check; account might have been deleted?
- if (searchMailbox == null) {
+ if (mSearchMailbox == null) {
LogUtils.i(LOG_TAG, "search mailbox ceased to exist");
return null;
}
- final ContentValues statusValues = new ContentValues(2);
try {
// Set the status of this mailbox to indicate query
+ final ContentValues statusValues = new ContentValues(1);
statusValues.put(Mailbox.UI_SYNC_STATUS, UIProvider.SyncStatus.LIVE_QUERY);
- searchMailbox.update(mContext, statusValues);
+ mSearchMailbox.update(mContext, statusValues);
final Serializer s = new Serializer();
s.start(Tags.SEARCH_SEARCH).start(Tags.SEARCH_STORE);
@@ -133,12 +135,6 @@
return makeEntity(s);
} catch (IOException e) {
LogUtils.d(LOG_TAG, e, "Search exception");
- } finally {
- // TODO: Handle error states
- // Set the status of this mailbox to indicate query over
- statusValues.put(Mailbox.SYNC_TIME, System.currentTimeMillis());
- statusValues.put(Mailbox.UI_SYNC_STATUS, UIProvider.SyncStatus.NO_SYNC);
- searchMailbox.update(mContext, statusValues);
}
LogUtils.i(LOG_TAG, "end returning null");
return null;
@@ -162,4 +158,14 @@
}
return RESULT_OK;
}
+
+ protected void onRequestComplete() {
+ if (mSearchMailbox != null) {
+ // TODO: Handle error states
+ final ContentValues statusValues = new ContentValues(2);
+ statusValues.put(Mailbox.UI_SYNC_STATUS, UIProvider.SyncStatus.NO_SYNC);
+ statusValues.put(Mailbox.SYNC_TIME, System.currentTimeMillis());
+ mSearchMailbox.update(mContext, statusValues);
+ }
+ }
}
diff --git a/src/com/android/exchange/eas/EasSearchGal.java b/src/com/android/exchange/eas/EasSearchGal.java
index 0dbadd2..ea3c27c 100644
--- a/src/com/android/exchange/eas/EasSearchGal.java
+++ b/src/com/android/exchange/eas/EasSearchGal.java
@@ -2,6 +2,7 @@
import android.content.Context;
+import com.android.emailcommon.provider.Account;
import com.android.exchange.CommandStatusException;
import com.android.exchange.EasResponse;
import com.android.exchange.adapter.GalParser;
@@ -25,9 +26,9 @@
final private int mLimit;
private GalResult mResult;
- public EasSearchGal(Context context, final long accountId, final String filter,
+ public EasSearchGal(Context context, final Account account, final String filter,
final int limit) {
- super(context, accountId);
+ super(context, account);
mFilter = filter;
mLimit = limit;
}
diff --git a/src/com/android/exchange/eas/EasSendMeetingResponse.java b/src/com/android/exchange/eas/EasSendMeetingResponse.java
index 7897bb5..ba1411f 100644
--- a/src/com/android/exchange/eas/EasSendMeetingResponse.java
+++ b/src/com/android/exchange/eas/EasSendMeetingResponse.java
@@ -52,9 +52,9 @@
private final int mMeetingResponse;
private int mEasResponse;
- public EasSendMeetingResponse(final Context context, final long accountId,
+ public EasSendMeetingResponse(final Context context, final Account account,
final EmailContent.Message message, final int meetingResponse) {
- super(context, accountId);
+ super(context, account);
mMessage = message;
mMeetingResponse = meetingResponse;
}
diff --git a/src/com/android/exchange/eas/EasSyncBase.java b/src/com/android/exchange/eas/EasSyncBase.java
index e892518..8e77e26 100644
--- a/src/com/android/exchange/eas/EasSyncBase.java
+++ b/src/com/android/exchange/eas/EasSyncBase.java
@@ -65,18 +65,15 @@
}
@Override
- public boolean init(final boolean allowReload) {
- final boolean result = super.init(allowReload);
- if (result) {
- mCollectionTypeHandler = getCollectionTypeHandler(mMailbox.mType);
- if (mCollectionTypeHandler == null) {
- return false;
- }
- // Set up traffic stats bookkeeping.
- final int trafficFlags = TrafficFlags.getSyncFlags(mContext, mAccount);
- TrafficStats.setThreadStatsTag(trafficFlags | mCollectionTypeHandler.getTrafficFlag());
+ public boolean init() {
+ mCollectionTypeHandler = getCollectionTypeHandler(mMailbox.mType);
+ if (mCollectionTypeHandler == null) {
+ return false;
}
- return result;
+ // Set up traffic stats bookkeeping.
+ final int trafficFlags = TrafficFlags.getSyncFlags(mContext, mAccount);
+ TrafficStats.setThreadStatsTag(trafficFlags | mCollectionTypeHandler.getTrafficFlag());
+ return true;
}
@Override
diff --git a/src/com/android/exchange/provider/ExchangeDirectoryProvider.java b/src/com/android/exchange/provider/ExchangeDirectoryProvider.java
index 6d9ea6e..280ef0c 100644
--- a/src/com/android/exchange/provider/ExchangeDirectoryProvider.java
+++ b/src/com/android/exchange/provider/ExchangeDirectoryProvider.java
@@ -116,13 +116,29 @@
}
}
+ static class GalDisplayNameFields {
+ private final String displayName;
+ private final String displayNameSource;
+ private final String alternateDisplayName;
+
+ GalDisplayNameFields(PackedString ps) {
+ displayName = ps.get(GalData.DISPLAY_NAME);
+ displayNameSource = ps.get(GalData.DISPLAY_NAME_SOURCE);
+ alternateDisplayName = ps.get(GalData.DISPLAY_NAME_ALTERNATIVE);
+ }
+
+ String getDisplayName() { return displayName; }
+ String getDisplayNameSource() { return displayNameSource; }
+ String getAlternateDisplayName() { return alternateDisplayName; }
+ }
+
static class GalContactRow {
private final GalProjection mProjection;
private Object[] row;
static long dataId = 1;
GalContactRow(GalProjection projection, long contactId, String accountName,
- String displayName) {
+ GalDisplayNameFields displayNameFields) {
this.mProjection = projection;
row = new Object[projection.size];
@@ -132,10 +148,9 @@
put(Contacts.Entity.RAW_CONTACT_ID, contactId);
put(Contacts.Entity.DATA_ID, dataId++);
- put(Contacts.DISPLAY_NAME, displayName);
-
- // TODO alternative display name
- put(Contacts.DISPLAY_NAME_ALTERNATIVE, displayName);
+ put(Contacts.DISPLAY_NAME, displayNameFields.getDisplayName());
+ put(Contacts.DISPLAY_NAME_SOURCE, displayNameFields.getDisplayNameSource());
+ put(Contacts.DISPLAY_NAME_ALTERNATIVE, displayNameFields.getAlternateDisplayName());
put(RawContacts.ACCOUNT_TYPE, Eas.EXCHANGE_ACCOUNT_MANAGER_TYPE);
put(RawContacts.ACCOUNT_NAME, accountName);
@@ -157,10 +172,11 @@
}
static void addEmailAddress(MatrixCursor cursor, GalProjection galProjection,
- long contactId, String accountName, String displayName, String address) {
+ long contactId, String accountName, GalDisplayNameFields displayNameFields,
+ String address) {
if (!TextUtils.isEmpty(address)) {
final GalContactRow r = new GalContactRow(
- galProjection, contactId, accountName, displayName);
+ galProjection, contactId, accountName, displayNameFields);
r.put(Data.MIMETYPE, Email.CONTENT_ITEM_TYPE);
r.put(Email.TYPE, Email.TYPE_WORK);
r.put(Email.ADDRESS, address);
@@ -169,10 +185,10 @@
}
static void addPhoneRow(MatrixCursor cursor, GalProjection projection, long contactId,
- String accountName, String displayName, int type, String number) {
+ String accountName, GalDisplayNameFields displayNameFields, int type, String number) {
if (!TextUtils.isEmpty(number)) {
final GalContactRow r = new GalContactRow(
- projection, contactId, accountName, displayName);
+ projection, contactId, accountName, displayNameFields);
r.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE);
r.put(Phone.TYPE, type);
r.put(Phone.NUMBER, number);
@@ -181,14 +197,14 @@
}
public static void addNameRow(MatrixCursor cursor, GalProjection galProjection,
- long contactId, String accountName, String displayName,
+ long contactId, String accountName, GalDisplayNameFields displayNameFields,
String firstName, String lastName) {
final GalContactRow r = new GalContactRow(
- galProjection, contactId, accountName, displayName);
+ galProjection, contactId, accountName, displayNameFields);
r.put(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE);
r.put(StructuredName.GIVEN_NAME, firstName);
r.put(StructuredName.FAMILY_NAME, lastName);
- r.put(StructuredName.DISPLAY_NAME, displayName);
+ r.put(StructuredName.DISPLAY_NAME, displayNameFields.getDisplayName());
cursor.addRow(r.getRow());
}
}
@@ -246,7 +262,7 @@
if (bundle != null && !bundle.getBoolean(
Configuration.EXCHANGE_CONFIGURATION_USE_ALTERNATE_STRINGS,
true)) {
- exchangeName = R.string.exchange_name;
+ exchangeName = R.string.exchange_eas_name;
}
row[i] = exchangeName;
} else if (column.equals(Directory.DISPLAY_NAME)) {
@@ -354,17 +370,17 @@
? Long.parseLong(pathSegments.get(3))
: DEFAULT_CONTACT_ID;
ps = new PackedString(lookupKey);
- final String displayName = ps.get(GalData.DISPLAY_NAME);
- GalContactRow.addEmailAddress(cursor, galProjection, contactId,
- accountName, displayName, ps.get(GalData.EMAIL_ADDRESS));
- GalContactRow.addPhoneRow(cursor, galProjection, contactId,
- displayName, displayName, Phone.TYPE_HOME, ps.get(GalData.HOME_PHONE));
- GalContactRow.addPhoneRow(cursor, galProjection, contactId,
- displayName, displayName, Phone.TYPE_WORK, ps.get(GalData.WORK_PHONE));
- GalContactRow.addPhoneRow(cursor, galProjection, contactId,
- displayName, displayName, Phone.TYPE_MOBILE, ps.get(GalData.MOBILE_PHONE));
- GalContactRow.addNameRow(cursor, galProjection, contactId, displayName,
- ps.get(GalData.FIRST_NAME), ps.get(GalData.LAST_NAME), displayName);
+ final GalDisplayNameFields displayNameFields = new GalDisplayNameFields(ps);
+ GalContactRow.addEmailAddress(cursor, galProjection, contactId, accountName, displayNameFields,
+ ps.get(GalData.EMAIL_ADDRESS));
+ GalContactRow.addPhoneRow(cursor, galProjection, contactId, accountName, displayNameFields,
+ Phone.TYPE_HOME, ps.get(GalData.HOME_PHONE));
+ GalContactRow.addPhoneRow(cursor, galProjection, contactId, accountName, displayNameFields,
+ Phone.TYPE_WORK, ps.get(GalData.WORK_PHONE));
+ GalContactRow.addPhoneRow(cursor, galProjection, contactId, accountName, displayNameFields,
+ Phone.TYPE_MOBILE, ps.get(GalData.MOBILE_PHONE));
+ GalContactRow.addNameRow(cursor, galProjection, contactId, accountName, displayNameFields,
+ ps.get(GalData.FIRST_NAME), ps.get(GalData.LAST_NAME));
return cursor;
}
}
@@ -462,6 +478,7 @@
continue;
}
galDataRow.put(GalData.DISPLAY_NAME, displayName.first);
+ galDataRow.put(GalData.DISPLAY_NAME_SOURCE, String.valueOf(displayName.second));
final String alternateDisplayName = getAlternateDisplayName(
galDataRow, displayName.first);
@@ -475,6 +492,7 @@
row[displayNameSourceIndex] = displayName.second;
}
+ galDataRow.put(GalData.DISPLAY_NAME_ALTERNATIVE, alternateDisplayName);
if (alternateDisplayNameIndex != -1) {
row[alternateDisplayNameIndex] = alternateDisplayName;
}
diff --git a/src/com/android/exchange/provider/GalResult.java b/src/com/android/exchange/provider/GalResult.java
index a431237..45273a6 100644
--- a/src/com/android/exchange/provider/GalResult.java
+++ b/src/com/android/exchange/provider/GalResult.java
@@ -48,6 +48,8 @@
// PackedString constants for GalData
public static final String ID = "_id";
public static final String DISPLAY_NAME = "displayName";
+ public static final String DISPLAY_NAME_SOURCE = "display_name_source";
+ public static final String DISPLAY_NAME_ALTERNATIVE = "display_name_alt";
public static final String EMAIL_ADDRESS = "emailAddress";
public static final String WORK_PHONE = "workPhone";
public static final String HOME_PHONE = "homePhone";
diff --git a/src/com/android/exchange/service/EasService.java b/src/com/android/exchange/service/EasService.java
index 8c29ba1..cf0a983 100644
--- a/src/com/android/exchange/service/EasService.java
+++ b/src/com/android/exchange/service/EasService.java
@@ -20,6 +20,7 @@
import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
+import android.content.SharedPreferences;
import android.database.Cursor;
import android.os.AsyncTask;
import android.os.Bundle;
@@ -47,6 +48,7 @@
import com.android.exchange.eas.EasFullSyncOperation;
import com.android.exchange.eas.EasLoadAttachment;
import com.android.exchange.eas.EasOperation;
+import com.android.exchange.eas.EasPing;
import com.android.exchange.eas.EasSearch;
import com.android.exchange.eas.EasSearchGal;
import com.android.exchange.eas.EasSendMeetingResponse;
@@ -54,6 +56,7 @@
import com.android.exchange.eas.EasSyncContacts;
import com.android.exchange.provider.GalResult;
import com.android.mail.utils.LogUtils;
+import com.google.common.annotations.VisibleForTesting;
import java.util.HashSet;
import java.util.Set;
@@ -67,6 +70,13 @@
private static final String TAG = Eas.LOG_TAG;
+ private static final String PREFERENCES_FILE = "ExchangePrefs";
+ private static final String PROTOCOL_LOGGING_PREF = "ProtocolLogging";
+ private static final String FILE_LOGGING_PREF = "FileLogging";
+
+ public static final String EXTRA_START_PING = "START_PING";
+ public static final String EXTRA_PING_ACCOUNT = "PING_ACCOUNT";
+
/**
* The content authorities that can be synced for EAS accounts. Initialization must wait until
* after we have a chance to call {@link EmailContent#init} (and, for future content types,
@@ -77,6 +87,9 @@
/** Bookkeeping for ping tasks & sync threads management. */
private final PingSyncSynchronizer mSynchronizer;
+ private static boolean sProtocolLogging;
+ private static boolean sFileLogging;
+
/**
* Implementation of the IEmailService interface.
* For the most part these calls should consist of creating the correct {@link EasOperation}
@@ -87,15 +100,22 @@
public void loadAttachment(final IEmailServiceCallback callback, final long accountId,
final long attachmentId, final boolean background) {
LogUtils.d(TAG, "IEmailService.loadAttachment: %d", attachmentId);
- final EasLoadAttachment operation = new EasLoadAttachment(EasService.this, accountId,
- attachmentId, callback);
- doOperation(operation, "IEmailService.loadAttachment");
+ final Account account = loadAccount(EasService.this, accountId);
+ if (account != null) {
+ final EasLoadAttachment operation = new EasLoadAttachment(EasService.this, account,
+ attachmentId, callback);
+ doOperation(operation, "IEmailService.loadAttachment");
+ }
}
@Override
public void updateFolderList(final long accountId) {
- final EasFolderSync operation = new EasFolderSync(EasService.this, accountId);
- doOperation(operation, "IEmailService.updateFolderList");
+ LogUtils.d(TAG, "IEmailService.updateFolderList: %d", accountId);
+ final Account account = loadAccount(EasService.this, accountId);
+ if (account != null) {
+ final EasFolderSync operation = new EasFolderSync(EasService.this, account);
+ doOperation(operation, "IEmailService.updateFolderList");
+ }
}
public void sendMail(final long accountId) {
@@ -104,15 +124,27 @@
}
public int sync(final long accountId, Bundle syncExtras) {
- EasFullSyncOperation op = new EasFullSyncOperation(EasService.this, accountId, syncExtras);
- return convertToEmailServiceStatus(doOperation(op, "IEmailService.sync"));
+ LogUtils.d(TAG, "IEmailService.updateFolderList: %d", accountId);
+ final Account account = loadAccount(EasService.this, accountId);
+ if (account != null) {
+ EasFullSyncOperation op = new EasFullSyncOperation(EasService.this, account,
+ syncExtras);
+ final int result = doOperation(op, "IEmailService.sync");
+ if (result == EasFullSyncOperation.RESULT_SECURITY_HOLD) {
+ LogUtils.i(LogUtils.TAG, "Security Hold trying to sync");
+ return EmailServiceStatus.INTERNAL_ERROR;
+ }
+ return convertToEmailServiceStatus(result);
+ } else {
+ return EmailServiceStatus.INTERNAL_ERROR;
+ }
}
@Override
public void pushModify(final long accountId) {
LogUtils.d(TAG, "IEmailService.pushModify: %d", accountId);
final Account account = Account.restoreAccountWithId(EasService.this, accountId);
- if (pingNeededForAccount(account)) {
+ if (pingNeededForAccount(EasService.this, account)) {
mSynchronizer.pushModify(account);
} else {
mSynchronizer.pushStop(accountId);
@@ -121,6 +153,7 @@
@Override
public Bundle validate(final HostAuthCompat hostAuthCom) {
+ LogUtils.d(TAG, "IEmailService.validate");
final HostAuth hostAuth = hostAuthCom.toHostAuth();
final EasFolderSync operation = new EasFolderSync(EasService.this, hostAuth);
doOperation(operation, "IEmailService.validate");
@@ -130,24 +163,33 @@
@Override
public int searchMessages(final long accountId, final SearchParams searchParams,
final long destMailboxId) {
- final EasSearch operation = new EasSearch(EasService.this, accountId, searchParams,
- destMailboxId);
- doOperation(operation, "IEmailService.searchMessages");
- return operation.getTotalResults();
+ LogUtils.d(TAG, "IEmailService.searchMessages");
+ final Account account = loadAccount(EasService.this, accountId);
+ if (account != null) {
+ final EasSearch operation = new EasSearch(EasService.this, account, searchParams,
+ destMailboxId);
+ doOperation(operation, "IEmailService.searchMessages");
+ return operation.getTotalResults();
+ } else {
+ return 0;
+ }
}
@Override
public void sendMeetingResponse(final long messageId, final int response) {
EmailContent.Message msg = EmailContent.Message.restoreMessageWithId(EasService.this,
messageId);
+ LogUtils.d(TAG, "IEmailService.sendMeetingResponse");
if (msg == null) {
LogUtils.e(TAG, "Could not load message %d in sendMeetingResponse", messageId);
return;
}
-
- final EasSendMeetingResponse operation = new EasSendMeetingResponse(EasService.this,
- msg.mAccountKey, msg, response);
- doOperation(operation, "IEmailService.sendMeetingResponse");
+ final Account account = loadAccount(EasService.this, msg.mAccountKey);
+ if (account != null) {
+ final EasSendMeetingResponse operation = new EasSendMeetingResponse(EasService.this,
+ account, msg, response);
+ doOperation(operation, "IEmailService.sendMeetingResponse");
+ }
}
@Override
@@ -206,7 +248,13 @@
@Override
public void setLogging(final int flags) {
- LogUtils.d(TAG, "IEmailService.setLogging");
+ sProtocolLogging = ((flags & EmailServiceProxy.DEBUG_EXCHANGE_BIT) != 0);
+ sFileLogging = ((flags & EmailServiceProxy.DEBUG_FILE_BIT) != 0);
+ SharedPreferences sharedPrefs = EasService.this.getSharedPreferences(PREFERENCES_FILE,
+ Context.MODE_PRIVATE);
+ sharedPrefs.edit().putBoolean(PROTOCOL_LOGGING_PREF, sProtocolLogging).apply();
+ sharedPrefs.edit().putBoolean(FILE_LOGGING_PREF, sFileLogging).apply();
+ LogUtils.d(TAG, "IEmailService.setLogging %d, storing to shared pref", flags);
}
@Override
@@ -225,6 +273,14 @@
}
};
+ private static Account loadAccount(final Context context, final long accountId) {
+ Account account = Account.restoreAccountWithId(context, accountId);
+ if (account == null) {
+ LogUtils.e(TAG, "Could not load account %d", accountId);
+ }
+ return account;
+ }
+
/**
* Content selection string for getting all accounts that are configured for push.
* TODO: Add protocol check so that we don't get e.g. IMAP accounts here.
@@ -240,15 +296,16 @@
@Override
protected Void doInBackground(Void... params) {
+ LogUtils.i(TAG, "RestartPingTask");
final Cursor c = EasService.this.getContentResolver().query(Account.CONTENT_URI,
Account.CONTENT_PROJECTION, PUSH_ACCOUNTS_SELECTION, null, null);
if (c != null) {
try {
while (c.moveToNext()) {
final Account account = new Account();
- LogUtils.d(TAG, "RestartPingsTask starting ping for %s", account);
account.restore(c);
- if (EasService.this.pingNeededForAccount(account)) {
+ LogUtils.i(TAG, "RestartPingsTask starting ping for %d", account.getId());
+ if (pingNeededForAccount(EasService.this, account)) {
mHasRestartedPing = true;
EasService.this.mSynchronizer.pushModify(account);
}
@@ -263,7 +320,7 @@
@Override
protected void onPostExecute(Void result) {
if (!mHasRestartedPing) {
- LogUtils.d(TAG, "RestartPingsTask did not start any pings.");
+ LogUtils.i(TAG, "RestartPingsTask did not start any pings.");
EasService.this.mSynchronizer.stopServiceIfIdle();
}
}
@@ -276,7 +333,7 @@
@Override
public void onCreate() {
- LogUtils.d(TAG, "EasService.onCreate");
+ LogUtils.i(TAG, "EasService.onCreate");
super.onCreate();
TempDirectory.setTempDirectory(this);
EmailContent.init(this);
@@ -285,7 +342,10 @@
CalendarContract.AUTHORITY,
ContactsContract.AUTHORITY
};
-
+ SharedPreferences sharedPrefs = EasService.this.getSharedPreferences(PREFERENCES_FILE,
+ Context.MODE_PRIVATE);
+ sProtocolLogging = sharedPrefs.getBoolean(PROTOCOL_LOGGING_PREF, false);
+ sFileLogging = sharedPrefs.getBoolean(FILE_LOGGING_PREF, false);
// Restart push for all accounts that need it. Because this requires DB loads, we do it in
// an AsyncTask, and we startService to ensure that we stick around long enough for the
// task to complete. The task will stop the service if necessary after it's done.
@@ -295,6 +355,7 @@
@Override
public void onDestroy() {
+ LogUtils.i(TAG, "onDestroy");
mSynchronizer.stopAllPings();
}
@@ -315,6 +376,13 @@
// if accounts disappear out from under us.
LogUtils.d(TAG, "Forced shutdown, killing process");
System.exit(-1);
+ } else if (intent.getBooleanExtra(EXTRA_START_PING, false)) {
+ LogUtils.d(LogUtils.TAG, "Restarting ping");
+ final Account account = intent.getParcelableExtra(EXTRA_PING_ACCOUNT);
+ final android.accounts.Account amAccount =
+ new android.accounts.Account(account.mEmailAddress,
+ Eas.EXCHANGE_ACCOUNT_MANAGER_TYPE);
+ EasPing.requestPing(amAccount);
}
}
return START_STICKY;
@@ -334,7 +402,7 @@
LogUtils.d(TAG, "Operation result %d", result);
return result;
} finally {
- mSynchronizer.syncEnd(result >= EasOperation.RESULT_MIN_OK_RESULT,
+ mSynchronizer.syncEnd(result < EasOperation.RESULT_MIN_OK_RESULT,
operation.getAccount());
}
}
@@ -343,9 +411,10 @@
* Determine whether this account is configured with folders that are ready for push
* notifications.
* @param account The {@link Account} that we're interested in.
+ * @param context The context
* @return Whether this account needs to ping.
*/
- public boolean pingNeededForAccount(final Account account) {
+ public static boolean pingNeededForAccount(final Context context, final Account account) {
// Check account existence.
if (account == null || account.mId == Account.NO_ACCOUNT) {
LogUtils.d(TAG, "Do not ping: Account not found or not valid");
@@ -379,12 +448,13 @@
final Set<String> authsToSync = getAuthoritiesToSync(amAccount, AUTHORITIES_TO_SYNC);
// If we have at least one sync-enabled content type, check for syncing mailboxes.
if (!authsToSync.isEmpty()) {
- final Cursor c = Mailbox.getMailboxesForPush(getContentResolver(), account.mId);
+ final Cursor c = Mailbox.getMailboxesForPush(context.getContentResolver(), account.mId);
if (c != null) {
try {
while (c.moveToNext()) {
final int mailboxType = c.getInt(Mailbox.CONTENT_TYPE_COLUMN);
if (authsToSync.contains(Mailbox.getAuthority(mailboxType))) {
+ LogUtils.d(TAG, "should ping for account %d", account.mId);
return true;
}
}
@@ -399,18 +469,21 @@
static public GalResult searchGal(final Context context, final long accountId,
final String filter, final int limit) {
- final EasSearchGal operation = new EasSearchGal(context, accountId, filter, limit);
- // We don't use doOperation() here for two reasons:
- // 1. This is a static function, doOperation is not, and we don't have an instance of
- // EasService.
- // 2. All doOperation() does besides this is stop the ping and then restart it. This is
- // required during syncs, but not for GalSearches.
- final int result = operation.performOperation();
- if (result == EasSearchGal.RESULT_OK) {
- return operation.getResult();
- } else {
- return null;
+ GalResult galResult = null;
+ final Account account = loadAccount(context, accountId);
+ if (account != null) {
+ final EasSearchGal operation = new EasSearchGal(context, account, filter, limit);
+ // We don't use doOperation() here for two reasons:
+ // 1. This is a static function, doOperation is not, and we don't have an instance of
+ // EasService.
+ // 2. All doOperation() does besides this is stop the ping and then restart it. This is
+ // required during syncs, but not for GalSearches.
+ final int result = operation.performOperation();
+ if (result == EasSearchGal.RESULT_OK) {
+ galResult = operation.getResult();
+ }
}
+ return galResult;
}
/**
@@ -486,4 +559,23 @@
}
return authsToSync;
}
+
+ @VisibleForTesting
+ public static void setProtocolLogging(final boolean val) {
+ sProtocolLogging = val;
+ }
+
+ @VisibleForTesting
+ public static void setFileLogging(final boolean val) {
+ sFileLogging = val;
+ }
+
+ public static boolean getProtocolLogging() {
+ return sProtocolLogging;
+ }
+
+ public static boolean getFileLogging() {
+ return sFileLogging;
+ }
+
}
diff --git a/src/com/android/exchange/service/EmailSyncAdapterService.java b/src/com/android/exchange/service/EmailSyncAdapterService.java
index c5bd106..587a832 100644
--- a/src/com/android/exchange/service/EmailSyncAdapterService.java
+++ b/src/com/android/exchange/service/EmailSyncAdapterService.java
@@ -38,25 +38,6 @@
private static final String TAG = Eas.LOG_TAG;
- // The call to ServiceConnection.onServiceConnected is asynchronous to bindService. It's
- // possible for that to be delayed if, in which case, a call to onPerformSync
- // could occur before we have a connection to the service.
- // In onPerformSync, if we don't yet have our EasService, we will wait for up to 10
- // seconds for it to appear. If it takes longer than that, we will fail the sync.
- private static final long MAX_WAIT_FOR_SERVICE_MS = 10 * DateUtils.SECOND_IN_MILLIS;
-
- // TODO: Do we need to use this?
- private static final long SYNC_ERROR_BACKOFF_MILLIS = 5 * DateUtils.MINUTE_IN_MILLIS;
-
- /**
- * TODO: restore this functionality.
- * The amount of time between periodic syncs intended to ensure that push hasn't died.
- */
- private static final long KICK_SYNC_INTERVAL =
- DateUtils.HOUR_IN_MILLIS / DateUtils.SECOND_IN_MILLIS;
- /** Controls whether we do a periodic "kick" to restart the ping. */
- private static final boolean SCHEDULE_KICK = true;
-
private static final Object sSyncAdapterLock = new Object();
private static AbstractThreadedSyncAdapter sSyncAdapter = null;
diff --git a/src/com/android/exchange/service/PingSyncSynchronizer.java b/src/com/android/exchange/service/PingSyncSynchronizer.java
index 11d57e6..f722e86 100644
--- a/src/com/android/exchange/service/PingSyncSynchronizer.java
+++ b/src/com/android/exchange/service/PingSyncSynchronizer.java
@@ -83,29 +83,32 @@
private static final String TAG = Eas.LOG_TAG;
private static final long SYNC_ERROR_BACKOFF_MILLIS = DateUtils.MINUTE_IN_MILLIS;
- private static final String EXTRA_START_PING = "START_PING";
- private static final String EXTRA_PING_ACCOUNT = "PING_ACCOUNT";
// Enable this to make pings get automatically renewed every hour. This
// should not be needed, but if there is a software error that results in
// the ping being lost, this is a fallback to make sure that messages are
// not delayed more than an hour.
- private static final boolean SCHEDULE_KICK = false;
+ private static final boolean SCHEDULE_KICK = true;
private static final long KICK_SYNC_INTERVAL_SECONDS =
DateUtils.HOUR_IN_MILLIS / DateUtils.SECOND_IN_MILLIS;
/**
* This class handles bookkeeping for a single account.
*/
- private static class AccountSyncState {
+ private class AccountSyncState {
/** The currently running {@link PingTask}, or null if we aren't in the middle of a Ping. */
private PingTask mPingTask;
+ // Values for mPushEnabled.
+ public static final int PUSH_UNKNOWN = 0;
+ public static final int PUSH_ENABLED = 1;
+ public static final int PUSH_DISABLED = 2;
+
/**
* Tracks whether this account wants to get push notifications, based on calls to
* {@link #pushModify} and {@link #pushStop} (i.e. it tracks the last requested push state).
*/
- private boolean mPushEnabled;
+ private int mPushEnabled;
/**
* The number of syncs that are blocked waiting for the current operation to complete.
@@ -117,11 +120,18 @@
/** The condition on which to block syncs that need to wait. */
private Condition mCondition;
- public AccountSyncState(final Lock lock ) {
+ /** The accountId for this accountState, used for logging */
+ private long mAccountId;
+
+ public AccountSyncState(final Lock lock, final long accountId) {
mPingTask = null;
- mPushEnabled = false;
+ // We don't yet have enough information to know whether or not push should be enabled.
+ // We need to look up the account and it's folders, which won't yet exist for a newly
+ // created account.
+ mPushEnabled = PUSH_UNKNOWN;
mSyncCount = 0;
mCondition = lock.newCondition();
+ mAccountId = accountId;
}
/**
@@ -133,17 +143,18 @@
++mSyncCount;
if (mPingTask != null) {
// Syncs are higher priority than Ping -- terminate the Ping.
- LogUtils.d(TAG, "Sync is pre-empting a ping");
+ LogUtils.i(TAG, "PSS Sync is pre-empting a ping acct:%d", mAccountId);
mPingTask.stop();
}
if (mPingTask != null || mSyncCount > 1) {
// There’s something we need to wait for before we can proceed.
try {
- LogUtils.d(TAG, "Sync needs to wait: Ping: %s, Pending tasks: %d",
- mPingTask != null ? "yes" : "no", mSyncCount);
+ LogUtils.i(TAG, "PSS Sync needs to wait: Ping: %s, Pending tasks: %d acct: %d",
+ mPingTask != null ? "yes" : "no", mSyncCount, mAccountId);
mCondition.await();
} catch (final InterruptedException e) {
// TODO: Handle this properly. Not catching it might be the right answer.
+ LogUtils.i(TAG, "PSS InterruptedException acct:%d", mAccountId);
}
}
}
@@ -157,18 +168,25 @@
final PingSyncSynchronizer synchronizer) {
--mSyncCount;
if (mSyncCount > 0) {
- LogUtils.d(TAG, "Signalling a pending sync to proceed.");
+ LogUtils.i(TAG, "PSS Signalling a pending sync to proceed acct:%d.",
+ account.getId());
mCondition.signal();
return false;
} else {
- if (mPushEnabled) {
+ if (mPushEnabled == PUSH_UNKNOWN) {
+ LogUtils.i(TAG, "PSS push enabled is unknown");
+ mPushEnabled = (EasService.pingNeededForAccount(mService, account) ?
+ PUSH_ENABLED : PUSH_DISABLED);
+ }
+ if (mPushEnabled == PUSH_ENABLED) {
if (lastSyncHadError) {
- final android.accounts.Account amAccount =
- new android.accounts.Account(account.mEmailAddress,
- Eas.EXCHANGE_ACCOUNT_MANAGER_TYPE);
- scheduleDelayedPing(synchronizer.getContext(), amAccount);
+ LogUtils.i(TAG, "PSS last sync had error, scheduling delayed ping acct:%d.",
+ account.getId());
+ scheduleDelayedPing(synchronizer.getContext(), account);
return true;
} else {
+ LogUtils.i(TAG, "PSS last sync succeeded, starting new ping acct:%d.",
+ account.getId());
final android.accounts.Account amAccount =
new android.accounts.Account(account.mEmailAddress,
Eas.EXCHANGE_ACCOUNT_MANAGER_TYPE);
@@ -179,6 +197,7 @@
}
}
}
+ LogUtils.i(TAG, "PSS no push enabled acct:%d.", account.getId());
return true;
}
@@ -189,10 +208,20 @@
private boolean pingEnd(final android.accounts.Account amAccount) {
mPingTask = null;
if (mSyncCount > 0) {
+ LogUtils.i(TAG, "PSS pingEnd, syncs still in progress acct:%d.", mAccountId);
mCondition.signal();
return false;
} else {
- if (mPushEnabled) {
+ if (mPushEnabled == PUSH_ENABLED || mPushEnabled == PUSH_UNKNOWN) {
+ if (mPushEnabled == PUSH_UNKNOWN) {
+ // This should not occur. If mPushEnabled is unknown, we should not
+ // have started a ping. Still, we'd rather err on the side of restarting
+ // the ping, so log an error and request a new ping. Eventually we should
+ // do a sync, and then we'll correctly initialize mPushEnabled in
+ // syncEnd().
+ LogUtils.e(TAG, "PSS pingEnd, with mPushEnabled UNKNOWN?");
+ }
+ LogUtils.i(TAG, "PSS pingEnd, starting new ping acct:%d.", mAccountId);
/**
* This situation only arises if we encountered some sort of error that
* stopped our ping but not due to a sync interruption. In this scenario
@@ -202,16 +231,18 @@
return false;
}
}
+ LogUtils.i(TAG, "PSS pingEnd, no longer need ping acct:%d.", mAccountId);
return true;
}
private void scheduleDelayedPing(final Context context,
- final android.accounts.Account amAccount) {
- LogUtils.d(TAG, "Scheduling a delayed ping.");
- final Intent intent = new Intent(context, EmailSyncAdapterService.class);
+ final Account account) {
+ LogUtils.i(TAG, "PSS Scheduling a delayed ping acct:%d.", account.getId());
+ final Intent intent = new Intent(context, EasService.class);
intent.setAction(Eas.EXCHANGE_SERVICE_INTENT_ACTION);
- intent.putExtra(EXTRA_START_PING, true);
- intent.putExtra(EXTRA_PING_ACCOUNT, amAccount);
+ intent.putExtra(EasService.EXTRA_START_PING, true);
+ intent.putExtra(EasService.EXTRA_PING_ACCOUNT, account);
+
final PendingIntent pi = PendingIntent.getService(context, 0, intent,
PendingIntent.FLAG_ONE_SHOT);
final AlarmManager am = (AlarmManager)context.getSystemService(
@@ -224,20 +255,25 @@
* Modifies or starts a ping for this account if no syncs are running.
*/
public void pushModify(final Account account, final PingSyncSynchronizer synchronizer) {
- mPushEnabled = true;
+ LogUtils.i(LogUtils.TAG, "PSS pushModify acct:%d", account.getId());
+ mPushEnabled = PUSH_ENABLED;
final android.accounts.Account amAccount =
new android.accounts.Account(account.mEmailAddress,
Eas.EXCHANGE_ACCOUNT_MANAGER_TYPE);
if (mSyncCount == 0) {
if (mPingTask == null) {
// No ping, no running syncs -- start a new ping.
+ LogUtils.i(LogUtils.TAG, "PSS starting ping task acct:%d", account.getId());
mPingTask = new PingTask(synchronizer.getContext(), account, amAccount,
synchronizer);
mPingTask.start();
} else {
// Ping is already running, so tell it to restart to pick up any new params.
+ LogUtils.i(LogUtils.TAG, "PSS restarting ping task acct:%d", account.getId());
mPingTask.restart();
}
+ } else {
+ LogUtils.i(LogUtils.TAG, "PSS syncs still in progress acct:%d", account.getId());
}
if (SCHEDULE_KICK) {
final Bundle extras = new Bundle(1);
@@ -251,7 +287,8 @@
* Stop the currently running ping.
*/
public void pushStop() {
- mPushEnabled = false;
+ LogUtils.i(LogUtils.TAG, "PSS pushStop acct:%d", mAccountId);
+ mPushEnabled = PUSH_DISABLED;
if (mPingTask != null) {
mPingTask.stop();
}
@@ -298,8 +335,8 @@
assert mLock.isHeldByCurrentThread();
AccountSyncState state = mAccountStateMap.get(accountId);
if (state == null && createIfNeeded) {
- LogUtils.d(TAG, "PSS adding account state for %d", accountId);
- state = new AccountSyncState(mLock);
+ LogUtils.i(TAG, "PSS adding account state for acct:%d", accountId);
+ state = new AccountSyncState(mLock, accountId);
mAccountStateMap.put(accountId, state);
// TODO: Is this too late to startService?
if (mAccountStateMap.size() == 1) {
@@ -317,7 +354,7 @@
*/
private void removeAccount(final long accountId) {
assert mLock.isHeldByCurrentThread();
- LogUtils.d(TAG, "PSS removing account state for %d", accountId);
+ LogUtils.i(TAG, "PSS removing account state for acct:%d", accountId);
mAccountStateMap.delete(accountId);
if (mAccountStateMap.size() == 0) {
LogUtils.i(TAG, "PSS removed last account; stopping service.");
@@ -328,7 +365,7 @@
public void syncStart(final long accountId) {
mLock.lock();
try {
- LogUtils.d(TAG, "PSS syncStart for account %d", accountId);
+ LogUtils.i(TAG, "PSS syncStart for account acct:%d", accountId);
final AccountSyncState accountState = getAccountState(accountId, true);
accountState.syncStart();
} finally {
@@ -340,7 +377,7 @@
mLock.lock();
try {
final long accountId = account.getId();
- LogUtils.d(TAG, "PSS syncEnd for account %d", account.getId());
+ LogUtils.i(TAG, "PSS syncEnd for account acct:%d", account.getId());
final AccountSyncState accountState = getAccountState(accountId, false);
if (accountState == null) {
LogUtils.w(TAG, "PSS syncEnd for account %d but no state found", accountId);
@@ -357,7 +394,7 @@
public void pingEnd(final long accountId, final android.accounts.Account amAccount) {
mLock.lock();
try {
- LogUtils.d(TAG, "PSS pingEnd for account %d", accountId);
+ LogUtils.i(TAG, "PSS pingEnd for account %d", accountId);
final AccountSyncState accountState = getAccountState(accountId, false);
if (accountState == null) {
LogUtils.w(TAG, "PSS pingEnd for account %d but no state found", accountId);
@@ -375,7 +412,7 @@
mLock.lock();
try {
final long accountId = account.getId();
- LogUtils.d(TAG, "PSS pushModify for account %d", accountId);
+ LogUtils.i(TAG, "PSS pushModify acct:%d", accountId);
final AccountSyncState accountState = getAccountState(accountId, true);
accountState.pushModify(account, this);
} finally {
@@ -386,7 +423,7 @@
public void pushStop(final long accountId) {
mLock.lock();
try {
- LogUtils.d(TAG, "PSS pushStop for account %d", accountId);
+ LogUtils.i(TAG, "PSS pushStop acct:%d", accountId);
final AccountSyncState accountState = getAccountState(accountId, false);
if (accountState != null) {
accountState.pushStop();
@@ -402,7 +439,7 @@
public void stopServiceIfIdle() {
mLock.lock();
try {
- LogUtils.d(TAG, "PSS stopIfIdle");
+ LogUtils.i(TAG, "PSS stopIfIdle");
if (mAccountStateMap.size() == 0) {
LogUtils.i(TAG, "PSS has no active accounts; stopping service.");
mService.stopSelf();
diff --git a/src/com/android/exchange/utility/CalendarUtilities.java b/src/com/android/exchange/utility/CalendarUtilities.java
index 572a693..a37b102 100644
--- a/src/com/android/exchange/utility/CalendarUtilities.java
+++ b/src/com/android/exchange/utility/CalendarUtilities.java
@@ -1444,7 +1444,11 @@
cv.put(Calendars.CALENDAR_TIME_ZONE, Time.getCurrentTimezone());
cv.put(Calendars.CALENDAR_ACCESS_LEVEL, Calendars.CAL_ACCESS_OWNER);
cv.put(Calendars.OWNER_ACCOUNT, account.mEmailAddress);
-
+ if (TextUtils.equals(mailbox.mDisplayName, account.mEmailAddress)) {
+ cv.put(Calendars.IS_PRIMARY, 1);
+ } else {
+ cv.put(Calendars.IS_PRIMARY, 0);
+ }
Uri uri = contentResolver.insert(asSyncAdapter(Calendars.CONTENT_URI, account.mEmailAddress,
Eas.EXCHANGE_ACCOUNT_MANAGER_TYPE), cv);
// We save the id of the calendar into mSyncStatus
diff --git a/tests/src/com/android/exchange/adapter/ParserTest.java b/tests/src/com/android/exchange/adapter/ParserTest.java
index 8b36433..d39e406 100644
--- a/tests/src/com/android/exchange/adapter/ParserTest.java
+++ b/tests/src/com/android/exchange/adapter/ParserTest.java
@@ -20,6 +20,8 @@
import android.test.suitebuilder.annotation.SmallTest;
import android.text.TextUtils;
+import com.android.exchange.service.EasService;
+
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.io.IOException;
@@ -34,7 +36,7 @@
public TestParser(InputStream in, Object[] expectedData) throws IOException{
super(in);
- setDebug(true);
+ EasService.setProtocolLogging(true);
mExpectedData = expectedData == null ? null
: new ArrayDeque<Object>(Arrays.asList(expectedData));
}