Merge "fix quick control rendering" into honeycomb-mr1
diff --git a/res/drawable-mdpi/pie_bg_selected.png b/res/drawable-mdpi/pie_bg_selected.png
deleted file mode 100644
index 787984a..0000000
--- a/res/drawable-mdpi/pie_bg_selected.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/qc_background_normal.png b/res/drawable-mdpi/qc_background_normal.png
index 947722d..b9a16d1 100644
--- a/res/drawable-mdpi/qc_background_normal.png
+++ b/res/drawable-mdpi/qc_background_normal.png
Binary files differ
diff --git a/res/drawable-mdpi/qc_background_selected.png b/res/drawable-mdpi/qc_background_selected.png
deleted file mode 100644
index c0a6efc..0000000
--- a/res/drawable-mdpi/qc_background_selected.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable/item_background_holo_dark.xm b/res/drawable/item_background_holo_dark.xm
deleted file mode 100644
index d5fa3c0..0000000
--- a/res/drawable/item_background_holo_dark.xm
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2011 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.
--->
-
-<selector
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:exitFadeDuration="@android:integer/config_mediumAnimTime">
-    <item
-        android:state_window_focused="false"
-        android:drawable="@color/transparent" />
-    <!--
-        Even though these two point to the same resource, have two states so the
-        drawable will invalidate itself when coming out of pressed state.
-    -->
-    <item
-        android:state_focused="true"
-        android:state_enabled="false"
-        android:state_pressed="true"
-        android:drawable="@drawable/list_selector_disabled_holo_dark" />
-    <item
-        android:state_focused="true"
-        android:state_enabled="false"
-        android:drawable="@drawable/list_selector_disabled_holo_dark" />
-    <item
-        android:state_focused="true"
-        android:state_pressed="true"
-        android:drawable="@drawable/list_selector_background_transition_holo_dark" />
-    <item
-        android:state_focused="false"
-        android:state_pressed="true"
-        android:drawable="@drawable/list_selector_background_transition_holo_dark" />
-    <item
-        android:state_focused="true"
-        android:drawable="@drawable/list_focused_holo" />
-    <item
-        android:drawable="@color/transparent" />
-</selector>
\ No newline at end of file
diff --git a/res/drawable/qc_item_selector.xml b/res/drawable/qc_item_selector.xml
deleted file mode 100644
index 77f8023..0000000
--- a/res/drawable/qc_item_selector.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2010 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.
--->
-
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
-    <item android:state_selected="true"
-        android:drawable="@drawable/pie_bg_selected" />
-    <item android:state_selected="false" android:drawable="@drawable/clear" />
-</selector>
diff --git a/res/values/colors.xml b/res/values/colors.xml
index 73daa07..6a7c578 100644
--- a/res/values/colors.xml
+++ b/res/values/colors.xml
@@ -34,4 +34,6 @@
     <color name="tabFaviconBackground">#FF555555</color>
     <color name="tabFocusHighlight">#FF99CC00</color>
     <color name="qcMenuBackground">#C0000000</color>
+    <color name="qc_normal">#C02447B2</color>
+    <color name="qc_selected">#D0102052</color>
 </resources>
diff --git a/res/values/dimensions.xml b/res/values/dimensions.xml
index e92828e..99eb43e 100644
--- a/res/values/dimensions.xml
+++ b/res/values/dimensions.xml
@@ -31,8 +31,9 @@
     <dimen name="favicon_size">16dip</dimen>
     <dimen name="favicon_padded_size">20dip</dimen>
     <dimen name="qc_radius_start">50dip</dimen>
-    <dimen name="qc_radius_increment">60dip</dimen>
+    <dimen name="qc_radius_increment">70dip</dimen>
     <dimen name="qc_slop">15dip</dimen>
+    <dimen name="qc_touch_offset">15dip</dimen>
     <dimen name="qc_tab_title_height">30dip</dimen>
     <dimen name="qc_thumb_width">240dip</dimen>
     <dimen name="qc_thumb_height">160dip</dimen>
