eclair snapshot tegra-9.12.5 tegra-9.12.5-baseline tegra-9.12.6 tegra-9.12.6-baseline
Jean-Baptiste Queru [Fri, 13 Nov 2009 02:46:08 +0000 (18:46 -0800)]
130 files changed:
AndroidManifest.xml
res/drawable-hdpi-finger/btn_circle_disable.png [new file with mode: 0644]
res/drawable-hdpi-finger/btn_circle_disable_focused.png [new file with mode: 0644]
res/drawable-hdpi-finger/btn_circle_normal.png [new file with mode: 0644]
res/drawable-hdpi-finger/btn_circle_pressed.png [new file with mode: 0644]
res/drawable-hdpi-finger/btn_circle_selected.png [new file with mode: 0644]
res/drawable-hdpi/app_icon.png [new file with mode: 0644]
res/drawable-hdpi/bg_cal_card.9.png [new file with mode: 0644]
res/drawable-hdpi/box_appointment_normal.9.png [new file with mode: 0644]
res/drawable-hdpi/box_appointment_pressed.9.png [new file with mode: 0644]
res/drawable-hdpi/box_appointment_selected.9.png [new file with mode: 0644]
res/drawable-hdpi/dna_1_of_6.png [new file with mode: 0644]
res/drawable-hdpi/dna_2345_of_6.png [new file with mode: 0644]
res/drawable-hdpi/dna_6_of_6.png [new file with mode: 0644]
res/drawable-hdpi/dna_empty.png [new file with mode: 0644]
res/drawable-hdpi/ic_alarm_dark.png [new file with mode: 0644]
res/drawable-hdpi/ic_alarm_white.png [new file with mode: 0644]
res/drawable-hdpi/ic_btn_round_minus.png [new file with mode: 0644]
res/drawable-hdpi/ic_btn_round_plus.png [new file with mode: 0644]
res/drawable-hdpi/ic_contact_picture.png [new file with mode: 0755]
res/drawable-hdpi/ic_menu_reminder.png [new file with mode: 0644]
res/drawable-hdpi/ic_menu_show_list.png [new file with mode: 0644]
res/drawable-hdpi/ic_repeat_dark.png [new file with mode: 0644]
res/drawable-hdpi/ic_repeat_white.png [new file with mode: 0644]
res/drawable-hdpi/im_avatar_picture_border_normal.9.png [new file with mode: 0755]
res/drawable-hdpi/month_view_background.9.png [new file with mode: 0644]
res/drawable-hdpi/month_view_longpress.9.png [new file with mode: 0644]
res/drawable-hdpi/month_view_pressed.9.png [new file with mode: 0644]
res/drawable-hdpi/month_view_selected.9.png [new file with mode: 0644]
res/drawable-hdpi/month_view_today_background.9.png [new file with mode: 0644]
res/drawable-hdpi/stat_notify_calendar.png [new file with mode: 0644]
res/drawable-hdpi/sym_calendar_event.png [new file with mode: 0644]
res/drawable-land-hdpi/dna_1_of_6.png [new file with mode: 0644]
res/drawable-land-hdpi/dna_2345_of_6.png [new file with mode: 0644]
res/drawable-land-hdpi/dna_6_of_6.png [new file with mode: 0644]
res/drawable-land-hdpi/dna_empty.png [new file with mode: 0644]
res/drawable-land-mdpi/dna_1_of_6.png [moved from res/drawable-land/dna_1_of_6.png with 100% similarity]
res/drawable-land-mdpi/dna_2345_of_6.png [moved from res/drawable-land/dna_2345_of_6.png with 100% similarity]
res/drawable-land-mdpi/dna_6_of_6.png [moved from res/drawable-land/dna_6_of_6.png with 100% similarity]
res/drawable-land-mdpi/dna_empty.png [moved from res/drawable-land/dna_empty.png with 100% similarity]
res/drawable-mdpi-finger/btn_circle_disable.png [moved from res/drawable-finger/btn_circle_disable.png with 100% similarity]
res/drawable-mdpi-finger/btn_circle_disable_focused.png [moved from res/drawable-finger/btn_circle_disable_focused.png with 100% similarity]
res/drawable-mdpi-finger/btn_circle_normal.png [moved from res/drawable-finger/btn_circle_normal.png with 100% similarity]
res/drawable-mdpi-finger/btn_circle_pressed.png [moved from res/drawable-finger/btn_circle_pressed.png with 100% similarity]
res/drawable-mdpi-finger/btn_circle_selected.png [moved from res/drawable-finger/btn_circle_selected.png with 100% similarity]
res/drawable-mdpi/app_icon.png [moved from res/drawable/app_icon.png with 100% similarity]
res/drawable-mdpi/bg_cal_card.9.png [moved from res/drawable/bg_cal_card.9.png with 100% similarity]
res/drawable-mdpi/box_appointment_normal.9.png [moved from res/drawable/box_appointment_normal.9.png with 100% similarity]
res/drawable-mdpi/box_appointment_pressed.9.png [moved from res/drawable/box_appointment_pressed.9.png with 100% similarity]
res/drawable-mdpi/box_appointment_selected.9.png [moved from res/drawable/box_appointment_selected.9.png with 100% similarity]
res/drawable-mdpi/dna_1_of_6.png [moved from res/drawable/dna_1_of_6.png with 100% similarity]
res/drawable-mdpi/dna_2345_of_6.png [moved from res/drawable/dna_2345_of_6.png with 100% similarity]
res/drawable-mdpi/dna_6_of_6.png [moved from res/drawable/dna_6_of_6.png with 100% similarity]
res/drawable-mdpi/dna_empty.png [moved from res/drawable/dna_empty.png with 100% similarity]
res/drawable-mdpi/ic_alarm_dark.png [moved from res/drawable/ic_alarm_dark.png with 100% similarity]
res/drawable-mdpi/ic_alarm_white.png [moved from res/drawable/ic_alarm_white.png with 100% similarity]
res/drawable-mdpi/ic_btn_round_minus.png [moved from res/drawable/ic_btn_round_minus.png with 100% similarity]
res/drawable-mdpi/ic_btn_round_plus.png [moved from res/drawable/ic_btn_round_plus.png with 100% similarity]
res/drawable-mdpi/ic_contact_picture.png [new file with mode: 0644]
res/drawable-mdpi/ic_menu_reminder.png [moved from res/drawable/ic_menu_reminder.png with 100% similarity]
res/drawable-mdpi/ic_menu_show_list.png [moved from res/drawable/ic_menu_show_list.png with 100% similarity]
res/drawable-mdpi/ic_repeat_dark.png [moved from res/drawable/ic_repeat_dark.png with 100% similarity]
res/drawable-mdpi/ic_repeat_white.png [moved from res/drawable/ic_repeat_white.png with 100% similarity]
res/drawable-mdpi/im_avatar_picture_border_normal.9.png [new file with mode: 0644]
res/drawable-mdpi/month_view_background.9.png [moved from res/drawable/month_view_background.9.png with 100% similarity]
res/drawable-mdpi/month_view_longpress.9.png [moved from res/drawable/month_view_longpress.9.png with 100% similarity]
res/drawable-mdpi/month_view_pressed.9.png [moved from res/drawable/month_view_pressed.9.png with 100% similarity]
res/drawable-mdpi/month_view_selected.9.png [moved from res/drawable/month_view_selected.9.png with 100% similarity]
res/drawable-mdpi/month_view_today_background.9.png [moved from res/drawable/month_view_today_background.9.png with 100% similarity]
res/drawable-mdpi/stat_notify_calendar.png [moved from res/drawable/stat_notify_calendar.png with 100% similarity]
res/drawable-mdpi/sym_calendar_event.png [moved from res/drawable/sym_calendar_event.png with 100% similarity]
res/layout/agenda_header_footer.xml [new file with mode: 0644]
res/layout/contact_item.xml [new file with mode: 0644]
res/layout/edit_event.xml
res/layout/event_info_activity.xml
res/values-cs/strings.xml
res/values-da/strings.xml
res/values-de/strings.xml
res/values-el/arrays.xml
res/values-el/strings.xml
res/values-es-rUS/strings.xml
res/values-es/strings.xml
res/values-fr/strings.xml
res/values-it/strings.xml
res/values-ja/strings.xml
res/values-ko/strings.xml
res/values-nb/arrays.xml
res/values-nb/strings.xml
res/values-nl/strings.xml
res/values-pl/strings.xml
res/values-pt-rPT/strings.xml
res/values-pt/arrays.xml
res/values-pt/strings.xml
res/values-ru/strings.xml
res/values-sv/strings.xml
res/values-tr/strings.xml
res/values-zh-rCN/arrays.xml
res/values-zh-rCN/strings.xml
res/values-zh-rTW/strings.xml
res/values/strings.xml
res/values/styles.xml
src/com/android/calendar/AgendaActivity.java
src/com/android/calendar/AgendaAdapter.java
src/com/android/calendar/AgendaByDayAdapter.java
src/com/android/calendar/AgendaListView.java [new file with mode: 0644]
src/com/android/calendar/AgendaWindowAdapter.java [new file with mode: 0644]
src/com/android/calendar/AlertActivity.java
src/com/android/calendar/AlertService.java
src/com/android/calendar/CalendarActivity.java
src/com/android/calendar/CalendarApplication.java
src/com/android/calendar/CalendarView.java
src/com/android/calendar/DayActivity.java
src/com/android/calendar/DeleteEventHelper.java
src/com/android/calendar/EditEvent.java
src/com/android/calendar/EmailAddressAdapter.java [new file with mode: 0644]
src/com/android/calendar/Event.java
src/com/android/calendar/EventInfoActivity.java
src/com/android/calendar/GoogleCalendarUriIntentFilter.java [new file with mode: 0644]
src/com/android/calendar/IcsImportActivity.java
src/com/android/calendar/LaunchActivity.java
src/com/android/calendar/MenuHelper.java
src/com/android/calendar/MonthActivity.java
src/com/android/calendar/MonthView.java
src/com/android/calendar/Navigator.java
src/com/android/calendar/SelectCalendarsActivity.java
src/com/android/calendar/Utils.java
src/com/android/calendar/WeekActivity.java
src/com/android/calendar/WeekView.java
tests/src/com/android/calendar/FormatDateRangeTest.java
tests/src/com/android/calendar/WeekNumberTest.java

index 80bb31d..064f8ae 100644 (file)
 
     <uses-permission android:name="android.permission.INTERNET" />
     <uses-permission android:name="android.permission.VIBRATE"/>
+    <uses-permission android:name="android.permission.READ_CONTACTS"/>
     <uses-permission android:name="android.permission.READ_CALENDAR" />
     <uses-permission android:name="android.permission.WRITE_CALENDAR" />
     <uses-permission android:name="android.permission.WAKE_LOCK" />
+    <uses-permission android:name="android.permission.USE_CREDENTIALS" />
     <uses-permission android:name="com.google.android.googleapps.permission.GOOGLE_AUTH.mail" />
 
     <application android:name="CalendarApplication"
@@ -37,8 +39,7 @@
         <uses-library android:name="android.test.runner" />
 
         <activity android:name="LaunchActivity"
-            android:theme="@android:style/Theme.Light"
-            android:clearTaskOnLaunch="true">
+            android:theme="@android:style/Theme.NoDisplay">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
                 <category android:name="android.intent.category.DEFAULT" />
@@ -57,7 +58,7 @@
             android:exported="true" />
         
         <activity android:name="EditEvent" android:label="@string/event_edit_title"
-            android:theme="@android:style/Theme.Light"
+            android:theme="@android:style/Theme"
             android:configChanges="orientation|keyboardHidden">
             
             <intent-filter>
                 <data android:mimeType="vnd.android.cursor.item/event" />
             </intent-filter>
         </activity>
+
+        <activity android:name="GoogleCalendarUriIntentFilter" android:label="@string/app_label"
+            android:theme="@android:style/Theme.Light"
+            android:configChanges="orientation|keyboardHidden">
+
+            <intent-filter>
+               <action android:name="android.intent.action.VIEW" />
+               <category android:name="android.intent.category.DEFAULT" />
+               <category android:name="android.intent.category.BROWSABLE" />
+               <data android:scheme="http" android:host="www.google.com" android:pathPrefix="/calendar/event" />
+               <data android:scheme="https" android:host="www.google.com" android:pathPrefix="/calendar/event" />
+               <data android:scheme="http" android:host="www.google.com" android:pathPattern="/calendar/hosted/.*/event" />
+               <data android:scheme="https" android:host="www.google.com" android:pathPattern="/calendar/hosted/.*/event" />
+            </intent-filter>
+        </activity>
+
         <activity android:name="SelectCalendarsActivity" android:label="@string/calendars_title" />
         <activity android:name="CalendarPreferenceActivity" android:label="@string/preferences_title" />
         <activity android:name="AlertActivity" android:launchMode="singleInstance"
diff --git a/res/drawable-hdpi-finger/btn_circle_disable.png b/res/drawable-hdpi-finger/btn_circle_disable.png
new file mode 100644 (file)
index 0000000..4f12078
Binary files /dev/null and b/res/drawable-hdpi-finger/btn_circle_disable.png differ
diff --git a/res/drawable-hdpi-finger/btn_circle_disable_focused.png b/res/drawable-hdpi-finger/btn_circle_disable_focused.png
new file mode 100644 (file)
index 0000000..bc0d77b
Binary files /dev/null and b/res/drawable-hdpi-finger/btn_circle_disable_focused.png differ
diff --git a/res/drawable-hdpi-finger/btn_circle_normal.png b/res/drawable-hdpi-finger/btn_circle_normal.png
new file mode 100644 (file)
index 0000000..d1e21d9
Binary files /dev/null and b/res/drawable-hdpi-finger/btn_circle_normal.png differ
diff --git a/res/drawable-hdpi-finger/btn_circle_pressed.png b/res/drawable-hdpi-finger/btn_circle_pressed.png
new file mode 100644 (file)
index 0000000..31e69e2
Binary files /dev/null and b/res/drawable-hdpi-finger/btn_circle_pressed.png differ
diff --git a/res/drawable-hdpi-finger/btn_circle_selected.png b/res/drawable-hdpi-finger/btn_circle_selected.png
new file mode 100644 (file)
index 0000000..0f809ee
Binary files /dev/null and b/res/drawable-hdpi-finger/btn_circle_selected.png differ
diff --git a/res/drawable-hdpi/app_icon.png b/res/drawable-hdpi/app_icon.png
new file mode 100644 (file)
index 0000000..d4cafaa
Binary files /dev/null and b/res/drawable-hdpi/app_icon.png differ
diff --git a/res/drawable-hdpi/bg_cal_card.9.png b/res/drawable-hdpi/bg_cal_card.9.png
new file mode 100644 (file)
index 0000000..bd76409
Binary files /dev/null and b/res/drawable-hdpi/bg_cal_card.9.png differ
diff --git a/res/drawable-hdpi/box_appointment_normal.9.png b/res/drawable-hdpi/box_appointment_normal.9.png
new file mode 100644 (file)
index 0000000..84d528c
Binary files /dev/null and b/res/drawable-hdpi/box_appointment_normal.9.png differ
diff --git a/res/drawable-hdpi/box_appointment_pressed.9.png b/res/drawable-hdpi/box_appointment_pressed.9.png
new file mode 100644 (file)
index 0000000..3dae23d
Binary files /dev/null and b/res/drawable-hdpi/box_appointment_pressed.9.png differ
diff --git a/res/drawable-hdpi/box_appointment_selected.9.png b/res/drawable-hdpi/box_appointment_selected.9.png
new file mode 100644 (file)
index 0000000..55eb437
Binary files /dev/null and b/res/drawable-hdpi/box_appointment_selected.9.png differ
diff --git a/res/drawable-hdpi/dna_1_of_6.png b/res/drawable-hdpi/dna_1_of_6.png
new file mode 100644 (file)
index 0000000..bcefba7
Binary files /dev/null and b/res/drawable-hdpi/dna_1_of_6.png differ
diff --git a/res/drawable-hdpi/dna_2345_of_6.png b/res/drawable-hdpi/dna_2345_of_6.png
new file mode 100644 (file)
index 0000000..0a2f1a8
Binary files /dev/null and b/res/drawable-hdpi/dna_2345_of_6.png differ
diff --git a/res/drawable-hdpi/dna_6_of_6.png b/res/drawable-hdpi/dna_6_of_6.png
new file mode 100644 (file)
index 0000000..c9d216e
Binary files /dev/null and b/res/drawable-hdpi/dna_6_of_6.png differ
diff --git a/res/drawable-hdpi/dna_empty.png b/res/drawable-hdpi/dna_empty.png
new file mode 100644 (file)
index 0000000..3b5e335
Binary files /dev/null and b/res/drawable-hdpi/dna_empty.png differ
diff --git a/res/drawable-hdpi/ic_alarm_dark.png b/res/drawable-hdpi/ic_alarm_dark.png
new file mode 100644 (file)
index 0000000..272c489
Binary files /dev/null and b/res/drawable-hdpi/ic_alarm_dark.png differ
diff --git a/res/drawable-hdpi/ic_alarm_white.png b/res/drawable-hdpi/ic_alarm_white.png
new file mode 100644 (file)
index 0000000..7602182
Binary files /dev/null and b/res/drawable-hdpi/ic_alarm_white.png differ
diff --git a/res/drawable-hdpi/ic_btn_round_minus.png b/res/drawable-hdpi/ic_btn_round_minus.png
new file mode 100644 (file)
index 0000000..02bec7d
Binary files /dev/null and b/res/drawable-hdpi/ic_btn_round_minus.png differ
diff --git a/res/drawable-hdpi/ic_btn_round_plus.png b/res/drawable-hdpi/ic_btn_round_plus.png
new file mode 100644 (file)
index 0000000..1fdfb69
Binary files /dev/null and b/res/drawable-hdpi/ic_btn_round_plus.png differ
diff --git a/res/drawable-hdpi/ic_contact_picture.png b/res/drawable-hdpi/ic_contact_picture.png
new file mode 100755 (executable)
index 0000000..7c34f5c
Binary files /dev/null and b/res/drawable-hdpi/ic_contact_picture.png differ
diff --git a/res/drawable-hdpi/ic_menu_reminder.png b/res/drawable-hdpi/ic_menu_reminder.png
new file mode 100644 (file)
index 0000000..64cf5f0
Binary files /dev/null and b/res/drawable-hdpi/ic_menu_reminder.png differ
diff --git a/res/drawable-hdpi/ic_menu_show_list.png b/res/drawable-hdpi/ic_menu_show_list.png
new file mode 100644 (file)
index 0000000..047cc12
Binary files /dev/null and b/res/drawable-hdpi/ic_menu_show_list.png differ
diff --git a/res/drawable-hdpi/ic_repeat_dark.png b/res/drawable-hdpi/ic_repeat_dark.png
new file mode 100644 (file)
index 0000000..8402fa2
Binary files /dev/null and b/res/drawable-hdpi/ic_repeat_dark.png differ
diff --git a/res/drawable-hdpi/ic_repeat_white.png b/res/drawable-hdpi/ic_repeat_white.png
new file mode 100644 (file)
index 0000000..9a595fb
Binary files /dev/null and b/res/drawable-hdpi/ic_repeat_white.png differ
diff --git a/res/drawable-hdpi/im_avatar_picture_border_normal.9.png b/res/drawable-hdpi/im_avatar_picture_border_normal.9.png
new file mode 100755 (executable)
index 0000000..2367f98
Binary files /dev/null and b/res/drawable-hdpi/im_avatar_picture_border_normal.9.png differ
diff --git a/res/drawable-hdpi/month_view_background.9.png b/res/drawable-hdpi/month_view_background.9.png
new file mode 100644 (file)
index 0000000..1108a78
Binary files /dev/null and b/res/drawable-hdpi/month_view_background.9.png differ
diff --git a/res/drawable-hdpi/month_view_longpress.9.png b/res/drawable-hdpi/month_view_longpress.9.png
new file mode 100644 (file)
index 0000000..aa8179d
Binary files /dev/null and b/res/drawable-hdpi/month_view_longpress.9.png differ
diff --git a/res/drawable-hdpi/month_view_pressed.9.png b/res/drawable-hdpi/month_view_pressed.9.png
new file mode 100644 (file)
index 0000000..0868dfd
Binary files /dev/null and b/res/drawable-hdpi/month_view_pressed.9.png differ
diff --git a/res/drawable-hdpi/month_view_selected.9.png b/res/drawable-hdpi/month_view_selected.9.png
new file mode 100644 (file)
index 0000000..e3236ad
Binary files /dev/null and b/res/drawable-hdpi/month_view_selected.9.png differ
diff --git a/res/drawable-hdpi/month_view_today_background.9.png b/res/drawable-hdpi/month_view_today_background.9.png
new file mode 100644 (file)
index 0000000..fbf1553
Binary files /dev/null and b/res/drawable-hdpi/month_view_today_background.9.png differ
diff --git a/res/drawable-hdpi/stat_notify_calendar.png b/res/drawable-hdpi/stat_notify_calendar.png
new file mode 100644 (file)
index 0000000..7e7cd60
Binary files /dev/null and b/res/drawable-hdpi/stat_notify_calendar.png differ
diff --git a/res/drawable-hdpi/sym_calendar_event.png b/res/drawable-hdpi/sym_calendar_event.png
new file mode 100644 (file)
index 0000000..3faeb88
Binary files /dev/null and b/res/drawable-hdpi/sym_calendar_event.png differ
diff --git a/res/drawable-land-hdpi/dna_1_of_6.png b/res/drawable-land-hdpi/dna_1_of_6.png
new file mode 100644 (file)
index 0000000..82747df
Binary files /dev/null and b/res/drawable-land-hdpi/dna_1_of_6.png differ
diff --git a/res/drawable-land-hdpi/dna_2345_of_6.png b/res/drawable-land-hdpi/dna_2345_of_6.png
new file mode 100644 (file)
index 0000000..cd68492
Binary files /dev/null and b/res/drawable-land-hdpi/dna_2345_of_6.png differ
diff --git a/res/drawable-land-hdpi/dna_6_of_6.png b/res/drawable-land-hdpi/dna_6_of_6.png
new file mode 100644 (file)
index 0000000..2c082a0
Binary files /dev/null and b/res/drawable-land-hdpi/dna_6_of_6.png differ
diff --git a/res/drawable-land-hdpi/dna_empty.png b/res/drawable-land-hdpi/dna_empty.png
new file mode 100644 (file)
index 0000000..26a8518
Binary files /dev/null and b/res/drawable-land-hdpi/dna_empty.png differ
new file mode 100644 (file)
index 0000000000000000000000000000000000000000..3a338e8e219bfc4f2ea7a2cad847479855e7435a
Binary files /dev/null and b/res/drawable-mdpi/ic_contact_picture.png differ
new file mode 100644 (file)
index 0000000000000000000000000000000000000000..01cc9dce7d7c53bd45fa64bcf24cc194ebd7fbfc
Binary files /dev/null and b/res/drawable-mdpi/im_avatar_picture_border_normal.9.png differ
new file mode 100644 (file)
index 0000000000000000000000000000000000000000..96824f509e7bbbc0b8d23b812196dfc623fe20df
--- /dev/null
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<TextView
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="fill_parent"
+    android:layout_height="wrap_content"
+    android:layout_marginLeft="10dip"
+    android:gravity="center_vertical"
+    android:textColor="?android:attr/textColorSecondary"
+    android:minHeight="?android:attr/listPreferredItemHeight"
+    android:paddingLeft="10dip"
+    android:paddingRight="10dip"
+    style="?android:attr/textAppearanceMediumInverse" />
new file mode 100644 (file)
index 0000000000000000000000000000000000000000..86ba1408454f8ad240ce2d877ade3e9ce51c9086
--- /dev/null
@@ -0,0 +1,66 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+  
+          http://www.apache.org/licenses/LICENSE-2.0
+  
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<RelativeLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="fill_parent"
+    android:paddingLeft="0dip"
+    android:paddingRight="9dip"
+    android:minHeight="48dip">
+
+    <QuickContactBadge
+        android:id="@+id/badge"
+        android:paddingLeft="3dip"
+        android:paddingRight="3dip"
+        android:paddingTop="3dip"
+        android:paddingBottom="6dip"
+        android:layout_above="@+id/separator"
+        android:layout_marginLeft="2dip"
+        android:layout_marginRight="14dip"
+        android:layout_marginTop="4dip"
+        android:layout_marginBottom="3dip"
+        android:layout_alignParentLeft="true"
+        android:layout_alignParentTop="true"
+        android:src="@drawable/ic_contact_picture"
+        style="@*android:style/Widget.QuickContactBadgeSmall.WindowSmall" />
+
+    <TextView
+        android:id="@+id/name"
+        android:textAppearance="?android:attr/textAppearanceSmall"
+        android:inputType="none"
+        android:paddingLeft="2dip"
+        android:layout_centerVertical="true"
+        android:layout_toRightOf="@id/badge"
+        android:layout_width="fill_parent"
+        android:layout_height="wrap_content" />
+
+    <ImageView
+        android:id="@+id/presence"
+        android:scaleType="fitXY"
+        android:visibility="gone"
+        android:layout_alignParentRight="true"
+        android:layout_centerVertical="true"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content" />
+
+    <View
+        android:id="@+id/separator"
+        android:layout_width="fill_parent"
+        android:layout_height="1px"
+        android:layout_alignParentBottom="true"
+        android:background="@android:drawable/divider_horizontal_bright" />
+
+</RelativeLayout>
index 352a4ed90cc5264efb3752813a52a2fd6ab20dc3..88b92b7754a0eb282bf989f9e8a008dbcb315b38 100644 (file)
                     android:layout_height="wrap_content"
                     android:layout_weight="7"
                     android:gravity="left|center_vertical"
-                    style="?android:attr/textAppearanceMedium"/>
+                    style="?android:attr/textAppearanceMediumInverse"/>
 
                 <Button android:id="@+id/start_time"
                     android:layout_width="0px"
                     android:layout_height="wrap_content"
                     android:layout_weight="4"
                     android:gravity="left|center_vertical"
-                    style="?android:attr/textAppearanceMedium"/>
+                    style="?android:attr/textAppearanceMediumInverse"/>
 
             </LinearLayout>
 
                     android:layout_height="wrap_content"
                     android:layout_weight="7"
                     android:gravity="left|center_vertical"
-                    style="?android:attr/textAppearanceMedium"/>
+                    style="?android:attr/textAppearanceMediumInverse"/>
 
                 <Button android:id="@+id/end_time"
                     android:layout_width="0px"
                     android:layout_height="wrap_content"
                     android:layout_weight="4"
                     android:gravity="left|center_vertical"
-                    style="?android:attr/textAppearanceMedium"/>
+                    style="?android:attr/textAppearanceMediumInverse"/>
             </LinearLayout>
 
             <LinearLayout
                     android:text="@string/edit_event_all_day_label"
                     android:paddingTop="1dip"
                     android:paddingRight="7dip"
-                    style="?android:attr/textAppearanceMedium"/>
+                    style="?android:attr/textAppearanceMediumInverse"/>
                 <CheckBox android:id="@+id/is_all_day"
                     android:layout_width="wrap_content"
                     android:layout_height="wrap_content"
 
             <Spinner android:id="@+id/calendars"
                 android:layout_width="fill_parent"
-                android:layout_height="wrap_content" />
+                android:layout_height="wrap_content"
+                android:prompt="@string/edit_event_calendar_label"/>
+        </LinearLayout>
+
+        <!-- GUESTS/ATTENDEES -->
+        <LinearLayout android:id="@+id/attendees_group"
+            android:orientation="vertical"
+            android:layout_width="fill_parent"
+            android:layout_height="wrap_content"
+            style="@style/EditEvent_Layout">
+
+            <TextView
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:text="@string/attendees_label"
+                style="@style/TextAppearance.EditEvent_Label"/>
+
+            <MultiAutoCompleteTextView android:id="@+id/attendees"
+                android:layout_width="fill_parent"
+                android:layout_height="wrap_content"
+                android:inputType="textEmailAddress|textMultiLine"
+                android:hint="@string/hint_attendees"
+                android:layout_marginTop="6dip"
+                android:layout_marginBottom="6dip"
+                android:imeOptions="actionNext"/>
         </LinearLayout>
 
         <!-- REPEATS -->
 
             <Spinner android:id="@+id/repeats"
                 android:layout_width="fill_parent"
-                android:layout_height="wrap_content"/>
+                android:layout_height="wrap_content"
+                android:prompt="@string/repeats_label"/>
         </LinearLayout>
 
         <!-- MORE OPTIONS -->
                 <Spinner android:id="@+id/availability"
                     android:layout_width="fill_parent"
                     android:layout_height="wrap_content"
-                    android:entries="@array/availability" />
+                    android:entries="@array/availability"
+                    android:prompt="@string/presence_label"/>
             </LinearLayout>
 
             <!-- PRIVACY -->
                 <Spinner android:id="@+id/visibility"
                     android:layout_width="fill_parent"
                     android:layout_height="wrap_content"
-                    android:entries="@array/visibility" />
+                    android:entries="@array/visibility"
+                    android:prompt="@string/privacy_label"/>
             </LinearLayout>
         </LinearLayout>
 
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
                 android:layout_marginRight="2dip"
-                android:text="@string/add_new_reminder"/>
+                android:text="@string/add_new_reminder"
+                style="?android:attr/textAppearanceSmallInverse"/>
 
             <ImageButton android:id="@+id/reminder_add"
                 style="@style/PlusButton"
index 3992e804dc0be7d9b7da4d590eda97899e777ff5..a4319190eeaec821b62fd11ac07860dc78d07713 100644 (file)
                     android:autoLink="all"
                     style="?android:attr/textAppearanceSmall"
                 />
+
+                <!-- Organizer -->
+                <LinearLayout android:id="@+id/organizer_container"
+                    android:orientation="horizontal"
+                    android:layout_width="fill_parent"
+                    android:layout_height="wrap_content"
+                    android:paddingBottom="5dip"
+                >
+            
+                    <TextView
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_marginRight="5dip"
+                        android:text="@string/view_event_organizer_label"
+                        style="?android:attr/textAppearanceSmall"
+                    />
     
+                    <TextView android:id="@+id/organizer"
+                        android:layout_width="fill_parent"
+                        android:layout_height="wrap_content"
+                        style="?android:attr/textAppearanceSmall"
+                    />
+                </LinearLayout>
+
                 <!-- DESCRIPTION -->
                 <TextView android:id="@+id/description"
                     android:layout_width="fill_parent"
                 </LinearLayout>
             </LinearLayout>
         </LinearLayout>
-        
+
         <!-- RESPONSE -->
         <LinearLayout android:id="@+id/response_container"
             android:orientation="vertical"
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
                 android:text="@string/view_event_response_label"
-                style="@style/TextAppearance.EditEvent_Label"/>
+                style="@style/TextAppearance.EventInfo_Label"/>
         
             <Spinner android:id="@+id/response_value"
                 style="?android:attr/textAppearanceMedium"
                 android:entries="@array/response_labels1"/>
         </LinearLayout>
         
+        <!-- GUEST LIST -->
+        <LinearLayout
+            android:id="@+id/attendee_list"
+            android:layout_width="fill_parent"
+            android:layout_height="wrap_content"
+            android:paddingLeft="8dip"
+            android:orientation="vertical" />
+
         <!-- REMINDERS -->
         <LinearLayout android:id="@+id/reminders_container"
             android:orientation="vertical"
             android:paddingLeft="8dip"
             android:paddingRight="7dip"
             android:paddingTop="5dip"
-            android:paddingBottom="1dip">
+            android:paddingBottom="5dip">
         
             <TextView android:id="@+id/reminders_label"
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
                 android:text="@string/reminders_label"
-                style="@style/TextAppearance.EditEvent_Label"/>
+                style="@style/TextAppearance.EventInfo_Label"/>
 
             <LinearLayout android:id="@+id/reminder_items_container"
                 style="?android:attr/textAppearanceMedium"
                 android:layout_width="fill_parent"
                 android:layout_height="wrap_content">
             </LinearLayout>
-        </LinearLayout>
-        <LinearLayout
-            android:layout_width="fill_parent"
-            android:layout_height="wrap_content"
-            android:gravity="center_vertical|right"
-            android:paddingRight="5dip"
-            android:paddingBottom="5dip">
-
-            <TextView
-                android:layout_width="wrap_content"
+            <LinearLayout android:id="@+id/reminder_adder"
+                android:layout_width="fill_parent"
                 android:layout_height="wrap_content"
-                android:layout_marginRight="7dip"
-                android:text="@string/add_new_reminder"/>
+                android:gravity="center_vertical|right">
 
-            <ImageButton android:id="@+id/reminder_add"
-                style="@style/PlusButton"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:layout_marginRight="2dip"
-            />
+                <TextView
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_marginRight="7dip"
+                    android:text="@string/add_new_reminder"/>
+
+                <ImageButton android:id="@+id/reminder_add"
+                    style="@style/PlusButton"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                />
+            </LinearLayout>
         </LinearLayout>
     </LinearLayout>
 </ScrollView>
index 5616b49c67e45076f1c6484c7c55ae5d898800fa..bd5a2ad92b1d73fcf2050a3c8f063c3aec5a55b9 100644 (file)
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="app_label" msgid="5452708708398908131">"Kalendář"</string>
-    <string name="calendar_plug" msgid="8148614847911924208"><font fgcolor="#ffffffff">"Vítá vás Kalendář Google!"</font>" "\n" Přístup společnosti Google ke správě vašeho časového plánu je založen na myšlence, že plánování událostí může být intuitivnější, efektivnější a přístupnější."</string>
+    <string name="calendar_plug" msgid="4861031284038774007"><font fgcolor="#ffffffff">"Vítá vás Kalendář Google!"</font>" "\n" Přístup společnosti Google ke správě vašeho časového plánu je založen na myšlence, že plánování událostí může být intuitivnější, efektivnější a přístupnější."</string>
     <string name="what_label" msgid="1933578391985810049">"Co"</string>
     <string name="when_label" msgid="894636567327261599">"Kdy"</string>
     <string name="where_label" msgid="3472482206065595118">"Kde"</string>
+    <string name="attendees_label" msgid="2971281641565729725">"Hosté"</string>
+    <string name="response_label" msgid="5732943469653254290">"<xliff:g id="RESPONSE_TYPE">%s</xliff:g> (<xliff:g id="GUEST_COUNT">%d</xliff:g>)"</string>
     <string name="repeats_label" msgid="7414023871434593196">"Opakování"</string>
     <string name="no_title_label" msgid="7352118984125107858">"(Bez předmětu)"</string>
   <plurals name="Nminutes">
@@ -59,6 +61,7 @@
     <string name="hint_what" msgid="709155115005044531">"Název události"</string>
     <string name="hint_where" msgid="3116239630502213241">"Místo události"</string>
     <string name="hint_description" msgid="4198202812240544553">"Popis události"</string>
+    <string name="hint_attendees" msgid="6036653711383143333">"E-mailové adresy"</string>
     <string name="creating_event" msgid="8237877638457604455">"Vytváření události…"</string>
     <string name="saving_event" msgid="8853425146353785688">"Ukládání události…"</string>
     <string name="loading_calendars_title" msgid="3819254313413902272">"Načítání kalendářů"</string>
     <string name="edit_event_show_extra_options" msgid="2325854287823989650">"Zobrazit další možnosti"</string>
     <string name="edit_event_hide_extra_options" msgid="4019082307326855513">"Skrýt další možnosti"</string>
     <string name="description_label" msgid="7193475046717505855">"Popis"</string>
-    <string name="presence_label" msgid="2155381988163502023">"Účast"</string>
+    <string name="presence_label" msgid="6169724148441175862">"Zobrazit mě jako"</string>
     <string name="privacy_label" msgid="9215031965259597335">"Přístupnost"</string>
     <string name="reminders_label" msgid="8345054160145333166">"Připomenutí"</string>
     <string name="no_syncable_calendars" msgid="7019488867045436129">"Žádné kalendáře"</string>
     <string name="no_calendars_found" msgid="755379468136462058">"Nemáte žádné kalendáře."</string>
     <string name="view_event_calendar_label" msgid="8503354404461986250">"Kalendář"</string>
+    <string name="view_event_organizer_label" msgid="2168441329713325834">"Organizátor"</string>
     <string name="view_event_timezone_label" msgid="6461351857281070935">"Místní časové pásmo"</string>
     <string name="view_event_response_label" msgid="8382281658458798329">"Zúčastníte se?"</string>
