summaryrefslogtreecommitdiffstats
path: root/src/com/android/settings/widget
diff options
context:
space:
mode:
authorMaurice Lam <yukl@google.com>2014-06-27 19:40:20 -0700
committerMaurice Lam <yukl@google.com>2014-07-09 19:33:28 -0700
commit588e61aa055eff73c968e2b8f45b6848bd8f7766 (patch)
tree1b19e62b67e042f38168e817c21f96aabbc5c79e /src/com/android/settings/widget
parente2403822ec3ba058950280209b1bd106b9d45b82 (diff)
downloadpackages_apps_Settings-588e61aa055eff73c968e2b8f45b6848bd8f7766.zip
packages_apps_Settings-588e61aa055eff73c968e2b8f45b6848bd8f7766.tar.gz
packages_apps_Settings-588e61aa055eff73c968e2b8f45b6848bd8f7766.tar.bz2
[WifiSetup] L layout update
Changed the layout based on the new design mocks. Copied over StickyHeaderListView and SetupWizardHeader. Currently using the generic illustration but will update to Wifi setup specific version once we get them. Change-Id: I22bdef8c9860d419be55938e1e4a6a682db5b7e8
Diffstat (limited to 'src/com/android/settings/widget')
-rw-r--r--src/com/android/settings/widget/ProportionalOuterFrame.java63
-rw-r--r--src/com/android/settings/widget/SetupWizardHeader.java135
-rw-r--r--src/com/android/settings/widget/StickyHeaderListView.java139
3 files changed, 274 insertions, 63 deletions
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;
+ }
+}