diff --git a/src/com/android/browser/PieControl.java b/src/com/android/browser/PieControl.java
index ed3e960..38ed1bb 100644
--- a/src/com/android/browser/PieControl.java
+++ b/src/com/android/browser/PieControl.java
@@ -26,8 +26,6 @@
 import android.app.Activity;
 import android.content.Context;
 import android.graphics.Bitmap;
-import android.graphics.drawable.BitmapDrawable;
-import android.os.Handler;
 import android.view.LayoutInflater;
 import android.view.Menu;
 import android.view.MenuItem;
@@ -165,7 +163,6 @@
         image.setScaleType(ScaleType.CENTER);
         LayoutParams lp = new LayoutParams(mItemSize, mItemSize);
         v.setLayoutParams(lp);
-        v.setBackgroundResource(R.drawable.qc_item_selector);
         return v;
     }
 
@@ -175,9 +172,8 @@
         view.setMinimumWidth(mItemSize);
         view.setMinimumHeight(mItemSize);
         view.setScaleType(ScaleType.CENTER);
-        LayoutParams lp = new LayoutParams(mItemSize,mItemSize);
+        LayoutParams lp = new LayoutParams(mItemSize, mItemSize);
         view.setLayoutParams(lp);
-        view.setBackgroundResource(R.drawable.qc_item_selector);
         return new PieItem(view, l);
     }
 
diff --git a/src/com/android/browser/view/BasePieView.java b/src/com/android/browser/view/BasePieView.java
index 2120215..ec02e3a 100644
--- a/src/com/android/browser/view/BasePieView.java
+++ b/src/com/android/browser/view/BasePieView.java
@@ -109,7 +109,7 @@
      * needs to set top, left, width, height
      */
     @Override