-    <string name="agenda_today" msgid="2405333795044229594">"Dnes"</string>
+    <string name="agenda_today" msgid="6489447319363439068">"Dnes, <xliff:g id="DATE">%1$s</xliff:g>"</string>
+    <string name="loading" msgid="3772533493214331230">"Načítání..."</string>
+    <string name="show_older_events" msgid="4031960000704544741">"Zobrazují se události od <xliff:g id="OLDEST_SEARCH_RANGE">%1$s</xliff:g>. Další položky zobrazíte klepnutím."</string>
+    <string name="show_newer_events" msgid="2647889653936094369">"Zobrazují se události do <xliff:g id="NEWEST_SEARCH_RANGE">%1$s</xliff:g>. Další položky zobrazíte klepnutím."</string>
     <string name="num_events" msgid="3351672964607162257">"Počet událostí"</string>
     <string name="edit_event_label" msgid="2900418236819088363">"Upravit událost"</string>
     <string name="delete_label" msgid="874742811918030739">"Smazat"</string>
     <string name="preferences_alerts_type_dialog" msgid="2195667763429994271">"Upozornění a oznámení"</string>
     <string name="preferences_alerts_vibrate_title" msgid="7997122314759645350">"Vibrace"</string>
     <string name="preferences_alerts_ringtone_title" msgid="7565118268120729644">"Vybrat vyzvánění"</string>
-    <string name="preferences_default_reminder_title" msgid="103964814265989503">"Nastavit výchozí připomenutí"</string>
+    <string name="preferences_default_reminder_title" msgid="5188861433342733905">"Výchozí čas připomenutí"</string>
     <string name="preferences_default_reminder_dialog" msgid="2490348857239323412">"Výchozí čas připomenutí"</string>
     <string name="preferences_default_reminder_default" msgid="2903884416749959435">"10"</string>
 </resources>
index 25e94bea363172f8163bd57b21c1f3cc7b2ece71..94f7d597172654ea61b1e6ddb5ac31fa7e741b20 100644 (file)
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="app_label" msgid="5452708708398908131">"Kalender"</string>
-    <string name="calendar_plug" msgid="8148614847911924208"><font fgcolor="#ffffffff">"Velkommen til Google Kalender!"</font>" "\n"En tilgang til planlægning fra Google baseret på den forestilling, at planlægning af begivenheder kan være mere intuitivt, effektivt og lettilgængeligt."</string>
+    <string name="calendar_plug" msgid="4861031284038774007"><font fgcolor="#ffffffff">"Velkommen til Google Kalender!"</font>" "\n"En tilgang til planlægning fra Google baseret på den forestilling, at planlægning af begivenheder kan være mere intuitivt, effektivt og lettilgængeligt."</string>
     <string name="what_label" msgid="1933578391985810049">"Hvad"</string>
     <string name="when_label" msgid="894636567327261599">"Hvornår"</string>
     <string name="where_label" msgid="3472482206065595118">"Hvor"</string>
+    <string name="attendees_label" msgid="2971281641565729725">"Gæster"</string>
+    <string name="response_label" msgid="5732943469653254290">"<xliff:g id="RESPONSE_TYPE">%s</xliff:g> (<xliff:g id="GUEST_COUNT">%d</xliff:g>)"</string>
     <string name="repeats_label" msgid="7414023871434593196">"Gentagelse"</string>
     <string name="no_title_label" msgid="7352118984125107858">"(Intet emne)"</string>
   <plurals name="Nminutes">
@@ -59,6 +61,7 @@
     <string name="hint_what" msgid="709155115005044531">"Begivenhedens navn"</string>
     <string name="hint_where" msgid="3116239630502213241">"Begivenhedens placering"</string>
     <string name="hint_description" msgid="4198202812240544553">"Beskrivelse af begivenhed"</string>
+    <string name="hint_attendees" msgid="6036653711383143333">"E-mail-adresser"</string>
     <string name="creating_event" msgid="8237877638457604455">"Opretter begivenhed ..."</string>
     <string name="saving_event" msgid="8853425146353785688">"Gemmer begivenhed ..."</string>
     <string name="loading_calendars_title" msgid="3819254313413902272">"Indlæser kalendere"</string>
     <string name="edit_event_show_extra_options" msgid="2325854287823989650">"Vis ekstra valgmuligheder"</string>
     <string name="edit_event_hide_extra_options" msgid="4019082307326855513">"Skjul ekstra valgmuligheder"</string>
     <string name="description_label" msgid="7193475046717505855">"Beskrivelse"</string>
-    <string name="presence_label" msgid="2155381988163502023">"Tilstedeværelse"</string>
+    <string name="presence_label" msgid="6169724148441175862">"Vis mig som"</string>
     <string name="privacy_label" msgid="9215031965259597335">"Fortrolighed"</string>
     <string name="reminders_label" msgid="8345054160145333166">"Påmindelser"</string>
     <string name="no_syncable_calendars" msgid="7019488867045436129">"Der er ingen kalendere"</string>
     <string name="no_calendars_found" msgid="755379468136462058">"Du har ingen kalendere."</string>
     <string name="view_event_calendar_label" msgid="8503354404461986250">"Kalender"</string>
+    <string name="view_event_organizer_label" msgid="2168441329713325834">"Organisator"</string>
     <string name="view_event_timezone_label" msgid="6461351857281070935">"Lokal tidszone"</string>
     <string name="view_event_response_label" msgid="8382281658458798329">"Deltager?"</string>
-    <string name="agenda_today" msgid="2405333795044229594">"I dag"</string>
+    <string name="agenda_today" msgid="6489447319363439068">"I dag <xliff:g id="DATE">%1$s</xliff:g>"</string>
+    <string name="loading" msgid="3772533493214331230">"Indlæser ..."</string>
+    <string name="show_older_events" msgid="4031960000704544741">"Viser begivenheder siden <xliff:g id="OLDEST_SEARCH_RANGE">%1$s</xliff:g>. Tryk for at lede efter flere."</string>
+    <string name="show_newer_events" msgid="2647889653936094369">"Viser begivenheder indtil <xliff:g id="NEWEST_SEARCH_RANGE">%1$s</xliff:g>. Tryk for at lede efter flere."</string>
     <string name="num_events" msgid="3351672964607162257">"Ant. beg."</string>
     <string name="edit_event_label" msgid="2900418236819088363">"Rediger begivenhed"</string>
     <string name="delete_label" msgid="874742811918030739">"Slet"</string>
     <string name="delete_event_label" msgid="3738436215987360463">"Slet begivenhed"</string>
-    <!-- no translation found for save_label (2133599104834432589) -->
-    <skip />
-    <!-- no translation found for discard_label (4510607554910139220) -->
-    <skip />
+    <string name="save_label" msgid="2133599104834432589">"Færdig"</string>
+    <string name="discard_label" msgid="4510607554910139220">"Vend tilbage"</string>
     <string name="import_label" msgid="6993796574741477222">"Importer"</string>
     <string name="snooze_all_label" msgid="4994488813124409077">"Sæt alle i slumretilstand"</string>
     <string name="dismiss_all_label" msgid="1834400025868091301">"Annuller alle"</string>
     <string name="preferences_alerts_type_dialog" msgid="2195667763429994271">"Underretninger og meddelelser"</string>
     <string name="preferences_alerts_vibrate_title" msgid="7997122314759645350">"Vibrer"</string>
     <string name="preferences_alerts_ringtone_title" msgid="7565118268120729644">"Vælg ringetone"</string>
-    <string name="preferences_default_reminder_title" msgid="103964814265989503">"Indstil standardpåmindelse"</string>
+    <string name="preferences_default_reminder_title" msgid="5188861433342733905">"Standard påmindelsestid"</string>
     <string name="preferences_default_reminder_dialog" msgid="2490348857239323412">"Standard påmindelsestid"</string>
     <string name="preferences_default_reminder_default" msgid="2903884416749959435">"10"</string>
 </resources>
index 73b75c2e0d6468d7e8bfd6727eb735a218eec994..d10a0acb6072d81cb90570c2cd5edeedf7cf398d 100644 (file)
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="app_label" msgid="5452708708398908131">"Kalender"</string>
-    <string name="calendar_plug" msgid="8148614847911924208"><font fgcolor="#ffffffff">"Willkommen bei Google Kalender!"</font>" "\n"Ein Ansatz à la Google beim Verwalten Ihrer Termine, der zeigen soll, dass Terminverwaltung intuitiver, effizienter und einfacher sein kann."</string>
+    <string name="calendar_plug" msgid="4861031284038774007"><font fgcolor="#ffffffff">"Willkommen bei Google Kalender!"</font>" "\n"Dies ist ein Ansatz von Google zum Verwalten Ihrer Termine, der auf dem Gedanken fußt, dass Terminverwaltung intuitiver, effizienter und einfacher sein kann."</string>
     <string name="what_label" msgid="1933578391985810049">"Was"</string>
     <string name="when_label" msgid="894636567327261599">"Wann"</string>
     <string name="where_label" msgid="3472482206065595118">"Wo"</string>
+    <string name="attendees_label" msgid="2971281641565729725">"Gäste"</string>
+    <string name="response_label" msgid="5732943469653254290">"<xliff:g id="RESPONSE_TYPE">%s</xliff:g> (<xliff:g id="GUEST_COUNT">%d</xliff:g>)"</string>
     <string name="repeats_label" msgid="7414023871434593196">"Wiederholung"</string>
     <string name="no_title_label" msgid="7352118984125107858">"(kein Thema)"</string>
   <plurals name="Nminutes">
@@ -59,6 +61,7 @@
     <string name="hint_what" msgid="709155115005044531">"Terminname"</string>
     <string name="hint_where" msgid="3116239630502213241">"Ort des Termins"</string>
     <string name="hint_description" msgid="4198202812240544553">"Terminbeschreibung"</string>
+    <string name="hint_attendees" msgid="6036653711383143333">"E-Mail-Adressen"</string>
     <string name="creating_event" msgid="8237877638457604455">"Termin wird erstellt…"</string>
     <string name="saving_event" msgid="8853425146353785688">"Termin wird gespeichert…"</string>
     <string name="loading_calendars_title" msgid="3819254313413902272">"Kalender werden geladen."</string>
     <string name="edit_event_show_extra_options" msgid="2325854287823989650">"Zusätzliche Optionen anzeigen"</string>
     <string name="edit_event_hide_extra_options" msgid="4019082307326855513">"Zusätzliche Optionen ausblenden"</string>
     <string name="description_label" msgid="7193475046717505855">"Beschreibung"</string>
-    <string name="presence_label" msgid="2155381988163502023">"Status"</string>
+    <string name="presence_label" msgid="6169724148441175862">"Mich anzeigen als"</string>
     <string name="privacy_label" msgid="9215031965259597335">"Datenschutz"</string>
     <string name="reminders_label" msgid="8345054160145333166">"Erinnerungen"</string>
     <string name="no_syncable_calendars" msgid="7019488867045436129">"Keine Kalender"</string>
     <string name="no_calendars_found" msgid="755379468136462058">"Sie haben keine Kalender."</string>
     <string name="view_event_calendar_label" msgid="8503354404461986250">"Kalender"</string>
+    <string name="view_event_organizer_label" msgid="2168441329713325834">"Organizer"</string>
     <string name="view_event_timezone_label" msgid="6461351857281070935">"Lokalzeit"</string>
     <string name="view_event_response_label" msgid="8382281658458798329">"Teilnahme?"</string>
-    <string name="agenda_today" msgid="2405333795044229594">"Heute"</string>
+    <string name="agenda_today" msgid="6489447319363439068">"Heute, <xliff:g id="DATE">%1$s</xliff:g>"</string>
+    <string name="loading" msgid="3772533493214331230">"Ladevorgang läuft..."</string>
+    <string name="show_older_events" msgid="4031960000704544741">"Termine seit <xliff:g id="OLDEST_SEARCH_RANGE">%1$s</xliff:g> werden angezeigt. Tippen Sie, um die Suche zu erweitern."</string>
+    <string name="show_newer_events" msgid="2647889653936094369">"Termine bis <xliff:g id="NEWEST_SEARCH_RANGE">%1$s</xliff:g> werden angezeigt. Tippen Sie, um die Suche zu erweitern."</string>
     <string name="num_events" msgid="3351672964607162257">"Anzahl Termine"</string>
     <string name="edit_event_label" msgid="2900418236819088363">"Termin bearbeiten"</string>
     <string name="delete_label" msgid="874742811918030739">"Löschen"</string>
     <string name="preferences_alerts_type_dialog" msgid="2195667763429994271">"Benachrichtigungen und Hinweise"</string>
     <string name="preferences_alerts_vibrate_title" msgid="7997122314759645350">"Vibration"</string>
     <string name="preferences_alerts_ringtone_title" msgid="7565118268120729644">"Klingelton auswählen"</string>
-    <string name="preferences_default_reminder_title" msgid="103964814265989503">"Standard-Erinnerungszeit"</string>
+    <string name="preferences_default_reminder_title" msgid="5188861433342733905">"Standard-Erinnerungszeit"</string>
     <string name="preferences_default_reminder_dialog" msgid="2490348857239323412">"Standard-Erinnerungszeit"</string>
     <string name="preferences_default_reminder_default" msgid="2903884416749959435">"10"</string>
 </resources>
index 1570f7dde3d397ade1c2105a0930ddc7b75e3ccf..e3ec32043736c1f8bc643b1290636e22eceee16c 100644 (file)
@@ -67,7 +67,7 @@
     <item msgid="5631923029483854900">"δεύτερο"</item>
     <item msgid="148935502975250973">"τρίτο"</item>
     <item msgid="5124200797326669172">"τέταρτο"</item>
-    <item msgid="7564374178324652137">"τελευταίο"</item>
+    <item msgid="7564374178324652137">"τελευταία"</item>
   </string-array>
   <string-array name="response_labels1">
     <item msgid="3654955385120106241">"(Καμία απάντηση)"</item>
index 6eefad04f8993565a04e43fffa1cbe39a5be1b85..24da1a0c8ac05d1bf2bbe09dae2002f6e8ebcd2e 100644 (file)
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="app_label" msgid="5452708708398908131">"Ημερολόγιο"</string>
-    <string name="calendar_plug" msgid="8148614847911924208"><font fgcolor="#ffffffff">"Καλώς ήρθατε στο Ημερολόγιο Google!"</font>" "\n"Μια πρόταση της Google για τη διαχείριση του προγράμματός σας βασισμένη στην ιδέα ότι ο προγραμματισμός συμβάντων μπορεί να είναι πιο διαισθητικός, πιο αποδοτικός και πιο προσιτός."</string>
+    <string name="calendar_plug" msgid="4861031284038774007"><font fgcolor="#ffffffff">"Καλώς ήρθατε στο Ημερολόγιο Google!"</font>" "\n"Μια πρόταση της Google για τη διαχείριση του προγράμματός σας βασισμένη στην ιδέα ότι ο προγραμματισμός συμβάντων μπορεί να γίνει πιο διαισθητικός, πιο αποδοτικός και πιο προσιτός."</string>
     <string name="what_label" msgid="1933578391985810049">"Τι"</string>
     <string name="when_label" msgid="894636567327261599">"Πότε"</string>
     <string name="where_label" msgid="3472482206065595118">"Που"</string>
+    <string name="attendees_label" msgid="2971281641565729725">"Προσκεκλημένοι"</string>
+    <string name="response_label" msgid="5732943469653254290">"<xliff:g id="RESPONSE_TYPE">%s</xliff:g> (<xliff:g id="GUEST_COUNT">%d</xliff:g>)"</string>
     <string name="repeats_label" msgid="7414023871434593196">"Επανάληψη"</string>
     <string name="no_title_label" msgid="7352118984125107858">"(Χωρίς θέμα)"</string>
   <plurals name="Nminutes">
@@ -59,6 +61,7 @@
     <string name="hint_what" msgid="709155115005044531">"Όνομα συμβάντος"</string>
     <string name="hint_where" msgid="3116239630502213241">"Τοποθεσία συμβάντος"</string>
     <string name="hint_description" msgid="4198202812240544553">"Περιγραφή συμβάντος"</string>
+    <string name="hint_attendees" msgid="6036653711383143333">"Διευθύνσεις ηλεκτρονικού ταχυδρομείου"</string>
     <string name="creating_event" msgid="8237877638457604455">"Δημιουργία συμβάντος..."</string>
     <string name="saving_event" msgid="8853425146353785688">"Αποθήκευση συμβάντος…"</string>
     <string name="loading_calendars_title" msgid="3819254313413902272">"Φόρτωση ημερολογίων"</string>
     <string name="edit_event_show_extra_options" msgid="2325854287823989650">"Εμφάνιση επιπρόσθετων επιλογών"</string>
     <string name="edit_event_hide_extra_options" msgid="4019082307326855513">"Απόκρυψη επιπρόσθετων επιλογών"</string>
     <string name="description_label" msgid="7193475046717505855">"Περιγραφή"</string>
-    <string name="presence_label" msgid="2155381988163502023">"Παρουσία"</string>
+    <string name="presence_label" msgid="6169724148441175862">"Να εμφανίζομαι ως"</string>
     <string name="privacy_label" msgid="9215031965259597335">"Απόρρητο"</string>
     <string name="reminders_label" msgid="8345054160145333166">"Υπενθυμίσεις"</string>
     <string name="no_syncable_calendars" msgid="7019488867045436129">"Δεν υπάρχουν ημερολόγια"</string>
     <string name="no_calendars_found" msgid="755379468136462058">"Δεν έχετε ημερολόγια."</string>
     <string name="view_event_calendar_label" msgid="8503354404461986250">"Ημερολόγιο"</string>
+    <string name="view_event_organizer_label" msgid="2168441329713325834">"Διοργανωτής"</string>
     <string name="view_event_timezone_label" msgid="6461351857281070935">"Τοπική ζώνη ώρας"</string>
     <string name="view_event_response_label" msgid="8382281658458798329">"Θα παραβρεθείτε;"</string>
-    <string name="agenda_today" msgid="2405333795044229594">"Σήμερα"</string>
+    <string name="agenda_today" msgid="6489447319363439068">"Σήμερα, <xliff:g id="DATE">%1$s</xliff:g>"</string>
+    <string name="loading" msgid="3772533493214331230">"Φόρτωση..."</string>
+    <string name="show_older_events" msgid="4031960000704544741">"Προβολή συμβάντων από <xliff:g id="OLDEST_SEARCH_RANGE">%1$s</xliff:g>. Πατήστε για να αναζητήσετε περισσότερα συμβάντα."</string>
+    <string name="show_newer_events" msgid="2647889653936094369">"Προβολή συμβάντων έως <xliff:g id="NEWEST_SEARCH_RANGE">%1$s</xliff:g>. Αγγίξτε για να αναζητήσετε περισσότερα."</string>
     <string name="num_events" msgid="3351672964607162257">"Αριθμ. συμβάντων"</string>
     <string name="edit_event_label" msgid="2900418236819088363">"Επεξεργασία συμβάντος"</string>
     <string name="delete_label" msgid="874742811918030739">"Διαγραφή"</string>
     <string name="delete_event_label" msgid="3738436215987360463">"Διαγραφή συμβάντος"</string>
-    <!-- no translation found for save_label (2133599104834432589) -->
-    <skip />
-    <!-- no translation found for discard_label (4510607554910139220) -->
-    <skip />
+    <string name="save_label" msgid="2133599104834432589">"Τέλος"</string>
+    <string name="discard_label" msgid="4510607554910139220">"Επαναφορά"</string>
     <string name="import_label" msgid="6993796574741477222">"Εισαγωγή"</string>
     <string name="snooze_all_label" msgid="4994488813124409077">"Αναβολή όλων"</string>
     <string name="dismiss_all_label" msgid="1834400025868091301">"Παράβλεψη όλων"</string>
     <string name="preferences_alerts_type_dialog" msgid="2195667763429994271">"Προειδοποιήσεις &amp; ειδοποιήσεις"</string>
     <string name="preferences_alerts_vibrate_title" msgid="7997122314759645350">"Δόνηση"</string>
     <string name="preferences_alerts_ringtone_title" msgid="7565118268120729644">"Επιλογή ήχου κλήσης"</string>
-    <string name="preferences_default_reminder_title" msgid="103964814265989503">"Ορισμός προεπιλεγμένης υπενθύμισης"</string>
+    <string name="preferences_default_reminder_title" msgid="5188861433342733905">"Προεπιλεγμένος χρόνος υπενθύμισης"</string>
     <string name="preferences_default_reminder_dialog" msgid="2490348857239323412">"Προεπιλεγμένος χρόνος υπενθύμισης"</string>
     <string name="preferences_default_reminder_default" msgid="2903884416749959435">"10"</string>
 </resources>
index 81165ac506fccdd115cc7192e276b563287adec0..77619585e693e0cf3e65f413cb532a26b0415ce7 100644 (file)
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="app_label" msgid="5452708708398908131">"Calendario"</string>
-    <string name="calendar_plug" msgid="8148614847911924208"><font fgcolor="#ffffffff">"¡Bienvenido a Google Calendar!"</font>" "\n" Un método de Google para administrar tu programación basado en la idea de que programar los eventos puede ser más intuitivo, eficaz y accesible."</string>
+    <string name="calendar_plug" msgid="4861031284038774007"><font fgcolor="#ffffffff">"¡Bienvenido a Google Calendar!"</font>" "\n" Un método de Google para administrar tu programación basado en la idea de que programar los eventos puede ser más intuitivo, eficaz y accesible."</string>
     <string name="what_label" msgid="1933578391985810049">"Qué"</string>
     <string name="when_label" msgid="894636567327261599">"Cuándo"</string>
     <string name="where_label" msgid="3472482206065595118">"Dónde"</string>
+    <string name="attendees_label" msgid="2971281641565729725">"Invitados"</string>
+    <string name="response_label" msgid="5732943469653254290">"<xliff:g id="RESPONSE_TYPE">%s</xliff:g> (<xliff:g id="GUEST_COUNT">%d</xliff:g>)"</string>
     <string name="repeats_label" msgid="7414023871434593196">"Repetición"</string>
     <string name="no_title_label" msgid="7352118984125107858">"(Sin asunto)"</string>
   <plurals name="Nminutes">
@@ -59,6 +61,7 @@
     <string name="hint_what" msgid="709155115005044531">"Nombre del evento"</string>
     <string name="hint_where" msgid="3116239630502213241">"Ubicación del evento"</string>
     <string name="hint_description" msgid="4198202812240544553">"Descripción del evento"</string>
+    <string name="hint_attendees" msgid="6036653711383143333">"Direcciones de correo electrónico"</string>
     <string name="creating_event" msgid="8237877638457604455">"Creando evento…"</string>
     <string name="saving_event" msgid="8853425146353785688">"Guardando evento…"</string>
     <string name="loading_calendars_title" msgid="3819254313413902272">"Cargando calendarios"</string>
     <string name="edit_event_show_extra_options" msgid="2325854287823989650">"Mostrar opciones adicionales"</string>
     <string name="edit_event_hide_extra_options" msgid="4019082307326855513">"Ocultar opciones adicionales"</string>
     <string name="description_label" msgid="7193475046717505855">"Descripción"</string>
-    <string name="presence_label" msgid="2155381988163502023">"Presencia"</string>
+    <string name="presence_label" msgid="6169724148441175862">"Mostrarme como"</string>
     <string name="privacy_label" msgid="9215031965259597335">"Privacidad"</string>
     <string name="reminders_label" msgid="8345054160145333166">"Recordatorios"</string>
     <string name="no_syncable_calendars" msgid="7019488867045436129">"No hay calendarios"</string>
     <string name="no_calendars_found" msgid="755379468136462058">"No tienes calendarios."</string>
     <string name="view_event_calendar_label" msgid="8503354404461986250">"Calendario"</string>
+    <string name="view_event_organizer_label" msgid="2168441329713325834">"Organizador"</string>
     <string name="view_event_timezone_label" msgid="6461351857281070935">"Zona horaria local"</string>
     <string name="view_event_response_label" msgid="8382281658458798329">"¿Asistirás?"</string>
-    <string name="agenda_today" msgid="2405333795044229594">"Hoy"</string>
+    <string name="agenda_today" msgid="6489447319363439068">"Hoy, <xliff:g id="DATE">%1$s</xliff:g>"</string>
+    <string name="loading" msgid="3772533493214331230">"Cargando…"</string>
+    <string name="show_older_events" msgid="4031960000704544741">"Mostrando eventos desde <xliff:g id="OLDEST_SEARCH_RANGE">%1$s</xliff:g>. Presionar para buscar más."</string>
+    <string name="show_newer_events" msgid="2647889653936094369">"Mostrando eventos hasta <xliff:g id="NEWEST_SEARCH_RANGE">%1$s</xliff:g>. Presionar para buscar más."</string>
     <string name="num_events" msgid="3351672964607162257">"Cant. de eventos"</string>
     <string name="edit_event_label" msgid="2900418236819088363">"Editar evento"</string>
     <string name="delete_label" msgid="874742811918030739">"Suprimir"</string>
     <string name="delete_event_label" msgid="3738436215987360463">"Suprimir evento"</string>
-    <!-- no translation found for save_label (2133599104834432589) -->
-    <skip />
-    <!-- no translation found for discard_label (4510607554910139220) -->
-    <skip />
+    <string name="save_label" msgid="2133599104834432589">"Finalizado"</string>
+    <string name="discard_label" msgid="4510607554910139220">"Revertir"</string>
     <string name="import_label" msgid="6993796574741477222">"Importar"</string>
     <string name="snooze_all_label" msgid="4994488813124409077">"Posponer todos"</string>
     <string name="dismiss_all_label" msgid="1834400025868091301">"Rechazar todos"</string>
     <string name="preferences_alerts_type_dialog" msgid="2195667763429994271">"Alertas y notificaciones"</string>
     <string name="preferences_alerts_vibrate_title" msgid="7997122314759645350">"Vibrar"</string>
     <string name="preferences_alerts_ringtone_title" msgid="7565118268120729644">"Seleccionar tono de llamada"</string>
-    <string name="preferences_default_reminder_title" msgid="103964814265989503">"Config. recordatorio predet."</string>
+    <string name="preferences_default_reminder_title" msgid="5188861433342733905">"Hora predeterminada de recordatorio"</string>
     <string name="preferences_default_reminder_dialog" msgid="2490348857239323412">"Hora predeterminada de recordatorio"</string>
     <string name="preferences_default_reminder_default" msgid="2903884416749959435">"10"</string>
 </resources>
index 9d8ad24d769a76b4e4e3d2ee434a42296442a310..2cc16ba54976a205d6950d2ef277c4822987b0a6 100644 (file)
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="app_label" msgid="5452708708398908131">"Calendario"</string>
-    <string name="calendar_plug" msgid="8148614847911924208"><font fgcolor="#ffffffff">"Bienvenido a Google Calendar"</font>\n" Una propuesta de Google para gestionar su agenda basándonos en la idea de que la programación de los eventos puede ser más intuitiva, eficaz y accesible."</string>
+    <string name="calendar_plug" msgid="4861031284038774007"><font fgcolor="#ffffffff">"Te damos la bienvenida a Google Calendar,"</font>\n" un servicio de administración de calendario creado por Google para hacer que la programación de los eventos sea más intuitiva, eficaz y accesible."</string>
     <string name="what_label" msgid="1933578391985810049">"Asunto"</string>
     <string name="when_label" msgid="894636567327261599">"Cuándo"</string>
     <string name="where_label" msgid="3472482206065595118">"Dónde"</string>
+    <string name="attendees_label" msgid="2971281641565729725">"Invitados"</string>
+    <string name="response_label" msgid="5732943469653254290">"<xliff:g id="RESPONSE_TYPE">%s</xliff:g> (<xliff:g id="GUEST_COUNT">%d</xliff:g>)"</string>
     <string name="repeats_label" msgid="7414023871434593196">"Repetición"</string>
     <string name="no_title_label" msgid="7352118984125107858">"(Sin asunto)"</string>
   <plurals name="Nminutes">
@@ -59,6 +61,7 @@
     <string name="hint_what" msgid="709155115005044531">"Nombre del evento"</string>
     <string name="hint_where" msgid="3116239630502213241">"Ubicación del evento"</string>
     <string name="hint_description" msgid="4198202812240544553">"Descripción del evento"</string>
+    <string name="hint_attendees" msgid="6036653711383143333">"Direcciones de correo electrónico"</string>
     <string name="creating_event" msgid="8237877638457604455">"Creando evento..."</string>
     <string name="saving_event" msgid="8853425146353785688">"Guardando evento..."</string>
     <string name="loading_calendars_title" msgid="3819254313413902272">"Cargando calendarios"</string>
     <string name="edit_event_show_extra_options" msgid="2325854287823989650">"Mostrar opciones extra"</string>
     <string name="edit_event_hide_extra_options" msgid="4019082307326855513">"Ocultar opciones extra"</string>
     <string name="description_label" msgid="7193475046717505855">"Descripción"</string>
-    <string name="presence_label" msgid="2155381988163502023">"Presencia"</string>
+    <string name="presence_label" msgid="6169724148441175862">"Mostrarme como"</string>
     <string name="privacy_label" msgid="9215031965259597335">"Privacidad"</string>
     <string name="reminders_label" msgid="8345054160145333166">"Recordatorios"</string>
     <string name="no_syncable_calendars" msgid="7019488867045436129">"No hay calendarios."</string>
     <string name="no_calendars_found" msgid="755379468136462058">"No tienes ningún calendario."</string>
     <string name="view_event_calendar_label" msgid="8503354404461986250">"Calendario"</string>
+    <string name="view_event_organizer_label" msgid="2168441329713325834">"Organizador"</string>
     <string name="view_event_timezone_label" msgid="6461351857281070935">"Zona horaria local"</string>
     <string name="view_event_response_label" msgid="8382281658458798329">"¿Asistiendo?"</string>
-    <string name="agenda_today" msgid="2405333795044229594">"Hoy"</string>
+    <string name="agenda_today" msgid="6489447319363439068">"Hoy, <xliff:g id="DATE">%1$s</xliff:g>"</string>
+    <string name="loading" msgid="3772533493214331230">"Cargando..."</string>
+    <string name="show_older_events" msgid="4031960000704544741">"Mostrando eventos a partir del <xliff:g id="OLDEST_SEARCH_RANGE">%1$s</xliff:g>. Toca aquí para buscar más."</string>
+    <string name="show_newer_events" msgid="2647889653936094369">"Mostrando eventos hasta el <xliff:g id="NEWEST_SEARCH_RANGE">%1$s</xliff:g>. Toca aquí para buscar más."</string>
     <string name="num_events" msgid="3351672964607162257">"Número de eventos"</string>
     <string name="edit_event_label" msgid="2900418236819088363">"Editar evento"</string>
     <string name="delete_label" msgid="874742811918030739">"Eliminar"</string>
     <string name="preferences_alerts_type_dialog" msgid="2195667763429994271">"Alertas y notificaciones"</string>
     <string name="preferences_alerts_vibrate_title" msgid="7997122314759645350">"Vibrar"</string>
     <string name="preferences_alerts_ringtone_title" msgid="7565118268120729644">"Seleccionar tono"</string>
-    <string name="preferences_default_reminder_title" msgid="103964814265989503">"Recordatorio predeterminado"</string>
+    <string name="preferences_default_reminder_title" msgid="5188861433342733905">"Duración predeterminada del recordatorio"</string>
     <string name="preferences_default_reminder_dialog" msgid="2490348857239323412">"Duración predeterminada del recordatorio"</string>
     <string name="preferences_default_reminder_default" msgid="2903884416749959435">"10"</string>
 </resources>
index e4bf32fd27e32a757e249264f3424eb609c0f562..400dbab8843f23377634ac12de6abb8a251cd961 100644 (file)
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="app_label" msgid="5452708708398908131">"Agenda"</string>
-    <string name="calendar_plug" msgid="8148614847911924208"><font fgcolor="#ffffffff">"Bienvenue dans Google Agenda !"</font>" "\n"La solution de Google pour gérer votre emploi du temps en planifiant vos événements de manière plus intuitive, efficace et directe."</string>
+    <string name="calendar_plug" msgid="4861031284038774007"><font fgcolor="#ffffffff">"Bienvenue dans Google Agenda !"</font>" "\n"La solution de Google pour gérer votre emploi du temps en planifiant vos événements de manière plus intuitive, efficace et directe."</string>
     <string name="what_label" msgid="1933578391985810049">"Objet"</string>
     <string name="when_label" msgid="894636567327261599">"Date"</string>
     <string name="where_label" msgid="3472482206065595118">"Lieu"</string>
+    <string name="attendees_label" msgid="2971281641565729725">"Invités"</string>
+    <string name="response_label" msgid="5732943469653254290">"<xliff:g id="RESPONSE_TYPE">%s</xliff:g> (<xliff:g id="GUEST_COUNT">%d</xliff:g>)"</string>
     <string name="repeats_label" msgid="7414023871434593196">"Fréquence"</string>
     <string name="no_title_label" msgid="7352118984125107858">"(Aucun objet)"</string>
   <plurals name="Nminutes">
@@ -59,6 +61,7 @@
     <string name="hint_what" msgid="709155115005044531">"Nom de l\'événement"</string>
     <string name="hint_where" msgid="3116239630502213241">"Lieu de l\'événement"</string>
     <string name="hint_description" msgid="4198202812240544553">"Description de l\'événement"</string>
+    <string name="hint_attendees" msgid="6036653711383143333">"Adresses e-mail"</string>
     <string name="creating_event" msgid="8237877638457604455">"Création de l\'événement…"</string>
     <string name="saving_event" msgid="8853425146353785688">"Enregistrement de l\'événement…"</string>
     <string name="loading_calendars_title" msgid="3819254313413902272">"Chargement des agendas"</string>
     <string name="edit_event_show_extra_options" msgid="2325854287823989650">"Afficher les options supplémentaires"</string>
     <string name="edit_event_hide_extra_options" msgid="4019082307326855513">"Masquer options supplémentaires"</string>
     <string name="description_label" msgid="7193475046717505855">"Description"</string>
-    <string name="presence_label" msgid="2155381988163502023">"Présence"</string>
+    <string name="presence_label" msgid="6169724148441175862">"Ma disponibilité"</string>
     <string name="privacy_label" msgid="9215031965259597335">"Confidentialité"</string>
     <string name="reminders_label" msgid="8345054160145333166">"Rappels"</string>
     <string name="no_syncable_calendars" msgid="7019488867045436129">"Pas d\'agenda"</string>
     <string name="no_calendars_found" msgid="755379468136462058">"Vous n\'avez pas d\'agenda."</string>
     <string name="view_event_calendar_label" msgid="8503354404461986250">"Agenda"</string>
+    <string name="view_event_organizer_label" msgid="2168441329713325834">"Organisateur"</string>
     <string name="view_event_timezone_label" msgid="6461351857281070935">"Fuseau horaire local"</string>
     <string name="view_event_response_label" msgid="8382281658458798329">"Participation ?"</string>
-    <string name="agenda_today" msgid="2405333795044229594">"Aujourd\'hui"</string>
+    <string name="agenda_today" msgid="6489447319363439068">"Aujourd\'hui, <xliff:g id="DATE">%1$s</xliff:g>"</string>
+    <string name="loading" msgid="3772533493214331230">"Chargement…"</string>
+    <string name="show_older_events" msgid="4031960000704544741">"Affichage des événements depuis <xliff:g id="OLDEST_SEARCH_RANGE">%1$s</xliff:g>. Appuyez pour en consulter d\'autres."</string>
+    <string name="show_newer_events" msgid="2647889653936094369">"Affichage des événements jusqu\'à <xliff:g id="NEWEST_SEARCH_RANGE">%1$s</xliff:g>. Appuyez pour en consulter d\'autres."</string>
     <string name="num_events" msgid="3351672964607162257">"Nbre d\'événements"</string>
     <string name="edit_event_label" msgid="2900418236819088363">"Modifier l\'événement"</string>
     <string name="delete_label" msgid="874742811918030739">"Supprimer"</string>
     <string name="preferences_alerts_type_dialog" msgid="2195667763429994271">"Alertes et notifications"</string>
     <string name="preferences_alerts_vibrate_title" msgid="7997122314759645350">"Vibreur"</string>
     <string name="preferences_alerts_ringtone_title" msgid="7565118268120729644">"Sélectionner la sonnerie"</string>
-    <string name="preferences_default_reminder_title" msgid="103964814265989503">"Définir le rappel par défaut"</string>
+    <string name="preferences_default_reminder_title" msgid="5188861433342733905">"Rappel par défaut"</string>
     <string name="preferences_default_reminder_dialog" msgid="2490348857239323412">"Rappel par défaut"</string>
     <string name="preferences_default_reminder_default" msgid="2903884416749959435">"10"</string>
 </resources>
index d0ff1e5e74ad9187f0020697e71265add8d0531b..12fd3e0421865359f521a51d256880cfb7953171 100644 (file)
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="app_label" msgid="5452708708398908131">"Calendario"</string>
-    <string name="calendar_plug" msgid="8148614847911924208"><font fgcolor="#ffffffff">"Benvenuto in  Google Calendar!"</font>" "\n"Un approccio di Google alla gestione della tua pianificazione in base all\'idea che gli eventi di pianificazione possano essere più intuitivi, efficaci e accessibili."</string>
+    <string name="calendar_plug" msgid="4861031284038774007"><font fgcolor="#ffffffff">"Benvenuto in Google Calendar!"</font>" "\n"Un approccio di Google alla gestione della tua pianificazione in base all\'idea che gli eventi di pianificazione possano essere più intuitivi, efficaci e accessibili."</string>
     <string name="what_label" msgid="1933578391985810049">"Che cosa"</string>
     <string name="when_label" msgid="894636567327261599">"Intervallo di tempo"</string>
     <string name="where_label" msgid="3472482206065595118">"Dove"</string>
