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; 3482f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chungimport android.widget.FrameLayout; 3582f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung 3682f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chungimport com.android.launcher.R; 3782f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung 3882f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chungpublic class Cling extends FrameLayout { 3982f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung 407d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung static final String WORKSPACE_CLING_DISMISSED_KEY = "cling.workspace.dismissed"; 417d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung static final String ALLAPPS_CLING_DISMISSED_KEY = "cling.allapps.dismissed"; 427d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung static final String FOLDER_CLING_DISMISSED_KEY = "cling.folder.dismissed"; 437d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung 4482f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung private static String WORKSPACE_PORTRAIT = "workspace_portrait"; 4582f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung private static String WORKSPACE_LANDSCAPE = "workspace_landscape"; 462f5f945704a958470a51214399af9aee7bf6568dAndrew Flynn private static String WORKSPACE_LARGE = "workspace_large"; 472f5f945704a958470a51214399af9aee7bf6568dAndrew Flynn private static String WORKSPACE_CUSTOM = "workspace_custom"; 482f5f945704a958470a51214399af9aee7bf6568dAndrew Flynn 4982f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung private static String ALLAPPS_PORTRAIT = "all_apps_portrait"; 5082f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung private static String ALLAPPS_LANDSCAPE = "all_apps_landscape"; 512f5f945704a958470a51214399af9aee7bf6568dAndrew Flynn private static String ALLAPPS_LARGE = "all_apps_large"; 522f5f945704a958470a51214399af9aee7bf6568dAndrew Flynn 537d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung private static String FOLDER_PORTRAIT = "folder_portrait"; 547d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung private static String FOLDER_LANDSCAPE = "folder_landscape"; 55d016015c2396b885a7ba30f3678d5c50830c20bdWinson Chung private static String FOLDER_LARGE = "folder_large"; 5682f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung 5782f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung private Launcher mLauncher; 5882f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung private boolean mIsInitialized; 5982f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung private String mDrawIdentifier; 607d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung private Drawable mBackground; 6182f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung private Drawable mPunchThroughGraphic; 627d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung private Drawable mHandTouchGraphic; 6382f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung private int mPunchThroughGraphicCenterRadius; 6482f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung private int mAppIconSize; 657d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung private int mButtonBarHeight; 667d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung private float mRevealRadius; 677d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung private int[] mPositionData; 687d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung 697d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung private Paint mErasePaint; 7082f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung 7182f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung public Cling(Context context) { 7282f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung this(context, null, 0); 7382f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung } 7482f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung 7582f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung public Cling(Context context, AttributeSet attrs) { 7682f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung this(context, attrs, 0); 7782f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung } 7882f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung 7982f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung public Cling(Context context, AttributeSet attrs, int defStyle) { 8082f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung super(context, attrs, defStyle); 8182f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung 8282f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.Cling, defStyle, 0); 8382f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung mDrawIdentifier = a.getString(R.styleable.Cling_drawIdentifier); 8482f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung a.recycle(); 859bc8eba3338455c5d915055e8ba044981c512dfaMichael Jurka 869bc8eba3338455c5d915055e8ba044981c512dfaMichael Jurka setClickable(true); 8782f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung } 8882f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung 897d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung void init(Launcher l, int[] positionData) { 9082f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung if (!mIsInitialized) { 9182f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung mLauncher = l; 927d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung mPositionData = positionData; 9382f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung 9482f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung Resources r = getContext().getResources(); 952f5f945704a958470a51214399af9aee7bf6568dAndrew Flynn 9682f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung mPunchThroughGraphic = r.getDrawable(R.drawable.cling); 9782f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung mPunchThroughGraphicCenterRadius = 9882f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung r.getDimensionPixelSize(R.dimen.clingPunchThroughGraphicCenterRadius); 9982f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung mAppIconSize = r.getDimensionPixelSize(R.dimen.app_icon_size); 1002f5f945704a958470a51214399af9aee7bf6568dAndrew Flynn mRevealRadius = r.getDimensionPixelSize(R.dimen.reveal_radius) * 1f; 1017d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung mButtonBarHeight = r.getDimensionPixelSize(R.dimen.button_bar_height); 10282f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung 1037d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung mErasePaint = new Paint(); 1047d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung mErasePaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.MULTIPLY)); 1057d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung mErasePaint.setColor(0xFFFFFF); 1067d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung mErasePaint.setAlpha(0); 1077d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung 10882f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung mIsInitialized = true; 10982f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung } 11082f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung } 11182f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung 11282f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung void cleanup() { 1137d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung mBackground = null; 11482f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung mPunchThroughGraphic = null; 1157d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung mHandTouchGraphic = null; 1167d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung mIsInitialized = false; 1177d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung } 1187d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung 119974c3864bb438fc924913e0017385f873332d052Michael Jurka public String getDrawIdentifier() { 120974c3864bb438fc924913e0017385f873332d052Michael Jurka return mDrawIdentifier; 121974c3864bb438fc924913e0017385f873332d052Michael Jurka } 122974c3864bb438fc924913e0017385f873332d052Michael Jurka 1232f5f945704a958470a51214399af9aee7bf6568dAndrew Flynn private int[] getPunchThroughPositions() { 1247d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung if (mDrawIdentifier.equals(WORKSPACE_PORTRAIT)) { 1257d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung return new int[]{getMeasuredWidth() / 2, getMeasuredHeight() - (mButtonBarHeight / 2)}; 1267d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung } else if (mDrawIdentifier.equals(WORKSPACE_LANDSCAPE)) { 1277d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung return new int[]{getMeasuredWidth() - (mButtonBarHeight / 2), getMeasuredHeight() / 2}; 128d016015c2396b885a7ba30f3678d5c50830c20bdWinson Chung } else if (mDrawIdentifier.equals(WORKSPACE_LARGE)) { 129d016015c2396b885a7ba30f3678d5c50830c20bdWinson Chung final float scale = LauncherApplication.getScreenDensity(); 130d016015c2396b885a7ba30f3678d5c50830c20bdWinson Chung final int cornerXOffset = (int) (scale * 15); 131d016015c2396b885a7ba30f3678d5c50830c20bdWinson Chung final int cornerYOffset = (int) (scale * 10); 132d016015c2396b885a7ba30f3678d5c50830c20bdWinson Chung return new int[]{getMeasuredWidth() - cornerXOffset, cornerYOffset}; 1337d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung } else if (mDrawIdentifier.equals(ALLAPPS_PORTRAIT) || 134d016015c2396b885a7ba30f3678d5c50830c20bdWinson Chung mDrawIdentifier.equals(ALLAPPS_LANDSCAPE) || 135d016015c2396b885a7ba30f3678d5c50830c20bdWinson Chung mDrawIdentifier.equals(ALLAPPS_LARGE)) { 1367d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung return mPositionData; 1377d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung } 1387d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung return new int[]{-1, -1}; 13982f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung } 14082f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung 14182f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung @Override 14255d225d50e68b3ea629c45a53d6744b52e335134Svetoslav Ganov public View focusSearch(int direction) { 1439bc8eba3338455c5d915055e8ba044981c512dfaMichael Jurka return this.focusSearch(this, direction); 14455d225d50e68b3ea629c45a53d6744b52e335134Svetoslav Ganov } 14555d225d50e68b3ea629c45a53d6744b52e335134Svetoslav Ganov 14655d225d50e68b3ea629c45a53d6744b52e335134Svetoslav Ganov @Override 14755d225d50e68b3ea629c45a53d6744b52e335134Svetoslav Ganov public View focusSearch(View focused, int direction) { 14855d225d50e68b3ea629c45a53d6744b52e335134Svetoslav Ganov return FocusFinder.getInstance().findNextFocus(this, focused, direction); 14955d225d50e68b3ea629c45a53d6744b52e335134Svetoslav Ganov } 15055d225d50e68b3ea629c45a53d6744b52e335134Svetoslav Ganov 15155d225d50e68b3ea629c45a53d6744b52e335134Svetoslav Ganov @Override 15255d225d50e68b3ea629c45a53d6744b52e335134Svetoslav Ganov public boolean onHoverEvent(MotionEvent event) { 15355d225d50e68b3ea629c45a53d6744b52e335134Svetoslav Ganov return (mDrawIdentifier.equals(WORKSPACE_PORTRAIT) 15455d225d50e68b3ea629c45a53d6744b52e335134Svetoslav Ganov || mDrawIdentifier.equals(WORKSPACE_LANDSCAPE) 15555d225d50e68b3ea629c45a53d6744b52e335134Svetoslav Ganov || mDrawIdentifier.equals(WORKSPACE_LARGE) 15655d225d50e68b3ea629c45a53d6744b52e335134Svetoslav Ganov || mDrawIdentifier.equals(ALLAPPS_PORTRAIT) 15755d225d50e68b3ea629c45a53d6744b52e335134Svetoslav Ganov || mDrawIdentifier.equals(ALLAPPS_LANDSCAPE) 15855d225d50e68b3ea629c45a53d6744b52e335134Svetoslav Ganov || mDrawIdentifier.equals(ALLAPPS_LARGE) 15955d225d50e68b3ea629c45a53d6744b52e335134Svetoslav Ganov || mDrawIdentifier.equals(WORKSPACE_CUSTOM)); 16055d225d50e68b3ea629c45a53d6744b52e335134Svetoslav Ganov } 16155d225d50e68b3ea629c45a53d6744b52e335134Svetoslav Ganov 16255d225d50e68b3ea629c45a53d6744b52e335134Svetoslav Ganov @Override 16382f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung public boolean onTouchEvent(android.view.MotionEvent event) { 1647d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung if (mDrawIdentifier.equals(WORKSPACE_PORTRAIT) || 1657d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung mDrawIdentifier.equals(WORKSPACE_LANDSCAPE) || 166d016015c2396b885a7ba30f3678d5c50830c20bdWinson Chung mDrawIdentifier.equals(WORKSPACE_LARGE) || 1677d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung mDrawIdentifier.equals(ALLAPPS_PORTRAIT) || 168d016015c2396b885a7ba30f3678d5c50830c20bdWinson Chung mDrawIdentifier.equals(ALLAPPS_LANDSCAPE) || 169d016015c2396b885a7ba30f3678d5c50830c20bdWinson Chung mDrawIdentifier.equals(ALLAPPS_LARGE)) { 1702f5f945704a958470a51214399af9aee7bf6568dAndrew Flynn 1712f5f945704a958470a51214399af9aee7bf6568dAndrew Flynn int[] positions = getPunchThroughPositions(); 1722f5f945704a958470a51214399af9aee7bf6568dAndrew Flynn for (int i = 0; i < positions.length; i += 2) { 1732f5f945704a958470a51214399af9aee7bf6568dAndrew Flynn double diff = Math.sqrt(Math.pow(event.getX() - positions[i], 2) + 1742f5f945704a958470a51214399af9aee7bf6568dAndrew Flynn Math.pow(event.getY() - positions[i + 1], 2)); 1752f5f945704a958470a51214399af9aee7bf6568dAndrew Flynn if (diff < mRevealRadius) { 1762f5f945704a958470a51214399af9aee7bf6568dAndrew Flynn return false; 1772f5f945704a958470a51214399af9aee7bf6568dAndrew Flynn } 1787d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung } 1797d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung } else if (mDrawIdentifier.equals(FOLDER_PORTRAIT) || 180d016015c2396b885a7ba30f3678d5c50830c20bdWinson Chung mDrawIdentifier.equals(FOLDER_LANDSCAPE) || 181d016015c2396b885a7ba30f3678d5c50830c20bdWinson Chung mDrawIdentifier.equals(FOLDER_LARGE)) { 1827d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung Folder f = mLauncher.getWorkspace().getOpenFolder(); 1837d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung if (f != null) { 1847d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung Rect r = new Rect(); 1857d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung f.getHitRect(r); 1867d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung if (r.contains((int) event.getX(), (int) event.getY())) { 1877d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung return false; 1887d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung } 1897d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung } 1907d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung } 19182f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung return true; 19282f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung }; 19382f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung 19482f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung @Override 19582f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung protected void dispatchDraw(Canvas canvas) { 19682f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung if (mIsInitialized) { 19782f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung DisplayMetrics metrics = new DisplayMetrics(); 19882f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung mLauncher.getWindowManager().getDefaultDisplay().getMetrics(metrics); 19982f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung 2009d9d74f2b0927b9b28ac70d453c046d48788b57bWinson Chung // Initialize the draw buffer (to allow punching through) 20182f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung Bitmap b = Bitmap.createBitmap(getMeasuredWidth(), getMeasuredHeight(), 20282f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung Bitmap.Config.ARGB_8888); 20382f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung Canvas c = new Canvas(b); 2047d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung 2057d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung // Draw the background 2067d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung if (mBackground == null) { 2075966da2e2547ecdfb5d59bfcda8f66b4e2847803Winson Chung if (mDrawIdentifier.equals(WORKSPACE_PORTRAIT) || 2082f5f945704a958470a51214399af9aee7bf6568dAndrew Flynn mDrawIdentifier.equals(WORKSPACE_LANDSCAPE) || 209d5e9734f3ed493fd06c005f7a13bfd719c8062bdAndrew Flynn mDrawIdentifier.equals(WORKSPACE_LARGE)) { 2107d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung mBackground = getResources().getDrawable(R.drawable.bg_cling1); 2115966da2e2547ecdfb5d59bfcda8f66b4e2847803Winson Chung } else if (mDrawIdentifier.equals(ALLAPPS_PORTRAIT) || 212d016015c2396b885a7ba30f3678d5c50830c20bdWinson Chung mDrawIdentifier.equals(ALLAPPS_LANDSCAPE) || 213d016015c2396b885a7ba30f3678d5c50830c20bdWinson Chung mDrawIdentifier.equals(ALLAPPS_LARGE)) { 2147d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung mBackground = getResources().getDrawable(R.drawable.bg_cling2); 2155966da2e2547ecdfb5d59bfcda8f66b4e2847803Winson Chung } else if (mDrawIdentifier.equals(FOLDER_PORTRAIT) || 216a743d3526f95680328145c43736442e29f92f39eAndrew Flynn mDrawIdentifier.equals(FOLDER_LANDSCAPE)) { 2177d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung mBackground = getResources().getDrawable(R.drawable.bg_cling3); 218d016015c2396b885a7ba30f3678d5c50830c20bdWinson Chung } else if (mDrawIdentifier.equals(FOLDER_LARGE)) { 219d016015c2396b885a7ba30f3678d5c50830c20bdWinson Chung mBackground = getResources().getDrawable(R.drawable.bg_cling4); 220a743d3526f95680328145c43736442e29f92f39eAndrew Flynn } else if (mDrawIdentifier.equals(WORKSPACE_CUSTOM)) { 221a743d3526f95680328145c43736442e29f92f39eAndrew Flynn mBackground = getResources().getDrawable(R.drawable.bg_cling5); 2227d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung } 2237d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung } 2247d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung if (mBackground != null) { 2257d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung mBackground.setBounds(0, 0, getMeasuredWidth(), getMeasuredHeight()); 2267d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung mBackground.draw(c); 2277d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung } else { 2287d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung c.drawColor(0x99000000); 2297d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung } 23082f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung 23182f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung int cx = -1; 23282f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung int cy = -1; 2337d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung float scale = mRevealRadius / mPunchThroughGraphicCenterRadius; 23482f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung int dw = (int) (scale * mPunchThroughGraphic.getIntrinsicWidth()); 23582f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung int dh = (int) (scale * mPunchThroughGraphic.getIntrinsicHeight()); 23682f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung 2377d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung // Determine where to draw the punch through graphic 2382f5f945704a958470a51214399af9aee7bf6568dAndrew Flynn int[] positions = getPunchThroughPositions(); 2392f5f945704a958470a51214399af9aee7bf6568dAndrew Flynn for (int i = 0; i < positions.length; i += 2) { 2402f5f945704a958470a51214399af9aee7bf6568dAndrew Flynn cx = positions[i]; 2412f5f945704a958470a51214399af9aee7bf6568dAndrew Flynn cy = positions[i + 1]; 2422f5f945704a958470a51214399af9aee7bf6568dAndrew Flynn if (cx > -1 && cy > -1) { 2432f5f945704a958470a51214399af9aee7bf6568dAndrew Flynn c.drawCircle(cx, cy, mRevealRadius, mErasePaint); 2442f5f945704a958470a51214399af9aee7bf6568dAndrew Flynn mPunchThroughGraphic.setBounds(cx - dw/2, cy - dh/2, cx + dw/2, cy + dh/2); 2452f5f945704a958470a51214399af9aee7bf6568dAndrew Flynn mPunchThroughGraphic.draw(c); 2462f5f945704a958470a51214399af9aee7bf6568dAndrew Flynn } 24782f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung } 2487d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung 2497d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung // Draw the hand graphic in All Apps 2507d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung if (mDrawIdentifier.equals(ALLAPPS_PORTRAIT) || 251d016015c2396b885a7ba30f3678d5c50830c20bdWinson Chung mDrawIdentifier.equals(ALLAPPS_LANDSCAPE) || 252d016015c2396b885a7ba30f3678d5c50830c20bdWinson Chung mDrawIdentifier.equals(ALLAPPS_LARGE)) { 2537d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung if (mHandTouchGraphic == null) { 2547d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung mHandTouchGraphic = getResources().getDrawable(R.drawable.hand); 2557d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung } 2567a74ac9cd68db5e8bba87bbda43f73cea9c427c8Winson Chung int offset = mAppIconSize / 4; 2577d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung mHandTouchGraphic.setBounds(cx + offset, cy + offset, 2587d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung cx + mHandTouchGraphic.getIntrinsicWidth() + offset, 2597d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung cy + mHandTouchGraphic.getIntrinsicHeight() + offset); 2607d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung mHandTouchGraphic.draw(c); 2617d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung } 2627d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung 26382f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung canvas.drawBitmap(b, 0, 0, null); 26482f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung c.setBitmap(null); 26582f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung b = null; 26682f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung } 2677d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung 2687d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung // Draw the rest of the cling 2697d7541e7b48fdc114c24b3b0aa75e70d7228041eWinson Chung super.dispatchDraw(canvas); 27082f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung }; 27182f5553a137f0a25f7333a6fc9507c847b7a42edWinson Chung} 272