Updating Clings UI

issue: 16127412

Change-Id: Ie5885cabbef086e3b08811da72af88d01c4405e7
diff --git a/src/com/android/launcher3/BorderCropDrawable.java b/src/com/android/launcher3/BorderCropDrawable.java
new file mode 100644
index 0000000..caf497d
--- /dev/null
+++ b/src/com/android/launcher3/BorderCropDrawable.java
@@ -0,0 +1,90 @@
+/*
+ * 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.launcher3;
+
+import android.graphics.Canvas;
+import android.graphics.ColorFilter;
+import android.graphics.Rect;
+import android.graphics.drawable.Drawable;
+
+public class BorderCropDrawable extends Drawable {
+
+    private final Drawable mChild;
+    private final Rect mBoundsShift;
+    private final Rect mPadding;
+
+    BorderCropDrawable(Drawable child, boolean cropLeft,
+            boolean cropTop, boolean cropRight, boolean cropBottom) {
+        mChild = child;
+
+        mBoundsShift = new Rect();
+        mPadding = new Rect();
+        mChild.getPadding(mPadding);
+
+        if (cropLeft) {
+            mBoundsShift.left = -mPadding.left;
+            mPadding.left = 0;
+        }
+        if (cropTop) {
+            mBoundsShift.top = -mPadding.top;
+            mPadding.top = 0;
+        }
+        if (cropRight) {
+            mBoundsShift.right = mPadding.right;
+            mPadding.right = 0;
+        }
+        if (cropBottom) {
+            mBoundsShift.bottom = mPadding.bottom;
+            mPadding.bottom = 0;
+        }
+    }
+
+    @Override
+    protected void onBoundsChange(Rect bounds) {
+        mChild.setBounds(
+                bounds.left + mBoundsShift.left,
+                bounds.top + mBoundsShift.top,
+                bounds.right + mBoundsShift.right,
+                bounds.bottom + mBoundsShift.bottom);
+    }
+
+    @Override
+    public boolean getPadding(Rect padding) {
+        padding.set(mPadding);
+        return (padding.left | padding.top | padding.right | padding.bottom) != 0;
+    }
+
+    @Override
+    public void draw(Canvas canvas) {
+        mChild.draw(canvas);
+    }
+
+    @Override
+    public int getOpacity() {
+        return mChild.getOpacity();
+    }
+
+    @Override
+    public void setAlpha(int alpha) {
+        mChild.setAlpha(alpha);
+    }
+
+    @Override
+    public void setColorFilter(ColorFilter cf) {
+        mChild.setColorFilter(cf);
+    }
+}
diff --git a/src/com/android/launcher3/ClearCircleLayout.java b/src/com/android/launcher3/ClearCircleLayout.java
deleted file mode 100644
index e48c84e..0000000
--- a/src/com/android/launcher3/ClearCircleLayout.java
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
- * 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.launcher3;
-
-import android.content.Context;
-import android.content.res.TypedArray;
-import android.graphics.Bitmap;
-import android.graphics.Canvas;
-import android.graphics.Paint;
-import android.graphics.Point;
-import android.graphics.PorterDuff;
-import android.graphics.PorterDuffXfermode;
-import android.graphics.Rect;
-import android.util.AttributeSet;
-import android.util.DisplayMetrics;
-import android.view.View;
-
-public class ClearCircleLayout extends View {
-
-    private static final String HOLE_LOCATION_PAGE_INDICATOR = "page_indicator";
-    private static final String HOLE_LOCATION_CENTER_SCREEN = "center_screen";
-
-    private static final int BACKGROUND_COLOR = 0x80000000;
-    private static float MIGRATION_WORKSPACE_INNER_CIRCLE_RADIUS_DPS = 42;
-    private static float MIGRATION_WORKSPACE_OUTER_CIRCLE_RADIUS_DPS = 46;
-
-    private final String mHoleLocation;
-    private final Paint mErasePaint;
-    private final Paint mBorderPaint;
-
-    private Launcher mLauncher;
-    private Point mHoleCenter;
-    private DisplayMetrics mMetrics;
-
-    public ClearCircleLayout(Context context, AttributeSet attrs) {
-        super(context, attrs);
-
-        TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.ClearCircleLayout);
-        mHoleLocation = a.getString(R.styleable.ClearCircleLayout_holeLocation);
-        a.recycle();
-
-        mErasePaint = new Paint();
-        mErasePaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.MULTIPLY));
-        mErasePaint.setColor(0xFFFFFF);
-        mErasePaint.setAlpha(0);
-        mErasePaint.setAntiAlias(true);
-
-        mBorderPaint = new Paint();
-        mBorderPaint.setColor(0xFFFFFFFF);
-        mBorderPaint.setAntiAlias(true);
-    }
-
-    void initHole(Launcher launcher) {
-        mLauncher = launcher;
-        mMetrics = new DisplayMetrics();
-        launcher.getWindowManager().getDefaultDisplay().getMetrics(mMetrics);
-
-        if (mHoleLocation.endsWith(HOLE_LOCATION_PAGE_INDICATOR)) {
-            LauncherAppState app = LauncherAppState.getInstance();
-            DeviceProfile grid = app.getDynamicGrid().getDeviceProfile();
-
-            Rect indicator = grid.getWorkspacePageIndicatorBounds(new Rect());
-            mHoleCenter = new Point(indicator.centerX(), indicator.centerY());
-        } else if (mHoleLocation.endsWith(HOLE_LOCATION_CENTER_SCREEN)) {
-            mHoleCenter = new Point(mMetrics.widthPixels / 2, mMetrics.heightPixels / 2);
-        }
-    }
-
-    @Override
-    protected void dispatchDraw(Canvas canvas) {
-        if (mHoleCenter == null) {
-            canvas.drawColor(BACKGROUND_COLOR);
-        } else {
-            drawHole(canvas);
-        }
-
-        super.dispatchDraw(canvas);
-    }
-
-    private void drawHole(Canvas canvas) {
-        // Initialize the draw buffer (to allow punching through)
-        Bitmap eraseBg = Bitmap.createBitmap(getMeasuredWidth(), getMeasuredHeight(),
-                Bitmap.Config.ARGB_8888);
-        Canvas eraseCanvas = new Canvas(eraseBg);
-        eraseCanvas.drawColor(BACKGROUND_COLOR);
-
-        Rect insets = mLauncher.getDragLayer().getInsets();
-        float x = mHoleCenter.x - insets.left;
-        float y = mHoleCenter.y - insets.top;
-        // Draw the outer circle
-        eraseCanvas.drawCircle(x, y,
-                DynamicGrid.pxFromDp(MIGRATION_WORKSPACE_OUTER_CIRCLE_RADIUS_DPS, mMetrics),
-                mBorderPaint);
-
-        // Draw the inner circle
-        eraseCanvas.drawCircle(x, y,
-                DynamicGrid.pxFromDp(MIGRATION_WORKSPACE_INNER_CIRCLE_RADIUS_DPS, mMetrics),
-                mErasePaint);
-
-        canvas.drawBitmap(eraseBg, 0, 0, null);
-        eraseCanvas.setBitmap(null);
-        eraseBg.recycle();
-    }
-}
diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java
index e134d1b..dff98f2 100644
--- a/src/com/android/launcher3/Launcher.java
+++ b/src/com/android/launcher3/Launcher.java
@@ -506,7 +506,7 @@
             if (mModel.canMigrateFromOldLauncherDb(this)) {
                 launcherClings.showMigrationCling();
             } else {
-                launcherClings.showLongPressCling(true);
+                launcherClings.showLongPressCling(false);
             }
         }
     }
diff --git a/src/com/android/launcher3/LauncherClings.java b/src/com/android/launcher3/LauncherClings.java
index 840fb52..458d81f 100644
--- a/src/com/android/launcher3/LauncherClings.java
+++ b/src/com/android/launcher3/LauncherClings.java
@@ -18,13 +18,12 @@
 
 import android.accounts.Account;
 import android.accounts.AccountManager;
-import android.animation.AnimatorSet;
 import android.animation.ObjectAnimator;
 import android.animation.PropertyValuesHolder;
-import android.animation.ValueAnimator;
 import android.app.ActivityManager;
 import android.content.Context;
 import android.content.SharedPreferences;
+import android.graphics.drawable.Drawable;
 import android.os.Bundle;
 import android.os.UserManager;
 import android.provider.Settings;
@@ -41,8 +40,7 @@
     private static final String MIGRATION_CLING_DISMISSED_KEY = "cling_gel.migration.dismissed";
     private static final String WORKSPACE_CLING_DISMISSED_KEY = "cling_gel.workspace.dismissed";
 
-    private static final String ANIM_SLIDE_FROM_BOTTOM = "slide_from_bottom";
-    private static final String ANIM_SLIDE_FROM_TOP = "slide_from_top";
+    private static final String TAG_CROP_TOP_AND_SIDES = "crop_bg_top_and_sides";
 
     private static final boolean DISABLE_CLINGS = false;
 
@@ -124,10 +122,7 @@
         ViewGroup root = (ViewGroup) mLauncher.findViewById(R.id.launcher);
         View cling = mInflater.inflate(R.layout.longpress_cling, root, false);
 
-        final ClearCircleLayout hole = (ClearCircleLayout) cling.findViewById(R.id.cling_longpress_hole);
-        hole.initHole(mLauncher);
-        hole.setClickable(true);
-        hole.setOnLongClickListener(new OnLongClickListener() {
+        cling.setOnLongClickListener(new OnLongClickListener() {
 
             @Override
             public boolean onLongClick(View v) {
@@ -142,6 +137,12 @@
                 : R.layout.longpress_cling_content, content);
         content.findViewById(R.id.cling_dismiss_longpress_info).setOnClickListener(this);
 
+        if (TAG_CROP_TOP_AND_SIDES.equals(content.getTag())) {
+            Drawable bg = new BorderCropDrawable(mLauncher.getResources().getDrawable(R.drawable.cling_bg),
+                    true, true, true, false);
+            content.setBackground(bg);
+        }
+
         root.addView(cling);
 
         if (showWelcome) {
@@ -156,29 +157,20 @@
             public void onGlobalLayout() {
                 content.getViewTreeObserver().removeOnGlobalLayoutListener(this);
 
-                hole.setAlpha(0);
-                ValueAnimator anim1 = LauncherAnimUtils.ofFloat(hole, "alpha", 1);
-
-                ObjectAnimator anim2;
-
-                if (ANIM_SLIDE_FROM_TOP.equals(content.getTag())) {
+                ObjectAnimator anim;
+                if (TAG_CROP_TOP_AND_SIDES.equals(content.getTag())) {
                     content.setTranslationY(-content.getMeasuredHeight());
-                    anim2 = LauncherAnimUtils.ofFloat(content, "translationY", 0);
-                } else if (ANIM_SLIDE_FROM_BOTTOM.equals(content.getTag())) {
-                    content.setTranslationY(content.getMeasuredHeight());
-                    anim2 = LauncherAnimUtils.ofFloat(content, "translationY", 0);
+                    anim = LauncherAnimUtils.ofFloat(content, "translationY", 0);
                 } else {
                     content.setScaleX(0);
                     content.setScaleY(0);
                     PropertyValuesHolder scaleX = PropertyValuesHolder.ofFloat("scaleX", 1);
                     PropertyValuesHolder scaleY = PropertyValuesHolder.ofFloat("scaleY", 1);
-                    anim2 = LauncherAnimUtils.ofPropertyValuesHolder(content, scaleX, scaleY);
+                    anim = LauncherAnimUtils.ofPropertyValuesHolder(content, scaleX, scaleY);
                 }
 
-                AnimatorSet anim = LauncherAnimUtils.createAnimatorSet();
                 anim.setDuration(SHOW_CLING_DURATION);
                 anim.setInterpolator(new LogDecelerateInterpolator(100, 0));
-                anim.playTogether(anim1, anim2);
                 anim.start();
             }
         });