+    <string name="attendees_label" msgid="2971281641565729725">"Invitati"</string>
+    <string name="response_label" msgid="5732943469653254290">"<xliff:g id="RESPONSE_TYPE">%s</xliff:g> (<xliff:g id="GUEST_COUNT">%d</xliff:g>)"</string>
     <string name="repeats_label" msgid="7414023871434593196">"Ripetizione"</string>
     <string name="no_title_label" msgid="7352118984125107858">"(Nessun oggetto)"</string>
   <plurals name="Nminutes">
@@ -59,6 +61,7 @@
     <string name="hint_what" msgid="709155115005044531">"Nome evento"</string>
     <string name="hint_where" msgid="3116239630502213241">"Luogo evento"</string>
     <string name="hint_description" msgid="4198202812240544553">"Descrizione evento"</string>
+    <string name="hint_attendees" msgid="6036653711383143333">"Indirizzi email"</string>
     <string name="creating_event" msgid="8237877638457604455">"Creazione evento in corso…"</string>
     <string name="saving_event" msgid="8853425146353785688">"Salvataggio evento in corso…"</string>
     <string name="loading_calendars_title" msgid="3819254313413902272">"Caricamento calendari"</string>
     <string name="edit_event_show_extra_options" msgid="2325854287823989650">"Mostra opzioni aggiuntive"</string>
     <string name="edit_event_hide_extra_options" msgid="4019082307326855513">"Nascondi opzioni aggiuntive"</string>
     <string name="description_label" msgid="7193475046717505855">"Descrizione"</string>
-    <string name="presence_label" msgid="2155381988163502023">"Presenza"</string>
+    <string name="presence_label" msgid="6169724148441175862">"Imposta il mio stato su"</string>
     <string name="privacy_label" msgid="9215031965259597335">"Privacy"</string>
     <string name="reminders_label" msgid="8345054160145333166">"Promemoria"</string>
     <string name="no_syncable_calendars" msgid="7019488867045436129">"Nessun calendario"</string>
     <string name="no_calendars_found" msgid="755379468136462058">"Non sono presenti calendari."</string>
     <string name="view_event_calendar_label" msgid="8503354404461986250">"Calendario"</string>
+    <string name="view_event_organizer_label" msgid="2168441329713325834">"Organizzatore"</string>
     <string name="view_event_timezone_label" msgid="6461351857281070935">"Fuso orario locale"</string>
     <string name="view_event_response_label" msgid="8382281658458798329">"Partecipanti?"</string>
-    <string name="agenda_today" msgid="2405333795044229594">"Oggi"</string>
+    <string name="agenda_today" msgid="6489447319363439068">"Oggi, <xliff:g id="DATE">%1$s</xliff:g>"</string>
+    <string name="loading" msgid="3772533493214331230">"Caricamento..."</string>
+    <string name="show_older_events" msgid="4031960000704544741">"Eventi visualizzati a partire da <xliff:g id="OLDEST_SEARCH_RANGE">%1$s</xliff:g>. Tocca per cercarne altri."</string>
+    <string name="show_newer_events" msgid="2647889653936094369">"Eventi visualizzati fino a <xliff:g id="NEWEST_SEARCH_RANGE">%1$s</xliff:g>. Tocca per cercarne altri."</string>
     <string name="num_events" msgid="3351672964607162257">"N. eventi"</string>
     <string name="edit_event_label" msgid="2900418236819088363">"Modifica  evento"</string>
     <string name="delete_label" msgid="874742811918030739">"Elimina"</string>
     <string name="preferences_alerts_type_dialog" msgid="2195667763429994271">"Avvisi e notifiche"</string>
     <string name="preferences_alerts_vibrate_title" msgid="7997122314759645350">"Vibrazione"</string>
     <string name="preferences_alerts_ringtone_title" msgid="7565118268120729644">"Seleziona suoneria"</string>
-    <string name="preferences_default_reminder_title" msgid="103964814265989503">"Promemoria predefinito"</string>
+    <string name="preferences_default_reminder_title" msgid="5188861433342733905">"Imposta promemoria predefinito"</string>
     <string name="preferences_default_reminder_dialog" msgid="2490348857239323412">"Imposta promemoria predefinito"</string>
     <string name="preferences_default_reminder_default" msgid="2903884416749959435">"10"</string>
 </resources>
index fb8347912b76291983d45ca0f9912a6da052167d..311278c1e5b97dd8e00309d23d5cff15c8adaa31 100644 (file)
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="app_label" msgid="5452708708398908131">"カレンダー"</string>
-    <string name="calendar_plug" msgid="8148614847911924208"><font fgcolor="#ffffffff">"Googleカレンダーにようこそ"</font>" "\n"いつでもどこでも簡単にスケジュールを管理できます。"</string>
+    <string name="calendar_plug" msgid="4861031284038774007"><font fgcolor="#ffffffff">"Googleカレンダーへようこそ!"</font>\n"スケジュールに簡単にアクセスして、より直感的、効率的に予定を管理できます。"</string>
     <string name="what_label" msgid="1933578391985810049">"タイトル"</string>
     <string name="when_label" msgid="894636567327261599">"日時"</string>
     <string name="where_label" msgid="3472482206065595118">"場所"</string>
+    <string name="attendees_label" msgid="2971281641565729725">"ゲスト"</string>
+    <string name="response_label" msgid="5732943469653254290">"<xliff:g id="RESPONSE_TYPE">%s</xliff:g>(<xliff:g id="GUEST_COUNT">%d</xliff:g>名)"</string>
     <string name="repeats_label" msgid="7414023871434593196">"繰り返し"</string>
     <string name="no_title_label" msgid="7352118984125107858">"(無題)"</string>
   <plurals name="Nminutes">
@@ -59,6 +61,7 @@
     <string name="hint_what" msgid="709155115005044531">"タイトル"</string>
     <string name="hint_where" msgid="3116239630502213241">"場所"</string>
     <string name="hint_description" msgid="4198202812240544553">"内容"</string>
+    <string name="hint_attendees" msgid="6036653711383143333">"メールアドレス"</string>
     <string name="creating_event" msgid="8237877638457604455">"予定を作成中..."</string>
     <string name="saving_event" msgid="8853425146353785688">"予定を保存中..."</string>
     <string name="loading_calendars_title" msgid="3819254313413902272">"カレンダーを読み込み中"</string>
     <string name="edit_event_show_extra_options" msgid="2325854287823989650">"詳細項目を表示する"</string>
     <string name="edit_event_hide_extra_options" msgid="4019082307326855513">"詳細項目を表示しない"</string>
     <string name="description_label" msgid="7193475046717505855">"内容"</string>
-    <string name="presence_label" msgid="2155381988163502023">"ステータス"</string>
+    <string name="presence_label" msgid="6169724148441175862">"外部向け表示"</string>
     <string name="privacy_label" msgid="9215031965259597335">"公開設定"</string>
     <string name="reminders_label" msgid="8345054160145333166">"通知"</string>
     <string name="no_syncable_calendars" msgid="7019488867045436129">"カレンダーがありません"</string>
     <string name="no_calendars_found" msgid="755379468136462058">"カレンダーがありません。"</string>
     <string name="view_event_calendar_label" msgid="8503354404461986250">"カレンダー"</string>
+    <string name="view_event_organizer_label" msgid="2168441329713325834">"主催者"</string>
     <string name="view_event_timezone_label" msgid="6461351857281070935">"ローカルタイムゾーン"</string>
     <string name="view_event_response_label" msgid="8382281658458798329">"参加しますか?"</string>
-    <string name="agenda_today" msgid="2405333795044229594">"今日"</string>
+    <string name="agenda_today" msgid="6489447319363439068">"今日: <xliff:g id="DATE">%1$s</xliff:g>"</string>
+    <string name="loading" msgid="3772533493214331230">"読み込み中..."</string>
+    <string name="show_older_events" msgid="4031960000704544741">"<xliff:g id="OLDEST_SEARCH_RANGE">%1$s</xliff:g>以降の予定を表示しています。タップするとそれ以外の予定を表示します。"</string>
+    <string name="show_newer_events" msgid="2647889653936094369">"<xliff:g id="NEWEST_SEARCH_RANGE">%1$s</xliff:g>までの予定を表示しています。タップするとそれ以外の予定を表示します。"</string>
     <string name="num_events" msgid="3351672964607162257">"予定数"</string>
     <string name="edit_event_label" msgid="2900418236819088363">"予定を編集"</string>
     <string name="delete_label" msgid="874742811918030739">"削除"</string>
     <string name="preferences_alerts_type_dialog" msgid="2195667763429994271">"通知方法"</string>
     <string name="preferences_alerts_vibrate_title" msgid="7997122314759645350">"バイブレーション"</string>
     <string name="preferences_alerts_ringtone_title" msgid="7565118268120729644">"着信音を選択"</string>
-    <string name="preferences_default_reminder_title" msgid="103964814265989503">"通知設定"</string>
+    <string name="preferences_default_reminder_title" msgid="5188861433342733905">"デフォルトの通知時間"</string>
     <string name="preferences_default_reminder_dialog" msgid="2490348857239323412">"リマインダー通知"</string>
     <string name="preferences_default_reminder_default" msgid="2903884416749959435">"10"</string>
 </resources>
index ee37c466a2d518e5e8361481006f75b5257d3457..783f5f25a65aaefb7820a42f9f6a27e17f84fc1d 100644 (file)
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="app_label" msgid="5452708708398908131">"캘린더"</string>
-    <string name="calendar_plug" msgid="8148614847911924208"><font fgcolor="#ffffffff">"Google 캘린더에 오신 것을 환영합니다."</font>" "\n" Google 캘린더는 더 간편하고 효율적이며 사용하기 쉬운 일정 관리 서비스를 제공하는 Google 서비스입니다."</string>
+    <string name="calendar_plug" msgid="4861031284038774007"><font fgcolor="#ffffffff">"Google 캘린더에 오신 것을 환영합니다."</font>" "\n"Google 캘린더는 더 간편하고 효율적이며 사용하기 쉬운 일정 관리 서비스를 제공하는 Google 서비스입니다."</string>
     <string name="what_label" msgid="1933578391985810049">"내용"</string>
     <string name="when_label" msgid="894636567327261599">"일시"</string>
     <string name="where_label" msgid="3472482206065595118">"장소"</string>
+    <string name="attendees_label" msgid="2971281641565729725">"참석자"</string>
+    <string name="response_label" msgid="5732943469653254290">"<xliff:g id="RESPONSE_TYPE">%s</xliff:g>(<xliff:g id="GUEST_COUNT">%d</xliff:g>개)"</string>
     <string name="repeats_label" msgid="7414023871434593196">"반복"</string>
     <string name="no_title_label" msgid="7352118984125107858">"(제목 없음)"</string>
   <plurals name="Nminutes">
@@ -59,6 +61,7 @@
     <string name="hint_what" msgid="709155115005044531">"일정 이름"</string>
     <string name="hint_where" msgid="3116239630502213241">"일정 장소"</string>
     <string name="hint_description" msgid="4198202812240544553">"일정 설명"</string>
+    <string name="hint_attendees" msgid="6036653711383143333">"이메일 주소"</string>
     <string name="creating_event" msgid="8237877638457604455">"일정을 만드는 중..."</string>
     <string name="saving_event" msgid="8853425146353785688">"일정 저장 중..."</string>
     <string name="loading_calendars_title" msgid="3819254313413902272">"캘린더 로드 중"</string>
     <string name="edit_event_show_extra_options" msgid="2325854287823989650">"나머지 옵션 표시"</string>
     <string name="edit_event_hide_extra_options" msgid="4019082307326855513">"나머지 옵션 숨기기"</string>
     <string name="description_label" msgid="7193475046717505855">"설명"</string>
-    <string name="presence_label" msgid="2155381988163502023">"상태"</string>
+    <string name="presence_label" msgid="6169724148441175862">"내 상태"</string>
     <string name="privacy_label" msgid="9215031965259597335">"공개여부"</string>
     <string name="reminders_label" msgid="8345054160145333166">"알림"</string>
     <string name="no_syncable_calendars" msgid="7019488867045436129">"캘린더 없음"</string>
     <string name="no_calendars_found" msgid="755379468136462058">"캘린더가 없습니다."</string>
     <string name="view_event_calendar_label" msgid="8503354404461986250">"캘린더"</string>
+    <string name="view_event_organizer_label" msgid="2168441329713325834">"주최자"</string>
     <string name="view_event_timezone_label" msgid="6461351857281070935">"현지 시간대"</string>
     <string name="view_event_response_label" msgid="8382281658458798329">"참석하시겠습니까?"</string>
-    <string name="agenda_today" msgid="2405333795044229594">"오늘"</string>
+    <string name="agenda_today" msgid="6489447319363439068">"오늘, <xliff:g id="DATE">%1$s</xliff:g>"</string>
+    <string name="loading" msgid="3772533493214331230">"로드 중..."</string>
+    <string name="show_older_events" msgid="4031960000704544741">"<xliff:g id="OLDEST_SEARCH_RANGE">%1$s</xliff:g> 이후의 일정을 표시 중입니다. 더 보려면 누르세요."</string>
+    <string name="show_newer_events" msgid="2647889653936094369">"<xliff:g id="NEWEST_SEARCH_RANGE">%1$s</xliff:g>까지의 일정을 표시 중입니다. 더 보려면 누르세요."</string>
     <string name="num_events" msgid="3351672964607162257">"일정 개수"</string>
     <string name="edit_event_label" msgid="2900418236819088363">"일정 수정"</string>
     <string name="delete_label" msgid="874742811918030739">"삭제"</string>
     <string name="delete_event_label" msgid="3738436215987360463">"일정 삭제"</string>
-    <!-- no translation found for save_label (2133599104834432589) -->
-    <skip />
-    <!-- no translation found for discard_label (4510607554910139220) -->
-    <skip />
+    <string name="save_label" msgid="2133599104834432589">"완료"</string>
+    <string name="discard_label" msgid="4510607554910139220">"되돌리기"</string>
     <string name="import_label" msgid="6993796574741477222">"가져오기"</string>
     <string name="snooze_all_label" msgid="4994488813124409077">"모든 알람 일시 중지"</string>
     <string name="dismiss_all_label" msgid="1834400025868091301">"모두 해제"</string>
     <string name="preferences_alerts_type_dialog" msgid="2195667763429994271">"알리미와 알림"</string>
     <string name="preferences_alerts_vibrate_title" msgid="7997122314759645350">"진동"</string>
     <string name="preferences_alerts_ringtone_title" msgid="7565118268120729644">"알림음 선택"</string>
-    <string name="preferences_default_reminder_title" msgid="103964814265989503">"기본 알림 설정"</string>
+    <string name="preferences_default_reminder_title" msgid="5188861433342733905">"기본 알림 시간"</string>
     <string name="preferences_default_reminder_dialog" msgid="2490348857239323412">"기본 알림 시간"</string>
     <string name="preferences_default_reminder_default" msgid="2903884416749959435">"10"</string>
 </resources>
index 60e034117e2f78e57157d89997ad49f9c6c9894b..3f099c6eaecd7774351b103a6f579f1a5d29032b 100644 (file)
@@ -89,6 +89,8 @@
     <item msgid="1341910309321756150">"Denne og framtidige hendelser"</item>
     <item msgid="6315440193748139854">"Alle hendelser"</item>
   </string-array>
-    <!-- no translation found for change_response_labels:0 (2012815396992847028) -->
-    <!-- no translation found for change_response_labels:1 (140670561403965380) -->
+  <string-array name="change_response_labels">
+    <item msgid="2012815396992847028">"Bare denne forekomsten"</item>
+    <item msgid="140670561403965380">"Alle hendelser i serien"</item>
+  </string-array>
 </resources>
index 1d45a7fa6843b5a0e3cb7ad6d73417ae1be090fd..4e5641b8dc08e7b581289d4187f7f9f15d773073 100644 (file)
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="app_label" msgid="5452708708398908131">"Kalender"</string>
-    <string name="calendar_plug" msgid="8148614847911924208"><font fgcolor="#ffffffff">"Velkommen til Google-kalenderen!"</font>" "\n"En Google-løsning for å vedlikeholde timeplanen din, bygget på ideen om at å planlegge ting skal være intuitivt, effektivt og tilgjengelig."</string>
+    <string name="calendar_plug" msgid="4861031284038774007"><font fgcolor="#ffffffff">"Velkommen til Google-kalenderen!"</font>" "\n"En Google-løsning for å vedlikeholde timeplanen din, bygget på ideen om at å planlegge ting skal være intuitivt, effektivt og tilgjengelig."</string>
     <string name="what_label" msgid="1933578391985810049">"Hva"</string>
     <string name="when_label" msgid="894636567327261599">"Når"</string>
     <string name="where_label" msgid="3472482206065595118">"Hvor"</string>
+    <string name="attendees_label" msgid="2971281641565729725">"Gjester"</string>
+    <string name="response_label" msgid="5732943469653254290">"<xliff:g id="RESPONSE_TYPE">%s</xliff:g> (<xliff:g id="GUEST_COUNT">%d</xliff:g>)"</string>
     <string name="repeats_label" msgid="7414023871434593196">"Gjentas"</string>
     <string name="no_title_label" msgid="7352118984125107858">"(Mangler emne)"</string>
   <plurals name="Nminutes">
     <string name="day_view" msgid="4467754504843584437">"Dag"</string>
     <string name="week_view" msgid="6775043022159508060">"Uke"</string>
     <string name="month_view" msgid="7287101431749285412">"Måned"</string>
-    <string name="event_view" msgid="7621353079385122317">"Vis hendelse"</string>
-    <string name="event_create" msgid="6941040556709110617">"Ny hendelse"</string>
-    <string name="event_edit" msgid="4006961928830064662">"Rediger hendelse"</string>
-    <string name="event_delete" msgid="2386667193277770442">"Slett hendelse"</string>
+    <string name="event_view" msgid="7621353079385122317">"Vis aktivitet"</string>
+    <string name="event_create" msgid="6941040556709110617">"Ny aktivitet"</string>
+    <string name="event_edit" msgid="4006961928830064662">"Rediger aktivitet"</string>
+    <string name="event_delete" msgid="2386667193277770442">"Slett aktivitet"</string>
     <string name="goto_today" msgid="9162136434410891230">"I dag"</string>
     <string name="menu_select_calendars" msgid="6610470242968973936">"Mine kalendre"</string>
     <string name="menu_preferences" msgid="9120238479503233925">"Innstillinger"</string>
     <string name="add_calendars" msgid="1013326491414656517">"Legg til kalendre"</string>
     <string name="remove_calendars" msgid="1395151808187126222">"Fjern kalendre"</string>
     <string name="event_edit_title" msgid="8487120407086532444">"Hendelsesdetaljer"</string>
-    <string name="hint_what" msgid="709155115005044531">"Navn på hendelse"</string>
+    <string name="hint_what" msgid="709155115005044531">"Navn på aktivitet"</string>
     <string name="hint_where" msgid="3116239630502213241">"Sted"</string>
-    <string name="hint_description" msgid="4198202812240544553">"Beskrivelse av hendelsen"</string>
-    <string name="creating_event" msgid="8237877638457604455">"Lager hendelse…"</string>
-    <string name="saving_event" msgid="8853425146353785688">"Lagrer hendelse…"</string>
+    <string name="hint_description" msgid="4198202812240544553">"Beskrivelse av aktivitet"</string>
+    <string name="hint_attendees" msgid="6036653711383143333">"E-postadresser"</string>
+    <string name="creating_event" msgid="8237877638457604455">"Lager aktivitet…"</string>
+    <string name="saving_event" msgid="8853425146353785688">"Lagrer aktivitet…"</string>
     <string name="loading_calendars_title" msgid="3819254313413902272">"Laster kalendre"</string>
     <string name="loading_calendars_message" msgid="8266077515011438420">"Laster kalendre…"</string>
     <string name="alert_title" msgid="7869592820853066853">"Kalendervarslinger"</string>
     <string name="alert_when_label" msgid="106946701143025116">"Hva:"</string>
     <string name="alert_where_label" msgid="4255965543493921820">"Hvor:"</string>
-    <string name="alert_missed_events_single" msgid="8042891195314876684">"(<xliff:g id="REMINDER_COUNT">%s</xliff:g> hendelse til)"</string>
-    <string name="alert_missed_events_multiple" msgid="8499734506511653919">"(<xliff:g id="REMINDER_COUNT">%s</xliff:g> hendelser til)"</string>
-    <string name="event_info_title" msgid="56024222340421620">"Vis hendelse"</string>
+    <string name="alert_missed_events_single" msgid="8042891195314876684">"(<xliff:g id="REMINDER_COUNT">%s</xliff:g> aktiviteter til)"</string>
+    <string name="alert_missed_events_multiple" msgid="8499734506511653919">"(<xliff:g id="REMINDER_COUNT">%s</xliff:g> aktiviteter til)"</string>
+    <string name="event_info_title" msgid="56024222340421620">"Vis aktivitet"</string>
     <string name="event_info_title_invite" msgid="9160326363769403865">"Møteinvitasjon"</string>
     <string name="add_new_reminder" msgid="4171314793889890481">"Legg til påminnelse"</string>
     <string name="edit_event_to_label" msgid="795012981218062421">"Til"</string>
     <string name="edit_event_show_extra_options" msgid="2325854287823989650">"Vis ekstra valg"</string>
     <string name="edit_event_hide_extra_options" msgid="4019082307326855513">"Skjul ekstra valg"</string>
     <string name="description_label" msgid="7193475046717505855">"Beskrivelse"</string>
-    <string name="presence_label" msgid="2155381988163502023">"Vis meg som"</string>
+    <string name="presence_label" msgid="6169724148441175862">"Vis meg som"</string>
     <string name="privacy_label" msgid="9215031965259597335">"Personvern"</string>
     <string name="reminders_label" msgid="8345054160145333166">"Påminnelser"</string>
     <string name="no_syncable_calendars" msgid="7019488867045436129">"Ingen kalendre"</string>
     <string name="no_calendars_found" msgid="755379468136462058">"Du har ingen kalendre."</string>
     <string name="view_event_calendar_label" msgid="8503354404461986250">"Kalender"</string>
+    <string name="view_event_organizer_label" msgid="2168441329713325834">"Arrangør"</string>
     <string name="view_event_timezone_label" msgid="6461351857281070935">"Lokal tidssone"</string>
     <string name="view_event_response_label" msgid="8382281658458798329">"Kommer du?"</string>
-    <string name="agenda_today" msgid="2405333795044229594">"I dag"</string>
-    <string name="num_events" msgid="3351672964607162257">"Ant. hendelser"</string>
-    <string name="edit_event_label" msgid="2900418236819088363">"Rediger hendelse"</string>
+    <string name="agenda_today" msgid="6489447319363439068">"I dag, <xliff:g id="DATE">%1$s</xliff:g>"</string>
+    <string name="loading" msgid="3772533493214331230">"Laster inn ..."</string>
+    <string name="show_older_events" msgid="4031960000704544741">"Viser aktiviteter siden <xliff:g id="OLDEST_SEARCH_RANGE">%1$s</xliff:g>. Trykk for å se etter flere."</string>
+    <string name="show_newer_events" msgid="2647889653936094369">"Viser aktiviteter inntil <xliff:g id="NEWEST_SEARCH_RANGE">%1$s</xliff:g>. Trykk for å se etter flere."</string>
+    <string name="num_events" msgid="3351672964607162257">"Ant. aktiviteter"</string>
+    <string name="edit_event_label" msgid="2900418236819088363">"Rediger aktivitet"</string>
     <string name="delete_label" msgid="874742811918030739">"Slett"</string>
-    <string name="delete_event_label" msgid="3738436215987360463">"Slett hendelse"</string>
-    <!-- no translation found for save_label (2133599104834432589) -->
-    <skip />
-    <!-- no translation found for discard_label (4510607554910139220) -->
-    <skip />
-    <string name="import_label" msgid="6993796574741477222">"Importer"</string>
+    <string name="delete_event_label" msgid="3738436215987360463">"Slett aktivitet"</string>
+    <string name="save_label" msgid="2133599104834432589">"OK"</string>
+    <string name="discard_label" msgid="4510607554910139220">"Tilbakestill"</string>
+    <string name="import_label" msgid="6993796574741477222">"Importér"</string>
     <string name="snooze_all_label" msgid="4994488813124409077">"Slumre alle"</string>
     <string name="dismiss_all_label" msgid="1834400025868091301">"Skjul alle"</string>
-    <string name="does_not_repeat" msgid="1877681921029738999">"Engangshendelse"</string>
+    <string name="does_not_repeat" msgid="1877681921029738999">"Engangsaktivitet"</string>
     <string name="daily" msgid="560350706808680448">"Daglig"</string>
     <string name="every_weekday" msgid="5896574838353902978">"Hverdager (man–fre)"</string>
     <string name="weekly" msgid="2006107373119027114">"Ukentlig (hver <xliff:g id="DAYS_OF_WEEK">%s</xliff:g>)"</string>
     <string name="monthly_on_day" msgid="5370155265278821156">"Hver måned (den <xliff:g id="DAY_OF_MONTH">%s</xliff:g>.)"</string>
     <string name="yearly" msgid="8576208380302949002">"Hvert år (<xliff:g id="DATES">%s</xliff:g>)"</string>
     <string name="custom" msgid="3015205670911301856">"Egendefinert… (kan ikke settes på telefonen)"</string>
-    <string name="modify_event" msgid="4501745557655992422">"Endre bare denne hendelsen."</string>
-    <string name="modify_all" msgid="7506579040966638538">"Endre alle hendelser i denne serien."</string>
-    <string name="modify_all_following" msgid="4333745734894639276">"Endre denne og alle framtidige hendelser."</string>
-    <string name="delete_this_event_title" msgid="8738491083082780492">"Denne hendelsen vil bli slettet."</string>
+    <string name="modify_event" msgid="4501745557655992422">"Endre bare denne aktiviteten."</string>
+    <string name="modify_all" msgid="7506579040966638538">"Endre alle aktiviteter i denne serien."</string>
+    <string name="modify_all_following" msgid="4333745734894639276">"Endre denne og alle framtidige aktiviteter."</string>
+    <string name="delete_this_event_title" msgid="8738491083082780492">"Denne aktiviteten vil bli slettet."</string>
     <string name="delete_title" msgid="5143743507524995383">"Slett"</string>
     <string name="change_response_title" msgid="7704714776070974984">"Endre svar"</string>
     <string name="preferences_title" msgid="8045855493262131773">"Innstillinger"</string>
     <string name="preferences_general_title" msgid="2069075513760573117">"Kalender visningsinnstilling"</string>
     <string name="preferences_alerts_title" msgid="6511227171114210908">"Innstillinger for påminnelser"</string>
-    <string name="preferences_hide_declined_title" msgid="1849295943669890034">"Skjul avslåtte hendelser"</string>
+    <string name="preferences_hide_declined_title" msgid="1849295943669890034">"Skjul avslåtte aktiviteter"</string>
     <string name="preferences_alerts_type_title" msgid="6934441966757833908">"Sett varsling og påminnelser"</string>
     <string name="preferences_alerts_type_dialog" msgid="2195667763429994271">"Varsling og påminnelser"</string>
     <string name="preferences_alerts_vibrate_title" msgid="7997122314759645350">"Vibrer"</string>
     <string name="preferences_alerts_ringtone_title" msgid="7565118268120729644">"Velg ringetone"</string>
-    <string name="preferences_default_reminder_title" msgid="103964814265989503">"Sett standard påminnelse"</string>
+    <string name="preferences_default_reminder_title" msgid="5188861433342733905">"Sett standard påminnelse"</string>
     <string name="preferences_default_reminder_dialog" msgid="2490348857239323412">"Standard påminnelsestid"</string>
     <string name="preferences_default_reminder_default" msgid="2903884416749959435">"10"</string>
 </resources>
index cea5a51cf0a6491de9b5668a7f5498ba2a5f3eb5..f482e1db850d9d008517102400045379152a699a 100644 (file)
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="app_label" msgid="5452708708398908131">"Agenda"</string>
-    <string name="calendar_plug" msgid="8148614847911924208"><font fgcolor="#ffffffff">"Welkom bij Google Agenda!"</font>" "\n" Een Google-benadering om uw planning te beheren, gebaseerd op het idee dat het plannen van afspraken intuïtiever, efficiënter en toegankelijker kan."</string>
+    <string name="calendar_plug" msgid="4861031284038774007"><font fgcolor="#ffffffff">"Welkom bij Google Agenda!"</font>" "\n"Een Google-benadering om uw planning te beheren, gebaseerd op het idee dat het plannen van afspraken intuïtiever, efficiënter en toegankelijker kan."</string>
     <string name="what_label" msgid="1933578391985810049">"Wat"</string>
     <string name="when_label" msgid="894636567327261599">"Wanneer"</string>
     <string name="where_label" msgid="3472482206065595118">"Waar"</string>
+    <string name="attendees_label" msgid="2971281641565729725">"Gasten"</string>
+    <string name="response_label" msgid="5732943469653254290">"<xliff:g id="RESPONSE_TYPE">%s</xliff:g> (<xliff:g id="GUEST_COUNT">%d</xliff:g>)"</string>
     <string name="repeats_label" msgid="7414023871434593196">"Herhaling"</string>
     <string name="no_title_label" msgid="7352118984125107858">"(Geen onderwerp)"</string>
   <plurals name="Nminutes">
@@ -59,6 +61,7 @@
     <string name="hint_what" msgid="709155115005044531">"Afspraaknaam"</string>
     <string name="hint_where" msgid="3116239630502213241">"Locatie van de afspraak"</string>
     <string name="hint_description" msgid="4198202812240544553">"Beschrijving van afspraak"</string>
+    <string name="hint_attendees" msgid="6036653711383143333">"E-mailadressen"</string>
     <string name="creating_event" msgid="8237877638457604455">"Afspraak wordt gemaakt…"</string>
     <string name="saving_event" msgid="8853425146353785688">"Afspraak wordt opgeslagen..."</string>
     <string name="loading_calendars_title" msgid="3819254313413902272">"Agenda\'s worden geladen"</string>
     <string name="edit_event_show_extra_options" msgid="2325854287823989650">"Extra opties weergeven"</string>
     <string name="edit_event_hide_extra_options" msgid="4019082307326855513">"Extra opties verbergen"</string>
     <string name="description_label" msgid="7193475046717505855">"Beschrijving"</string>
-    <string name="presence_label" msgid="2155381988163502023">"Beschikbaarheid"</string>
+    <string name="presence_label" msgid="6169724148441175862">"Mij weergeven als"</string>
     <string name="privacy_label" msgid="9215031965259597335">"Privacy"</string>
     <string name="reminders_label" msgid="8345054160145333166">"Herinneringen"</string>
     <string name="no_syncable_calendars" msgid="7019488867045436129">"Geen agenda\'s"</string>
     <string name="no_calendars_found" msgid="755379468136462058">"U heeft geen agenda\'s."</string>
     <string name="view_event_calendar_label" msgid="8503354404461986250">"Agenda"</string>
+    <string name="view_event_organizer_label" msgid="2168441329713325834">"Organisator"</string>
     <string name="view_event_timezone_label" msgid="6461351857281070935">"Lokale tijdzone"</string>
     <string name="view_event_response_label" msgid="8382281658458798329">"Aanwezig?"</string>
-    <string name="agenda_today" msgid="2405333795044229594">"Vandaag"</string>
+    <string name="agenda_today" msgid="6489447319363439068">"Vandaag, <xliff:g id="DATE">%1$s</xliff:g>"</string>
+    <string name="loading" msgid="3772533493214331230">"Laden..."</string>
+    <string name="show_older_events" msgid="4031960000704544741">"Afspraken weergeven sinds <xliff:g id="OLDEST_SEARCH_RANGE">%1$s</xliff:g>. Tik om er meer te zoeken."</string>
+    <string name="show_newer_events" msgid="2647889653936094369">"Afspraken weergeven tot <xliff:g id="NEWEST_SEARCH_RANGE">%1$s</xliff:g>. Tik om er meer te zoeken."</string>
     <string name="num_events" msgid="3351672964607162257">"Aantal afspraken"</string>
     <string name="edit_event_label" msgid="2900418236819088363">"Afspraak bewerken"</string>
     <string name="delete_label" msgid="874742811918030739">"Verwijderen"</string>
     <string name="preferences_alerts_type_dialog" msgid="2195667763429994271">"Meldingen en berichten"</string>
     <string name="preferences_alerts_vibrate_title" msgid="7997122314759645350">"Trillen"</string>
     <string name="preferences_alerts_ringtone_title" msgid="7565118268120729644">"Beltoon selecteren"</string>
-    <string name="preferences_default_reminder_title" msgid="103964814265989503">"Standaardherinnering instellen"</string>
+    <string name="preferences_default_reminder_title" msgid="5188861433342733905">"Standaard herinneringstijd"</string>
     <string name="preferences_default_reminder_dialog" msgid="2490348857239323412">"Standaard herinneringstijd"</string>
     <string name="preferences_default_reminder_default" msgid="2903884416749959435">"10"</string>
 </resources>
index 9f8904941bd3178d4b707b77e02cca5ecd02cccb..49f844e88e533fd8278170f9efe8e5fb125964d6 100644 (file)
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="app_label" msgid="5452708708398908131">"Kalendarz"</string>
-    <string name="calendar_plug" msgid="8148614847911924208"><font fgcolor="#ffffffff">"Witamy w Kalendarzu Google!"</font>" "\n"Intuicyjne, wydajne i dostępne planowanie wydarzeń w celu zarządzania terminami według Google."</string>
+    <string name="calendar_plug" msgid="4861031284038774007"><font fgcolor="#ffffffff">"Witamy w Kalendarzu Google!"</font>" "\n"Zarządzanie harmonogramem w stylu Google, dzięki któremu planowanie wydarzeń jest intuicyjne, wydajne i wygodne."</string>
     <string name="what_label" msgid="1933578391985810049">"Co"</string>
     <string name="when_label" msgid="894636567327261599">"Kiedy"</string>
     <string name="where_label" msgid="3472482206065595118">"Gdzie"</string>
+    <string name="attendees_label" msgid="2971281641565729725">"Goście"</string>
+    <string name="response_label" msgid="5732943469653254290">"<xliff:g id="RESPONSE_TYPE">%s</xliff:g> (<xliff:g id="GUEST_COUNT">%d</xliff:g>)"</string>
     <string name="repeats_label" msgid="7414023871434593196">"Powtórzenie"</string>
     <string name="no_title_label" msgid="7352118984125107858">"(Brak tematu)"</string>
   <plurals name="Nminutes">
@@ -59,6 +61,7 @@
     <string name="hint_what" msgid="709155115005044531">"Nazwa wydarzenia"</string>
     <string name="hint_where" msgid="3116239630502213241">"Lokalizacja wydarzenia"</string>
     <string name="hint_description" msgid="4198202812240544553">"Opis wydarzenia"</string>
+    <string name="hint_attendees" msgid="6036653711383143333">"Adresy e-mail"</string>
     <string name="creating_event" msgid="8237877638457604455">"Tworzenie wydarzenia..."</string>
     <string name="saving_event" msgid="8853425146353785688">"Zapisywanie wydarzenia..."</string>
     <string name="loading_calendars_title" msgid="3819254313413902272">"Ładowanie kalendarzy"</string>
     <string name="edit_event_show_extra_options" msgid="2325854287823989650">"Pokaż dodatkowe opcje"</string>
     <string name="edit_event_hide_extra_options" msgid="4019082307326855513">"Ukryj dodatkowe opcje"</string>
     <string name="description_label" msgid="7193475046717505855">"Opis"</string>
-    <string name="presence_label" msgid="2155381988163502023">"Obecność"</string>
+    <string name="presence_label" msgid="6169724148441175862">"Pokaż mój stan jako"</string>
     <string name="privacy_label" msgid="9215031965259597335">"Prywatność"</string>
     <string name="reminders_label" msgid="8345054160145333166">"Przypomnienia"</string>
     <string name="no_syncable_calendars" msgid="7019488867045436129">"Brak kalendarzy"</string>
     <string name="no_calendars_found" msgid="755379468136462058">"Nie masz kalendarzy."</string>
     <string name="view_event_calendar_label" msgid="8503354404461986250">"Kalendarz"</string>
+    <string name="view_event_organizer_label" msgid="2168441329713325834">"Organizator"</string>
     <string name="view_event_timezone_label" msgid="6461351857281070935">"Lokalna strefa czasowa"</string>
     <string name="view_event_response_label" msgid="8382281658458798329">"Uczestnictwo"</string>
