182f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung/* 282f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung * Copyright (C) 2011 The Android Open Source Project 382f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung * 482f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung * Licensed under the Apache License, Version 2.0 (the "License"); 582f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung * you may not use this file except in compliance with the License. 682f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung * You may obtain a copy of the License at 782f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung * 882f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung * http://www.apache.org/licenses/LICENSE-2.0 982f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung * 1082f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung * Unless required by applicable law or agreed to in writing, software 1182f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung * distributed under the License is distributed on an "AS IS" BASIS, 1282f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1382f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung * See the License for the specific language governing permissions and 1482f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung * limitations under the License. 1582f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung */ 1682f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung 1782f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chungpackage com.android.launcher2; 1882f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung 1982f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chungimport android.content.Context; 2082f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chungimport android.content.res.Resources; 2182f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chungimport android.content.res.TypedArray; 227d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chungimport android.graphics.Bitmap; 2382f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chungimport android.graphics.Canvas; 2482f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chungimport android.graphics.Paint; 257d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chungimport android.graphics.PorterDuff; 267d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chungimport android.graphics.PorterDuffXfermode; 277d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chungimport android.graphics.Rect; 2882f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chungimport android.graphics.drawable.Drawable; 2982f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chungimport android.util.AttributeSet; 3082f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chungimport android.util.DisplayMetrics; 3155d225d50e68b3ea629c45a53d6744b52e335134Svetoslav Ganovimport android.view.FocusFinder; 3255d225d50e68b3ea629c45a53d6744b52e335134Svetoslav Ganovimport android.view.MotionEvent; 3355d225d50e68b3ea629c45a53d6744b52e335134Svetoslav Ganovimport android.view.View; 3455d225d50e68b3ea629c45a53d6744b52e335134Svetoslav Ganovimport android.view.accessibility.AccessibilityManager; 3582f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chungimport android.widget.FrameLayout; 3682f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung 3782f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chungimport com.android.launcher.R; 3882f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung 3982f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chungpublic class Cling extends FrameLayout { 4082f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung 417d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung static final String WORKSPACE_CLING_DISMISSED_KEY = "cling.workspace.dismissed"; 427d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung static final String ALLAPPS_CLING_DISMISSED_KEY = "cling.allapps.dismissed"; 437d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung static final String FOLDER_CLING_DISMISSED_KEY = "cling.folder.dismissed"; 447d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung 4582f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung private static String WORKSPACE_PORTRAIT = "workspace_portrait"; 4682f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung private static String WORKSPACE_LANDSCAPE = "workspace_landscape"; 472f5f945704a958470a51214399af9aee7bf6568dAndrew Flynn private static String WORKSPACE_LARGE = "workspace_large"; 482f5f945704a958470a51214399af9aee7bf6568dAndrew Flynn private static String WORKSPACE_CUSTOM = "workspace_custom"; 492f5f945704a958470a51214399af9aee7bf6568dAndrew Flynn 5082f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung private static String ALLAPPS_PORTRAIT = "all_apps_portrait"; 5182f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung private static String ALLAPPS_LANDSCAPE = "all_apps_landscape"; 522f5f945704a958470a51214399af9aee7bf6568dAndrew Flynn private static String ALLAPPS_LARGE = "all_apps_large"; 532f5f945704a958470a51214399af9aee7bf6568dAndrew Flynn 547d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung private static String FOLDER_PORTRAIT = "folder_portrait"; 557d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung private static String FOLDER_LANDSCAPE = "folder_landscape"; 56d016015c2396b885a7ba30f3678d5c50830c20bdWinson Chung private static String FOLDER_LARGE = "folder_large"; 5782f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung 5882f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung private Launcher mLauncher; 5982f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung private boolean mIsInitialized; 6082f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung private String mDrawIdentifier; 617d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung private Drawable mBackground; 6282f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung private Drawable mPunchThroughGraphic; 637d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung private Drawable mHandTouchGraphic; 6482f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung private int mPunchThroughGraphicCenterRadius; 6582f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung private int mAppIconSize; 667d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung private int mButtonBarHeight; 677d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung private float mRevealRadius; 687d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung private int[] mPositionData; 697d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung 707d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung private Paint mErasePaint; 7182f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung 7282f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung public Cling(Context context) { 7382f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung this(context, null, 0); 7482f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung } 7582f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung 7682f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung public Cling(Context context, AttributeSet attrs) { 7782f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung this(context, attrs, 0); 7882f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung } 7982f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung 8082f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung public Cling(Context context, AttributeSet attrs, int defStyle) { 8182f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung super(context, attrs, defStyle); 8282f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung 8382f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.Cling, defStyle, 0); 8482f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung mDrawIdentifier = a.getString(R.styleable.Cling_drawIdentifier); 8582f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung a.recycle(); 8682f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung } 8782f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung 887d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung void init(Launcher l, int[] positionData) { 8982f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung if (!mIsInitialized) { 9082f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung mLauncher = l; 917d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung mPositionData = positionData; 9282f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung 9382f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung Resources r = getContext().getResources(); 942f5f945704a958470a51214399af9aee7bf6568dAndrew Flynn 9582f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung mPunchThroughGraphic = r.getDrawable(R.drawable.cling); 9682f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung mPunchThroughGraphicCenterRadius = 9782f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung r.getDimensionPixelSize(R.dimen.clingPunchThroughGraphicCenterRadius); 9882f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung mAppIconSize = r.getDimensionPixelSize(R.dimen.app_icon_size); 992f5f945704a958470a51214399af9aee7bf6568dAndrew Flynn mRevealRadius = r.getDimensionPixelSize(R.dimen.reveal_radius) * 1f; 1007d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung mButtonBarHeight = r.getDimensionPixelSize(R.dimen.button_bar_height); 10182f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung 1027d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung mErasePaint = new Paint(); 1037d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung mErasePaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.MULTIPLY)); 1047d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung mErasePaint.setColor(0xFFFFFF); 1057d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung mErasePaint.setAlpha(0); 1067d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung 10782f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung mIsInitialized = true; 10882f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung } 10982f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung } 11082f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung 11182f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung void cleanup() { 1127d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung mBackground = null; 11382f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung mPunchThroughGraphic = null; 1147d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung mHandTouchGraphic = null; 1157d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung mIsInitialized = false; 1167d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung } 1177d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung 118974c3864bb438fc924913e0017385f873332d052Michael Jurka public String getDrawIdentifier() { 119974c3864bb438fc924913e0017385f873332d052Michael Jurka return mDrawIdentifier; 120974c3864bb438fc924913e0017385f873332d052Michael Jurka } 121974c3864bb438fc924913e0017385f873332d052Michael Jurka 1222f5f945704a958470a51214399af9aee7bf6568dAndrew Flynn private int[] getPunchThroughPositions() { 1237d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung if (mDrawIdentifier.equals(WORKSPACE_PORTRAIT)) { 1247d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung return new int[]{getMeasuredWidth() / 2, getMeasuredHeight() - (mButtonBarHeight / 2)}; 1257d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung } else if (mDrawIdentifier.equals(WORKSPACE_LANDSCAPE)) { 1267d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung return new int[]{getMeasuredWidth() - (mButtonBarHeight / 2), getMeasuredHeight() / 2}; 127d016015c2396b885a7ba30f3678d5c50830c20bdWinson Chung } else if (mDrawIdentifier.equals(WORKSPACE_LARGE)) { 128d016015c2396b885a7ba30f3678d5c50830c20bdWinson Chung final float scale = LauncherApplication.getScreenDensity(); 129d016015c2396b885a7ba30f3678d5c50830c20bdWinson Chung final int cornerXOffset = (int) (scale * 15); 130d016015c2396b885a7ba30f3678d5c50830c20bdWinson Chung final int cornerYOffset = (int) (scale * 10); 131d016015c2396b885a7ba30f3678d5c50830c20bdWinson Chung return new int[]{getMeasuredWidth() - cornerXOffset, cornerYOffset}; 1327d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung } else if (mDrawIdentifier.equals(ALLAPPS_PORTRAIT) || 133d016015c2396b885a7ba30f3678d5c50830c20bdWinson Chung mDrawIdentifier.equals(ALLAPPS_LANDSCAPE) || 134d016015c2396b885a7ba30f3678d5c50830c20bdWinson Chung mDrawIdentifier.equals(ALLAPPS_LARGE)) { 1357d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung return mPositionData; 1367d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung } 1377d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung return new int[]{-1, -1}; 13882f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung } 13982f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung 14082f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung @Override 14155d225d50e68b3ea629c45a53d6744b52e335134Svetoslav Ganov public View findViewToTakeAccessibilityFocusFromHover(View child, View descendant) { 14255d225d50e68b3ea629c45a53d6744b52e335134Svetoslav Ganov if (descendant.includeForAccessibility()) { 14355d225d50e68b3ea629c45a53d6744b52e335134Svetoslav Ganov return descendant; 14455d225d50e68b3ea629c45a53d6744b52e335134Svetoslav Ganov } 14555d225d50e68b3ea629c45a53d6744b52e335134Svetoslav Ganov return null; 14655d225d50e68b3ea629c45a53d6744b52e335134Svetoslav Ganov } 14755d225d50e68b3ea629c45a53d6744b52e335134Svetoslav Ganov 14855d225d50e68b3ea629c45a53d6744b52e335134Svetoslav Ganov @Override 14955d225d50e68b3ea629c45a53d6744b52e335134Svetoslav Ganov public View focusSearch(int direction) { 15055d225d50e68b3ea629c45a53d6744b52e335134Svetoslav Ganov return this.focusSearch(null, direction); 15155d225d50e68b3ea629c45a53d6744b52e335134Svetoslav Ganov } 15255d225d50e68b3ea629c45a53d6744b52e335134Svetoslav Ganov 15355d225d50e68b3ea629c45a53d6744b52e335134Svetoslav Ganov @Override 15455d225d50e68b3ea629c45a53d6744b52e335134Svetoslav Ganov public View focusSearch(View focused, int direction) { 15555d225d50e68b3ea629c45a53d6744b52e335134Svetoslav Ganov return FocusFinder.getInstance().findNextFocus(this, focused, direction); 15655d225d50e68b3ea629c45a53d6744b52e335134Svetoslav Ganov } 15755d225d50e68b3ea629c45a53d6744b52e335134Svetoslav Ganov 15855d225d50e68b3ea629c45a53d6744b52e335134Svetoslav Ganov @Override 15955d225d50e68b3ea629c45a53d6744b52e335134Svetoslav Ganov public boolean onHoverEvent(MotionEvent event) { 16055d225d50e68b3ea629c45a53d6744b52e335134Svetoslav Ganov return (mDrawIdentifier.equals(WORKSPACE_PORTRAIT) 16155d225d50e68b3ea629c45a53d6744b52e335134Svetoslav Ganov || mDrawIdentifier.equals(WORKSPACE_LANDSCAPE) 16255d225d50e68b3ea629c45a53d6744b52e335134Svetoslav Ganov || mDrawIdentifier.equals(WORKSPACE_LARGE) 16355d225d50e68b3ea629c45a53d6744b52e335134Svetoslav Ganov || mDrawIdentifier.equals(ALLAPPS_PORTRAIT) 16455d225d50e68b3ea629c45a53d6744b52e335134Svetoslav Ganov || mDrawIdentifier.equals(ALLAPPS_LANDSCAPE) 16555d225d50e68b3ea629c45a53d6744b52e335134Svetoslav Ganov || mDrawIdentifier.equals(ALLAPPS_LARGE) 16655d225d50e68b3ea629c45a53d6744b52e335134Svetoslav Ganov || mDrawIdentifier.equals(WORKSPACE_CUSTOM)); 16755d225d50e68b3ea629c45a53d6744b52e335134Svetoslav Ganov } 16855d225d50e68b3ea629c45a53d6744b52e335134Svetoslav Ganov 16955d225d50e68b3ea629c45a53d6744b52e335134Svetoslav Ganov @Override 17082f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung public boolean onTouchEvent(android.view.MotionEvent event) { 1717d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung if (mDrawIdentifier.equals(WORKSPACE_PORTRAIT) || 1727d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung mDrawIdentifier.equals(WORKSPACE_LANDSCAPE) || 173d016015c2396b885a7ba30f3678d5c50830c20bdWinson Chung mDrawIdentifier.equals(WORKSPACE_LARGE) || 1747d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung mDrawIdentifier.equals(ALLAPPS_PORTRAIT) || 175d016015c2396b885a7ba30f3678d5c50830c20bdWinson Chung mDrawIdentifier.equals(ALLAPPS_LANDSCAPE) || 176d016015c2396b885a7ba30f3678d5c50830c20bdWinson Chung mDrawIdentifier.equals(ALLAPPS_LARGE)) { 1772f5f945704a958470a51214399af9aee7bf6568dAndrew Flynn 1782f5f945704a958470a51214399af9aee7bf6568dAndrew Flynn int[] positions = getPunchThroughPositions(); 1792f5f945704a958470a51214399af9aee7bf6568dAndrew Flynn for (int i = 0; i < positions.length; i += 2) { 1802f5f945704a958470a51214399af9aee7bf6568dAndrew Flynn double diff = Math.sqrt(Math.pow(event.getX() - positions[i], 2) + 1812f5f945704a958470a51214399af9aee7bf6568dAndrew Flynn Math.pow(event.getY() - positions[i + 1], 2)); 1822f5f945704a958470a51214399af9aee7bf6568dAndrew Flynn if (diff < mRevealRadius) { 1832f5f945704a958470a51214399af9aee7bf6568dAndrew Flynn return false; 1842f5f945704a958470a51214399af9aee7bf6568dAndrew Flynn } 1857d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung } 1867d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung } else if (mDrawIdentifier.equals(FOLDER_PORTRAIT) || 187d016015c2396b885a7ba30f3678d5c50830c20bdWinson Chung mDrawIdentifier.equals(FOLDER_LANDSCAPE) || 188d016015c2396b885a7ba30f3678d5c50830c20bdWinson Chung mDrawIdentifier.equals(FOLDER_LARGE)) { 1897d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung Folder f = mLauncher.getWorkspace().getOpenFolder(); 1907d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung if (f != null) { 1917d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung Rect r = new Rect(); 1927d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung f.getHitRect(r); 1937d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung if (r.contains((int) event.getX(), (int) event.getY())) { 1947d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung return false; 1957d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung } 1967d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung } 1977d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung } 19882f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung return true; 19982f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung }; 20082f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung 20182f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung @Override 20282f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung protected void dispatchDraw(Canvas canvas) { 20382f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung if (mIsInitialized) { 20482f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung DisplayMetrics metrics = new DisplayMetrics(); 20582f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung mLauncher.getWindowManager().getDefaultDisplay().getMetrics(metrics); 20682f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung 2079d9d74f2b0927b9b28ac70d453c046d48788b57bWinson Chung // Initialize the draw buffer (to allow punching through) 20882f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung Bitmap b = Bitmap.createBitmap(getMeasuredWidth(), getMeasuredHeight(), 20982f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung Bitmap.Config.ARGB_8888); 21082f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung Canvas c = new Canvas(b); 2117d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung 2127d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung // Draw the background 2137d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung if (mBackground == null) { 2145966da2e2547ecdfb5d59bfcda8f66b4e2847803Winson Chung if (mDrawIdentifier.equals(WORKSPACE_PORTRAIT) || 2152f5f945704a958470a51214399af9aee7bf6568dAndrew Flynn mDrawIdentifier.equals(WORKSPACE_LANDSCAPE) || 216d5e9734f3ed493fd06c005f7a13bfd719c8062bdAndrew Flynn mDrawIdentifier.equals(WORKSPACE_LARGE)) { 2177d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung mBackground = getResources().getDrawable(R.drawable.bg_cling1); 2185966da2e2547ecdfb5d59bfcda8f66b4e2847803Winson Chung } else if (mDrawIdentifier.equals(ALLAPPS_PORTRAIT) || 219d016015c2396b885a7ba30f3678d5c50830c20bdWinson Chung mDrawIdentifier.equals(ALLAPPS_LANDSCAPE) || 220d016015c2396b885a7ba30f3678d5c50830c20bdWinson Chung mDrawIdentifier.equals(ALLAPPS_LARGE)) { 2217d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung mBackground = getResources().getDrawable(R.drawable.bg_cling2); 2225966da2e2547ecdfb5d59bfcda8f66b4e2847803Winson Chung } else if (mDrawIdentifier.equals(FOLDER_PORTRAIT) || 223a743d3526f95680328145c43736442e29f92f39eAndrew Flynn mDrawIdentifier.equals(FOLDER_LANDSCAPE)) { 2247d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung mBackground = getResources().getDrawable(R.drawable.bg_cling3); 225d016015c2396b885a7ba30f3678d5c50830c20bdWinson Chung } else if (mDrawIdentifier.equals(FOLDER_LARGE)) { 226d016015c2396b885a7ba30f3678d5c50830c20bdWinson Chung mBackground = getResources().getDrawable(R.drawable.bg_cling4); 227a743d3526f95680328145c43736442e29f92f39eAndrew Flynn } else if (mDrawIdentifier.equals(WORKSPACE_CUSTOM)) { 228a743d3526f95680328145c43736442e29f92f39eAndrew Flynn mBackground = getResources().getDrawable(R.drawable.bg_cling5); 2297d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung } 2307d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung } 2317d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung if (mBackground != null) { 2327d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung mBackground.setBounds(0, 0, getMeasuredWidth(), getMeasuredHeight()); 2337d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung mBackground.draw(c); 2347d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung } else { 2357d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung c.drawColor(0x99000000); 2367d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung } 23782f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung 23882f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung int cx = -1; 23982f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung int cy = -1; 2407d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung float scale = mRevealRadius / mPunchThroughGraphicCenterRadius; 24182f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung int dw = (int) (scale * mPunchThroughGraphic.getIntrinsicWidth()); 24282f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung int dh = (int) (scale * mPunchThroughGraphic.getIntrinsicHeight()); 24382f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung 2447d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung // Determine where to draw the punch through graphic 2452f5f945704a958470a51214399af9aee7bf6568dAndrew Flynn int[] positions = getPunchThroughPositions(); 2462f5f945704a958470a51214399af9aee7bf6568dAndrew Flynn for (int i = 0; i < positions.length; i += 2) { 2472f5f945704a958470a51214399af9aee7bf6568dAndrew Flynn cx = positions[i]; 2482f5f945704a958470a51214399af9aee7bf6568dAndrew Flynn cy = positions[i + 1]; 2492f5f945704a958470a51214399af9aee7bf6568dAndrew Flynn if (cx > -1 && cy > -1) { 2502f5f945704a958470a51214399af9aee7bf6568dAndrew Flynn c.drawCircle(cx, cy, mRevealRadius, mErasePaint); 2512f5f945704a958470a51214399af9aee7bf6568dAndrew Flynn mPunchThroughGraphic.setBounds(cx - dw/2, cy - dh/2, cx + dw/2, cy + dh/2); 2522f5f945704a958470a51214399af9aee7bf6568dAndrew Flynn mPunchThroughGraphic.draw(c); 2532f5f945704a958470a51214399af9aee7bf6568dAndrew Flynn } 25482f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung } 2557d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung 2567d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung // Draw the hand graphic in All Apps 2577d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung if (mDrawIdentifier.equals(ALLAPPS_PORTRAIT) || 258d016015c2396b885a7ba30f3678d5c50830c20bdWinson Chung mDrawIdentifier.equals(ALLAPPS_LANDSCAPE) || 259d016015c2396b885a7ba30f3678d5c50830c20bdWinson Chung mDrawIdentifier.equals(ALLAPPS_LARGE)) { 2607d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung if (mHandTouchGraphic == null) { 2617d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung mHandTouchGraphic = getResources().getDrawable(R.drawable.hand); 2627d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung } 2637a74ac9cd68db5e8bba87bbda43f73cea9c427c8Winson Chung int offset = mAppIconSize / 4; 2647d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung mHandTouchGraphic.setBounds(cx + offset, cy + offset, 2657d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung cx + mHandTouchGraphic.getIntrinsicWidth() + offset, 2667d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung cy + mHandTouchGraphic.getIntrinsicHeight() + offset); 2677d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung mHandTouchGraphic.draw(c); 2687d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung } 2697d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung 27082f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung canvas.drawBitmap(b, 0, 0, null); 27182f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung c.setBitmap(null); 27282f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung b = null; 27382f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung } 2747d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung 2757d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung // Draw the rest of the cling 2767d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung super.dispatchDraw(canvas); 27782f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung }; 27882f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung} 279