-    public void layout(int anchorX, int anchorY, boolean left) {
+    public void layout(int anchorX, int anchorY, boolean left, float angle) {
         if (mListener != null) {
             mListener.onLayout(anchorX, anchorY, left);
         }
diff --git a/src/com/android/browser/view/PieItem.java b/src/com/android/browser/view/PieItem.java
index 84a6ac0..3674447 100644
--- a/src/com/android/browser/view/PieItem.java
+++ b/src/com/android/browser/view/PieItem.java
@@ -18,6 +18,7 @@
 
 import com.android.browser.view.PieMenu.PieView;
 
+import android.graphics.Path;
 import android.view.View;
 
 /**
@@ -33,6 +34,7 @@
     private int inner;
     private int outer;
     private boolean mSelected;
+    private Path mPath;
 
     public PieItem(View view, int level) {
         mView = view;
@@ -60,11 +62,12 @@
         return level;
     }
 
-    public void setGeometry(float st, float sw, int inside, int outside) {
+    public void setGeometry(float st, float sw, int inside, int outside, Path p) {
         start = st;
         sweep = sw;
         inner = inside;
         outer = outside;
+        mPath = p;
     }
 
     public float getStartAngle() {
@@ -99,4 +102,8 @@
         return mPieView;
     }
 
+    public Path getPath() {
+        return mPath;
+    }
+
 }
diff --git a/src/com/android/browser/view/PieListView.java b/src/com/android/browser/view/PieListView.java
index 8cd8a4e..04b512b 100644
--- a/src/com/android/browser/view/PieListView.java
+++ b/src/com/android/browser/view/PieListView.java
@@ -39,8 +39,8 @@
      * this will be called before the first draw call
      */
     @Override
-    public void layout(int anchorX, int anchorY, boolean left) {
-        super.layout(anchorX, anchorY, left);
+    public void layout(int anchorX, int anchorY, boolean left, float angle) {
+        super.layout(anchorX, anchorY, left, angle);
         buildViews();
         mWidth = mChildWidth;
         mHeight = mChildHeight * mAdapter.getCount();
diff --git a/src/com/android/browser/view/PieMenu.java b/src/com/android/browser/view/PieMenu.java
index e494d19..cded435 100644
--- a/src/com/android/browser/view/PieMenu.java
+++ b/src/com/android/browser/view/PieMenu.java
@@ -21,8 +21,11 @@
 import android.content.Context;
 import android.content.res.Resources;
 import android.graphics.Canvas;
+import android.graphics.Paint;
+import android.graphics.Path;
 import android.graphics.Point;
 import android.graphics.PointF;
+import android.graphics.RectF;
 import android.graphics.drawable.Drawable;
 import android.util.AttributeSet;
 import android.view.MotionEvent;
@@ -57,7 +60,7 @@
 
         public void setLayoutListener(OnLayoutListener l);
 
-        public void layout(int anchorX, int anchorY, boolean onleft);
+        public void layout(int anchorX, int anchorY, boolean onleft, float angle);
 
         public void draw(Canvas c);
 
@@ -69,6 +72,7 @@
     private int mRadius;
     private int mRadiusInc;
     private int mSlop;
+    private int mTouchOffset;
 
     private boolean mOpen;
     private PieController mController;
@@ -79,6 +83,8 @@
     private PieView mPieView = null;
 
     private Drawable mBackground;
+    private Paint mNormalPaint;
+    private Paint mSelectedPaint;
 
     // touch handling
     PieItem mCurrentItem;
@@ -118,11 +124,18 @@
         mRadius = (int) res.getDimension(R.dimen.qc_radius_start);
         mRadiusInc = (int) res.getDimension(R.dimen.qc_radius_increment);
         mSlop = (int) res.getDimension(R.dimen.qc_slop);
+        mTouchOffset = (int) res.getDimension(R.dimen.qc_touch_offset);
         mOpen = false;
         setWillNotDraw(false);
         setDrawingCacheEnabled(false);
         mCenter = new Point(0,0);
         mBackground = res.getDrawable(R.drawable.qc_background_normal);
+        mNormalPaint = new Paint();
+        mNormalPaint.setColor(res.getColor(R.color.qc_normal));
+        mNormalPaint.setAntiAlias(true);
+        mSelectedPaint = new Paint();
+        mSelectedPaint.setColor(res.getColor(R.color.qc_selected));
+        mSelectedPaint.setAntiAlias(true);
     }
 
     public void setController(PieController ctl) {
@@ -178,13 +191,16 @@
     }
 
     private void layoutPie() {
-        int inner = mRadius;
-        int outer = mRadius + mRadiusInc;
+        float emptyangle = (float) Math.PI / 16;
+        int rgap = 2;
+        int inner = mRadius + rgap;
+        int outer = mRadius + mRadiusInc - rgap;
         int radius = mRadius;
+        int gap = 1;
         for (int i = 0; i < mLevels; i++) {
             int level = i + 1;
-            float sweep = (float) Math.PI / (mCounts[level] + 1);
-            float angle = sweep;
+            float sweep = (float) (Math.PI - 2 * emptyangle) / mCounts[level];
+            float angle = emptyangle + sweep / 2;
             for (PieItem item : mItems) {
                 if (item.getLevel() == level) {
                     View view = item.getView();
@@ -192,16 +208,20 @@
                             view.getLayoutParams().height);
                     int w = view.getMeasuredWidth();
                     int h = view.getMeasuredHeight();
-                    int x = (int) (outer * Math.sin(angle));
-                    int y = mCenter.y - (int) (outer * Math.cos(angle)) - h / 2;
+                    int r = inner + (outer - inner) * 2 / 3;
+                    int x = (int) (r * Math.sin(angle));
+                    int y = mCenter.y - (int) (r * Math.cos(angle)) - h / 2;
                     if (onTheLeft()) {
-                        x = mCenter.x + x - w;
+                        x = mCenter.x + x - w / 2;
                     } else {
-                        x = mCenter.x - x;
+                        x = mCenter.x - x - w / 2;
                     }
                     view.layout(x, y, x + w, y + h);
                     float itemstart = angle - sweep / 2;
-                    item.setGeometry(itemstart, sweep, inner, outer);
+                    Path slice = makeSlice(getDegrees(itemstart) - gap,
+                            getDegrees(itemstart + sweep) + gap,
+                            outer, inner, mCenter);
+                    item.setGeometry(itemstart, sweep, inner, outer, slice);
                     angle += sweep;
                 }
             }
@@ -210,6 +230,18 @@
         }
     }
 
+
+    /**
+     * converts a
+     *
+     * @param angle from 0..PI to Android degrees (clockwise starting at 3
+     *        o'clock)
+     * @return skia angle
+     */
+    private float getDegrees(double angle) {
+        return (float) (270 - 180 * angle / Math.PI);
+    }
+
     @Override
     protected void onDraw(Canvas canvas) {
         if (mOpen) {
@@ -218,13 +250,21 @@
             int left = mCenter.x - w;
             int top = mCenter.y - h / 2;
             mBackground.setBounds(left, top, left + w, top + h);
-            int state = canvas.save();
+            int state;
+            state = canvas.save();
             if (onTheLeft()) {
                 canvas.scale(-1, 1);
             }
             mBackground.draw(canvas);
             canvas.restoreToCount(state);
             for (PieItem item : mItems) {
+                Paint p = item.isSelected() ? mSelectedPaint : mNormalPaint;
+                state = canvas.save();
+                if (onTheLeft()) {
+                    canvas.scale(-1, 1);
+                }
+                drawPath(canvas, item.getPath(), p);
+                canvas.restoreToCount(state);
                 drawItem(canvas, item);
             }
             if (mPieView != null) {
@@ -245,6 +285,24 @@
         canvas.restoreToCount(state);
     }
 
+    private void drawPath(Canvas canvas, Path path, Paint paint) {
+        canvas.drawPath(path, paint);
+    }
+
+    private Path makeSlice(float start, float end, int outer, int inner, Point center) {
+        RectF bb =
+                new RectF(center.x - outer, center.y - outer, center.x + outer,
+                        center.y + outer);
+        RectF bbi =
+                new RectF(center.x - inner, center.y - inner, center.x + inner,
+                        center.y + inner);
+        Path path = new Path();
+        path.arcTo(bb, start, end - start, true);
+        path.arcTo(bbi, end, start - end);
+        path.close();
+        return path;
+    }
+
     // touch handling for pie
 
     @Override
@@ -307,7 +365,8 @@
                             ? item.getView().getWidth() : 0);
                     int cy = item.getView().getTop();
                     mPieView = item.getPieView();
-                    layoutPieView(mPieView, cx, cy);
+                    layoutPieView(mPieView, cx, cy,
+                            (item.getStartAngle() + item.getSweep()) / 2);
                 }
                 invalidate();
             }
@@ -316,8 +375,8 @@
         return false;
     }
 
