Cling.java revision d5e9734f3ed493fd06c005f7a13bfd719c8062bd
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; 3182f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chungimport android.widget.FrameLayout; 3282f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung 3382f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chungimport com.android.launcher.R; 3482f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung 3582f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chungpublic class Cling extends FrameLayout { 3682f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung 377d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung static final String WORKSPACE_CLING_DISMISSED_KEY = "cling.workspace.dismissed"; 387d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung static final String ALLAPPS_CLING_DISMISSED_KEY = "cling.allapps.dismissed"; 397d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung static final String FOLDER_CLING_DISMISSED_KEY = "cling.folder.dismissed"; 407d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung 4182f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung private static String WORKSPACE_PORTRAIT = "workspace_portrait"; 4282f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung private static String WORKSPACE_LANDSCAPE = "workspace_landscape"; 432f5f945704a958470a51214399af9aee7bf6568dAndrew Flynn private static String WORKSPACE_LARGE = "workspace_large"; 442f5f945704a958470a51214399af9aee7bf6568dAndrew Flynn private static String WORKSPACE_CUSTOM = "workspace_custom"; 452f5f945704a958470a51214399af9aee7bf6568dAndrew Flynn 4682f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung private static String ALLAPPS_PORTRAIT = "all_apps_portrait"; 4782f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung private static String ALLAPPS_LANDSCAPE = "all_apps_landscape"; 482f5f945704a958470a51214399af9aee7bf6568dAndrew Flynn private static String ALLAPPS_LARGE = "all_apps_large"; 492f5f945704a958470a51214399af9aee7bf6568dAndrew Flynn 507d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung private static String FOLDER_PORTRAIT = "folder_portrait"; 517d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung private static String FOLDER_LANDSCAPE = "folder_landscape"; 52d016015c2396b885a7ba30f3678d5c50830c20bdWinson Chung private static String FOLDER_LARGE = "folder_large"; 5382f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung 5482f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung private Launcher mLauncher; 5582f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung private boolean mIsInitialized; 5682f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung private String mDrawIdentifier; 577d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung private Drawable mBackground; 5882f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung private Drawable mPunchThroughGraphic; 597d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung private Drawable mHandTouchGraphic; 6082f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung private int mPunchThroughGraphicCenterRadius; 6182f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung private int mAppIconSize; 627d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung private int mButtonBarHeight; 637d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung private float mRevealRadius; 647d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung private int[] mPositionData; 657d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung 667d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung private Paint mErasePaint; 6782f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung 6882f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung public Cling(Context context) { 6982f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung this(context, null, 0); 7082f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung } 7182f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung 7282f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung public Cling(Context context, AttributeSet attrs) { 7382f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung this(context, attrs, 0); 7482f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung } 7582f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung 7682f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung public Cling(Context context, AttributeSet attrs, int defStyle) { 7782f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung super(context, attrs, defStyle); 7882f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung 7982f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.Cling, defStyle, 0); 8082f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung mDrawIdentifier = a.getString(R.styleable.Cling_drawIdentifier); 8182f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung a.recycle(); 8282f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung } 8382f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung 847d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung void init(Launcher l, int[] positionData) { 8582f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung if (!mIsInitialized) { 8682f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung mLauncher = l; 877d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung mPositionData = positionData; 8882f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung 8982f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung Resources r = getContext().getResources(); 902f5f945704a958470a51214399af9aee7bf6568dAndrew Flynn 9182f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung mPunchThroughGraphic = r.getDrawable(R.drawable.cling); 9282f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung mPunchThroughGraphicCenterRadius = 9382f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung r.getDimensionPixelSize(R.dimen.clingPunchThroughGraphicCenterRadius); 9482f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung mAppIconSize = r.getDimensionPixelSize(R.dimen.app_icon_size); 952f5f945704a958470a51214399af9aee7bf6568dAndrew Flynn mRevealRadius = r.getDimensionPixelSize(R.dimen.reveal_radius) * 1f; 967d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung mButtonBarHeight = r.getDimensionPixelSize(R.dimen.button_bar_height); 9782f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung 987d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung mErasePaint = new Paint(); 997d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung mErasePaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.MULTIPLY)); 1007d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung mErasePaint.setColor(0xFFFFFF); 1017d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung mErasePaint.setAlpha(0); 1027d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung 10382f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung mIsInitialized = true; 10482f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung } 10582f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung } 10682f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung 10782f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung void cleanup() { 1087d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung mBackground = null; 10982f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung mPunchThroughGraphic = null; 1107d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung mHandTouchGraphic = null; 1117d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung mIsInitialized = false; 1127d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung } 1137d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung 1142f5f945704a958470a51214399af9aee7bf6568dAndrew Flynn private int[] getPunchThroughPositions() { 1157d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung if (mDrawIdentifier.equals(WORKSPACE_PORTRAIT)) { 1167d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung return new int[]{getMeasuredWidth() / 2, getMeasuredHeight() - (mButtonBarHeight / 2)}; 1177d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung } else if (mDrawIdentifier.equals(WORKSPACE_LANDSCAPE)) { 1187d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung return new int[]{getMeasuredWidth() - (mButtonBarHeight / 2), getMeasuredHeight() / 2}; 119d016015c2396b885a7ba30f3678d5c50830c20bdWinson Chung } else if (mDrawIdentifier.equals(WORKSPACE_LARGE)) { 120d016015c2396b885a7ba30f3678d5c50830c20bdWinson Chung final float scale = LauncherApplication.getScreenDensity(); 121d016015c2396b885a7ba30f3678d5c50830c20bdWinson Chung final int cornerXOffset = (int) (scale * 15); 122d016015c2396b885a7ba30f3678d5c50830c20bdWinson Chung final int cornerYOffset = (int) (scale * 10); 123d016015c2396b885a7ba30f3678d5c50830c20bdWinson Chung return new int[]{getMeasuredWidth() - cornerXOffset, cornerYOffset}; 1247d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung } else if (mDrawIdentifier.equals(ALLAPPS_PORTRAIT) || 125d016015c2396b885a7ba30f3678d5c50830c20bdWinson Chung mDrawIdentifier.equals(ALLAPPS_LANDSCAPE) || 126d016015c2396b885a7ba30f3678d5c50830c20bdWinson Chung mDrawIdentifier.equals(ALLAPPS_LARGE)) { 1277d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung return mPositionData; 1287d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung } 1297d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung return new int[]{-1, -1}; 13082f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung } 13182f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung 13282f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung @Override 13382f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung public boolean onTouchEvent(android.view.MotionEvent event) { 1347d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung if (mDrawIdentifier.equals(WORKSPACE_PORTRAIT) || 1357d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung mDrawIdentifier.equals(WORKSPACE_LANDSCAPE) || 136d016015c2396b885a7ba30f3678d5c50830c20bdWinson Chung mDrawIdentifier.equals(WORKSPACE_LARGE) || 1377d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung mDrawIdentifier.equals(ALLAPPS_PORTRAIT) || 138d016015c2396b885a7ba30f3678d5c50830c20bdWinson Chung mDrawIdentifier.equals(ALLAPPS_LANDSCAPE) || 139d016015c2396b885a7ba30f3678d5c50830c20bdWinson Chung mDrawIdentifier.equals(ALLAPPS_LARGE)) { 1402f5f945704a958470a51214399af9aee7bf6568dAndrew Flynn 1412f5f945704a958470a51214399af9aee7bf6568dAndrew Flynn int[] positions = getPunchThroughPositions(); 1422f5f945704a958470a51214399af9aee7bf6568dAndrew Flynn for (int i = 0; i < positions.length; i += 2) { 1432f5f945704a958470a51214399af9aee7bf6568dAndrew Flynn double diff = Math.sqrt(Math.pow(event.getX() - positions[i], 2) + 1442f5f945704a958470a51214399af9aee7bf6568dAndrew Flynn Math.pow(event.getY() - positions[i + 1], 2)); 1452f5f945704a958470a51214399af9aee7bf6568dAndrew Flynn if (diff < mRevealRadius) { 1462f5f945704a958470a51214399af9aee7bf6568dAndrew Flynn return false; 1472f5f945704a958470a51214399af9aee7bf6568dAndrew Flynn } 1487d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung } 1497d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung } else if (mDrawIdentifier.equals(FOLDER_PORTRAIT) || 150d016015c2396b885a7ba30f3678d5c50830c20bdWinson Chung mDrawIdentifier.equals(FOLDER_LANDSCAPE) || 151d016015c2396b885a7ba30f3678d5c50830c20bdWinson Chung mDrawIdentifier.equals(FOLDER_LARGE)) { 1527d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung Folder f = mLauncher.getWorkspace().getOpenFolder(); 1537d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung if (f != null) { 1547d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung Rect r = new Rect(); 1557d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung f.getHitRect(r); 1567d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung if (r.contains((int) event.getX(), (int) event.getY())) { 1577d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung return false; 1587d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung } 1597d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung } 160d5e9734f3ed493fd06c005f7a13bfd719c8062bdAndrew Flynn } else if (mDrawIdentifier.equals(WORKSPACE_CUSTOM)) { 161d5e9734f3ed493fd06c005f7a13bfd719c8062bdAndrew Flynn // Let all touch events fall through 162d5e9734f3ed493fd06c005f7a13bfd719c8062bdAndrew Flynn return false; 1637d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung } 16482f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung return true; 16582f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung }; 16682f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung 16782f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung @Override 16882f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung protected void dispatchDraw(Canvas canvas) { 16982f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung if (mIsInitialized) { 17082f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung DisplayMetrics metrics = new DisplayMetrics(); 17182f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung mLauncher.getWindowManager().getDefaultDisplay().getMetrics(metrics); 17282f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung 1739d9d74f2b0927b9b28ac70d453c046d48788b57bWinson Chung // Initialize the draw buffer (to allow punching through) 17482f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung Bitmap b = Bitmap.createBitmap(getMeasuredWidth(), getMeasuredHeight(), 17582f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung Bitmap.Config.ARGB_8888); 17682f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung Canvas c = new Canvas(b); 1777d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung 1787d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung // Draw the background 1797d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung if (mBackground == null) { 1805966da2e2547ecdfb5d59bfcda8f66b4e2847803Winson Chung if (mDrawIdentifier.equals(WORKSPACE_PORTRAIT) || 1812f5f945704a958470a51214399af9aee7bf6568dAndrew Flynn mDrawIdentifier.equals(WORKSPACE_LANDSCAPE) || 182d5e9734f3ed493fd06c005f7a13bfd719c8062bdAndrew Flynn mDrawIdentifier.equals(WORKSPACE_LARGE)) { 1837d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung mBackground = getResources().getDrawable(R.drawable.bg_cling1); 1845966da2e2547ecdfb5d59bfcda8f66b4e2847803Winson Chung } else if (mDrawIdentifier.equals(ALLAPPS_PORTRAIT) || 185d016015c2396b885a7ba30f3678d5c50830c20bdWinson Chung mDrawIdentifier.equals(ALLAPPS_LANDSCAPE) || 186d016015c2396b885a7ba30f3678d5c50830c20bdWinson Chung mDrawIdentifier.equals(ALLAPPS_LARGE)) { 1877d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung mBackground = getResources().getDrawable(R.drawable.bg_cling2); 1885966da2e2547ecdfb5d59bfcda8f66b4e2847803Winson Chung } else if (mDrawIdentifier.equals(FOLDER_PORTRAIT) || 189d5e9734f3ed493fd06c005f7a13bfd719c8062bdAndrew Flynn mDrawIdentifier.equals(FOLDER_LANDSCAPE) || 190d5e9734f3ed493fd06c005f7a13bfd719c8062bdAndrew Flynn mDrawIdentifier.equals(WORKSPACE_CUSTOM)) { 1917d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung mBackground = getResources().getDrawable(R.drawable.bg_cling3); 192d016015c2396b885a7ba30f3678d5c50830c20bdWinson Chung } else if (mDrawIdentifier.equals(FOLDER_LARGE)) { 193d016015c2396b885a7ba30f3678d5c50830c20bdWinson Chung mBackground = getResources().getDrawable(R.drawable.bg_cling4); 1947d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung } 1957d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung } 1967d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung if (mBackground != null) { 1977d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung mBackground.setBounds(0, 0, getMeasuredWidth(), getMeasuredHeight()); 1987d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung mBackground.draw(c); 1997d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung } else { 2007d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung c.drawColor(0x99000000); 2017d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung } 20282f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung 20382f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung int cx = -1; 20482f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung int cy = -1; 2057d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung float scale = mRevealRadius / mPunchThroughGraphicCenterRadius; 20682f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung int dw = (int) (scale * mPunchThroughGraphic.getIntrinsicWidth()); 20782f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung int dh = (int) (scale * mPunchThroughGraphic.getIntrinsicHeight()); 20882f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung 2097d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung // Determine where to draw the punch through graphic 2102f5f945704a958470a51214399af9aee7bf6568dAndrew Flynn int[] positions = getPunchThroughPositions(); 2112f5f945704a958470a51214399af9aee7bf6568dAndrew Flynn for (int i = 0; i < positions.length; i += 2) { 2122f5f945704a958470a51214399af9aee7bf6568dAndrew Flynn cx = positions[i]; 2132f5f945704a958470a51214399af9aee7bf6568dAndrew Flynn cy = positions[i + 1]; 2142f5f945704a958470a51214399af9aee7bf6568dAndrew Flynn if (cx > -1 && cy > -1) { 2152f5f945704a958470a51214399af9aee7bf6568dAndrew Flynn c.drawCircle(cx, cy, mRevealRadius, mErasePaint); 2162f5f945704a958470a51214399af9aee7bf6568dAndrew Flynn mPunchThroughGraphic.setBounds(cx - dw/2, cy - dh/2, cx + dw/2, cy + dh/2); 2172f5f945704a958470a51214399af9aee7bf6568dAndrew Flynn mPunchThroughGraphic.draw(c); 2182f5f945704a958470a51214399af9aee7bf6568dAndrew Flynn } 21982f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung } 2207d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung 2217d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung // Draw the hand graphic in All Apps 2227d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung if (mDrawIdentifier.equals(ALLAPPS_PORTRAIT) || 223d016015c2396b885a7ba30f3678d5c50830c20bdWinson Chung mDrawIdentifier.equals(ALLAPPS_LANDSCAPE) || 224d016015c2396b885a7ba30f3678d5c50830c20bdWinson Chung mDrawIdentifier.equals(ALLAPPS_LARGE)) { 2257d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung if (mHandTouchGraphic == null) { 2267d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung mHandTouchGraphic = getResources().getDrawable(R.drawable.hand); 2277d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung } 2287a74ac9cd68db5e8bba87bbda43f73cea9c427c8Winson Chung int offset = mAppIconSize / 4; 2297d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung mHandTouchGraphic.setBounds(cx + offset, cy + offset, 2307d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung cx + mHandTouchGraphic.getIntrinsicWidth() + offset, 2317d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung cy + mHandTouchGraphic.getIntrinsicHeight() + offset); 2327d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung mHandTouchGraphic.draw(c); 2337d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung } 2347d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung 23582f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung canvas.drawBitmap(b, 0, 0, null); 23682f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung c.setBitmap(null); 23782f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung b = null; 23882f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung } 2397d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung 2407d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung // Draw the rest of the cling 2417d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung super.dispatchDraw(canvas); 24282f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung }; 24382f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung} 244