summaryrefslogtreecommitdiff
path: root/library
diff options
context:
space:
mode:
Diffstat (limited to 'library')
-rw-r--r--library/Android.mk6
-rw-r--r--library/common-gingerbread.mk4
-rw-r--r--library/eclair-mr1/res/drawable-hdpi/suw_navbar_ic_left_arrow.pngbin334 -> 0 bytes
-rw-r--r--library/eclair-mr1/res/drawable-hdpi/suw_navbar_ic_right_arrow.pngbin346 -> 0 bytes
-rw-r--r--library/eclair-mr1/res/drawable-mdpi/suw_navbar_ic_left_arrow.pngbin297 -> 0 bytes
-rw-r--r--library/eclair-mr1/res/drawable-mdpi/suw_navbar_ic_right_arrow.pngbin303 -> 0 bytes
-rw-r--r--library/eclair-mr1/res/drawable-xhdpi/suw_navbar_ic_left_arrow.pngbin377 -> 0 bytes
-rw-r--r--library/eclair-mr1/res/drawable-xhdpi/suw_navbar_ic_right_arrow.pngbin364 -> 0 bytes
-rw-r--r--library/eclair-mr1/res/drawable-xxhdpi/suw_navbar_ic_left_arrow.pngbin524 -> 0 bytes
-rw-r--r--library/eclair-mr1/res/drawable-xxhdpi/suw_navbar_ic_right_arrow.pngbin512 -> 0 bytes
-rw-r--r--library/eclair-mr1/res/drawable-xxxhdpi/suw_navbar_ic_left_arrow.pngbin547 -> 0 bytes
-rw-r--r--library/eclair-mr1/res/drawable-xxxhdpi/suw_navbar_ic_right_arrow.pngbin540 -> 0 bytes
-rw-r--r--library/gingerbread/res/drawable-hdpi/suw_navbar_ic_down_arrow.png (renamed from library/eclair-mr1/res/drawable-hdpi/suw_navbar_ic_down_arrow.png)bin160 -> 160 bytes
-rw-r--r--library/gingerbread/res/drawable-hdpi/suw_navbar_ic_left_arrow.pngbin0 -> 132 bytes
-rw-r--r--library/gingerbread/res/drawable-hdpi/suw_navbar_ic_right_arrow.pngbin0 -> 133 bytes
-rw-r--r--library/gingerbread/res/drawable-ldrtl/suw_navbar_ic_back.xml (renamed from library/eclair-mr1/res/drawable-ldrtl/suw_navbar_ic_back.xml)0
-rw-r--r--library/gingerbread/res/drawable-ldrtl/suw_navbar_ic_next.xml (renamed from library/eclair-mr1/res/drawable-ldrtl/suw_navbar_ic_next.xml)0
-rw-r--r--library/gingerbread/res/drawable-mdpi/suw_navbar_ic_down_arrow.png (renamed from library/eclair-mr1/res/drawable-mdpi/suw_navbar_ic_down_arrow.png)bin140 -> 140 bytes
-rw-r--r--library/gingerbread/res/drawable-mdpi/suw_navbar_ic_left_arrow.pngbin0 -> 114 bytes
-rw-r--r--library/gingerbread/res/drawable-mdpi/suw_navbar_ic_right_arrow.pngbin0 -> 108 bytes
-rw-r--r--library/gingerbread/res/drawable-xhdpi/suw_navbar_ic_down_arrow.png (renamed from library/eclair-mr1/res/drawable-xhdpi/suw_navbar_ic_down_arrow.png)bin191 -> 191 bytes
-rw-r--r--library/gingerbread/res/drawable-xhdpi/suw_navbar_ic_left_arrow.pngbin0 -> 137 bytes
-rw-r--r--library/gingerbread/res/drawable-xhdpi/suw_navbar_ic_right_arrow.pngbin0 -> 140 bytes
-rw-r--r--library/gingerbread/res/drawable-xxhdpi/suw_navbar_ic_down_arrow.png (renamed from library/eclair-mr1/res/drawable-xxhdpi/suw_navbar_ic_down_arrow.png)bin257 -> 257 bytes
-rw-r--r--library/gingerbread/res/drawable-xxhdpi/suw_navbar_ic_left_arrow.pngbin0 -> 192 bytes
-rw-r--r--library/gingerbread/res/drawable-xxhdpi/suw_navbar_ic_right_arrow.pngbin0 -> 208 bytes
-rw-r--r--library/gingerbread/res/drawable-xxxhdpi/suw_navbar_ic_down_arrow.png (renamed from library/eclair-mr1/res/drawable-xxxhdpi/suw_navbar_ic_down_arrow.png)bin280 -> 280 bytes
-rw-r--r--library/gingerbread/res/drawable-xxxhdpi/suw_navbar_ic_left_arrow.pngbin0 -> 194 bytes
-rw-r--r--library/gingerbread/res/drawable-xxxhdpi/suw_navbar_ic_right_arrow.pngbin0 -> 207 bytes
-rw-r--r--library/gingerbread/res/drawable/suw_card_bg_dark.xml (renamed from library/eclair-mr1/res/drawable/suw_card_bg_dark.xml)0
-rw-r--r--library/gingerbread/res/drawable/suw_card_bg_light.xml (renamed from library/eclair-mr1/res/drawable/suw_card_bg_light.xml)0
-rw-r--r--library/gingerbread/res/drawable/suw_ic_expand.xml (renamed from library/eclair-mr1/res/drawable/suw_ic_expand.xml)0
-rw-r--r--library/gingerbread/res/drawable/suw_ic_expand_less.xml (renamed from library/eclair-mr1/res/drawable/suw_ic_expand_less.xml)12
-rw-r--r--library/gingerbread/res/drawable/suw_ic_expand_more.xml (renamed from library/eclair-mr1/res/drawable/suw_ic_expand_more.xml)10
-rw-r--r--library/gingerbread/res/drawable/suw_navbar_btn_bg_dark.xml (renamed from library/eclair-mr1/res/drawable/suw_navbar_btn_bg_dark.xml)0
-rw-r--r--library/gingerbread/res/drawable/suw_navbar_btn_bg_light.xml (renamed from library/eclair-mr1/res/drawable/suw_navbar_btn_bg_light.xml)0
-rw-r--r--library/gingerbread/res/drawable/suw_navbar_ic_back.xml (renamed from library/eclair-mr1/res/drawable/suw_navbar_ic_back.xml)0
-rw-r--r--library/gingerbread/res/drawable/suw_navbar_ic_more.xml (renamed from library/eclair-mr1/res/drawable/suw_navbar_ic_more.xml)0
-rw-r--r--library/gingerbread/res/drawable/suw_navbar_ic_next.xml (renamed from library/eclair-mr1/res/drawable/suw_navbar_ic_next.xml)0
-rw-r--r--library/gingerbread/res/layout/suw_items_expandable_switch.xml (renamed from library/eclair-mr1/res/layout/suw_items_expandable_switch.xml)7
-rw-r--r--library/gingerbread/res/layout/suw_items_switch.xml (renamed from library/eclair-mr1/res/layout/suw_items_switch.xml)0
-rw-r--r--library/gingerbread/res/layout/suw_progress_bar.xml (renamed from library/eclair-mr1/res/layout/suw_progress_bar.xml)0
-rw-r--r--library/gingerbread/res/values/attrs.xml (renamed from library/eclair-mr1/res/values/attrs.xml)0
-rw-r--r--library/gingerbread/res/values/dimens.xml (renamed from library/eclair-mr1/res/values/dimens.xml)4
-rw-r--r--library/gingerbread/res/values/styles.xml (renamed from library/eclair-mr1/res/values/styles.xml)29
-rw-r--r--library/gingerbread/src/com/android/setupwizardlib/items/ExpandableSwitchItem.java (renamed from library/eclair-mr1/src/com/android/setupwizardlib/items/ExpandableSwitchItem.java)0
-rw-r--r--library/gingerbread/src/com/android/setupwizardlib/items/SwitchItem.java (renamed from library/eclair-mr1/src/com/android/setupwizardlib/items/SwitchItem.java)28
-rw-r--r--library/gingerbread/src/com/android/setupwizardlib/util/LinkAccessibilityHelper.java (renamed from library/eclair-mr1/src/com/android/setupwizardlib/util/LinkAccessibilityHelper.java)0
-rw-r--r--library/gingerbread/src/com/android/setupwizardlib/view/NavigationBarButton.java (renamed from library/eclair-mr1/src/com/android/setupwizardlib/view/NavigationBarButton.java)6
-rw-r--r--library/gingerbread/src/com/android/setupwizardlib/view/RichTextView.java (renamed from library/eclair-mr1/src/com/android/setupwizardlib/view/RichTextView.java)22
-rw-r--r--library/gingerbread/test/instrumentation/src/com/android/setupwizardlib/items/ButtonItemDrawingTest.java (renamed from library/eclair-mr1/test/instrumentation/src/com/android/setupwizardlib/items/ButtonItemDrawingTest.java)0
-rw-r--r--library/gingerbread/test/instrumentation/src/com/android/setupwizardlib/test/LinkAccessibilityHelperTest.java (renamed from library/eclair-mr1/test/instrumentation/src/com/android/setupwizardlib/test/LinkAccessibilityHelperTest.java)0
-rw-r--r--library/gingerbread/test/instrumentation/src/com/android/setupwizardlib/test/util/DrawingTestActivity.java (renamed from library/eclair-mr1/test/instrumentation/src/com/android/setupwizardlib/test/util/DrawingTestActivity.java)0
-rw-r--r--library/gingerbread/test/robotest/src/com/android/setupwizardlib/items/ExpandableSwitchItemTest.java (renamed from library/eclair-mr1/test/robotest/src/com/android/setupwizardlib/items/ExpandableSwitchItemTest.java)0
-rw-r--r--library/gingerbread/test/robotest/src/com/android/setupwizardlib/items/SwitchItemTest.java (renamed from library/eclair-mr1/test/robotest/src/com/android/setupwizardlib/items/SwitchItemTest.java)0
-rw-r--r--library/gingerbread/test/robotest/src/com/android/setupwizardlib/util/DimensionConsistencyTest.java69
-rw-r--r--library/main/res/layout/suw_items_description.xml2
-rw-r--r--library/main/res/values-sw600dp/dimens.xml2
-rw-r--r--library/main/res/values-v21/styles.xml6
-rw-r--r--library/main/res/values/attrs.xml7
-rw-r--r--library/main/res/values/colors.xml2
-rw-r--r--library/main/res/values/dimens.xml4
-rw-r--r--library/main/res/values/styles.xml27
-rw-r--r--library/main/src/com/android/setupwizardlib/GlifListLayout.java36
-rw-r--r--library/main/src/com/android/setupwizardlib/GlifPatternDrawable.java2
-rw-r--r--library/main/src/com/android/setupwizardlib/SetupWizardListLayout.java34
-rw-r--r--library/main/src/com/android/setupwizardlib/items/Item.java13
-rw-r--r--library/main/src/com/android/setupwizardlib/span/LinkSpan.java64
-rw-r--r--library/main/src/com/android/setupwizardlib/template/ListMixin.java56
-rw-r--r--library/main/src/com/android/setupwizardlib/util/WizardManagerHelper.java46
-rw-r--r--library/platform/res/values-v23/styles.xml29
-rw-r--r--library/platform/src/com/android/setupwizardlib/view/RichTextView.java150
-rw-r--r--library/recyclerview/res/layout/suw_glif_preference_recycler_view.xml (renamed from library/full-support/res/layout/suw_glif_preference_recycler_view.xml)0
-rw-r--r--library/recyclerview/res/layout/suw_glif_preference_template_header.xml (renamed from library/full-support/res/layout/suw_glif_preference_template_header.xml)0
-rw-r--r--library/recyclerview/res/layout/suw_glif_recycler_template_card.xml (renamed from library/full-support/res/layout/suw_glif_recycler_template_card.xml)0
-rw-r--r--library/recyclerview/res/layout/suw_glif_recycler_template_compact.xml (renamed from library/full-support/res/layout/suw_glif_recycler_template_compact.xml)0
-rw-r--r--library/recyclerview/res/layout/suw_glif_recycler_template_content.xml (renamed from library/full-support/res/layout/suw_glif_recycler_template_content.xml)0
-rw-r--r--library/recyclerview/res/layout/suw_preference_recycler_view_header.xml (renamed from library/full-support/res/layout/suw_preference_recycler_view_header.xml)0
-rw-r--r--library/recyclerview/res/layout/suw_preference_recycler_view_normal.xml (renamed from library/full-support/res/layout/suw_preference_recycler_view_normal.xml)0
-rw-r--r--library/recyclerview/res/layout/suw_preference_template_header.xml (renamed from library/full-support/res/layout/suw_preference_template_header.xml)0
-rw-r--r--library/recyclerview/res/layout/suw_recycler_template_card.xml (renamed from library/full-support/res/layout/suw_recycler_template_card.xml)0
-rw-r--r--library/recyclerview/res/layout/suw_recycler_template_card_wide.xml (renamed from library/full-support/res/layout/suw_recycler_template_card_wide.xml)0
-rw-r--r--library/recyclerview/res/layout/suw_recycler_template_header.xml (renamed from library/full-support/res/layout/suw_recycler_template_header.xml)0
-rw-r--r--library/recyclerview/res/layout/suw_recycler_template_header_collapsed.xml (renamed from library/full-support/res/layout/suw_recycler_template_header_collapsed.xml)0
-rw-r--r--library/recyclerview/res/values-land/layouts.xml (renamed from library/full-support/res/values-land/layouts.xml)0
-rw-r--r--library/recyclerview/res/values-sw600dp-land/layouts.xml (renamed from library/full-support/res/values-sw600dp-land/layouts.xml)0
-rw-r--r--library/recyclerview/res/values-sw600dp/layouts.xml (renamed from library/full-support/res/values-sw600dp/layouts.xml)0
-rw-r--r--library/recyclerview/res/values/attrs.xml (renamed from library/full-support/res/values/attrs.xml)2
-rw-r--r--library/recyclerview/res/values/layouts.xml (renamed from library/full-support/res/values/layouts.xml)0
-rw-r--r--library/recyclerview/src/com/android/setupwizardlib/DividerItemDecoration.java (renamed from library/full-support/src/com/android/setupwizardlib/DividerItemDecoration.java)6
-rw-r--r--library/recyclerview/src/com/android/setupwizardlib/GlifPreferenceLayout.java (renamed from library/full-support/src/com/android/setupwizardlib/GlifPreferenceLayout.java)0
-rw-r--r--library/recyclerview/src/com/android/setupwizardlib/GlifRecyclerLayout.java (renamed from library/full-support/src/com/android/setupwizardlib/GlifRecyclerLayout.java)27
-rw-r--r--library/recyclerview/src/com/android/setupwizardlib/SetupWizardPreferenceLayout.java (renamed from library/full-support/src/com/android/setupwizardlib/SetupWizardPreferenceLayout.java)3
-rw-r--r--library/recyclerview/src/com/android/setupwizardlib/SetupWizardRecyclerLayout.java (renamed from library/full-support/src/com/android/setupwizardlib/SetupWizardRecyclerLayout.java)36
-rw-r--r--library/recyclerview/src/com/android/setupwizardlib/items/ItemViewHolder.java (renamed from library/full-support/src/com/android/setupwizardlib/items/ItemViewHolder.java)2
-rw-r--r--library/recyclerview/src/com/android/setupwizardlib/items/RecyclerItemAdapter.java (renamed from library/full-support/src/com/android/setupwizardlib/items/RecyclerItemAdapter.java)34
-rw-r--r--library/recyclerview/src/com/android/setupwizardlib/template/RecyclerMixin.java (renamed from library/full-support/src/com/android/setupwizardlib/template/RecyclerMixin.java)57
-rw-r--r--library/recyclerview/src/com/android/setupwizardlib/template/RecyclerViewScrollHandlingDelegate.java (renamed from library/full-support/src/com/android/setupwizardlib/template/RecyclerViewScrollHandlingDelegate.java)0
-rw-r--r--library/recyclerview/src/com/android/setupwizardlib/view/HeaderRecyclerView.java (renamed from library/full-support/src/com/android/setupwizardlib/view/HeaderRecyclerView.java)22
-rw-r--r--library/recyclerview/src/com/android/setupwizardlib/view/StickyHeaderRecyclerView.java (renamed from library/full-support/src/com/android/setupwizardlib/view/StickyHeaderRecyclerView.java)4
-rw-r--r--library/recyclerview/test/instrumentation/res/drawable/item_bg.xml19
-rw-r--r--library/recyclerview/test/instrumentation/res/layout/test_existing_background.xml20
-rw-r--r--library/recyclerview/test/instrumentation/res/layout/test_glif_recycler_layout.xml (renamed from library/full-support/test/instrumentation/res/layout/test_glif_recycler_layout.xml)0
-rw-r--r--library/recyclerview/test/instrumentation/res/layout/test_list_item.xml (renamed from library/full-support/test/instrumentation/res/layout/test_list_item.xml)0
-rw-r--r--library/recyclerview/test/instrumentation/res/layout/test_list_item_no_background.xml (renamed from library/full-support/test/instrumentation/res/layout/test_list_item_no_background.xml)0
-rw-r--r--library/recyclerview/test/instrumentation/res/layout/test_recycler_layout.xml (renamed from library/full-support/test/instrumentation/res/layout/test_recycler_layout.xml)0
-rw-r--r--library/recyclerview/test/instrumentation/src/com/android/setupwizardlib/items/RecyclerItemAdapterTest.java (renamed from library/full-support/test/instrumentation/src/com/android/setupwizardlib/items/RecyclerItemAdapterTest.java)17
-rw-r--r--library/recyclerview/test/instrumentation/src/com/android/setupwizardlib/template/RecyclerMixinTest.java (renamed from library/full-support/test/instrumentation/src/com/android/setupwizardlib/template/RecyclerMixinTest.java)41
-rw-r--r--library/recyclerview/test/instrumentation/src/com/android/setupwizardlib/test/DividerItemDecorationTest.java (renamed from library/full-support/test/instrumentation/src/com/android/setupwizardlib/test/DividerItemDecorationTest.java)0
-rw-r--r--library/recyclerview/test/instrumentation/src/com/android/setupwizardlib/test/GlifPreferenceLayoutTest.java (renamed from library/full-support/test/instrumentation/src/com/android/setupwizardlib/test/GlifPreferenceLayoutTest.java)0
-rw-r--r--library/recyclerview/test/instrumentation/src/com/android/setupwizardlib/test/GlifRecyclerLayoutTest.java (renamed from library/full-support/test/instrumentation/src/com/android/setupwizardlib/test/GlifRecyclerLayoutTest.java)18
-rw-r--r--library/recyclerview/test/instrumentation/src/com/android/setupwizardlib/test/HeaderRecyclerViewTest.java (renamed from library/full-support/test/instrumentation/src/com/android/setupwizardlib/test/HeaderRecyclerViewTest.java)0
-rw-r--r--library/recyclerview/test/instrumentation/src/com/android/setupwizardlib/test/SetupWizardPreferenceLayoutTest.java (renamed from library/full-support/test/instrumentation/src/com/android/setupwizardlib/test/SetupWizardPreferenceLayoutTest.java)0
-rw-r--r--library/recyclerview/test/instrumentation/src/com/android/setupwizardlib/test/SetupWizardRecyclerLayoutTest.java (renamed from library/full-support/test/instrumentation/src/com/android/setupwizardlib/test/SetupWizardRecyclerLayoutTest.java)18
-rw-r--r--library/recyclerview/test/robotest/src/com/android/setupwizardlib/template/RecyclerViewScrollHandlingDelegateTest.java (renamed from library/full-support/test/robotest/src/com/android/setupwizardlib/template/RecyclerViewScrollHandlingDelegateTest.java)0
-rw-r--r--library/rules.gradle4
-rw-r--r--library/self.gradle35
-rw-r--r--library/test/instrumentation/src/com/android/setupwizardlib/template/ListMixinTest.java41
-rw-r--r--library/test/instrumentation/src/com/android/setupwizardlib/test/GlifLayoutTest.java14
-rw-r--r--library/test/instrumentation/src/com/android/setupwizardlib/test/GlifListLayoutTest.java18
-rw-r--r--library/test/instrumentation/src/com/android/setupwizardlib/test/ItemLayoutTest.java94
-rw-r--r--library/test/instrumentation/src/com/android/setupwizardlib/test/RichTextViewTest.java (renamed from library/eclair-mr1/test/instrumentation/src/com/android/setupwizardlib/test/RichTextViewTest.java)63
-rw-r--r--library/test/instrumentation/src/com/android/setupwizardlib/test/SetupWizardListLayoutTest.java35
-rw-r--r--library/test/robotest/src/com/android/setupwizardlib/span/LinkSpanTest.java12
-rw-r--r--library/test/robotest/src/com/android/setupwizardlib/util/WizardManagerHelperTest.java39
125 files changed, 1211 insertions, 147 deletions
diff --git a/library/Android.mk b/library/Android.mk
index 8333792..6f530cb 100644
--- a/library/Android.mk
+++ b/library/Android.mk
@@ -36,10 +36,10 @@ LOCAL_MANIFEST_FILE := main/AndroidManifest.xml
LOCAL_MODULE := setup-wizard-lib-gingerbread-compat
LOCAL_RESOURCE_DIR := \
$(LOCAL_PATH)/main/res \
- $(LOCAL_PATH)/eclair-mr1/res \
- $(LOCAL_PATH)/full-support/res
+ $(LOCAL_PATH)/gingerbread/res \
+ $(LOCAL_PATH)/recyclerview/res
LOCAL_SDK_VERSION := current
-LOCAL_SRC_FILES := $(call all-java-files-under, main/src eclair-mr1/src full-support/src)
+LOCAL_SRC_FILES := $(call all-java-files-under, main/src gingerbread/src recyclerview/src)
ifdef LOCAL_USE_AAPT2
diff --git a/library/common-gingerbread.mk b/library/common-gingerbread.mk
index 3cc58ec..6ced8b0 100644
--- a/library/common-gingerbread.mk
+++ b/library/common-gingerbread.mk
@@ -31,8 +31,8 @@ endif
ifeq (,$(findstring setup-wizard-lib-gingerbread-compat,$(LOCAL_STATIC_JAVA_LIBRARIES)))
LOCAL_RESOURCE_DIR += \
$(suwlib_dir)/main/res \
- $(suwlib_dir)/eclair-mr1/res \
- $(suwlib_dir)/full-support/res
+ $(suwlib_dir)/gingerbread/res \
+ $(suwlib_dir)/recyclerview/res
LOCAL_AAPT_FLAGS += --extra-packages com.android.setupwizardlib
LOCAL_STATIC_JAVA_LIBRARIES += setup-wizard-lib-gingerbread-compat
endif
diff --git a/library/eclair-mr1/res/drawable-hdpi/suw_navbar_ic_left_arrow.png b/library/eclair-mr1/res/drawable-hdpi/suw_navbar_ic_left_arrow.png
deleted file mode 100644
index 1364d5c..0000000
--- a/library/eclair-mr1/res/drawable-hdpi/suw_navbar_ic_left_arrow.png
+++ /dev/null
Binary files differ
diff --git a/library/eclair-mr1/res/drawable-hdpi/suw_navbar_ic_right_arrow.png b/library/eclair-mr1/res/drawable-hdpi/suw_navbar_ic_right_arrow.png
deleted file mode 100644
index ff7a66e..0000000
--- a/library/eclair-mr1/res/drawable-hdpi/suw_navbar_ic_right_arrow.png
+++ /dev/null
Binary files differ
diff --git a/library/eclair-mr1/res/drawable-mdpi/suw_navbar_ic_left_arrow.png b/library/eclair-mr1/res/drawable-mdpi/suw_navbar_ic_left_arrow.png
deleted file mode 100644
index 0bd2a76..0000000
--- a/library/eclair-mr1/res/drawable-mdpi/suw_navbar_ic_left_arrow.png
+++ /dev/null
Binary files differ
diff --git a/library/eclair-mr1/res/drawable-mdpi/suw_navbar_ic_right_arrow.png b/library/eclair-mr1/res/drawable-mdpi/suw_navbar_ic_right_arrow.png
deleted file mode 100644
index c367b7f..0000000
--- a/library/eclair-mr1/res/drawable-mdpi/suw_navbar_ic_right_arrow.png
+++ /dev/null
Binary files differ
diff --git a/library/eclair-mr1/res/drawable-xhdpi/suw_navbar_ic_left_arrow.png b/library/eclair-mr1/res/drawable-xhdpi/suw_navbar_ic_left_arrow.png
deleted file mode 100644
index 2fac071..0000000
--- a/library/eclair-mr1/res/drawable-xhdpi/suw_navbar_ic_left_arrow.png
+++ /dev/null
Binary files differ
diff --git a/library/eclair-mr1/res/drawable-xhdpi/suw_navbar_ic_right_arrow.png b/library/eclair-mr1/res/drawable-xhdpi/suw_navbar_ic_right_arrow.png
deleted file mode 100644
index c1a0765..0000000
--- a/library/eclair-mr1/res/drawable-xhdpi/suw_navbar_ic_right_arrow.png
+++ /dev/null
Binary files differ
diff --git a/library/eclair-mr1/res/drawable-xxhdpi/suw_navbar_ic_left_arrow.png b/library/eclair-mr1/res/drawable-xxhdpi/suw_navbar_ic_left_arrow.png
deleted file mode 100644
index ea343d0..0000000
--- a/library/eclair-mr1/res/drawable-xxhdpi/suw_navbar_ic_left_arrow.png
+++ /dev/null
Binary files differ
diff --git a/library/eclair-mr1/res/drawable-xxhdpi/suw_navbar_ic_right_arrow.png b/library/eclair-mr1/res/drawable-xxhdpi/suw_navbar_ic_right_arrow.png
deleted file mode 100644
index ae30d61..0000000
--- a/library/eclair-mr1/res/drawable-xxhdpi/suw_navbar_ic_right_arrow.png
+++ /dev/null
Binary files differ
diff --git a/library/eclair-mr1/res/drawable-xxxhdpi/suw_navbar_ic_left_arrow.png b/library/eclair-mr1/res/drawable-xxxhdpi/suw_navbar_ic_left_arrow.png
deleted file mode 100644
index fcd2c64..0000000
--- a/library/eclair-mr1/res/drawable-xxxhdpi/suw_navbar_ic_left_arrow.png
+++ /dev/null
Binary files differ
diff --git a/library/eclair-mr1/res/drawable-xxxhdpi/suw_navbar_ic_right_arrow.png b/library/eclair-mr1/res/drawable-xxxhdpi/suw_navbar_ic_right_arrow.png
deleted file mode 100644
index eacab40..0000000
--- a/library/eclair-mr1/res/drawable-xxxhdpi/suw_navbar_ic_right_arrow.png
+++ /dev/null
Binary files differ
diff --git a/library/eclair-mr1/res/drawable-hdpi/suw_navbar_ic_down_arrow.png b/library/gingerbread/res/drawable-hdpi/suw_navbar_ic_down_arrow.png
index 3d7f83f..3d7f83f 100644
--- a/library/eclair-mr1/res/drawable-hdpi/suw_navbar_ic_down_arrow.png
+++ b/library/gingerbread/res/drawable-hdpi/suw_navbar_ic_down_arrow.png
Binary files differ
diff --git a/library/gingerbread/res/drawable-hdpi/suw_navbar_ic_left_arrow.png b/library/gingerbread/res/drawable-hdpi/suw_navbar_ic_left_arrow.png
new file mode 100644
index 0000000..decccac
--- /dev/null
+++ b/library/gingerbread/res/drawable-hdpi/suw_navbar_ic_left_arrow.png
Binary files differ
diff --git a/library/gingerbread/res/drawable-hdpi/suw_navbar_ic_right_arrow.png b/library/gingerbread/res/drawable-hdpi/suw_navbar_ic_right_arrow.png
new file mode 100644
index 0000000..5ba56b7
--- /dev/null
+++ b/library/gingerbread/res/drawable-hdpi/suw_navbar_ic_right_arrow.png
Binary files differ
diff --git a/library/eclair-mr1/res/drawable-ldrtl/suw_navbar_ic_back.xml b/library/gingerbread/res/drawable-ldrtl/suw_navbar_ic_back.xml
index e164e8a..e164e8a 100644
--- a/library/eclair-mr1/res/drawable-ldrtl/suw_navbar_ic_back.xml
+++ b/library/gingerbread/res/drawable-ldrtl/suw_navbar_ic_back.xml
diff --git a/library/eclair-mr1/res/drawable-ldrtl/suw_navbar_ic_next.xml b/library/gingerbread/res/drawable-ldrtl/suw_navbar_ic_next.xml
index 8a6e137..8a6e137 100644
--- a/library/eclair-mr1/res/drawable-ldrtl/suw_navbar_ic_next.xml
+++ b/library/gingerbread/res/drawable-ldrtl/suw_navbar_ic_next.xml
diff --git a/library/eclair-mr1/res/drawable-mdpi/suw_navbar_ic_down_arrow.png b/library/gingerbread/res/drawable-mdpi/suw_navbar_ic_down_arrow.png
index 5b1fa06..5b1fa06 100644
--- a/library/eclair-mr1/res/drawable-mdpi/suw_navbar_ic_down_arrow.png
+++ b/library/gingerbread/res/drawable-mdpi/suw_navbar_ic_down_arrow.png
Binary files differ
diff --git a/library/gingerbread/res/drawable-mdpi/suw_navbar_ic_left_arrow.png b/library/gingerbread/res/drawable-mdpi/suw_navbar_ic_left_arrow.png
new file mode 100644
index 0000000..1e2984a
--- /dev/null
+++ b/library/gingerbread/res/drawable-mdpi/suw_navbar_ic_left_arrow.png
Binary files differ
diff --git a/library/gingerbread/res/drawable-mdpi/suw_navbar_ic_right_arrow.png b/library/gingerbread/res/drawable-mdpi/suw_navbar_ic_right_arrow.png
new file mode 100644
index 0000000..b8365e6
--- /dev/null
+++ b/library/gingerbread/res/drawable-mdpi/suw_navbar_ic_right_arrow.png
Binary files differ
diff --git a/library/eclair-mr1/res/drawable-xhdpi/suw_navbar_ic_down_arrow.png b/library/gingerbread/res/drawable-xhdpi/suw_navbar_ic_down_arrow.png
index 94016f4..94016f4 100644
--- a/library/eclair-mr1/res/drawable-xhdpi/suw_navbar_ic_down_arrow.png
+++ b/library/gingerbread/res/drawable-xhdpi/suw_navbar_ic_down_arrow.png
Binary files differ
diff --git a/library/gingerbread/res/drawable-xhdpi/suw_navbar_ic_left_arrow.png b/library/gingerbread/res/drawable-xhdpi/suw_navbar_ic_left_arrow.png
new file mode 100644
index 0000000..2d2046c
--- /dev/null
+++ b/library/gingerbread/res/drawable-xhdpi/suw_navbar_ic_left_arrow.png
Binary files differ
diff --git a/library/gingerbread/res/drawable-xhdpi/suw_navbar_ic_right_arrow.png b/library/gingerbread/res/drawable-xhdpi/suw_navbar_ic_right_arrow.png
new file mode 100644
index 0000000..46abe31
--- /dev/null
+++ b/library/gingerbread/res/drawable-xhdpi/suw_navbar_ic_right_arrow.png
Binary files differ
diff --git a/library/eclair-mr1/res/drawable-xxhdpi/suw_navbar_ic_down_arrow.png b/library/gingerbread/res/drawable-xxhdpi/suw_navbar_ic_down_arrow.png
index 17811ae..17811ae 100644
--- a/library/eclair-mr1/res/drawable-xxhdpi/suw_navbar_ic_down_arrow.png
+++ b/library/gingerbread/res/drawable-xxhdpi/suw_navbar_ic_down_arrow.png
Binary files differ
diff --git a/library/gingerbread/res/drawable-xxhdpi/suw_navbar_ic_left_arrow.png b/library/gingerbread/res/drawable-xxhdpi/suw_navbar_ic_left_arrow.png
new file mode 100644
index 0000000..97fed92
--- /dev/null
+++ b/library/gingerbread/res/drawable-xxhdpi/suw_navbar_ic_left_arrow.png
Binary files differ
diff --git a/library/gingerbread/res/drawable-xxhdpi/suw_navbar_ic_right_arrow.png b/library/gingerbread/res/drawable-xxhdpi/suw_navbar_ic_right_arrow.png
new file mode 100644
index 0000000..f874955
--- /dev/null
+++ b/library/gingerbread/res/drawable-xxhdpi/suw_navbar_ic_right_arrow.png
Binary files differ
diff --git a/library/eclair-mr1/res/drawable-xxxhdpi/suw_navbar_ic_down_arrow.png b/library/gingerbread/res/drawable-xxxhdpi/suw_navbar_ic_down_arrow.png
index cb6a422..cb6a422 100644
--- a/library/eclair-mr1/res/drawable-xxxhdpi/suw_navbar_ic_down_arrow.png
+++ b/library/gingerbread/res/drawable-xxxhdpi/suw_navbar_ic_down_arrow.png
Binary files differ
diff --git a/library/gingerbread/res/drawable-xxxhdpi/suw_navbar_ic_left_arrow.png b/library/gingerbread/res/drawable-xxxhdpi/suw_navbar_ic_left_arrow.png
new file mode 100644
index 0000000..a0ebbb9
--- /dev/null
+++ b/library/gingerbread/res/drawable-xxxhdpi/suw_navbar_ic_left_arrow.png
Binary files differ
diff --git a/library/gingerbread/res/drawable-xxxhdpi/suw_navbar_ic_right_arrow.png b/library/gingerbread/res/drawable-xxxhdpi/suw_navbar_ic_right_arrow.png
new file mode 100644
index 0000000..c98b882
--- /dev/null
+++ b/library/gingerbread/res/drawable-xxxhdpi/suw_navbar_ic_right_arrow.png
Binary files differ
diff --git a/library/eclair-mr1/res/drawable/suw_card_bg_dark.xml b/library/gingerbread/res/drawable/suw_card_bg_dark.xml
index cd115cf..cd115cf 100644
--- a/library/eclair-mr1/res/drawable/suw_card_bg_dark.xml
+++ b/library/gingerbread/res/drawable/suw_card_bg_dark.xml
diff --git a/library/eclair-mr1/res/drawable/suw_card_bg_light.xml b/library/gingerbread/res/drawable/suw_card_bg_light.xml
index cd40dbe..cd40dbe 100644
--- a/library/eclair-mr1/res/drawable/suw_card_bg_light.xml
+++ b/library/gingerbread/res/drawable/suw_card_bg_light.xml
diff --git a/library/eclair-mr1/res/drawable/suw_ic_expand.xml b/library/gingerbread/res/drawable/suw_ic_expand.xml
index 7e79f7d..7e79f7d 100644
--- a/library/eclair-mr1/res/drawable/suw_ic_expand.xml
+++ b/library/gingerbread/res/drawable/suw_ic_expand.xml
diff --git a/library/eclair-mr1/res/drawable/suw_ic_expand_less.xml b/library/gingerbread/res/drawable/suw_ic_expand_less.xml
index e639a61..ef717c1 100644
--- a/library/eclair-mr1/res/drawable/suw_ic_expand_less.xml
+++ b/library/gingerbread/res/drawable/suw_ic_expand_less.xml
@@ -16,11 +16,13 @@
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="18dp"
- android:height="18dp"
- android:viewportHeight="24.0"
- android:viewportWidth="24.0">
+ android:width="20dp"
+ android:height="24dp"
+ android:viewportWidth="20.0"
+ android:viewportHeight="24.0">
+
<path
android:fillColor="#ff000000"
- android:pathData="M12,8l-6,6 1.41,1.41L12,10.83l4.59,4.58L18,14z" />
+ android:pathData="M10,9.17l-5,5 1.18,1.18L10,11.53l3.83,3.82L15,14.17z" />
+
</vector>
diff --git a/library/eclair-mr1/res/drawable/suw_ic_expand_more.xml b/library/gingerbread/res/drawable/suw_ic_expand_more.xml
index ed63e21..ff3a0c5 100644
--- a/library/eclair-mr1/res/drawable/suw_ic_expand_more.xml
+++ b/library/gingerbread/res/drawable/suw_ic_expand_more.xml
@@ -16,11 +16,13 @@
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="18dp"
- android:height="18dp"
- android:viewportWidth="24.0"
+ android:width="20dp"
+ android:height="24dp"
+ android:viewportWidth="20.0"
android:viewportHeight="24.0">
+
<path
android:fillColor="#ff000000"
- android:pathData="M16.59,8.59L12,13.17 7.41,8.59 6,10l6,6 6,-6z"/>
+ android:pathData="M13.83,9.66L10,13.48 6.18,9.66 5,10.83l5,5 5,-5z"/>
+
</vector>
diff --git a/library/eclair-mr1/res/drawable/suw_navbar_btn_bg_dark.xml b/library/gingerbread/res/drawable/suw_navbar_btn_bg_dark.xml
index f4131e5..f4131e5 100644
--- a/library/eclair-mr1/res/drawable/suw_navbar_btn_bg_dark.xml
+++ b/library/gingerbread/res/drawable/suw_navbar_btn_bg_dark.xml
diff --git a/library/eclair-mr1/res/drawable/suw_navbar_btn_bg_light.xml b/library/gingerbread/res/drawable/suw_navbar_btn_bg_light.xml
index 5d3bcfa..5d3bcfa 100644
--- a/library/eclair-mr1/res/drawable/suw_navbar_btn_bg_light.xml
+++ b/library/gingerbread/res/drawable/suw_navbar_btn_bg_light.xml
diff --git a/library/eclair-mr1/res/drawable/suw_navbar_ic_back.xml b/library/gingerbread/res/drawable/suw_navbar_ic_back.xml
index 8a6e137..8a6e137 100644
--- a/library/eclair-mr1/res/drawable/suw_navbar_ic_back.xml
+++ b/library/gingerbread/res/drawable/suw_navbar_ic_back.xml
diff --git a/library/eclair-mr1/res/drawable/suw_navbar_ic_more.xml b/library/gingerbread/res/drawable/suw_navbar_ic_more.xml
index 603e08d..603e08d 100644
--- a/library/eclair-mr1/res/drawable/suw_navbar_ic_more.xml
+++ b/library/gingerbread/res/drawable/suw_navbar_ic_more.xml
diff --git a/library/eclair-mr1/res/drawable/suw_navbar_ic_next.xml b/library/gingerbread/res/drawable/suw_navbar_ic_next.xml
index e164e8a..e164e8a 100644
--- a/library/eclair-mr1/res/drawable/suw_navbar_ic_next.xml
+++ b/library/gingerbread/res/drawable/suw_navbar_ic_next.xml
diff --git a/library/eclair-mr1/res/layout/suw_items_expandable_switch.xml b/library/gingerbread/res/layout/suw_items_expandable_switch.xml
index 91e482d..2b98a9f 100644
--- a/library/eclair-mr1/res/layout/suw_items_expandable_switch.xml
+++ b/library/gingerbread/res/layout/suw_items_expandable_switch.xml
@@ -94,7 +94,8 @@
android:id="@+id/suw_items_switch_divider"
android:layout_width="1dp"
android:layout_height="@dimen/suw_switch_divider_height"
- android:layout_gravity="center_vertical"
+ android:layout_gravity="top"
+ android:layout_marginTop="@dimen/suw_switch_divider_padding_top"
android:background="?android:attr/listDivider" />
<android.support.v7.widget.SwitchCompat
@@ -102,6 +103,8 @@
style="@style/SuwSwitchStyle.Divided"
android:layout_width="wrap_content"
android:layout_height="match_parent"
- android:layout_gravity="center_vertical" />
+ android:layout_gravity="top"
+ android:gravity="top"
+ android:paddingTop="@dimen/suw_switch_padding_top" />
</LinearLayout>
diff --git a/library/eclair-mr1/res/layout/suw_items_switch.xml b/library/gingerbread/res/layout/suw_items_switch.xml
index af326b2..af326b2 100644
--- a/library/eclair-mr1/res/layout/suw_items_switch.xml
+++ b/library/gingerbread/res/layout/suw_items_switch.xml
diff --git a/library/eclair-mr1/res/layout/suw_progress_bar.xml b/library/gingerbread/res/layout/suw_progress_bar.xml
index 35e0faf..35e0faf 100644
--- a/library/eclair-mr1/res/layout/suw_progress_bar.xml
+++ b/library/gingerbread/res/layout/suw_progress_bar.xml
diff --git a/library/eclair-mr1/res/values/attrs.xml b/library/gingerbread/res/values/attrs.xml
index 2a7b5cd..2a7b5cd 100644
--- a/library/eclair-mr1/res/values/attrs.xml
+++ b/library/gingerbread/res/values/attrs.xml
diff --git a/library/eclair-mr1/res/values/dimens.xml b/library/gingerbread/res/values/dimens.xml
index d40d7de..d06673f 100644
--- a/library/eclair-mr1/res/values/dimens.xml
+++ b/library/gingerbread/res/values/dimens.xml
@@ -20,10 +20,12 @@
<!-- SwitchItem -->
<dimen name="suw_switch_padding_start">16dp</dimen>
<dimen name="suw_switch_padding_end">0dp</dimen>
+ <dimen name="suw_switch_padding_top">39dp</dimen>
<dimen name="suw_switch_divider_height">32dp</dimen>
+ <dimen name="suw_switch_divider_padding_top">36dp</dimen>
<dimen name="suw_switch_content_padding_end">16dp</dimen>
<!-- ExpandableSwithItem -->
- <dimen name="suw_expand_arrow_drawable_padding">6dp</dimen>
+ <dimen name="suw_expand_arrow_drawable_padding">4dp</dimen>
</resources>
diff --git a/library/eclair-mr1/res/values/styles.xml b/library/gingerbread/res/values/styles.xml
index 1ea468d..f751ce8 100644
--- a/library/eclair-mr1/res/values/styles.xml
+++ b/library/gingerbread/res/values/styles.xml
@@ -24,6 +24,8 @@
<!-- Specify the indeterminateTintMode to work around a bug in Lollipop -->
<item name="android:indeterminateTintMode" tools:ignore="NewApi">src_in</item>
<item name="android:listPreferredItemHeight">@dimen/suw_items_preferred_height</item>
+ <item name="android:listPreferredItemPaddingEnd" tools:ignore="NewApi">?attr/suwMarginSides</item>
+ <item name="android:listPreferredItemPaddingStart" tools:ignore="NewApi">?attr/suwMarginSides</item>
<item name="android:navigationBarColor" tools:ignore="NewApi">@android:color/black</item>
<item name="android:statusBarColor" tools:ignore="NewApi">@android:color/black</item>
<item name="android:textAppearanceListItemSmall" tools:ignore="NewApi">?attr/textAppearanceListItemSmall</item>
@@ -36,7 +38,11 @@
<item name="listPreferredItemPaddingLeft">?attr/suwMarginSides</item>
<item name="listPreferredItemPaddingRight">?attr/suwMarginSides</item>
<item name="suwCardBackground">@drawable/suw_card_bg_dark</item>
+ <item name="suwDividerInsetEnd">0dp</item>
+ <item name="suwDividerInsetStart">@dimen/suw_items_icon_divider_inset</item>
+ <item name="suwDividerInsetStartNoIcon">@dimen/suw_items_text_divider_inset</item>
<item name="suwItemDescriptionStyle">@style/SuwItemContainer.Description</item>
+ <item name="suwItemDescriptionTitleStyle">@style/SuwItemTitle</item>
<item name="suwListItemIconColor">@color/suw_list_item_icon_color_dark</item>
<item name="suwMarginSides">@dimen/suw_layout_margin_sides</item>
<item name="suwNavBarTheme">@style/SuwNavBarThemeDark</item>
@@ -48,6 +54,8 @@
<!-- Specify the indeterminateTintMode to work around a bug in Lollipop -->
<item name="android:indeterminateTintMode" tools:ignore="NewApi">src_in</item>
<item name="android:listPreferredItemHeight">@dimen/suw_items_preferred_height</item>
+ <item name="android:listPreferredItemPaddingEnd" tools:ignore="NewApi">?attr/suwMarginSides</item>
+ <item name="android:listPreferredItemPaddingStart" tools:ignore="NewApi">?attr/suwMarginSides</item>
<item name="android:navigationBarColor" tools:ignore="NewApi">@android:color/black</item>
<item name="android:statusBarColor" tools:ignore="NewApi">@android:color/black</item>
<item name="android:textAppearanceListItemSmall" tools:ignore="NewApi">?attr/textAppearanceListItemSmall</item>
@@ -60,7 +68,11 @@
<item name="listPreferredItemPaddingLeft">?attr/suwMarginSides</item>
<item name="listPreferredItemPaddingRight">?attr/suwMarginSides</item>
<item name="suwCardBackground">@drawable/suw_card_bg_light</item>
+ <item name="suwDividerInsetEnd">0dp</item>
+ <item name="suwDividerInsetStart">@dimen/suw_items_icon_divider_inset</item>
+ <item name="suwDividerInsetStartNoIcon">@dimen/suw_items_text_divider_inset</item>
<item name="suwItemDescriptionStyle">@style/SuwItemContainer.Description</item>
+ <item name="suwItemDescriptionTitleStyle">@style/SuwItemTitle</item>
<item name="suwListItemIconColor">@color/suw_list_item_icon_color_light</item>
<item name="suwMarginSides">@dimen/suw_layout_margin_sides</item>
<item name="suwNavBarTheme">@style/SuwNavBarThemeLight</item>
@@ -68,6 +80,7 @@
</style>
<style name="SuwThemeGlif" parent="Theme.AppCompat.NoActionBar">
+ <item name="android:colorBackground">@color/suw_glif_background_color_dark</item>
<item name="android:indeterminateTint" tools:ignore="NewApi">?attr/colorControlActivated</item>
<!-- Specify the indeterminateTintMode to work around a bug in Lollipop -->
<item name="android:indeterminateTintMode" tools:ignore="NewApi">src_in</item>
@@ -77,7 +90,7 @@
<item name="android:navigationBarColor" tools:ignore="NewApi">@android:color/black</item>
<item name="android:statusBarColor" tools:ignore="NewApi">@android:color/transparent</item>
<item name="android:textAppearanceListItemSmall" tools:ignore="NewApi">?attr/textAppearanceListItemSmall</item>
- <item name="android:textColorLink">@color/suw_link_color_dark</item>
+ <item name="android:textColorLink">@color/suw_color_accent_glif_dark</item>
<item name="android:windowAnimationStyle">@style/Animation.SuwWindowAnimation</item>
<item name="android:windowDisablePreview">true</item>
<item name="android:windowSoftInputMode">adjustResize</item>
@@ -87,9 +100,12 @@
<item name="listPreferredItemPaddingLeft">?attr/suwMarginSides</item>
<item name="listPreferredItemPaddingRight">?attr/suwMarginSides</item>
<item name="suwColorPrimary">?attr/colorPrimary</item>
- <item name="suwDividerInset">@dimen/suw_items_glif_icon_divider_inset</item>
+ <item name="suwDividerInsetEnd">0dp</item>
+ <item name="suwDividerInsetStart">@dimen/suw_items_glif_icon_divider_inset</item>
+ <item name="suwDividerInsetStartNoIcon">@dimen/suw_items_glif_text_divider_inset</item>
<item name="suwGlifHeaderGravity">start</item>
<item name="suwItemDescriptionStyle">@style/SuwItemContainer.Description.Glif</item>
+ <item name="suwItemDescriptionTitleStyle">@style/SuwItemTitle.GlifDescription</item>
<item name="suwListItemIconColor">@color/suw_list_item_icon_color_dark</item>
<item name="suwMarginSides">@dimen/suw_glif_margin_sides</item>
<item name="suwScrollIndicators">bottom</item>
@@ -98,6 +114,7 @@
</style>
<style name="SuwThemeGlif.Light" parent="Theme.AppCompat.Light.NoActionBar">
+ <item name="android:colorBackground">@color/suw_glif_background_color_light</item>
<item name="android:indeterminateTint" tools:ignore="NewApi">?attr/colorControlActivated</item>
<!-- Specify the indeterminateTintMode to work around a bug in Lollipop -->
<item name="android:indeterminateTintMode" tools:ignore="NewApi">src_in</item>
@@ -107,7 +124,7 @@
<item name="android:navigationBarColor" tools:ignore="NewApi">@android:color/black</item>
<item name="android:statusBarColor" tools:ignore="NewApi">@android:color/transparent</item>
<item name="android:textAppearanceListItemSmall" tools:ignore="NewApi">?attr/textAppearanceListItemSmall</item>
- <item name="android:textColorLink">@color/suw_link_color_light</item>
+ <item name="android:textColorLink">@color/suw_color_accent_glif_light</item>
<item name="android:windowAnimationStyle">@style/Animation.SuwWindowAnimation</item>
<item name="android:windowDisablePreview">true</item>
<item name="android:windowSoftInputMode">adjustResize</item>
@@ -117,9 +134,12 @@
<item name="listPreferredItemPaddingLeft">?attr/suwMarginSides</item>
<item name="listPreferredItemPaddingRight">?attr/suwMarginSides</item>
<item name="suwColorPrimary">?attr/colorPrimary</item>
- <item name="suwDividerInset">@dimen/suw_items_glif_icon_divider_inset</item>
+ <item name="suwDividerInsetEnd">0dp</item>
+ <item name="suwDividerInsetStart">@dimen/suw_items_glif_icon_divider_inset</item>
+ <item name="suwDividerInsetStartNoIcon">@dimen/suw_items_glif_text_divider_inset</item>
<item name="suwGlifHeaderGravity">start</item>
<item name="suwItemDescriptionStyle">@style/SuwItemContainer.Description.Glif</item>
+ <item name="suwItemDescriptionTitleStyle">@style/SuwItemTitle.GlifDescription</item>
<item name="suwListItemIconColor">@color/suw_list_item_icon_color_light</item>
<item name="suwMarginSides">@dimen/suw_glif_margin_sides</item>
<item name="suwScrollIndicators">bottom</item>
@@ -176,7 +196,6 @@
<item name="buttonStyle">@style/SuwGlifButton.Primary</item>
<!-- Values used in styles -->
- <item name="android:minWidth">0dp</item>
<item name="android:paddingLeft">@dimen/suw_glif_button_padding</item>
<item name="android:paddingRight">@dimen/suw_glif_button_padding</item>
</style>
diff --git a/library/eclair-mr1/src/com/android/setupwizardlib/items/ExpandableSwitchItem.java b/library/gingerbread/src/com/android/setupwizardlib/items/ExpandableSwitchItem.java
index be9916e..be9916e 100644
--- a/library/eclair-mr1/src/com/android/setupwizardlib/items/ExpandableSwitchItem.java
+++ b/library/gingerbread/src/com/android/setupwizardlib/items/ExpandableSwitchItem.java
diff --git a/library/eclair-mr1/src/com/android/setupwizardlib/items/SwitchItem.java b/library/gingerbread/src/com/android/setupwizardlib/items/SwitchItem.java
index 604e47f..7459d77 100644
--- a/library/eclair-mr1/src/com/android/setupwizardlib/items/SwitchItem.java
+++ b/library/gingerbread/src/com/android/setupwizardlib/items/SwitchItem.java
@@ -33,17 +33,35 @@ import com.android.setupwizardlib.R;
*/
public class SwitchItem extends Item implements CompoundButton.OnCheckedChangeListener {
+ /**
+ * Listener for check state changes of this switch item.
+ */
public interface OnCheckedChangeListener {
+
+ /**
+ * Callback when checked state of a {@link SwitchItem} is changed.
+ *
+ * @see #setOnCheckedChangeListener(OnCheckedChangeListener)
+ */
void onCheckedChange(SwitchItem item, boolean isChecked);
}
private boolean mChecked = false;
private OnCheckedChangeListener mListener;
+ /**
+ * Creates a default switch item.
+ */
public SwitchItem() {
super();
}
+ /**
+ * Creates a switch item. This constructor is used for inflation from XML.
+ *
+ * @param context The context which this item is inflated in.
+ * @param attrs The XML attributes defined on the item.
+ */
public SwitchItem(Context context, AttributeSet attrs) {
super(context, attrs);
final TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.SuwSwitchItem);
@@ -51,6 +69,9 @@ public class SwitchItem extends Item implements CompoundButton.OnCheckedChangeLi
a.recycle();
}
+ /**
+ * Sets whether this item should be checked.
+ */
public void setChecked(boolean checked) {
if (mChecked != checked) {
mChecked = checked;
@@ -61,6 +82,9 @@ public class SwitchItem extends Item implements CompoundButton.OnCheckedChangeLi
}
}
+ /**
+ * @return True if this switch item is currently checked.
+ */
public boolean isChecked() {
return mChecked;
}
@@ -91,6 +115,10 @@ public class SwitchItem extends Item implements CompoundButton.OnCheckedChangeLi
switchView.setEnabled(isEnabled());
}
+ /**
+ * Sets a listener to listen for changes in checked state. This listener is invoked in both
+ * user toggling the switch and calls to {@link #setChecked(boolean)}.
+ */
public void setOnCheckedChangeListener(OnCheckedChangeListener listener) {
mListener = listener;
}
diff --git a/library/eclair-mr1/src/com/android/setupwizardlib/util/LinkAccessibilityHelper.java b/library/gingerbread/src/com/android/setupwizardlib/util/LinkAccessibilityHelper.java
index e6fa497..e6fa497 100644
--- a/library/eclair-mr1/src/com/android/setupwizardlib/util/LinkAccessibilityHelper.java
+++ b/library/gingerbread/src/com/android/setupwizardlib/util/LinkAccessibilityHelper.java
diff --git a/library/eclair-mr1/src/com/android/setupwizardlib/view/NavigationBarButton.java b/library/gingerbread/src/com/android/setupwizardlib/view/NavigationBarButton.java
index 35e7050..5172c47 100644
--- a/library/eclair-mr1/src/com/android/setupwizardlib/view/NavigationBarButton.java
+++ b/library/gingerbread/src/com/android/setupwizardlib/view/NavigationBarButton.java
@@ -26,6 +26,10 @@ import android.support.annotation.NonNull;
import android.util.AttributeSet;
import android.widget.Button;
+/**
+ * Button for navigation bar, which includes tinting of its compound drawables to be used for dark
+ * and light themes.
+ */
public class NavigationBarButton extends Button {
public NavigationBarButton(Context context) {
@@ -120,7 +124,7 @@ public class NavigationBarButton extends Button {
private ColorStateList mTintList = null;
- public TintedDrawable(Drawable wrapped) {
+ TintedDrawable(Drawable wrapped) {
super(new Drawable[] { wrapped });
}
diff --git a/library/eclair-mr1/src/com/android/setupwizardlib/view/RichTextView.java b/library/gingerbread/src/com/android/setupwizardlib/view/RichTextView.java
index 6ccedf0..e6bc9da 100644
--- a/library/eclair-mr1/src/com/android/setupwizardlib/view/RichTextView.java
+++ b/library/gingerbread/src/com/android/setupwizardlib/view/RichTextView.java
@@ -21,6 +21,7 @@ import android.graphics.drawable.Drawable;
import android.os.Build.VERSION;
import android.os.Build.VERSION_CODES;
import android.support.v4.view.ViewCompat;
+import android.support.v7.widget.AppCompatTextView;
import android.text.Annotation;
import android.text.SpannableString;
import android.text.Spanned;
@@ -30,9 +31,9 @@ import android.text.style.TextAppearanceSpan;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
-import android.widget.TextView;
import com.android.setupwizardlib.span.LinkSpan;
+import com.android.setupwizardlib.span.LinkSpan.OnLinkClickListener;
import com.android.setupwizardlib.span.SpanHelper;
import com.android.setupwizardlib.util.LinkAccessibilityHelper;
@@ -40,7 +41,7 @@ import com.android.setupwizardlib.util.LinkAccessibilityHelper;
* An extension of TextView that automatically replaces the annotation tags as specified in
* {@link SpanHelper#replaceSpan(android.text.Spannable, Object, Object)}
*/
-public class RichTextView extends TextView {
+public class RichTextView extends AppCompatTextView implements OnLinkClickListener {
/* static section */
@@ -89,6 +90,7 @@ public class RichTextView extends TextView {
/* non-static section */
private LinkAccessibilityHelper mAccessibilityHelper;
+ private OnLinkClickListener mOnLinkClickListener;
public RichTextView(Context context) {
super(context);
@@ -164,4 +166,20 @@ public class RichTextView extends TextView {
}
}
}
+
+ public void setOnLinkClickListener(OnLinkClickListener listener) {
+ mOnLinkClickListener = listener;
+ }
+
+ public OnLinkClickListener getOnLinkClickListener() {
+ return mOnLinkClickListener;
+ }
+
+ @Override
+ public boolean onLinkClick(LinkSpan span) {
+ if (mOnLinkClickListener != null) {
+ return mOnLinkClickListener.onLinkClick(span);
+ }
+ return false;
+ }
}
diff --git a/library/eclair-mr1/test/instrumentation/src/com/android/setupwizardlib/items/ButtonItemDrawingTest.java b/library/gingerbread/test/instrumentation/src/com/android/setupwizardlib/items/ButtonItemDrawingTest.java
index 74d3be6..74d3be6 100644
--- a/library/eclair-mr1/test/instrumentation/src/com/android/setupwizardlib/items/ButtonItemDrawingTest.java
+++ b/library/gingerbread/test/instrumentation/src/com/android/setupwizardlib/items/ButtonItemDrawingTest.java
diff --git a/library/eclair-mr1/test/instrumentation/src/com/android/setupwizardlib/test/LinkAccessibilityHelperTest.java b/library/gingerbread/test/instrumentation/src/com/android/setupwizardlib/test/LinkAccessibilityHelperTest.java
index a1d01fd..a1d01fd 100644
--- a/library/eclair-mr1/test/instrumentation/src/com/android/setupwizardlib/test/LinkAccessibilityHelperTest.java
+++ b/library/gingerbread/test/instrumentation/src/com/android/setupwizardlib/test/LinkAccessibilityHelperTest.java
diff --git a/library/eclair-mr1/test/instrumentation/src/com/android/setupwizardlib/test/util/DrawingTestActivity.java b/library/gingerbread/test/instrumentation/src/com/android/setupwizardlib/test/util/DrawingTestActivity.java
index 154339a..154339a 100644
--- a/library/eclair-mr1/test/instrumentation/src/com/android/setupwizardlib/test/util/DrawingTestActivity.java
+++ b/library/gingerbread/test/instrumentation/src/com/android/setupwizardlib/test/util/DrawingTestActivity.java
diff --git a/library/eclair-mr1/test/robotest/src/com/android/setupwizardlib/items/ExpandableSwitchItemTest.java b/library/gingerbread/test/robotest/src/com/android/setupwizardlib/items/ExpandableSwitchItemTest.java
index 0ae0737..0ae0737 100644
--- a/library/eclair-mr1/test/robotest/src/com/android/setupwizardlib/items/ExpandableSwitchItemTest.java
+++ b/library/gingerbread/test/robotest/src/com/android/setupwizardlib/items/ExpandableSwitchItemTest.java
diff --git a/library/eclair-mr1/test/robotest/src/com/android/setupwizardlib/items/SwitchItemTest.java b/library/gingerbread/test/robotest/src/com/android/setupwizardlib/items/SwitchItemTest.java
index d391d80..d391d80 100644
--- a/library/eclair-mr1/test/robotest/src/com/android/setupwizardlib/items/SwitchItemTest.java
+++ b/library/gingerbread/test/robotest/src/com/android/setupwizardlib/items/SwitchItemTest.java
diff --git a/library/gingerbread/test/robotest/src/com/android/setupwizardlib/util/DimensionConsistencyTest.java b/library/gingerbread/test/robotest/src/com/android/setupwizardlib/util/DimensionConsistencyTest.java
new file mode 100644
index 0000000..43e7f03
--- /dev/null
+++ b/library/gingerbread/test/robotest/src/com/android/setupwizardlib/util/DimensionConsistencyTest.java
@@ -0,0 +1,69 @@
+/*
+ * Copyright (C) 2017 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.setupwizardlib.util;
+
+import static org.junit.Assert.assertEquals;
+import static org.robolectric.RuntimeEnvironment.application;
+
+import android.content.Context;
+import android.content.res.Resources;
+import android.util.DisplayMetrics;
+import android.util.TypedValue;
+import android.view.ContextThemeWrapper;
+
+import com.android.setupwizardlib.BuildConfig;
+import com.android.setupwizardlib.R;
+import com.android.setupwizardlib.robolectric.SuwLibRobolectricTestRunner;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.annotation.Config;
+
+@RunWith(SuwLibRobolectricTestRunner.class)
+@Config(constants = BuildConfig.class, sdk = Config.ALL_SDKS)
+public class DimensionConsistencyTest {
+
+ // Visual height of the framework switch widget
+ private static final int SWTICH_HEIGHT_DP = 26;
+
+ private Context mContext;
+
+ @Before
+ public void setUp() {
+ mContext = new ContextThemeWrapper(application, R.style.SuwThemeGlif_Light);
+ }
+
+ @Test
+ public void testSwitchPaddingTop() {
+ final Resources res = mContext.getResources();
+
+ assertEquals(
+ "Switch and divider should be aligned at center vertically: "
+ + "suw_switch_padding_top + SWITCH_HEIGHT / 2 = "
+ + "suw_switch_divider_padding_top + suw_switch_divider_height / 2",
+ res.getDimensionPixelSize(R.dimen.suw_switch_divider_padding_top)
+ + (res.getDimensionPixelSize(R.dimen.suw_switch_divider_height) / 2),
+ res.getDimensionPixelSize(R.dimen.suw_switch_padding_top)
+ + (dp2Px(SWTICH_HEIGHT_DP) / 2));
+ }
+
+ private int dp2Px(float dp) {
+ DisplayMetrics displayMetrics = mContext.getResources().getDisplayMetrics();
+ return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, displayMetrics);
+ }
+}
diff --git a/library/main/res/layout/suw_items_description.xml b/library/main/res/layout/suw_items_description.xml
index 26a604b..e27d7b8 100644
--- a/library/main/res/layout/suw_items_description.xml
+++ b/library/main/res/layout/suw_items_description.xml
@@ -48,7 +48,7 @@
<com.android.setupwizardlib.view.RichTextView
android:id="@+id/suw_items_title"
- style="@style/SuwItemTitle.Description"
+ style="?attr/suwItemDescriptionTitleStyle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:lineSpacingExtra="@dimen/suw_description_line_spacing_extra"
diff --git a/library/main/res/values-sw600dp/dimens.xml b/library/main/res/values-sw600dp/dimens.xml
index 2b5f3be..d1734ab 100644
--- a/library/main/res/values-sw600dp/dimens.xml
+++ b/library/main/res/values-sw600dp/dimens.xml
@@ -32,6 +32,8 @@
<dimen name="suw_header_title_size">34sp</dimen>
<!-- Items -->
+ <dimen name="suw_items_icon_divider_inset">88dp</dimen>
+ <dimen name="suw_items_text_divider_inset">40dp</dimen>
<dimen name="suw_items_glif_icon_divider_inset">88dp</dimen>
<dimen name="suw_items_glif_text_divider_inset">40dp</dimen>
diff --git a/library/main/res/values-v21/styles.xml b/library/main/res/values-v21/styles.xml
index fddfdc7..ab6f887 100644
--- a/library/main/res/values-v21/styles.xml
+++ b/library/main/res/values-v21/styles.xml
@@ -36,6 +36,12 @@
<item name="android:background">?android:attr/colorPrimary</item>
</style>
+ <!-- Button styles -->
+
+ <style name="SuwGlifButton.Tertiary" parent="SuwGlifButton.BaseTertiary">
+ <item name="android:fontFamily">sans-serif-medium</item>
+ </style>
+
<!-- Items styles -->
<style name="SuwItemContainer">
diff --git a/library/main/res/values/attrs.xml b/library/main/res/values/attrs.xml
index 14799df..0339469 100644
--- a/library/main/res/values/attrs.xml
+++ b/library/main/res/values/attrs.xml
@@ -72,8 +72,13 @@
<!-- Custom view attributes -->
<attr name="suwColorPrimary" format="color" />
<attr name="suwHeader" format="reference" />
+ <!-- Deprecated. Use suwDividerInsetStart and suwDividerInsetEnd instead -->
<attr name="suwDividerInset" format="dimension|reference" />
+ <attr name="suwDividerInsetEnd" format="dimension|reference" />
+ <attr name="suwDividerInsetStart" format="dimension|reference" />
+ <attr name="suwDividerInsetStartNoIcon" format="dimension|reference" />
<attr name="suwItemDescriptionStyle" format="reference" />
+ <attr name="suwItemDescriptionTitleStyle" format="reference" />
<declare-styleable name="SuwIllustration">
<attr name="suwAspectRatio" format="float" />
@@ -159,6 +164,8 @@
<declare-styleable name="SuwListMixin">
<attr name="android:entries" />
<attr name="suwDividerInset" />
+ <attr name="suwDividerInsetEnd" />
+ <attr name="suwDividerInsetStart" />
</declare-styleable>
</resources>
diff --git a/library/main/res/values/colors.xml b/library/main/res/values/colors.xml
index f9c5da3..cd57a8a 100644
--- a/library/main/res/values/colors.xml
+++ b/library/main/res/values/colors.xml
@@ -40,5 +40,7 @@
<!-- GLIF colors -->
<color name="suw_color_accent_glif_dark">#ff4285f4</color>
<color name="suw_color_accent_glif_light">#ff4285f4</color>
+ <color name="suw_glif_background_color_dark">#ff000000</color>
+ <color name="suw_glif_background_color_light">#ffffffff</color>
</resources>
diff --git a/library/main/res/values/dimens.xml b/library/main/res/values/dimens.xml
index 96712f7..458e99c 100644
--- a/library/main/res/values/dimens.xml
+++ b/library/main/res/values/dimens.xml
@@ -25,7 +25,7 @@
<!-- Calculated by (suw_glif_margin_sides - suw_glif_button_padding) -->
<dimen name="suw_glif_button_margin_start">8dp</dimen>
<dimen name="suw_glif_button_padding">16dp</dimen>
- <dimen name="suw_glif_footer_bottom_padding">4dp</dimen>
+ <dimen name="suw_glif_footer_bottom_padding">0dp</dimen>
<dimen name="suw_glif_footer_min_height">80dp</dimen>
<dimen name="suw_glif_margin_sides">24dp</dimen>
<dimen name="suw_glif_margin_top">48dp</dimen>
@@ -116,7 +116,7 @@
<dimen name="suw_items_preferred_height">56dp</dimen>
<!-- Navigation bar -->
- <!-- TODO: Move this dimen to eclair-mr1, or see if it should be in platform style as well -->
+ <!-- TODO: Move this dimen to gingerbread, or see if it should be in platform style as well -->
<dimen name="suw_navbar_button_drawable_padding" tools:ignore="UnusedResources">6dp</dimen>
<dimen name="suw_navbar_button_padding_sides">10dp</dimen>
<dimen name="suw_navbar_height">56dp</dimen>
diff --git a/library/main/res/values/styles.xml b/library/main/res/values/styles.xml
index 4bd99de..bcdae0e 100644
--- a/library/main/res/values/styles.xml
+++ b/library/main/res/values/styles.xml
@@ -19,24 +19,38 @@
<!-- General styles -->
- <style name="SuwThemeGlifPixel" parent="SuwThemeGlif">
+ <style name="SuwThemeGlifV2" parent="SuwThemeGlif">
+ <item name="android:colorBackground">@color/suw_glif_background_color_dark</item>
<item name="android:windowLightStatusBar" tools:targetApi="m">false</item>
<item name="suwBackgroundBaseColor">?android:attr/colorBackground</item>
<item name="suwBackgroundPatterned">false</item>
+ <item name="suwDividerInsetEnd">?attr/suwMarginSides</item>
+ <item name="suwDividerInsetStart">?attr/suwMarginSides</item>
+ <item name="suwDividerInsetStartNoIcon">?attr/suwMarginSides</item>
<item name="suwGlifHeaderGravity">center_horizontal</item>
<item name="suwScrollIndicators">top|bottom</item>
</style>
- <style name="SuwThemeGlifPixel.Light" parent="SuwThemeGlif.Light">
+ <!-- Deprecated. Use SuwThemeGlifV2 instead -->
+ <style name="SuwThemeGlifPixel" parent="SuwThemeGlifV2" />
+
+ <style name="SuwThemeGlifV2.Light" parent="SuwThemeGlif.Light">
+ <item name="android:colorBackground">@color/suw_glif_background_color_light</item>
<item name="android:windowLightStatusBar" tools:targetApi="m">true</item>
<item name="suwBackgroundBaseColor">?android:attr/colorBackground</item>
<item name="suwBackgroundPatterned">false</item>
+ <item name="suwDividerInsetEnd">?attr/suwMarginSides</item>
+ <item name="suwDividerInsetStart">?attr/suwMarginSides</item>
+ <item name="suwDividerInsetStartNoIcon">?attr/suwMarginSides</item>
<item name="suwGlifHeaderGravity">center_horizontal</item>
<item name="suwScrollIndicators">top|bottom</item>
</style>
+ <!-- Deprecated. Use SuwThemeGlifV2.Light instead -->
+ <style name="SuwThemeGlifPixel.Light" parent="SuwThemeGlifV2.Light" />
+
<style name="Animation.SuwWindowAnimation" parent="@android:style/Animation.Activity">
<item name="android:activityOpenEnterAnimation">@anim/suw_slide_next_in</item>
<item name="android:activityOpenExitAnimation">@anim/suw_slide_next_out</item>
@@ -160,7 +174,7 @@
<!-- Use this style with a Button not a TextView, so that TalkBack will announce it as a
button. -->
- <style name="SuwGlifButton.Tertiary" parent="SuwGlifButton.Secondary">
+ <style name="SuwGlifButton.BaseTertiary" parent="SuwGlifButton.Secondary">
<!-- This style can be applied to a button either as a "style" in XML, or as a theme in
ContextThemeWrapper. These self-referencing attributes make sure this is applied as
both to the button. -->
@@ -169,13 +183,17 @@
<item name="android:background">@null</item>
<item name="android:fontFamily" tools:targetApi="jelly_bean">sans-serif</item>
+ <item name="android:layout_gravity">?attr/suwGlifHeaderGravity</item>
<item name="android:padding">0dp</item>
<item name="android:textAllCaps" tools:targetApi="ice_cream_sandwich">false</item>
</style>
+ <style name="SuwGlifButton.Tertiary" parent="SuwGlifButton.BaseTertiary" />
+
<!-- The start and end paddings are asymmetric because start buttons are borderless buttons
which aligns the text label. -->
<style name="SuwGlifButtonBar">
+ <item name="android:baselineAligned">false</item>
<item name="android:clipChildren">false</item>
<item name="android:clipToPadding">false</item>
<item name="android:gravity">center_vertical</item>
@@ -206,7 +224,7 @@
<item name="android:paddingTop">@dimen/suw_items_verbose_padding_vertical</item>
</style>
- <style name="SuwItemTitle.Description" parent="SuwItemTitle">
+ <style name="SuwItemTitle.GlifDescription" parent="SuwItemTitle">
<item name="android:gravity">?attr/suwGlifHeaderGravity</item>
<item name="android:textAlignment" tools:targetApi="jelly_bean_mr1">gravity</item>
</style>
@@ -228,6 +246,7 @@
<item name="android:layout_marginLeft">?attr/suwMarginSides</item>
<item name="android:layout_marginRight">?attr/suwMarginSides</item>
<item name="android:layout_marginTop">@dimen/suw_glif_header_title_margin_top</item>
+ <item name="android:fontFamily" tools:targetApi="jelly_bean">google-sans</item>
<item name="android:textAlignment" tools:targetApi="jelly_bean_mr1">gravity</item>
<item name="android:textColor">?android:attr/textColorPrimary</item>
</style>
diff --git a/library/main/src/com/android/setupwizardlib/GlifListLayout.java b/library/main/src/com/android/setupwizardlib/GlifListLayout.java
index c6443f9..8266e5f 100644
--- a/library/main/src/com/android/setupwizardlib/GlifListLayout.java
+++ b/library/main/src/com/android/setupwizardlib/GlifListLayout.java
@@ -113,27 +113,51 @@ public class GlifListLayout extends GlifLayout {
}
/**
+ * @deprecated Use {@link #setDividerInsets(int, int)} instead.
+ */
+ @Deprecated
+ public void setDividerInset(int inset) {
+ mListMixin.setDividerInset(inset);
+ }
+
+ /**
* Sets the start inset of the divider. This will use the default divider drawable set in the
- * theme and inset it {@code inset} pixels to the right (or left in RTL layouts).
+ * theme and apply insets to it.
*
- * @param inset The number of pixels to inset on the "start" side of the list divider. Typically
+ * @param start The number of pixels to inset on the "start" side of the list divider. Typically
* this will be either {@code @dimen/suw_items_glif_icon_divider_inset} or
* {@code @dimen/suw_items_glif_text_divider_inset}.
+ * @param end The number of pixels to inset on the "end" side of the list divider.
*
- * @see ListMixin#setDividerInset(int)
+ * @see ListMixin#setDividerInsets(int, int)
*/
- public void setDividerInset(int inset) {
- mListMixin.setDividerInset(inset);
+ public void setDividerInsets(int start, int end) {
+ mListMixin.setDividerInsets(start, end);
}
/**
- * @see ListMixin#getDividerInset()
+ * @deprecated Use {@link #getDividerInsetStart()} instead.
*/
+ @Deprecated
public int getDividerInset() {
return mListMixin.getDividerInset();
}
/**
+ * @see ListMixin#getDividerInsetStart()
+ */
+ public int getDividerInsetStart() {
+ return mListMixin.getDividerInsetStart();
+ }
+
+ /**
+ * @see ListMixin#getDividerInsetEnd()
+ */
+ public int getDividerInsetEnd() {
+ return mListMixin.getDividerInsetEnd();
+ }
+
+ /**
* @see ListMixin#getDivider()
*/
public Drawable getDivider() {
diff --git a/library/main/src/com/android/setupwizardlib/GlifPatternDrawable.java b/library/main/src/com/android/setupwizardlib/GlifPatternDrawable.java
index e31edb3..51c1a49 100644
--- a/library/main/src/com/android/setupwizardlib/GlifPatternDrawable.java
+++ b/library/main/src/com/android/setupwizardlib/GlifPatternDrawable.java
@@ -228,7 +228,7 @@ public class GlifPatternDrawable extends Drawable {
p.close();
p = sPatternPaths[5] = new Path();
- p.moveTo(178.44286f, 766.85714f);
+ p.moveTo(178.44286f, 766.8571f);
p.lineTo(308.7f, 768f);
p.cubicTo(381.7f, 604.6f, 481.6f, 344.3f, 562.2f, 0f);
p.lineTo(0f, 0f);
diff --git a/library/main/src/com/android/setupwizardlib/SetupWizardListLayout.java b/library/main/src/com/android/setupwizardlib/SetupWizardListLayout.java
index 0457451..050d566 100644
--- a/library/main/src/com/android/setupwizardlib/SetupWizardListLayout.java
+++ b/library/main/src/com/android/setupwizardlib/SetupWizardListLayout.java
@@ -113,19 +113,51 @@ public class SetupWizardListLayout extends SetupWizardLayout {
* {@code @dimen/suw_items_text_divider_inset}.
*
* @see ListMixin#setDividerInset(int)
+ * @deprecated Use {@link #setDividerInsets(int, int)} instead.
*/
+ @Deprecated
public void setDividerInset(int inset) {
mListMixin.setDividerInset(inset);
}
/**
- * @see ListMixin#getDividerInset()
+ * Sets the start inset of the divider. This will use the default divider drawable set in the
+ * theme and apply insets to it.
+ *
+ * @param start The number of pixels to inset on the "start" side of the list divider. Typically
+ * this will be either {@code @dimen/suw_items_icon_divider_inset} or
+ * {@code @dimen/suw_items_text_divider_inset}.
+ * @param end The number of pixels to inset on the "end" side of the list divider.
+ *
+ * @see ListMixin#setDividerInsets(int, int)
+ */
+ public void setDividerInsets(int start, int end) {
+ mListMixin.setDividerInsets(start, end);
+ }
+
+ /**
+ * @deprecated Use {@link #getDividerInsetStart()} instead.
*/
+ @Deprecated
public int getDividerInset() {
return mListMixin.getDividerInset();
}
/**
+ * @see ListMixin#getDividerInsetStart()
+ */
+ public int getDividerInsetStart() {
+ return mListMixin.getDividerInsetStart();
+ }
+
+ /**
+ * @see ListMixin#getDividerInsetEnd()
+ */
+ public int getDividerInsetEnd() {
+ return mListMixin.getDividerInsetEnd();
+ }
+
+ /**
* @see ListMixin#getDivider()
*/
public Drawable getDivider() {
diff --git a/library/main/src/com/android/setupwizardlib/items/Item.java b/library/main/src/com/android/setupwizardlib/items/Item.java
index 59ab1a1..fc8823e 100644
--- a/library/main/src/com/android/setupwizardlib/items/Item.java
+++ b/library/main/src/com/android/setupwizardlib/items/Item.java
@@ -155,8 +155,7 @@ public class Item extends AbstractItem {
// Set the image drawable to null before setting the state and level to avoid affecting
// any recycled drawable in the ImageView
iconView.setImageDrawable(null);
- iconView.setImageState(icon.getState(), false /* merge */);
- iconView.setImageLevel(icon.getLevel());
+ onMergeIconStateAndLevels(iconView, icon);
iconView.setImageDrawable(icon);
iconContainer.setVisibility(View.VISIBLE);
} else {
@@ -165,4 +164,14 @@ public class Item extends AbstractItem {
view.setId(getViewId());
}
+
+ /**
+ * Copies state and level information from {@link #getIcon()} to the currently bound view's
+ * ImageView. Subclasses can override this method to change whats being copied from the icon
+ * to the ImageView.
+ */
+ protected void onMergeIconStateAndLevels(ImageView iconView, Drawable icon) {
+ iconView.setImageState(icon.getState(), false /* merge */);
+ iconView.setImageLevel(icon.getLevel());
+ }
}
diff --git a/library/main/src/com/android/setupwizardlib/span/LinkSpan.java b/library/main/src/com/android/setupwizardlib/span/LinkSpan.java
index e4f9854..a5f0424 100644
--- a/library/main/src/com/android/setupwizardlib/span/LinkSpan.java
+++ b/library/main/src/com/android/setupwizardlib/span/LinkSpan.java
@@ -17,8 +17,10 @@
package com.android.setupwizardlib.span;
import android.content.Context;
+import android.content.ContextWrapper;
import android.graphics.Typeface;
import android.os.Build;
+import android.support.annotation.Nullable;
import android.text.TextPaint;
import android.text.style.ClickableSpan;
import android.util.Log;
@@ -26,8 +28,8 @@ import android.view.View;
/**
* A clickable span that will listen for click events and send it back to the context. To use this
- * class, implement {@link com.android.setupwizardlib.span.LinkSpan.OnClickListener} in your
- * context (typically your Activity).
+ * class, implement {@link OnLinkClickListener} in your TextView, or use
+ * {@link com.android.setupwizardlib.view.RichTextView#setOnClickListener(View.OnClickListener)}.
*
* <p />Note on accessibility: For TalkBack to be able to traverse and interact with the links, you
* should use {@code LinkAccessibilityHelper} in your {@code TextView} subclass. Optionally you can
@@ -49,10 +51,29 @@ public class LinkSpan extends ClickableSpan {
private static final Typeface TYPEFACE_MEDIUM =
Typeface.create("sans-serif-medium", Typeface.NORMAL);
+ /**
+ * @deprecated Use {@link OnLinkClickListener}
+ */
+ @Deprecated
public interface OnClickListener {
void onClick(LinkSpan span);
}
+ /**
+ * Listener that is invoked when a link span is clicked. If the containing view of this span
+ * implements this interface, this will be invoked when the link is clicked.
+ */
+ public interface OnLinkClickListener {
+
+ /**
+ * Called when a link has been clicked.
+ *
+ * @param span The span that was clicked.
+ * @return True if the click was handled, stopping further propagation of the click event.
+ */
+ boolean onLinkClick(LinkSpan span);
+ }
+
/* non-static section */
private final String mId;
@@ -63,9 +84,7 @@ public class LinkSpan extends ClickableSpan {
@Override
public void onClick(View view) {
- final Context context = view.getContext();
- if (context instanceof OnClickListener) {
- ((OnClickListener) context).onClick(this);
+ if (dispatchClick(view)) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
view.cancelPendingInputEvents();
}
@@ -74,6 +93,41 @@ public class LinkSpan extends ClickableSpan {
}
}
+ private boolean dispatchClick(View view) {
+ boolean handled = false;
+ if (view instanceof OnLinkClickListener) {
+ handled = ((OnLinkClickListener) view).onLinkClick(this);
+ }
+ if (!handled) {
+ final OnClickListener listener = getLegacyListenerFromContext(view.getContext());
+ if (listener != null) {
+ listener.onClick(this);
+ handled = true;
+ }
+ }
+ return handled;
+ }
+
+ /**
+ * @deprecated Deprecated together with {@link OnClickListener}
+ */
+ @Nullable
+ @Deprecated
+ private OnClickListener getLegacyListenerFromContext(@Nullable Context context) {
+ while (true) {
+ if (context instanceof OnClickListener) {
+ return (OnClickListener) context;
+ } else if (context instanceof ContextWrapper) {
+ // Unwrap any context wrapper, in base the base context implements onClickListener.
+ // ContextWrappers cannot have circular base contexts, so at some point this will
+ // reach the one of the other cases and return.
+ context = ((ContextWrapper) context).getBaseContext();
+ } else {
+ return null;
+ }
+ }
+ }
+
@Override
public void updateDrawState(TextPaint drawState) {
super.updateDrawState(drawState);
diff --git a/library/main/src/com/android/setupwizardlib/template/ListMixin.java b/library/main/src/com/android/setupwizardlib/template/ListMixin.java
index 497d46e..10e85a9 100644
--- a/library/main/src/com/android/setupwizardlib/template/ListMixin.java
+++ b/library/main/src/com/android/setupwizardlib/template/ListMixin.java
@@ -49,7 +49,9 @@ public class ListMixin implements Mixin {
private Drawable mDivider;
private Drawable mDefaultDivider;
- private int mDividerInset;
+
+ private int mDividerInsetStart;
+ private int mDividerInsetEnd;
/**
* @param layout The layout this mixin belongs to.
@@ -69,8 +71,16 @@ public class ListMixin implements Mixin {
setAdapter(new ItemAdapter(inflated));
}
int dividerInset =
- a.getDimensionPixelSize(R.styleable.SuwListMixin_suwDividerInset, 0);
- setDividerInset(dividerInset);
+ a.getDimensionPixelSize(R.styleable.SuwListMixin_suwDividerInset, -1);
+ if (dividerInset != -1) {
+ setDividerInset(dividerInset);
+ } else {
+ int dividerInsetStart =
+ a.getDimensionPixelSize(R.styleable.SuwListMixin_suwDividerInsetStart, 0);
+ int dividerInsetEnd =
+ a.getDimensionPixelSize(R.styleable.SuwListMixin_suwDividerInsetEnd, 0);
+ setDividerInsets(dividerInsetStart, dividerInsetEnd);
+ }
a.recycle();
}
@@ -136,23 +146,49 @@ public class ListMixin implements Mixin {
}
/**
+ * @deprecated Use {@link #setDividerInsets(int, int)} instead.
+ */
+ @Deprecated
+ public void setDividerInset(int inset) {
+ setDividerInsets(inset, 0);
+ }
+
+ /**
* Sets the start inset of the divider. This will use the default divider drawable set in the
- * theme and inset it {@code inset} pixels to the right (or left in RTL layouts).
+ * theme and apply insets to it.
*
- * @param inset The number of pixels to inset on the "start" side of the list divider. Typically
+ * @param start The number of pixels to inset on the "start" side of the list divider. Typically
* this will be either {@code @dimen/suw_items_glif_icon_divider_inset} or
* {@code @dimen/suw_items_glif_text_divider_inset}.
+ * @param end The number of pixels to inset on the "end" side of the list divider.
*/
- public void setDividerInset(int inset) {
- mDividerInset = inset;
+ public void setDividerInsets(int start, int end) {
+ mDividerInsetStart = start;
+ mDividerInsetEnd = end;
updateDivider();
}
/**
* @return The number of pixels inset on the start side of the divider.
+ * @deprecated This is the same as {@link #getDividerInsetStart()}. Use that instead.
*/
+ @Deprecated
public int getDividerInset() {
- return mDividerInset;
+ return getDividerInsetStart();
+ }
+
+ /**
+ * @return The number of pixels inset on the start side of the divider.
+ */
+ public int getDividerInsetStart() {
+ return mDividerInsetStart;
+ }
+
+ /**
+ * @return The number of pixels inset on the end side of the divider.
+ */
+ public int getDividerInsetEnd() {
+ return mDividerInsetEnd;
}
private void updateDivider() {
@@ -170,9 +206,9 @@ public class ListMixin implements Mixin {
}
mDivider = DrawableLayoutDirectionHelper.createRelativeInsetDrawable(
mDefaultDivider,
- mDividerInset /* start */,
+ mDividerInsetStart /* start */,
0 /* top */,
- 0 /* end */,
+ mDividerInsetEnd /* end */,
0 /* bottom */,
mTemplateLayout);
listView.setDivider(mDivider);
diff --git a/library/main/src/com/android/setupwizardlib/util/WizardManagerHelper.java b/library/main/src/com/android/setupwizardlib/util/WizardManagerHelper.java
index 5ccd081..a93694c 100644
--- a/library/main/src/com/android/setupwizardlib/util/WizardManagerHelper.java
+++ b/library/main/src/com/android/setupwizardlib/util/WizardManagerHelper.java
@@ -43,6 +43,8 @@ public class WizardManagerHelper {
private static final String EXTRA_RESULT_CODE = "com.android.setupwizard.ResultCode";
@VisibleForTesting
static final String EXTRA_IS_FIRST_RUN = "firstRun";
+ @VisibleForTesting
+ static final String EXTRA_IS_DEFERRED_SETUP = "deferredSetup";
public static final String EXTRA_THEME = "theme";
public static final String EXTRA_USE_IMMERSIVE_MODE = "useImmersiveMode";
@@ -71,13 +73,25 @@ public class WizardManagerHelper {
* Passed in a setup wizard intent as {@link #EXTRA_THEME}. This is the dark variant of the
* theme used in setup wizard for O DR.
*/
- public static final String THEME_GLIF_PIXEL = "glif_pixel";
+ public static final String THEME_GLIF_V2 = "glif_v2";
+
+ /**
+ * @deprecated Use {@link #THEME_GLIF_V2} instead.
+ */
+ @Deprecated
+ public static final String THEME_GLIF_PIXEL = THEME_GLIF_V2;
/**
* Passed in a setup wizard intent as {@link #EXTRA_THEME}. This is the default theme used in
* setup wizard for O DR.
*/
- public static final String THEME_GLIF_PIXEL_LIGHT = "glif_pixel_light";
+ public static final String THEME_GLIF_V2_LIGHT = "glif_v2_light";
+
+ /**
+ * @deprecated Use {@link #THEME_GLIF_V2_LIGHT} instead.
+ */
+ @Deprecated
+ public static final String THEME_GLIF_PIXEL_LIGHT = THEME_GLIF_V2_LIGHT;
/**
* Get an intent that will invoke the next step of setup wizard.
@@ -129,6 +143,8 @@ public class WizardManagerHelper {
dstIntent.putExtra(EXTRA_THEME, srcIntent.getStringExtra(EXTRA_THEME));
dstIntent.putExtra(EXTRA_IS_FIRST_RUN,
srcIntent.getBooleanExtra(EXTRA_IS_FIRST_RUN, false));
+ dstIntent.putExtra(EXTRA_IS_DEFERRED_SETUP,
+ srcIntent.getBooleanExtra(EXTRA_IS_DEFERRED_SETUP, false));
dstIntent.putExtra(EXTRA_SCRIPT_URI, srcIntent.getStringExtra(EXTRA_SCRIPT_URI));
dstIntent.putExtra(EXTRA_ACTION_ID, srcIntent.getStringExtra(EXTRA_ACTION_ID));
}
@@ -185,6 +201,18 @@ public class WizardManagerHelper {
}
/**
+ * Checks whether an intent is running in the deferred setup wizard flow.
+ *
+ * @param originalIntent The original intent that was used to start the step, usually via
+ * {@link android.app.Activity#getIntent()}.
+ * @return true if the intent passed in was running in deferred setup wizard.
+ */
+ public static boolean isDeferredSetupWizard(Intent originalIntent) {
+ return originalIntent != null
+ && originalIntent.getBooleanExtra(EXTRA_IS_DEFERRED_SETUP, false);
+ }
+
+ /**
* Checks the intent whether the extra indicates that the light theme should be used or not. If
* the theme is not specified in the intent, or the theme specified is unknown, the value def
* will be returned.
@@ -208,10 +236,10 @@ public class WizardManagerHelper {
*/
public static boolean isLightTheme(String theme, boolean def) {
if (THEME_HOLO_LIGHT.equals(theme) || THEME_MATERIAL_LIGHT.equals(theme)
- || THEME_GLIF_LIGHT.equals(theme) || THEME_GLIF_PIXEL_LIGHT.equals(theme)) {
+ || THEME_GLIF_LIGHT.equals(theme) || THEME_GLIF_V2_LIGHT.equals(theme)) {
return true;
} else if (THEME_HOLO.equals(theme) || THEME_MATERIAL.equals(theme)
- || THEME_GLIF.equals(theme) || THEME_GLIF_PIXEL.equals(theme)) {
+ || THEME_GLIF.equals(theme) || THEME_GLIF_V2.equals(theme)) {
return false;
} else {
return def;
@@ -256,10 +284,10 @@ public class WizardManagerHelper {
public static @StyleRes int getThemeRes(String theme, @StyleRes int defaultTheme) {
if (theme != null) {
switch (theme) {
- case THEME_GLIF_PIXEL_LIGHT:
- return R.style.SuwThemeGlifPixel_Light;
- case THEME_GLIF_PIXEL:
- return R.style.SuwThemeGlifPixel;
+ case THEME_GLIF_V2_LIGHT:
+ return R.style.SuwThemeGlifV2_Light;
+ case THEME_GLIF_V2:
+ return R.style.SuwThemeGlifV2;
case THEME_GLIF_LIGHT:
return R.style.SuwThemeGlif_Light;
case THEME_GLIF:
@@ -268,6 +296,8 @@ public class WizardManagerHelper {
return R.style.SuwThemeMaterial_Light;
case THEME_MATERIAL:
return R.style.SuwThemeMaterial;
+ default:
+ // fall through
}
}
return defaultTheme;
diff --git a/library/platform/res/values-v23/styles.xml b/library/platform/res/values-v23/styles.xml
index 59265d9..7ec4a7d 100644
--- a/library/platform/res/values-v23/styles.xml
+++ b/library/platform/res/values-v23/styles.xml
@@ -41,7 +41,11 @@
<item name="android:windowSoftInputMode">adjustResize</item>
<item name="suwCardBackground">@drawable/suw_card_bg</item>
+ <item name="suwDividerInsetEnd">0dp</item>
+ <item name="suwDividerInsetStart">@dimen/suw_items_icon_divider_inset</item>
+ <item name="suwDividerInsetStartNoIcon">@dimen/suw_items_text_divider_inset</item>
<item name="suwItemDescriptionStyle">@style/SuwItemContainer.Description</item>
+ <item name="suwItemDescriptionTitleStyle">@style/SuwItemTitle</item>
<item name="suwListItemIconColor">@color/suw_list_item_icon_color_dark</item>
<item name="suwMarginSides">@dimen/suw_layout_margin_sides</item>
<item name="suwNavBarTheme">@style/SuwNavBarThemeDark</item>
@@ -64,7 +68,11 @@
<item name="android:windowSoftInputMode">adjustResize</item>
<item name="suwCardBackground">@drawable/suw_card_bg</item>
+ <item name="suwDividerInsetEnd">0dp</item>
+ <item name="suwDividerInsetStart">@dimen/suw_items_icon_divider_inset</item>
+ <item name="suwDividerInsetStartNoIcon">@dimen/suw_items_text_divider_inset</item>
<item name="suwItemDescriptionStyle">@style/SuwItemContainer.Description</item>
+ <item name="suwItemDescriptionTitleStyle">@style/SuwItemTitle</item>
<item name="suwListItemIconColor">@color/suw_list_item_icon_color_light</item>
<item name="suwMarginSides">@dimen/suw_layout_margin_sides</item>
<item name="suwNavBarTheme">@style/SuwNavBarThemeLight</item>
@@ -73,7 +81,8 @@
<!-- Placeholder for GLIF dark theme, colors are not updated yet -->
<style name="SuwThemeGlif" parent="android:Theme.Material.NoActionBar">
<item name="android:colorAccent">@color/suw_color_accent_glif_dark</item>
- <item name="android:colorPrimary">@color/suw_color_accent_glif_light</item>
+ <item name="android:colorBackground">@color/suw_glif_background_color_dark</item>
+ <item name="android:colorPrimary">@color/suw_color_accent_glif_dark</item>
<item name="android:indeterminateTint">?android:attr/colorPrimary</item>
<!-- Specify the indeterminateTintMode to work around a bug in Lollipop -->
<item name="android:indeterminateTintMode">src_in</item>
@@ -84,22 +93,26 @@
<item name="android:statusBarColor">?android:attr/colorPrimary</item>
<item name="android:textAppearanceListItem">@style/TextAppearance.SuwGlifItemTitle</item>
<item name="android:textAppearanceListItemSmall">@style/TextAppearance.SuwGlifItemSummary</item>
- <item name="android:textColorLink">@color/suw_link_color_light</item>
+ <item name="android:textColorLink">@color/suw_color_accent_glif_dark</item>
<item name="android:windowAnimationStyle">@style/Animation.SuwWindowAnimation</item>
<item name="android:windowDisablePreview">true</item>
<item name="android:windowSoftInputMode">adjustResize</item>
<item name="suwColorPrimary">?android:attr/colorPrimary</item>
- <item name="suwDividerInset">@dimen/suw_items_glif_icon_divider_inset</item>
+ <item name="suwDividerInsetEnd">0dp</item>
+ <item name="suwDividerInsetStart">@dimen/suw_items_glif_icon_divider_inset</item>
+ <item name="suwDividerInsetStartNoIcon">@dimen/suw_items_glif_text_divider_inset</item>
<item name="suwGlifHeaderGravity">start</item>
<item name="suwItemDescriptionStyle">@style/SuwItemContainer.Description.Glif</item>
+ <item name="suwItemDescriptionTitleStyle">@style/SuwItemTitle.GlifDescription</item>
<item name="suwListItemIconColor">@color/suw_list_item_icon_color_dark</item>
<item name="suwMarginSides">@dimen/suw_glif_margin_sides</item>
<item name="suwScrollIndicators">bottom</item>
</style>
<style name="SuwThemeGlif.Light" parent="android:Theme.Material.Light.NoActionBar">
- <item name="android:colorAccent">@color/suw_color_accent_glif_dark</item>
+ <item name="android:colorAccent">@color/suw_color_accent_glif_light</item>
+ <item name="android:colorBackground">@color/suw_glif_background_color_light</item>
<item name="android:colorPrimary">@color/suw_color_accent_glif_light</item>
<item name="android:indeterminateTint">?android:attr/colorPrimary</item>
<!-- Specify the indeterminateTintMode to work around a bug in Lollipop -->
@@ -111,15 +124,18 @@
<item name="android:statusBarColor">?android:attr/colorPrimary</item>
<item name="android:textAppearanceListItem">@style/TextAppearance.SuwGlifItemTitle</item>
<item name="android:textAppearanceListItemSmall">@style/TextAppearance.SuwGlifItemSummary</item>
- <item name="android:textColorLink">@color/suw_link_color_light</item>
+ <item name="android:textColorLink">@color/suw_color_accent_glif_light</item>
<item name="android:windowAnimationStyle">@style/Animation.SuwWindowAnimation</item>
<item name="android:windowDisablePreview">true</item>
<item name="android:windowSoftInputMode">adjustResize</item>
<item name="suwColorPrimary">?android:attr/colorPrimary</item>
- <item name="suwDividerInset">@dimen/suw_items_glif_icon_divider_inset</item>
+ <item name="suwDividerInsetEnd">0dp</item>
+ <item name="suwDividerInsetStart">@dimen/suw_items_glif_icon_divider_inset</item>
+ <item name="suwDividerInsetStartNoIcon">@dimen/suw_items_glif_text_divider_inset</item>
<item name="suwGlifHeaderGravity">start</item>
<item name="suwItemDescriptionStyle">@style/SuwItemContainer.Description.Glif</item>
+ <item name="suwItemDescriptionTitleStyle">@style/SuwItemTitle.GlifDescription</item>
<item name="suwListItemIconColor">@color/suw_list_item_icon_color_light</item>
<item name="suwMarginSides">@dimen/suw_glif_margin_sides</item>
<item name="suwScrollIndicators">bottom</item>
@@ -134,7 +150,6 @@
<item name="android:buttonStyle">@style/SuwGlifButton.Primary</item>
<!-- Values used in styles -->
- <item name="android:minWidth">0dp</item>
<item name="android:paddingLeft">@dimen/suw_glif_button_padding</item>
<item name="android:paddingRight">@dimen/suw_glif_button_padding</item>
</style>
diff --git a/library/platform/src/com/android/setupwizardlib/view/RichTextView.java b/library/platform/src/com/android/setupwizardlib/view/RichTextView.java
new file mode 100644
index 0000000..5a78561
--- /dev/null
+++ b/library/platform/src/com/android/setupwizardlib/view/RichTextView.java
@@ -0,0 +1,150 @@
+/*
+ * Copyright (C) 2016 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.setupwizardlib.view;
+
+import android.content.Context;
+import android.text.Annotation;
+import android.text.SpannableString;
+import android.text.Spanned;
+import android.text.method.LinkMovementMethod;
+import android.text.style.ClickableSpan;
+import android.text.style.TextAppearanceSpan;
+import android.util.AttributeSet;
+import android.util.Log;
+import android.widget.TextView;
+
+import com.android.setupwizardlib.span.LinkSpan;
+import com.android.setupwizardlib.span.LinkSpan.OnLinkClickListener;
+import com.android.setupwizardlib.span.SpanHelper;
+
+/**
+ * An extension of TextView that automatically replaces the annotation tags as specified in
+ * {@link SpanHelper#replaceSpan(android.text.Spannable, Object, Object)}
+ *
+ * <p>Note: The accessibility interaction for ClickableSpans (and therefore LinkSpans) are built
+ * into platform in O, although the interaction paradigm is different. (See b/17726921). In this
+ * platform version, the links are exposed in the Local Context Menu of TalkBack instead of
+ * accessible directly through swiping.
+ */
+public class RichTextView extends TextView implements OnLinkClickListener {
+
+ /* static section */
+
+ private static final String TAG = "RichTextView";
+
+ private static final String ANNOTATION_LINK = "link";
+ private static final String ANNOTATION_TEXT_APPEARANCE = "textAppearance";
+
+ /**
+ * Replace &lt;annotation&gt; tags in strings to become their respective types. Currently 2
+ * types are supported:
+ * <ol>
+ * <li>&lt;annotation link="foobar"&gt; will create a
+ * {@link com.android.setupwizardlib.span.LinkSpan} that broadcasts with the key
+ * "foobar"</li>
+ * <li>&lt;annotation textAppearance="TextAppearance.FooBar"&gt; will create a
+ * {@link android.text.style.TextAppearanceSpan} with @style/TextAppearance.FooBar</li>
+ * </ol>
+ */
+ public static CharSequence getRichText(Context context, CharSequence text) {
+ if (text instanceof Spanned) {
+ final SpannableString spannable = new SpannableString(text);
+ final Annotation[] spans = spannable.getSpans(0, spannable.length(), Annotation.class);
+ for (Annotation span : spans) {
+ final String key = span.getKey();
+ if (ANNOTATION_TEXT_APPEARANCE.equals(key)) {
+ String textAppearance = span.getValue();
+ final int style = context.getResources()
+ .getIdentifier(textAppearance, "style", context.getPackageName());
+ if (style == 0) {
+ Log.w(TAG, "Cannot find resource: " + style);
+ }
+ final TextAppearanceSpan textAppearanceSpan =
+ new TextAppearanceSpan(context, style);
+ SpanHelper.replaceSpan(spannable, span, textAppearanceSpan);
+ } else if (ANNOTATION_LINK.equals(key)) {
+ LinkSpan link = new LinkSpan(span.getValue());
+ SpanHelper.replaceSpan(spannable, span, link);
+ }
+ }
+ return spannable;
+ }
+ return text;
+ }
+
+ /* non-static section */
+
+ private OnLinkClickListener mOnLinkClickListener;
+
+ public RichTextView(Context context) {
+ super(context);
+ }
+
+ public RichTextView(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ }
+
+ @Override
+ public void setText(CharSequence text, BufferType type) {
+ text = getRichText(getContext(), text);
+ // Set text first before doing anything else because setMovementMethod internally calls
+ // setText. This in turn ends up calling this method with mText as the first parameter
+ super.setText(text, type);
+ boolean hasLinks = hasLinks(text);
+
+ if (hasLinks) {
+ // When a TextView has a movement method, it will set the view to clickable. This makes
+ // View.onTouchEvent always return true and consumes the touch event, essentially
+ // nullifying any return values of MovementMethod.onTouchEvent.
+ // To still allow propagating touch events to the parent when this view doesn't have
+ // links, we only set the movement method here if the text contains links.
+ setMovementMethod(LinkMovementMethod.getInstance());
+ } else {
+ setMovementMethod(null);
+ }
+ // ExploreByTouchHelper automatically enables focus for RichTextView
+ // even though it may not have any links. Causes problems during talkback
+ // as individual TextViews consume touch events and thereby reducing the focus window
+ // shown by Talkback. Disable focus if there are no links
+ setFocusable(hasLinks);
+ }
+
+ private boolean hasLinks(CharSequence text) {
+ if (text instanceof Spanned) {
+ final ClickableSpan[] spans =
+ ((Spanned) text).getSpans(0, text.length(), ClickableSpan.class);
+ return spans.length > 0;
+ }
+ return false;
+ }
+
+ public void setOnLinkClickListener(OnLinkClickListener listener) {
+ mOnLinkClickListener = listener;
+ }
+
+ public OnLinkClickListener getOnLinkClickListener() {
+ return mOnLinkClickListener;
+ }
+
+ @Override
+ public boolean onLinkClick(LinkSpan span) {
+ if (mOnLinkClickListener != null) {
+ return mOnLinkClickListener.onLinkClick(span);
+ }
+ return false;
+ }
+}
diff --git a/library/full-support/res/layout/suw_glif_preference_recycler_view.xml b/library/recyclerview/res/layout/suw_glif_preference_recycler_view.xml
index af00160..af00160 100644
--- a/library/full-support/res/layout/suw_glif_preference_recycler_view.xml
+++ b/library/recyclerview/res/layout/suw_glif_preference_recycler_view.xml
diff --git a/library/full-support/res/layout/suw_glif_preference_template_header.xml b/library/recyclerview/res/layout/suw_glif_preference_template_header.xml
index b870251..b870251 100644
--- a/library/full-support/res/layout/suw_glif_preference_template_header.xml
+++ b/library/recyclerview/res/layout/suw_glif_preference_template_header.xml
diff --git a/library/full-support/res/layout/suw_glif_recycler_template_card.xml b/library/recyclerview/res/layout/suw_glif_recycler_template_card.xml
index 7b5c6b0..7b5c6b0 100644
--- a/library/full-support/res/layout/suw_glif_recycler_template_card.xml
+++ b/library/recyclerview/res/layout/suw_glif_recycler_template_card.xml
diff --git a/library/full-support/res/layout/suw_glif_recycler_template_compact.xml b/library/recyclerview/res/layout/suw_glif_recycler_template_compact.xml
index 9081efb..9081efb 100644
--- a/library/full-support/res/layout/suw_glif_recycler_template_compact.xml
+++ b/library/recyclerview/res/layout/suw_glif_recycler_template_compact.xml
diff --git a/library/full-support/res/layout/suw_glif_recycler_template_content.xml b/library/recyclerview/res/layout/suw_glif_recycler_template_content.xml
index e8d209b..e8d209b 100644
--- a/library/full-support/res/layout/suw_glif_recycler_template_content.xml
+++ b/library/recyclerview/res/layout/suw_glif_recycler_template_content.xml
diff --git a/library/full-support/res/layout/suw_preference_recycler_view_header.xml b/library/recyclerview/res/layout/suw_preference_recycler_view_header.xml
index 20e1d19..20e1d19 100644
--- a/library/full-support/res/layout/suw_preference_recycler_view_header.xml
+++ b/library/recyclerview/res/layout/suw_preference_recycler_view_header.xml
diff --git a/library/full-support/res/layout/suw_preference_recycler_view_normal.xml b/library/recyclerview/res/layout/suw_preference_recycler_view_normal.xml
index 0979d91..0979d91 100644
--- a/library/full-support/res/layout/suw_preference_recycler_view_normal.xml
+++ b/library/recyclerview/res/layout/suw_preference_recycler_view_normal.xml
diff --git a/library/full-support/res/layout/suw_preference_template_header.xml b/library/recyclerview/res/layout/suw_preference_template_header.xml
index 6377616..6377616 100644
--- a/library/full-support/res/layout/suw_preference_template_header.xml
+++ b/library/recyclerview/res/layout/suw_preference_template_header.xml
diff --git a/library/full-support/res/layout/suw_recycler_template_card.xml b/library/recyclerview/res/layout/suw_recycler_template_card.xml
index 1d7b143..1d7b143 100644
--- a/library/full-support/res/layout/suw_recycler_template_card.xml
+++ b/library/recyclerview/res/layout/suw_recycler_template_card.xml
diff --git a/library/full-support/res/layout/suw_recycler_template_card_wide.xml b/library/recyclerview/res/layout/suw_recycler_template_card_wide.xml
index e5e876f..e5e876f 100644
--- a/library/full-support/res/layout/suw_recycler_template_card_wide.xml
+++ b/library/recyclerview/res/layout/suw_recycler_template_card_wide.xml
diff --git a/library/full-support/res/layout/suw_recycler_template_header.xml b/library/recyclerview/res/layout/suw_recycler_template_header.xml
index d2c9622..d2c9622 100644
--- a/library/full-support/res/layout/suw_recycler_template_header.xml
+++ b/library/recyclerview/res/layout/suw_recycler_template_header.xml
diff --git a/library/full-support/res/layout/suw_recycler_template_header_collapsed.xml b/library/recyclerview/res/layout/suw_recycler_template_header_collapsed.xml
index 1960f0d..1960f0d 100644
--- a/library/full-support/res/layout/suw_recycler_template_header_collapsed.xml
+++ b/library/recyclerview/res/layout/suw_recycler_template_header_collapsed.xml
diff --git a/library/full-support/res/values-land/layouts.xml b/library/recyclerview/res/values-land/layouts.xml
index 3aacec9..3aacec9 100644
--- a/library/full-support/res/values-land/layouts.xml
+++ b/library/recyclerview/res/values-land/layouts.xml
diff --git a/library/full-support/res/values-sw600dp-land/layouts.xml b/library/recyclerview/res/values-sw600dp-land/layouts.xml
index 0feed90..0feed90 100644
--- a/library/full-support/res/values-sw600dp-land/layouts.xml
+++ b/library/recyclerview/res/values-sw600dp-land/layouts.xml
diff --git a/library/full-support/res/values-sw600dp/layouts.xml b/library/recyclerview/res/values-sw600dp/layouts.xml
index bfd4863..bfd4863 100644
--- a/library/full-support/res/values-sw600dp/layouts.xml
+++ b/library/recyclerview/res/values-sw600dp/layouts.xml
diff --git a/library/full-support/res/values/attrs.xml b/library/recyclerview/res/values/attrs.xml
index e4fb41f..a098d5a 100644
--- a/library/full-support/res/values/attrs.xml
+++ b/library/recyclerview/res/values/attrs.xml
@@ -28,6 +28,8 @@
<declare-styleable name="SuwRecyclerMixin">
<attr name="android:entries" />
<attr name="suwDividerInset" />
+ <attr name="suwDividerInsetEnd" />
+ <attr name="suwDividerInsetStart" />
<attr name="suwHasStableIds" />
</declare-styleable>
diff --git a/library/full-support/res/values/layouts.xml b/library/recyclerview/res/values/layouts.xml
index f0b1e9d..f0b1e9d 100644
--- a/library/full-support/res/values/layouts.xml
+++ b/library/recyclerview/res/values/layouts.xml
diff --git a/library/full-support/src/com/android/setupwizardlib/DividerItemDecoration.java b/library/recyclerview/src/com/android/setupwizardlib/DividerItemDecoration.java
index bbd7b50..6c1a928 100644
--- a/library/full-support/src/com/android/setupwizardlib/DividerItemDecoration.java
+++ b/library/recyclerview/src/com/android/setupwizardlib/DividerItemDecoration.java
@@ -36,12 +36,16 @@ import java.lang.annotation.RetentionPolicy;
* default, and the behavior of whether the divider is shown can be customized by subclassing
* {@link com.android.setupwizardlib.DividerItemDecoration.DividedViewHolder}.
*
- * <p>Modified from v14 PreferenceFragment.DividerDecoration, added with inset capabilities.
+ * <p>Modified from v14 PreferenceFragment.DividerDecoration.
*/
public class DividerItemDecoration extends RecyclerView.ItemDecoration {
/* static section */
+ /**
+ * An interface to be implemented by a {@link RecyclerView.ViewHolder} which controls whether
+ * dividers should be shown above and below that item.
+ */
public interface DividedViewHolder {
/**
diff --git a/library/full-support/src/com/android/setupwizardlib/GlifPreferenceLayout.java b/library/recyclerview/src/com/android/setupwizardlib/GlifPreferenceLayout.java
index d337e84..d337e84 100644
--- a/library/full-support/src/com/android/setupwizardlib/GlifPreferenceLayout.java
+++ b/library/recyclerview/src/com/android/setupwizardlib/GlifPreferenceLayout.java
diff --git a/library/full-support/src/com/android/setupwizardlib/GlifRecyclerLayout.java b/library/recyclerview/src/com/android/setupwizardlib/GlifRecyclerLayout.java
index d1a7947..75b1c7a 100644
--- a/library/full-support/src/com/android/setupwizardlib/GlifRecyclerLayout.java
+++ b/library/recyclerview/src/com/android/setupwizardlib/GlifRecyclerLayout.java
@@ -147,20 +147,43 @@ public class GlifRecyclerLayout extends GlifLayout {
}
/**
- * @see RecyclerMixin#setDividerInset(int)
+ * @deprecated Use {@link #setDividerInsets(int, int)} instead.
*/
+ @Deprecated
public void setDividerInset(int inset) {
mRecyclerMixin.setDividerInset(inset);
}
/**
- * @see RecyclerMixin#getDividerInset()
+ * @see RecyclerMixin#setDividerInset(int)
*/
+ public void setDividerInsets(int start, int end) {
+ mRecyclerMixin.setDividerInsets(start, end);
+ }
+
+ /**
+ * @deprecated Use {@link #getDividerInsetStart()} instead.
+ */
+ @Deprecated
public int getDividerInset() {
return mRecyclerMixin.getDividerInset();
}
/**
+ * @see RecyclerMixin#getDividerInsetStart()
+ */
+ public int getDividerInsetStart() {
+ return mRecyclerMixin.getDividerInsetStart();
+ }
+
+ /**
+ * @see RecyclerMixin#getDividerInsetEnd()
+ */
+ public int getDividerInsetEnd() {
+ return mRecyclerMixin.getDividerInsetEnd();
+ }
+
+ /**
* @see RecyclerMixin#getDivider()
*/
public Drawable getDivider() {
diff --git a/library/full-support/src/com/android/setupwizardlib/SetupWizardPreferenceLayout.java b/library/recyclerview/src/com/android/setupwizardlib/SetupWizardPreferenceLayout.java
index f0df24c..6570694 100644
--- a/library/full-support/src/com/android/setupwizardlib/SetupWizardPreferenceLayout.java
+++ b/library/recyclerview/src/com/android/setupwizardlib/SetupWizardPreferenceLayout.java
@@ -59,8 +59,7 @@ import com.android.setupwizardlib.template.RecyclerMixin;
* }</pre>
*
* <p />Fragments using this layout <em>must</em> delegate {@code onCreateRecyclerView} to the
- * implementation in this class:
- * {@link #onCreateRecyclerView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle)}
+ * implementation in this class: {@link #onCreateRecyclerView}
*/
public class SetupWizardPreferenceLayout extends SetupWizardRecyclerLayout {
diff --git a/library/full-support/src/com/android/setupwizardlib/SetupWizardRecyclerLayout.java b/library/recyclerview/src/com/android/setupwizardlib/SetupWizardRecyclerLayout.java
index 870a805..5ff825d 100644
--- a/library/full-support/src/com/android/setupwizardlib/SetupWizardRecyclerLayout.java
+++ b/library/recyclerview/src/com/android/setupwizardlib/SetupWizardRecyclerLayout.java
@@ -139,27 +139,51 @@ public class SetupWizardRecyclerLayout extends SetupWizardLayout {
}
/**
+ * @deprecated Use {@link #setDividerInsets(int, int)} instead.
+ */
+ @Deprecated
+ public void setDividerInset(int inset) {
+ mRecyclerMixin.setDividerInset(inset);
+ }
+
+ /**
* Sets the start inset of the divider. This will use the default divider drawable set in the
- * theme and inset it {@code inset} pixels to the right (or left in RTL layouts).
+ * theme and apply insets to it.
*
- * @param inset The number of pixels to inset on the "start" side of the list divider. Typically
+ * @param start The number of pixels to inset on the "start" side of the list divider. Typically
* this will be either {@code @dimen/suw_items_icon_divider_inset} or
* {@code @dimen/suw_items_text_divider_inset}.
+ * @param end The number of pixels to inset on the "end" side of the list divider.
*
- * @see RecyclerMixin#setDividerInset(int)
+ * @see RecyclerMixin#setDividerInsets(int, int)
*/
- public void setDividerInset(int inset) {
- mRecyclerMixin.setDividerInset(inset);
+ public void setDividerInsets(int start, int end) {
+ mRecyclerMixin.setDividerInsets(start, end);
}
/**
- * @see RecyclerMixin#getDividerInset()
+ * @deprecated Use {@link #getDividerInsetStart()} instead.
*/
+ @Deprecated
public int getDividerInset() {
return mRecyclerMixin.getDividerInset();
}
/**
+ * @see RecyclerMixin#getDividerInsetStart()
+ */
+ public int getDividerInsetStart() {
+ return mRecyclerMixin.getDividerInsetStart();
+ }
+
+ /**
+ * @see RecyclerMixin#getDividerInsetEnd()
+ */
+ public int getDividerInsetEnd() {
+ return mRecyclerMixin.getDividerInsetEnd();
+ }
+
+ /**
* @see RecyclerMixin#getDivider()
*/
public Drawable getDivider() {
diff --git a/library/full-support/src/com/android/setupwizardlib/items/ItemViewHolder.java b/library/recyclerview/src/com/android/setupwizardlib/items/ItemViewHolder.java
index 8f89603..231f81d 100644
--- a/library/full-support/src/com/android/setupwizardlib/items/ItemViewHolder.java
+++ b/library/recyclerview/src/com/android/setupwizardlib/items/ItemViewHolder.java
@@ -27,7 +27,7 @@ class ItemViewHolder extends RecyclerView.ViewHolder
private boolean mIsEnabled;
private IItem mItem;
- public ItemViewHolder(View itemView) {
+ ItemViewHolder(View itemView) {
super(itemView);
}
diff --git a/library/full-support/src/com/android/setupwizardlib/items/RecyclerItemAdapter.java b/library/recyclerview/src/com/android/setupwizardlib/items/RecyclerItemAdapter.java
index 9b7f6c3..78280a6 100644
--- a/library/full-support/src/com/android/setupwizardlib/items/RecyclerItemAdapter.java
+++ b/library/recyclerview/src/com/android/setupwizardlib/items/RecyclerItemAdapter.java
@@ -46,7 +46,16 @@ public class RecyclerItemAdapter extends RecyclerView.Adapter<ItemViewHolder>
*/
public static final String TAG_NO_BACKGROUND = "noBackground";
+ /**
+ * Listener for item selection in this adapter.
+ */
public interface OnItemSelectedListener {
+
+ /**
+ * Called when an item in this adapter is clicked.
+ *
+ * @param item The Item corresponding to the position being clicked.
+ */
void onItemSelected(IItem item);
}
@@ -58,6 +67,11 @@ public class RecyclerItemAdapter extends RecyclerView.Adapter<ItemViewHolder>
mItemHierarchy.registerObserver(this);
}
+ /**
+ * Gets the item at the given position.
+ *
+ * @see ItemHierarchy#getItemAt(int)
+ */
public IItem getItem(int position) {
return mItemHierarchy.getItemAt(position);
}
@@ -95,8 +109,11 @@ public class RecyclerItemAdapter extends RecyclerView.Adapter<ItemViewHolder>
R.styleable.SuwRecyclerItemAdapter_selectableItemBackground);
}
- final Drawable background = typedArray.getDrawable(
- R.styleable.SuwRecyclerItemAdapter_android_colorBackground);
+ Drawable background = view.getBackground();
+ if (background == null) {
+ background = typedArray.getDrawable(
+ R.styleable.SuwRecyclerItemAdapter_android_colorBackground);
+ }
if (selectableItemBackground == null || background == null) {
Log.e(TAG, "Cannot resolve required attributes."
@@ -177,14 +194,27 @@ public class RecyclerItemAdapter extends RecyclerView.Adapter<ItemViewHolder>
notifyItemRangeRemoved(positionStart, itemCount);
}
+ /**
+ * Find an item hierarchy within the root hierarchy.
+ *
+ * @see ItemHierarchy#findItemById(int)
+ */
public ItemHierarchy findItemById(int id) {
return mItemHierarchy.findItemById(id);
}
+ /**
+ * Gets the root item hierarchy in this adapter.
+ */
public ItemHierarchy getRootItemHierarchy() {
return mItemHierarchy;
}
+ /**
+ * Sets the listener to listen for when user clicks on a item.
+ *
+ * @see OnItemSelectedListener
+ */
public void setOnItemSelectedListener(OnItemSelectedListener listener) {
mListener = listener;
}
diff --git a/library/full-support/src/com/android/setupwizardlib/template/RecyclerMixin.java b/library/recyclerview/src/com/android/setupwizardlib/template/RecyclerMixin.java
index 56751d4..fa5ac4a 100644
--- a/library/full-support/src/com/android/setupwizardlib/template/RecyclerMixin.java
+++ b/library/recyclerview/src/com/android/setupwizardlib/template/RecyclerMixin.java
@@ -63,7 +63,9 @@ public class RecyclerMixin implements Mixin {
private Drawable mDefaultDivider;
private Drawable mDivider;
- private int mDividerInset;
+
+ private int mDividerInsetStart;
+ private int mDividerInsetEnd;
/**
* Creates the RecyclerMixin. Unlike typical mixins which are created in the constructor, this
@@ -112,8 +114,17 @@ public class RecyclerMixin implements Mixin {
setAdapter(adapter);
}
int dividerInset =
- a.getDimensionPixelSize(R.styleable.SuwRecyclerMixin_suwDividerInset, 0);
- setDividerInset(dividerInset);
+ a.getDimensionPixelSize(R.styleable.SuwRecyclerMixin_suwDividerInset, -1);
+ if (dividerInset != -1) {
+ setDividerInset(dividerInset);
+ } else {
+ int dividerInsetStart =
+ a.getDimensionPixelSize(R.styleable.SuwRecyclerMixin_suwDividerInsetStart, 0);
+ int dividerInsetEnd =
+ a.getDimensionPixelSize(R.styleable.SuwRecyclerMixin_suwDividerInsetEnd, 0);
+ setDividerInsets(dividerInsetStart, dividerInsetEnd);
+ }
+
a.recycle();
}
@@ -174,23 +185,49 @@ public class RecyclerMixin implements Mixin {
}
/**
+ * @deprecated Use {@link #setDividerInsets(int, int)} instead.
+ */
+ @Deprecated
+ public void setDividerInset(int inset) {
+ setDividerInsets(inset, 0);
+ }
+
+ /**
* Sets the start inset of the divider. This will use the default divider drawable set in the
- * theme and inset it {@code inset} pixels to the right (or left in RTL layouts).
+ * theme and apply insets to it.
*
- * @param inset The number of pixels to inset on the "start" side of the list divider. Typically
+ * @param start The number of pixels to inset on the "start" side of the list divider. Typically
* this will be either {@code @dimen/suw_items_glif_icon_divider_inset} or
* {@code @dimen/suw_items_glif_text_divider_inset}.
+ * @param end The number of pixels to inset on the "end" side of the list divider.
*/
- public void setDividerInset(int inset) {
- mDividerInset = inset;
+ public void setDividerInsets(int start, int end) {
+ mDividerInsetStart = start;
+ mDividerInsetEnd = end;
updateDivider();
}
/**
* @return The number of pixels inset on the start side of the divider.
+ * @deprecated This is the same as {@link #getDividerInsetStart()}. Use that instead.
*/
+ @Deprecated
public int getDividerInset() {
- return mDividerInset;
+ return getDividerInsetStart();
+ }
+
+ /**
+ * @return The number of pixels inset on the start side of the divider.
+ */
+ public int getDividerInsetStart() {
+ return mDividerInsetStart;
+ }
+
+ /**
+ * @return The number of pixels inset on the end side of the divider.
+ */
+ public int getDividerInsetEnd() {
+ return mDividerInsetEnd;
}
private void updateDivider() {
@@ -204,9 +241,9 @@ public class RecyclerMixin implements Mixin {
}
mDivider = DrawableLayoutDirectionHelper.createRelativeInsetDrawable(
mDefaultDivider,
- mDividerInset /* start */,
+ mDividerInsetStart /* start */,
0 /* top */,
- 0 /* end */,
+ mDividerInsetEnd /* end */,
0 /* bottom */,
mTemplateLayout);
mDividerDecoration.setDivider(mDivider);
diff --git a/library/full-support/src/com/android/setupwizardlib/template/RecyclerViewScrollHandlingDelegate.java b/library/recyclerview/src/com/android/setupwizardlib/template/RecyclerViewScrollHandlingDelegate.java
index 41fb03e..41fb03e 100644
--- a/library/full-support/src/com/android/setupwizardlib/template/RecyclerViewScrollHandlingDelegate.java
+++ b/library/recyclerview/src/com/android/setupwizardlib/template/RecyclerViewScrollHandlingDelegate.java
diff --git a/library/full-support/src/com/android/setupwizardlib/view/HeaderRecyclerView.java b/library/recyclerview/src/com/android/setupwizardlib/view/HeaderRecyclerView.java
index 09ddd33..cf13d01 100644
--- a/library/full-support/src/com/android/setupwizardlib/view/HeaderRecyclerView.java
+++ b/library/recyclerview/src/com/android/setupwizardlib/view/HeaderRecyclerView.java
@@ -16,7 +16,6 @@
package com.android.setupwizardlib.view;
-import android.annotation.SuppressLint;
import android.content.Context;
import android.content.res.TypedArray;
import android.os.Build;
@@ -41,7 +40,7 @@ public class HeaderRecyclerView extends RecyclerView {
private static class HeaderViewHolder extends ViewHolder
implements DividerItemDecoration.DividedViewHolder {
- public HeaderViewHolder(View itemView) {
+ HeaderViewHolder(View itemView) {
super(itemView);
}
@@ -119,23 +118,18 @@ public class HeaderRecyclerView extends RecyclerView {
setHasStableIds(mAdapter.hasStableIds());
}
- @SuppressLint("InlinedApi") // MATCH_PARENT is the same constant as FILL_PARENT available
- // on earlier versions.
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
- /*
- * Returning the same view (mHeader) results in crash ".. but view is not a real child."
- * The framework creates more than one instance of header because of "disappear"
- * animations applied on the header and this necessitates creation of another headerview
- * to use after the animation. We work around this restriction by returning an empty
- * framelayout to which the header is attached using #onBindViewHolder method.
- */
+ // Returning the same view (mHeader) results in crash ".. but view is not a real child."
+ // The framework creates more than one instance of header because of "disappear"
+ // animations applied on the header and this necessitates creation of another header
+ // view to use after the animation. We work around this restriction by returning an
+ // empty FrameLayout to which the header is attached using #onBindViewHolder method.
if (viewType == HEADER_VIEW_TYPE) {
FrameLayout frameLayout = new FrameLayout(parent.getContext());
FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(
- FrameLayout.LayoutParams.MATCH_PARENT,
- FrameLayout.LayoutParams.WRAP_CONTENT
- );
+ FrameLayout.LayoutParams.MATCH_PARENT,
+ FrameLayout.LayoutParams.WRAP_CONTENT);
frameLayout.setLayoutParams(params);
return new HeaderViewHolder(frameLayout);
} else {
diff --git a/library/full-support/src/com/android/setupwizardlib/view/StickyHeaderRecyclerView.java b/library/recyclerview/src/com/android/setupwizardlib/view/StickyHeaderRecyclerView.java
index a733b6c..d51ea56 100644
--- a/library/full-support/src/com/android/setupwizardlib/view/StickyHeaderRecyclerView.java
+++ b/library/recyclerview/src/com/android/setupwizardlib/view/StickyHeaderRecyclerView.java
@@ -79,6 +79,10 @@ public class StickyHeaderRecyclerView extends HeaderRecyclerView {
}
}
+ /**
+ * Call this method when the "sticky" view has changed, so this view can update its internal
+ * states as well.
+ */
public void updateStickyView() {
final View header = getHeader();
if (header != null) {
diff --git a/library/recyclerview/test/instrumentation/res/drawable/item_bg.xml b/library/recyclerview/test/instrumentation/res/drawable/item_bg.xml
new file mode 100644
index 0000000..285ae28
--- /dev/null
+++ b/library/recyclerview/test/instrumentation/res/drawable/item_bg.xml
@@ -0,0 +1,19 @@
+<!--
+ Copyright (C) 2015 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.
+-->
+
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+ <corners android:radius="1dp"/>
+</shape> \ No newline at end of file
diff --git a/library/recyclerview/test/instrumentation/res/layout/test_existing_background.xml b/library/recyclerview/test/instrumentation/res/layout/test_existing_background.xml
new file mode 100644
index 0000000..fa2b22a
--- /dev/null
+++ b/library/recyclerview/test/instrumentation/res/layout/test_existing_background.xml
@@ -0,0 +1,20 @@
+<!--
+ Copyright (C) 2017 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.
+-->
+
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:background="@drawable/item_bg" />
diff --git a/library/full-support/test/instrumentation/res/layout/test_glif_recycler_layout.xml b/library/recyclerview/test/instrumentation/res/layout/test_glif_recycler_layout.xml
index 45a3928..45a3928 100644
--- a/library/full-support/test/instrumentation/res/layout/test_glif_recycler_layout.xml
+++ b/library/recyclerview/test/instrumentation/res/layout/test_glif_recycler_layout.xml
diff --git a/library/full-support/test/instrumentation/res/layout/test_list_item.xml b/library/recyclerview/test/instrumentation/res/layout/test_list_item.xml
index 220067d..220067d 100644
--- a/library/full-support/test/instrumentation/res/layout/test_list_item.xml
+++ b/library/recyclerview/test/instrumentation/res/layout/test_list_item.xml
diff --git a/library/full-support/test/instrumentation/res/layout/test_list_item_no_background.xml b/library/recyclerview/test/instrumentation/res/layout/test_list_item_no_background.xml
index 0968e92..0968e92 100644
--- a/library/full-support/test/instrumentation/res/layout/test_list_item_no_background.xml
+++ b/library/recyclerview/test/instrumentation/res/layout/test_list_item_no_background.xml
diff --git a/library/full-support/test/instrumentation/res/layout/test_recycler_layout.xml b/library/recyclerview/test/instrumentation/res/layout/test_recycler_layout.xml
index 8b7602e..8b7602e 100644
--- a/library/full-support/test/instrumentation/res/layout/test_recycler_layout.xml
+++ b/library/recyclerview/test/instrumentation/res/layout/test_recycler_layout.xml
diff --git a/library/full-support/test/instrumentation/src/com/android/setupwizardlib/items/RecyclerItemAdapterTest.java b/library/recyclerview/test/instrumentation/src/com/android/setupwizardlib/items/RecyclerItemAdapterTest.java
index 3867bfe..1bfbb95 100644
--- a/library/full-support/test/instrumentation/src/com/android/setupwizardlib/items/RecyclerItemAdapterTest.java
+++ b/library/recyclerview/test/instrumentation/src/com/android/setupwizardlib/items/RecyclerItemAdapterTest.java
@@ -29,6 +29,7 @@ import static org.mockito.Mockito.verify;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
+import android.graphics.drawable.GradientDrawable;
import android.graphics.drawable.ShapeDrawable;
import android.graphics.drawable.shapes.RectShape;
import android.support.test.InstrumentationRegistry;
@@ -133,7 +134,7 @@ public class RecyclerItemAdapterTest {
}
@Test
- public void testCreateViewHolderNoBcakground() {
+ public void testCreateViewHolderNoBackground() {
RecyclerItemAdapter adapter = new RecyclerItemAdapter(mItemGroup);
FrameLayout parent = new FrameLayout(InstrumentationRegistry.getContext());
@@ -141,4 +142,18 @@ public class RecyclerItemAdapterTest {
adapter.onCreateViewHolder(parent, R.layout.test_list_item_no_background);
assertNull("Background should be null", viewHolder.itemView.getBackground());
}
+
+ @Test
+ public void testCreateViewHolderWithExistingBackground() {
+ RecyclerItemAdapter adapter = new RecyclerItemAdapter(mItemGroup);
+ FrameLayout parent = new FrameLayout(InstrumentationRegistry.getContext());
+
+ final ItemViewHolder viewHolder =
+ adapter.onCreateViewHolder(parent, R.layout.test_existing_background);
+ Drawable background = viewHolder.itemView.getBackground();
+ assertTrue(background instanceof PatchedLayerDrawable);
+
+ PatchedLayerDrawable layerDrawable = (PatchedLayerDrawable) background;
+ assertTrue(layerDrawable.getDrawable(0) instanceof GradientDrawable);
+ }
}
diff --git a/library/full-support/test/instrumentation/src/com/android/setupwizardlib/template/RecyclerMixinTest.java b/library/recyclerview/test/instrumentation/src/com/android/setupwizardlib/template/RecyclerMixinTest.java
index 79105d6..ce73791 100644
--- a/library/full-support/test/instrumentation/src/com/android/setupwizardlib/template/RecyclerMixinTest.java
+++ b/library/recyclerview/test/instrumentation/src/com/android/setupwizardlib/template/RecyclerMixinTest.java
@@ -96,7 +96,7 @@ public class RecyclerMixinTest {
}
@Test
- public void testDividerInset() {
+ public void testDividerLegacyInset() {
RecyclerMixin mixin = new RecyclerMixin(mTemplateLayout, mRecyclerView);
mixin.setDividerInset(123);
@@ -111,7 +111,23 @@ public class RecyclerMixinTest {
}
@Test
- public void testDividerInsetRtl() {
+ public void testDividerInsets() {
+ RecyclerMixin mixin = new RecyclerMixin(mTemplateLayout, mRecyclerView);
+ mixin.setDividerInsets(123, 456);
+
+ assertEquals(123, mixin.getDividerInsetStart());
+ assertEquals(456, mixin.getDividerInsetEnd());
+
+ final Drawable divider = mixin.getDivider();
+ InsetDrawable insetDrawable = (InsetDrawable) divider;
+ Rect rect = new Rect();
+ insetDrawable.getPadding(rect);
+
+ assertEquals(new Rect(123, 0, 456, 0), rect);
+ }
+
+ @Test
+ public void testDividerInsetLegacyRtl() {
if (VERSION.SDK_INT >= VERSION_CODES.JELLY_BEAN_MR1) {
doReturn(View.LAYOUT_DIRECTION_RTL).when(mTemplateLayout).getLayoutDirection();
@@ -129,4 +145,25 @@ public class RecyclerMixinTest {
}
// else the test passes
}
+
+ @Test
+ public void testDividerInsetsRtl() {
+ if (VERSION.SDK_INT >= VERSION_CODES.JELLY_BEAN_MR1) {
+ doReturn(View.LAYOUT_DIRECTION_RTL).when(mTemplateLayout).getLayoutDirection();
+
+ RecyclerMixin mixin = new RecyclerMixin(mTemplateLayout, mRecyclerView);
+ mixin.setDividerInsets(123, 456);
+
+ assertEquals(123, mixin.getDividerInsetStart());
+ assertEquals(456, mixin.getDividerInsetEnd());
+
+ final Drawable divider = mixin.getDivider();
+ InsetDrawable insetDrawable = (InsetDrawable) divider;
+ Rect rect = new Rect();
+ insetDrawable.getPadding(rect);
+
+ assertEquals(new Rect(456, 0, 123, 0), rect);
+ }
+ // else the test passes
+ }
}
diff --git a/library/full-support/test/instrumentation/src/com/android/setupwizardlib/test/DividerItemDecorationTest.java b/library/recyclerview/test/instrumentation/src/com/android/setupwizardlib/test/DividerItemDecorationTest.java
index 747d1ba..747d1ba 100644
--- a/library/full-support/test/instrumentation/src/com/android/setupwizardlib/test/DividerItemDecorationTest.java
+++ b/library/recyclerview/test/instrumentation/src/com/android/setupwizardlib/test/DividerItemDecorationTest.java
diff --git a/library/full-support/test/instrumentation/src/com/android/setupwizardlib/test/GlifPreferenceLayoutTest.java b/library/recyclerview/test/instrumentation/src/com/android/setupwizardlib/test/GlifPreferenceLayoutTest.java
index 791e11f..791e11f 100644
--- a/library/full-support/test/instrumentation/src/com/android/setupwizardlib/test/GlifPreferenceLayoutTest.java
+++ b/library/recyclerview/test/instrumentation/src/com/android/setupwizardlib/test/GlifPreferenceLayoutTest.java
diff --git a/library/full-support/test/instrumentation/src/com/android/setupwizardlib/test/GlifRecyclerLayoutTest.java b/library/recyclerview/test/instrumentation/src/com/android/setupwizardlib/test/GlifRecyclerLayoutTest.java
index b27564d..4bd98ce 100644
--- a/library/full-support/test/instrumentation/src/com/android/setupwizardlib/test/GlifRecyclerLayoutTest.java
+++ b/library/recyclerview/test/instrumentation/src/com/android/setupwizardlib/test/GlifRecyclerLayoutTest.java
@@ -105,7 +105,7 @@ public class GlifRecyclerLayoutTest {
}
@Test
- public void testDividerInset() {
+ public void testDividerInsetLegacy() {
GlifRecyclerLayout layout = new GlifRecyclerLayout(mContext);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
layout.setLayoutDirection(View.LAYOUT_DIRECTION_LTR);
@@ -120,6 +120,22 @@ public class GlifRecyclerLayoutTest {
}
@Test
+ public void testDividerInsets() {
+ GlifRecyclerLayout layout = new GlifRecyclerLayout(mContext);
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
+ layout.setLayoutDirection(View.LAYOUT_DIRECTION_LTR);
+ }
+ assertRecyclerTemplateInflated(layout);
+
+ layout.setDividerInsets(10, 15);
+ assertEquals("Divider inset start should be 10", 10, layout.getDividerInsetStart());
+ assertEquals("Divider inset end should be 15", 15, layout.getDividerInsetEnd());
+
+ final Drawable divider = layout.getDivider();
+ assertTrue("Divider should be instance of InsetDrawable", divider instanceof InsetDrawable);
+ }
+
+ @Test
public void testTemplateWithNoRecyclerView() {
try {
new GlifRecyclerLayout(mContext, R.layout.suw_glif_template);
diff --git a/library/full-support/test/instrumentation/src/com/android/setupwizardlib/test/HeaderRecyclerViewTest.java b/library/recyclerview/test/instrumentation/src/com/android/setupwizardlib/test/HeaderRecyclerViewTest.java
index d9f52cd..d9f52cd 100644
--- a/library/full-support/test/instrumentation/src/com/android/setupwizardlib/test/HeaderRecyclerViewTest.java
+++ b/library/recyclerview/test/instrumentation/src/com/android/setupwizardlib/test/HeaderRecyclerViewTest.java
diff --git a/library/full-support/test/instrumentation/src/com/android/setupwizardlib/test/SetupWizardPreferenceLayoutTest.java b/library/recyclerview/test/instrumentation/src/com/android/setupwizardlib/test/SetupWizardPreferenceLayoutTest.java
index 486d2cf..486d2cf 100644
--- a/library/full-support/test/instrumentation/src/com/android/setupwizardlib/test/SetupWizardPreferenceLayoutTest.java
+++ b/library/recyclerview/test/instrumentation/src/com/android/setupwizardlib/test/SetupWizardPreferenceLayoutTest.java
diff --git a/library/full-support/test/instrumentation/src/com/android/setupwizardlib/test/SetupWizardRecyclerLayoutTest.java b/library/recyclerview/test/instrumentation/src/com/android/setupwizardlib/test/SetupWizardRecyclerLayoutTest.java
index 4a72992..4b38945 100644
--- a/library/full-support/test/instrumentation/src/com/android/setupwizardlib/test/SetupWizardRecyclerLayoutTest.java
+++ b/library/recyclerview/test/instrumentation/src/com/android/setupwizardlib/test/SetupWizardRecyclerLayoutTest.java
@@ -106,7 +106,7 @@ public class SetupWizardRecyclerLayoutTest {
}
@Test
- public void testDividerInset() {
+ public void testDividerInsetLegacy() {
SetupWizardRecyclerLayout layout = new SetupWizardRecyclerLayout(mContext);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
layout.setLayoutDirection(View.LAYOUT_DIRECTION_LTR);
@@ -121,6 +121,22 @@ public class SetupWizardRecyclerLayoutTest {
}
@Test
+ public void testDividerInsets() {
+ SetupWizardRecyclerLayout layout = new SetupWizardRecyclerLayout(mContext);
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
+ layout.setLayoutDirection(View.LAYOUT_DIRECTION_LTR);
+ }
+ assertRecyclerTemplateInflated(layout);
+
+ layout.setDividerInsets(10, 15);
+ assertEquals("Divider inset start should be 10", 10, layout.getDividerInsetStart());
+ assertEquals("Divider inset end should be 15", 15, layout.getDividerInsetEnd());
+
+ final Drawable divider = layout.getDivider();
+ assertTrue("Divider should be instance of InsetDrawable", divider instanceof InsetDrawable);
+ }
+
+ @Test
public void testTemplateWithNoRecyclerView() {
try {
new SetupWizardRecyclerLayout(
diff --git a/library/full-support/test/robotest/src/com/android/setupwizardlib/template/RecyclerViewScrollHandlingDelegateTest.java b/library/recyclerview/test/robotest/src/com/android/setupwizardlib/template/RecyclerViewScrollHandlingDelegateTest.java
index b509389..b509389 100644
--- a/library/full-support/test/robotest/src/com/android/setupwizardlib/template/RecyclerViewScrollHandlingDelegateTest.java
+++ b/library/recyclerview/test/robotest/src/com/android/setupwizardlib/template/RecyclerViewScrollHandlingDelegateTest.java
diff --git a/library/rules.gradle b/library/rules.gradle
index a3868cc..6b0acce 100644
--- a/library/rules.gradle
+++ b/library/rules.gradle
@@ -63,8 +63,8 @@ android {
}
gingerbreadCompat {
- java.srcDirs = ['eclair-mr1/src', 'full-support/src']
- res.srcDirs = ['eclair-mr1/res', 'full-support/res']
+ java.srcDirs = ['gingerbread/src', 'recyclerview/src']
+ res.srcDirs = ['gingerbread/res', 'recyclerview/res']
}
}
}
diff --git a/library/self.gradle b/library/self.gradle
index f6d14af..b7cbd55 100644
--- a/library/self.gradle
+++ b/library/self.gradle
@@ -25,8 +25,11 @@ android.sourceSets {
}
androidTestGingerbreadCompat {
- java.srcDirs = ['full-support/test/instrumentation/src', 'eclair-mr1/test/instrumentation/src']
- res.srcDirs = ['full-support/test/instrumentation/res']
+ java.srcDirs = [
+ 'gingerbread/test/instrumentation/src',
+ 'recyclerview/test/instrumentation/src'
+ ]
+ res.srcDirs = ['recyclerview/test/instrumentation/res']
}
test {
@@ -43,7 +46,7 @@ android.sourceSets {
}
testGingerbreadCompat {
- java.srcDirs = ['eclair-mr1/test/robotest/src', 'full-support/test/robotest/src']
+ java.srcDirs = ['gingerbread/test/robotest/src', 'recyclerview/test/robotest/src']
}
}
android.defaultConfig.testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
@@ -59,12 +62,36 @@ android.lintOptions {
android.libraryVariants.all { variant ->
variant.assemble.dependsOn(tasks.findByName('lint'))
}
-// Output all test APKs to the distribution folder
def distTask = tasks.findByName('dist')
if (distTask) {
+ // Output all test APKs to the distribution folder
android.testVariants.all { variant ->
// Make the dist task depend on the test variant, so the test APK will be built
distTask.dependsOn variant.assemble
// TODO: remap the different test variants to different file names
}
+
+ // Output the Robolectric test results to host-test-reports/*.zip
+ afterEvaluate {
+ android.unitTestVariants.all { variant ->
+ def task = tasks.findByName('test' + variant.name.capitalize())
+ gradle.taskGraph.whenReady { taskGraph ->
+ task.ignoreFailures = taskGraph.hasTask(distTask)
+ }
+
+ // Create a zip file of the XML test reports and dist it to host-test-reports.
+ // The file path and format should match GradleHostBasedTest class in TradeFed.
+ def junitReport = task.reports.junitXml
+ if (junitReport.enabled) {
+ def zipTask = project.tasks.create("zipResultsOf${task.name.capitalize()}", Zip) {
+ from junitReport.destination
+ archiveName = task.name + 'Result.zip'
+ destinationDir = junitReport.destination.parentFile
+ }
+ tasks.dist.dependsOn zipTask
+ zipTask.mustRunAfter task
+ dist.file zipTask.archivePath.path, "host-test-reports/${zipTask.archiveName}"
+ }
+ }
+ }
}
diff --git a/library/test/instrumentation/src/com/android/setupwizardlib/template/ListMixinTest.java b/library/test/instrumentation/src/com/android/setupwizardlib/template/ListMixinTest.java
index 93201ca..30d68f1 100644
--- a/library/test/instrumentation/src/com/android/setupwizardlib/template/ListMixinTest.java
+++ b/library/test/instrumentation/src/com/android/setupwizardlib/template/ListMixinTest.java
@@ -101,7 +101,7 @@ public class ListMixinTest {
}
@Test
- public void testDividerInset() {
+ public void testDividerInsetLegacy() {
ListMixin mixin = new ListMixin(mTemplateLayout, null, 0);
mixin.setDividerInset(123);
@@ -116,7 +116,23 @@ public class ListMixinTest {
}
@Test
- public void testDividerInsetRtl() {
+ public void testDividerInsets() {
+ ListMixin mixin = new ListMixin(mTemplateLayout, null, 0);
+ mixin.setDividerInsets(123, 456);
+
+ assertEquals(123, mixin.getDividerInsetStart());
+ assertEquals(456, mixin.getDividerInsetEnd());
+
+ final Drawable divider = mListView.getDivider();
+ InsetDrawable insetDrawable = (InsetDrawable) divider;
+ Rect rect = new Rect();
+ insetDrawable.getPadding(rect);
+
+ assertEquals(new Rect(123, 0, 456, 0), rect);
+ }
+
+ @Test
+ public void testDividerInsetLegacyRtl() {
if (VERSION.SDK_INT >= VERSION_CODES.JELLY_BEAN_MR1) {
doReturn(View.LAYOUT_DIRECTION_RTL).when(mTemplateLayout).getLayoutDirection();
@@ -136,6 +152,27 @@ public class ListMixinTest {
}
@Test
+ public void testDividerInsetsRtl() {
+ if (VERSION.SDK_INT >= VERSION_CODES.JELLY_BEAN_MR1) {
+ doReturn(View.LAYOUT_DIRECTION_RTL).when(mTemplateLayout).getLayoutDirection();
+
+ ListMixin mixin = new ListMixin(mTemplateLayout, null, 0);
+ mixin.setDividerInsets(123, 456);
+
+ assertEquals(123, mixin.getDividerInsetStart());
+ assertEquals(456, mixin.getDividerInsetEnd());
+
+ final Drawable divider = mListView.getDivider();
+ InsetDrawable insetDrawable = (InsetDrawable) divider;
+ Rect rect = new Rect();
+ insetDrawable.getPadding(rect);
+
+ assertEquals(new Rect(456, 0, 123, 0), rect);
+ }
+ // else the test passes
+ }
+
+ @Test
public void testNoList() {
doReturn(null).when(mTemplateLayout).findManagedViewById(eq(android.R.id.list));
diff --git a/library/test/instrumentation/src/com/android/setupwizardlib/test/GlifLayoutTest.java b/library/test/instrumentation/src/com/android/setupwizardlib/test/GlifLayoutTest.java
index acb7fbb..e12b31d 100644
--- a/library/test/instrumentation/src/com/android/setupwizardlib/test/GlifLayoutTest.java
+++ b/library/test/instrumentation/src/com/android/setupwizardlib/test/GlifLayoutTest.java
@@ -95,29 +95,29 @@ public class GlifLayoutTest {
}
@Test
- public void testGlifPixelTheme() {
+ public void testGlifV2Theme() {
mContext = new ContextThemeWrapper(InstrumentationRegistry.getContext(),
- R.style.SuwThemeGlifPixel_Light);
+ R.style.SuwThemeGlifV2_Light);
final GlifLayout glifLayout = new GlifLayout(mContext);
final TextView titleView = (TextView) glifLayout.findManagedViewById(R.id.suw_layout_title);
if (VERSION.SDK_INT >= VERSION_CODES.JELLY_BEAN_MR1) {
assertEquals(View.TEXT_ALIGNMENT_GRAVITY, titleView.getTextAlignment());
}
- assertEquals("Title text should be center aligned on GLIF Pixel theme",
+ assertEquals("Title text should be center aligned on GLIF v2 theme",
Gravity.CENTER_HORIZONTAL, titleView.getGravity() & Gravity.CENTER_HORIZONTAL);
if (VERSION.SDK_INT >= VERSION_CODES.N) {
// LinearLayout.getGravity is only available on versions >= N
final View iconView = glifLayout.findManagedViewById(R.id.suw_layout_icon);
final LinearLayout parent = (LinearLayout) iconView.getParent();
- assertEquals("Icon should be center aligned on GLIF Pixel theme",
+ assertEquals("Icon should be center aligned on GLIF v2 theme",
Gravity.CENTER_HORIZONTAL, parent.getGravity() & Gravity.CENTER_HORIZONTAL);
}
- assertEquals("Status bar color should be white in GLIF Pixel theme",
- "fffafafa",
+ assertEquals("Status bar color should be white in GLIF v2 theme",
+ "ffffffff",
Integer.toHexString(glifLayout.getBackgroundBaseColor().getDefaultColor()));
- assertFalse("GLIF Pixel theme shuold not have patterned background",
+ assertFalse("GLIF v2 theme shuold not have patterned background",
glifLayout.isBackgroundPatterned());
if (VERSION.SDK_INT >= VERSION_CODES.M) {
diff --git a/library/test/instrumentation/src/com/android/setupwizardlib/test/GlifListLayoutTest.java b/library/test/instrumentation/src/com/android/setupwizardlib/test/GlifListLayoutTest.java
index 7b70cf7..c2e932c 100644
--- a/library/test/instrumentation/src/com/android/setupwizardlib/test/GlifListLayoutTest.java
+++ b/library/test/instrumentation/src/com/android/setupwizardlib/test/GlifListLayoutTest.java
@@ -105,7 +105,7 @@ public class GlifListLayoutTest {
}
@Test
- public void testDividerInset() {
+ public void testDividerInsetLegacy() {
GlifListLayout layout = new GlifListLayout(mContext);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
layout.setLayoutDirection(View.LAYOUT_DIRECTION_LTR);
@@ -119,6 +119,22 @@ public class GlifListLayoutTest {
assertTrue("Divider should be instance of InsetDrawable", divider instanceof InsetDrawable);
}
+ @Test
+ public void testDividerInsets() {
+ GlifListLayout layout = new GlifListLayout(mContext);
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
+ layout.setLayoutDirection(View.LAYOUT_DIRECTION_LTR);
+ }
+ assertListTemplateInflated(layout);
+
+ layout.setDividerInsets(10, 15);
+ assertEquals("Divider inset should be 10", 10, layout.getDividerInsetStart());
+ assertEquals("Divider inset should be 15", 15, layout.getDividerInsetEnd());
+
+ final Drawable divider = layout.getDivider();
+ assertTrue("Divider should be instance of InsetDrawable", divider instanceof InsetDrawable);
+ }
+
private void assertListTemplateInflated(GlifListLayout layout) {
View title = layout.findViewById(R.id.suw_layout_title);
assertNotNull("@id/suw_layout_title should not be null", title);
diff --git a/library/test/instrumentation/src/com/android/setupwizardlib/test/ItemLayoutTest.java b/library/test/instrumentation/src/com/android/setupwizardlib/test/ItemLayoutTest.java
new file mode 100644
index 0000000..85876b4
--- /dev/null
+++ b/library/test/instrumentation/src/com/android/setupwizardlib/test/ItemLayoutTest.java
@@ -0,0 +1,94 @@
+/*
+ * Copyright (C) 2017 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.setupwizardlib.test;
+
+import static android.support.test.InstrumentationRegistry.getTargetContext;
+
+import static org.junit.Assert.assertNotNull;
+
+import android.content.Context;
+import android.support.test.filters.SmallTest;
+import android.view.ContextThemeWrapper;
+import android.view.LayoutInflater;
+import android.widget.FrameLayout;
+
+import com.android.setupwizardlib.R;
+import com.android.setupwizardlib.items.Item;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameters;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Sanity test for all the item layouts to make sure they won't crash when being inflated in
+ * different themes.
+ */
+@RunWith(Parameterized.class)
+@SmallTest
+public class ItemLayoutTest {
+
+ @Parameters
+ public static Iterable<Object[]> data() {
+ int[] themes = new int[] {
+ R.style.SuwThemeMaterial_Light,
+ R.style.SuwThemeMaterial,
+ R.style.SuwThemeGlif_Light,
+ R.style.SuwThemeGlif,
+ R.style.SuwThemeGlifV2_Light,
+ R.style.SuwThemeGlifV2
+ };
+ int[] layouts = new int[] {
+ R.layout.suw_items_default,
+ R.layout.suw_items_verbose,
+ R.layout.suw_items_description
+ };
+
+ // Test all the possible combinations of themes and layouts.
+ List<Object[]> params = new ArrayList<>();
+ for (int theme : themes) {
+ for (int layout : layouts) {
+ params.add(new Object[] { theme, layout });
+ }
+ }
+ return params;
+ }
+
+ private final Context mContext;
+ private final FrameLayout mParent;
+ private final Item mItem;
+
+ public ItemLayoutTest(int theme, int layout) {
+ mContext = new ContextThemeWrapper(getTargetContext(), theme);
+ mParent = new FrameLayout(mContext);
+ mItem = new Item();
+ mItem.setLayoutResource(layout);
+ }
+
+ @Test
+ public void testInflateLayoutHasBasicViews() {
+ LayoutInflater.from(mContext).inflate(mItem.getLayoutResource(), mParent, true);
+ mItem.onBindView(mParent);
+
+ assertNotNull("Title should exist", mParent.findViewById(R.id.suw_items_title));
+ assertNotNull("Summary should exist", mParent.findViewById(R.id.suw_items_summary));
+ assertNotNull("Icon should exist", mParent.findViewById(R.id.suw_items_icon));
+ }
+}
diff --git a/library/eclair-mr1/test/instrumentation/src/com/android/setupwizardlib/test/RichTextViewTest.java b/library/test/instrumentation/src/com/android/setupwizardlib/test/RichTextViewTest.java
index 2e2b01e..5f3eb9f 100644
--- a/library/eclair-mr1/test/instrumentation/src/com/android/setupwizardlib/test/RichTextViewTest.java
+++ b/library/test/instrumentation/src/com/android/setupwizardlib/test/RichTextViewTest.java
@@ -18,9 +18,16 @@ package com.android.setupwizardlib.test;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertTrue;
+import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
import android.annotation.SuppressLint;
+import android.content.Context;
+import android.content.ContextWrapper;
import android.support.test.InstrumentationRegistry;
import android.support.test.filters.SmallTest;
import android.support.test.runner.AndroidJUnit4;
@@ -30,6 +37,7 @@ import android.text.Spanned;
import android.text.style.TextAppearanceSpan;
import com.android.setupwizardlib.span.LinkSpan;
+import com.android.setupwizardlib.span.LinkSpan.OnLinkClickListener;
import com.android.setupwizardlib.view.RichTextView;
import org.junit.Test;
@@ -64,6 +72,45 @@ public class RichTextViewTest {
}
@Test
+ public void testOnLinkClickListener() {
+ Annotation link = new Annotation("link", "foobar");
+ SpannableStringBuilder ssb = new SpannableStringBuilder("Hello world");
+ ssb.setSpan(link, 1, 2, 0 /* flags */);
+
+ RichTextView textView = new RichTextView(InstrumentationRegistry.getContext());
+ textView.setText(ssb);
+
+ OnLinkClickListener listener = mock(OnLinkClickListener.class);
+ textView.setOnLinkClickListener(listener);
+
+ assertSame(listener, textView.getOnLinkClickListener());
+
+ CharSequence text = textView.getText();
+ LinkSpan[] spans = ((Spanned) text).getSpans(0, text.length(), LinkSpan.class);
+ spans[0].onClick(textView);
+
+ verify(listener).onLinkClick(eq(spans[0]));
+ }
+
+ @Test
+ public void testLegacyContextOnClickListener() {
+ // Click listener implemented by context should still be invoked for compatibility.
+ Annotation link = new Annotation("link", "foobar");
+ SpannableStringBuilder ssb = new SpannableStringBuilder("Hello world");
+ ssb.setSpan(link, 1, 2, 0 /* flags */);
+
+ TestContext context = spy(new TestContext(InstrumentationRegistry.getTargetContext()));
+ RichTextView textView = new RichTextView(context);
+ textView.setText(ssb);
+
+ CharSequence text = textView.getText();
+ LinkSpan[] spans = ((Spanned) text).getSpans(0, text.length(), LinkSpan.class);
+ spans[0].onClick(textView);
+
+ verify(context).onClick(eq(spans[0]));
+ }
+
+ @Test
public void testTextStyle() {
Annotation link = new Annotation("textAppearance", "foobar");
SpannableStringBuilder ssb = new SpannableStringBuilder("Hello world");
@@ -85,7 +132,7 @@ public class RichTextViewTest {
}
@Test
- public void testTextContaininingLinksAreFocusable() {
+ public void testTextContainingLinksAreFocusable() {
Annotation testLink = new Annotation("link", "value");
SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder("Linked");
spannableStringBuilder.setSpan(testLink, 0, 3, 0);
@@ -112,7 +159,7 @@ public class RichTextViewTest {
// should also be automatically changed.
@SuppressLint("SetTextI18n") // It's OK. This is just a test.
@Test
- public void testRichTxtViewFocusChangesWithTextChange() {
+ public void testRichTextViewFocusChangesWithTextChange() {
RichTextView textView = new RichTextView(InstrumentationRegistry.getContext());
textView.setText("Thou shall not be focusable!");
@@ -124,4 +171,16 @@ public class RichTextViewTest {
textView.setText(spannableStringBuilder);
assertTrue(textView.isFocusable());
}
+
+ public static class TestContext extends ContextWrapper implements LinkSpan.OnClickListener {
+
+ public TestContext(Context base) {
+ super(base);
+ }
+
+ @Override
+ public void onClick(LinkSpan span) {
+ // Ignore. Can be verified using Mockito
+ }
+ }
}
diff --git a/library/test/instrumentation/src/com/android/setupwizardlib/test/SetupWizardListLayoutTest.java b/library/test/instrumentation/src/com/android/setupwizardlib/test/SetupWizardListLayoutTest.java
index b33ef31..5c34fe0 100644
--- a/library/test/instrumentation/src/com/android/setupwizardlib/test/SetupWizardListLayoutTest.java
+++ b/library/test/instrumentation/src/com/android/setupwizardlib/test/SetupWizardListLayoutTest.java
@@ -16,11 +16,15 @@
package com.android.setupwizardlib.test;
+import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import android.content.Context;
+import android.graphics.drawable.Drawable;
+import android.graphics.drawable.InsetDrawable;
+import android.os.Build;
import android.support.test.InstrumentationRegistry;
import android.support.test.filters.SmallTest;
import android.support.test.runner.AndroidJUnit4;
@@ -87,6 +91,37 @@ public class SetupWizardListLayoutTest {
progressBar instanceof ProgressBar && progressBar.getVisibility() == View.VISIBLE);
}
+ @Test
+ public void testDividerInsetLegacy() {
+ SetupWizardListLayout layout = new SetupWizardListLayout(mContext);
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
+ layout.setLayoutDirection(View.LAYOUT_DIRECTION_LTR);
+ }
+ assertListTemplateInflated(layout);
+
+ layout.setDividerInset(10);
+ assertEquals("Divider inset should be 10", 10, layout.getDividerInset());
+
+ final Drawable divider = layout.getDivider();
+ assertTrue("Divider should be instance of InsetDrawable", divider instanceof InsetDrawable);
+ }
+
+ @Test
+ public void testDividerInsets() {
+ SetupWizardListLayout layout = new SetupWizardListLayout(mContext);
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
+ layout.setLayoutDirection(View.LAYOUT_DIRECTION_LTR);
+ }
+ assertListTemplateInflated(layout);
+
+ layout.setDividerInsets(10, 15);
+ assertEquals("Divider inset start should be 10", 10, layout.getDividerInsetStart());
+ assertEquals("Divider inset end should be 15", 15, layout.getDividerInsetEnd());
+
+ final Drawable divider = layout.getDivider();
+ assertTrue("Divider should be instance of InsetDrawable", divider instanceof InsetDrawable);
+ }
+
private void assertListTemplateInflated(SetupWizardLayout layout) {
View decorView = layout.findViewById(R.id.suw_layout_decor);
View navbar = layout.findViewById(R.id.suw_layout_navigation_bar);
diff --git a/library/test/robotest/src/com/android/setupwizardlib/span/LinkSpanTest.java b/library/test/robotest/src/com/android/setupwizardlib/span/LinkSpanTest.java
index 7dd0a6f..f86e057 100644
--- a/library/test/robotest/src/com/android/setupwizardlib/span/LinkSpanTest.java
+++ b/library/test/robotest/src/com/android/setupwizardlib/span/LinkSpanTest.java
@@ -56,6 +56,18 @@ public class LinkSpanTest {
// Just check that no uncaught exception here.
}
+ @Test
+ public void testWrappedListener() {
+ final TestContext context = new TestContext(application);
+ final Context wrapperContext = new ContextWrapper(context);
+ final TextView textView = new TextView(wrapperContext);
+ final LinkSpan linkSpan = new LinkSpan("test_id");
+
+
+ linkSpan.onClick(textView);
+ assertSame("Clicked LinkSpan should be passed to setup", linkSpan, context.clickedSpan);
+ }
+
private static class TestContext extends ContextWrapper implements LinkSpan.OnClickListener {
public LinkSpan clickedSpan = null;
diff --git a/library/test/robotest/src/com/android/setupwizardlib/util/WizardManagerHelperTest.java b/library/test/robotest/src/com/android/setupwizardlib/util/WizardManagerHelperTest.java
index d518e08..4c460c8 100644
--- a/library/test/robotest/src/com/android/setupwizardlib/util/WizardManagerHelperTest.java
+++ b/library/test/robotest/src/com/android/setupwizardlib/util/WizardManagerHelperTest.java
@@ -80,6 +80,14 @@ public class WizardManagerHelperTest {
}
@Test
+ public void testIsDeferredSetupTrue() {
+ final Intent intent = new Intent();
+ intent.putExtra("deferredSetup", true);
+ assertTrue("Is deferred setup wizard should be true",
+ WizardManagerHelper.isDeferredSetupWizard(intent));
+ }
+
+ @Test
public void testIsSetupWizardFalse() {
final Intent intent = new Intent();
intent.putExtra("firstRun", false);
@@ -140,22 +148,22 @@ public class WizardManagerHelperTest {
}
@Test
- public void testGlifPixelIsDarkTheme() {
+ public void testGlifV2IsDarkTheme() {
final Intent intent = new Intent();
- intent.putExtra("theme", "glif_pixel");
- assertFalse("Theme glif_pixel should be dark theme",
+ intent.putExtra("theme", "glif_v2");
+ assertFalse("Theme glif_v2 should be dark theme",
WizardManagerHelper.isLightTheme(intent, false));
- assertFalse("Theme glif_pixel should be dark theme",
+ assertFalse("Theme glif_v2 should be dark theme",
WizardManagerHelper.isLightTheme(intent, true));
}
@Test
- public void testGlifPixelLightIsLightTheme() {
+ public void testGlifV2LightIsLightTheme() {
final Intent intent = new Intent();
- intent.putExtra("theme", "glif_pixel_light");
- assertTrue("Theme glif_pixel_light should be light theme",
+ intent.putExtra("theme", "glif_v2_light");
+ assertTrue("Theme glif_v2_light should be light theme",
WizardManagerHelper.isLightTheme(intent, false));
- assertTrue("Theme glif_pixel_light should be light theme",
+ assertTrue("Theme glif_v2_light should be light theme",
WizardManagerHelper.isLightTheme(intent, true));
}
@@ -195,15 +203,15 @@ public class WizardManagerHelperTest {
}
@Test
- public void testGetThemeResGlifPixelLight() {
- assertEquals(R.style.SuwThemeGlifPixel_Light,
- WizardManagerHelper.getThemeRes("glif_pixel_light", 0));
+ public void testGetThemeResGlifV2Light() {
+ assertEquals(R.style.SuwThemeGlifV2_Light,
+ WizardManagerHelper.getThemeRes("glif_v2_light", 0));
}
@Test
- public void testGetThemeResGlifPixel() {
- assertEquals(R.style.SuwThemeGlifPixel,
- WizardManagerHelper.getThemeRes("glif_pixel", 0));
+ public void testGetThemeResGlifV2() {
+ assertEquals(R.style.SuwThemeGlifV2,
+ WizardManagerHelper.getThemeRes("glif_v2", 0));
}
@Test
@@ -257,6 +265,7 @@ public class WizardManagerHelperTest {
.putExtra(WizardManagerHelper.EXTRA_THEME, "test_theme")
.putExtra(WizardManagerHelper.EXTRA_WIZARD_BUNDLE, wizardBundle)
.putExtra(WizardManagerHelper.EXTRA_IS_FIRST_RUN, true)
+ .putExtra(WizardManagerHelper.EXTRA_IS_DEFERRED_SETUP, true)
// Script URI and Action ID are kept for backwards compatibility
.putExtra(WizardManagerHelper.EXTRA_SCRIPT_URI, "test_script_uri")
.putExtra(WizardManagerHelper.EXTRA_ACTION_ID, "test_action_id");
@@ -273,6 +282,8 @@ public class WizardManagerHelperTest {
assertTrue("EXTRA_IS_FIRST_RUN should be copied",
intent.getBooleanExtra(WizardManagerHelper.EXTRA_IS_FIRST_RUN, false));
+ assertTrue("EXTRA_IS_DEFERRED_SETUP should be copied",
+ intent.getBooleanExtra(WizardManagerHelper.EXTRA_IS_DEFERRED_SETUP, false));
// Script URI and Action ID are replaced by Wizard Bundle in M, but are kept for backwards
// compatibility