add haptic feedback, fix QC

    reduced number of QC entries
    fixed qc behavior with new titlebar
    add haptic feedback to qc selection
    change qc rendering from flat paint to bitmap shader

Change-Id: I4b89fea1aec7ce680147f663f2c22d0d369f4194
diff --git a/src/com/android/browser/PieControl.java b/src/com/android/browser/PieControl.java
index 23dcced..2e2eba4 100644
--- a/src/com/android/browser/PieControl.java
+++ b/src/com/android/browser/PieControl.java
@@ -64,22 +64,22 @@
             LayoutParams lp = new LayoutParams(LayoutParams.MATCH_PARENT,
                     LayoutParams.MATCH_PARENT);
             mPie.setLayoutParams(lp);
-            mForward = makeMenuView(R.drawable.ic_pie_forward);
-            mPie.addItem(mForward);
-            mRefresh = makeMenuView(R.drawable.ic_pie_refresh);
-            mPie.addItem(mRefresh);
+            mNewTab = makeMenuView(R.drawable.ic_pie_new_tab);
+            mPie.addItem(mNewTab);
             mBack = makeMenuView(R.drawable.ic_pie_back);
             mPie.addItem(mBack);
             mUrl = makeMenuView(R.drawable.ic_pie_web);
             mPie.addItem(mUrl);
             mBookmarks = makeMenuView(R.drawable.ic_pie_bookmarks);
             mPie.addItem(mBookmarks);
-            mNewTab = makeMenuView(R.drawable.ic_pie_new_tab);
-            mPie.addItem(mNewTab);
             mOptions = makeMenuView(R.drawable.ic_pie_more);
             mPie.addItem(mOptions);
-            setClickListener(mBack, mForward, mRefresh, mUrl, mOptions,
-                    mBookmarks, mNewTab);
+            setClickListener(mBack,
+                    mUrl,
+                    mOptions,
+                    mBookmarks,
+                    mNewTab
+                    );
             mPie.setController(this);
         }
         container.addView(mPie);
diff --git a/src/com/android/browser/TitleBarXLarge.java b/src/com/android/browser/TitleBarXLarge.java
index 14e7c72..d5a6f97 100644
--- a/src/com/android/browser/TitleBarXLarge.java
+++ b/src/com/android/browser/TitleBarXLarge.java
@@ -170,17 +170,6 @@
         mUseQuickControls = useQuickControls;
         mUrlInput.setUseQuickControls(mUseQuickControls);
         setLayoutParams(makeLayoutParams());
-        if (mUseQuickControls) {
-            mBackButton.setVisibility(View.GONE);
-            mForwardButton.setVisibility(View.GONE);
-            mStopButton.setVisibility(View.GONE);
-            mAllButton.setVisibility(View.GONE);
-        } else {
-            mBackButton.setVisibility(View.VISIBLE);
-            mForwardButton.setVisibility(View.VISIBLE);
-            mStopButton.setVisibility(View.VISIBLE);
-            mAllButton.setVisibility(View.VISIBLE);
-        }
     }
 
     void setShowProgressOnly(boolean progress) {
@@ -207,6 +196,9 @@
         } else if (!mUrlInput.needsUpdate()) {
             mUrlInput.dismissDropDown();
             mUrlInput.hideIME();
+            if (mUseQuickControls) {
+                mUi.hideTitleBar();
+            }
         }
         mUrlInput.clearNeedsUpdate();
     }
diff --git a/src/com/android/browser/UrlInputView.java b/src/com/android/browser/UrlInputView.java
index 2ec2111..c9f4c6a 100644
--- a/src/com/android/browser/UrlInputView.java
+++ b/src/com/android/browser/UrlInputView.java
@@ -57,7 +57,6 @@
     private View mContainer;
     private boolean mLandscape;
     private boolean mIncognitoMode;
-    private int mVOffset;
     private boolean mNeedsUpdate;
 
     public UrlInputView(Context context, AttributeSet attrs, int defStyle) {
@@ -84,7 +83,6 @@
         onConfigurationChanged(ctx.getResources().getConfiguration());
         setThreshold(1);
         setOnItemClickListener(this);
-        mVOffset = 0;
         mNeedsUpdate = false;
     }
 
@@ -109,9 +107,6 @@
     }
 
     void setUseQuickControls(boolean useQuickControls) {
-        mVOffset = (useQuickControls
-                ? (int) getResources().getDimension(R.dimen.dropdown_offset)
-                : 0);
         mAdapter.setReverseResults(useQuickControls);
     }
 
@@ -159,7 +154,6 @@
         if (getLeft() != -getDropDownHorizontalOffset()) {
             setDropDownHorizontalOffset(-getLeft());
         }
-        setDropDownVerticalOffset(mVOffset);
     }
 
     @Override
diff --git a/src/com/android/browser/XLargeUi.java b/src/com/android/browser/XLargeUi.java
index 8c7756b..d3f83f9 100644
--- a/src/com/android/browser/XLargeUi.java
+++ b/src/com/android/browser/XLargeUi.java
@@ -32,6 +32,7 @@
 import android.view.View;
 import android.webkit.WebChromeClient.CustomViewCallback;
 import android.webkit.WebView;
+import android.widget.FrameLayout;
 
 import java.util.List;
 