-    <string name="agenda_today" msgid="2405333795044229594">"Dzisiaj"</string>
+    <string name="agenda_today" msgid="6489447319363439068">"Dzisiaj, <xliff:g id="DATE">%1$s</xliff:g>"</string>
+    <string name="loading" msgid="3772533493214331230">"Trwa wczytywanie..."</string>
+    <string name="show_older_events" msgid="4031960000704544741">"Pokazywanie wydarzeń od dnia <xliff:g id="OLDEST_SEARCH_RANGE">%1$s</xliff:g>. Dotknij, aby wyszukać więcej."</string>
+    <string name="show_newer_events" msgid="2647889653936094369">"Pokazywanie wydarzeń do dnia <xliff:g id="NEWEST_SEARCH_RANGE">%1$s</xliff:g>. Dotknij, aby wyszukać więcej."</string>
     <string name="num_events" msgid="3351672964607162257">"Liczba wydarzeń"</string>
     <string name="edit_event_label" msgid="2900418236819088363">"Edytuj wydarzenie"</string>
     <string name="delete_label" msgid="874742811918030739">"Usuń"</string>
     <string name="preferences_alerts_type_dialog" msgid="2195667763429994271">"Alerty i powiadomienia"</string>
     <string name="preferences_alerts_vibrate_title" msgid="7997122314759645350">"Wibracje"</string>
     <string name="preferences_alerts_ringtone_title" msgid="7565118268120729644">"Wybierz dzwonek"</string>
-    <string name="preferences_default_reminder_title" msgid="103964814265989503">"Domyślne przypomnienie"</string>
+    <string name="preferences_default_reminder_title" msgid="5188861433342733905">"Domyślna godzina przypomnienia"</string>
     <string name="preferences_default_reminder_dialog" msgid="2490348857239323412">"Domyślne przypomnienie"</string>
     <string name="preferences_default_reminder_default" msgid="2903884416749959435">"10"</string>
 </resources>
index 87152c512c365e3e837346551fd87ca928b12f95..05d3e24a1f40e8faddfe325bd17202a254be7f58 100644 (file)
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="app_label" msgid="5452708708398908131">"Calendário"</string>
-    <string name="calendar_plug" msgid="8148614847911924208"><font fgcolor="#ffffffff">"Bem-vindo ao Calendário do Google!"</font>" "\n"Uma abordagem da Google para gerir a sua agenda, baseada na ideia de que agendar eventos pode ser mais intuitivo, eficiente e acessível."</string>
+    <string name="calendar_plug" msgid="4861031284038774007"><font fgcolor="#ffffffff">"Bem-vindo ao Calendário Google!"</font>" "\n"Uma abordagem da Google para gerir a sua agenda, com base na ideia de que agendar eventos pode ser mais intuitivo, eficiente e acessível."</string>
     <string name="what_label" msgid="1933578391985810049">"O quê"</string>
     <string name="when_label" msgid="894636567327261599">"Quando"</string>
     <string name="where_label" msgid="3472482206065595118">"Onde"</string>
+    <string name="attendees_label" msgid="2971281641565729725">"Convidados"</string>
+    <string name="response_label" msgid="5732943469653254290">"<xliff:g id="RESPONSE_TYPE">%s</xliff:g> (<xliff:g id="GUEST_COUNT">%d</xliff:g>)"</string>
     <string name="repeats_label" msgid="7414023871434593196">"Repetição"</string>
     <string name="no_title_label" msgid="7352118984125107858">"(Sem assunto)"</string>
   <plurals name="Nminutes">
@@ -59,6 +61,7 @@
     <string name="hint_what" msgid="709155115005044531">"Nome do evento"</string>
     <string name="hint_where" msgid="3116239630502213241">"Localização do evento"</string>
     <string name="hint_description" msgid="4198202812240544553">"Descrição do evento"</string>
+    <string name="hint_attendees" msgid="6036653711383143333">"Endereços de e-mail"</string>
     <string name="creating_event" msgid="8237877638457604455">"A criar evento..."</string>
     <string name="saving_event" msgid="8853425146353785688">"A guardar evento..."</string>
     <string name="loading_calendars_title" msgid="3819254313413902272">"A carregar calendários"</string>
     <string name="edit_event_show_extra_options" msgid="2325854287823989650">"Mostrar opções extra"</string>
     <string name="edit_event_hide_extra_options" msgid="4019082307326855513">"Ocultar opções extra"</string>
     <string name="description_label" msgid="7193475046717505855">"Descrição"</string>
-    <string name="presence_label" msgid="2155381988163502023">"Presença"</string>
+    <string name="presence_label" msgid="6169724148441175862">"Mostrar-me como"</string>
     <string name="privacy_label" msgid="9215031965259597335">"Privacidade"</string>
     <string name="reminders_label" msgid="8345054160145333166">"Lembretes"</string>
     <string name="no_syncable_calendars" msgid="7019488867045436129">"Sem calendários"</string>
     <string name="no_calendars_found" msgid="755379468136462058">"Não tem calendários."</string>
     <string name="view_event_calendar_label" msgid="8503354404461986250">"Calendário"</string>
+    <string name="view_event_organizer_label" msgid="2168441329713325834">"Organizador"</string>
     <string name="view_event_timezone_label" msgid="6461351857281070935">"Fuso horário local"</string>
     <string name="view_event_response_label" msgid="8382281658458798329">"Assistir?"</string>
-    <string name="agenda_today" msgid="2405333795044229594">"Hoje"</string>
+    <string name="agenda_today" msgid="6489447319363439068">"Hoje, <xliff:g id="DATE">%1$s</xliff:g>"</string>
+    <string name="loading" msgid="3772533493214331230">"A carregar..."</string>
+    <string name="show_older_events" msgid="4031960000704544741">"A mostrar eventos desde <xliff:g id="OLDEST_SEARCH_RANGE">%1$s</xliff:g>. Toque para procurar mais."</string>
+    <string name="show_newer_events" msgid="2647889653936094369">"A mostrar eventos até <xliff:g id="NEWEST_SEARCH_RANGE">%1$s</xliff:g>. Toque para procurar mais."</string>
     <string name="num_events" msgid="3351672964607162257">"N.º de eventos"</string>
     <string name="edit_event_label" msgid="2900418236819088363">"Editar evento"</string>
     <string name="delete_label" msgid="874742811918030739">"Eliminar"</string>
     <string name="delete_event_label" msgid="3738436215987360463">"Eliminar evento"</string>
-    <!-- no translation found for save_label (2133599104834432589) -->
-    <skip />
-    <!-- no translation found for discard_label (4510607554910139220) -->
-    <skip />
+    <string name="save_label" msgid="2133599104834432589">"Concluído"</string>
+    <string name="discard_label" msgid="4510607554910139220">"Reverter"</string>
     <string name="import_label" msgid="6993796574741477222">"Importar"</string>
     <string name="snooze_all_label" msgid="4994488813124409077">"Suspender todos"</string>
     <string name="dismiss_all_label" msgid="1834400025868091301">"Cancelar tudo"</string>
     <string name="preferences_alerts_type_dialog" msgid="2195667763429994271">"Alertas e notificações"</string>
     <string name="preferences_alerts_vibrate_title" msgid="7997122314759645350">"Vibrar"</string>
     <string name="preferences_alerts_ringtone_title" msgid="7565118268120729644">"Seleccionar toque"</string>
-    <string name="preferences_default_reminder_title" msgid="103964814265989503">"Definir lembrete predefinido"</string>
+    <string name="preferences_default_reminder_title" msgid="5188861433342733905">"Hora predefinida do lembrete"</string>
     <string name="preferences_default_reminder_dialog" msgid="2490348857239323412">"Hora predefinida do lembrete"</string>
     <string name="preferences_default_reminder_default" msgid="2903884416749959435">"10"</string>
 </resources>
diff --git a/res/drawable-mdpi/ic_contact_picture.png b/res/drawable-mdpi/ic_contact_picture.png
index de42eb369160bb304e7b8b808aa91c6d76024738..362c6422ac36cc994e4ac7f3855a85e639960b60 100644 (file)
--- a/res/drawable-mdpi/ic_contact_picture.png
@@ -90,7 +90,7 @@
     <item msgid="6315440193748139854">"Todos os eventos"</item>
   </string-array>
   <string-array name="change_response_labels">
-    <item msgid="2012815396992847028">"Somente nessa ocasião"</item>
+    <item msgid="2012815396992847028">"Somente este evento"</item>
     <item msgid="140670561403965380">"Todos os eventos da série"</item>
   </string-array>
 </resources>
index e53475081a6b3f55d41c7f0b1f6115cf6cd93a13..4e5430b09f9afe9934cf7d0b0112478651e0fbb4 100644 (file)
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="app_label" msgid="5452708708398908131">"Agenda"</string>
-    <string name="calendar_plug" msgid="8148614847911924208"><font fgcolor="#ffffffff">"Bem-vindo ao Google Agenda!"</font>" "\n" Uma abordagem do Google para organizar seus horários baseada na idéia de que eventos programados podem ser mais intuitivos, eficientes e acessíveis."</string>
+    <string name="calendar_plug" msgid="4861031284038774007"><font fgcolor="#ffffffff">"Bem-vindo ao Google Agenda!"</font>" "\n" Uma abordagem do Google para organizar seus horários com base na ideia de que programar eventos pode ser mais intuitivo, eficiente e acessível."</string>
     <string name="what_label" msgid="1933578391985810049">"O que"</string>
     <string name="when_label" msgid="894636567327261599">"Quando"</string>
     <string name="where_label" msgid="3472482206065595118">"Onde"</string>
+    <string name="attendees_label" msgid="2971281641565729725">"Convidados"</string>
+    <string name="response_label" msgid="5732943469653254290">"<xliff:g id="RESPONSE_TYPE">%s</xliff:g> (<xliff:g id="GUEST_COUNT">%d</xliff:g>)"</string>
     <string name="repeats_label" msgid="7414023871434593196">"Repetições"</string>
     <string name="no_title_label" msgid="7352118984125107858">"(Sem título)"</string>
   <plurals name="Nminutes">
@@ -59,6 +61,7 @@
     <string name="hint_what" msgid="709155115005044531">"Nome do evento"</string>
     <string name="hint_where" msgid="3116239630502213241">"Local do evento"</string>
     <string name="hint_description" msgid="4198202812240544553">"Descrição do evento"</string>
+    <string name="hint_attendees" msgid="6036653711383143333">"Endereços de e-mail"</string>
     <string name="creating_event" msgid="8237877638457604455">"Criando um evento…"</string>
     <string name="saving_event" msgid="8853425146353785688">"Salvando evento…"</string>
     <string name="loading_calendars_title" msgid="3819254313413902272">"Carregando as agendas"</string>
     <string name="edit_event_show_extra_options" msgid="2325854287823989650">"Mostrar opções extras"</string>
     <string name="edit_event_hide_extra_options" msgid="4019082307326855513">"Ocultar opções extras"</string>
     <string name="description_label" msgid="7193475046717505855">"Descrição"</string>
-    <string name="presence_label" msgid="2155381988163502023">"Presença"</string>
+    <string name="presence_label" msgid="6169724148441175862">"Mostrar-me como"</string>
     <string name="privacy_label" msgid="9215031965259597335">"Privacidade"</string>
     <string name="reminders_label" msgid="8345054160145333166">"Lembretes"</string>
     <string name="no_syncable_calendars" msgid="7019488867045436129">"Nenhuma agenda disponível"</string>
     <string name="no_calendars_found" msgid="755379468136462058">"Você não tem nenhuma agenda."</string>
     <string name="view_event_calendar_label" msgid="8503354404461986250">"Agenda"</string>
+    <string name="view_event_organizer_label" msgid="2168441329713325834">"Organizador"</string>
     <string name="view_event_timezone_label" msgid="6461351857281070935">"Localizar fuso horário"</string>
     <string name="view_event_response_label" msgid="8382281658458798329">"Você participará?"</string>
-    <string name="agenda_today" msgid="2405333795044229594">"Hoje"</string>
+    <string name="agenda_today" msgid="6489447319363439068">"Hoje, <xliff:g id="DATE">%1$s</xliff:g>"</string>
+    <string name="loading" msgid="3772533493214331230">"Carregando..."</string>
+    <string name="show_older_events" msgid="4031960000704544741">"Mostrando eventos desde <xliff:g id="OLDEST_SEARCH_RANGE">%1$s</xliff:g>. Toque para procurar mais."</string>
+    <string name="show_newer_events" msgid="2647889653936094369">"Mostrando eventos até <xliff:g id="NEWEST_SEARCH_RANGE">%1$s</xliff:g>. Toque para procurar mais."</string>
     <string name="num_events" msgid="3351672964607162257">"Núm. eventos"</string>
     <string name="edit_event_label" msgid="2900418236819088363">"Editar evento"</string>
     <string name="delete_label" msgid="874742811918030739">"Excluir"</string>
     <string name="delete_event_label" msgid="3738436215987360463">"Excluir evento"</string>
-    <!-- no translation found for save_label (2133599104834432589) -->
-    <skip />
-    <!-- no translation found for discard_label (4510607554910139220) -->
-    <skip />
+    <string name="save_label" msgid="2133599104834432589">"Concluído"</string>
+    <string name="discard_label" msgid="4510607554910139220">"Reverter"</string>
     <string name="import_label" msgid="6993796574741477222">"Importar"</string>
     <string name="snooze_all_label" msgid="4994488813124409077">"Colocar todos em modo de espera"</string>
     <string name="dismiss_all_label" msgid="1834400025868091301">"Encerrar tudo"</string>
     <string name="preferences_title" msgid="8045855493262131773">"Configurações"</string>
     <string name="preferences_general_title" msgid="2069075513760573117">"Configuração de visualização da agenda"</string>
     <string name="preferences_alerts_title" msgid="6511227171114210908">"Configurações dos lembretes"</string>
-    <string name="preferences_hide_declined_title" msgid="1849295943669890034">"Ocultar eventos recusados"</string>
+    <string name="preferences_hide_declined_title" msgid="1849295943669890034">"Ocultar recusados"</string>
     <string name="preferences_alerts_type_title" msgid="6934441966757833908">"Definir alertas e notificações"</string>
     <string name="preferences_alerts_type_dialog" msgid="2195667763429994271">"Alertas e notificações"</string>
     <string name="preferences_alerts_vibrate_title" msgid="7997122314759645350">"Vibrar"</string>
     <string name="preferences_alerts_ringtone_title" msgid="7565118268120729644">"Selecionar toque"</string>
-    <string name="preferences_default_reminder_title" msgid="103964814265989503">"Definir lembrete padrão"</string>
+    <string name="preferences_default_reminder_title" msgid="5188861433342733905">"Tempo padrão do lembrete"</string>
     <string name="preferences_default_reminder_dialog" msgid="2490348857239323412">"Momento padrão do lembrete"</string>
     <string name="preferences_default_reminder_default" msgid="2903884416749959435">"10"</string>
 </resources>
index 4e4f19774be30a7bd56da1d49496f21df6879551..9eaaf3b962bd7c2e6649fd48cb2936584dcda5fc 100644 (file)
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="app_label" msgid="5452708708398908131">"Календарь"</string>
-    <string name="calendar_plug" msgid="8148614847911924208"><font fgcolor="#ffffffff">"Добро пожаловать в Календарь Google!"</font>" "\n"Подход Google к управлению расписанием основан на принципах интуитивности, эффективности и доступности."</string>
+    <string name="calendar_plug" msgid="4861031284038774007"><font fgcolor="#ffffffff">"Добро пожаловать в Календарь Google!"</font>" "\n"Подход Google к управлению расписанием основан на принципах интуитивности, эффективности и доступности."</string>
     <string name="what_label" msgid="1933578391985810049">"Что"</string>
     <string name="when_label" msgid="894636567327261599">"Когда"</string>
     <string name="where_label" msgid="3472482206065595118">"Где"</string>
+    <string name="attendees_label" msgid="2971281641565729725">"Гости"</string>
+    <string name="response_label" msgid="5732943469653254290">"<xliff:g id="RESPONSE_TYPE">%s</xliff:g> (<xliff:g id="GUEST_COUNT">%d</xliff:g>)"</string>
     <string name="repeats_label" msgid="7414023871434593196">"Повторять"</string>
     <string name="no_title_label" msgid="7352118984125107858">"(Без темы)"</string>
   <plurals name="Nminutes">
@@ -59,6 +61,7 @@
     <string name="hint_what" msgid="709155115005044531">"Название мероприятия"</string>
     <string name="hint_where" msgid="3116239630502213241">"Место мероприятия"</string>
     <string name="hint_description" msgid="4198202812240544553">"Описание мероприятия"</string>
+    <string name="hint_attendees" msgid="6036653711383143333">"Адреса электронной почты"</string>
     <string name="creating_event" msgid="8237877638457604455">"Создание мероприятия…"</string>
     <string name="saving_event" msgid="8853425146353785688">"Сохранение мероприятия…"</string>
     <string name="loading_calendars_title" msgid="3819254313413902272">"Загрузка календарей"</string>
     <string name="edit_event_show_extra_options" msgid="2325854287823989650">"Показать дополнительные параметры"</string>
     <string name="edit_event_hide_extra_options" msgid="4019082307326855513">"Скрыть дополнительные параметры"</string>
     <string name="description_label" msgid="7193475046717505855">"Описание"</string>
-    <string name="presence_label" msgid="2155381988163502023">"Присутствие"</string>
+    <string name="presence_label" msgid="6169724148441175862">"Мой статус:"</string>
     <string name="privacy_label" msgid="9215031965259597335">"Конфиденциальность"</string>
     <string name="reminders_label" msgid="8345054160145333166">"Напоминания"</string>
     <string name="no_syncable_calendars" msgid="7019488867045436129">"Нет календарей"</string>
     <string name="no_calendars_found" msgid="755379468136462058">"У вас нет календарей."</string>
     <string name="view_event_calendar_label" msgid="8503354404461986250">"Календарь"</string>
+    <string name="view_event_organizer_label" msgid="2168441329713325834">"Организатор"</string>
     <string name="view_event_timezone_label" msgid="6461351857281070935">"Часовой пояс"</string>
     <string name="view_event_response_label" msgid="8382281658458798329">"Принять приглашение?"</string>
-    <string name="agenda_today" msgid="2405333795044229594">"Сегодня"</string>
+    <string name="agenda_today" msgid="6489447319363439068">"Сегодня, <xliff:g id="DATE">%1$s</xliff:g>"</string>
+    <string name="loading" msgid="3772533493214331230">"Загрузка…"</string>
+    <string name="show_older_events" msgid="4031960000704544741">"Мероприятия с <xliff:g id="OLDEST_SEARCH_RANGE">%1$s</xliff:g>. Нажмите для поиска других мероприятий."</string>
+    <string name="show_newer_events" msgid="2647889653936094369">"Мероприятия до <xliff:g id="NEWEST_SEARCH_RANGE">%1$s</xliff:g>. Нажмите для поиска других мероприятий."</string>
     <string name="num_events" msgid="3351672964607162257">"Кол-во мероприятий"</string>
     <string name="edit_event_label" msgid="2900418236819088363">"Изменить мероприятие"</string>
     <string name="delete_label" msgid="874742811918030739">"Удалить"</string>
     <string name="delete_event_label" msgid="3738436215987360463">"Удалить мероприятие"</string>
-    <!-- no translation found for save_label (2133599104834432589) -->
-    <skip />
-    <!-- no translation found for discard_label (4510607554910139220) -->
-    <skip />
+    <string name="save_label" msgid="2133599104834432589">"Готово"</string>
+    <string name="discard_label" msgid="4510607554910139220">"Отменить изменения"</string>
     <string name="import_label" msgid="6993796574741477222">"Импорт"</string>
     <string name="snooze_all_label" msgid="4994488813124409077">"Отложить все"</string>
     <string name="dismiss_all_label" msgid="1834400025868091301">"Отключить все"</string>
     <string name="preferences_alerts_type_dialog" msgid="2195667763429994271">"Оповещения и уведомления"</string>
     <string name="preferences_alerts_vibrate_title" msgid="7997122314759645350">"Вибрация"</string>
     <string name="preferences_alerts_ringtone_title" msgid="7565118268120729644">"Выбрать мелодию"</string>
-    <string name="preferences_default_reminder_title" msgid="103964814265989503">"Время напоминания по умолчанию"</string>
+    <string name="preferences_default_reminder_title" msgid="5188861433342733905">"Время напоминания по умолчанию"</string>
     <string name="preferences_default_reminder_dialog" msgid="2490348857239323412">"Время напоминания по умолчанию"</string>
     <string name="preferences_default_reminder_default" msgid="2903884416749959435">"10"</string>
 </resources>
index bf726b0b192c6341adafa817ca27d6c3660cde4c..ee9e563d87099b5e4c12ae601051daf3609a460b 100644 (file)
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="app_label" msgid="5452708708398908131">"Kalender"</string>
-    <string name="calendar_plug" msgid="8148614847911924208"><font fgcolor="#ffffffff">"Välkommen till Google Kalender!"</font>" "\n"Med Googles verktyg för schemaläggning sköter du planeringen på ett enkelt, effektivt och lättillgängligt sätt."</string>
+    <string name="calendar_plug" msgid="4861031284038774007"><font fgcolor="#ffffffff">"Välkommen till Google Kalender!"</font>" "\n"Med Googles verktyg för schemaläggning sköter du planeringen på ett enkelt, effektivt och lättillgängligt sätt."</string>
     <string name="what_label" msgid="1933578391985810049">"Vad"</string>
     <string name="when_label" msgid="894636567327261599">"När"</string>
     <string name="where_label" msgid="3472482206065595118">"Var"</string>
+    <string name="attendees_label" msgid="2971281641565729725">"Gäster"</string>
+    <string name="response_label" msgid="5732943469653254290">"<xliff:g id="RESPONSE_TYPE">%s</xliff:g> (<xliff:g id="GUEST_COUNT">%d</xliff:g>)"</string>
     <string name="repeats_label" msgid="7414023871434593196">"Upprepning"</string>
     <string name="no_title_label" msgid="7352118984125107858">"(Inget ämne)"</string>
   <plurals name="Nminutes">
@@ -59,6 +61,7 @@
     <string name="hint_what" msgid="709155115005044531">"Händelsens namn"</string>
     <string name="hint_where" msgid="3116239630502213241">"Plats för händelsen"</string>
     <string name="hint_description" msgid="4198202812240544553">"Beskrivning av händelse"</string>
+    <string name="hint_attendees" msgid="6036653711383143333">"E-postadresser"</string>
     <string name="creating_event" msgid="8237877638457604455">"Skapar händelse…"</string>
     <string name="saving_event" msgid="8853425146353785688">"Sparar händelse…"</string>
     <string name="loading_calendars_title" msgid="3819254313413902272">"Läser in kalendrar"</string>
     <string name="edit_event_show_extra_options" msgid="2325854287823989650">"Visa fler alternativ"</string>
     <string name="edit_event_hide_extra_options" msgid="4019082307326855513">"Dölj fler alternativ"</string>
     <string name="description_label" msgid="7193475046717505855">"Beskrivning"</string>
-    <string name="presence_label" msgid="2155381988163502023">"Närvaro"</string>
+    <string name="presence_label" msgid="6169724148441175862">"Visa mig som"</string>
     <string name="privacy_label" msgid="9215031965259597335">"Sekretess"</string>
     <string name="reminders_label" msgid="8345054160145333166">"Påminnelser"</string>
     <string name="no_syncable_calendars" msgid="7019488867045436129">"Inga kalendrar"</string>
     <string name="no_calendars_found" msgid="755379468136462058">"Du har inga kalendrar."</string>
     <string name="view_event_calendar_label" msgid="8503354404461986250">"Kalender"</string>
+    <string name="view_event_organizer_label" msgid="2168441329713325834">"Organisatör"</string>
     <string name="view_event_timezone_label" msgid="6461351857281070935">"Lokal tidszon"</string>
     <string name="view_event_response_label" msgid="8382281658458798329">"Delta?"</string>
-    <string name="agenda_today" msgid="2405333795044229594">"Idag"</string>
+    <string name="agenda_today" msgid="6489447319363439068">"Idag, <xliff:g id="DATE">%1$s</xliff:g>"</string>
+    <string name="loading" msgid="3772533493214331230">"Hämtar…"</string>
+    <string name="show_older_events" msgid="4031960000704544741">"Visar händelser sedan <xliff:g id="OLDEST_SEARCH_RANGE">%1$s</xliff:g>. Peka om du vill visa fler."</string>
+    <string name="show_newer_events" msgid="2647889653936094369">"Visar händelser fram till <xliff:g id="NEWEST_SEARCH_RANGE">%1$s</xliff:g>. Peka om du vill visa fler."</string>
     <string name="num_events" msgid="3351672964607162257">"Antal händelser"</string>
     <string name="edit_event_label" msgid="2900418236819088363">"Redigera händelse"</string>
     <string name="delete_label" msgid="874742811918030739">"Ta bort"</string>
     <string name="delete_event_label" msgid="3738436215987360463">"Ta bort händelse"</string>
-    <!-- no translation found for save_label (2133599104834432589) -->
-    <skip />
-    <!-- no translation found for discard_label (4510607554910139220) -->
-    <skip />
+    <string name="save_label" msgid="2133599104834432589">"Färdig"</string>
+    <string name="discard_label" msgid="4510607554910139220">"Återgå"</string>
     <string name="import_label" msgid="6993796574741477222">"Importera"</string>
     <string name="snooze_all_label" msgid="4994488813124409077">"Sätt alla på snooze"</string>
     <string name="dismiss_all_label" msgid="1834400025868091301">"Ta bort alla permanent"</string>
     <string name="preferences_alerts_type_dialog" msgid="2195667763429994271">"Varningar och aviseringar"</string>
     <string name="preferences_alerts_vibrate_title" msgid="7997122314759645350">"Vibrera"</string>
     <string name="preferences_alerts_ringtone_title" msgid="7565118268120729644">"Välj ringsignal"</string>
-    <string name="preferences_default_reminder_title" msgid="103964814265989503">"Ange standardtid för påmin."</string>
+    <string name="preferences_default_reminder_title" msgid="5188861433342733905">"Standardtid för påminnelse"</string>
     <string name="preferences_default_reminder_dialog" msgid="2490348857239323412">"Standardtid för påminnelse"</string>
     <string name="preferences_default_reminder_default" msgid="2903884416749959435">"10"</string>
 </resources>
index 9ce58094c3c61d067fdf6606dd301f21354a9d52..860ec8adcdb8d898fc5f0b5c2ebf54ed13fefa8d 100644 (file)
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="app_label" msgid="5452708708398908131">"Takvim"</string>
-    <string name="calendar_plug" msgid="8148614847911924208"><font fgcolor="#ffffffff">"Google Takvim\'e hoş geldiniz!"</font>" "\n"Programlı etkinliklerin daha fark edilir, daha etkin ve daha erişilebilir olabilmesi fikri üzerine inşa edilen, programınızı yönetmeniz için geliştirilmiş bir Google yaklaşımıdır."</string>
+    <string name="calendar_plug" msgid="4861031284038774007"><font fgcolor="#ffffffff">"Google Takvim\'e hoş geldiniz!"</font>" "\n"Programlı etkinliklerin daha fark edilir, daha etkin ve daha erişilebilir olabilmesi fikri üzerine inşa edilen, programınızı yönetmeniz için geliştirilmiş bir Google ürünüdür."</string>
     <string name="what_label" msgid="1933578391985810049">"Başlık:"</string>
     <string name="when_label" msgid="894636567327261599">"Zaman:"</string>
     <string name="where_label" msgid="3472482206065595118">"Yer"</string>
+    <string name="attendees_label" msgid="2971281641565729725">"Misafirler"</string>
+    <string name="response_label" msgid="5732943469653254290">"<xliff:g id="RESPONSE_TYPE">%s</xliff:g> (<xliff:g id="GUEST_COUNT">%d</xliff:g>)"</string>
     <string name="repeats_label" msgid="7414023871434593196">"Tekrar"</string>
     <string name="no_title_label" msgid="7352118984125107858">"(Konu yok)"</string>
   <plurals name="Nminutes">
@@ -59,6 +61,7 @@
     <string name="hint_what" msgid="709155115005044531">"Etkinlik adı"</string>
     <string name="hint_where" msgid="3116239630502213241">"Etkinlik konumu"</string>
     <string name="hint_description" msgid="4198202812240544553">"Etkinlik açıklaması"</string>
+    <string name="hint_attendees" msgid="6036653711383143333">"E-posta adresleri"</string>
     <string name="creating_event" msgid="8237877638457604455">"Etkinlik oluşturuluyor..."</string>
     <string name="saving_event" msgid="8853425146353785688">"Etkinlik kaydediliyor..."</string>
     <string name="loading_calendars_title" msgid="3819254313413902272">"Takvimler yükleniyor"</string>
     <string name="edit_event_show_extra_options" msgid="2325854287823989650">"Ek seçenekleri göster"</string>
     <string name="edit_event_hide_extra_options" msgid="4019082307326855513">"Ek seçenekleri gizle"</string>
     <string name="description_label" msgid="7193475046717505855">"Açıklama"</string>
-    <string name="presence_label" msgid="2155381988163502023">"Mevcudiyet"</string>
+    <string name="presence_label" msgid="6169724148441175862">"Durumumu şu şekilde göster:"</string>
     <string name="privacy_label" msgid="9215031965259597335">"Gizlilik"</string>
     <string name="reminders_label" msgid="8345054160145333166">"Hatırlatıcılar"</string>
     <string name="no_syncable_calendars" msgid="7019488867045436129">"Takvim yok"</string>
     <string name="no_calendars_found" msgid="755379468136462058">"Hiç takviminiz yok."</string>
     <string name="view_event_calendar_label" msgid="8503354404461986250">"Takvim"</string>
+    <string name="view_event_organizer_label" msgid="2168441329713325834">"Düzenleyici"</string>
     <string name="view_event_timezone_label" msgid="6461351857281070935">"Yerel saat dilimi"</string>
     <string name="view_event_response_label" msgid="8382281658458798329">"Katılıyor musunuz?"</string>
-    <string name="agenda_today" msgid="2405333795044229594">"Bugün"</string>
+    <string name="agenda_today" msgid="6489447319363439068">"Bugün, <xliff:g id="DATE">%1$s</xliff:g>"</string>
+    <string name="loading" msgid="3772533493214331230">"Yükleniyor…"</string>
+    <string name="show_older_events" msgid="4031960000704544741">"Etkinlikler <xliff:g id="OLDEST_SEARCH_RANGE">%1$s</xliff:g> tarihinden itibaren gösteriliyor. Daha fazlasını görmek için hafifçe vurun."</string>
+    <string name="show_newer_events" msgid="2647889653936094369">"Etkinlikler <xliff:g id="NEWEST_SEARCH_RANGE">%1$s</xliff:g> tarihine kadar gösteriliyor. Daha fazlasını görmek için hafifçe vurun."</string>
     <string name="num_events" msgid="3351672964607162257">"Etkinlik sayısı"</string>
     <string name="edit_event_label" msgid="2900418236819088363">"Etkinliği düzenle"</string>
     <string name="delete_label" msgid="874742811918030739">"Sil"</string>
     <string name="delete_event_label" msgid="3738436215987360463">"Etkinliği sil"</string>
-    <!-- no translation found for save_label (2133599104834432589) -->
-    <skip />
-    <!-- no translation found for discard_label (4510607554910139220) -->
-    <skip />
+    <string name="save_label" msgid="2133599104834432589">"Bitti"</string>
+    <string name="discard_label" msgid="4510607554910139220">"Geri Döndür"</string>
     <string name="import_label" msgid="6993796574741477222">"İçe aktar"</string>
     <string name="snooze_all_label" msgid="4994488813124409077">"Tümünü ertele"</string>
     <string name="dismiss_all_label" msgid="1834400025868091301">"Tümünü kapat"</string>
     <string name="preferences_alerts_type_dialog" msgid="2195667763429994271">"Uyarılar ve bildirimler"</string>
     <string name="preferences_alerts_vibrate_title" msgid="7997122314759645350">"Titret"</string>
     <string name="preferences_alerts_ringtone_title" msgid="7565118268120729644">"Zil sesini seç"</string>
-    <string name="preferences_default_reminder_title" msgid="103964814265989503">"Varsayılan hatırlatıcıyı ayarla"</string>
+    <string name="preferences_default_reminder_title" msgid="5188861433342733905">"Varsayılan hatırlatıcı süresi"</string>
     <string name="preferences_default_reminder_dialog" msgid="2490348857239323412">"Varsayılan hatırlatıcı süresi"</string>
     <string name="preferences_default_reminder_default" msgid="2903884416749959435">"10"</string>
 </resources>
diff --git a/res/drawable-mdpi/im_avatar_picture_border_normal.9.png b/res/drawable-mdpi/im_avatar_picture_border_normal.9.png
index 32877b234e614738ca419fc1604d1adb4c85be92..7152bcdf85f1aad448410b34b01d1480c6bd941e 100644 (file)
--- a/res/drawable-mdpi/im_avatar_picture_border_normal.9.png
@@ -51,7 +51,7 @@
   <string-array name="preferences_alert_type_labels">
     <item msgid="2724242028978664229">"警报"</item>
     <item msgid="8723674378160518790">"状态栏通知"</item>
-    <item msgid="8433736231022186661">"关"</item>
+    <item msgid="8433736231022186661">"关闭"</item>
   </string-array>
   <string-array name="availability">
     <item msgid="454869065893453189">"忙碌"</item>
index 7d1f12db168d7899646fd928c9511a758abd5182..95748807e31b1d49d65bed96068864bea00e01ab 100644 (file)
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="app_label" msgid="5452708708398908131">"日历"</string>
-    <string name="calendar_plug" msgid="8148614847911924208"><font fgcolor="#ffffffff">"欢迎使用 Google 日历!"</font>" "\n"Google 日历可用来管理您的日程计划,让您更直观、更高效、更轻松地安排活动。"</string>
+    <string name="calendar_plug" msgid="4861031284038774007"><font fgcolor="#ffffffff">"欢迎使用 Google 日历!"</font>" "\n"Google 日历可用来管理您的日程安排,让您更直观、更高效、更轻松地安排活动。"</string>
     <string name="what_label" msgid="1933578391985810049">"内容"</string>
     <string name="when_label" msgid="894636567327261599">"时间"</string>
     <string name="where_label" msgid="3472482206065595118">"地点"</string>
+    <string name="attendees_label" msgid="2971281641565729725">"来宾"</string>
+    <string name="response_label" msgid="5732943469653254290">"<xliff:g id="RESPONSE_TYPE">%s</xliff:g> (<xliff:g id="GUEST_COUNT">%d</xliff:g>)"</string>
     <string name="repeats_label" msgid="7414023871434593196">"重复"</string>
     <string name="no_title_label" msgid="7352118984125107858">"(无主题)"</string>
   <plurals name="Nminutes">
@@ -59,6 +61,7 @@
     <string name="hint_what" msgid="709155115005044531">"活动名称"</string>
     <string name="hint_where" msgid="3116239630502213241">"活动地点"</string>
     <string name="hint_description" msgid="4198202812240544553">"活动说明"</string>
+    <string name="hint_attendees" msgid="6036653711383143333">"电子邮件地址"</string>
     <string name="creating_event" msgid="8237877638457604455">"正在创建活动..."</string>
     <string name="saving_event" msgid="8853425146353785688">"正在保存活动..."</string>
     <string name="loading_calendars_title" msgid="3819254313413902272">"正在载入日历"</string>
     <string name="edit_event_show_extra_options" msgid="2325854287823989650">"显示额外选项"</string>
     <string name="edit_event_hide_extra_options" msgid="4019082307326855513">"隐藏额外选项"</string>
     <string name="description_label" msgid="7193475046717505855">"说明"</string>
-    <string name="presence_label" msgid="2155381988163502023">"状态"</string>
+    <string name="presence_label" msgid="6169724148441175862">"状态显示为"</string>
     <string name="privacy_label" msgid="9215031965259597335">"隐私"</string>
     <string name="reminders_label" msgid="8345054160145333166">"提醒"</string>
     <string name="no_syncable_calendars" msgid="7019488867045436129">"无日历"</string>
     <string name="no_calendars_found" msgid="755379468136462058">"您没有日历。"</string>
     <string name="view_event_calendar_label" msgid="8503354404461986250">"日历帐户"</string>
+    <string name="view_event_organizer_label" msgid="2168441329713325834">"组织者"</string>
     <string name="view_event_timezone_label" msgid="6461351857281070935">"本地时区"</string>
     <string name="view_event_response_label" msgid="8382281658458798329">"参加吗?"</string>
-    <string name="agenda_today" msgid="2405333795044229594">"今天"</string>
+    <string name="agenda_today" msgid="6489447319363439068">"今天(<xliff:g id="DATE">%1$s</xliff:g>)"</string>
+    <string name="loading" msgid="3772533493214331230">"正在载入..."</string>
+    <string name="show_older_events" msgid="4031960000704544741">"显示自 <xliff:g id="OLDEST_SEARCH_RANGE">%1$s</xliff:g>以来发生的活动。点按可查看更多活动。"</string>
+    <string name="show_newer_events" msgid="2647889653936094369">"显示 <xliff:g id="NEWEST_SEARCH_RANGE">%1$s</xliff:g>之前发生的活动。点按可查看更多活动。"</string>
     <string name="num_events" msgid="3351672964607162257">"活动数"</string>
     <string name="edit_event_label" msgid="2900418236819088363">"编辑活动"</string>
     <string name="delete_label" msgid="874742811918030739">"删除"</string>
     <string name="delete_event_label" msgid="3738436215987360463">"删除活动"</string>
