summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--AndroidManifest.xml11
-rw-r--r--res/drawable/app_icon_blank.pngbin0 -> 2425 bytes
-rw-r--r--res/drawable/bg_calendar.9.pngbin0 -> 842 bytes
-rw-r--r--res/drawable/bg_calendar_primary.9.pngbin0 -> 642 bytes
-rw-r--r--res/drawable/ic_date_01.pngbin0 -> 465 bytes
-rw-r--r--res/drawable/ic_date_02.pngbin0 -> 550 bytes
-rw-r--r--res/drawable/ic_date_03.pngbin0 -> 548 bytes
-rw-r--r--res/drawable/ic_date_04.pngbin0 -> 519 bytes
-rw-r--r--res/drawable/ic_date_05.pngbin0 -> 555 bytes
-rw-r--r--res/drawable/ic_date_06.pngbin0 -> 556 bytes
-rw-r--r--res/drawable/ic_date_07.pngbin0 -> 502 bytes
-rw-r--r--res/drawable/ic_date_08.pngbin0 -> 564 bytes
-rw-r--r--res/drawable/ic_date_09.pngbin0 -> 554 bytes
-rw-r--r--res/drawable/ic_date_10.pngbin0 -> 760 bytes
-rw-r--r--res/drawable/ic_date_11.pngbin0 -> 668 bytes
-rw-r--r--res/drawable/ic_date_12.pngbin0 -> 746 bytes
-rw-r--r--res/drawable/ic_date_13.pngbin0 -> 772 bytes
-rw-r--r--res/drawable/ic_date_14.pngbin0 -> 722 bytes
-rw-r--r--res/drawable/ic_date_15.pngbin0 -> 749 bytes
-rw-r--r--res/drawable/ic_date_16.pngbin0 -> 768 bytes
-rw-r--r--res/drawable/ic_date_17.pngbin0 -> 722 bytes
-rw-r--r--res/drawable/ic_date_18.pngbin0 -> 783 bytes
-rw-r--r--res/drawable/ic_date_19.pngbin0 -> 773 bytes
-rw-r--r--res/drawable/ic_date_20.pngbin0 -> 834 bytes
-rw-r--r--res/drawable/ic_date_21.pngbin0 -> 756 bytes
-rw-r--r--res/drawable/ic_date_22.pngbin0 -> 824 bytes
-rw-r--r--res/drawable/ic_date_23.pngbin0 -> 822 bytes
-rw-r--r--res/drawable/ic_date_24.pngbin0 -> 813 bytes
-rw-r--r--res/drawable/ic_date_25.pngbin0 -> 818 bytes
-rw-r--r--res/drawable/ic_date_26.pngbin0 -> 850 bytes
-rw-r--r--res/drawable/ic_date_27.pngbin0 -> 777 bytes
-rw-r--r--res/drawable/ic_date_28.pngbin0 -> 832 bytes
-rw-r--r--res/drawable/ic_date_29.pngbin0 -> 826 bytes
-rw-r--r--res/drawable/ic_date_30.pngbin0 -> 850 bytes
-rw-r--r--res/drawable/ic_date_31.pngbin0 -> 785 bytes
-rw-r--r--res/drawable/strip_cal_secondary.9.pngbin0 -> 2820 bytes
-rw-r--r--res/drawable/white_list_rule_cal.9.pngbin0 -> 345 bytes
-rw-r--r--res/layout-land/gadget_item.xml164
-rw-r--r--res/layout/gadget_item.xml192
-rw-r--r--res/values-cs/strings.xml9
-rw-r--r--res/values-de/strings.xml9
-rw-r--r--res/values-es/strings.xml11
-rw-r--r--res/values-fr/arrays.xml8
-rw-r--r--res/values-fr/strings.xml29
-rw-r--r--res/values-it/arrays.xml2
-rw-r--r--res/values-it/strings.xml25
-rw-r--r--res/values-ja/strings.xml9
-rw-r--r--res/values-ko/strings.xml9
-rw-r--r--res/values-nb/strings.xml9
-rw-r--r--res/values-nl/strings.xml13
-rw-r--r--res/values-pl/arrays.xml14
-rw-r--r--res/values-pl/strings.xml23
-rw-r--r--res/values-ru/strings.xml9
-rw-r--r--res/values-zh-rCN/strings.xml9
-rw-r--r--res/values-zh-rTW/strings.xml9
-rw-r--r--res/values/colors.xml8
-rw-r--r--res/values/strings.xml21
-rw-r--r--res/xml/gadget_info.xml23
-rw-r--r--src/com/android/calendar/CalendarGadgetProvider.java563
-rw-r--r--src/com/android/calendar/CalendarView.java56
-rw-r--r--src/com/android/calendar/SelectCalendarsActivity.java6
-rw-r--r--tests/src/com/android/calendar/FormatDateRangeTest.java113
62 files changed, 1220 insertions, 134 deletions
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 93638499..da9daf0d 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -52,8 +52,7 @@
<activity android:name="DayActivity" android:label="@string/day_view"
android:theme="@android:style/Theme.Light.NoTitleBar" />
<activity android:name="AgendaActivity" android:label="@string/agenda_view"
- android:theme="@android:style/Theme.Light.NoTitleBar"
- android:exported="true" />
+ android:theme="@android:style/Theme.Light.NoTitleBar" />
<activity android:name="EditEvent" android:label="@string/event_edit_title"
android:theme="@android:style/Theme.Light"
@@ -99,6 +98,14 @@
<category android:name="android.intent.category.UNIT_TEST" />
</intent-filter>
</activity>
+
+ <receiver android:name="CalendarGadgetProvider">
+ <intent-filter>
+ <action android:name="android.gadget.action.GADGET_UPDATE" />
+ <action android:name="com.android.providers.calendar.EVENTS_CHANGED" />
+ </intent-filter>
+ <meta-data android:name="android.gadget.provider" android:resource="@xml/gadget_info" />
+ </receiver>
</application>
</manifest>
diff --git a/res/drawable/app_icon_blank.png b/res/drawable/app_icon_blank.png
new file mode 100644
index 00000000..78e40081
--- /dev/null
+++ b/res/drawable/app_icon_blank.png
Binary files differ
diff --git a/res/drawable/bg_calendar.9.png b/res/drawable/bg_calendar.9.png
new file mode 100644
index 00000000..7e9c624d
--- /dev/null
+++ b/res/drawable/bg_calendar.9.png
Binary files differ
diff --git a/res/drawable/bg_calendar_primary.9.png b/res/drawable/bg_calendar_primary.9.png
new file mode 100644
index 00000000..8c3a7c76
--- /dev/null
+++ b/res/drawable/bg_calendar_primary.9.png
Binary files differ
diff --git a/res/drawable/ic_date_01.png b/res/drawable/ic_date_01.png
new file mode 100644
index 00000000..0246742b
--- /dev/null
+++ b/res/drawable/ic_date_01.png
Binary files differ
diff --git a/res/drawable/ic_date_02.png b/res/drawable/ic_date_02.png
new file mode 100644
index 00000000..533668c6
--- /dev/null
+++ b/res/drawable/ic_date_02.png
Binary files differ
diff --git a/res/drawable/ic_date_03.png b/res/drawable/ic_date_03.png
new file mode 100644
index 00000000..7061b4c1
--- /dev/null
+++ b/res/drawable/ic_date_03.png
Binary files differ
diff --git a/res/drawable/ic_date_04.png b/res/drawable/ic_date_04.png
new file mode 100644
index 00000000..fb720d50
--- /dev/null
+++ b/res/drawable/ic_date_04.png
Binary files differ
diff --git a/res/drawable/ic_date_05.png b/res/drawable/ic_date_05.png
new file mode 100644
index 00000000..207c1454
--- /dev/null
+++ b/res/drawable/ic_date_05.png
Binary files differ
diff --git a/res/drawable/ic_date_06.png b/res/drawable/ic_date_06.png
new file mode 100644
index 00000000..fb0cf1ac
--- /dev/null
+++ b/res/drawable/ic_date_06.png
Binary files differ
diff --git a/res/drawable/ic_date_07.png b/res/drawable/ic_date_07.png
new file mode 100644
index 00000000..5d5545dc
--- /dev/null
+++ b/res/drawable/ic_date_07.png
Binary files differ
diff --git a/res/drawable/ic_date_08.png b/res/drawable/ic_date_08.png
new file mode 100644
index 00000000..98bcb30b
--- /dev/null
+++ b/res/drawable/ic_date_08.png
Binary files differ
diff --git a/res/drawable/ic_date_09.png b/res/drawable/ic_date_09.png
new file mode 100644
index 00000000..1915481e
--- /dev/null
+++ b/res/drawable/ic_date_09.png
Binary files differ
diff --git a/res/drawable/ic_date_10.png b/res/drawable/ic_date_10.png
new file mode 100644
index 00000000..1bd783e3
--- /dev/null
+++ b/res/drawable/ic_date_10.png
Binary files differ
diff --git a/res/drawable/ic_date_11.png b/res/drawable/ic_date_11.png
new file mode 100644
index 00000000..bf6912a4
--- /dev/null
+++ b/res/drawable/ic_date_11.png
Binary files differ
diff --git a/res/drawable/ic_date_12.png b/res/drawable/ic_date_12.png
new file mode 100644
index 00000000..7ffdf5c6
--- /dev/null
+++ b/res/drawable/ic_date_12.png
Binary files differ
diff --git a/res/drawable/ic_date_13.png b/res/drawable/ic_date_13.png
new file mode 100644
index 00000000..fe536f6b
--- /dev/null
+++ b/res/drawable/ic_date_13.png
Binary files differ
diff --git a/res/drawable/ic_date_14.png b/res/drawable/ic_date_14.png
new file mode 100644
index 00000000..328ec990
--- /dev/null
+++ b/res/drawable/ic_date_14.png
Binary files differ
diff --git a/res/drawable/ic_date_15.png b/res/drawable/ic_date_15.png
new file mode 100644
index 00000000..a0448cfa
--- /dev/null
+++ b/res/drawable/ic_date_15.png
Binary files differ
diff --git a/res/drawable/ic_date_16.png b/res/drawable/ic_date_16.png
new file mode 100644
index 00000000..21f18a2f
--- /dev/null
+++ b/res/drawable/ic_date_16.png
Binary files differ
diff --git a/res/drawable/ic_date_17.png b/res/drawable/ic_date_17.png
new file mode 100644
index 00000000..a02434a5
--- /dev/null
+++ b/res/drawable/ic_date_17.png
Binary files differ
diff --git a/res/drawable/ic_date_18.png b/res/drawable/ic_date_18.png
new file mode 100644
index 00000000..03288f74
--- /dev/null
+++ b/res/drawable/ic_date_18.png
Binary files differ
diff --git a/res/drawable/ic_date_19.png b/res/drawable/ic_date_19.png
new file mode 100644
index 00000000..d518403f
--- /dev/null
+++ b/res/drawable/ic_date_19.png
Binary files differ
diff --git a/res/drawable/ic_date_20.png b/res/drawable/ic_date_20.png
new file mode 100644
index 00000000..dbe10e04
--- /dev/null
+++ b/res/drawable/ic_date_20.png
Binary files differ
diff --git a/res/drawable/ic_date_21.png b/res/drawable/ic_date_21.png
new file mode 100644
index 00000000..644d3b99
--- /dev/null
+++ b/res/drawable/ic_date_21.png
Binary files differ
diff --git a/res/drawable/ic_date_22.png b/res/drawable/ic_date_22.png
new file mode 100644
index 00000000..0924dd34
--- /dev/null
+++ b/res/drawable/ic_date_22.png
Binary files differ
diff --git a/res/drawable/ic_date_23.png b/res/drawable/ic_date_23.png
new file mode 100644
index 00000000..60d0e0b9
--- /dev/null
+++ b/res/drawable/ic_date_23.png
Binary files differ
diff --git a/res/drawable/ic_date_24.png b/res/drawable/ic_date_24.png
new file mode 100644
index 00000000..eed072a8
--- /dev/null
+++ b/res/drawable/ic_date_24.png
Binary files differ
diff --git a/res/drawable/ic_date_25.png b/res/drawable/ic_date_25.png
new file mode 100644
index 00000000..38af9020
--- /dev/null
+++ b/res/drawable/ic_date_25.png
Binary files differ
diff --git a/res/drawable/ic_date_26.png b/res/drawable/ic_date_26.png
new file mode 100644
index 00000000..84b53196
--- /dev/null
+++ b/res/drawable/ic_date_26.png
Binary files differ
diff --git a/res/drawable/ic_date_27.png b/res/drawable/ic_date_27.png
new file mode 100644
index 00000000..ad559f5e
--- /dev/null
+++ b/res/drawable/ic_date_27.png
Binary files differ
diff --git a/res/drawable/ic_date_28.png b/res/drawable/ic_date_28.png
new file mode 100644
index 00000000..49355d85
--- /dev/null
+++ b/res/drawable/ic_date_28.png
Binary files differ
diff --git a/res/drawable/ic_date_29.png b/res/drawable/ic_date_29.png
new file mode 100644
index 00000000..4da387b8
--- /dev/null
+++ b/res/drawable/ic_date_29.png
Binary files differ
diff --git a/res/drawable/ic_date_30.png b/res/drawable/ic_date_30.png
new file mode 100644
index 00000000..91cd2fed
--- /dev/null
+++ b/res/drawable/ic_date_30.png
Binary files differ
diff --git a/res/drawable/ic_date_31.png b/res/drawable/ic_date_31.png
new file mode 100644
index 00000000..9c094b80
--- /dev/null
+++ b/res/drawable/ic_date_31.png
Binary files differ
diff --git a/res/drawable/strip_cal_secondary.9.png b/res/drawable/strip_cal_secondary.9.png
new file mode 100644
index 00000000..acddde09
--- /dev/null
+++ b/res/drawable/strip_cal_secondary.9.png
Binary files differ
diff --git a/res/drawable/white_list_rule_cal.9.png b/res/drawable/white_list_rule_cal.9.png
new file mode 100644
index 00000000..0b175a37
--- /dev/null
+++ b/res/drawable/white_list_rule_cal.9.png
Binary files differ
diff --git a/res/layout-land/gadget_item.xml b/res/layout-land/gadget_item.xml
new file mode 100644
index 00000000..3fd44159
--- /dev/null
+++ b/res/layout-land/gadget_item.xml
@@ -0,0 +1,164 @@
+<?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:id="@+id/gadget"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:paddingBottom="6px"
+ android:background="@drawable/bg_calendar"
+ >
+
+ <TextView
+ android:id="@+id/no_events"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent"
+ android:paddingTop="6px"
+ android:gravity="center"
+ android:textStyle="bold"
+ android:textSize="16sp"
+ android:text="@string/gadget_no_events"
+ android:textColor="@color/gadget_no_events"
+ />
+
+ <FrameLayout
+ android:id="@+id/landscape_hidden"
+ android:layout_width="0dip"
+ android:layout_height="0dip"
+ android:visibility="gone"
+ >
+
+ <TextView
+ android:id="@+id/secondary_card"
+ android:layout_width="0dip"
+ android:layout_height="0dip"
+ />
+
+ <TextView
+ android:id="@+id/stub_when"
+ android:layout_width="0dip"
+ android:layout_height="0dip"
+ />
+
+ <TextView
+ android:id="@+id/stub_title"
+ android:layout_width="0dip"
+ android:layout_height="0dip"
+ />
+
+ <TextView
+ android:id="@+id/stub_where"
+ android:layout_width="0dip"
+ android:layout_height="0dip"
+ />
+
+ <TextView
+ android:id="@+id/secondary_when"
+ android:layout_width="0dip"
+ android:layout_height="0dip"
+ android:background="@drawable/strip_cal_secondary"
+ />
+
+ <TextView
+ android:id="@+id/secondary_title"
+ android:layout_width="0dip"
+ android:layout_height="0dip"
+ />
+
+ <ImageView
+ android:id="@+id/divider"
+ android:layout_width="0dip"
+ android:layout_height="0dip"
+ android:background="@drawable/white_list_rule_cal"
+ />
+
+ <TextView
+ android:id="@+id/title2"
+ android:layout_width="0dip"
+ android:layout_height="0dip"
+ />
+
+ </FrameLayout>
+
+ <LinearLayout
+ android:id="@+id/primary_card"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:layout_alignParentTop="true"
+ android:paddingLeft="3px"
+ android:paddingRight="3px"
+ android:paddingTop="3px"
+ android:paddingBottom="8px"
+ android:background="@drawable/bg_calendar_primary"
+ android:orientation="vertical"
+ android:visibility="gone"
+ >
+
+ <TextView
+ android:id="@+id/when"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:paddingRight="64px"
+ android:paddingLeft="8px"
+ android:paddingTop="1px"
+ android:paddingBottom="1px"
+ android:gravity="center_vertical"
+ android:background="@drawable/strip_cal"
+ android:textStyle="bold"
+ android:textSize="11sp"
+ android:textColor="@color/gadget_when"
+ android:singleLine="true"
+ />
+
+ <TextView
+ android:id="@+id/title"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:paddingRight="64px"
+ android:paddingLeft="8px"
+ android:textStyle="bold"
+ android:textSize="16sp"
+ android:textColor="@color/gadget_title"
+ android:singleLine="true"
+ />
+
+ <TextView
+ android:id="@+id/where"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:paddingRight="64px"
+ android:paddingLeft="8px"
+ android:textSize="11sp"
+ android:textColor="@color/gadget_where"
+ android:singleLine="true"
+ />
+
+ </LinearLayout>
+
+ <ImageView
+ android:id="@+id/icon"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_alignParentTop="true"
+ android:layout_alignParentRight="true"
+ android:layout_marginRight="8px"
+ android:src="@drawable/app_icon_blank"
+ android:visibility="gone"
+ />
+
+</RelativeLayout>
+
diff --git a/res/layout/gadget_item.xml b/res/layout/gadget_item.xml
new file mode 100644
index 00000000..0d4160b8
--- /dev/null
+++ b/res/layout/gadget_item.xml
@@ -0,0 +1,192 @@
+<?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:id="@+id/gadget"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:paddingBottom="6px"
+ android:background="@drawable/bg_calendar"
+ >
+
+ <TextView
+ android:id="@+id/no_events"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent"
+ android:paddingTop="6px"
+ android:gravity="center"
+ android:textStyle="bold"
+ android:textSize="16sp"
+ android:text="@string/gadget_no_events"
+ android:textColor="@color/gadget_no_events"
+ />
+
+ <LinearLayout
+ android:id="@+id/secondary_card"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginLeft="3px"
+ android:layout_marginRight="3px"
+ android:orientation="vertical"
+ android:visibility="gone"
+ >
+
+ <TextView
+ android:id="@+id/stub_when"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:textStyle="bold"
+ android:textSize="11sp"
+ android:paddingTop="8px"
+ android:visibility="invisible"
+ />
+
+ <TextView
+ android:id="@+id/stub_title"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:textStyle="bold"
+ android:textSize="16sp"
+ android:visibility="invisible"
+ />
+
+ <TextView
+ android:id="@+id/stub_where"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:textSize="11sp"
+ android:visibility="invisible"
+ />
+
+ <TextView
+ android:id="@+id/secondary_when"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:paddingLeft="8px"
+ android:paddingTop="1px"
+ android:paddingBottom="1px"
+ android:gravity="center_vertical"
+ android:background="@drawable/strip_cal_secondary"
+ android:textStyle="bold"
+ android:textSize="11sp"
+ android:textColor="@color/gadget_when"
+ android:singleLine="true"
+ />
+
+ <TextView
+ android:id="@+id/secondary_title"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:paddingLeft="8px"
+ android:textSize="11sp"
+ android:textColor="@color/gadget_title"
+ android:singleLine="true"
+ />
+
+ </LinearLayout>
+
+ <LinearLayout
+ android:id="@+id/primary_card"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:layout_alignParentTop="true"
+ android:paddingLeft="3px"
+ android:paddingRight="3px"
+ android:paddingTop="3px"
+ android:paddingBottom="8px"
+ android:background="@drawable/bg_calendar_primary"
+ android:orientation="vertical"
+ android:visibility="gone"
+ >
+
+ <TextView
+ android:id="@+id/when"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:paddingRight="64px"
+ android:paddingLeft="8px"
+ android:paddingTop="1px"
+ android:paddingBottom="1px"
+ android:gravity="center_vertical"
+ android:background="@drawable/strip_cal"
+ android:textStyle="bold"
+ android:textSize="11sp"
+ android:textColor="@color/gadget_when"
+ android:singleLine="true"
+ />
+
+ <TextView
+ android:id="@+id/title"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:paddingRight="64px"
+ android:paddingLeft="8px"
+ android:textStyle="bold"
+ android:textSize="16sp"
+ android:textColor="@color/gadget_title"
+ android:singleLine="true"
+ />
+
+ <TextView
+ android:id="@+id/where"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:paddingRight="64px"
+ android:paddingLeft="8px"
+ android:textSize="11sp"
+ android:textColor="@color/gadget_where"
+ android:singleLine="true"
+ />
+
+ <ImageView
+ android:id="@+id/divider"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="4px"
+ android:layout_marginBottom="2px"
+ android:layout_marginLeft="16px"
+ android:layout_marginRight="16px"
+ android:background="@drawable/white_list_rule_cal"
+ />
+
+ <TextView
+ android:id="@+id/title2"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:paddingRight="64px"
+ android:paddingLeft="8px"
+ android:textStyle="bold"
+ android:textSize="11sp"
+ android:textColor="@color/gadget_title"
+ android:singleLine="true"
+ />
+
+ </LinearLayout>
+
+ <ImageView
+ android:id="@+id/icon"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_alignParentTop="true"
+ android:layout_alignParentRight="true"
+ android:layout_marginRight="8px"
+ android:src="@drawable/app_icon_blank"
+ android:visibility="gone"
+ />
+
+</RelativeLayout>
+
diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml
index 7da9cfc7..dc5aab87 100644
--- a/res/values-cs/strings.xml
+++ b/res/values-cs/strings.xml
@@ -120,4 +120,13 @@
<string name="preferences_default_reminder_title">"Nastavit výchozí připomenutí"</string>
<string name="preferences_default_reminder_dialog">"Výchozí čas připomenutí"</string>
<string name="preferences_default_reminder_default">"10"</string>
+ <string name="gadget_calendar">"Kalendář:"</string>
+ <string name="gadget_now_event">"Nyní: <xliff:g id="TIME_DATE">%s</xliff:g>"</string>
+ <string name="gadget_next_event">"Další: <xliff:g id="TIME_DATE">%s</xliff:g>"</string>
+ <string name="gadget_later_event">"Později: <xliff:g id="TIME_DATE">%s</xliff:g>"</string>
+ <plurals name="gadget_more_events">
+ <item quantity="one">"Jedna další událost"</item>
+ <item quantity="other">"<xliff:g id="NUMBER">%d</xliff:g> dalších událostí"</item>
+ </plurals>
+ <string name="gadget_no_events">"Žádné nadcházející události"</string>
</resources>
diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml
index 152047e7..db21ce60 100644
--- a/res/values-de/strings.xml
+++ b/res/values-de/strings.xml
@@ -120,4 +120,13 @@
<string name="preferences_default_reminder_title">"Standarderinnerung festlegen"</string>
<string name="preferences_default_reminder_dialog">"Standard-Erinnerungszeit"</string>
<string name="preferences_default_reminder_default">"10"</string>
+ <string name="gadget_calendar">"Kalender:"</string>
+ <string name="gadget_now_event">"Jetzt: <xliff:g id="TIME_DATE">%s</xliff:g>"</string>
+ <string name="gadget_next_event">"Weiter: <xliff:g id="TIME_DATE">%s</xliff:g>"</string>
+ <string name="gadget_later_event">"Später: <xliff:g id="TIME_DATE">%s</xliff:g>"</string>
+ <plurals name="gadget_more_events">
+ <item quantity="one">"1 weiterer Termin"</item>
+ <item quantity="other">"<xliff:g id="NUMBER">%d</xliff:g> weitere Termine"</item>
+ </plurals>
+ <string name="gadget_no_events">"Keine anstehenden Kalendertermine"</string>
</resources>
diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml
index 1755eb77..0f211d3f 100644
--- a/res/values-es/strings.xml
+++ b/res/values-es/strings.xml
@@ -94,7 +94,7 @@
<string name="discard_label">"Descartar cambios"</string>
<string name="import_label">"Importar"</string>
<string name="snooze_all_label">"Posponer todos"</string>
- <string name="dismiss_all_label">"Descartar todos"</string>
+ <string name="dismiss_all_label">"Descartar todas"</string>
<string name="does_not_repeat">"Evento único"</string>
<string name="daily">"Cada día"</string>
<string name="every_weekday">"Cada día laboral (lunes-viernes)"</string>
@@ -120,4 +120,13 @@
<string name="preferences_default_reminder_title">"Configurar recordatorio predeterminado"</string>
<string name="preferences_default_reminder_dialog">"Duración predeterminada del recordatorio"</string>
<string name="preferences_default_reminder_default">"10"</string>
+ <string name="gadget_calendar">"Calendario:"</string>
+ <string name="gadget_now_event">"Ahora: <xliff:g id="TIME_DATE">%s</xliff:g>"</string>
+ <string name="gadget_next_event">"Siguiente: <xliff:g id="TIME_DATE">%s</xliff:g>"</string>
+ <string name="gadget_later_event">"Posterior: <xliff:g id="TIME_DATE">%s</xliff:g>"</string>
+ <plurals name="gadget_more_events">
+ <item quantity="one">"Un evento más"</item>
+ <item quantity="other">"<xliff:g id="NUMBER">%d</xliff:g> eventos más"</item>
+ </plurals>
+ <string name="gadget_no_events">"No hay próximos eventos en el calendario"</string>
</resources>
diff --git a/res/values-fr/arrays.xml b/res/values-fr/arrays.xml
index 62e04487..ef550ece 100644
--- a/res/values-fr/arrays.xml
+++ b/res/values-fr/arrays.xml
@@ -110,10 +110,10 @@
<item>"samedi"</item>
</string-array>
<string-array name="ordinal_labels">
- <item>"1er"</item>
- <item>"2e"</item>
- <item>"3e"</item>
- <item>"4e"</item>
+ <item>"premier"</item>
+ <item>"seconde"</item>
+ <item>"troisième"</item>
+ <item>"quatrième"</item>
<item>"dernier"</item>
</string-array>
<string-array name="response_labels1">
diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml
index a1b45179..750a3258 100644
--- a/res/values-fr/strings.xml
+++ b/res/values-fr/strings.xml
@@ -38,9 +38,9 @@
<item quantity="one">"1 jour"</item>
<item quantity="other">"<xliff:g id="COUNT">%d</xliff:g> jours"</item>
</plurals>
- <string name="show_agenda_view">"Afficher l\'agenda"</string>
+ <string name="show_agenda_view">"Afficher le planning"</string>
<string name="show_day_view">"Afficher le jour"</string>
- <string name="agenda_view">"Mon planning"</string>
+ <string name="agenda_view">"Agenda"</string>
<string name="day_view">"Jour"</string>
<string name="week_view">"Semaine"</string>
<string name="month_view">"Mois"</string>
@@ -75,7 +75,7 @@
<string name="edit_event_all_day_label">"Journée entière"</string>
<string name="edit_event_calendar_label">"Agenda"</string>
<string name="edit_event_show_extra_options">"Afficher les options supplémentaires"</string>
- <string name="edit_event_hide_extra_options">"Masquer options supplémentaires"</string>
+ <string name="edit_event_hide_extra_options">"Masquer les options supplémentaires"</string>
<string name="description_label">"Description"</string>
<string name="presence_label">"Présence"</string>
<string name="privacy_label">"Confidentialité"</string>
@@ -91,18 +91,18 @@
<string name="delete_label">"Supprimer"</string>
<string name="delete_event_label">"Supprimer l\'événement"</string>
<string name="save_label">"Enregistrer"</string>
- <string name="discard_label">"Ignorer"</string>
+ <string name="discard_label">"Ignorer les modifications"</string>
<string name="import_label">"Importer"</string>
- <string name="snooze_all_label">"Tout répéter"</string>
+ <string name="snooze_all_label">"Tout mettre en attente"</string>
<string name="dismiss_all_label">"Tout supprimer"</string>
<string name="does_not_repeat">"Événement ponctuel"</string>
- <string name="daily">"Ignorer"</string>
- <string name="every_weekday">"Les jours ouvrables (lun–ven)"</string>
+ <string name="daily">"Quotidien"</string>
+ <string name="every_weekday">"Chaque jour de semaine (lun–ven)"</string>
<string name="weekly">"Hebdomadaire (chaque <xliff:g id="DAYS_OF_WEEK">%s</xliff:g>)"</string>
<string name="monthly_on_day_count">"Mensuel (chaque <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">"Mensuel (le <xliff:g id="DAY_OF_MONTH">%s</xliff:g>)"</string>
<string name="yearly">"Annuel (le <xliff:g id="DATES">%s</xliff:g>)"</string>
- <string name="custom">"Personnalisé… (non paramétrable sur téléphone)"</string>
+ <string name="custom">"Personnalisé… (paramétrage impossible avec un téléphone)"</string>
<string name="modify_event">"Modifier uniquement cet événement."</string>
<string name="modify_all">"Modifier tous les événements de la série."</string>
<string name="modify_all_following">"Modifier cet événement et tous les suivants."</string>
@@ -112,12 +112,21 @@
<string name="preferences_title">"Paramètres"</string>
<string name="preferences_general_title">"Paramètre d\'affichage de l\'agenda"</string>
<string name="preferences_alerts_title">"Paramètres de rappel"</string>
- <string name="preferences_hide_declined_title">"Masquer évén. refusés"</string>
- <string name="preferences_alerts_type_title">"Alertes et notifications"</string>
+ <string name="preferences_hide_declined_title">"Masquer les événements refusés"</string>
+ <string name="preferences_alerts_type_title">"Définir les alertes et les notifications"</string>
<string name="preferences_alerts_type_dialog">"Alertes et notifications"</string>
<string name="preferences_alerts_vibrate_title">"Vibreur"</string>
<string name="preferences_alerts_ringtone_title">"Sélectionner la sonnerie"</string>
<string name="preferences_default_reminder_title">"Définir le rappel par défaut"</string>
<string name="preferences_default_reminder_dialog">"Intervalle de rappel par défaut"</string>
<string name="preferences_default_reminder_default">"10"</string>
+ <string name="gadget_calendar">"Agenda :"</string>
+ <string name="gadget_now_event">"Maintenant : <xliff:g id="TIME_DATE">%s</xliff:g>"</string>
+ <string name="gadget_next_event">"Suivant : <xliff:g id="TIME_DATE">%s</xliff:g>"</string>
+ <string name="gadget_later_event">"Plus tard : <xliff:g id="TIME_DATE">%s</xliff:g>"</string>
+ <plurals name="gadget_more_events">
+ <item quantity="one">"1 événement supplémentaire"</item>
+ <item quantity="other">"<xliff:g id="NUMBER">%d</xliff:g> autres événements"</item>
+ </plurals>
+ <string name="gadget_no_events">"Aucun événement d\'agenda à venir"</string>
</resources>
diff --git a/res/values-it/arrays.xml b/res/values-it/arrays.xml
index 5778f7e5..92c7ff49 100644
--- a/res/values-it/arrays.xml
+++ b/res/values-it/arrays.xml
@@ -84,7 +84,7 @@
<string-array name="preferences_alert_type_labels">
<item>"Avviso"</item>
<item>"Notifica barra di stato"</item>
- <item>"Disativa"</item>
+ <item>"Disattivato"</item>
</string-array>
<string-array name="preferences_alert_type_values">
<item>"0"</item>
diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml
index 0aaeef50..7236aa67 100644
--- a/res/values-it/strings.xml
+++ b/res/values-it/strings.xml
@@ -17,9 +17,9 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label">"Calendario"</string>
<string name="calendar_plug"><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">"Che cosa"</string>
+ <string name="what_label">"Titolo"</string>
<string name="when_label">"Intervallo di tempo"</string>
- <string name="where_label">"Dove"</string>
+ <string name="where_label">"Posizione"</string>
<string name="repeats_label">"Ripetizione"</string>
<string name="no_title_label">"(Nessun oggetto)"</string>
<plurals name="Nminutes">
@@ -64,7 +64,7 @@
<string name="loading_calendars_title">"Caricamento calendari"</string>
<string name="loading_calendars_message">"Caricamento calendari in corso..."</string>
<string name="alert_when_label">"Intervallo di tempo:"</string>
- <string name="alert_where_label">"Dove:"</string>
+ <string name="alert_where_label">"Posizione:"</string>
<string name="alert_missed_events_single">"(Altri <xliff:g id="REMINDER_COUNT">%s</xliff:g> promemoria)"</string>
<string name="alert_missed_events_multiple">"(Altri <xliff:g id="REMINDER_COUNT">%s</xliff:g> promemoria)"</string>
<string name="event_info_title">"Visualizza evento"</string>
@@ -97,11 +97,11 @@
<string name="dismiss_all_label">"Ignora tutto"</string>
<string name="does_not_repeat">"Evento occasionale"</string>
<string name="daily">"Ogni giorno"</string>
- <string name="every_weekday">"Ogni giorno lavorativo (Lun-Ven)"</string>
+ <string name="every_weekday">"Ogni giorno della settimana (Lun-Ven)"</string>
<string name="weekly">"Ogni settimana (ogni <xliff:g id="DAYS_OF_WEEK">%s</xliff:g>)"</string>
- <string name="monthly_on_day_count">"Ogni mese (ogni <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_count">"Ogni mese (ogni <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">"Ogni mese (il <xliff:g id="DAY_OF_MONTH">%s</xliff:g>)"</string>
- <string name="yearly">"Ogni anno (il <xliff:g id="DATES">%s</xliff:g>)"</string>
+ <string name="yearly">"Ogni anno (il <xliff:g id="DATES">%s</xliff:g>"</string>
<string name="custom">"Personalizzato… (impossibile personalizzare sul telefono)"</string>
<string name="modify_event">"Modifica solo questo evento."</string>
<string name="modify_all">"Modifica tutti gli eventi nelle serie."</string>
@@ -117,7 +117,16 @@
<string name="preferences_alerts_type_dialog">"Avvisi e notifiche"</string>
<string name="preferences_alerts_vibrate_title">"Vibrazione"</string>
<string name="preferences_alerts_ringtone_title">"Seleziona suoneria"</string>
- <string name="preferences_default_reminder_title">"Promemoria predefinito"</string>
- <string name="preferences_default_reminder_dialog">"Imposta promemoria predefinito"</string>
+ <string name="preferences_default_reminder_title">"Imposta promemoria predefinito"</string>
+ <string name="preferences_default_reminder_dialog">"Orario promemoria predefinito"</string>
<string name="preferences_default_reminder_default">"10"</string>
+ <string name="gadget_calendar">"Calendario:"</string>
+ <string name="gadget_now_event">"Adesso: <xliff:g id="TIME_DATE">%s</xliff:g>"</string>
+ <string name="gadget_next_event">"Successivo: <xliff:g id="TIME_DATE">%s</xliff:g>"</string>
+ <string name="gadget_later_event">"Successivo: <xliff:g id="TIME_DATE">%s</xliff:g>"</string>
+ <plurals name="gadget_more_events">
+ <item quantity="one">"1 altro evento"</item>
+ <item quantity="other">"<xliff:g id="NUMBER">%d</xliff:g> altri eventi"</item>
+ </plurals>
+ <string name="gadget_no_events">"Nessun evento di calendario imminente"</string>
</resources>
diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml
index 235f0df7..6e435947 100644
--- a/res/values-ja/strings.xml
+++ b/res/values-ja/strings.xml
@@ -120,4 +120,13 @@
<string name="preferences_default_reminder_title">"通知設定"</string>
<string name="preferences_default_reminder_dialog">"デフォルトの通知時間"</string>
<string name="preferences_default_reminder_default">"10"</string>
+ <string name="gadget_calendar">"カレンダー:"</string>
+ <string name="gadget_now_event">"現在時刻: <xliff:g id="TIME_DATE">%s</xliff:g>"</string>
+ <string name="gadget_next_event">"次へ: <xliff:g id="TIME_DATE">%s</xliff:g>"</string>
+ <string name="gadget_later_event">"後で: <xliff:g id="TIME_DATE">%s</xliff:g>"</string>
+ <plurals name="gadget_more_events">
+ <item quantity="one">"他1件"</item>
+ <item quantity="other">"他<xliff:g id="NUMBER">%d</xliff:g>件"</item>
+ </plurals>
+ <string name="gadget_no_events">"予定されているカレンダーの予定はありません"</string>
</resources>
diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml
index 24a2e640..430d0e00 100644
--- a/res/values-ko/strings.xml
+++ b/res/values-ko/strings.xml
@@ -120,4 +120,13 @@
<string name="preferences_default_reminder_title">"기본 알림 설정"</string>
<string name="preferences_default_reminder_dialog">"기본 알림 시간"</string>
<string name="preferences_default_reminder_default">"10"</string>
+ <string name="gadget_calendar">"캘린더:"</string>
+ <string name="gadget_now_event">"현재 시각: <xliff:g id="TIME_DATE">%s</xliff:g>"</string>
+ <string name="gadget_next_event">"다음: <xliff:g id="TIME_DATE">%s</xliff:g>"</string>
+ <string name="gadget_later_event">"예정 시각: <xliff:g id="TIME_DATE">%s</xliff:g>"</string>
+ <plurals name="gadget_more_events">
+ <item quantity="one">"1개 일정 더보기"</item>
+ <item quantity="other">"<xliff:g id="NUMBER">%d</xliff:g>개 일정 더보기"</item>
+ </plurals>
+ <string name="gadget_no_events">"예정된 캘린더 일정이 없습니다."</string>
</resources>
diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml
index 3da8d23e..ceeee31e 100644
--- a/res/values-nb/strings.xml
+++ b/res/values-nb/strings.xml
@@ -121,4 +121,13 @@
<string name="preferences_default_reminder_title">"Sett standard påminnelse"</string>
<string name="preferences_default_reminder_dialog">"Standard påminnelsestid"</string>
<string name="preferences_default_reminder_default">"10"</string>
+ <string name="gadget_calendar">"Kalender:"</string>
+ <string name="gadget_now_event">"Nå: <xliff:g id="TIME_DATE">%s</xliff:g>"</string>
+ <string name="gadget_next_event">"Neste: <xliff:g id="TIME_DATE">%s</xliff:g>"</string>
+ <string name="gadget_later_event">"Senere: <xliff:g id="TIME_DATE">%s</xliff:g>"</string>
+ <plurals name="gadget_more_events">
+ <item quantity="one">"En hendelse til"</item>
+ <item quantity="other">"<xliff:g id="NUMBER">%d</xliff:g> hendelser til"</item>
+ </plurals>
+ <string name="gadget_no_events">"Ingen kommende kalenderhendelser"</string>
</resources>
diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml
index a3448cbd..df05da6a 100644
--- a/res/values-nl/strings.xml
+++ b/res/values-nl/strings.xml
@@ -16,7 +16,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label">"Agenda"</string>
- <string name="calendar_plug"><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"><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">"Wat"</string>
<string name="when_label">"Wanneer"</string>
<string name="where_label">"Waar"</string>
@@ -45,7 +45,7 @@
<string name="week_view">"Week"</string>
<string name="month_view">"Maand"</string>
<string name="event_view">"Afspraak weergeven"</string>
- <string name="event_create">"Nieuwe afspraak"</string>
+ <string name="event_create">"Nieuwe afspraak"</string>
<string name="event_edit">"Afspraak bewerken"</string>
<string name="event_delete">"Afspraak verwijderen"</string>
<string name="goto_today">"Vandaag"</string>
@@ -120,4 +120,13 @@
<string name="preferences_default_reminder_title">"Standaardherinnering instellen"</string>
<string name="preferences_default_reminder_dialog">"Standaard herinneringstijd"</string>
<string name="preferences_default_reminder_default">"10"</string>
+ <string name="gadget_calendar">"Kalender:"</string>
+ <string name="gadget_now_event">"Nu: <xliff:g id="TIME_DATE">%s</xliff:g>"</string>
+ <string name="gadget_next_event">"Volgende: <xliff:g id="TIME_DATE">%s</xliff:g>"</string>
+ <string name="gadget_later_event">"Later: <xliff:g id="TIME_DATE">%s</xliff:g>"</string>
+ <plurals name="gadget_more_events">
+ <item quantity="one">"nog 1 gebeurtenis"</item>
+ <item quantity="other">"nog <xliff:g id="NUMBER">%d</xliff:g> gebeurtenissen"</item>
+ </plurals>
+ <string name="gadget_no_events">"Geen geplande afspraken"</string>
</resources>
diff --git a/res/values-pl/arrays.xml b/res/values-pl/arrays.xml
index d81349d9..1ab3b2e8 100644
--- a/res/values-pl/arrays.xml
+++ b/res/values-pl/arrays.xml
@@ -101,13 +101,13 @@
<item>"Publiczny"</item>
</string-array>
<string-array name="day_labels">
- <item>"niedziela"</item>
- <item>"poniedziałek"</item>
- <item>"wtorek"</item>
- <item>"środa"</item>
- <item>"czwartek"</item>
- <item>"piątek"</item>
- <item>"sobota"</item>
+ <item>"Niedziela"</item>
+ <item>"Poniedziałek"</item>
+ <item>"Wtorek"</item>
+ <item>"Środa"</item>
+ <item>"Czwartek"</item>
+ <item>"Piątek"</item>
+ <item>"Sobota"</item>
</string-array>
<string-array name="ordinal_labels">
<item>"1."</item>
diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml
index 168d59ba..591f7cac 100644
--- a/res/values-pl/strings.xml
+++ b/res/values-pl/strings.xml
@@ -94,12 +94,12 @@
<string name="discard_label">"Odrzuć zmiany"</string>
<string name="import_label">"Importuj"</string>
<string name="snooze_all_label">"Odłóż wszystkie"</string>
- <string name="dismiss_all_label">"Zamknij wszystkie"</string>
+ <string name="dismiss_all_label">"Odrzuć wszystkie"</string>
<string name="does_not_repeat">"Wydarzenie jednorazowe"</string>
<string name="daily">"Codziennie"</string>
<string name="every_weekday">"Codziennie (pn-pt)"</string>
<string name="weekly">"Co tydzień (<xliff:g id="DAYS_OF_WEEK">%s</xliff:g>)"</string>
- <string name="monthly_on_day_count">"Co miesiąc (co <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_count">"Co miesiąc (<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">"Co miesiąc (<xliff:g id="DAY_OF_MONTH">%s</xliff:g> każdego miesiąca)"</string>
<string name="yearly">"Co rok (<xliff:g id="DATES">%s</xliff:g>)"</string>
<string name="custom">"Niestandardowo… (nie można dostosować na telefonie)"</string>
@@ -110,14 +110,23 @@
<string name="delete_title">"Usuń"</string>
<string name="change_response_title">"Zmień odpowiedź"</string>
<string name="preferences_title">"Ustawienia"</string>
- <string name="preferences_general_title">"Widok kalendarza"</string>
+ <string name="preferences_general_title">"Ustawienie widoku kalendarza"</string>
<string name="preferences_alerts_title">"Ustawienia przypomnień"</string>
- <string name="preferences_hide_declined_title">"Ukryj odrzucone"</string>
- <string name="preferences_alerts_type_title">"Alerty i powiadomienia"</string>
+ <string name="preferences_hide_declined_title">"Ukryj odrzucone wydarzenia"</string>
+ <string name="preferences_alerts_type_title">"Ustaw alerty i powiadomienia"</string>
<string name="preferences_alerts_type_dialog">"Alerty i powiadomienia"</string>
<string name="preferences_alerts_vibrate_title">"Wibracje"</string>
<string name="preferences_alerts_ringtone_title">"Wybierz dzwonek"</string>
- <string name="preferences_default_reminder_title">"Domyślne przypomnienie"</string>
- <string name="preferences_default_reminder_dialog">"Domyślne przypomnienie"</string>
+ <string name="preferences_default_reminder_title">"Ustaw domyślne przypomnienie"</string>
+ <string name="preferences_default_reminder_dialog">"Domyślna godzina przypomnienia"</string>
<string name="preferences_default_reminder_default">"10"</string>
+ <string name="gadget_calendar">"Kalendarz:"</string>
+ <string name="gadget_now_event">"Teraz: <xliff:g id="TIME_DATE">%s</xliff:g>"</string>
+ <string name="gadget_next_event">"Następne: <xliff:g id="TIME_DATE">%s</xliff:g>"</string>
+ <string name="gadget_later_event">"Później: <xliff:g id="TIME_DATE">%s</xliff:g>"</string>
+ <plurals name="gadget_more_events">
+ <item quantity="one">"Więcej wydarzeń: 1"</item>
+ <item quantity="other">"Więcej wydarzeń: <xliff:g id="NUMBER">%d</xliff:g>"</item>
+ </plurals>
+ <string name="gadget_no_events">"Brak zbliżających się wydarzeń w kalendarzu"</string>
</resources>
diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml
index 6eba53a6..932ab19a 100644
--- a/res/values-ru/strings.xml
+++ b/res/values-ru/strings.xml
@@ -120,4 +120,13 @@
<string name="preferences_default_reminder_title">"Установить напоминание по умолчанию"</string>
<string name="preferences_default_reminder_dialog">"Время напоминания по умолчанию"</string>
<string name="preferences_default_reminder_default">"10"</string>
+ <string name="gadget_calendar">"Календарь:"</string>
+ <string name="gadget_now_event">"Сейчас: <xliff:g id="TIME_DATE">%s</xliff:g>"</string>
+ <string name="gadget_next_event">"Далее: <xliff:g id="TIME_DATE">%s</xliff:g>"</string>
+ <string name="gadget_later_event">"Позже: <xliff:g id="TIME_DATE">%s</xliff:g>"</string>
+ <plurals name="gadget_more_events">
+ <item quantity="one">"Еще одно событие"</item>
+ <item quantity="other">"Еще событий: <xliff:g id="NUMBER">%d</xliff:g>"</item>
+ </plurals>
+ <string name="gadget_no_events">"Нет предстоящих событий календаря"</string>
</resources>
diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml
index 9645f482..710810fc 100644
--- a/res/values-zh-rCN/strings.xml
+++ b/res/values-zh-rCN/strings.xml
@@ -120,4 +120,13 @@
<string name="preferences_default_reminder_title">"设置默认提醒"</string>
<string name="preferences_default_reminder_dialog">"默认提醒时间"</string>
<string name="preferences_default_reminder_default">"10"</string>
+ <string name="gadget_calendar">"日历:"</string>
+ <string name="gadget_now_event">"当前活动:<xliff:g id="TIME_DATE">%s</xliff:g>"</string>
+ <string name="gadget_next_event">"下一个活动:<xliff:g id="TIME_DATE">%s</xliff:g>"</string>
+ <string name="gadget_later_event">"稍后的活动:<xliff:g id="TIME_DATE">%s</xliff:g>"</string>
+ <plurals name="gadget_more_events">
+ <item quantity="one">"另外 1 个活动"</item>
+ <item quantity="other">"另外 <xliff:g id="NUMBER">%d</xliff:g> 个活动"</item>
+ </plurals>
+ <string name="gadget_no_events">"近期没有日历活动"</string>
</resources>
diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml
index e7ce72f1..99d2045d 100644
--- a/res/values-zh-rTW/strings.xml
+++ b/res/values-zh-rTW/strings.xml
@@ -120,4 +120,13 @@
<string name="preferences_default_reminder_title">"設定預設提醒"</string>
<string name="preferences_default_reminder_dialog">"預設提醒時間"</string>
<string name="preferences_default_reminder_default">"10"</string>
+ <string name="gadget_calendar">"日曆:"</string>
+ <string name="gadget_now_event">"目前活動:<xliff:g id="TIME_DATE">%s</xliff:g>"</string>
+ <string name="gadget_next_event">"下個活動:<xliff:g id="TIME_DATE">%s</xliff:g>"</string>
+ <string name="gadget_later_event">"稍後活動:<xliff:g id="TIME_DATE">%s</xliff:g>"</string>
+ <plurals name="gadget_more_events">
+ <item quantity="one">"還有 1 個活動"</item>
+ <item quantity="other">"還有 <xliff:g id="NUMBER">%d</xliff:g> 個活動"</item>
+ </plurals>
+ <string name="gadget_no_events">"沒有即將開始的日曆活動"</string>
</resources>
diff --git a/res/values/colors.xml b/res/values/colors.xml
index 32cfc284..b72c07ff 100644
--- a/res/values/colors.xml
+++ b/res/values/colors.xml
@@ -50,6 +50,14 @@
<color name="month_week_banner">#20595959</color>
<color name="event_center">#ff6bd697</color>
+
+ <color name="gadget_when">#ffffffff</color>
+ <color name="gadget_reminder">#ffffffff</color>
+ <color name="gadget_title">#ff000000</color>
+ <color name="gadget_where">#ff000000</color>
+ <color name="gadget_calendar">#ff000000</color>
+
+ <color name="gadget_no_events">#bb000000</color>
<drawable name="agenda_item_declined">#88ffffff</drawable>
</resources>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 8ee9a03b..28500971 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -347,4 +347,25 @@
<!-- Default value for the number of reminder minutes -->
<string name="preferences_default_reminder_default">10</string>
+ <!-- Bold prefix for gadget that identifies the calendar display name -->
+ <string name="gadget_calendar">Calendar:</string>
+
+ <!-- Prefix for date/time of currently happening event in gadget -->
+ <string name="gadget_now_event">Now: <xliff:g id="time_date">%s</xliff:g></string>
+ <!-- Prefix for date/time of next upcoming event in gadget -->
+ <string name="gadget_next_event">Next: <xliff:g id="time_date">%s</xliff:g></string>
+ <!-- Prefix for date/time of later upcoming event in gadget -->
+ <string name="gadget_later_event">Later: <xliff:g id="time_date">%s</xliff:g></string>
+
+ <!-- Shown in gadget when additional events are available for display, but no room remaining -->
+ <plurals name="gadget_more_events">
+ <!-- additional events message for 1 event -->
+ <item quantity="one">1 more event</item>
+ <!-- additional events message for multiple events -->
+ <item quantity="other"><xliff:g id="number">%d</xliff:g> more events</item>
+ </plurals>
+
+ <!-- Caption to show on gadget when there are no upcoming calendar events -->
+ <string name="gadget_no_events">No upcoming calendar events</string>
+
</resources>
diff --git a/res/xml/gadget_info.xml b/res/xml/gadget_info.xml
new file mode 100644
index 00000000..317384a9
--- /dev/null
+++ b/res/xml/gadget_info.xml
@@ -0,0 +1,23 @@
+<?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.
+-->
+
+<gadget-provider xmlns:android="http://schemas.android.com/apk/res/android"
+ android:minWidth="294dip"
+ android:minHeight="72dip"
+ android:updatePeriodMillis="0"
+ android:initialLayout="@layout/gadget_item"
+ >
+</gadget-provider>
diff --git a/src/com/android/calendar/CalendarGadgetProvider.java b/src/com/android/calendar/CalendarGadgetProvider.java
new file mode 100644
index 00000000..971b2683
--- /dev/null
+++ b/src/com/android/calendar/CalendarGadgetProvider.java
@@ -0,0 +1,563 @@
+/*
+ * 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.app.AlarmManager;
+import android.app.PendingIntent;
+import android.content.BroadcastReceiver;
+import android.content.ComponentName;
+import android.content.ContentResolver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.res.Resources;
+import android.database.Cursor;
+import android.gadget.GadgetManager;
+import android.gadget.GadgetProvider;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.graphics.Canvas;
+import android.graphics.Paint;
+import android.graphics.PorterDuff;
+import android.graphics.drawable.Drawable;
+import android.net.Uri;
+import android.provider.Calendar;
+import android.provider.Calendar.Attendees;
+import android.provider.Calendar.Calendars;
+import android.provider.Calendar.EventsColumns;
+import android.provider.Calendar.Instances;
+import android.provider.Calendar.Reminders;
+import android.text.format.DateFormat;
+import android.text.format.DateUtils;
+import android.text.format.Time;
+import android.util.Config;
+import android.util.Log;
+import android.view.View;
+import android.widget.RemoteViews;
+
+import java.util.Arrays;
+import java.util.Date;
+import java.util.GregorianCalendar;
+
+/**
+ * Simple gadget to show next upcoming calendar event.
+ */
+public class CalendarGadgetProvider extends GadgetProvider {
+ static final String TAG = "CalendarGadgetProvider";
+ static final boolean LOGD = false;
+
+ // TODO: listen for timezone and system time changes to update date icon
+
+ static final String EVENT_SORT_ORDER = "startDay ASC, allDay ASC, begin ASC";
+
+ static final String[] EVENT_PROJECTION = new String[] {
+ Instances.ALL_DAY,
+ Instances.BEGIN,
+ Instances.END,
+ Instances.COLOR,
+ Instances.TITLE,
+ Instances.RRULE,
+ Instances.HAS_ALARM,
+ Instances.EVENT_LOCATION,
+ Instances.CALENDAR_ID,
+ Instances.EVENT_ID,
+ };
+
+ static final int INDEX_ALL_DAY = 0;
+ static final int INDEX_BEGIN = 1;
+ static final int INDEX_END = 2;
+ static final int INDEX_COLOR = 3;
+ static final int INDEX_TITLE = 4;
+ static final int INDEX_RRULE = 5;
+ static final int INDEX_HAS_ALARM = 6;
+ static final int INDEX_EVENT_LOCATION = 7;
+ static final int INDEX_CALENDAR_ID = 8;
+ static final int INDEX_EVENT_ID = 9;
+
+ static final long SEARCH_DURATION = DateUtils.WEEK_IN_MILLIS;
+
+ static final long UPDATE_DELAY_TRIGGER_DURATION = DateUtils.MINUTE_IN_MILLIS * 30;
+ static final long UPDATE_DELAY_DURATION = DateUtils.MINUTE_IN_MILLIS * 5;
+
+ static final long UPDATE_NO_EVENTS = DateUtils.DAY_IN_MILLIS;
+
+ private static final int[] DATE_ICONS = new int[] {
+ R.drawable.ic_date_01, R.drawable.ic_date_02, R.drawable.ic_date_03,
+ R.drawable.ic_date_04, R.drawable.ic_date_05, R.drawable.ic_date_06,
+ R.drawable.ic_date_07, R.drawable.ic_date_08, R.drawable.ic_date_09,
+ R.drawable.ic_date_10, R.drawable.ic_date_11, R.drawable.ic_date_12,
+ R.drawable.ic_date_13, R.drawable.ic_date_14, R.drawable.ic_date_15,
+ R.drawable.ic_date_16, R.drawable.ic_date_17, R.drawable.ic_date_18,
+ R.drawable.ic_date_19, R.drawable.ic_date_20, R.drawable.ic_date_21,
+ R.drawable.ic_date_22, R.drawable.ic_date_23, R.drawable.ic_date_24,
+ R.drawable.ic_date_25, R.drawable.ic_date_26, R.drawable.ic_date_27,
+ R.drawable.ic_date_28, R.drawable.ic_date_29, R.drawable.ic_date_30,
+ R.drawable.ic_date_31,
+ };
+
+ @Override
+ public void onDisabled(Context context) {
+ // Unsubscribe from all AlarmManager updates
+ AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
+ PendingIntent pendingUpdate = getUpdateIntent(context);
+ am.cancel(pendingUpdate);
+ }
+
+ @Override
+ public void onUpdate(Context context, GadgetManager gadgetManager, int[] gadgetIds) {
+ performUpdate(context, gadgetIds);
+ }
+
+ static void performUpdate(Context context, int[] gadgetIds) {
+ performUpdate(context, gadgetIds, Long.MIN_VALUE, Long.MAX_VALUE);
+ }
+
+ /**
+ * Process and push out an update for the given gadgetIds.
+ */
+ static void performUpdate(Context context, int[] gadgetIds,
+ long changedStart, long changedEnd) {
+ ContentResolver resolver = context.getContentResolver();
+
+ Cursor cursor = null;
+ RemoteViews views = null;
+ long triggerTime = -1;
+
+ try {
+ cursor = getUpcomingInstancesCursor(resolver, SEARCH_DURATION);
+ if (cursor != null) {
+ MarkedEvents events = buildMarkedEvents(cursor);
+ if (events.primaryCount == 0) {
+ views = getGadgetNoEvents(context);
+ } else if (causesUpdate(events, changedStart, changedEnd)) {
+ views = getGadgetUpdate(context, cursor, events);
+ triggerTime = calculateUpdateTime(context, cursor, events);
+ }
+ } else {
+ views = getGadgetNoEvents(context);
+ }
+ } finally {
+ if (cursor != null) {
+ cursor.close();
+ }
+ }
+
+ // Bail out early if no update built
+ if (views == null) {
+ return;
+ }
+
+ GadgetManager gm = GadgetManager.getInstance(context);
+ if (gadgetIds != null) {
+ gm.updateGadget(gadgetIds, views);
+ } else {
+ ComponentName thisGadget = new ComponentName(context, CalendarGadgetProvider.class);
+ gm.updateGadget(thisGadget, views);
+ }
+
+ // Schedule an alarm to wake ourselves up for the next update. We also cancel
+ // all existing wake-ups because PendingIntents don't match against extras.
+
+ // If no next-update calculated, schedule update about a day from now
+ long now = System.currentTimeMillis();
+ if (triggerTime == -1) {
+ triggerTime = now + UPDATE_NO_EVENTS;
+ }
+
+ // If requested update in past then bail out. This means we lose future
+ // updates, but it's better than possibly looping to death.
+ if (triggerTime <= now) {
+ Log.w(TAG, String.format(
+ "Encountered a bad triggerTime=%d, so bailing on future updates", triggerTime));
+ }
+
+ // Force early update at midnight to change date, if needed
+ long nextMidnight = getNextMidnight();
+ if (triggerTime > nextMidnight) {
+ triggerTime = nextMidnight;
+ }
+
+ AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
+ PendingIntent pendingUpdate = getUpdateIntent(context);
+
+ am.cancel(pendingUpdate);
+ am.set(AlarmManager.RTC, triggerTime, pendingUpdate);
+
+ if (LOGD) {
+ long seconds = (triggerTime - System.currentTimeMillis()) /
+ DateUtils.SECOND_IN_MILLIS;
+ Log.d(TAG, String.format("Scheduled next update at %d (%d seconds from now)",
+ triggerTime, seconds));
+ }
+ }
+
+ static PendingIntent getUpdateIntent(Context context) {
+ Intent updateIntent = new Intent(GadgetManager.ACTION_GADGET_UPDATE);
+ return PendingIntent.getBroadcast(context, 0 /* no requestCode */,
+ updateIntent, 0 /* no flags */);
+ }
+
+ /**
+ * Figure out the best time to push gadget updates. If the event is longer
+ * than 30 minutes, we should wait until 5 minutes after it starts to
+ * replace it with next event. Otherwise we replace at start time.
+ * <p>
+ * Absolute worst case is that we don't have an upcoming event in the next
+ * week, so we should wait an entire day before the next push.
+ */
+ static long calculateUpdateTime(Context context, Cursor cursor, MarkedEvents events) {
+ ContentResolver resolver = context.getContentResolver();
+ long result = System.currentTimeMillis() + DateUtils.DAY_IN_MILLIS;
+
+ if (events.primaryRow != -1) {
+ cursor.moveToPosition(events.primaryRow);
+ long start = cursor.getLong(INDEX_BEGIN);
+ long end = cursor.getLong(INDEX_END);
+
+ // If event is longer than our trigger, avoid pushing an update
+ // for next event until a few minutes after it starts. (Otherwise
+ // just push the update right as the event starts.)
+ long length = end - start;
+ if (length >= UPDATE_DELAY_TRIGGER_DURATION) {
+ result = start + UPDATE_DELAY_DURATION;
+ } else {
+ result = start;
+ }
+ }
+ return result;
+ }
+
+ /**
+ * Return next midnight in current timezone.
+ */
+ static long getNextMidnight() {
+ Time time = new Time();
+ time.set(System.currentTimeMillis() + DateUtils.DAY_IN_MILLIS);
+ time.hour = 0;
+ time.minute = 0;
+ time.second = 0;
+ return time.toMillis(true /* ignore DST */);
+ }
+
+ /**
+ * Build a set of {@link RemoteViews} that describes how to update any
+ * gadget for a specific event instance.
+ *
+ * @param cursor Valid cursor on {@link Instances#CONTENT_URI}
+ * @param events {@link MarkedEvents} parsed from the cursor
+ */
+ static RemoteViews getGadgetUpdate(Context context, Cursor cursor, MarkedEvents events) {
+ Resources res = context.getResources();
+ ContentResolver resolver = context.getContentResolver();
+
+ RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.gadget_item);
+
+ // Clicking on gadget launches the agenda view in Calendar
+ // TODO: launch to specific primaryEventTime (bug 1648608)
+ Intent agendaIntent = new Intent(context, AgendaActivity.class);
+ PendingIntent pendingIntent = PendingIntent.getActivity(context, 0 /* no requestCode */,
+ agendaIntent, 0 /* no flags */);
+
+ views.setOnClickPendingIntent(R.id.gadget, pendingIntent);
+
+ // Build calendar icon with actual date
+ Bitmap dateIcon = buildDateIcon(context);
+ views.setImageViewBitmap(R.id.icon, dateIcon);
+ views.setViewVisibility(R.id.icon, View.VISIBLE);
+ views.setViewVisibility(R.id.no_events, View.GONE);
+
+ long nextMidnight = getNextMidnight();
+
+ // Fill primary event details
+ if (events.primaryRow != -1) {
+ views.setViewVisibility(R.id.primary_card, View.VISIBLE);
+ cursor.moveToPosition(events.primaryRow);
+
+ // Color stripe
+ int colorFilter = cursor.getInt(INDEX_COLOR);
+ views.setDrawableParameters(R.id.when, true, -1, colorFilter,
+ PorterDuff.Mode.SRC_IN, -1);
+ views.setTextColor(R.id.title, colorFilter);
+ views.setTextColor(R.id.where, colorFilter);
+ views.setDrawableParameters(R.id.divider, true, -1, colorFilter,
+ PorterDuff.Mode.SRC_IN, -1);
+ views.setTextColor(R.id.title2, colorFilter);
+
+ // When
+ long start = cursor.getLong(INDEX_BEGIN);
+ boolean allDay = cursor.getInt(INDEX_ALL_DAY) != 0;
+
+ int flags;
+ String whenString;
+ if (allDay) {
+ flags = DateUtils.FORMAT_ABBREV_ALL | DateUtils.FORMAT_UTC
+ | DateUtils.FORMAT_SHOW_DATE;
+ } else {
+ flags = DateUtils.FORMAT_ABBREV_ALL | DateUtils.FORMAT_SHOW_TIME;
+ // Show date if starts beyond next midnight
+ if (start > nextMidnight) {
+ flags = flags | DateUtils.FORMAT_SHOW_DATE;
+ }
+ }
+ if (DateFormat.is24HourFormat(context)) {
+ flags |= DateUtils.FORMAT_24HOUR;
+ }
+ whenString = DateUtils.formatDateRange(context, start, start, flags);
+ views.setTextViewText(R.id.when, whenString);
+
+ // What
+ String titleString = cursor.getString(INDEX_TITLE);
+ if (titleString == null || titleString.length() == 0) {
+ titleString = context.getString(R.string.no_title_label);
+ }
+ views.setTextViewText(R.id.title, titleString);
+
+ // Where
+ String whereString = cursor.getString(INDEX_EVENT_LOCATION);
+ if (whereString != null && whereString.length() > 0) {
+ views.setViewVisibility(R.id.where, View.VISIBLE);
+ views.setViewVisibility(R.id.stub_where, View.INVISIBLE);
+ views.setTextViewText(R.id.where, whereString);
+ } else {
+ views.setViewVisibility(R.id.where, View.GONE);
+ views.setViewVisibility(R.id.stub_where, View.GONE);
+ }
+ }
+
+ // Fill other primary events, if present
+ if (events.primaryConflictRow != -1) {
+ views.setViewVisibility(R.id.divider, View.VISIBLE);
+ views.setViewVisibility(R.id.title2, View.VISIBLE);
+
+ if (events.primaryCount > 2) {
+ // If more than two primary conflicts, format multiple message
+ int count = events.primaryCount - 1;
+ String titleString = String.format(res.getQuantityString(
+ R.plurals.gadget_more_events, count), count);
+ views.setTextViewText(R.id.title2, titleString);
+ } else {
+ cursor.moveToPosition(events.primaryConflictRow);
+
+ // What
+ String titleString = cursor.getString(INDEX_TITLE);
+ if (titleString == null || titleString.length() == 0) {
+ titleString = context.getString(R.string.no_title_label);
+ }
+ views.setTextViewText(R.id.title2, titleString);
+ }
+ } else {
+ views.setViewVisibility(R.id.divider, View.GONE);
+ views.setViewVisibility(R.id.title2, View.GONE);
+ }
+
+ // Fill secondary event
+ if (events.secondaryRow != -1) {
+ views.setViewVisibility(R.id.secondary_card, View.VISIBLE);
+ views.setViewVisibility(R.id.secondary_when, View.VISIBLE);
+ views.setViewVisibility(R.id.secondary_title, View.VISIBLE);
+
+ cursor.moveToPosition(events.secondaryRow);
+
+ // Color stripe
+ int colorFilter = cursor.getInt(INDEX_COLOR);
+ views.setDrawableParameters(R.id.secondary_when, true, -1, colorFilter,
+ PorterDuff.Mode.SRC_IN, -1);
+ views.setTextColor(R.id.secondary_title, colorFilter);
+
+ // When
+ long start = cursor.getLong(INDEX_BEGIN);
+ boolean allDay = cursor.getInt(INDEX_ALL_DAY) != 0;
+
+ int flags;
+ String whenString;
+ if (allDay) {
+ flags = DateUtils.FORMAT_ABBREV_ALL | DateUtils.FORMAT_UTC
+ | DateUtils.FORMAT_SHOW_DATE;
+ } else {
+ flags = DateUtils.FORMAT_ABBREV_ALL | DateUtils.FORMAT_SHOW_TIME;
+ // Show date if starts beyond next midnight
+ if (start > nextMidnight) {
+ flags = flags | DateUtils.FORMAT_SHOW_DATE;
+ }
+ }
+ if (DateFormat.is24HourFormat(context)) {
+ flags |= DateUtils.FORMAT_24HOUR;
+ }
+ whenString = DateUtils.formatDateRange(context, start, start, flags);
+ views.setTextViewText(R.id.secondary_when, whenString);
+
+ if (events.secondaryCount > 1) {
+ // If more than two secondary conflicts, format multiple message
+ int count = events.secondaryCount;
+ String titleString = String.format(res.getQuantityString(
+ R.plurals.gadget_more_events, count), count);
+ views.setTextViewText(R.id.secondary_title, titleString);
+ } else {
+ // What
+ String titleString = cursor.getString(INDEX_TITLE);
+ if (titleString == null || titleString.length() == 0) {
+ titleString = context.getString(R.string.no_title_label);
+ }
+ views.setTextViewText(R.id.secondary_title, titleString);
+ }
+ } else {
+ views.setViewVisibility(R.id.secondary_when, View.GONE);
+ views.setViewVisibility(R.id.secondary_title, View.GONE);
+ }
+
+ return views;
+ }
+
+ /**
+ * Build a set of {@link RemoteViews} that describes an error state.
+ */
+ static RemoteViews getGadgetNoEvents(Context context) {
+ RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.gadget_item);
+
+ views.setViewVisibility(R.id.icon, View.GONE);
+ views.setViewVisibility(R.id.no_events, View.VISIBLE);
+
+ views.setViewVisibility(R.id.primary_card, View.GONE);
+ views.setViewVisibility(R.id.secondary_card, View.GONE);
+
+ // Clicking on gadget launches the agenda view in Calendar
+ Intent agendaIntent = new Intent(context, AgendaActivity.class);
+ PendingIntent pendingIntent = PendingIntent.getActivity(context, 0 /* no requestCode */,
+ agendaIntent, 0 /* no flags */);
+
+ views.setOnClickPendingIntent(R.id.gadget, pendingIntent);
+
+ return views;
+ }
+
+ /**
+ * Build super-awesome calendar icon with actual date overlay. Uses current
+ * system date to generate.
+ */
+ static Bitmap buildDateIcon(Context context) {
+ Time time = new Time();
+ time.setToNow();
+ int dateNumber = time.monthDay;
+
+ Resources res = context.getResources();
+ Bitmap blankIcon = BitmapFactory.decodeResource(res, R.drawable.app_icon_blank);
+ Bitmap overlay = BitmapFactory.decodeResource(res, DATE_ICONS[dateNumber - 1]);
+
+ Bitmap result = Bitmap.createBitmap(blankIcon.getWidth(),
+ blankIcon.getHeight(), blankIcon.getConfig());
+
+ Canvas canvas = new Canvas(result);
+ Paint paint = new Paint();
+
+ canvas.drawBitmap(blankIcon, 0f, 0f, paint);
+ canvas.drawBitmap(overlay, 0f, 0f, paint);
+
+ return result;
+ }
+
+ static class MarkedEvents {
+ long primaryTime = -1;
+ int primaryRow = -1;
+ int primaryConflictRow = -1;
+ int primaryCount = 0;
+ long secondaryTime = -1;
+ int secondaryRow = -1;
+ int secondaryCount = 0;
+ }
+
+ /**
+ * Check if the given {@link MarkedEvents} should cause an update based on a
+ * time span, usually coming from a calendar changed event.
+ */
+ static boolean causesUpdate(MarkedEvents events, long changedStart, long changedEnd) {
+ boolean primaryTouched =
+ (events.primaryTime >= changedStart && events.primaryTime <= changedEnd);
+ boolean secondaryTouched =
+ (events.secondaryTime >= changedStart && events.secondaryTime <= changedEnd);
+ return (primaryTouched || secondaryTouched);
+ }
+
+ /**
+ * Walk the given instances cursor and build a list of marked events to be
+ * used when updating the gadget. This structure is also used to check if
+ * updates are needed. Assumes the incoming cursor is valid.
+ */
+ static MarkedEvents buildMarkedEvents(Cursor cursor) {
+ MarkedEvents events = new MarkedEvents();
+ long now = System.currentTimeMillis();
+
+ cursor.moveToPosition(-1);
+ while (cursor.moveToNext()) {
+ int row = cursor.getPosition();
+ long begin = cursor.getLong(INDEX_BEGIN);
+ boolean allDay = cursor.getInt(INDEX_ALL_DAY) != 0;
+
+ // Skip all-day events that have already started
+ if (allDay && begin < now) {
+ continue;
+ }
+
+ if (events.primaryRow == -1) {
+ // Found first event
+ events.primaryRow = row;
+ events.primaryTime = begin;
+ events.primaryCount = 1;
+ } else if (events.primaryTime == begin) {
+ // Found conflicting primary event
+ if (events.primaryConflictRow == -1) {
+ events.primaryConflictRow = row;
+ }
+ events.primaryCount += 1;
+ } else if (events.secondaryRow == -1) {
+ // Found second event
+ events.secondaryRow = row;
+ events.secondaryTime = begin;
+ events.secondaryCount = 1;
+ } else if (events.secondaryTime == begin) {
+ // Found conflicting secondary event
+ events.secondaryCount += 1;
+ } else {
+ // Nothing interesting about this event, so bail out
+ }
+ }
+ return events;
+ }
+
+ /**
+ * Query across all calendars for upcoming event instances from now until
+ * some time in the future.
+ *
+ * @param searchDuration Distance into the future to look for event
+ * instances, in milliseconds.
+ */
+ static Cursor getUpcomingInstancesCursor(ContentResolver resolver, long searchDuration) {
+ // Search for events from now until some time in the future
+ long start = System.currentTimeMillis();
+ long end = start + searchDuration;
+
+ Uri uri = Uri.withAppendedPath(Instances.CONTENT_URI,
+ String.format("%d/%d", start, end));
+
+ // Make sure we only look at events *starting* after now
+ String selection = String.format("%s=1 AND %s!=%d AND %s>=%d",
+ Calendars.SELECTED, Instances.SELF_ATTENDEE_STATUS,
+ Attendees.ATTENDEE_STATUS_DECLINED, Instances.BEGIN, start);
+
+ return resolver.query(uri, EVENT_PROJECTION, selection, null,
+ EVENT_SORT_ORDER);
+ }
+
+}
diff --git a/src/com/android/calendar/CalendarView.java b/src/com/android/calendar/CalendarView.java
index a50c44be..e664ae62 100644
--- a/src/com/android/calendar/CalendarView.java
+++ b/src/com/android/calendar/CalendarView.java
@@ -36,6 +36,7 @@ import android.graphics.RectF;
import android.graphics.Typeface;
import android.graphics.Paint.Style;
import android.graphics.Path.Direction;
+import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.Handler;
import android.provider.Calendar.Attendees;
@@ -44,7 +45,6 @@ import android.provider.Calendar.Events;
import android.text.format.DateFormat;
import android.text.format.DateUtils;
import android.text.format.Time;
-import android.text.TextUtils;
import android.util.Log;
import android.view.ContextMenu;
import android.view.Gravity;
@@ -54,8 +54,6 @@ import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewConfiguration;
-import android.view.ViewGroup;
-import android.view.WindowManager;
import android.view.ContextMenu.ContextMenuInfo;
import android.widget.ImageView;
import android.widget.PopupWindow;
@@ -126,6 +124,10 @@ public class CalendarView extends View
private long mLastReloadMillis;
private ArrayList<Event> mEvents = new ArrayList<Event>();
+ private Drawable mBoxNormal;
+ private Drawable mBoxSelected;
+ private Drawable mBoxPressed;
+ private Drawable mBoxLongPressed;
private int mSelectionDay; // Julian day
private int mSelectionHour;
@@ -152,6 +154,7 @@ public class CalendarView extends View
private PopupWindow mPopup;
private View mPopupView;
+ private static final int POPUP_HEIGHT = 67;
// The number of milliseconds to show the popup window
private static final int POPUP_DISMISS_DELAY = 3000;
@@ -209,6 +212,7 @@ public class CalendarView extends View
private int mViewHeight;
private int mViewWidth;
private int mGridAreaHeight;
+ private int mGridAreaWidth;
private int mCellHeight;
private int mScrollStartY;
private int mPreviousDirection;
@@ -372,13 +376,14 @@ public class CalendarView extends View
p.setTextSize(AMPM_FONT_SIZE);
mHoursWidth = computeMaxStringWidth(mHoursWidth, ampm, p);
mHoursWidth += HOURS_MARGIN;
+ mBoxNormal = mResources.getDrawable(R.drawable.box_appointment_normal);
+ mBoxSelected = mResources.getDrawable(R.drawable.box_appointment_selected);
+ mBoxPressed = mResources.getDrawable(R.drawable.box_appointment_pressed);
+ mBoxLongPressed = mResources.getDrawable(R.drawable.box_appointment_longpress);
LayoutInflater inflater;
inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
mPopupView = inflater.inflate(R.layout.bubble_event, null);
- mPopupView.setLayoutParams(new ViewGroup.LayoutParams(
- ViewGroup.LayoutParams.FILL_PARENT,
- ViewGroup.LayoutParams.WRAP_CONTENT));
mPopup = new PopupWindow(context);
mPopup.setContentView(mPopupView);
Resources.Theme dialogTheme = getResources().newTheme();
@@ -537,8 +542,8 @@ public class CalendarView extends View
protected void onSizeChanged(int width, int height, int oldw, int oldh) {
mViewWidth = width;
mViewHeight = height;
- int gridAreaWidth = width - mHoursWidth;
- mCellWidth = (gridAreaWidth - (mNumDays * DAY_GAP)) / mNumDays;
+ mGridAreaWidth = width - mHoursWidth;
+ mCellWidth = (mGridAreaWidth - (mNumDays * DAY_GAP)) / mNumDays;
Paint p = new Paint();
p.setTextSize(NORMAL_FONT_SIZE);
@@ -675,7 +680,7 @@ public class CalendarView extends View
int eventAreaWidth = mNumDays * (mCellWidth + DAY_GAP);
mPopup.dismiss();
mPopup.setWidth(eventAreaWidth - 20);
- mPopup.setHeight(WindowManager.LayoutParams.WRAP_CONTENT);
+ mPopup.setHeight(POPUP_HEIGHT);
}
/**
@@ -855,7 +860,7 @@ public class CalendarView extends View
mSelectionMode = SELECTION_SELECTED;
mScrolling = false;
- boolean redraw;
+ boolean redraw = false;
int selectionDay = mSelectionDay;
switch (keyCode) {
@@ -1755,10 +1760,10 @@ public class CalendarView extends View
int startEventDistance1 = 100000; // any large number
int startEventDistance2 = 100000; // any large number
int prevLocation = FROM_NONE;
- int prevTop;
- int prevBottom;
- int prevLeft;
- int prevRight;
+ int prevTop = 0;
+ int prevBottom = 0;
+ int prevLeft = 0;
+ int prevRight = 0;
int prevCenter = 0;
Rect box = getCurrentSelectionPosition();
if (mPrevSelectedEvent != null) {
@@ -2045,17 +2050,17 @@ public class CalendarView extends View
mPrevSelectedEvent = event;
// box = mBoxPressed;
p.setColor(mPressedColor); // FIXME:pressed
- eventTextPaint.setColor(mSelectedEventTextColor);
+ eventTextPaint.setColor(this.mSelectedEventTextColor);
} else if (mSelectionMode == SELECTION_SELECTED) {
// Also, remember the last selected event that we drew
mPrevSelectedEvent = event;
// box = mBoxSelected;
p.setColor(mSelectionColor);
- eventTextPaint.setColor(mSelectedEventTextColor);
+ eventTextPaint.setColor(this.mSelectedEventTextColor);
} else if (mSelectionMode == SELECTION_LONGPRESS) {
// box = mBoxLongPressed;
p.setColor(mPressedColor); // FIXME: longpressed (maybe -- this doesn't seem to work)
- eventTextPaint.setColor(mSelectedEventTextColor);
+ eventTextPaint.setColor(this.mSelectedEventTextColor);
} else {
p.setColor(color);
eventTextPaint.setColor(mEventTextColor);
@@ -2081,7 +2086,7 @@ public class CalendarView extends View
}
private void drawEventText(Event event, RectF rf, Canvas canvas, Paint p, int topMargin) {
- if (!mDrawTextInEventRect) {
+ if (mDrawTextInEventRect == false) {
return;
}
@@ -2205,9 +2210,7 @@ public class CalendarView extends View
timeView.setText(timeRange);
TextView whereView = (TextView) mPopupView.findViewById(R.id.where);
- final boolean empty = TextUtils.isEmpty(event.location);
- whereView.setVisibility(empty ? View.GONE : View.VISIBLE);
- if (!empty) whereView.setText(event.location);
+ whereView.setText(event.location);
mPopup.showAtLocation(this, Gravity.BOTTOM | Gravity.LEFT, mHoursWidth, 5);
postDelayed(mDismissPopup, POPUP_DISMISS_DELAY);
@@ -2382,6 +2385,7 @@ public class CalendarView extends View
CalendarView view = mParentActivity.getNextView();
Time date = view.mBaseDate;
date.set(mBaseDate);
+ int selectionDay;
boolean switchForward;
if (deltaX > 0) {
date.monthDay -= mNumDays;
@@ -2675,11 +2679,15 @@ public class CalendarView extends View
if (attendeesCursor.moveToFirst()) {
relationship = attendeesCursor.getInt(ATTENDEES_INDEX_RELATIONSHIP);
}
- attendeesCursor.close();
}
+ attendeesCursor.close();
- return visibility >= Calendars.CONTRIBUTOR_ACCESS &&
- relationship >= Attendees.RELATIONSHIP_ORGANIZER;
+ if (visibility >= Calendars.CONTRIBUTOR_ACCESS &&
+ relationship >= Attendees.RELATIONSHIP_ORGANIZER) {
+ return true;
+ }
+
+ return false;
}
/**
diff --git a/src/com/android/calendar/SelectCalendarsActivity.java b/src/com/android/calendar/SelectCalendarsActivity.java
index 44943eb8..0b00bbcc 100644
--- a/src/com/android/calendar/SelectCalendarsActivity.java
+++ b/src/com/android/calendar/SelectCalendarsActivity.java
@@ -81,6 +81,12 @@ public class SelectCalendarsActivity extends Activity implements ListView.OnItem
@Override
public void onPause() {
super.onPause();
+
+ // We might have changed selected calendars, so push gadget updates
+
+ // TODO: remove this once we link up CalendarProvider and any gadgets to watch
+ // for updates to the Calendar table.
+ CalendarGadgetProvider.performUpdate(this, null);
}
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
diff --git a/tests/src/com/android/calendar/FormatDateRangeTest.java b/tests/src/com/android/calendar/FormatDateRangeTest.java
index 6f0d775d..7b34ac4e 100644
--- a/tests/src/com/android/calendar/FormatDateRangeTest.java
+++ b/tests/src/com/android/calendar/FormatDateRangeTest.java
@@ -23,20 +23,19 @@ import android.test.AndroidTestCase;
import android.test.suitebuilder.annotation.MediumTest;
import android.util.Log;
-import java.util.Calendar;
/**
* Unit tests for {@link android.text.format.DateUtils#formatDateRange}.
*/
public class FormatDateRangeTest extends AndroidTestCase {
- private class DateTest {
+ private class DateRange {
public Time date1;
public Time date2;
public int flags;
public String expectedOutput;
- public DateTest(int year1, int month1, int day1, int hour1, int minute1,
+ public DateRange(int year1, int month1, int day1, int hour1, int minute1,
int year2, int month2, int day2, int hour2, int minute2,
int flags, String output) {
if ((flags & DateUtils.FORMAT_UTC) != 0) {
@@ -62,117 +61,95 @@ public class FormatDateRangeTest extends AndroidTestCase {
this.flags = flags;
expectedOutput = output;
}
-
- // Single point in time. (not a range)
- public DateTest(int year1, int month1, int day1, int hour1, int minute1,
- int flags, String output) {
- this(year1, month1, day1, hour1, minute1,
- year1, month1, day1, hour1, minute1,
- flags, output);
- }
}
private Resources mResources;
- DateTest[] tests = {
- new DateTest(0, 10, 9, 8, 0, 0, 10, 9, 11, 0,
+ DateRange[] tests = {
+ new DateRange(0, 10, 9, 8, 0, 0, 10, 9, 11, 0,
DateUtils.FORMAT_SHOW_TIME | DateUtils.FORMAT_ABBREV_ALL, "8am \u2013 11am"),
- new DateTest(0, 10, 9, 8, 0, 0, 10, 9, 11, 0,
+ new DateRange(0, 10, 9, 8, 0, 0, 10, 9, 11, 0,
DateUtils.FORMAT_SHOW_TIME, "8:00am \u2013 11:00am"),
- new DateTest(0, 10, 9, 8, 0, 0, 10, 9, 17, 0,
+ new DateRange(0, 10, 9, 8, 0, 0, 10, 9, 17, 0,
DateUtils.FORMAT_SHOW_TIME | DateUtils.FORMAT_24HOUR, "08:00 \u2013 17:00"),
- new DateTest(0, 10, 9, 8, 0, 0, 10, 9, 12, 0,
+ new DateRange(0, 10, 9, 8, 0, 0, 10, 9, 12, 0,
DateUtils.FORMAT_SHOW_TIME | DateUtils.FORMAT_ABBREV_ALL, "8am \u2013 noon"),
- new DateTest(0, 10, 9, 8, 0, 0, 10, 9, 12, 0,
+ new DateRange(0, 10, 9, 8, 0, 0, 10, 9, 12, 0,
DateUtils.FORMAT_SHOW_TIME | DateUtils.FORMAT_NO_NOON | DateUtils.FORMAT_ABBREV_ALL,
"8am \u2013 12pm"),
- new DateTest(0, 10, 9, 8, 0, 0, 10, 9, 12, 0,
+ new DateRange(0, 10, 9, 8, 0, 0, 10, 9, 12, 0,
DateUtils.FORMAT_SHOW_TIME | DateUtils.FORMAT_CAP_NOON | DateUtils.FORMAT_ABBREV_ALL,
"8am \u2013 Noon"),
- new DateTest(0, 10, 9, 10, 30, 0, 10, 9, 13, 0,
+ new DateRange(0, 10, 9, 10, 30, 0, 10, 9, 13, 0,
DateUtils.FORMAT_SHOW_TIME | DateUtils.FORMAT_ABBREV_ALL, "10:30am \u2013 1pm"),
- new DateTest(0, 10, 9, 13, 0, 0, 10, 9, 14, 0,
+ new DateRange(0, 10, 9, 13, 0, 0, 10, 9, 14, 0,
DateUtils.FORMAT_SHOW_TIME | DateUtils.FORMAT_ABBREV_ALL, "1pm \u2013 2pm"),
- new DateTest(0, 10, 9, 0, 0, 0, 10, 9, 14, 0,
+ new DateRange(0, 10, 9, 0, 0, 0, 10, 9, 14, 0,
DateUtils.FORMAT_SHOW_TIME | DateUtils.FORMAT_ABBREV_ALL, "12am \u2013 2pm"),
- new DateTest(0, 10, 9, 20, 0, 0, 10, 10, 0, 0,
+ new DateRange(0, 10, 9, 20, 0, 0, 10, 10, 0, 0,
DateUtils.FORMAT_SHOW_TIME | DateUtils.FORMAT_ABBREV_ALL, "8pm \u2013 midnight"),
- new DateTest(0, 10, 10, 0, 0,
+ new DateRange(0, 10, 10, 0, 0, 0, 10, 10, 0, 0,
DateUtils.FORMAT_SHOW_TIME | DateUtils.FORMAT_ABBREV_ALL, "12am"),
- new DateTest(0, 10, 9, 20, 0, 0, 10, 10, 0, 0,
+ new DateRange(0, 10, 9, 20, 0, 0, 10, 10, 0, 0,
DateUtils.FORMAT_SHOW_TIME | DateUtils.FORMAT_24HOUR | DateUtils.FORMAT_ABBREV_ALL,
"20:00 \u2013 00:00"),
- new DateTest(0, 10, 10, 0, 0,
+ new DateRange(0, 10, 10, 0, 0, 0, 10, 10, 0, 0,
DateUtils.FORMAT_SHOW_TIME | DateUtils.FORMAT_24HOUR | DateUtils.FORMAT_ABBREV_ALL,
"00:00"),
- new DateTest(0, 10, 9, 20, 0, 0, 10, 10, 0, 0,
+ new DateRange(0, 10, 9, 20, 0, 0, 10, 10, 0, 0,
DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_ABBREV_ALL, "Nov 9"),
- new DateTest(0, 10, 10, 0, 0, 0, 10, 10, 0, 0,
+ new DateRange(0, 10, 10, 0, 0, 0, 10, 10, 0, 0,
DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_ABBREV_ALL, "Nov 10"),
- new DateTest(0, 10, 9, 20, 0, 0, 10, 10, 0, 0,
+ new DateRange(0, 10, 9, 20, 0, 0, 10, 10, 0, 0,
DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_24HOUR | DateUtils.FORMAT_ABBREV_ALL,
"Nov 9"),
- new DateTest(0, 10, 10, 0, 0,
+ new DateRange(0, 10, 10, 0, 0, 0, 10, 10, 0, 0,
DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_24HOUR | DateUtils.FORMAT_ABBREV_ALL,
"Nov 10"),
- new DateTest(0, 10, 9, 20, 0, 0, 10, 10, 0, 0,
+ new DateRange(0, 10, 9, 20, 0, 0, 10, 10, 0, 0,
DateUtils.FORMAT_SHOW_TIME | DateUtils.FORMAT_NO_MIDNIGHT | DateUtils.FORMAT_ABBREV_ALL,
"8pm \u2013 12am"),
- new DateTest(0, 10, 9, 20, 0, 0, 10, 10, 0, 0,
+ new DateRange(0, 10, 9, 20, 0, 0, 10, 10, 0, 0,
DateUtils.FORMAT_SHOW_TIME | DateUtils.FORMAT_CAP_MIDNIGHT | DateUtils.FORMAT_ABBREV_ALL,
"8pm \u2013 Midnight"),
- new DateTest(0, 10, 9, 0, 0, 0, 10, 10, 0, 0,
+ new DateRange(0, 10, 9, 0, 0, 0, 10, 10, 0, 0,
DateUtils.FORMAT_SHOW_TIME | DateUtils.FORMAT_ABBREV_ALL, "12am \u2013 midnight"),
- new DateTest(0, 10, 9, 0, 0, 0, 10, 10, 0, 0,
+ new DateRange(0, 10, 9, 0, 0, 0, 10, 10, 0, 0,
DateUtils.FORMAT_SHOW_TIME | DateUtils.FORMAT_24HOUR | DateUtils.FORMAT_ABBREV_ALL,
"00:00 \u2013 00:00"),
- new DateTest(0, 10, 9, 0, 0, 0, 10, 10, 0, 0,
+ new DateRange(0, 10, 9, 0, 0, 0, 10, 10, 0, 0,
DateUtils.FORMAT_UTC | DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_ABBREV_ALL, "Nov 9"),
- new DateTest(0, 10, 9, 0, 0, 0, 10, 10, 0, 0,
+ new DateRange(0, 10, 9, 0, 0, 0, 10, 10, 0, 0,
DateUtils.FORMAT_UTC | DateUtils.FORMAT_ABBREV_ALL, "Nov 9"),
- new DateTest(0, 10, 9, 0, 0, 0, 10, 10, 0, 0,
+ new DateRange(0, 10, 9, 0, 0, 0, 10, 10, 0, 0,
DateUtils.FORMAT_UTC, "November 9"),
- new DateTest(0, 10, 8, 0, 0, 0, 10, 10, 0, 0,
+ new DateRange(0, 10, 8, 0, 0, 0, 10, 10, 0, 0,
DateUtils.FORMAT_UTC | DateUtils.FORMAT_ABBREV_ALL, "Nov 8 \u2013 9"),
- new DateTest(0, 10, 9, 0, 0, 0, 10, 11, 0, 0,
+ new DateRange(0, 10, 9, 0, 0, 0, 10, 11, 0, 0,
DateUtils.FORMAT_UTC | DateUtils.FORMAT_ABBREV_ALL, "Nov 9 \u2013 10"),
- new DateTest(0, 10, 9, 8, 0, 0, 10, 11, 17, 0,
+ new DateRange(0, 10, 9, 8, 0, 0, 10, 11, 17, 0,
DateUtils.FORMAT_UTC | DateUtils.FORMAT_ABBREV_ALL, "Nov 9 \u2013 11"),
- new DateTest(0, 9, 29, 8, 0, 0, 10, 3, 17, 0,
+ new DateRange(0, 9, 29, 8, 0, 0, 10, 3, 17, 0,
DateUtils.FORMAT_UTC | DateUtils.FORMAT_ABBREV_ALL, "Oct 29 \u2013 Nov 3"),
- new DateTest(2007, 11, 29, 8, 0, 2008, 0, 2, 17, 0,
+ new DateRange(2007, 11, 29, 8, 0, 2008, 0, 2, 17, 0,
DateUtils.FORMAT_UTC | DateUtils.FORMAT_ABBREV_ALL, "Dec 29, 2007 \u2013 Jan 2, 2008"),
- new DateTest(2007, 11, 29, 0, 0, 2008, 0, 2, 0, 0,
+ new DateRange(2007, 11, 29, 0, 0, 2008, 0, 2, 0, 0,
DateUtils.FORMAT_UTC | DateUtils.FORMAT_ABBREV_ALL, "Dec 29, 2007 \u2013 Jan 1, 2008"),
- new DateTest(2007, 11, 29, 8, 0, 2008, 0, 2, 17, 0,
+ new DateRange(2007, 11, 29, 8, 0, 2008, 0, 2, 17, 0,
DateUtils.FORMAT_SHOW_TIME | DateUtils.FORMAT_ABBREV_ALL,
"Dec 29, 2007, 8am \u2013 Jan 2, 2008, 5pm"),
- new DateTest(0, 10, 9, 8, 0, 0, 10, 11, 17, 0,
+ new DateRange(0, 10, 9, 8, 0, 0, 10, 11, 17, 0,
DateUtils.FORMAT_SHOW_TIME | DateUtils.FORMAT_ABBREV_ALL,
"Nov 9, 8am \u2013 Nov 11, 5pm"),
- new DateTest(2007, 10, 9, 8, 0, 2007, 10, 11, 17, 0,
+ new DateRange(2007, 10, 9, 8, 0, 2007, 10, 11, 17, 0,
DateUtils.FORMAT_SHOW_WEEKDAY | DateUtils.FORMAT_ABBREV_ALL,
"Fri, Nov 9, 2007 \u2013 Sun, Nov 11, 2007"),
- new DateTest(2007, 10, 9, 8, 0, 2007, 10, 11, 17, 0,
+ new DateRange(2007, 10, 9, 8, 0, 2007, 10, 11, 17, 0,
DateUtils.FORMAT_SHOW_TIME | DateUtils.FORMAT_SHOW_WEEKDAY | DateUtils.FORMAT_ABBREV_ALL,
"Fri, Nov 9, 2007, 8am \u2013 Sun, Nov 11, 2007, 5pm"),
- new DateTest(2007, 11, 3, 13, 0, 2007, 11, 3, 14, 0,
+ new DateRange(2007, 11, 3, 13, 0, 2007, 11, 3, 14, 0,
DateUtils.FORMAT_SHOW_TIME | DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_SHOW_YEAR,
"1:00pm \u2013 2:00pm, December 3, 2007"),
- // Tests that FORMAT_SHOW_YEAR takes precedence over FORMAT_NO_YEAR:
- new DateTest(2007, 11, 3, 13, 0, 2007, 11, 3, 13, 0,
- DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_SHOW_YEAR | DateUtils.FORMAT_NO_YEAR,
- "December 3, 2007"),
- // Tests that year isn't shown by default with no year flags when time is the current year:
- new DateTest(
- Calendar.getInstance().get(Calendar.YEAR), 0, 3, 13, 0,
- DateUtils.FORMAT_SHOW_DATE,
- "January 3"),
- // Tests that the year is shown by default with no year flags when time isn't the current year:
- new DateTest(
- Calendar.getInstance().get(Calendar.YEAR) - 1, 0, 3, 13, 0,
- DateUtils.FORMAT_SHOW_DATE,
- "January 3, 2008"),
};
@Override
@@ -186,17 +163,17 @@ public class FormatDateRangeTest extends AndroidTestCase {
public void testAll() throws Exception {
int len = tests.length;
for (int index = 0; index < len; index++) {
- DateTest dateTest = tests[index];
- long startMillis = dateTest.date1.toMillis(false /* use isDst */);
- long endMillis = dateTest.date2.toMillis(false /* use isDst */);
- int flags = dateTest.flags;
+ DateRange dateRange = tests[index];
+ long startMillis = dateRange.date1.toMillis(false /* use isDst */);
+ long endMillis = dateRange.date2.toMillis(false /* use isDst */);
+ int flags = dateRange.flags;
String output = DateUtils.formatDateRange(mContext, startMillis, endMillis, flags);
- if (!dateTest.expectedOutput.equals(output)) {
+ if (!dateRange.expectedOutput.equals(output)) {
Log.i("FormatDateRangeTest", "index " + index
- + " expected: " + dateTest.expectedOutput
+ + " expected: " + dateRange.expectedOutput
+ " actual: " + output);
}
- assertEquals(dateTest.expectedOutput, output);
+ assertEquals(dateRange.expectedOutput, output);
}
}
}