@@ -333,7 +334,6 @@
     protected void showTitleBar() {
         if (canShowTitleBar()) {
             if (mUseQuickControls) {
-                setTitleGravity(Gravity.BOTTOM);
                 mContentView.addView(mTitleBar);
             } else {
                 setTitleGravity(Gravity.TOP);
@@ -347,9 +347,10 @@
     protected void hideTitleBar() {
         if (isTitleBarShowing()) {
             mTabBar.onHideTitleBar();
-            setTitleGravity(Gravity.NO_GRAVITY);
             if (mUseQuickControls) {
                 mContentView.removeView(mTitleBar);
+            } else {
+                setTitleGravity(Gravity.NO_GRAVITY);
             }
             super.hideTitleBar();
         }
@@ -364,6 +365,18 @@
         return mTitleBar;
     }
 
+    @Override
+    protected void setTitleGravity(int gravity) {
+        if (mUseQuickControls) {
+            FrameLayout.LayoutParams lp =
+                (FrameLayout.LayoutParams) mTitleBar.getLayoutParams();
+            lp.gravity = gravity;
+            mTitleBar.setLayoutParams(lp);
+        } else {
+            super.setTitleGravity(gravity);
+        }
+    }
+
     // action mode callbacks
 
     @Override
diff --git a/src/com/android/browser/view/PieMenu.java b/src/com/android/browser/view/PieMenu.java
index 5185adb..080c257 100644
--- a/src/com/android/browser/view/PieMenu.java
+++ b/src/com/android/browser/view/PieMenu.java
@@ -20,15 +20,21 @@
 
 import android.content.Context;
 import android.content.res.Resources;
+import android.graphics.Bitmap;
+import android.graphics.BitmapShader;
 import android.graphics.Canvas;
+import android.graphics.Matrix;
 import android.graphics.Paint;
 import android.graphics.Path;
 import android.graphics.Point;
 import android.graphics.PointF;
 import android.graphics.Rect;
 import android.graphics.RectF;
+import android.graphics.Shader;
+import android.graphics.drawable.Drawable;
 import android.util.AttributeSet;
 import android.view.MotionEvent;
+import android.view.SoundEffectConstants;
 import android.view.View;
 import android.view.ViewGroup;
 import android.widget.FrameLayout;
@@ -64,6 +70,17 @@
 
     private boolean mDirty;
 
+    private Drawable mActiveDrawable;
+    private Drawable mInactiveDrawable;
+    private final Paint mActiveShaderPaint = new Paint();
+    private final Paint mInactiveShaderPaint = new Paint();
+    private final Matrix mActiveMatrix = new Matrix();
+    private final Matrix mInactiveMatrix = new Matrix();
+
+    private BitmapShader mActiveShader;
+    private BitmapShader mInactiveShader;
+
+
     /**
      * @param context
      * @param attrs
@@ -111,6 +128,37 @@
         setDrawingCacheEnabled(false);
         mCenter = new Point(0,0);
         mDirty = true;
+        mActiveShaderPaint.setStyle(Paint.Style.FILL);
+        mActiveShaderPaint.setAntiAlias(true);
+
+        mInactiveShaderPaint.setStyle(Paint.Style.FILL);
+        mInactiveShaderPaint.setAntiAlias(true);
+        mActiveDrawable = res.getDrawable(R.drawable.qc_background_selected);
+        mInactiveDrawable = res.getDrawable(R.drawable.qc_background_normal);
+
+        Bitmap activeTexture = getDrawableAsBitmap(mActiveDrawable,
+                mActiveDrawable.getIntrinsicWidth(),
+                mActiveDrawable.getIntrinsicHeight());
+        Bitmap inactiveTexture = getDrawableAsBitmap(mInactiveDrawable,
+                mInactiveDrawable.getIntrinsicWidth(),
+                mInactiveDrawable.getIntrinsicHeight());
+
+        mActiveShader = new BitmapShader(activeTexture,
+                Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
+        mActiveShaderPaint.setShader(mActiveShader);
+
+        mInactiveShader = new BitmapShader(inactiveTexture,
+                Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
+        mInactiveShaderPaint.setShader(mInactiveShader);
+
+    }
+
+    private static Bitmap getDrawableAsBitmap(Drawable drawable, int width, int height) {
+        Bitmap b = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
+        Canvas c = new Canvas(b);
+        drawable.setBounds(0, 0, width, height);
+        drawable.draw(c);
+        return b;
     }
 
     public void setController(PieController ctl) {
@@ -268,10 +316,15 @@
             tag.sweep = sweep;
             tag.inner = inner;
             tag.outer = outer;
-
-            Paint p = item.isPressed() ? mSelectedPaint : mPaint;
-            canvas.drawPath(slice, p);
             int state = canvas.save();
+            int[] topLeft = new int[2];
+            getLocationInWindow(topLeft);
+            topLeft[0] = mCenter.x - outer;
+            topLeft[1] = mCenter.y - outer;
+            Paint paint = item.isPressed() ? mActiveShaderPaint : mInactiveShaderPaint;
+            drawClipped(canvas, paint, slice, topLeft, item.isPressed());
+            canvas.restoreToCount(state);
+            state = canvas.save();
             if (onTheLeft()) {
                 canvas.scale(-1, 1);
             }
@@ -287,6 +340,16 @@
         return newanchor;
     }
 
+    private void drawClipped(Canvas canvas, Paint paint, Path clipPath, int[] pos,
+            boolean selected) {
+        // TODO: We should change the matrix/shader only when needed
+        final Matrix matrix = selected ? mActiveMatrix : mInactiveMatrix;
+        matrix.setTranslate(pos[0], pos[1]);
+        (selected ? mActiveShader : mInactiveShader).setLocalMatrix(matrix);
+        canvas.drawPath(clipPath, paint);
+    }
+
+
     /**
      * converts a
      * @param angle from 0..PI to Android degrees (clockwise starting at 3 o'clock)
@@ -391,6 +454,7 @@
         }
         if (view != null) {
             // clear up stack
+            playSoundEffect(SoundEffectConstants.CLICK);
             MenuTag tag = (MenuTag) view.getTag();
             int i = mStack.size() - 1;
             while (i > 0) {