-    <!-- no translation found for save_label (2133599104834432589) -->
-    <skip />
-    <!-- no translation found for discard_label (4510607554910139220) -->
-    <skip />
+    <string name="save_label" msgid="2133599104834432589">"完成"</string>
+    <string name="discard_label" msgid="4510607554910139220">"还原"</string>
     <string name="import_label" msgid="6993796574741477222">"导入"</string>
     <string name="snooze_all_label" msgid="4994488813124409077">"全部暂停"</string>
     <string name="dismiss_all_label" msgid="1834400025868091301">"全部关闭"</string>
     <string name="every_weekday" msgid="5896574838353902978">"每个工作日(周一至周五)"</string>
     <string name="weekly" msgid="2006107373119027114">"每周(每周的<xliff:g id="DAYS_OF_WEEK">%s</xliff:g>)"</string>
     <string name="monthly_on_day_count" msgid="6847991854413461795">"每月(每月的<xliff:g id="ORDINAL_NUMBER">%1$s</xliff:g><xliff:g id="DAY_OF_WEEK">%2$s</xliff:g>)"</string>
-    <string name="monthly_on_day" msgid="5370155265278821156">"每月(第 <xliff:g id="DAY_OF_MONTH">%s</xliff:g> 日)"</string>
+    <string name="monthly_on_day" msgid="5370155265278821156">"每月(<xliff:g id="DAY_OF_MONTH">%s</xliff:g> 日)"</string>
     <string name="yearly" msgid="8576208380302949002">"每年(<xliff:g id="DATES">%s</xliff:g>)"</string>
     <string name="custom" msgid="3015205670911301856">"自定义...(无法在手机上自定义)"</string>
     <string name="modify_event" msgid="4501745557655992422">"仅更改此活动。"</string>
     <string name="preferences_alerts_type_dialog" msgid="2195667763429994271">"警报和通知"</string>
     <string name="preferences_alerts_vibrate_title" msgid="7997122314759645350">"振动"</string>
     <string name="preferences_alerts_ringtone_title" msgid="7565118268120729644">"选择铃声"</string>
-    <string name="preferences_default_reminder_title" msgid="103964814265989503">"设置默认提醒"</string>
+    <string name="preferences_default_reminder_title" msgid="5188861433342733905">"默认提醒时间"</string>
     <string name="preferences_default_reminder_dialog" msgid="2490348857239323412">"默认提醒时间"</string>
     <string name="preferences_default_reminder_default" msgid="2903884416749959435">"10"</string>
 </resources>
index 69bd446569526664dd2229d71c84f551df7417b9..5f076e87c957faabdbaa6165258ee1ed1dc06f3f 100644 (file)
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="app_label" msgid="5452708708398908131">"Google 日曆"</string>
-    <string name="calendar_plug" msgid="8148614847911924208"><font fgcolor="#ffffffff">"歡迎使用 Google 日曆!"</font>\n"Google 提供您管理每日行程的方法,讓您憑直覺快速安排活動,輕鬆存取所有行程。"</string>
+    <string name="calendar_plug" msgid="4861031284038774007"><font fgcolor="#ffffffff">"歡迎使用「Google 日曆」!"</font>\n"Google 為提供了管理每日行程的好幫手,讓您憑直覺快速安排活動,輕鬆存取所有行程。"</string>
     <string name="what_label" msgid="1933578391985810049">"主題"</string>
     <string name="when_label" msgid="894636567327261599">"時間"</string>
     <string name="where_label" msgid="3472482206065595118">"地點"</string>
+    <string name="attendees_label" msgid="2971281641565729725">"邀請對象"</string>
+    <string name="response_label" msgid="5732943469653254290">"<xliff:g id="RESPONSE_TYPE">%s</xliff:g> (<xliff:g id="GUEST_COUNT">%d</xliff:g>)"</string>
     <string name="repeats_label" msgid="7414023871434593196">"重複頻率"</string>
     <string name="no_title_label" msgid="7352118984125107858">"(無主題)"</string>
   <plurals name="Nminutes">
@@ -59,6 +61,7 @@
     <string name="hint_what" msgid="709155115005044531">"活動名稱"</string>
     <string name="hint_where" msgid="3116239630502213241">"活動地點"</string>
     <string name="hint_description" msgid="4198202812240544553">"活動說明"</string>
+    <string name="hint_attendees" msgid="6036653711383143333">"電子郵件地址"</string>
     <string name="creating_event" msgid="8237877638457604455">"正在建立活動..."</string>
     <string name="saving_event" msgid="8853425146353785688">"正在儲存活動..."</string>
     <string name="loading_calendars_title" msgid="3819254313413902272">"正在載入日曆"</string>
     <string name="edit_event_show_extra_options" msgid="2325854287823989650">"顯示少用選項"</string>
     <string name="edit_event_hide_extra_options" msgid="4019082307326855513">"隱藏少用選項"</string>
     <string name="description_label" msgid="7193475046717505855">"說明"</string>
-    <string name="presence_label" msgid="2155381988163502023">"狀態"</string>
+    <string name="presence_label" msgid="6169724148441175862">"將我的狀態顯示為"</string>
     <string name="privacy_label" msgid="9215031965259597335">"隱私權"</string>
     <string name="reminders_label" msgid="8345054160145333166">"提醒"</string>
     <string name="no_syncable_calendars" msgid="7019488867045436129">"無日曆"</string>
     <string name="no_calendars_found" msgid="755379468136462058">"您沒有日曆。"</string>
     <string name="view_event_calendar_label" msgid="8503354404461986250">"日曆"</string>
+    <string name="view_event_organizer_label" msgid="2168441329713325834">"主辦人"</string>
     <string name="view_event_timezone_label" msgid="6461351857281070935">"當地時區"</string>
     <string name="view_event_response_label" msgid="8382281658458798329">"是否參加?"</string>
-    <string name="agenda_today" msgid="2405333795044229594">"今日"</string>
+    <string name="agenda_today" msgid="6489447319363439068">"今天 (<xliff:g id="DATE">%1$s</xliff:g>)"</string>
+    <string name="loading" msgid="3772533493214331230">"載入中..."</string>
+    <string name="show_older_events" msgid="4031960000704544741">"顯示「<xliff:g id="OLDEST_SEARCH_RANGE">%1$s</xliff:g>」之後的活動,輕按以查看更多活動。"</string>
+    <string name="show_newer_events" msgid="2647889653936094369">"顯示「<xliff:g id="NEWEST_SEARCH_RANGE">%1$s</xliff:g>」之前的活動,輕按以查看更多活動。"</string>
     <string name="num_events" msgid="3351672964607162257">"活動數"</string>
     <string name="edit_event_label" msgid="2900418236819088363">"編輯活動"</string>
     <string name="delete_label" msgid="874742811918030739">"刪除"</string>
     <string name="preferences_alerts_type_dialog" msgid="2195667763429994271">"警示及通知"</string>
     <string name="preferences_alerts_vibrate_title" msgid="7997122314759645350">"震動"</string>
     <string name="preferences_alerts_ringtone_title" msgid="7565118268120729644">"選取鈴聲"</string>
-    <string name="preferences_default_reminder_title" msgid="103964814265989503">"設定預設提醒時間"</string>
+    <string name="preferences_default_reminder_title" msgid="5188861433342733905">"預設提醒時間"</string>
     <string name="preferences_default_reminder_dialog" msgid="2490348857239323412">"預設提醒時間"</string>
     <string name="preferences_default_reminder_default" msgid="2903884416749959435">"10"</string>
 </resources>
index e49015e9a06b5be41e522c3e8555925b5c980033..f7330961c2e3e3bb205f1c6152bdd5392b69dde9 100644 (file)
@@ -19,7 +19,7 @@
     <string name="app_label">Calendar</string>
     <!-- This is the welcome message when a user starts Calendar for the first time -->
     <string name="calendar_plug"><font fgcolor="#ffffffff">Welcome to Google Calendar!</font>
-    \nA Google approach to managing your schedule built on the idea that scheduling events can be more intuitive, efficient and accessible.
+    \nA Google approach to managing your schedule built on the idea that scheduling events can be more intuitive, efficient, and accessible.
     </string>
 
     <!-- Shared Labels. These labels are shared among the activities. -->
     <string name="when_label">When</string>
     <!-- This is the label for the location of an event -->
     <string name="where_label">Where</string>
+    <!-- This is the label for the Guests/Attendees of an event -->
+    <string name="attendees_label">Guests</string>
+    <!-- This is the label for the Guest Responses and count of an event e.g. Yes (3) -->
+    <string name="response_label">"<xliff:g id="response_type">%s</xliff:g> (<xliff:g id="guest_count">%d</xliff:g>)"</string>
+    
     <!-- Some events repeat daily, weekly, monthly, or yearly.  This is the label
          for all the choices about how often an event repeats (including the choice
          of not repeating). -->
     <string name="hint_where">"Event location"</string>
     <!-- Default value of Description field (as a hint to the user) -->
     <string name="hint_description">"Event description"</string>
+    <!-- Default value of Attendees/Guests field (as a hint to the user) -->
+    <string name="hint_attendees">"Email addresses"</string>
     <string name="creating_event">"Creating event\u2026"</string>
     <string name="saving_event">"Saving event\u2026"</string>
     <string name="loading_calendars_title">"Loading calendars"</string>
     <string name="description_label">Description</string>
     <!-- Label for the 'Presence' of an event, which can be either 'busy' (the default)
          or 'available' -->
-    <string name="presence_label">Presence</string>
+    <string name="presence_label">Show me as</string>
     <!-- Label for the 'Privacy' of an event, which can be either 'private'
          or 'public' -->
     <string name="privacy_label">Privacy</string>
     <skip />
     <!-- Label for which calendar an event is part of -->
     <string name="view_event_calendar_label">Calendar</string>
+    <!-- Label for the event organizer -->
+    <string name="view_event_organizer_label">Organizer</string>
     <!-- Label for the local timezone -->
     <string name="view_event_timezone_label">Local time zone</string>
     <!-- Label for whether the user is attending this event. This is shown when
     <!-- Agenda View strings -->
     <skip />
     <!-- This is shown as part of the heading at the top of a list of today's events. -->
-    <string name="agenda_today">Today</string>
+    <string name="agenda_today">Today, <xliff:g id="date">%1$s</xliff:g></string>
+    <!-- This is shown while the calendar events are being loading to the screen. -->
+    <string name="loading">Loading\u2026</string>
+    <!-- This is shown at the top of the agenda view showing the range of events shown. -->
+    <string name="show_older_events">Showing events since <xliff:g id="oldest_search_range">%1$s</xliff:g>. Tap to look for more.</string>
+    <!-- This is shown at the bottom of the agenda view showing the range of events shown. -->
+    <string name="show_newer_events">Showing events until <xliff:g id="newest_search_range">%1$s</xliff:g>. Tap to look for more.</string>
     
     <!-- ICS Import activity -->
     <skip />
     <!-- Title of ringtone selector dialog -->
     <string name="preferences_alerts_ringtone_title">Select ringtone</string>
     <!-- List item label for setting the default number of reminder minutes -->
-    <string name="preferences_default_reminder_title">Set default reminder</string>
+    <string name="preferences_default_reminder_title">Default reminder time</string>
     <!-- Title of dialog for setting the default number of reminder minutes -->
     <string name="preferences_default_reminder_dialog">Default reminder time</string>
     <!-- Default value for the number of reminder minutes -->
index 4471ad28df00c91f6690f29f63d4c1256558aca3..0f6e89d7cac53e73140c8e3d2f33f97b50abe17d 100644 (file)
     
     <style name="TextAppearance.EditEvent_Label">
         <item name="android:textAppearance">?android:attr/textAppearanceSmall</item>
+        <item name="android:textColor">?android:attr/textColorSecondaryInverse</item>
+        <item name="android:textStyle">bold</item>
+        <item name="android:paddingLeft">2dip</item>
+    </style>
+    
+    <style name="TextAppearance.EventInfo_Label">
+        <item name="android:textAppearance">?android:attr/textAppearanceSmall</item>
         <item name="android:textColor">?android:attr/textColorSecondary</item>
         <item name="android:textStyle">bold</item>
         <item name="android:paddingLeft">2dip</item>
index 00a46afd9a1d4f6119dcd9fca7e56d5b8feaef75..b41403300c6b7cc228a6e1fdc1ea90bcdf5af451 100644 (file)
 
 package com.android.calendar;
 
+import static android.provider.Calendar.EVENT_BEGIN_TIME;
+
 import android.app.Activity;
-import android.content.AsyncQueryHandler;
 import android.content.BroadcastReceiver;
 import android.content.ContentResolver;
-import android.content.ContentUris;
 import android.content.Context;
 import android.content.Intent;
 import android.content.IntentFilter;
 import android.content.SharedPreferences;
 import android.database.ContentObserver;
-import android.database.Cursor;
-import android.database.MatrixCursor;
-import android.net.Uri;
 import android.os.Bundle;
 import android.os.Handler;
 import android.preference.PreferenceManager;
-import android.provider.Calendar;
-import android.provider.Calendar.Attendees;
-import android.provider.Calendar.Calendars;
 import android.provider.Calendar.Events;
-import android.provider.Calendar.Instances;
 import android.text.format.Time;
+import android.util.Log;
 import android.view.KeyEvent;
 import android.view.Menu;
 import android.view.MenuItem;
-import android.view.View;
-import android.view.Window;
-import android.widget.AdapterView;
-import android.widget.ListView;
-import android.widget.ViewSwitcher;
+
 import dalvik.system.VMRuntime;
 