-    private void layoutPieView(PieView pv, int x, int y) {
-        pv.layout(x, y, onTheLeft());
+    private void layoutPieView(PieView pv, int x, int y, float angle) {
+        pv.layout(x, y, onTheLeft(), angle);
     }
 
     /**
@@ -373,8 +432,8 @@
     private PieItem findItem(PointF polar) {
         // find the matching item:
         for (PieItem item : mItems) {
-            if ((item.getInnerRadius() < polar.y)
-                    && (item.getOuterRadius() > polar.y)
+            if ((item.getInnerRadius() - mTouchOffset < polar.y)
+                    && (item.getOuterRadius() - mTouchOffset > polar.y)
                     && (item.getStartAngle() < polar.x)
                     && (item.getStartAngle() + item.getSweep() > polar.x)) {
                 return item;
diff --git a/src/com/android/browser/view/PieStackView.java b/src/com/android/browser/view/PieStackView.java
index df387ad..ca641f9 100644
--- a/src/com/android/browser/view/PieStackView.java
+++ b/src/com/android/browser/view/PieStackView.java
@@ -59,8 +59,8 @@
      * this will be called before the first draw call
      */
     @Override
-    public void layout(int anchorX, int anchorY, boolean left) {
-        super.layout(anchorX, anchorY, left);
+    public void layout(int anchorX, int anchorY, boolean left, float angle) {
+        super.layout(anchorX, anchorY, left, angle);
         buildViews();
         mWidth = mChildWidth;
         mHeight = mChildHeight + (mViews.size() - 1) * mMinHeight;
@@ -76,7 +76,8 @@
         int top = mTop;
         int dy = (n == 1) ? 0 : (mHeight - mChildHeight) / (n - 1);
         for (View view : mViews) {
-            view.layout(mLeft, top, mLeft + mChildWidth, top + mChildHeight);
+            int x = mLeft;
+            view.layout(x, top, x + mChildWidth, top + mChildHeight);
             top += dy;
         }
     }