diff options
-rw-r--r-- | res/drawable-nodpi/grass_tile.jpg | bin | 0 -> 9702 bytes | |||
-rw-r--r-- | res/drawable-nodpi/illustration_wifi.jpg | bin | 0 -> 58441 bytes | |||
-rw-r--r-- | res/drawable/grass.xml | 20 | ||||
-rw-r--r-- | res/layout-land/setup_preference.xml | 63 | ||||
-rw-r--r-- | res/layout/setup_preference.xml | 156 | ||||
-rw-r--r-- | res/layout/setup_wifi_add_network.xml | 32 | ||||
-rw-r--r-- | res/layout/setup_wizard_header.xml | 35 | ||||
-rwxr-xr-x | res/values-sw600dp/dimens.xml | 7 | ||||
-rw-r--r-- | res/values/colors.xml | 1 | ||||
-rwxr-xr-x | res/values/dimens.xml | 15 | ||||
-rw-r--r-- | res/values/strings.xml | 2 | ||||
-rw-r--r-- | res/values/styles.xml | 21 | ||||
-rw-r--r-- | res/values/themes.xml | 14 | ||||
-rw-r--r-- | src/com/android/settings/widget/ProportionalOuterFrame.java | 63 | ||||
-rw-r--r-- | src/com/android/settings/widget/SetupWizardHeader.java | 135 | ||||
-rw-r--r-- | src/com/android/settings/widget/StickyHeaderListView.java | 139 | ||||
-rw-r--r-- | src/com/android/settings/wifi/WifiSettingsForSetupWizard.java | 37 |
17 files changed, 501 insertions, 239 deletions
diff --git a/res/drawable-nodpi/grass_tile.jpg b/res/drawable-nodpi/grass_tile.jpg Binary files differnew file mode 100644 index 0000000..7aef32c --- /dev/null +++ b/res/drawable-nodpi/grass_tile.jpg diff --git a/res/drawable-nodpi/illustration_wifi.jpg b/res/drawable-nodpi/illustration_wifi.jpg Binary files differnew file mode 100644 index 0000000..0c03199 --- /dev/null +++ b/res/drawable-nodpi/illustration_wifi.jpg diff --git a/res/drawable/grass.xml b/res/drawable/grass.xml new file mode 100644 index 0000000..2fb5bd9 --- /dev/null +++ b/res/drawable/grass.xml @@ -0,0 +1,20 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2014 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. +--> + +<bitmap xmlns:android="http://schemas.android.com/apk/res/android" + android:src="@drawable/grass_tile" + android:tileMode="repeat" /> diff --git a/res/layout-land/setup_preference.xml b/res/layout-land/setup_preference.xml new file mode 100644 index 0000000..e79f5c1 --- /dev/null +++ b/res/layout-land/setup_preference.xml @@ -0,0 +1,63 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (c) 2014 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. +--> + +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:id="@+id/fragment" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:orientation="vertical"> + + <FrameLayout + android:id="@+id/title_area" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:background="@drawable/grass"> + + <TextView + android:id="@+id/title" + style="@style/SetupTitle" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:text="@string/wifi_setup_wizard_title" /> + </FrameLayout> + + <TextView + android:id="@+id/wifi_required_info" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginBottom="6dip" + android:textAppearance="?android:attr/textAppearanceMedium" + android:text="@string/wifi_required_info_text" + android:visibility="gone" /> + + <ListView + android:id="@android:id/list" + android:layout_width="match_parent" + android:layout_height="0dp" + android:layout_weight="1" + android:cacheColorHint="@android:color/transparent" + android:clipToPadding="false" + android:drawSelectorOnTop="false" + android:headerDividersEnabled="false" + android:scrollbarAlwaysDrawVerticalTrack="true" /> + + <fragment android:name="com.android.setupwizard.navigationbar.SetupWizardNavBar" + android:id="@+id/navigation_bar" + style="@style/setup_wizard_navbar_style" /> + +</LinearLayout> + diff --git a/res/layout/setup_preference.xml b/res/layout/setup_preference.xml index c5d686f..46829c0 100644 --- a/res/layout/setup_preference.xml +++ b/res/layout/setup_preference.xml @@ -16,142 +16,34 @@ ** limitations under the License. */ --> -<LinearLayout - xmlns:android="http://schemas.android.com/apk/res/android" +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/fragment" - android:orientation="vertical" + android:layout_width="match_parent" android:layout_height="match_parent" - android:layout_width="match_parent"> - <view - class="com.android.settings.widget.ProportionalOuterFrame" + android:orientation="vertical"> + + <TextView + android:id="@+id/wifi_required_info" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginBottom="6dip" + android:textAppearance="?android:attr/textAppearanceMedium" + android:text="@string/wifi_required_info_text" + android:visibility="gone" /> + + <com.android.settings.widget.StickyHeaderListView + android:id="@android:id/list" + android:layout_width="match_parent" + android:layout_height="0dp" android:layout_weight="1" - android:layout_height="match_parent" - android:layout_width="match_parent"> + android:cacheColorHint="@android:color/transparent" + android:clipToPadding="false" + android:drawSelectorOnTop="false" + android:headerDividersEnabled="false" + android:scrollbarAlwaysDrawVerticalTrack="true" /> - <RelativeLayout - android:id="@+id/title_area" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_alignParentTop="true" - android:gravity="bottom"> - - <LinearLayout - android:id="@+id/title_bar" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:gravity="bottom" - android:orientation="horizontal"> - <TextView - android:id="@+id/title" - android:layout_width="0dip" - android:layout_height="wrap_content" - android:layout_weight="1.0" - style="@style/SetupTitle" - android:text="@string/wifi_setup_wizard_title" - android:gravity="bottom" /> - - <ImageButton - android:id="@+id/more" - android:layout_width="@dimen/setup_button_size" - android:layout_height="@dimen/setup_button_size" - android:layout_marginStart="8dip" - android:layout_marginEnd="8dip" - android:layout_marginBottom="8dip" - android:src="?attr/ic_menu_moreoverflow" - android:background="?android:attr/actionBarItemBackground" - android:contentDescription="@string/wifi_menu_more_options" /> - - </LinearLayout> - - <!-- Divider --> - <View - android:id="@+id/top_divider" - style="@style/TopDivider" - android:layout_below="@id/title_bar" /> - - </RelativeLayout> - - <LinearLayout - android:layout_width="match_parent" - android:layout_height="match_parent" - android:layout_below="@id/title_area" - android:background="@android:color/transparent" - android:orientation="vertical" > - - <TextView - android:id="@+id/wifi_required_info" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_marginBottom="6dip" - android:textAppearance="?android:attr/textAppearanceMedium" - android:text="@string/wifi_required_info_text" - android:visibility="gone" /> - - <ListView - android:id="@android:id/list" - android:layout_width="match_parent" - android:layout_height="0px" - android:layout_weight="1" - android:cacheColorHint="@android:color/transparent" - android:clipToPadding="false" - android:drawSelectorOnTop="false" - android:paddingTop="0dip" - android:scrollbarAlwaysDrawVerticalTrack="true" /> - - <TextView - android:id="@android:id/empty" - android:layout_width="match_parent" - android:layout_height="0px" - android:layout_weight="1" - android:gravity="center" - android:visibility="gone" /> - - <ImageView - android:id="@+id/divider" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_marginTop="@dimen/setup_item_margin" - android:background="@*android:drawable/list_divider_holo_dark" /> - - <LinearLayout - android:id="@+id/other_network" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_marginBottom="@dimen/setup_item_margin" - android:background="?android:attr/selectableItemBackground" - android:gravity="center_vertical" - android:minHeight="?android:attr/listPreferredItemHeight" - android:paddingEnd="?android:attr/scrollbarSize" > - - <ImageView - android:id="@+id/add_icon" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_gravity="center" - android:src="?attr/ic_menu_add" /> - - <TextView - android:id="@+id/other" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_marginBottom="6dip" - android:layout_marginStart="15dip" - android:layout_marginEnd="6dip" - android:layout_marginTop="6dip" - android:layout_weight="1" - android:ellipsize="marquee" - android:fadingEdge="horizontal" - android:singleLine="true" - android:textAppearance="?android:attr/textAppearanceMedium" - android:text="@string/wifi_other_network" /> - - </LinearLayout> - - </LinearLayout> - </view> <fragment android:name="com.android.setupwizard.navigationbar.SetupWizardNavBar" android:id="@+id/navigation_bar" - style="@style/setup_wizard_navbar_style" - android:layout_weight="0" - /> + style="@style/setup_wizard_navbar_style" /> + </LinearLayout> diff --git a/res/layout/setup_wifi_add_network.xml b/res/layout/setup_wifi_add_network.xml new file mode 100644 index 0000000..c62f983 --- /dev/null +++ b/res/layout/setup_wifi_add_network.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2014 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. +--> + +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:id="@+id/other_network" + android:layout_width="match_parent" + android:layout_height="@dimen/setup_add_network_item_height" + android:background="?android:attr/selectableItemBackground" + android:paddingEnd="?android:attr/listPreferredItemPaddingEnd" + android:paddingStart="?android:attr/listPreferredItemPaddingStart" > + + <TextView + style="@style/SetupAddWifiNetwork" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:text="@string/wifi_other_network" /> + +</LinearLayout> diff --git a/res/layout/setup_wizard_header.xml b/res/layout/setup_wizard_header.xml new file mode 100644 index 0000000..e2e2b0e --- /dev/null +++ b/res/layout/setup_wizard_header.xml @@ -0,0 +1,35 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2014 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. +--> + +<com.android.settings.widget.SetupWizardHeader + xmlns:android="http://schemas.android.com/apk/res/android" + android:id="@+id/title_area" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:background="@drawable/grass" + android:foreground="@drawable/illustration_wifi" + android:tag="stickyContainer"> + + <TextView + android:id="@+id/title" + style="@style/SetupTitle" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:tag="sticky" + android:text="@string/wifi_setup_wizard_title"/> + +</com.android.settings.widget.SetupWizardHeader> diff --git a/res/values-sw600dp/dimens.xml b/res/values-sw600dp/dimens.xml index ffd6ac0..d35d973 100755 --- a/res/values-sw600dp/dimens.xml +++ b/res/values-sw600dp/dimens.xml @@ -24,12 +24,7 @@ <dimen name="content_margin_left">16dip</dimen> <dimen name="description_margin_top">26dip</dimen> <dimen name="crypt_clock_size">120sp</dimen> - <dimen name="setup_title_size">60dp</dimen> - <item type="dimen" name="setup_title_height">20%</item> - <item type="dimen" name="setup_border_width">10%</item> - <dimen name="setup_margin_bottom">0dip</dimen> - <dimen name="setup_button_size">48dip</dimen> - <dimen name="setup_item_margin">32dip</dimen> + <dimen name="setup_title_size">24sp</dimen> <dimen name="appwidget_min_width">325dip</dimen> <dimen name="appwidget_min_height">50dip</dimen> diff --git a/res/values/colors.xml b/res/values/colors.xml index ed1b3d3..0b3ea39 100644 --- a/res/values/colors.xml +++ b/res/values/colors.xml @@ -39,6 +39,7 @@ <color name="title_color">@android:color/holo_blue_light</color> <color name="setup_divider_color_dark">#33ffffff</color> <color name="setup_divider_color_light">#33000000</color> + <color name="setup_add_wifi_network_text_color">#ff009587</color> <color name="circle_avatar_frame_color">#ffffffff</color> <color name="circle_avatar_frame_shadow_color">#80000000</color> diff --git a/res/values/dimens.xml b/res/values/dimens.xml index 992e57f..969f575 100755 --- a/res/values/dimens.xml +++ b/res/values/dimens.xml @@ -38,12 +38,17 @@ <dimen name="crypt_clock_size">100sp</dimen> - <item type="dimen" name="setup_title_height">15%</item> - <item type="dimen" name="setup_border_width">5%</item> <dimen name="setup_margin_bottom">0dip</dimen> - <dimen name="setup_title_size">25dp</dimen> - <dimen name="setup_button_size">32dip</dimen> - <dimen name="setup_item_margin">16dip</dimen> + <dimen name="setup_title_size">24sp</dimen> + <dimen name="setup_title_margin_bottom">16dp</dimen> + <!-- This is the extra spacing required to make the leading exactly 32sp --> + <dimen name="setup_title_line_spacing_extra">3.67sp</dimen> + <dimen name="setup_title_padding_bottom">2dp</dimen> + <dimen name="setup_title_padding_top">16dp</dimen> + <!-- Size of padding to give in the wifi list when there is no icon --> + <dimen name="setup_list_no_icon_padding">56dp</dimen> + <dimen name="setup_add_network_item_height">56dp</dimen> + <dimen name="setup_wizard_margin_sides">40dp</dimen> <dimen name="divider_height">3dip</dimen> <dimen name="divider_margin_top">6dip</dimen> diff --git a/res/values/strings.xml b/res/values/strings.xml index bf975e2..d4ee72f 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -1372,7 +1372,7 @@ <!-- Wifi Settings. text displayed when user has restriction DISALLOW_CONFIG_WIFI [CHAR LIMIT=NONE]--> <string name="wifi_empty_list_user_restricted">You don\'t have permission to change the Wi\u2011Fi network.</string> <!-- Wi-Fi settings. title for setup other network button [CHAR LIMIT=35]--> - <string name="wifi_other_network">Other network\u2026</string> + <string name="wifi_other_network">Add another network</string> <!-- Wi-Fi settings. content description for more button [CHAR LIMIT=50]--> <string name="wifi_more">More</string> <!-- Wi-Fi settings. wps menu title [CHAR LIMIT=25]--> diff --git a/res/values/styles.xml b/res/values/styles.xml index 0f7e652..cea615e 100644 --- a/res/values/styles.xml +++ b/res/values/styles.xml @@ -152,11 +152,26 @@ </style> <style name="SetupTitle"> - <item name="android:fontFamily">sans-serif-light</item> - <item name="android:textSize">@dimen/setup_title_size</item> - <item name="android:textColor">@color/title_color</item> + <item name="android:layout_marginBottom">@dimen/setup_title_margin_bottom</item> + <item name="android:layout_marginEnd">@dimen/setup_wizard_margin_sides</item> + <item name="android:layout_marginStart">@dimen/setup_wizard_margin_sides</item> <item name="android:clickable">false</item> + <item name="android:fontFamily">sans-serif</item> + <item name="android:lineSpacingExtra">@dimen/setup_title_line_spacing_extra</item> <item name="android:longClickable">false</item> + <item name="android:textColor">@android:color/white</item> + <item name="android:textSize">@dimen/setup_title_size</item> + <item name="android:paddingBottom">@dimen/setup_title_padding_bottom</item> + <item name="android:paddingTop">@dimen/setup_title_padding_top</item> + </style> + + <style name="SetupAddWifiNetwork"> + <item name="android:fontFamily">sans-serif-medium</item> + <item name="android:gravity">start|center_vertical</item> + <item name="android:paddingStart">@dimen/setup_list_no_icon_padding</item> + <item name="android:textAllCaps">true</item> + <item name="android:textAppearance">@android:style/TextAppearance.Small</item> + <item name="android:textColor">@color/setup_add_wifi_network_text_color</item> </style> <style name="wifi_item"> diff --git a/res/values/themes.xml b/res/values/themes.xml index 3583f84..4e80612 100644 --- a/res/values/themes.xml +++ b/res/values/themes.xml @@ -22,29 +22,35 @@ <attr name="wifi_signal" format="reference" /> <style name="SetupWizardWifiTheme" parent="android:Theme.Material.NoActionBar"> + <item name="android:alertDialogTheme">@style/Theme.WifiDialog</item> + <item name="android:listPreferredItemPaddingEnd">@dimen/setup_wizard_margin_sides</item> + <item name="android:listPreferredItemPaddingStart">@dimen/setup_wizard_margin_sides</item> + <item name="android:windowBackground">?android:attr/colorBackground</item> <item name="android:windowSoftInputMode">adjustPan</item> <item name="@*android:preferencePanelStyle">@*android:style/PreferencePanel.Dialog</item> - <item name="android:alertDialogTheme">@style/Theme.WifiDialog</item> <item name="ic_menu_add">@drawable/ic_menu_add_dark</item> <item name="ic_menu_moreoverflow">@*android:drawable/ic_menu_moreoverflow_material</item> <item name="ic_wps">@drawable/ic_wps_dark</item> <item name="setup_divider_color">@color/setup_divider_color_dark</item> - <item name="wifi_signal">@drawable/wifi_signal_dark</item> <item name="switchBarMarginStart">0dip</item> <item name="switchBarMarginEnd">0dip</item> + <item name="wifi_signal">@drawable/wifi_signal_dark</item> </style> <style name="SetupWizardWifiTheme.Light" parent="android:Theme.Material.Light.NoActionBar"> + <item name="android:alertDialogTheme">@style/Theme.Light.WifiDialog</item> + <item name="android:listPreferredItemPaddingEnd">@dimen/setup_wizard_margin_sides</item> + <item name="android:listPreferredItemPaddingStart">@dimen/setup_wizard_margin_sides</item> + <item name="android:windowBackground">?android:attr/colorBackground</item> <item name="android:windowSoftInputMode">adjustPan</item> <item name="@*android:preferencePanelStyle">@*android:style/PreferencePanel.Dialog</item> - <item name="android:alertDialogTheme">@style/Theme.Light.WifiDialog</item> <item name="ic_menu_add">@drawable/ic_menu_add_light</item> <item name="ic_menu_moreoverflow">@*android:drawable/ic_menu_moreoverflow_material</item> <item name="ic_wps">@drawable/ic_wps_light</item> <item name="setup_divider_color">@color/setup_divider_color_light</item> - <item name="wifi_signal">@drawable/wifi_signal_light</item> <item name="switchBarMarginStart">0dip</item> <item name="switchBarMarginEnd">0dip</item> + <item name="wifi_signal">@drawable/wifi_signal_light</item> </style> <style name="Theme.WifiDialog" parent="@*android:style/Theme.Material.Dialog.Alert"> diff --git a/src/com/android/settings/widget/ProportionalOuterFrame.java b/src/com/android/settings/widget/ProportionalOuterFrame.java deleted file mode 100644 index d23d2c4..0000000 --- a/src/com/android/settings/widget/ProportionalOuterFrame.java +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright (C) 2011 Google Inc. - * - * 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.settings.widget; - -import android.content.Context; -import android.content.res.Resources; -import android.util.AttributeSet; -import android.view.View; -import android.widget.RelativeLayout; - -import com.android.settings.R; - -/** - * Used as the outer frame of all setup wizard pages that need to adjust their margins based - * on the total size of the available display. (e.g. side margins set to 10% of total width.) - */ -public class ProportionalOuterFrame extends RelativeLayout { - public ProportionalOuterFrame(Context context) { - super(context); - } - - public ProportionalOuterFrame(Context context, AttributeSet attrs) { - super(context, attrs); - } - - public ProportionalOuterFrame(Context context, AttributeSet attrs, int defStyle) { - super(context, attrs, defStyle); - } - - /** - * Set our margins and title area height proportionally to the available display size - */ - @Override - protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { - final int parentWidth = MeasureSpec.getSize(widthMeasureSpec); - final int parentHeight = MeasureSpec.getSize(heightMeasureSpec); - final Resources res = getContext().getResources(); - final float titleHeight = res.getFraction(R.dimen.setup_title_height, 1, 1); - final float sideMargin = res.getFraction(R.dimen.setup_border_width, 1, 1); - final int bottom = res.getDimensionPixelSize(R.dimen.setup_margin_bottom); - setPaddingRelative((int) (parentWidth * sideMargin), 0, - (int) (parentWidth * sideMargin), bottom); - final View title = findViewById(R.id.title_area); - if (title != null) { - title.setMinimumHeight((int) (parentHeight * titleHeight)); - } - super.onMeasure(widthMeasureSpec, heightMeasureSpec); - } -} diff --git a/src/com/android/settings/widget/SetupWizardHeader.java b/src/com/android/settings/widget/SetupWizardHeader.java new file mode 100644 index 0000000..43c8676 --- /dev/null +++ b/src/com/android/settings/widget/SetupWizardHeader.java @@ -0,0 +1,135 @@ +/* + * Copyright (C) 2014 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.settings.widget; + +import android.content.Context; +import android.content.res.TypedArray; +import android.graphics.Canvas; +import android.graphics.drawable.Drawable; +import android.util.AttributeSet; +import android.widget.FrameLayout; + +/* + * Copied from com.google.android.setupwizard.util.SetupWizardHeader + */ +public class SetupWizardHeader extends FrameLayout { + + // Size the baseline grid in pixels + private float mBaselineGridSize; + private Drawable mBackground; + private Drawable mForeground; + private int mForegroundHeight; + private float mScale = 1.0f; + + public SetupWizardHeader(Context context) { + super(context); + init(); + } + + public SetupWizardHeader(Context context, AttributeSet attrs) { + super(context, attrs); + initFromAttributes(context, attrs); + } + + public SetupWizardHeader(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + initFromAttributes(context, attrs); + } + + public SetupWizardHeader(Context context, AttributeSet attrs, int defStyleAttr, + int defStyleRes) { + super(context, attrs, defStyleAttr, defStyleRes); + initFromAttributes(context, attrs); + } + + private void initFromAttributes(Context context, AttributeSet attrs) { + TypedArray a = context.obtainStyledAttributes(attrs, + new int[] { android.R.attr.foreground }); + setForeground(a.getDrawable(0)); + init(); + } + + protected void init() { + // Number of pixels of the 8dp baseline grid as defined in material design specs + mBaselineGridSize = getResources().getDisplayMetrics().density * 8; + setWillNotDraw(false); + } + + /** + * The background will be drawn to fill up the rest of the view. It will also be scaled by the + * same amount as the foreground so their textures look the same. + */ + @Override + public void setBackground(Drawable background) { + mBackground = background; + } + + /** + * Sets the drawable used as the illustration. THe drawable is expected to have intrinsic + * width and height defined and will be scaled to fit the width of the view. + */ + public void setForeground(Drawable foreground) { + mForeground = foreground; + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + int illustrationHeight = MeasureSpec.getSize(widthMeasureSpec) / 2; + illustrationHeight -= illustrationHeight % mBaselineGridSize; + setPadding(0, illustrationHeight, 0, 0); + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + } + + @Override + protected void onLayout(boolean changed, int left, int top, int right, int bottom) { + final int layoutWidth = right - left; + final int layoutHeight = bottom - top; + if (mForeground != null) { + // Scale the foreground to fill the width of the view + mScale = layoutWidth / (float) mForeground.getIntrinsicWidth(); + mForegroundHeight = (int) (mForeground.getIntrinsicHeight() * mScale); + mForeground.setBounds(0, 0, layoutWidth, mForegroundHeight); + } + if (mBackground != null) { + // Scale the bounds by mScale to compensate for the scale done to the canvas before + // drawing. + mBackground.setBounds(0, 0, (int) (layoutWidth / mScale), + (int) ((layoutHeight - mForegroundHeight) / mScale)); + } + super.onLayout(changed, left, top, right, bottom); + } + + @Override + public void onDraw(Canvas canvas) { + if (mBackground != null) { + // Draw the background filling parts not covered by the illustration + int saveCount = canvas.save(); + canvas.translate(0, mForegroundHeight); + // Scale the background so its size matches the foreground + canvas.scale(mScale, mScale, 0, 0); + mBackground.draw(canvas); + canvas.restoreToCount(saveCount); + } + if (mForeground != null) { + // Draw the illustration + mForeground.draw(canvas); + } + super.onDraw(canvas); + } +} + diff --git a/src/com/android/settings/widget/StickyHeaderListView.java b/src/com/android/settings/widget/StickyHeaderListView.java new file mode 100644 index 0000000..f95f8f3 --- /dev/null +++ b/src/com/android/settings/widget/StickyHeaderListView.java @@ -0,0 +1,139 @@ +/* + * Copyright (C) 2014 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.settings.widget; + +import android.content.Context; +import android.graphics.Canvas; +import android.graphics.RectF; +import android.util.AttributeSet; +import android.util.Log; +import android.view.MotionEvent; +import android.view.View; +import android.view.WindowInsets; +import android.widget.ListView; + +/** + * This class provides sticky header functionality in a list view, to use with SetupWizardHeader. + * To use this, add a header tagged with "sticky", or a header tagged with "stickyContainer" and + * one of its child tagged as "sticky". The sticky container will be draw when the sticky element + * hits the top of the view. + * + * There are a few things to note: + * 1. The two supported scenarios are StickyHeaderListView -> Header (stickyContainer) -> sticky, + * and StickyHeaderListView -> Header (sticky). The arrow (->) represents parent/child + * relationship and must be immediate child. + * 2. The view does not work well with padding. b/16190933 + * 3. If fitsSystemWindows is true, then this will offset the sticking position by the height of + * the system decorations at the top of the screen. + * + * @see com.google.android.setupwizard.util.SetupWizardHeader + * @see com.google.android.setupwizard.util.StickyHeaderScrollView + * + * Copied from com.google.android.setupwizard.util.StickyHeaderListView + */ +public class StickyHeaderListView extends ListView { + + private View mSticky; + private View mStickyContainer; + private boolean mDrawScrollBar; + private int mStatusBarInset = 0; + private RectF mStickyRect = new RectF(); + + public StickyHeaderListView(Context context) { + super(context); + } + + public StickyHeaderListView(Context context, AttributeSet attrs) { + super(context, attrs); + } + + public StickyHeaderListView(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + } + + public StickyHeaderListView(Context context, AttributeSet attrs, int defStyleAttr, + int defStyleRes) { + super(context, attrs, defStyleAttr, defStyleRes); + } + + @Override + protected void onLayout(boolean changed, int l, int t, int r, int b) { + super.onLayout(changed, l, t, r, b); + if (mSticky == null) { + updateStickyView(); + } + } + + public void updateStickyView() { + mSticky = findViewWithTag("sticky"); + mStickyContainer = findViewWithTag("stickyContainer"); + } + + @Override + public boolean dispatchTouchEvent(MotionEvent ev) { + if (mStickyRect.contains(ev.getX(), ev.getY())) { + ev.offsetLocation(-mStickyRect.left, -mStickyRect.top); + return mStickyContainer.dispatchTouchEvent(ev); + } else { + return super.dispatchTouchEvent(ev); + } + } + + @Override + public void draw(Canvas canvas) { + mDrawScrollBar = false; + super.draw(canvas); + if (mSticky != null) { + final int saveCount = canvas.save(); + // The view to draw when sticking to the top + final View drawTarget = mStickyContainer != null ? mStickyContainer : mSticky; + // The offset to draw the view at when sticky + final int drawOffset = mStickyContainer != null ? mSticky.getTop() : 0; + // Position of the draw target, relative to the outside of the scrollView + final int drawTop = drawTarget.getTop(); + if (drawTop + drawOffset < mStatusBarInset || !drawTarget.isShown()) { + // ListView does not translate the canvas, so we can simply draw at the top + canvas.translate(0, -drawOffset + mStatusBarInset); + canvas.clipRect(0, 0, drawTarget.getWidth(), drawTarget.getHeight()); + drawTarget.draw(canvas); + mStickyRect.set(0, -drawOffset + mStatusBarInset, drawTarget.getWidth(), + drawTarget.getHeight() - drawOffset + mStatusBarInset); + } else { + mStickyRect.setEmpty(); + } + canvas.restoreToCount(saveCount); + } + // Draw the scrollbars last so they are on top of the header + mDrawScrollBar = true; + onDrawScrollBars(canvas); + } + + @Override + protected boolean isVerticalScrollBarHidden() { + return super.isVerticalScrollBarHidden() || !mDrawScrollBar; + } + + @Override + public WindowInsets onApplyWindowInsets(WindowInsets insets) { + if (getFitsSystemWindows()) { + mStatusBarInset = insets.getSystemWindowInsetTop(); + insets.consumeSystemWindowInsets(false, true, false, false); + } + return insets; + } +} diff --git a/src/com/android/settings/wifi/WifiSettingsForSetupWizard.java b/src/com/android/settings/wifi/WifiSettingsForSetupWizard.java index b64e781..888396d 100644 --- a/src/com/android/settings/wifi/WifiSettingsForSetupWizard.java +++ b/src/com/android/settings/wifi/WifiSettingsForSetupWizard.java @@ -34,8 +34,10 @@ import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.ImageButton; +import android.widget.ListView; import android.widget.PopupMenu; import android.widget.PopupMenu.OnMenuItemClickListener; +import android.widget.TextView; import com.android.settings.R; @@ -88,7 +90,16 @@ public class WifiSettingsForSetupWizard extends WifiSettings { Bundle savedInstanceState) { final View view = inflater.inflate(R.layout.setup_preference, container, false); - final View other = view.findViewById(R.id.other_network); + + final ListView list = (ListView) view.findViewById(android.R.id.list); + final View title = view.findViewById(R.id.title); + if (title == null) { + final View header = inflater.inflate(R.layout.setup_wizard_header, list, false); + list.addHeaderView(header); + } + + final View other = inflater.inflate(R.layout.setup_wifi_add_network, list, false); + list.addFooterView(other, null, true); other.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { @@ -97,29 +108,6 @@ public class WifiSettingsForSetupWizard extends WifiSettings { } } }); - final ImageButton b = (ImageButton) view.findViewById(R.id.more); - if (b != null) { - b.setOnClickListener(new OnClickListener() { - @Override - public void onClick(View v) { - if (mWifiManager.isWifiEnabled()) { - PopupMenu pm = new PopupMenu(inflater.getContext(), b); - pm.inflate(R.menu.wifi_setup); - pm.setOnMenuItemClickListener(new OnMenuItemClickListener() { - @Override - public boolean onMenuItemClick(MenuItem item) { - if (R.id.wifi_wps == item.getItemId()) { - showDialog(WPS_PBC_DIALOG_ID); - return true; - } - return false; - } - }); - pm.show(); - } - } - }); - } final Intent intent = getActivity().getIntent(); if (intent.getBooleanExtra(EXTRA_SHOW_WIFI_REQUIRED_INFO, false)) { @@ -206,5 +194,4 @@ public class WifiSettingsForSetupWizard extends WifiSettings { .setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS); ta.recycle(); } - } |