-public class AgendaActivity extends Activity implements ViewSwitcher.ViewFactory, Navigator {
+public class AgendaActivity extends Activity implements Navigator {
 
-    protected static final String BUNDLE_KEY_RESTORE_TIME = "key_restore_time";
+    private static final String TAG = "AgendaActivity";
 
-    static final String[] PROJECTION = new String[] {
-        Instances._ID,                  // 0
-        Instances.TITLE,                // 1
-        Instances.EVENT_LOCATION,       // 2
-        Instances.ALL_DAY,              // 3
-        Instances.HAS_ALARM,            // 4
-        Instances.COLOR,                // 5
-        Instances.RRULE,                // 6
-        Instances.BEGIN,                // 7
-        Instances.END,                  // 8
-        Instances.EVENT_ID,             // 9
-        Instances.START_DAY,            // 10  Julian start day
-        Instances.END_DAY,              // 11  Julian end day
-        Instances.SELF_ATTENDEE_STATUS, // 12
-    };
+    private static boolean DEBUG = false;
 
-    public static final int INDEX_TITLE = 1;
-    public static final int INDEX_EVENT_LOCATION = 2;
-    public static final int INDEX_ALL_DAY = 3;
-    public static final int INDEX_HAS_ALARM = 4;
-    public static final int INDEX_COLOR = 5;
-    public static final int INDEX_RRULE = 6;
-    public static final int INDEX_BEGIN = 7;
-    public static final int INDEX_END = 8;
-    public static final int INDEX_EVENT_ID = 9;
-    public static final int INDEX_START_DAY = 10;
-    public static final int INDEX_END_DAY = 11;
-    public static final int INDEX_SELF_ATTENDEE_STATUS = 12;
-
-    public static final String AGENDA_SORT_ORDER = "startDay ASC, begin ASC, title ASC";
+    protected static final String BUNDLE_KEY_RESTORE_TIME = "key_restore_time";
 
     private static final long INITIAL_HEAP_SIZE = 4*1024*1024;
 
     private ContentResolver mContentResolver;
 
-    private ViewSwitcher mViewSwitcher;
+    private AgendaListView mAgendaListView;
 
-    private QueryHandler mQueryHandler;
-    private DeleteEventHelper mDeleteEventHelper;
     private Time mTime;
 
-    /**
-     * This records the start time parameter for the last query sent to the
-     * AsyncQueryHandler so that we don't send it duplicate query requests.
-     */
-    private Time mLastQueryTime = new Time();
-
-    private class QueryHandler extends AsyncQueryHandler {
-        public QueryHandler(ContentResolver cr) {
-            super(cr);
-        }
-
-        @Override
-        protected void onQueryComplete(int token, Object cookie, Cursor cursor) {
-
-            // Only set mCursor if the Activity is not finishing. Otherwise close the cursor.
-            if (!isFinishing()) {
-                AgendaListView next = (AgendaListView) mViewSwitcher.getNextView();
-                next.setCursor(cursor);
-                mViewSwitcher.showNext();
-                selectTime();
-            } else {
-                cursor.close();
-            }
-        }
-    }
-
-    private class AgendaListView extends ListView {
-        private Cursor mCursor;
-        private AgendaByDayAdapter mDayAdapter;
-        private AgendaAdapter mAdapter;
-
-        public AgendaListView(Context context) {
-            super(context, null);
-            setOnItemClickListener(mOnItemClickListener);
-            setChoiceMode(ListView.CHOICE_MODE_SINGLE);
-            mAdapter = new AgendaAdapter(AgendaActivity.this, R.layout.agenda_item);
-            mDayAdapter = new AgendaByDayAdapter(AgendaActivity.this, mAdapter);
-        }
-
-        public void setCursor(Cursor cursor) {
-            if (mCursor != null) {
-                mCursor.close();
-            }
-            mCursor = cursor;
-            mDayAdapter.calculateDays(cursor);
-            mAdapter.changeCursor(cursor);
-            setAdapter(mDayAdapter);
-        }
-
-        public Cursor getCursor() {
-            return mCursor;
-        }
-
-        public AgendaByDayAdapter getDayAdapter() {
-            return mDayAdapter;
-        }
-
-        @Override protected void onDetachedFromWindow() {
-            super.onDetachedFromWindow();
-            if (mCursor != null) {
-                mCursor.close();
-            }
-        }
-
-        private OnItemClickListener mOnItemClickListener = new OnItemClickListener() {
-            public void onItemClick(AdapterView a, View v, int position, long id) {
-                if (id != -1) {
-                    // Switch to the EventInfo view
-                    mCursor.moveToPosition(mDayAdapter.getCursorPosition(position));
-                    long eventId = mCursor.getLong(INDEX_EVENT_ID);
-                    Uri uri = ContentUris.withAppendedId(Events.CONTENT_URI, eventId);
-                    Intent intent = new Intent(Intent.ACTION_VIEW, uri);
-                    intent.putExtra(Calendar.EVENT_BEGIN_TIME, mCursor.getLong(INDEX_BEGIN));
-                    intent.putExtra(Calendar.EVENT_END_TIME, mCursor.getLong(INDEX_END));
-                    startActivity(intent);
-                }
-            }
-        };
-    }
-
     private BroadcastReceiver mIntentReceiver = new BroadcastReceiver() {
         @Override
         public void onReceive(Context context, Intent intent) {
@@ -180,8 +61,7 @@ public class AgendaActivity extends Activity implements ViewSwitcher.ViewFactory
             if (action.equals(Intent.ACTION_TIME_CHANGED)
                     || action.equals(Intent.ACTION_DATE_CHANGED)
                     || action.equals(Intent.ACTION_TIMEZONE_CHANGED)) {
-                clearLastQueryTime();
-                renewCursor();
+                mAgendaListView.refresh(true);
             }
         }
     };
@@ -194,56 +74,78 @@ public class AgendaActivity extends Activity implements ViewSwitcher.ViewFactory
 
         @Override
         public void onChange(boolean selfChange) {
-            clearLastQueryTime();
-            renewCursor();
+            mAgendaListView.refresh(true);
         }
     };
 
     @Override
     protected void onCreate(Bundle icicle) {
         super.onCreate(icicle);
-
+        
         // Eliminate extra GCs during startup by setting the initial heap size to 4MB.
         // TODO: We should restore the old heap size once the activity reaches the idle state
-        long oldHeapSize = VMRuntime.getRuntime().setMinimumHeapSize(INITIAL_HEAP_SIZE);
+        VMRuntime.getRuntime().setMinimumHeapSize(INITIAL_HEAP_SIZE);
 
-        setContentView(R.layout.agenda_activity);
+        mAgendaListView = new AgendaListView(this);
+        setContentView(mAgendaListView);
 
         mContentResolver = getContentResolver();
-        mQueryHandler = new QueryHandler(mContentResolver);
 
-        // Preserve the same month and event selection if this activity is
-        // being restored due to an orientation change
+        setTitle(R.string.agenda_view);
+
+        long millis = 0;
         mTime = new Time();
         if (icicle != null) {
-            mTime.set(icicle.getLong(BUNDLE_KEY_RESTORE_TIME));
-        } else {
-            mTime.set(Utils.timeFromIntent(getIntent()));
+            // Returns 0 if key not found
+            millis = icicle.getLong(BUNDLE_KEY_RESTORE_TIME);
+            if (DEBUG) {
+                Log.v(TAG, "Restore value from icicle: " + millis);
+            }
         }
-        setTitle(R.string.agenda_view);
 
-        mViewSwitcher = (ViewSwitcher) findViewById(R.id.switcher);
-        mViewSwitcher.setFactory(this);
-
-        // Record Agenda View as the (new) default detailed view.
-        String activityString = CalendarApplication.ACTIVITY_NAMES[CalendarApplication.AGENDA_VIEW_ID];
-        SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
-        SharedPreferences.Editor editor = prefs.edit();
-        editor.putString(CalendarPreferenceActivity.KEY_DETAILED_VIEW, activityString);
+        if (millis == 0) {
+            // Returns 0 if key not found
+            millis = getIntent().getLongExtra(EVENT_BEGIN_TIME, 0);
+            if (DEBUG) {
+                Time time = new Time();
+                time.set(millis);
+                Log.v(TAG, "Restore value from intent: " + time.toString());
+            }
+        }
 
-        // Record Agenda View as the (new) start view
-        editor.putString(CalendarPreferenceActivity.KEY_START_VIEW, activityString);
-        editor.commit();
+        if (millis == 0) {
+            if (DEBUG) {
+                Log.v(TAG, "Restored from current time");
+            }
+            millis = System.currentTimeMillis();
+        }
+        mTime.set(millis);
+    }
 
-        mDeleteEventHelper = new DeleteEventHelper(this, false /* don't exit when done */);
+    @Override
+    protected void onNewIntent(Intent intent) {
+        long time = Utils.timeFromIntentInMillis(intent);
+        if (time > 0) {
+            mTime.set(time);
+            goTo(mTime, false);
+        }
     }
 
     @Override
     protected void onResume() {
         super.onResume();
+        if (DEBUG) {
+            Log.v(TAG, "OnResume to " + mTime.toString());
+        }
+
+        SharedPreferences prefs =
+            PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
+        boolean hideDeclined = prefs
+                .getBoolean(CalendarPreferenceActivity.KEY_HIDE_DECLINED, false);
 
-        clearLastQueryTime();
-        renewCursor();
+        mAgendaListView.setHideDeclinedEvents(hideDeclined);
+        mAgendaListView.goTo(mTime, true);
+        mAgendaListView.onResume();
 
         // Register for Intent broadcasts
         IntentFilter filter = new IntentFilter();
@@ -259,21 +161,26 @@ public class AgendaActivity extends Activity implements ViewSwitcher.ViewFactory
     protected void onSaveInstanceState(Bundle outState) {
         super.onSaveInstanceState(outState);
 
-        outState.putLong(BUNDLE_KEY_RESTORE_TIME, getSelectedTime());
+        long firstVisibleTime = mAgendaListView.getFirstVisibleTime();
+        if (firstVisibleTime > 0) {
+            mTime.set(firstVisibleTime);
+            outState.putLong(BUNDLE_KEY_RESTORE_TIME, firstVisibleTime);
+            if (DEBUG) {
+                Log.v(TAG, "onSaveInstanceState " + mTime.toString());
+            }
+        }
     }
 
     @Override
     protected void onPause() {
         super.onPause();
 
+        mAgendaListView.onPause();
         mContentResolver.unregisterContentObserver(mObserver);
         unregisterReceiver(mIntentReceiver);
 
-        // Clear the cursor so it won't crash when switching orientation while scrolling b/2022729
-        String[] columns = new String[1];
-        columns[0] = "_id";
-        AgendaListView current = (AgendaListView) mViewSwitcher.getCurrentView();
-        current.setCursor(new MatrixCursor(columns));
+        // Record Agenda View as the (new) default detailed view.
+        Utils.setDefaultView(this, CalendarApplication.AGENDA_VIEW_ID);
     }
 
     @Override
@@ -297,135 +204,27 @@ public class AgendaActivity extends Activity implements ViewSwitcher.ViewFactory
     @Override
     public boolean onKeyDown(int keyCode, KeyEvent event) {
         switch (keyCode) {
-            case KeyEvent.KEYCODE_DEL: {
+            case KeyEvent.KEYCODE_DEL:
                 // Delete the currently selected event (if any)
-                AgendaListView current = (AgendaListView) mViewSwitcher.getCurrentView();
-                Cursor cursor = current.getCursor();
-                if (cursor != null) {
-                    int position = current.getSelectedItemPosition();
-                    position = current.getDayAdapter().getCursorPosition(position);
-                    if (position >= 0) {
-                        cursor.moveToPosition(position);
-                        long begin = cursor.getLong(INDEX_BEGIN);
-                        long end = cursor.getLong(INDEX_END);
-                        long eventId = cursor.getLong(INDEX_EVENT_ID);
-                        mDeleteEventHelper.delete(begin, end, eventId, -1);
-                    }
-                }
-            }
+                mAgendaListView.deleteSelectedEvent();
                 break;
-
-            case KeyEvent.KEYCODE_BACK:
-                finish();
-                return true;
         }
         return super.onKeyDown(keyCode, event);
     }
 
-    /**
-     * Clears the cached value for the last query time so that renewCursor()
-     * will force a requery of the Calendar events.
-     */
-    private void clearLastQueryTime() {
-        mLastQueryTime.year = 0;
-        mLastQueryTime.month = 0;
-    }
-
-    private void renewCursor() {
-        // Avoid batching up repeated queries for the same month.  This can
-        // happen if the user scrolls with the trackball too fast.
-        if (mLastQueryTime.month == mTime.month && mLastQueryTime.year == mTime.year) {
-            return;
-        }
-
-        // Query all instances for the current month
-        Time time = new Time();
-        time.year = mTime.year;
-        time.month = mTime.month;
-        long start = time.normalize(true);
-
-        time.month++;
-        long end = time.normalize(true);
-
-        StringBuilder path = new StringBuilder();
-        path.append(start);
-        path.append('/');
-        path.append(end);
-
-        // Respect the preference to show/hide declined events
-        SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
-        boolean hideDeclined = prefs.getBoolean(CalendarPreferenceActivity.KEY_HIDE_DECLINED,
-                false);
-
-        Uri uri = Uri.withAppendedPath(Instances.CONTENT_URI, path.toString());
-
-        String selection;
-        if (hideDeclined) {
-            selection = Calendars.SELECTED + "=1 AND " +
-                    Instances.SELF_ATTENDEE_STATUS + "!=" + Attendees.ATTENDEE_STATUS_DECLINED;
-        } else {
-            selection = Calendars.SELECTED + "=1";
-        }
-
-        // Cancel any previous queries that haven't started yet.  This
-        // isn't likely to happen since we already avoid sending
-        // a duplicate query for the same month as the previous query.
-        // But if the user quickly wiggles the trackball back and forth,
-        // he could generate a stream of queries.
-        mQueryHandler.cancelOperation(0);
-
-        mLastQueryTime.month = mTime.month;
-        mLastQueryTime.year = mTime.year;
-        mQueryHandler.startQuery(0, null, uri, PROJECTION, selection, null,
-                AGENDA_SORT_ORDER);
-    }
-
-    private void selectTime() {
-        // Selects the first event of the day
-        AgendaListView current = (AgendaListView) mViewSwitcher.getCurrentView();
-        if (current.getCursor() == null) {
-            return;
-        }
-
-        int position = current.getDayAdapter().findDayPositionNearestTime(mTime);
-        current.setSelection(position);
-    }
-
-    /* ViewSwitcher.ViewFactory interface methods */
-    public View makeView() {
-        AgendaListView agendaListView = new AgendaListView(this);
-        return agendaListView;
-    }
-
     /* Navigator interface methods */
     public void goToToday() {
         Time now = new Time();
         now.set(System.currentTimeMillis());
-        goTo(now);
+        goTo(now, true);
     }
 
-    public void goTo(Time time) {
-        if (mTime.year == time.year && mTime.month == time.month) {
-            mTime = time;
-            selectTime();
-        } else {
-            mTime = time;
-            renewCursor();
-        }
+    public void goTo(Time time, boolean animate) {
+        mAgendaListView.goTo(time, false);
     }
 
     public long getSelectedTime() {
-        // Update the current time based on the selected event
-        AgendaListView current = (AgendaListView) mViewSwitcher.getCurrentView();
-        int position = current.getSelectedItemPosition();
-        position = current.getDayAdapter().getCursorPosition(position);
-        Cursor cursor = current.getCursor();
-        if (position >= 0 && position < cursor.getCount()) {
-            cursor.moveToPosition(position);
-            mTime.set(cursor.getLong(INDEX_BEGIN));
-        }
-
-        return mTime.toMillis(true);
+        return mAgendaListView.getSelectedTime();
     }
 
     public boolean getAllDay() {
index 1b93b7e29d5785b625450bb6cc935a79d8b494de..e54e3452dcd4e68fa288a45dd305c7a9654ee465 100644 (file)
@@ -26,10 +26,16 @@ import android.view.View;
 import android.widget.ResourceCursorAdapter;
 import android.widget.TextView;
 
+import java.util.Formatter;
+import java.util.Locale;
+
 public class AgendaAdapter extends ResourceCursorAdapter {
-    static private String mNoTitleLabel; // todo update on locale change.
+    private String mNoTitleLabel;
     private Resources mResources;
     private int mDeclinedColor;
+    // Note: Formatter is not thread safe. Fine for now as it is only used by the main thread.
+    private Formatter mFormatter;
+    private StringBuilder mStringBuilder;
 
     static class ViewHolder {
         int overLayColor; // Used by AgendaItemView to gray out the entire item if so desired
@@ -46,11 +52,20 @@ public class AgendaAdapter extends ResourceCursorAdapter {
         mResources = context.getResources();
         mNoTitleLabel = mResources.getString(R.string.no_title_label);
         mDeclinedColor = mResources.getColor(R.drawable.agenda_item_declined);
+        mStringBuilder = new StringBuilder(50);
+        mFormatter = new Formatter(mStringBuilder, Locale.getDefault());
     }
 
     @Override
     public void bindView(View view, Context context, Cursor cursor) {
-        ViewHolder holder = (ViewHolder) view.getTag();
+        ViewHolder holder = null;
+
+        // Listview may get confused and pass in a different type of view since
+        // we keep shifting data around. Not a big problem.
+        Object tag = view.getTag();
+        if (tag instanceof ViewHolder) {
+            holder = (ViewHolder) view.getTag();
+        }
 
         if (holder == null) {
             holder = new ViewHolder();
@@ -61,7 +76,7 @@ public class AgendaAdapter extends ResourceCursorAdapter {
         }
 
         // Fade text if event was declined.
-        int selfAttendeeStatus = cursor.getInt(AgendaActivity.INDEX_SELF_ATTENDEE_STATUS);
+        int selfAttendeeStatus = cursor.getInt(AgendaWindowAdapter.INDEX_SELF_ATTENDEE_STATUS);
         if (selfAttendeeStatus == Attendees.ATTENDEE_STATUS_DECLINED) {
             holder.overLayColor = mDeclinedColor;
         } else {
@@ -73,11 +88,11 @@ public class AgendaAdapter extends ResourceCursorAdapter {
         TextView where = holder.where;
 
         /* Calendar Color */
-        int color = cursor.getInt(AgendaActivity.INDEX_COLOR);
+        int color = cursor.getInt(AgendaWindowAdapter.INDEX_COLOR);
         holder.calendarColor = color;
 
         // What
-        String titleString = cursor.getString(AgendaActivity.INDEX_TITLE);
+        String titleString = cursor.getString(AgendaWindowAdapter.INDEX_TITLE);
         if (titleString == null || titleString.length() == 0) {
             titleString = mNoTitleLabel;
         }
@@ -85,9 +100,9 @@ public class AgendaAdapter extends ResourceCursorAdapter {
         title.setTextColor(color);
 
         // When
-        long begin = cursor.getLong(AgendaActivity.INDEX_BEGIN);
-        long end = cursor.getLong(AgendaActivity.INDEX_END);
-        boolean allDay = cursor.getInt(AgendaActivity.INDEX_ALL_DAY) != 0;
+        long begin = cursor.getLong(AgendaWindowAdapter.INDEX_BEGIN);
+        long end = cursor.getLong(AgendaWindowAdapter.INDEX_END);
+        boolean allDay = cursor.getInt(AgendaWindowAdapter.INDEX_ALL_DAY) != 0;
         int flags;
         String whenString;
         if (allDay) {
@@ -98,10 +113,11 @@ public class AgendaAdapter extends ResourceCursorAdapter {
         if (DateFormat.is24HourFormat(context)) {
             flags |= DateUtils.FORMAT_24HOUR;
         }
-        whenString = DateUtils.formatDateRange(context, begin, end, flags);
+        mStringBuilder.setLength(0);
+        whenString = DateUtils.formatDateRange(context, mFormatter, begin, end, flags).toString();
         when.setText(whenString);
 
-        String rrule = cursor.getString(AgendaActivity.INDEX_RRULE);
+        String rrule = cursor.getString(AgendaWindowAdapter.INDEX_RRULE);
         if (rrule != null) {
             when.setCompoundDrawablesWithIntrinsicBounds(null, null,
                     context.getResources().getDrawable(R.drawable.ic_repeat_dark), null);
@@ -130,7 +146,7 @@ public class AgendaAdapter extends ResourceCursorAdapter {
         */
 
         // Where
-        String whereString = cursor.getString(AgendaActivity.INDEX_EVENT_LOCATION);
+        String whereString = cursor.getString(AgendaWindowAdapter.INDEX_EVENT_LOCATION);
         if (whereString != null && whereString.length() > 0) {
             where.setVisibility(View.VISIBLE);
             where.setText(whereString);
index 140eb727247caf099e5e1ebd493dee8b27a6d156..881c1a2ea2daa244208869966c3e5260e0262e62 100644 (file)
@@ -26,27 +26,39 @@ import android.view.ViewGroup;
 import android.widget.BaseAdapter;
 import android.widget.TextView;
 
+import com.android.calendar.AgendaWindowAdapter.DayAdapterInfo;
+
 import java.util.ArrayList;
-import java.util.Calendar;
+import java.util.Formatter;
 import java.util.Iterator;
 import java.util.LinkedList;
+import java.util.Locale;
 
 public class AgendaByDayAdapter extends BaseAdapter {
     private static final int TYPE_DAY = 0;
     private static final int TYPE_MEETING = 1;
-    private static final int TYPE_LAST = 2;
+    static final int TYPE_LAST = 2;
 
     private final Context mContext;
     private final AgendaAdapter mAgendaAdapter;
     private final LayoutInflater mInflater;
     private ArrayList<RowInfo> mRowInfo;
     private int mTodayJulianDay;
-    private Time mTime = new Time();
+    private Time mTmpTime = new Time();
+    // Note: Formatter is not thread safe. Fine for now as it is only used by the main thread.
+    private Formatter mFormatter;
+    private StringBuilder mStringBuilder;
+
+    static class ViewHolder {
+        TextView dateView;
+    }
 
-    public AgendaByDayAdapter(Context context, AgendaAdapter agendaAdapter) {
+    public AgendaByDayAdapter(Context context) {
         mContext = context;
-        mAgendaAdapter = agendaAdapter;
-        mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
+        mAgendaAdapter = new AgendaAdapter(context, R.layout.agenda_item);
+        mInflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
+        mStringBuilder = new StringBuilder(50);
+        mFormatter = new Formatter(mStringBuilder, Locale.getDefault());
     }
 
     public int getCount() {
@@ -72,7 +84,7 @@ public class AgendaByDayAdapter extends BaseAdapter {
         if (mRowInfo != null) {
             RowInfo row = mRowInfo.get(position);
             if (row.mType == TYPE_DAY) {
-                return position;
+                return -position;
             } else {
                 return mAgendaAdapter.getItemId(row.mData);
             }
@@ -91,10 +103,6 @@ public class AgendaByDayAdapter extends BaseAdapter {
                 mRowInfo.get(position).mType : TYPE_DAY;
     }
 
-    private static class ViewHolder {
-        TextView dateView;
-    }
-
     public View getView(int position, View convertView, ViewGroup parent) {
         if ((mRowInfo == null) || (position > mRowInfo.size())) {
             // If we have no row info, mAgendaAdapter returns the view.
@@ -103,38 +111,59 @@ public class AgendaByDayAdapter extends BaseAdapter {
 
         RowInfo row = mRowInfo.get(position);
         if (row.mType == TYPE_DAY) {
-            ViewHolder holder;
-            View agendaDayView;
-            if ((convertView == null) || (convertView.getTag() == null)) {
+            ViewHolder holder = null;
+            View agendaDayView = null;
+            if ((convertView != null) && (convertView.getTag() != null)) {
+                // Listview may get confused and pass in a different type of
+                // view since we keep shifting data around. Not a big problem.
+                Object tag = convertView.getTag();
+                if (tag instanceof ViewHolder) {
+                    agendaDayView = convertView;
+                    holder = (ViewHolder) tag;
+                }
+            }
+
+            if (holder == null) {
                 // Create a new AgendaView with a ViewHolder for fast access to
                 // views w/o calling findViewById()
                 holder = new ViewHolder();
                 agendaDayView = mInflater.inflate(R.layout.agenda_day, parent, false);
                 holder.dateView = (TextView) agendaDayView.findViewById(R.id.date);
                 agendaDayView.setTag(holder);
-            } else {
-                agendaDayView = convertView;
-                holder = (ViewHolder) convertView.getTag();
             }
 
             // Re-use the member variable "mTime" which is set to the local timezone.
-            Time date = mTime;
+            Time date = mTmpTime;
             long millis = date.setJulianDay(row.mData);
             int flags = DateUtils.FORMAT_SHOW_YEAR
                     | DateUtils.FORMAT_SHOW_DATE;
-            
+
+            mStringBuilder.setLength(0);
+            String dateViewText;
             if (row.mData == mTodayJulianDay) {
-                String dayText = mContext.getResources().getText(R.string.agenda_today) + ", ";
-                holder.dateView.setText(dayText + DateUtils.formatDateTime(mContext, millis, flags));
+                dateViewText = mContext.getString(R.string.agenda_today, DateUtils.formatDateRange(
+                        mContext, mFormatter, millis, millis, flags).toString());
             } else {
                 flags |= DateUtils.FORMAT_SHOW_WEEKDAY;
-                holder.dateView.setText(DateUtils.formatDateTime(mContext, millis, flags));
+                dateViewText = DateUtils.formatDateRange(mContext, mFormatter, millis, millis,
+                        flags).toString();
             }
 
+            if (AgendaWindowAdapter.BASICLOG) {
+                dateViewText += " P:" + position;
+            }
+            holder.dateView.setText(dateViewText);
 
             return agendaDayView;
         } else if (row.mType == TYPE_MEETING) {
-            return mAgendaAdapter.getView(row.mData, convertView, parent);
+            View x = mAgendaAdapter.getView(row.mData, convertView, parent);
+            TextView y = ((AgendaAdapter.ViewHolder) x.getTag()).title;
+            if (AgendaWindowAdapter.BASICLOG) {
+                y.setText(y.getText() + " P:" + position);
+            } else {
+                y.setText(y.getText());
+            }
+            return x;
         } else {
             // Error
             throw new IllegalStateException("Unknown event type:" + row.mType);
@@ -145,7 +174,13 @@ public class AgendaByDayAdapter extends BaseAdapter {
         mRowInfo = null;
     }
 
-    public void calculateDays(Cursor cursor) {
+    public void changeCursor(DayAdapterInfo info) {
+        calculateDays(info);
+        mAgendaAdapter.changeCursor(info.cursor);
+    }
+
+    public void calculateDays(DayAdapterInfo dayAdapterInfo) {
+        Cursor cursor = dayAdapterInfo.cursor;
         ArrayList<RowInfo> rowInfo = new ArrayList<RowInfo>();
         int prevStartDay = -1;
         Time time = new Time();
@@ -154,8 +189,11 @@ public class AgendaByDayAdapter extends BaseAdapter {
         mTodayJulianDay = Time.getJulianDay(now, time.gmtoff);
         LinkedList<MultipleDayInfo> multipleDayList = new LinkedList<MultipleDayInfo>();
         for (int position = 0; cursor.moveToNext(); position++) {
-            boolean allDay = cursor.getInt(AgendaActivity.INDEX_ALL_DAY) != 0;
-            int startDay = cursor.getInt(AgendaActivity.INDEX_START_DAY);
+            boolean allDay = cursor.getInt(AgendaWindowAdapter.INDEX_ALL_DAY) != 0;
+            int startDay = cursor.getInt(AgendaWindowAdapter.INDEX_START_DAY);
+
+            // Skip over the days outside of the adapter's range
+            startDay = Math.max(startDay, dayAdapterInfo.start);
 
             if (startDay != prevStartDay) {
                 // Check if we skipped over any empty days
@@ -202,7 +240,10 @@ public class AgendaByDayAdapter extends BaseAdapter {
 
             // If this event spans multiple days, then add it to the multipleDay
             // list.
-            int endDay = cursor.getInt(AgendaActivity.INDEX_END_DAY);
+            int endDay = cursor.getInt(AgendaWindowAdapter.INDEX_END_DAY);
+
+            // Skip over the days outside of the adapter's range
+            endDay = Math.min(endDay, dayAdapterInfo.end);
             if (endDay > startDay) {
                 multipleDayList.add(new MultipleDayInfo(position, endDay));
             }
@@ -211,16 +252,8 @@ public class AgendaByDayAdapter extends BaseAdapter {
         // There are no more cursor events but we might still have multiple-day
         // events left.  So create day headers and events for those.
         if (prevStartDay > 0) {
-            // Get the Julian day for the last day of this month.  To do that,
-            // we set the date to one less than the first day of the next month,
-            // and then normalize.
-            time.setJulianDay(prevStartDay);
-            time.month += 1;
-            time.monthDay = 0;  // monthDay starts with 1, so this is the previous day
-            long millis = time.normalize(true /* ignore isDst */);
-            int lastDayOfMonth = Time.getJulianDay(millis, time.gmtoff);
-
-            for (int currentDay = prevStartDay + 1; currentDay <= lastDayOfMonth; currentDay++) {
+            for (int currentDay = prevStartDay + 1; currentDay <= dayAdapterInfo.end;
+                    currentDay++) {
                 boolean dayHeaderAdded = false;
                 Iterator<MultipleDayInfo> iter = multipleDayList.iterator();
                 while (iter.hasNext()) {
@@ -342,9 +375,17 @@ public class AgendaByDayAdapter extends BaseAdapter {
             RowInfo row = mRowInfo.get(listPos);
             if (row.mType == TYPE_MEETING) {
                 return row.mData;
+            } else {
+                int nextPos = listPos + 1;
+                if (nextPos < mRowInfo.size()) {
+                    nextPos = getCursorPosition(nextPos);
+                    if (nextPos >= 0) {
+                        return -nextPos;
+                    }
+                }
             }
         }
-        return listPos;
+        return Integer.MIN_VALUE;
     }
 
     @Override
@@ -361,4 +402,3 @@ public class AgendaByDayAdapter extends BaseAdapter {
         return true;
     }
 }
-
diff --git a/res/layout/agenda_header_footer.xml b/res/layout/agenda_header_footer.xml
new file mode 100644 (file)
index 0000000000000000000000000000000000000000..f5e63b4185df8375ca89a59d282058b9ae819e44
--- /dev/null
@@ -0,0 +1,213 @@
+/*
+ * Copyright (C) 2009 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.calendar;
+
+import android.content.ContentUris;
+import android.content.Intent;
+import android.graphics.Rect;
+import android.net.Uri;
+import android.provider.Calendar;
+import android.provider.Calendar.Events;
+import android.text.format.Time;
+import android.util.Log;
+import android.view.View;
+import android.widget.AdapterView;
+import android.widget.ListView;
+import android.widget.TextView;
+import android.widget.AdapterView.OnItemClickListener;
+
+import com.android.calendar.AgendaAdapter.ViewHolder;
+import com.android.calendar.AgendaWindowAdapter.EventInfo;
+
+public class AgendaListView extends ListView implements OnItemClickListener {
+
+    private static final String TAG = "AgendaListView";
+    private static final boolean DEBUG = false;
+
+    private AgendaWindowAdapter mWindowAdapter;
+
+    private AgendaActivity mAgendaActivity;
+    private DeleteEventHelper mDeleteEventHelper;
+
+    public AgendaListView(AgendaActivity agendaActivity) {
+        super(agendaActivity, null);
+        mAgendaActivity = agendaActivity;
+        mContext = agendaActivity;
+
+        setOnItemClickListener(this);
+        setChoiceMode(ListView.CHOICE_MODE_SINGLE);
+        setVerticalScrollBarEnabled(false);
+        mWindowAdapter = new AgendaWindowAdapter(agendaActivity, this);
+        setAdapter(mWindowAdapter);
+        mDeleteEventHelper =
+            new DeleteEventHelper(agendaActivity, false /* don't exit when done */);
+    }
+
+    @Override protected void onDetachedFromWindow() {
+        super.onDetachedFromWindow();
+        mWindowAdapter.close();
+    }
+
+    // Implementation of the interface OnItemClickListener
+    public void onItemClick(AdapterView<?> a, View v, int position, long id) {
+        if (id != -1) {
+            // Switch to the EventInfo view
+            EventInfo event = mWindowAdapter.getEventByPosition(position);
+            if (event != null) {
+                Uri uri = ContentUris.withAppendedId(Events.CONTENT_URI, event.id);
+                Intent intent = new Intent(Intent.ACTION_VIEW, uri);
+                intent.putExtra(Calendar.EVENT_BEGIN_TIME, event.begin);
+                intent.putExtra(Calendar.EVENT_END_TIME, event.end);
+                mAgendaActivity.startActivity(intent);
+            }
+        }
+    }
+
+    public void goTo(Time time, boolean forced) {
+        mWindowAdapter.refresh(time, forced);
+    }
+
+    public void refresh(boolean forced) {
+        Time time = new Time();
+        long goToTime = getFirstVisibleTime();
+        if (goToTime <= 0) {
+            goToTime = System.currentTimeMillis();
+        }
+        time.set(goToTime);
+        mWindowAdapter.refresh(time, forced);
+    }
+
+    public void deleteSelectedEvent() {
+        int position = getSelectedItemPosition();
+        EventInfo event = mWindowAdapter.getEventByPosition(position);
+        if (event != null) {
+            mDeleteEventHelper.delete(event.begin, event.end, event.id, -1);
+        }
+    }
+
+    @Override
+    public int getFirstVisiblePosition() {
+        // TODO File bug!
+        // getFirstVisiblePosition doesn't always return the first visible
+        // item. Sometimes, it is above the visible one.
+        // instead. I loop through the viewgroup children and find the first
+        // visible one. BTW, getFirstVisiblePosition() == getChildAt(0). I
+        // am not looping through the entire list.
+       View v = getFirstVisibleView();
+       if (v != null) {
+           if (DEBUG) {
+               Log.v(TAG, "getFirstVisiblePosition: " + AgendaWindowAdapter.getViewTitle(v));
+           }
+           return getPositionForView(v);
+       }
+       return -1;
+    }
+
+    public View getFirstVisibleView() {
+        Rect r = new Rect();
+        int childCount = getChildCount();
+        for (int i = 0; i < childCount; ++i) {
+            View listItem = getChildAt(i);
+            listItem.getLocalVisibleRect(r);
+            if (r.top >= 0) { // if visible
+                return listItem;
+            }
+        }
+        return null;
+    }
+
+    public long getSelectedTime() {
+        int position = getSelectedItemPosition();
+        if (position >= 0) {
+            EventInfo event = mWindowAdapter.getEventByPosition(position);
+            if (event != null) {
+                return event.begin;
+            }
+        }
+        return getFirstVisibleTime();
+    }
+
+    public long getFirstVisibleTime() {
+        int position = getFirstVisiblePosition();
+        if (DEBUG) {
+            Log.v(TAG, "getFirstVisiblePosition = " + position);
+        }
+
+        EventInfo event = mWindowAdapter.getEventByPosition(position);
+        if (event != null) {
+            return event.begin;
+        }
+        return 0;
+    }
+
+    // Move the currently selected or visible focus down by offset amount.
+    // offset could be negative.
+    public void shiftSelection(int offset) {
+        shiftPosition(offset);
+        int position = getSelectedItemPosition();
+        if (position != INVALID_POSITION) {
+            setSelectionFromTop(position + offset, 0);
+        }
+    }
+
+    private void shiftPosition(int offset) {
+        if (DEBUG) {
+            Log.v(TAG, "Shifting position "+ offset);
+        }
+
+        View firstVisibleItem = getFirstVisibleView();
+
+        if (firstVisibleItem != null) {
+            Rect r = new Rect();
+            firstVisibleItem.getLocalVisibleRect(r);
+            // if r.top is < 0, getChildAt(0) and getFirstVisiblePosition() is
+            // returning an item above the first visible item.
+            int position = getPositionForView(firstVisibleItem);
+            setSelectionFromTop(position + offset, r.top > 0 ? -r.top : r.top);
+            if (DEBUG) {
+                if (firstVisibleItem.getTag() instanceof AgendaAdapter.ViewHolder) {
+                    ViewHolder viewHolder = (AgendaAdapter.ViewHolder)firstVisibleItem.getTag();
+                    Log.v(TAG, "Shifting from " + position + " by " + offset + ". Title "
+                            + viewHolder.title.getText());
+                } else if (firstVisibleItem.getTag() instanceof AgendaByDayAdapter.ViewHolder) {
+                    AgendaByDayAdapter.ViewHolder viewHolder =
+                        (AgendaByDayAdapter.ViewHolder)firstVisibleItem.getTag();
+                    Log.v(TAG, "Shifting from " + position + " by " + offset + ". Date  "
+                            + viewHolder.dateView.getText());
+                } else if (firstVisibleItem instanceof TextView) {
+                    Log.v(TAG, "Shifting: Looking at header here. " + getSelectedItemPosition());
+                }
+            }
+        } else if (getSelectedItemPosition() >= 0) {
+            if (DEBUG) {
+                Log.v(TAG, "Shifting selection from " + getSelectedItemPosition() + " by " + offset);
+            }
+            setSelection(getSelectedItemPosition() + offset);
+        }
+    }
+
+    public void setHideDeclinedEvents(boolean hideDeclined) {
+        mWindowAdapter.setHideDeclinedEvents(hideDeclined);
+    }
+
+    public void onResume() {
+        mWindowAdapter.notifyDataSetChanged();
+    }
+    public void onPause() {
+        mWindowAdapter.notifyDataSetInvalidated();
+    }
+}
diff --git a/res/layout/contact_item.xml b/res/layout/contact_item.xml
new file mode 100644 (file)
index 0000000000000000000000000000000000000000..9d4fb4651e0006bd50090a299794edf5c31a1067
--- /dev/null
@@ -0,0 +1,886 @@
+/*
+ * Copyright (C) 2009 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.calendar;
+
+import android.content.AsyncQueryHandler;
+import android.content.ContentResolver;
+import android.content.Context;
+import android.database.Cursor;
+import android.net.Uri;
+import android.provider.Calendar.Attendees;
+import android.provider.Calendar.Calendars;
+import android.provider.Calendar.Instances;
+import android.text.format.DateUtils;
+import android.text.format.Time;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.View.OnClickListener;
+import android.widget.BaseAdapter;
+import android.widget.TextView;
+
+import java.util.Formatter;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.Locale;
+import java.util.concurrent.ConcurrentLinkedQueue;
+
+/*
+Bugs Bugs Bugs:
+- At rotation and launch time, the initial position is not set properly. This code is calling
+ listview.setSelection() in 2 rapid secessions but it dropped or didn't process the first one.
+- Scroll using trackball isn't repositioning properly after a new adapter is added.
+- Track ball clicks at the header/footer doesn't work.
+- Potential ping pong effect if the prefetch window is big and data is limited
+- Add index in calendar provider
+
+ToDo ToDo ToDo:
+Get design of header and footer from designer
+
+Make scrolling smoother.
+Test for correctness
+Loading speed
+Check for leaks and excessive allocations
+ */
+
+public class AgendaWindowAdapter extends BaseAdapter {
+
+    static final boolean BASICLOG = false;
+    static final boolean DEBUGLOG = false;
+    private static String TAG = "AgendaWindowAdapter";
+
+    private static final String AGENDA_SORT_ORDER = "startDay ASC, begin ASC, title ASC";
+    public static final int INDEX_TITLE = 1;
+    public static final int INDEX_EVENT_LOCATION = 2;
+    public static final int INDEX_ALL_DAY = 3;
+    public static final int INDEX_HAS_ALARM = 4;
+    public static final int INDEX_COLOR = 5;
+    public static final int INDEX_RRULE = 6;
+    public static final int INDEX_BEGIN = 7;
+    public static final int INDEX_END = 8;
+    public static final int INDEX_EVENT_ID = 9;
+    public static final int INDEX_START_DAY = 10;
+    public static final int INDEX_END_DAY = 11;
+    public static final int INDEX_SELF_ATTENDEE_STATUS = 12;
+
+    private static final String[] PROJECTION = new String[] {
+            Instances._ID, // 0
+            Instances.TITLE, // 1
+            Instances.EVENT_LOCATION, // 2
+            Instances.ALL_DAY, // 3
+            Instances.HAS_ALARM, // 4
+            Instances.COLOR, // 5
+            Instances.RRULE, // 6
+            Instances.BEGIN, // 7
+            Instances.END, // 8
+            Instances.EVENT_ID, // 9
+            Instances.START_DAY, // 10 Julian start day
+            Instances.END_DAY, // 11 Julian end day
+            Instances.SELF_ATTENDEE_STATUS, // 12
+    };
+
+    // Listview may have a bug where the index/position is not consistent when there's a header.
+    // TODO Need to look into this.
+    private static final int OFF_BY_ONE_BUG = 1;
+
+    private static final int MAX_NUM_OF_ADAPTERS = 5;
+
+    private static final int IDEAL_NUM_OF_EVENTS = 50;
+
+    private static final int MIN_QUERY_DURATION = 7; // days
+
+    private static final int MAX_QUERY_DURATION = 60; // days
+
+    private static final int PREFETCH_BOUNDARY = 1;
+
+    // Times to auto-expand/retry query after getting no data
+    private static final int RETRIES_ON_NO_DATA = 0;
+
+    private Context mContext;
+
+    private QueryHandler mQueryHandler;
+
+    private AgendaListView mAgendaListView;
+
+    private int mRowCount; // The sum of the rows in all the adapters
+
+    private int mEmptyCursorCount;
+
+    private DayAdapterInfo mLastUsedInfo; // Cached value of the last used adapter.
+
+    private LinkedList<DayAdapterInfo> mAdapterInfos = new LinkedList<DayAdapterInfo>();
+
+    private ConcurrentLinkedQueue<QuerySpec> mQueryQueue = new ConcurrentLinkedQueue<QuerySpec>();
+
+    private TextView mHeaderView;
+
+    private TextView mFooterView;
+
+    private boolean mDoneSettingUpHeaderFooter = false;
+
+    /*
+     * When the user scrolled to the top, a query will be made for older events
+     * and this will be incremented. Don't make more requests if
+     * mOlderRequests > mOlderRequestsProcessed.
+     */
+    private int mOlderRequests;
+
+    // Number of "older" query that has been processed.
+    private int mOlderRequestsProcessed;
+
+    /*
+     * When the user scrolled to the bottom, a query will be made for newer
+     * events and this will be incremented. Don't make more requests if
+     * mNewerRequests > mNewerRequestsProcessed.
+     */
+    private int mNewerRequests;
+
+    // Number of "newer" query that has been processed.
+    private int mNewerRequestsProcessed;
+
+    // Note: Formatter is not thread safe. Fine for now as it is only used by the main thread.
+    private Formatter mFormatter;
+    private StringBuilder mStringBuilder;
+
+    private boolean mShuttingDown;
+    private boolean mHideDeclined;
+
+    // Types of Query
+    private static final int QUERY_TYPE_OLDER = 0; // Query for older events
+    private static final int QUERY_TYPE_NEWER = 1; // Query for newer events
+    private static final int QUERY_TYPE_CLEAN = 2; // Delete everything and query around a date
+
+    private static class QuerySpec {
+        long queryStartMillis;
+
+        Time goToTime;
+
+        int start;
+
+        int end;
+
+        int queryType;
+
+        public QuerySpec(int queryType) {
+            this.queryType = queryType;
+        }
+
+        @Override
+        public int hashCode() {
+            final int prime = 31;
+            int result = 1;
+            result = prime * result + end;
+            result = prime * result + (int) (queryStartMillis ^ (queryStartMillis >>> 32));
+            result = prime * result + queryType;
+            result = prime * result + start;
+            if (goToTime != null) {
+                long goToTimeMillis = goToTime.toMillis(false);
+                result = prime * result + (int) (goToTimeMillis ^ (goToTimeMillis >>> 32));
+            }
+            return result;
+        }
+
+        @Override
+        public boolean equals(Object obj) {
+            if (this == obj) return true;
+            if (obj == null) return false;
+            if (getClass() != obj.getClass()) return false;
+            QuerySpec other = (QuerySpec) obj;
+            if (end != other.end || queryStartMillis != other.queryStartMillis
+                    || queryType != other.queryType || start != other.start) {
+                return false;
+            }
+            if (goToTime != null) {
+                if (goToTime.toMillis(false) != other.goToTime.toMillis(false)) {
+                    return false;
+                }
+            } else {
+                if (other.goToTime != null) {
+                    return false;
+                }
+            }
+            return true;
+        }
+    }
+
+    static class EventInfo {
+        long begin;
+
+        long end;
+
+        long id;
+    }
+
+    static class DayAdapterInfo {
+        Cursor cursor;
+
+        AgendaByDayAdapter dayAdapter;
+
+        int start; // start day of the cursor's coverage
+
+        int end; // end day of the cursor's coverage
+
+        int offset; // offset in position in the list view
+
+        int size; // dayAdapter.getCount()
+
+        public DayAdapterInfo(Context context) {
+            dayAdapter = new AgendaByDayAdapter(context);
+        }
+
+        @Override
+        public String toString() {
+            Time time = new Time();
+            StringBuilder sb = new StringBuilder();
+            time.setJulianDay(start);
+            time.normalize(false);
+            sb.append("Start:").append(time.toString());
+            time.setJulianDay(end);
+            time.normalize(false);
+            sb.append(" End:").append(time.toString());
+            sb.append(" Offset:").append(offset);
+            sb.append(" Size:").append(size);
+            return sb.toString();
+        }
+    }
+
+    public AgendaWindowAdapter(AgendaActivity agendaActivity,
+            AgendaListView agendaListView) {
+        mContext = agendaActivity;
+        mAgendaListView = agendaListView;
+        mQueryHandler = new QueryHandler(agendaActivity.getContentResolver());
+
+        mStringBuilder = new StringBuilder(50);
+        mFormatter = new Formatter(mStringBuilder, Locale.getDefault());
+
+        LayoutInflater inflater = (LayoutInflater) agendaActivity
+                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
+        mHeaderView = (TextView)inflater.inflate(R.layout.agenda_header_footer, null);
+        mFooterView = (TextView)inflater.inflate(R.layout.agenda_header_footer, null);
+        mHeaderView.setText(R.string.loading);
+        mAgendaListView.addHeaderView(mHeaderView);
+    }
+
+    // Method in Adapter
+    @Override
+    public int getViewTypeCount() {
+        return AgendaByDayAdapter.TYPE_LAST;
+    }
+
+    // Method in BaseAdapter
+    @Override
+    public boolean areAllItemsEnabled() {
+        return false;
+    }
+
+    // Method in Adapter
+    @Override
+    public int getItemViewType(int position) {
+        DayAdapterInfo info = getAdapterInfoByPosition(position);
+        if (info != null) {
+            return info.dayAdapter.getItemViewType(position - info.offset);
+        } else {
+            return -1;
+        }
+    }
+
+    // Method in BaseAdapter
+    @Override
+    public boolean isEnabled(int position) {
+        DayAdapterInfo info = getAdapterInfoByPosition(position);
+        if (info != null) {
+            return info.dayAdapter.isEnabled(position - info.offset);
+        } else {
+            return false;
+        }
+    }
+
+    // Abstract Method in BaseAdapter
+    public int getCount() {
+        return mRowCount;
+    }
+
+    // Abstract Method in BaseAdapter
+    public Object getItem(int position) {
+        DayAdapterInfo info = getAdapterInfoByPosition(position);
+        if (info != null) {
+            return info.dayAdapter.getItem(position - info.offset);
+        } else {
+            return null;
+        }
+    }
+
+    // Method in BaseAdapter
+    @Override
+    public boolean hasStableIds() {
+        return true;
+    }
+
+    // Abstract Method in BaseAdapter
+    public long getItemId(int position) {
+        DayAdapterInfo info = getAdapterInfoByPosition(position);
+        if (info != null) {
+            return ((position - info.offset) << 20) + info.start ;
+        } else {
+            return -1;
+        }
+    }
+
+    // Abstract Method in BaseAdapter
+    public View getView(int position, View convertView, ViewGroup parent) {
+        if (position >= (mRowCount - PREFETCH_BOUNDARY)
+                && mNewerRequests <= mNewerRequestsProcessed) {
+            if (DEBUGLOG) Log.e(TAG, "queryForNewerEvents: ");
+            mNewerRequests++;
+            queueQuery(new QuerySpec(QUERY_TYPE_NEWER));
+        }
+
+        if (position < PREFETCH_BOUNDARY
+                && mOlderRequests <= mOlderRequestsProcessed) {
+            if (DEBUGLOG) Log.e(TAG, "queryForOlderEvents: ");
+            mOlderRequests++;
+            queueQuery(new QuerySpec(QUERY_TYPE_OLDER));
+        }
+
+        View v;
+        DayAdapterInfo info = getAdapterInfoByPosition(position);
+        if (info != null) {
+            v = info.dayAdapter.getView(position - info.offset, convertView,
+                    parent);
+        } else {
+            //TODO
+            Log.e(TAG, "BUG: getAdapterInfoByPosition returned null!!! " + position);
+            TextView tv = new TextView(mContext);
+            tv.setText("Bug! " + position);
+            v = tv;
+        }
+
+        if (DEBUGLOG) {
+            Log.e(TAG, "getView " + position + " = " + getViewTitle(v));
+        }
+        return v;
+    }
+
+    private int findDayPositionNearestTime(Time time) {
+        if (DEBUGLOG) Log.e(TAG, "findDayPositionNearestTime " + time);
+
+        DayAdapterInfo info = getAdapterInfoByTime(time);
+        if (info != null) {
+            return info.offset + info.dayAdapter.findDayPositionNearestTime(time);
+        } else {
+            return -1;
+        }
+    }
+
+    private DayAdapterInfo getAdapterInfoByPosition(int position) {
+        synchronized (mAdapterInfos) {
+            if (mLastUsedInfo != null && mLastUsedInfo.offset <= position
+                    && position < (mLastUsedInfo.offset + mLastUsedInfo.size)) {
+                return mLastUsedInfo;
+            }
+            for (DayAdapterInfo info : mAdapterInfos) {
+                if (info.offset <= position
+                        && position < (info.offset + info.size)) {
+                    mLastUsedInfo = info;
+                    return info;
+                }
+            }
+        }
+        return null;
+    }
+
+    private DayAdapterInfo getAdapterInfoByTime(Time time) {
+        if (DEBUGLOG) Log.e(TAG, "getAdapterInfoByTime " + time.toString());
+
+        Time tmpTime = new Time(time);
+        long timeInMillis = tmpTime.normalize(true);
+        int day = Time.getJulianDay(timeInMillis, tmpTime.gmtoff);
+        synchronized (mAdapterInfos) {
+            for (DayAdapterInfo info : mAdapterInfos) {
+                if (info.start <= day && day < info.end) {
+                    return info;
+                }
+            }
+        }
+        return null;
+    }
+
+    public EventInfo getEventByPosition(int position) {
+        if (DEBUGLOG) Log.e(TAG, "getEventByPosition " + position);
+
+        EventInfo event = new EventInfo();
+        position -= OFF_BY_ONE_BUG;
+        DayAdapterInfo info = getAdapterInfoByPosition(position);
+        if (info == null) {
+            return null;
+        }
+
+        position = info.dayAdapter.getCursorPosition(position - info.offset);
+        if (position == Integer.MIN_VALUE) {
+            return null;
+        }
+
+        boolean isDayHeader = false;
+        if (position < 0) {
+            position = -position;
+            isDayHeader = true;
+        }
+
+        if (position < info.cursor.getCount()) {
+            info.cursor.moveToPosition(position);
+            event.begin = info.cursor.getLong(AgendaWindowAdapter.INDEX_BEGIN);
+            boolean allDay = info.cursor.getInt(AgendaWindowAdapter.INDEX_ALL_DAY) != 0;
+
+            if (allDay) { // UTC
+                Time time = new Time();
+                time.setJulianDay(Time.getJulianDay(event.begin, 0));
+                event.begin = time.toMillis(false /* use isDst */);
+            } else if (isDayHeader) { // Trim to midnight.
+                Time time = new Time();
+                time.set(event.begin);
+                time.hour = 0;
+                time.minute = 0;
+                time.second = 0;
+                event.begin = time.toMillis(false /* use isDst */);
+            }
+
+            if (!isDayHeader) {
+                event.end = info.cursor.getLong(AgendaWindowAdapter.INDEX_END);
+                event.id = info.cursor.getLong(AgendaWindowAdapter.INDEX_EVENT_ID);
+            }
+            return event;
+        }
+        return null;
+    }
+
+    public void refresh(Time goToTime, boolean forced) {
+        if (DEBUGLOG) {
+            Log.e(TAG, "refresh " + goToTime.toString() + (forced ? " forced" : " not forced"));
+        }
+        
+        int startDay = Time.getJulianDay(goToTime.toMillis(false), goToTime.gmtoff);
+
+        if (!forced && isInRange(startDay, startDay)) {
+            // No need to requery
+            mAgendaListView.setSelection(findDayPositionNearestTime(goToTime) + OFF_BY_ONE_BUG);
+            return;
+        }
+
+        // Query for a total of MIN_QUERY_DURATION days
+        int endDay = startDay + MIN_QUERY_DURATION;
+
+        queueQuery(startDay, endDay, goToTime, QUERY_TYPE_CLEAN);
+    }
+
+    public void close() {
+        mShuttingDown = true;
+        pruneAdapterInfo(QUERY_TYPE_CLEAN);
+        if (mQueryHandler != null) {
+            mQueryHandler.cancelOperation(0);
+        }
+    }
+
+    private DayAdapterInfo pruneAdapterInfo(int queryType) {
+        synchronized (mAdapterInfos) {
+            DayAdapterInfo recycleMe = null;
+            if (!mAdapterInfos.isEmpty()) {
+                if (mAdapterInfos.size() >= MAX_NUM_OF_ADAPTERS) {
+                    if (queryType == QUERY_TYPE_NEWER) {
+                        recycleMe = mAdapterInfos.removeFirst();
+                    } else if (queryType == QUERY_TYPE_OLDER) {
+                        recycleMe = mAdapterInfos.removeLast();
+                        // Keep the size only if the oldest items are removed.
+                        recycleMe.size = 0;
+                    }
+                    if (recycleMe != null) {
+                        if (recycleMe.cursor != null) {
+                            recycleMe.cursor.close();
+                        }
+                        return recycleMe;
+                    }
+                }
+
+                if (mRowCount == 0 || queryType == QUERY_TYPE_CLEAN) {
+                    mRowCount = 0;
+                    int deletedRows = 0;
+                    DayAdapterInfo info;
+                    do {
+                        info = mAdapterInfos.poll();
+                        if (info != null) {
+                            info.cursor.close();
+                            deletedRows += info.size;
+                            recycleMe = info;
+                        }
+                    } while (info != null);
+
+                    if (recycleMe != null) {
+                        recycleMe.cursor = null;
+                        recycleMe.size = deletedRows;
+                    }
+                }
+            }
+            return recycleMe;
+        }
+    }
+
+    private String buildQuerySelection() {
+        // Respect the preference to show/hide declined events
+
+        if (mHideDeclined) {
+            return Calendars.SELECTED + "=1 AND "
+                    + Instances.SELF_ATTENDEE_STATUS + "!="
+                    + Attendees.ATTENDEE_STATUS_DECLINED;
+        } else {
+            return Calendars.SELECTED + "=1";
+        }
+    }
+
+    private Uri buildQueryUri(int start, int end) {
+        StringBuilder path = new StringBuilder();
+        path.append(start);
+        path.append('/');
+        path.append(end);
+        Uri uri = Uri.withAppendedPath(Instances.CONTENT_BY_DAY_URI, path.toString());
+        return uri;
+    }
+
+    private boolean isInRange(int start, int end) {
+        synchronized (mAdapterInfos) {
+            if (mAdapterInfos.isEmpty()) {
+                return false;
+            }
+            return mAdapterInfos.getFirst().start <= start && end <= mAdapterInfos.getLast().end;
+        }
+    }
+
+    private int calculateQueryDuration(int start, int end) {
+        int queryDuration = MAX_QUERY_DURATION;
+        if (mRowCount != 0) {
+            queryDuration = IDEAL_NUM_OF_EVENTS * (end - start + 1) / mRowCount;
+        }
+
+        if (queryDuration > MAX_QUERY_DURATION) {
+            queryDuration = MAX_QUERY_DURATION;
+        } else if (queryDuration < MIN_QUERY_DURATION) {
+            queryDuration = MIN_QUERY_DURATION;
+        }
+
+        return queryDuration;
+    }
+
+    private boolean queueQuery(int start, int end, Time goToTime, int queryType) {
+        QuerySpec queryData = new QuerySpec(queryType);
+        queryData.goToTime = goToTime;
+        queryData.start = start;
+        queryData.end = end;
+        return queueQuery(queryData);
+    }
+
+    private boolean queueQuery(QuerySpec queryData) {
+        Boolean queuedQuery;
+        synchronized (mQueryQueue) {
+            queuedQuery = false;
+            Boolean doQueryNow = mQueryQueue.isEmpty();
+            mQueryQueue.add(queryData);
+            queuedQuery = true;
+            if (doQueryNow) {
+                doQuery(queryData);
+            }
+        }
+        return queuedQuery;
+    }
+
+    private void doQuery(QuerySpec queryData) {
+        if (!mAdapterInfos.isEmpty()) {
+            int start = mAdapterInfos.getFirst().start;
+            int end = mAdapterInfos.getLast().end;
+            int queryDuration = calculateQueryDuration(start, end);
+            switch(queryData.queryType) {
+                case QUERY_TYPE_OLDER:
+                    queryData.end = start - 1;
+                    queryData.start = queryData.end - queryDuration;
+                    break;
+                case QUERY_TYPE_NEWER:
+                    queryData.start = end + 1;
+                    queryData.end = queryData.start + queryDuration;
+                    break;
+            }
+        }
+
+        if (BASICLOG) {
+            Time time = new Time();
+            time.setJulianDay(queryData.start);
+            Time time2 = new Time();
+            time2.setJulianDay(queryData.end);
+            Log.v(TAG, "startQuery: " + time.toString() + " to "
+                    + time2.toString() + " then go to " + queryData.goToTime);
+        }
+
+        mQueryHandler.cancelOperation(0);
+        if (BASICLOG) queryData.queryStartMillis = System.nanoTime();
+        mQueryHandler.startQuery(0, queryData, buildQueryUri(
+                queryData.start, queryData.end), PROJECTION,
+                buildQuerySelection(), null, AGENDA_SORT_ORDER);
+    }
+
+    private String formatDateString(int julianDay) {
+        Time time = new Time();
+        time.setJulianDay(julianDay);
+        long millis = time.toMillis(false);
+        mStringBuilder.setLength(0);
+        return DateUtils.formatDateRange(mContext, mFormatter, millis, millis,
+                DateUtils.FORMAT_SHOW_YEAR | DateUtils.FORMAT_SHOW_DATE
+                        | DateUtils.FORMAT_ABBREV_MONTH).toString();
+    }
+
+    private void updateHeaderFooter(final int start, final int end) {
+        mHeaderView.setText(mContext.getString(R.string.show_older_events,
+                formatDateString(start)));
+        mFooterView.setText(mContext.getString(R.string.show_newer_events,
+                formatDateString(end)));
+    }
+
+    private class QueryHandler extends AsyncQueryHandler {
+
+        public QueryHandler(ContentResolver cr) {
+            super(cr);
+        }
+
+        @Override
+        protected void onQueryComplete(int token, Object cookie, Cursor cursor) {
+            QuerySpec data = (QuerySpec)cookie;
+            if (BASICLOG) {
+                long queryEndMillis = System.nanoTime();
+                Log.e(TAG, "Query time(ms): "
+                        + (queryEndMillis - data.queryStartMillis) / 1000000
+                        + " Count: " + cursor.getCount());
+            }
+
+            if (mShuttingDown) {
+                cursor.close();
+                return;
+            }
+
+            // Notify Listview of changes and update position
+            int cursorSize = cursor.getCount();
+            if (cursorSize > 0 || mAdapterInfos.isEmpty()) {
+                final int listPositionOffset = processNewCursor(data, cursor);
+                if (data.goToTime == null) { // Typical Scrolling type query
+                    notifyDataSetChanged();
+                    if (listPositionOffset != 0) {
+                        mAgendaListView.shiftSelection(listPositionOffset);
+                    }
+                } else { // refresh() called. Go to the designated position
+                    final Time goToTime = data.goToTime;
+                    notifyDataSetChanged();
+                    int newPosition = findDayPositionNearestTime(goToTime);
+                    if (newPosition >= 0) {
+                        mAgendaListView.setSelection(newPosition + OFF_BY_ONE_BUG);
+                    }
+                    if (DEBUGLOG)
+                        Log.e(TAG, "Setting listview to " +
+                                       "findDayPositionNearestTime: " + (newPosition + OFF_BY_ONE_BUG));
+                }
+            } else {
+                cursor.close();
+            }
+
+            // Update header and footer
+            if (!mDoneSettingUpHeaderFooter) {
+                OnClickListener headerFooterOnClickListener = new OnClickListener() {
+                    public void onClick(View v) {
+                        if (v == mHeaderView) {
+                            queueQuery(new QuerySpec(QUERY_TYPE_OLDER));
+                        } else {
+                            queueQuery(new QuerySpec(QUERY_TYPE_NEWER));
+                        }
+                    }};
+                mHeaderView.setOnClickListener(headerFooterOnClickListener);
+                mFooterView.setOnClickListener(headerFooterOnClickListener);
+                mAgendaListView.addFooterView(mFooterView);
+                mDoneSettingUpHeaderFooter = true;
+            }
+            synchronized (mQueryQueue) {
+                int totalAgendaRangeStart = -1;
+                int totalAgendaRangeEnd = -1;
+
+                if (cursorSize != 0) {
+                    // Remove the query that just completed
+                    QuerySpec x = mQueryQueue.poll();
+                    if (BASICLOG && !x.equals(data)) {
+                        Log.e(TAG, "onQueryComplete - cookie != head of queue");
+                    }
+                    mEmptyCursorCount = 0;
+                    if (data.queryType == QUERY_TYPE_NEWER) {
+                        mNewerRequestsProcessed++;
+                    } else if (data.queryType == QUERY_TYPE_OLDER) {
+                        mOlderRequestsProcessed++;
+                    }
+
+                    totalAgendaRangeStart = mAdapterInfos.getFirst().start;
+                    totalAgendaRangeEnd = mAdapterInfos.getLast().end;
+                } else { // CursorSize == 0
+                    QuerySpec querySpec = mQueryQueue.peek();
+
+                    // Update Adapter Info with new start and end date range
+                    if (!mAdapterInfos.isEmpty()) {
+                        DayAdapterInfo first = mAdapterInfos.getFirst();
+                        DayAdapterInfo last = mAdapterInfos.getLast();
+
+                        if (first.start - 1 <= querySpec.end && querySpec.start < first.start) {
+                            first.start = querySpec.start;
+                        }
+
+                        if (querySpec.start <= last.end + 1 && last.end < querySpec.end) {
+                            last.end = querySpec.end;
+                        }
+
+                        totalAgendaRangeStart = first.start;
+                        totalAgendaRangeEnd = last.end;
+                    } else {
+                        totalAgendaRangeStart = querySpec.start;
+                        totalAgendaRangeEnd = querySpec.end;
+                    }
+
+                    // Update query specification with expanded search range
+                    // and maybe rerun query
+                    switch (querySpec.queryType) {
+                        case QUERY_TYPE_OLDER:
+                            totalAgendaRangeStart = querySpec.start;
+                            querySpec.start -= MAX_QUERY_DURATION;
+                            break;
+                        case QUERY_TYPE_NEWER:
+                            totalAgendaRangeEnd = querySpec.end;
+                            querySpec.end += MAX_QUERY_DURATION;
+                            break;
+                        case QUERY_TYPE_CLEAN:
+                            totalAgendaRangeStart = querySpec.start;
+                            totalAgendaRangeEnd = querySpec.end;
+                            querySpec.start -= MAX_QUERY_DURATION / 2;
+                            querySpec.end += MAX_QUERY_DURATION / 2;
+                            break;
+                    }
+
+                    if (++mEmptyCursorCount > RETRIES_ON_NO_DATA) {
+                        // Nothing in the cursor again. Dropping query
+                        mQueryQueue.poll();
+                    }
+                }
+
+                updateHeaderFooter(totalAgendaRangeStart, totalAgendaRangeEnd);
+
+                // Fire off the next query if any
+                Iterator<QuerySpec> it = mQueryQueue.iterator();
+                while (it.hasNext()) {
+                    QuerySpec queryData = it.next();
+                    if (!isInRange(queryData.start, queryData.end)) {
+                        // Query accepted
+                        if (DEBUGLOG) Log.e(TAG, "Query accepted. QueueSize:" + mQueryQueue.size());
+                        doQuery(queryData);
+                        break;
+                    } else {
+                        // Query rejected
+                        it.remove();
+                        if (DEBUGLOG) Log.e(TAG, "Query rejected. QueueSize:" + mQueryQueue.size());
+                    }
+                }
+            }
+            if (BASICLOG) {
+                for (DayAdapterInfo info3 : mAdapterInfos) {
+                    Log.e(TAG, "> " + info3.toString());
+                }
+            }
+        }
+
+        /*
+         * Update the adapter info array with a the new cursor. Close out old
+         * cursors as needed.
+         *
+         * @return number of rows removed from the beginning
+         */
+        private int processNewCursor(QuerySpec data, Cursor cursor) {
+            synchronized (mAdapterInfos) {
+                // Remove adapter info's from adapterInfos as needed
+                DayAdapterInfo info = pruneAdapterInfo(data.queryType);
+                int listPositionOffset = 0;
+                if (info == null) {
+                    info = new DayAdapterInfo(mContext);
+                } else {
+                    if (DEBUGLOG)
+                        Log.e(TAG, "processNewCursor listPositionOffsetA="
+                                + -info.size);
+                    listPositionOffset = -info.size;
+                }
+
+                // Setup adapter info
+                info.start = data.start;
+                info.end = data.end;
+                info.cursor = cursor;
+                info.dayAdapter.changeCursor(info);
+                info.size = info.dayAdapter.getCount();
+
+                // Insert into adapterInfos
+                if (mAdapterInfos.isEmpty()
+                        || data.end <= mAdapterInfos.getFirst().start) {
+                    mAdapterInfos.addFirst(info);
+                    listPositionOffset += info.size;
+                } else if (BASICLOG && data.start < mAdapterInfos.getLast().end) {
+                    mAdapterInfos.addLast(info);
+                    for (DayAdapterInfo info2 : mAdapterInfos) {
+                        Log.e("========== BUG ==", info2.toString());
+                    }
+                } else {
+                    mAdapterInfos.addLast(info);
+                }
+
+                // Update offsets in adapterInfos
+                mRowCount = 0;
+                for (DayAdapterInfo info3 : mAdapterInfos) {
+                    info3.offset = mRowCount;
+                    mRowCount += info3.size;
+                }
+                mLastUsedInfo = null;
+
+                return listPositionOffset;
+            }
+        }
+    }
+
+    static String getViewTitle(View x) {
+        String title = "";
+        if (x != null) {
+            Object yy = x.getTag();
+            if (yy instanceof AgendaAdapter.ViewHolder) {
+                TextView tv = ((AgendaAdapter.ViewHolder) yy).title;
+                if (tv != null) {
+                    title = (String) tv.getText();
+                }
+            } else if (yy != null) {
+                TextView dateView = ((AgendaByDayAdapter.ViewHolder) yy).dateView;
+                if (dateView != null) {
+                    title = (String) dateView.getText();
+                }
+            }
+        }
+        return title;
+    }
+
+    public void setHideDeclinedEvents(boolean hideDeclined) {
+        mHideDeclined = hideDeclined;
+    }
+}
index dcf91862be214e241933827e0317f99ec059bc27..2a041bf9b56b60482a1ae6ddd3580b037ed0e2c4 100644 (file)
@@ -219,7 +219,6 @@ public class AlertActivity extends Activity {
         a.recycle();
 
         getWindow().setAttributes(lp);
-        getWindow().addFlags(WindowManager.LayoutParams.FLAG_BLUR_BEHIND);
 
         mResolver = getContentResolver();
         mQueryHandler = new QueryHandler(mResolver);
index 558a8f6d25d5690d8173c512963cf017270bd380..29170a9797bfa8f8e29ac194155e37d39de9a202 100644 (file)
@@ -51,11 +51,11 @@ import android.view.View;
  */
 public class AlertService extends Service {
     private static final String TAG = "AlertService";
-    
+
     private volatile Looper mServiceLooper;
     private volatile ServiceHandler mServiceHandler;
-    
-    private static final String[] ALERT_PROJECTION = new String[] { 
+
+    private static final String[] ALERT_PROJECTION = new String[] {
         CalendarAlerts._ID,                     // 0
         CalendarAlerts.EVENT_ID,                // 1
         CalendarAlerts.STATE,                   // 2
@@ -69,10 +69,10 @@ public class AlertService extends Service {
     };
 
     // We just need a simple projection that returns any column
-    private static final String[] ALERT_PROJECTION_SMALL = new String[] { 
+    private static final String[] ALERT_PROJECTION_SMALL = new String[] {
         CalendarAlerts._ID,                     // 0
     };
-    
+
     private static final int ALERT_INDEX_ID = 0;
     private static final int ALERT_INDEX_EVENT_ID = 1;
     private static final int ALERT_INDEX_STATE = 2;
@@ -89,14 +89,30 @@ public class AlertService extends Service {
     private static final int INSTANCES_INDEX_END = 1;
 
     // We just need a simple projection that returns any column
-    private static final String[] REMINDER_PROJECTION_SMALL = new String[] { 
+    private static final String[] REMINDER_PROJECTION_SMALL = new String[] {
         Reminders._ID,                     // 0
     };
-    
+
+    private final boolean alarmsFiredRecently(ContentResolver cr) {
+        String selection = CalendarAlerts.RECEIVED_TIME + ">="
+                + (System.currentTimeMillis() - 10000);
+        String[] projection = new String[] { CalendarAlerts.ALARM_TIME };
+        Cursor cursor = cr.query(CalendarAlerts.CONTENT_URI, projection, selection, null, null);
+
+        boolean recentAlarms = false;
+        if (cursor != null) {
+            if (cursor.moveToFirst() && cursor.getCount() > 0) {
+                recentAlarms = true;
+            }
+            cursor.close();
+        }
+        return recentAlarms;
+    }
+
     @SuppressWarnings("deprecation")
     void processMessage(Message msg) {
         Bundle bundle = (Bundle) msg.obj;
-        
+
         // On reboot, update the notification bar with the contents of the
         // CalendarAlerts table.
         String action = bundle.getString("action");
@@ -112,19 +128,26 @@ public class AlertService extends Service {
             Log.d(TAG, "uri: " + alertUri);
         }
 
+        ContentResolver cr = getContentResolver();
+        boolean alarmsFiredRecently = alarmsFiredRecently(cr);
+
         if (alertUri != null) {
+            if (!Calendar.AUTHORITY.equals(alertUri.getAuthority())) {
+                Log.w(TAG, "Invalid AUTHORITY uri: " + alertUri);
+                return;
+            }
+
             // Record the received time in the CalendarAlerts table.
             // This is useful for finding bugs that cause alarms to be
             // missed or delayed.
             ContentValues values = new ContentValues();
             values.put(CalendarAlerts.RECEIVED_TIME, System.currentTimeMillis());
-            getContentResolver().update(alertUri, values, null /* where */, null /* args */);
+            cr.update(alertUri, values, null /* where */, null /* args */);
         }
-        
-        ContentResolver cr = getContentResolver();
+
         Cursor alertCursor = cr.query(alertUri, ALERT_PROJECTION,
                 null /* selection */, null, null /* sort order */);
-        
+
         long alertId, eventId, alarmTime;
         int minutes;
         String eventName;
@@ -146,9 +169,9 @@ public class AlertService extends Service {
             location = alertCursor.getString(ALERT_INDEX_EVENT_LOCATION);
             allDay = alertCursor.getInt(ALERT_INDEX_ALL_DAY) != 0;
             alarmTime = alertCursor.getLong(ALERT_INDEX_ALARM_TIME);
-            declined = alertCursor.getInt(ALERT_INDEX_SELF_ATTENDEE_STATUS) == 
+            declined = alertCursor.getInt(ALERT_INDEX_SELF_ATTENDEE_STATUS) ==
                     Attendees.ATTENDEE_STATUS_DECLINED;
-            
+
             // If the event was declined, then mark the alarm DISMISSED,
             // otherwise, mark the alarm FIRED.
             int newState = CalendarAlerts.FIRED;
@@ -162,7 +185,7 @@ public class AlertService extends Service {
                 alertCursor.close();
             }
         }
-        
+
         // Do not show an alert if the event was declined
         if (declined) {
             if (Log.isLoggable(TAG, Log.DEBUG)) {
@@ -170,10 +193,10 @@ public class AlertService extends Service {
             }
             return;
         }
-        
+
         long beginTime = bundle.getLong(Calendar.EVENT_BEGIN_TIME, 0);
         long endTime = bundle.getLong(Calendar.EVENT_END_TIME, 0);
-        
+
         // Check if this alarm is still valid.  The time of the event may
         // have been changed, or the reminder may have been changed since
         // this alarm was set. First, search for an instance in the Instances
@@ -200,7 +223,7 @@ public class AlertService extends Service {
                 instanceCursor.close();
             }
         }
-        
+
         // Check that a reminder for this event exists with the same number
         // of minutes.  But snoozed alarms have minutes = 0, so don't do this
         // check for snoozed alarms.
@@ -224,7 +247,7 @@ public class AlertService extends Service {
                 }
             }
         }
-        
+
         // If the event time was changed and the event has already ended,
         // then don't sound the alarm.
         if (alarmTime > instanceEnd) {
@@ -253,7 +276,7 @@ public class AlertService extends Service {
                 }
                 return;
             }
-            
+
             // Check for another alarm in the CalendarAlerts table that has the
             // same event id and the same "minutes".  This can occur
             // if the event start time was changed to an earlier time and the
@@ -283,11 +306,11 @@ public class AlertService extends Service {
                 }
             }
         }
-        
+
         // Find all the alerts that have fired but have not been dismissed
         selection = CalendarAlerts.STATE + "=" + CalendarAlerts.FIRED;
         alertCursor = CalendarAlerts.query(cr, ALERT_PROJECTION, selection, null);
-        
+
         if (alertCursor == null || alertCursor.getCount() == 0) {
             if (Log.isLoggable(TAG, Log.DEBUG)) {
                 Log.d(TAG, "no fired alarms found");
@@ -319,13 +342,13 @@ public class AlertService extends Service {
         } finally {
             alertCursor.close();
         }
-        
+
         if (Log.isLoggable(TAG, Log.DEBUG)) {
             Log.d(TAG, "creating new alarm notification, numReminders: " + numReminders);
         }
         Notification notification = AlertReceiver.makeNewAlertNotification(this, eventName,
                 location, numReminders);
-        
+
         // Generate either a pop-up dialog, status bar notification, or
         // neither. Pop-up dialog and status bar notification may include a
         // sound, an alert, or both. A status bar notification also includes
@@ -333,30 +356,44 @@ public class AlertService extends Service {
         SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
         String reminderType = prefs.getString(CalendarPreferenceActivity.KEY_ALERTS_TYPE,
                 CalendarPreferenceActivity.ALERT_TYPE_STATUS_BAR);
-        
+
         if (reminderType.equals(CalendarPreferenceActivity.ALERT_TYPE_OFF)) {
             if (Log.isLoggable(TAG, Log.DEBUG)) {
                 Log.d(TAG, "alert preference is OFF");
             }
             return;
         }
-        
-        NotificationManager nm = 
+
+        NotificationManager nm =
             (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
-        boolean reminderVibrate = 
+        boolean reminderVibrate =
                 prefs.getBoolean(CalendarPreferenceActivity.KEY_ALERTS_VIBRATE, false);
-        String reminderRingtone =
-                prefs.getString(CalendarPreferenceActivity.KEY_ALERTS_RINGTONE, null);
 
         // Possibly generate a vibration
         if (reminderVibrate) {
             notification.defaults |= Notification.DEFAULT_VIBRATE;
         }
-        
-        // Possibly generate a sound.  If 'Silent' is chosen, the ringtone string will be empty.
-        notification.sound = TextUtils.isEmpty(reminderRingtone) ? null : Uri
-                .parse(reminderRingtone);
-        
+
+        // Temp fix. If we sounded an notification recently, be quiet so the
+        // audio won't overlap.
+
+        // TODO Long term fix: CalendarProvider currently setup an alarm with
+        // AlarmManager for each event notification. So AlertService can post
+        // multiple notifications back to back if there are multiple alarms that
+        // fire at the same time. Instead of doing that, CalendarProvider should
+        // setup one alarm for each wake up time. AlertService can query for
+        // alerts table and update notification manager only once.
+        if (!alarmsFiredRecently) {
+            // Possibly generate a sound. If 'Silent' is chosen, the ringtone
+            // string will be empty.
+            String reminderRingtone = prefs.getString(
+                    CalendarPreferenceActivity.KEY_ALERTS_RINGTONE, null);
+            notification.sound = TextUtils.isEmpty(reminderRingtone) ? null : Uri
+                    .parse(reminderRingtone);
+        } else {
+            notification.sound = null;
+        }
+
         if (reminderType.equals(CalendarPreferenceActivity.ALERT_TYPE_ALERTS)) {
             Intent alertIntent = new Intent();
             alertIntent.setClass(this, AlertActivity.class);
@@ -366,17 +403,17 @@ public class AlertService extends Service {
             LayoutInflater inflater;
             inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
             View view = inflater.inflate(R.layout.alert_toast, null);
-            
+
             AlertAdapter.updateView(this, view, eventName, location, beginTime, endTime, allDay);
         }
-        
+
         // Record the notify time in the CalendarAlerts table.
         // This is used for debugging missed alarms.
         ContentValues values = new ContentValues();
         long currentTime = System.currentTimeMillis();
         values.put(CalendarAlerts.NOTIFY_TIME, currentTime);
         cr.update(alertUri, values, null /* where */, null /* args */);
-        
+
         // The notification time should be pretty close to the reminder time
         // that the user set for this event.  If the notification is late, then
         // that's a bug and we should log an error.
@@ -393,7 +430,7 @@ public class AlertService extends Service {
 
         nm.notify(0, notification);
     }
-    
+
     private void doTimeChanged() {
         ContentResolver cr = getContentResolver();
         Object service = getSystemService(Context.ALARM_SERVICE);
@@ -401,19 +438,19 @@ public class AlertService extends Service {
         CalendarAlerts.rescheduleMissedAlarms(cr, this, manager);
         AlertReceiver.updateAlertNotification(this);
     }
-    
+
     private final class ServiceHandler extends Handler {
         public ServiceHandler(Looper looper) {
             super(looper);
         }
-        
+
         @Override
         public void handleMessage(Message msg) {
             processMessage(msg);
             // NOTE: We MUST not call stopSelf() directly, since we need to
             // make sure the wake lock acquired by AlertReceiver is released.
             AlertReceiver.finishStartingService(AlertService.this, msg.arg1);
-        } 
+        }
     };
 
     @Override
@@ -421,17 +458,20 @@ public class AlertService extends Service {
         HandlerThread thread = new HandlerThread("AlertService",
                 Process.THREAD_PRIORITY_BACKGROUND);
         thread.start();
-        
+
         mServiceLooper = thread.getLooper();
         mServiceHandler = new ServiceHandler(mServiceLooper);
     }
 
     @Override
-    public void onStart(Intent intent, int startId) {
-        Message msg = mServiceHandler.obtainMessage();
-        msg.arg1 = startId;
-        msg.obj = intent.getExtras();
-        mServiceHandler.sendMessage(msg);
+    public int onStartCommand(Intent intent, int flags, int startId) {
+        if (intent != null) {
+            Message msg = mServiceHandler.obtainMessage();
+            msg.arg1 = startId;
+            msg.obj = intent.getExtras();
+            mServiceHandler.sendMessage(msg);
+        }
+        return START_REDELIVER_INTENT;
     }
 
     @Override
index 2bc991ab29ecf6199834be728f68a07dc76f5414..b44d519f77f4f336d754d45d1913b38aaf7501bc 100644 (file)
@@ -16,9 +16,6 @@
 
 package com.android.calendar;
 
-import dalvik.system.VMRuntime;
-
-import android.accounts.AccountMonitor;
 import android.app.Activity;
 import android.content.BroadcastReceiver;
 import android.content.ContentResolver;
@@ -41,6 +38,8 @@ import android.view.animation.TranslateAnimation;
 import android.widget.ProgressBar;
 import android.widget.ViewSwitcher;
 
+import dalvik.system.VMRuntime;
+
 /**
  * This is the base class for Day and Week Activities.
  */
@@ -53,8 +52,6 @@ public class CalendarActivity extends Activity implements Navigator {
 
     private ContentResolver mContentResolver;
 
-    private AccountMonitor mAccountMonitor;
-
     protected ProgressBar mProgressBar;
     protected ViewSwitcher mViewSwitcher;
     protected Animation mInAnimationForward;
@@ -103,7 +100,7 @@ public class CalendarActivity extends Activity implements Navigator {
 
         // Eliminate extra GCs during startup by setting the initial heap size to 4MB.
         // TODO: We should restore the old heap size once the activity reaches the idle state
-        long oldHeapSize = VMRuntime.getRuntime().setMinimumHeapSize(INITIAL_HEAP_SIZE);
+        VMRuntime.getRuntime().setMinimumHeapSize(INITIAL_HEAP_SIZE);
 
         setDefaultKeyMode(DEFAULT_KEYS_SHORTCUT);
         mContentResolver = getContentResolver();
@@ -128,6 +125,16 @@ public class CalendarActivity extends Activity implements Navigator {
     }
 
     @Override
+    protected void onNewIntent(Intent intent) {
+        long timeMillis = Utils.timeFromIntentInMillis(intent);
+        if (timeMillis > 0) {
+            Time time = new Time();
+            time.set(timeMillis);
+            goTo(time, false);
+        }
+    }
+
+    @Override
     protected void onResume() {
         super.onResume();
         mEventLoader.startBackgroundThread();
@@ -153,14 +160,6 @@ public class CalendarActivity extends Activity implements Navigator {
     }
 
     @Override
-    protected void onDestroy() {
-        if (mAccountMonitor != null) {
-            mAccountMonitor.close();
-        }
-        super.onDestroy();
-    }
-
-    @Override
     protected void onPause() {
         super.onPause();
         mContentResolver.unregisterContentObserver(mObserver);
@@ -184,15 +183,16 @@ public class CalendarActivity extends Activity implements Navigator {
     }
 
     /* Navigator interface methods */
-    public void goTo(Time time) {
-        CalendarView current = (CalendarView) mViewSwitcher.getCurrentView();
-
-        if (current.getSelectedTime().before(time)) {
-            mViewSwitcher.setInAnimation(mInAnimationForward);
-            mViewSwitcher.setOutAnimation(mOutAnimationForward);
-        } else {
-            mViewSwitcher.setInAnimation(mInAnimationBackward);
-            mViewSwitcher.setOutAnimation(mOutAnimationBackward);
+    public void goTo(Time time, boolean animate) {
+        if (animate) {
+            CalendarView current = (CalendarView) mViewSwitcher.getCurrentView();
+            if (current.getSelectedTime().before(time)) {
+                mViewSwitcher.setInAnimation(mInAnimationForward);
+                mViewSwitcher.setOutAnimation(mOutAnimationForward);
+            } else {
+                mViewSwitcher.setInAnimation(mInAnimationBackward);
+                mViewSwitcher.setOutAnimation(mOutAnimationBackward);
+            }
         }
 
         CalendarView next = (CalendarView) mViewSwitcher.getNextView();
@@ -260,7 +260,7 @@ public class CalendarActivity extends Activity implements Navigator {
         if (progress > 1.0f) {
             progress = 1.0f;
         }
-        
+
         float inFromXValue, inToXValue;
         float outFromXValue, outToXValue;
         if (forward) {
@@ -274,7 +274,7 @@ public class CalendarActivity extends Activity implements Navigator {
             outFromXValue = progress;
             outToXValue = 1.0f;
         }
-        
+
         // We have to allocate these animation objects each time we switch views
         // because that is the only way to set the animation parameters.
         TranslateAnimation inAnimation = new TranslateAnimation(
@@ -288,14 +288,14 @@ public class CalendarActivity extends Activity implements Navigator {
                 Animation.RELATIVE_TO_SELF, outToXValue,
                 Animation.ABSOLUTE, 0.0f,
                 Animation.ABSOLUTE, 0.0f);
-        
+
         // Reduce the animation duration based on how far we have already swiped.
         long duration = (long) (ANIMATION_DURATION * (1.0f - progress));
         inAnimation.setDuration(duration);
         outAnimation.setDuration(duration);
         mViewSwitcher.setInAnimation(inAnimation);
         mViewSwitcher.setOutAnimation(outAnimation);
-        
+
         CalendarView view = (CalendarView) mViewSwitcher.getCurrentView();
         view.cleanup();
         mViewSwitcher.showNext();
@@ -344,12 +344,6 @@ public class CalendarActivity extends Activity implements Navigator {
         }
 
         @Override
-        public void onShowPress(MotionEvent ev) {
-            CalendarView view = (CalendarView) mViewSwitcher.getCurrentView();
-            view.doShowPress(ev);
-        }
-
-        @Override
         public void onLongPress(MotionEvent ev) {
             CalendarView view = (CalendarView) mViewSwitcher.getCurrentView();
             view.doLongPress(ev);
index a3dad951779262cdc5c391edba3fa3cbf20745c8..424e422916339b0cfbe106218d5bbaac45b2e5f3 100644 (file)
@@ -32,7 +32,7 @@ public class CalendarApplication extends Application {
      * points to the first element in the list (the most recently visited
      * screen).
      */
-    /* package */ class Screen {
+    static class Screen {
         public int id;
         public Screen next;
         public Screen previous;
index 8db673be58489608de7c892f3c58ba961647ab36..6716edf957ff19e8f350cebb2816e5c38b9e8034 100644 (file)
@@ -74,6 +74,8 @@ import java.util.regex.Pattern;
 public class CalendarView extends View
         implements View.OnCreateContextMenuListener, View.OnClickListener {
 
+    private static float mScale = 0; // Used for supporting different screen densities
+
     private boolean mOnFlingCalled;
 
     protected CalendarApplication mCalendarApp;
@@ -82,8 +84,10 @@ public class CalendarView extends View
     private static final String[] CALENDARS_PROJECTION = new String[] {
         Calendars._ID,          // 0
         Calendars.ACCESS_LEVEL, // 1
+        Calendars.OWNER_ACCOUNT, // 2
     };
     private static final int CALENDARS_INDEX_ACCESS_LEVEL = 1;
+    private static final int CALENDARS_INDEX_OWNER_ACCOUNT = 2;
     private static final String CALENDARS_WHERE = Calendars._ID + "=%d";
 
     private static final String[] ATTENDEES_PROJECTION = new String[] {
@@ -93,7 +97,7 @@ public class CalendarView extends View
     private static final int ATTENDEES_INDEX_RELATIONSHIP = 1;
     private static final String ATTENDEES_WHERE = Attendees.EVENT_ID + "=%d";
 
-    private static final float SMALL_ROUND_RADIUS = 3.0F;
+    private static float SMALL_ROUND_RADIUS = 3.0F;
 
     private static final int FROM_NONE = 0;
     private static final int FROM_ABOVE = 1;
@@ -101,11 +105,11 @@ public class CalendarView extends View
     private static final int FROM_LEFT = 4;
     private static final int FROM_RIGHT = 8;
 
-    private static final int HORIZONTAL_SCROLL_THRESHOLD = 50;
+    private static int HORIZONTAL_SCROLL_THRESHOLD = 50;
 
     private ContinueScroll mContinueScroll = new ContinueScroll();
 
-    private class DayHeader{
+    static private class DayHeader{
         int cell;
         String dateString;
     }
@@ -145,7 +149,6 @@ public class CalendarView extends View
     boolean mSelectionAllDay;
 
     private int mCellWidth;
-    private boolean mLaunchNewView;
 
     // Pre-allocate these objects and re-use them
     private Rect mRect = new Rect();
@@ -179,10 +182,10 @@ public class CalendarView extends View
 
     private static final int DAY_GAP = 1;
     private static final int HOUR_GAP = 1;
-    private static final int SINGLE_ALLDAY_HEIGHT = 20;
-    private static final int MAX_ALLDAY_HEIGHT = 72;
-    private static final int ALLDAY_TOP_MARGIN = 3;
-    private static final int MAX_ALLDAY_EVENT_HEIGHT = 18;
+    private static int SINGLE_ALLDAY_HEIGHT = 20;
+    private static int MAX_ALLDAY_HEIGHT = 72;
+    private static int ALLDAY_TOP_MARGIN = 3;
+    private static int MAX_ALLDAY_EVENT_HEIGHT = 18;
     
     /* The extra space to leave above the text in all-day events */
     private static final int ALL_DAY_TEXT_TOP_MARGIN = 0;
@@ -200,13 +203,13 @@ public class CalendarView extends View
     /* package */ static final int MILLIS_PER_HOUR = (3600 * 1000);
     /* package */ static final int MILLIS_PER_DAY = MILLIS_PER_HOUR * 24;
 
-    private static final int NORMAL_FONT_SIZE = 12;
-    private static final int EVENT_TEXT_FONT_SIZE = 12;
-    private static final int HOURS_FONT_SIZE = 12;
-    private static final int AMPM_FONT_SIZE = 9;
-    private static final int MIN_CELL_WIDTH_FOR_TEXT = 10;
+    private static int NORMAL_FONT_SIZE = 12;
+    private static int EVENT_TEXT_FONT_SIZE = 12;
+    private static int HOURS_FONT_SIZE = 12;
+    private static int AMPM_FONT_SIZE = 9;
+    private static int MIN_CELL_WIDTH_FOR_TEXT = 27;
     private static final int MAX_EVENT_TEXT_LEN = 500;
-    private static final float MIN_EVENT_HEIGHT = 15.0F;  // in pixels
+    private static float MIN_EVENT_HEIGHT = 15.0F;  // in pixels
 
     private static int mSelectionColor;
     private static int mPressedColor;
@@ -307,9 +310,30 @@ public class CalendarView extends View
 
     private String mDateRange;
     private TextView mTitleTextView;
-    
+
     public CalendarView(CalendarActivity activity) {
         super(activity);
+        if (mScale == 0) {
+            mScale = getContext().getResources().getDisplayMetrics().density;
+            if (mScale != 1) {
+                SINGLE_ALLDAY_HEIGHT *= mScale;
+                MAX_ALLDAY_HEIGHT *= mScale;
+                ALLDAY_TOP_MARGIN *= mScale;
+                MAX_ALLDAY_EVENT_HEIGHT *= mScale;
+
+                NORMAL_FONT_SIZE *= mScale;
+                EVENT_TEXT_FONT_SIZE *= mScale;
+                HOURS_FONT_SIZE *= mScale;
+                AMPM_FONT_SIZE *= mScale;
+                MIN_CELL_WIDTH_FOR_TEXT *= mScale;
+                MIN_EVENT_HEIGHT *= mScale;
+
+                HORIZONTAL_SCROLL_THRESHOLD *= mScale;
+                SMALL_ROUND_RADIUS *= mScale;
+            }
+        }
+
         mResources = activity.getResources();
         mEventLoader = activity.mEventLoader;
         mEventGeometry = new EventGeometry();
@@ -812,8 +836,7 @@ public class CalendarView extends View
                 } else {
                     // Switch to the Day/Agenda view.
                     long millis = getSelectedTimeInMillis();
-                    MenuHelper.switchTo(mParentActivity, mDetailedView, millis);
-                    mParentActivity.finish();
+                    Utils.startActivity(mParentActivity, mDetailedView, millis);
                 }
             }
         } else {
@@ -875,6 +898,13 @@ public class CalendarView extends View
                     performLongClick();
                 }
                 break;
+            case KeyEvent.KEYCODE_BACK:
+                if (event.isTracking() && !event.isCanceled()) {
+                    mPopup.dismiss();
+                    mParentActivity.finish();
+                    return true;
+                }
+                break;
         }
         return super.onKeyUp(keyCode, event);
     }
@@ -924,9 +954,11 @@ public class CalendarView extends View
             switchViews(true /* trackball or keyboard */);
             return true;
         case KeyEvent.KEYCODE_BACK:
-            mPopup.dismiss();
-            mParentActivity.finish();
-            return true;
+            if (event.getRepeatCount() == 0) {
+                event.startTracking();
+                return true;
+            }
+            return super.onKeyDown(keyCode, event);
         case KeyEvent.KEYCODE_DPAD_LEFT:
             if (mSelectedEvent != null) {
                 mSelectedEvent = mSelectedEvent.nextLeft;
@@ -2303,21 +2335,10 @@ public class CalendarView extends View
         mTouchMode = TOUCH_MODE_DOWN;
         mViewStartX = 0;
         mOnFlingCalled = false;
-        mLaunchNewView = false;
         getHandler().removeCallbacks(mContinueScroll);
     }
 
     void doSingleTapUp(MotionEvent ev) {
-        mSelectionMode = SELECTION_SELECTED;
-        mRedrawScreen = true;
-        invalidate();
-        if (mLaunchNewView) {
-            mLaunchNewView = false;
-            switchViews(false /* not the trackball */);
-        }
-    }
-
-    void doShowPress(MotionEvent ev) {
         int x = (int) ev.getX();
         int y = (int) ev.getY();
         Event selectedEvent = mSelectedEvent;
@@ -2326,29 +2347,41 @@ public class CalendarView extends View
 
         boolean validPosition = setSelectionFromPosition(x, y);
         if (!validPosition) {
+            // return if the touch wasn't on an area of concern
             return;
         }
 
-        mSelectionMode = SELECTION_PRESSED;
+        mSelectionMode = SELECTION_SELECTED;
         mRedrawScreen = true;
         invalidate();
 
-        // If the tap is on an already selected event or hour slot,
-        // then launch a new view.  Otherwise, just select the event.
-        if (selectedEvent != null && selectedEvent == mSelectedEvent) {
-            // Launch the "View event" view when the finger lifts up,
-            // unless the finger moves before lifting up.
-            mLaunchNewView = true;
-        } else if (selectedEvent == null && selectedDay == mSelectionDay
+        boolean launchNewView = false;
+        if (mSelectedEvent != null) {
+            // If the tap is on an event, launch the "View event" view
+            launchNewView = true;
+        } else if (mSelectedEvent == null && selectedDay == mSelectionDay
                 && selectedHour == mSelectionHour) {
-            // Launch the Day/Agenda view when the finger lifts up,
-            // unless the finger moves before lifting up.
-            mLaunchNewView = true;
+            // If the tap is on an already selected hour slot,
+            // then launch the Day/Agenda view. Otherwise, just select the hour
+            // slot.
+            launchNewView = true;
+        }
+
+        if (launchNewView) {
+            switchViews(false /* not the trackball */);
         }
     }
 
     void doLongPress(MotionEvent ev) {
-        mLaunchNewView = false;
+        int x = (int) ev.getX();
+        int y = (int) ev.getY();
+
+        boolean validPosition = setSelectionFromPosition(x, y);
+        if (!validPosition) {
+            // return if the touch wasn't on an area of concern
+            return;
+        }
+
         mSelectionMode = SELECTION_LONGPRESS;
         mRedrawScreen = true;
         invalidate();
@@ -2356,7 +2389,6 @@ public class CalendarView extends View
     }
 
     void doScroll(MotionEvent e1, MotionEvent e2, float deltaX, float deltaY) {
-        mLaunchNewView = false;
         // Use the distance from the current point to the initial touch instead
         // of deltaX and deltaY to avoid accumulating floating-point rounding
         // errors.  Also, we don't need floats, we can use ints.
@@ -2684,14 +2716,12 @@ public class CalendarView extends View
                 }
                 case MenuHelper.MENU_DAY: {
                     long startMillis = getSelectedTimeInMillis();
-                    MenuHelper.switchTo(mParentActivity, DayActivity.class.getName(), startMillis);
-                    mParentActivity.finish();
+                    Utils.startActivity(mParentActivity, DayActivity.class.getName(), startMillis);
                     break;
                 }
                 case MenuHelper.MENU_AGENDA: {
                     long startMillis = getSelectedTimeInMillis();
-                    MenuHelper.switchTo(mParentActivity, AgendaActivity.class.getName(), startMillis);
-                    mParentActivity.finish();
+                    Utils.startActivity(mParentActivity, AgendaActivity.class.getName(), startMillis);
                     break;
                 }
                 case MenuHelper.MENU_EVENT_CREATE: {
@@ -2746,25 +2776,23 @@ public class CalendarView extends View
         String where = String.format(CALENDARS_WHERE, calId);
         cursor = cr.query(uri, CALENDARS_PROJECTION, where, null, null);
 
+        String calendarOwnerAccount = null;
         if (cursor != null) {
             cursor.moveToFirst();
             visibility = cursor.getInt(CALENDARS_INDEX_ACCESS_LEVEL);
+            calendarOwnerAccount = cursor.getString(CALENDARS_INDEX_OWNER_ACCOUNT);
             cursor.close();
         }
+        
+        if (visibility < Calendars.CONTRIBUTOR_ACCESS) {
+            return false;
+        }
 
-        // Attendees cursor
-        uri = Attendees.CONTENT_URI;
-        where = String.format(ATTENDEES_WHERE, e.id);
-        Cursor attendeesCursor = cr.query(uri, ATTENDEES_PROJECTION, where, null, null);
-        if (attendeesCursor != null) {
-            if (attendeesCursor.moveToFirst()) {
-                relationship = attendeesCursor.getInt(ATTENDEES_INDEX_RELATIONSHIP);
-            }
-            attendeesCursor.close();
+        if (e.guestsCanModify) {
+            return true;
         }
 
-        return visibility >= Calendars.CONTRIBUTOR_ACCESS &&
-                relationship >= Attendees.RELATIONSHIP_ORGANIZER;
+        return !TextUtils.isEmpty(calendarOwnerAccount) && calendarOwnerAccount.equals(e.organizer);
     }
 
     /**
index 51f965b883c34f6363cd5b482062f4feb4494968..e2bf14cb81a789d4089b9aa346c455a6468cb5d4 100644 (file)
@@ -16,9 +16,7 @@
 
 package com.android.calendar;
 
-import android.content.SharedPreferences;
 import android.os.Bundle;
-import android.preference.PreferenceManager;
 import android.view.View;
 import android.view.ViewGroup.LayoutParams;
 import android.widget.ProgressBar;
@@ -42,16 +40,6 @@ public class DayActivity extends CalendarActivity implements ViewSwitcher.ViewFa
         mViewSwitcher.setFactory(this);
         mViewSwitcher.getCurrentView().requestFocus();
         mProgressBar = (ProgressBar) findViewById(R.id.progress_circular);
-
-        // Record Day View as the (new) default detailed view.
-        String activityString = CalendarApplication.ACTIVITY_NAMES[CalendarApplication.DAY_VIEW_ID];
-        SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
-        SharedPreferences.Editor editor = prefs.edit();
-        editor.putString(CalendarPreferenceActivity.KEY_DETAILED_VIEW, activityString);
-
-        // Record Day View as the (new) start view
-        editor.putString(CalendarPreferenceActivity.KEY_START_VIEW, activityString);
-        editor.commit();
     }
 
     public View makeView() {
@@ -68,5 +56,8 @@ public class DayActivity extends CalendarActivity implements ViewSwitcher.ViewFa
         super.onPause();
         CalendarView view = (CalendarView) mViewSwitcher.getCurrentView();
         mSelectedDay = view.getSelectedDay();
+
+        // Record Day View as the (new) default detailed view.
+        Utils.setDefaultView(this, CalendarApplication.DAY_VIEW_ID);
     }
 }
index d0693fa9bfa3cd7b756b8ed87a28f2ca1c5c6364..bf27a9e5494611d07934f04d158758f2b6d2fac9 100644 (file)
@@ -52,8 +52,6 @@ import android.widget.Button;
  * {@link #delete()} multiple times).
  */
 public class DeleteEventHelper {
-    
-    private static final String TAG = "DeleteEventHelper";
     private final Activity mParent;
     private final ContentResolver mContentResolver;
     
index ce545fa437950bf5c595e031f09b6ad6bf3e422e..943841948953dd34e290b3f0aa74a2b4759979d6 100644 (file)
@@ -18,6 +18,11 @@ package com.android.calendar;
 
 import static android.provider.Calendar.EVENT_BEGIN_TIME;
 import static android.provider.Calendar.EVENT_END_TIME;
+
+import android.accounts.Account;
+import android.accounts.AccountManager;
+import android.accounts.AuthenticatorException;
+import android.accounts.OperationCanceledException;
 import android.app.Activity;
 import android.app.AlertDialog;
 import android.app.DatePickerDialog;
@@ -26,30 +31,41 @@ import android.app.TimePickerDialog;
 import android.app.DatePickerDialog.OnDateSetListener;
 import android.app.TimePickerDialog.OnTimeSetListener;
 import android.content.AsyncQueryHandler;
+import android.content.ContentProviderOperation;
+import android.content.ContentProviderResult;
 import android.content.ContentResolver;
 import android.content.ContentUris;
 import android.content.ContentValues;
 import android.content.Context;
 import android.content.DialogInterface;
 import android.content.Intent;
+import android.content.OperationApplicationException;
 import android.content.SharedPreferences;
+import android.content.ContentProviderOperation.Builder;
 import android.content.DialogInterface.OnCancelListener;
 import android.content.DialogInterface.OnClickListener;
 import android.content.res.Resources;
 import android.database.Cursor;
 import android.net.Uri;
 import android.os.Bundle;
+import android.os.RemoteException;
 import android.pim.EventRecurrence;
 import android.preference.PreferenceManager;
+import android.provider.Calendar.Attendees;
 import android.provider.Calendar.Calendars;
 import android.provider.Calendar.Events;
 import android.provider.Calendar.Reminders;
+import android.text.Editable;
+import android.text.InputFilter;
 import android.text.TextUtils;
 import android.text.format.DateFormat;
 import android.text.format.DateUtils;
 import android.text.format.Time;
+import android.text.util.Rfc822InputFilter;
+import android.text.util.Rfc822Token;
+import android.text.util.Rfc822Tokenizer;
+import android.text.util.Rfc822Validator;
 import android.util.Log;
-import android.view.KeyEvent;
 import android.view.LayoutInflater;
 import android.view.Menu;
 import android.view.MenuItem;
@@ -62,19 +78,28 @@ import android.widget.CompoundButton;
 import android.widget.DatePicker;
 import android.widget.ImageButton;
 import android.widget.LinearLayout;
+import android.widget.MultiAutoCompleteTextView;
 import android.widget.ResourceCursorAdapter;
 import android.widget.Spinner;
 import android.widget.TextView;
 import android.widget.TimePicker;
 import android.widget.Toast;
 
+import com.google.android.googlelogin.GoogleLoginServiceConstants;
+
+import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Calendar;
+import java.util.HashSet;
+import java.util.LinkedHashSet;
 import java.util.TimeZone;
 
 public class EditEvent extends Activity implements View.OnClickListener,
         DialogInterface.OnCancelListener, DialogInterface.OnClickListener {
+    private static final String TAG = "EditEvent";
+    private static final boolean DEBUG = false;
+
     /**
      * This is the symbolic name for the key used to pass in the boolean
      * for creating all-day events that is part of the extra data of the intent.
@@ -94,20 +119,22 @@ public class EditEvent extends Activity implements View.OnClickListener,
     private static final int MENU_HIDE_EXTRA_OPTIONS = 3;
 
     private static final String[] EVENT_PROJECTION = new String[] {
-            Events._ID,             // 0
-            Events.TITLE,           // 1
-            Events.DESCRIPTION,     // 2
-            Events.EVENT_LOCATION,  // 3
-            Events.ALL_DAY,         // 4
-            Events.HAS_ALARM,       // 5
-            Events.CALENDAR_ID,     // 6
-            Events.DTSTART,         // 7
-            Events.DURATION,        // 8
-            Events.EVENT_TIMEZONE,  // 9
-            Events.RRULE,           // 10
-            Events._SYNC_ID,        // 11
-            Events.TRANSPARENCY,    // 12
-            Events.VISIBILITY,      // 13
+            Events._ID,               // 0
+            Events.TITLE,             // 1
+            Events.DESCRIPTION,       // 2
+            Events.EVENT_LOCATION,    // 3
+            Events.ALL_DAY,           // 4
+            Events.HAS_ALARM,         // 5
+            Events.CALENDAR_ID,       // 6
+            Events.DTSTART,           // 7
+            Events.DURATION,          // 8
+            Events.EVENT_TIMEZONE,    // 9
+            Events.RRULE,             // 10
+            Events._SYNC_ID,          // 11
+            Events.TRANSPARENCY,      // 12
+            Events.VISIBILITY,        // 13
+            Events.OWNER_ACCOUNT,     // 14
+            Events.HAS_ATTENDEE_DATA, // 15
     };
     private static final int EVENT_INDEX_ID = 0;
     private static final int EVENT_INDEX_TITLE = 1;
@@ -123,14 +150,16 @@ public class EditEvent extends Activity implements View.OnClickListener,
     private static final int EVENT_INDEX_SYNC_ID = 11;
     private static final int EVENT_INDEX_TRANSPARENCY = 12;
     private static final int EVENT_INDEX_VISIBILITY = 13;
+    private static final int EVENT_INDEX_OWNER_ACCOUNT = 14;
+    private static final int EVENT_INDEX_HAS_ATTENDEE_DATA = 15;
 
     private static final String[] CALENDARS_PROJECTION = new String[] {
-            Calendars._ID,          // 0
-            Calendars.DISPLAY_NAME, // 1
-            Calendars.TIMEZONE,     // 2
+            Calendars._ID,           // 0
+            Calendars.DISPLAY_NAME,  // 1
+            Calendars.OWNER_ACCOUNT, // 2
     };
     private static final int CALENDARS_INDEX_DISPLAY_NAME = 1;
-    private static final int CALENDARS_INDEX_TIMEZONE = 2;
+    private static final int CALENDARS_INDEX_OWNER_ACCOUNT = 2;
     private static final String CALENDARS_WHERE = Calendars.ACCESS_LEVEL + ">=" +
             Calendars.CONTRIBUTOR_ACCESS + " AND " + Calendars.SYNC_EVENTS + "=1";
 
@@ -143,6 +172,17 @@ public class EditEvent extends Activity implements View.OnClickListener,
             Reminders.METHOD + "=" + Reminders.METHOD_ALERT + " OR " + Reminders.METHOD + "=" +
             Reminders.METHOD_DEFAULT + ")";
 
+    private static final String[] ATTENDEES_PROJECTION = new String[] {
+        Attendees.ATTENDEE_NAME,            // 0
+        Attendees.ATTENDEE_EMAIL,           // 1
+    };
+    private static final int ATTENDEES_INDEX_NAME = 0;
+    private static final int ATTENDEES_INDEX_EMAIL = 1;
+    private static final String ATTENDEES_WHERE = Attendees.EVENT_ID + "=? AND "
+            + Attendees.ATTENDEE_RELATIONSHIP + "<>" + Attendees.RELATIONSHIP_ORGANIZER;
+    private static final String ATTENDEES_DELETE_PREFIX = Attendees.EVENT_ID + "=? AND " +
+            Attendees.ATTENDEE_EMAIL + " IN (";
+
     private static final int DOES_NOT_REPEAT = 0;
     private static final int REPEATS_DAILY = 1;
     private static final int REPEATS_EVERY_WEEKDAY = 2;
@@ -156,7 +196,7 @@ public class EditEvent extends Activity implements View.OnClickListener,
     private static final int MODIFY_SELECTED = 1;
     private static final int MODIFY_ALL = 2;
     private static final int MODIFY_ALL_FOLLOWING = 3;
-    
+
     private static final int DAY_IN_SECONDS = 24 * 60 * 60;
 
     private int mFirstDayOfWeek; // cached in onCreate
@@ -184,6 +224,13 @@ public class EditEvent extends Activity implements View.OnClickListener,
     private LinearLayout mExtraOptions;
     private ArrayList<Integer> mOriginalMinutes = new ArrayList<Integer>();
     private ArrayList<LinearLayout> mReminderItems = new ArrayList<LinearLayout>(0);
+    private Rfc822Validator mEmailValidator;
+    private MultiAutoCompleteTextView mAttendeesList;
+    private EmailAddressAdapter mAddressAdapter;
+    private String mOriginalAttendees = "";
+
+    // Used to control the visibility of the Guests textview. Default to true
+    private boolean mHasAttendeeData = true;
 
     private EventRecurrence mEventRecurrence = new EventRecurrence();
     private String mRrule;
@@ -192,6 +239,7 @@ public class EditEvent extends Activity implements View.OnClickListener,
     private ProgressDialog mLoadingCalendarsDialog;
     private AlertDialog mNoCalendarsDialog;
     private ContentValues mInitialValues;
+    private String mOwnerAccount;
 
     /**
      * If the repeating event is created on the phone and it hasn't been
@@ -214,7 +262,8 @@ public class EditEvent extends Activity implements View.OnClickListener,
 
     private DeleteEventHelper mDeleteEventHelper;
     private QueryHandler mQueryHandler;
-    
+    private AccountManager mAccountManager;
+
     /* This class is used to update the time buttons. */
     private class TimeListener implements OnTimeSetListener {
         private View mView;
@@ -350,7 +399,7 @@ public class EditEvent extends Activity implements View.OnClickListener,
         }
     }
 
-    private class CalendarsAdapter extends ResourceCursorAdapter {
+    static private class CalendarsAdapter extends ResourceCursorAdapter {
         public CalendarsAdapter(Context context, Cursor c) {
             super(context, R.layout.calendars_item, c);
             setDropDownViewResource(R.layout.calendars_dropdown_item);
@@ -373,7 +422,7 @@ public class EditEvent extends Activity implements View.OnClickListener,
             }
             return;
         }
-        
+
         if (v == mDeleteButton) {
             long begin = mStartTime.toMillis(false /* use isDst */);
             long end = mEndTime.toMillis(false /* use isDst */);
@@ -392,12 +441,12 @@ public class EditEvent extends Activity implements View.OnClickListener,
             mDeleteEventHelper.delete(begin, end, mEventCursor, which);
             return;
         }
-        
+
         if (v == mDiscardButton) {
             finish();
             return;
         }
-        
+
         // This must be a click on one of the "remove reminder" buttons
         LinearLayout reminderItem = (LinearLayout) v.getParent();
         LinearLayout parent = (LinearLayout) reminderItem.getParent();
@@ -426,7 +475,7 @@ public class EditEvent extends Activity implements View.OnClickListener,
             finish();
         }
     }
-    
+
     private class QueryHandler extends AsyncQueryHandler {
         public QueryHandler(ContentResolver cr) {
             super(cr);
@@ -442,7 +491,7 @@ public class EditEvent extends Activity implements View.OnClickListener,
             } else {
                 mCalendarsCursor = cursor;
                 startManagingCursor(cursor);
-                
+
                 // Stop the spinner
                 getWindow().setFeatureInt(Window.FEATURE_INDETERMINATE_PROGRESS,
                         Window.PROGRESS_VISIBILITY_OFF);
@@ -454,7 +503,7 @@ public class EditEvent extends Activity implements View.OnClickListener,
                     if (mSaveAfterQueryComplete) {
                         mLoadingCalendarsDialog.cancel();
                     }
-                    
+
                     // Create an error message for the user that, when clicked,
                     // will exit this activity without saving the event.
                     AlertDialog.Builder builder = new AlertDialog.Builder(EditEvent.this);
@@ -467,24 +516,97 @@ public class EditEvent extends Activity implements View.OnClickListener,
                     return;
                 }
 
+                int primaryCalendarPosition = findPrimaryCalendarPosition();
+
                 // populate the calendars spinner
                 CalendarsAdapter adapter = new CalendarsAdapter(EditEvent.this, mCalendarsCursor);
                 mCalendarsSpinner.setAdapter(adapter);
+                mCalendarsSpinner.setSelection(primaryCalendarPosition);
                 mCalendarsQueryComplete = true;
                 if (mSaveAfterQueryComplete) {
                     mLoadingCalendarsDialog.cancel();
                     save();
                     finish();
                 }
+
+                // Find user domain and set it to the validator.
+                // TODO: we may want to update this validator if the user actually picks
+                // a different calendar.  maybe not.  depends on what we want for the
+                // user experience.  this may change when we add support for multiple
+                // accounts, anyway.
+                if (mHasAttendeeData && cursor.moveToPosition(primaryCalendarPosition)) {
+                    String ownEmail = cursor.getString(CALENDARS_INDEX_OWNER_ACCOUNT);
+                    if (ownEmail != null) {
+                        String domain = extractDomain(ownEmail);
+                        if (domain != null) {
+                            mEmailValidator = new Rfc822Validator(domain);
+                            mAttendeesList.setValidator(mEmailValidator);
+                        }
+                    }
+                }
+            }
+        }
+
+        // Find the calendar position in the cursor that matches the signed-in
+        // account
+        private int findPrimaryCalendarPosition() {
+            int primaryCalendarPosition = -1;
+            try {
+                Account[] accounts = mAccountManager.getAccountsByTypeAndFeatures(
+                        GoogleLoginServiceConstants.ACCOUNT_TYPE, new String[] {
+                            GoogleLoginServiceConstants.FEATURE_LEGACY_HOSTED_OR_GOOGLE
+                        }, null, null).getResult();
+                if (accounts.length > 0) {
+                    for (int i = 0; i < accounts.length && primaryCalendarPosition == -1; ++i) {
+                        String name = accounts[i].name;
+                        if (name == null) {
+                            continue;
+                        }
+
+                        int position = 0;
+                        mCalendarsCursor.moveToPosition(-1);
+                        while (mCalendarsCursor.moveToNext()) {
+                            if (name.equals(mCalendarsCursor
+                                    .getString(CALENDARS_INDEX_OWNER_ACCOUNT))) {
+                                primaryCalendarPosition = position;
+                                break;
+                            }
+                            position++;
+                        }
+                    }
+                }
+            } catch (OperationCanceledException e) {
+                Log.w(TAG, "Ignoring unexpected exception", e);
+            } catch (IOException e) {
+                Log.w(TAG, "Ignoring unexpected exception", e);
+            } catch (AuthenticatorException e) {
+                Log.w(TAG, "Ignoring unexpected exception", e);
+            } finally {
+                if (primaryCalendarPosition != -1) {
+                    return primaryCalendarPosition;
+                } else {
+                    return 0;
+                }
             }
         }
     }
 
+    private static String extractDomain(String email) {
+        int separator = email.lastIndexOf('@');
+        if (separator != -1 && ++separator < email.length()) {
+            return email.substring(separator);
+        }
+        return null;
+    }
+
     @Override
     protected void onCreate(Bundle icicle) {
         super.onCreate(icicle);
         requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
         setContentView(R.layout.edit_event);
+        mAccountManager = AccountManager.get(this);
+
+        boolean newEvent = false;
 
         mFirstDayOfWeek = Calendar.getInstance().getFirstDayOfWeek();
 
@@ -506,15 +628,25 @@ public class EditEvent extends Activity implements View.OnClickListener,
         long begin = intent.getLongExtra(EVENT_BEGIN_TIME, 0);
         long end = intent.getLongExtra(EVENT_END_TIME, 0);
 
+        String domain = "gmail.com";
+
         boolean allDay = false;
         if (mEventCursor != null) {
             // The event already exists so fetch the all-day status
             mEventCursor.moveToFirst();
+            mHasAttendeeData = mEventCursor.getInt(EVENT_INDEX_HAS_ATTENDEE_DATA) != 0;
             allDay = mEventCursor.getInt(EVENT_INDEX_ALL_DAY) != 0;
             String rrule = mEventCursor.getString(EVENT_INDEX_RRULE);
             String timezone = mEventCursor.getString(EVENT_INDEX_TIMEZONE);
             long calendarId = mEventCursor.getInt(EVENT_INDEX_CALENDAR_ID);
-            
+            mOwnerAccount = mEventCursor.getString(EVENT_INDEX_OWNER_ACCOUNT);
+            if (!TextUtils.isEmpty(mOwnerAccount)) {
+                String ownerDomain = extractDomain(mOwnerAccount);
+                if (ownerDomain != null) {
+                    domain = ownerDomain;
+                }
+            }
+
             // Remember the initial values
             mInitialValues = new ContentValues();
             mInitialValues.put(EVENT_BEGIN_TIME, begin);
@@ -524,10 +656,11 @@ public class EditEvent extends Activity implements View.OnClickListener,
             mInitialValues.put(Events.EVENT_TIMEZONE, timezone);
             mInitialValues.put(Events.CALENDAR_ID, calendarId);
         } else {
+            newEvent = true;
             // We are creating a new event, so set the default from the
             // intent (if specified).
             allDay = intent.getBooleanExtra(EVENT_ALL_DAY, false);
-            
+
             // Start the spinner
             getWindow().setFeatureInt(Window.FEATURE_INDETERMINATE_PROGRESS,
                     Window.PROGRESS_VISIBILITY_ON);
@@ -584,6 +717,14 @@ public class EditEvent extends Activity implements View.OnClickListener,
         mRemindersContainer = (LinearLayout) findViewById(R.id.reminder_items_container);
         mExtraOptions = (LinearLayout) findViewById(R.id.extra_options_container);
 
+        if (mHasAttendeeData) {
+            mAddressAdapter = new EmailAddressAdapter(this);
+            mEmailValidator = new Rfc822Validator(domain);
+            mAttendeesList = initMultiAutoCompleteTextView(R.id.attendees);
+        } else {
+            findViewById(R.id.attendees_group).setVisibility(View.GONE);
+        }
+
         mAllDayCheckBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
             public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                 if (isChecked) {
@@ -648,14 +789,20 @@ public class EditEvent extends Activity implements View.OnClickListener,
                 prefs.getString(CalendarPreferenceActivity.KEY_DEFAULT_REMINDER, "0");
         mDefaultReminderMinutes = Integer.parseInt(durationString);
 
+        if (newEvent && mDefaultReminderMinutes != 0) {
+            addReminder(this, this, mReminderItems, mReminderValues,
+                    mReminderLabels, mDefaultReminderMinutes);
+        }
+
+        long eventId = (mEventCursor == null) ? -1 : mEventCursor.getLong(EVENT_INDEX_ID);
+        ContentResolver cr = getContentResolver();
+
         // Reminders cursor
         boolean hasAlarm = (mEventCursor != null)
                 && (mEventCursor.getInt(EVENT_INDEX_HAS_ALARM) != 0);
         if (hasAlarm) {
             Uri uri = Reminders.CONTENT_URI;
-            long eventId = mEventCursor.getLong(EVENT_INDEX_ID);
             String where = String.format(REMINDERS_WHERE, eventId);
-            ContentResolver cr = getContentResolver();
             Cursor reminderCursor = cr.query(uri, REMINDERS_PROJECTION, where, null, null);
             try {
                 // First pass: collect all the custom reminder minutes (e.g.,
@@ -664,7 +811,7 @@ public class EditEvent extends Activity implements View.OnClickListener,
                     int minutes = reminderCursor.getInt(REMINDERS_INDEX_MINUTES);
                     EditEvent.addMinutesToList(this, mReminderValues, mReminderLabels, minutes);
                 }
-                
+
                 // Second pass: create the reminder spinners
                 reminderCursor.moveToPosition(-1);
                 while (reminderCursor.moveToNext()) {
@@ -684,45 +831,109 @@ public class EditEvent extends Activity implements View.OnClickListener,
             public void onClick(View v) {
                 addReminder();
             }
-        };        
+        };
         ImageButton reminderRemoveButton = (ImageButton) findViewById(R.id.reminder_add);
         reminderRemoveButton.setOnClickListener(addReminderOnClickListener);
 
         mDeleteEventHelper = new DeleteEventHelper(this, true /* exit when done */);
 
+       // Attendees cursor
+        if (mHasAttendeeData && eventId != -1) {
+            Uri uri = Attendees.CONTENT_URI;
+            String[] whereArgs = {Long.toString(eventId)};
+            Cursor attendeeCursor = cr.query(uri, ATTENDEES_PROJECTION, ATTENDEES_WHERE, whereArgs,
+                    null);
+            try {
+                StringBuilder b = new StringBuilder();
+                while (attendeeCursor.moveToNext()) {
+                    String name = attendeeCursor.getString(ATTENDEES_INDEX_NAME);
+                    String email = attendeeCursor.getString(ATTENDEES_INDEX_EMAIL);
+                    if (email != null) {
+                        if (name != null && name.length() > 0 && !name.equals(email)) {
+                            b.append('"').append(name).append("\" ");
+                        }
+                        b.append('<').append(email).append(">, ");
+                    }
+                }
+                if (b.length() > 0) {
+                    mOriginalAttendees = b.toString();
+                    mAttendeesList.setText(mOriginalAttendees);
+                }
+            } finally {
+                attendeeCursor.close();
+            }
+        }
         if (mEventCursor == null) {
             // Allow the intent to specify the fields in the event.
             // This will allow other apps to create events easily.
             initFromIntent(intent);
         }
     }
-    
+
+    private LinkedHashSet<Rfc822Token> getAddressesFromList(MultiAutoCompleteTextView list) {
+        list.clearComposingText();
+        LinkedHashSet<Rfc822Token> addresses = new LinkedHashSet<Rfc822Token>();
+        Rfc822Tokenizer.tokenize(list.getText(), addresses);
+
+        // validate the emails, out of paranoia.  they should already be
+        // validated on input, but drop any invalid emails just to be safe.
+        for (Rfc822Token address : addresses) {
+            if (!mEmailValidator.isValid(address.getAddress())) {
+                Log.w(TAG, "Dropping invalid attendee email address: " + address);
+                addresses.remove(address);
+            }
+        }
+        return addresses;
+    }
+
+    // From com.google.android.gm.ComposeActivity
+    private MultiAutoCompleteTextView initMultiAutoCompleteTextView(int res) {
+        MultiAutoCompleteTextView list = (MultiAutoCompleteTextView) findViewById(res);
+        list.setAdapter(mAddressAdapter);
+        list.setTokenizer(new Rfc822Tokenizer());
+        list.setValidator(mEmailValidator);
+
+        // NOTE: assumes no other filters are set
+        list.setFilters(sRecipientFilters);
+
+        return list;
+    }
+
+    /**
+     * From com.google.android.gm.ComposeActivity
+     * Implements special address cleanup rules:
+     * The first space key entry following an "@" symbol that is followed by any combination
+     * of letters and symbols, including one+ dots and zero commas, should insert an extra
+     * comma (followed by the space).
+     */
+    private static InputFilter[] sRecipientFilters = new InputFilter[] { new Rfc822InputFilter() };
+
     private void initFromIntent(Intent intent) {
         String title = intent.getStringExtra(Events.TITLE);
         if (title != null) {
             mTitleTextView.setText(title);
         }
-        
+
         String location = intent.getStringExtra(Events.EVENT_LOCATION);
         if (location != null) {
             mLocationTextView.setText(location);
         }
-        
+
         String description = intent.getStringExtra(Events.DESCRIPTION);
         if (description != null) {
             mDescriptionTextView.setText(description);
         }
-        
+
         int availability = intent.getIntExtra(Events.TRANSPARENCY, -1);
         if (availability != -1) {
             mAvailabilitySpinner.setSelection(availability);
         }
-        
+
         int visibility = intent.getIntExtra(Events.VISIBILITY, -1);
         if (visibility != -1) {
             mVisibilitySpinner.setSelection(visibility);
         }
-        
+
         String rrule = intent.getStringExtra(Events.RRULE);
         if (rrule != null) {
             mRrule = rrule;
@@ -741,7 +952,7 @@ public class EditEvent extends Activity implements View.OnClickListener,
                 return;
             }
         }
-        
+
         if (mEventCursor != null) {
             Cursor cursor = mEventCursor;
             cursor.moveToFirst();
@@ -795,7 +1006,7 @@ public class EditEvent extends Activity implements View.OnClickListener,
                                 } else if (which == 2) {
                                     mModification = MODIFY_ALL_FOLLOWING;
                                 }
-                                
+
                                 // If we are modifying all the events in a
                                 // series then disable and ignore the date.
                                 if (mModification == MODIFY_ALL) {
@@ -819,26 +1030,23 @@ public class EditEvent extends Activity implements View.OnClickListener,
             // since we can't change the calendar.
             View calendarGroup = findViewById(R.id.calendar_group);
             calendarGroup.setVisibility(View.GONE);
-        } else if (Time.isEpoch(mStartTime) && Time.isEpoch(mEndTime)) {
-            mStartTime.setToNow();
-
-            // Round the time to the nearest half hour.
-            mStartTime.second = 0;
-            int minute = mStartTime.minute;
-            if (minute > 0 && minute <= 30) {
-                mStartTime.minute = 30;
-            } else {
-                mStartTime.minute = 0;
-                mStartTime.hour += 1;
-            }
-
-            long startMillis = mStartTime.normalize(true /* ignore isDst */);
-            mEndTime.set(startMillis + DateUtils.HOUR_IN_MILLIS);
         } else {
-            // New event - set the default reminder
-            if (mDefaultReminderMinutes != 0) {
-                addReminder(this, this, mReminderItems, mReminderValues,
-                        mReminderLabels, mDefaultReminderMinutes);
+            // New event
+            if (Time.isEpoch(mStartTime) && Time.isEpoch(mEndTime)) {
+                mStartTime.setToNow();
+
+                // Round the time to the nearest half hour.
+                mStartTime.second = 0;
+                int minute = mStartTime.minute;
+                if (minute > 0 && minute <= 30) {
+                    mStartTime.minute = 30;
+                } else {
+                    mStartTime.minute = 0;
+                    mStartTime.hour += 1;
+                }
+
+                long startMillis = mStartTime.normalize(true /* ignore isDst */);
+                mEndTime.set(startMillis + DateUtils.HOUR_IN_MILLIS);
             }
 
             // Hide delete button
@@ -919,23 +1127,18 @@ public class EditEvent extends Activity implements View.OnClickListener,
     }
 
     @Override
-    public boolean onKeyDown(int keyCode, KeyEvent event) {
-        switch (keyCode) {
-            case KeyEvent.KEYCODE_BACK:
-                // If we are creating a new event, do not create it if the
-                // title, location and description are all empty, in order to
-                // prevent accidental "no subject" event creations.
-                if (mUri != null || !isEmpty()) {
-                    if (!save()) {
-                        // We cannot exit this activity because the calendars
-                        // are still loading.
-                        return true;
-                    }
-                }
-                break;
+    public void onBackPressed() {
+        // If we are creating a new event, do not create it if the
+        // title, location and description are all empty, in order to
+        // prevent accidental "no subject" event creations.
+        if (mUri != null || !isEmpty()) {
+            if (!save()) {
+                // We cannot exit this activity because the calendars
+                // are still loading.
+                return;
+            }
         }
-
-        return super.onKeyDown(keyCode, event);
+        finish();
     }
 
     private void populateWhen() {
@@ -1069,7 +1272,7 @@ public class EditEvent extends Activity implements View.OnClickListener,
         LinearLayout parent = (LinearLayout) activity.findViewById(R.id.reminder_items_container);
         LinearLayout reminderItem = (LinearLayout) inflater.inflate(R.layout.edit_reminder_item, null);
         parent.addView(reminderItem);
-        
+
         Spinner spinner = (Spinner) reminderItem.findViewById(R.id.reminder_value);
         Resources res = activity.getResources();
         spinner.setPrompt(res.getString(R.string.reminders_label));
@@ -1077,7 +1280,7 @@ public class EditEvent extends Activity implements View.OnClickListener,
         ArrayAdapter<String> adapter = new ArrayAdapter<String>(activity, resource, labels);
         adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
         spinner.setAdapter(adapter);
-        
+
         ImageButton reminderRemoveButton;
         reminderRemoveButton = (ImageButton) reminderItem.findViewById(R.id.reminder_remove);
         reminderRemoveButton.setOnClickListener(listener);
@@ -1088,17 +1291,17 @@ public class EditEvent extends Activity implements View.OnClickListener,
 
         return true;
     }
-    
+
     static void addMinutesToList(Context context, ArrayList<Integer> values,
             ArrayList<String> labels, int minutes) {
         int index = values.indexOf(minutes);
         if (index != -1) {
             return;
         }
-        
+
         // The requested "minutes" does not exist in the list, so insert it
         // into the list.
-        
+
         String label = constructReminderLabel(context, minutes, false);
         int len = values.size();
         for (int i = 0; i < len; i++) {
@@ -1108,14 +1311,14 @@ public class EditEvent extends Activity implements View.OnClickListener,
                 return;
             }
         }
-        
+
         values.add(minutes);
         labels.add(len, label);
     }
-    
+
     /**
      * Finds the index of the given "minutes" in the "values" list.
-     * 
+     *
      * @param values the list of minutes corresponding to the spinner choices
      * @param minutes the minutes to search for in the values list
      * @return the index of "minutes" in the "values" list
@@ -1129,7 +1332,7 @@ public class EditEvent extends Activity implements View.OnClickListener,
         }
         return index;
     }
-    
+
     // Constructs a label given an arbitrary number of minutes.  For example,
     // if the given minutes is 63, then this returns the string "63 minutes".
     // As another example, if the given minutes is 120, then this returns
@@ -1137,7 +1340,7 @@ public class EditEvent extends Activity implements View.OnClickListener,
     static String constructReminderLabel(Context context, int minutes, boolean abbrev) {
         Resources resources = context.getResources();
         int value, resId;
-        
+
         if (minutes % 60 != 0) {
             value = minutes;
             if (abbrev) {
@@ -1185,7 +1388,7 @@ public class EditEvent extends Activity implements View.OnClickListener,
     // Saves the event.  Returns true if it is okay to exit this activity.
     private boolean save() {
         boolean forceSaveReminders = false;
-        
+
         // If we are creating a new event, then make sure we wait until the
         // query to fetch the list of calendars has finished.
         if (mEventCursor == null) {
@@ -1215,30 +1418,42 @@ public class EditEvent extends Activity implements View.OnClickListener,
             Toast.makeText(this, R.string.saving_event, Toast.LENGTH_SHORT).show();
         }
 
-        ContentResolver cr = getContentResolver();
+        ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
+        int eventIdIndex = -1;
+
         ContentValues values = getContentValuesFromUi();
         Uri uri = mUri;
 
+        // Update the "hasAlarm" field for the event
+        ArrayList<Integer> reminderMinutes = reminderItemsToMinutes(mReminderItems,
+                mReminderValues);
+        int len = reminderMinutes.size();
+        values.put(Events.HAS_ALARM, (len > 0) ? 1 : 0);
+
         // For recurring events, we must make sure that we use duration rather
         // than dtend.
         if (uri == null) {
+            // Add hasAttendeeData for a new event
+            values.put(Events.HAS_ATTENDEE_DATA, 1);
             // Create new event with new contents
             addRecurrenceRule(values);
-            uri = cr.insert(Events.CONTENT_URI, values);
+            eventIdIndex = ops.size();
+            Builder b = ContentProviderOperation.newInsert(Events.CONTENT_URI).withValues(values);
+            ops.add(b.build());
             forceSaveReminders = true;
 
         } else if (mRrule == null) {
             // Modify contents of a non-repeating event
             addRecurrenceRule(values);
             checkTimeDependentFields(values);
-            cr.update(uri, values, null, null);
-            
+            ops.add(ContentProviderOperation.newUpdate(uri).withValues(values).build());
+
         } else if (mInitialValues.getAsString(Events.RRULE) == null) {
             // This event was changed from a non-repeating event to a
             // repeating event.
             addRecurrenceRule(values);
             values.remove(Events.DTEND);
-            cr.update(uri, values, null, null);
+            ops.add(ContentProviderOperation.newUpdate(uri).withValues(values).build());
 
         } else if (mModification == MODIFY_SELECTED) {
             // Modify contents of the current instance of repeating event
@@ -1250,7 +1465,9 @@ public class EditEvent extends Activity implements View.OnClickListener,
             boolean allDay = mInitialValues.getAsInteger(Events.ALL_DAY) != 0;
             values.put(Events.ORIGINAL_ALL_DAY, allDay ? 1 : 0);
 
-            uri = cr.insert(Events.CONTENT_URI, values);
+            eventIdIndex = ops.size();
+            Builder b = ContentProviderOperation.newInsert(Events.CONTENT_URI).withValues(values);
+            ops.add(b.build());
             forceSaveReminders = true;
 
         } else if (mModification == MODIFY_ALL_FOLLOWING) {
@@ -1263,56 +1480,185 @@ public class EditEvent extends Activity implements View.OnClickListener,
                 // then delete the whole series.  Otherwise, update the series
                 // to end at the new start time.
                 if (isFirstEventInSeries()) {
-                    cr.delete(uri, null, null);
+                    ops.add(ContentProviderOperation.newDelete(uri).build());
                 } else {
                     // Update the current repeating event to end at the new
                     // start time.
-                    updatePastEvents(cr, uri);
+                    updatePastEvents(ops, uri);
                 }
-                uri = cr.insert(Events.CONTENT_URI, values);
+                eventIdIndex = ops.size();
+                ops.add(ContentProviderOperation.newInsert(Events.CONTENT_URI).withValues(values)
+               &nb