Workspace.java revision 0142d49e1378a7155bcca1fb59965d9e73016dbc
131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project/* 231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project 331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * 431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * you may not use this file except in compliance with the License. 631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * You may obtain a copy of the License at 731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * 831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * 1031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 1131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 1231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * See the License for the specific language governing permissions and 1431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * limitations under the License. 1531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project */ 1631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 17a5902524d4403885eb4c50360bf3465c6be796efJoe Onoratopackage com.android.launcher2; 1831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 19af44209bfa60da3c7ab49b7f508f9effd316ee41Michael Jurkaimport com.android.launcher.R; 20495f2892288504f4ab87e62957b3f71144dd73c2Adam Powell 21dee0589388ba0f6373912e18bf86243282fb3b9bMichael Jurkaimport android.animation.Animatable; 22dee0589388ba0f6373912e18bf86243282fb3b9bMichael Jurkaimport android.animation.PropertyAnimator; 23df7c3a7853abd4dec460247370fe0b17b50866acPatrick Dubroyimport android.animation.PropertyValuesHolder; 24dee0589388ba0f6373912e18bf86243282fb3b9bMichael Jurkaimport android.animation.Sequencer; 250142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurkaimport android.animation.Animatable.AnimatableListener; 268f573952b8729b4319043ae0908997ecd2d68951Dianne Hackbornimport android.app.WallpaperManager; 27629de3ef739883c0962423cc0c3a26299f162d3dRomain Guyimport android.appwidget.AppWidgetManager; 28629de3ef739883c0962423cc0c3a26299f162d3dRomain Guyimport android.appwidget.AppWidgetProviderInfo; 29495f2892288504f4ab87e62957b3f71144dd73c2Adam Powellimport android.content.ComponentName; 3031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectimport android.content.Context; 3131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectimport android.content.Intent; 32495f2892288504f4ab87e62957b3f71144dd73c2Adam Powellimport android.content.pm.PackageManager; 335c16f3ecd6b47bff3abbe40deb3d39c66a3b0012Romain Guyimport android.content.pm.ProviderInfo; 347247f6315baf16eacb3286f21bd80321385c1defPatrick Dubroyimport android.content.res.Resources; 3531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectimport android.content.res.TypedArray; 3631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectimport android.graphics.Canvas; 37a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurkaimport android.graphics.Matrix; 3831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectimport android.graphics.Rect; 39f96811cdf564469a7a654a0c876288c9fd14f35eThe Android Open Source Projectimport android.graphics.drawable.Drawable; 405c16f3ecd6b47bff3abbe40deb3d39c66a3b0012Romain Guyimport android.net.Uri; 41956091ba7863bd72086275e61084864994dd6fa7Joe Onoratoimport android.os.IBinder; 42495f2892288504f4ab87e62957b3f71144dd73c2Adam Powellimport android.os.Parcelable; 4331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectimport android.util.AttributeSet; 44291ad12232c98e383d44d76ffe09e97e204c61bcDaniel Sandlerimport android.util.Log; 4531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectimport android.view.MotionEvent; 4631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectimport android.view.View; 4731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectimport android.view.ViewGroup; 48f96811cdf564469a7a654a0c876288c9fd14f35eThe Android Open Source Projectimport android.widget.TextView; 490e26059548e429e5d1c973bebe4c561bead2926fMichael Jurkaimport android.widget.Toast; 5031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 51af44209bfa60da3c7ab49b7f508f9effd316ee41Michael Jurkaimport java.util.ArrayList; 52af44209bfa60da3c7ab49b7f508f9effd316ee41Michael Jurkaimport java.util.HashSet; 53edcce099c98a6c40d10109ac092ab50f9d2668f3Romain Guy 5431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project/** 550142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka * The workspace is a wide area with a wallpaper and a finite number of pages. 560142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka * Each page contains a number of icons, folders or widgets the user can 57aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung * interact with. A workspace is meant to be used with a fixed width only. 5831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project */ 590142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurkapublic class Workspace extends SmoothPagedView 60dee0589388ba0f6373912e18bf86243282fb3b9bMichael Jurka implements DropTarget, DragSource, DragScroller, View.OnTouchListener { 61e47f55c30b9c24f01f2be861247c92f17fbe4a61Romain Guy @SuppressWarnings({"UnusedDeclaration"}) 623a8820bdbad90642cf5cda4b00a8c92ecb699159Joe Onorato private static final String TAG = "Launcher.Workspace"; 630142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka 64dee0589388ba0f6373912e18bf86243282fb3b9bMichael Jurka // This is how much the workspace shrinks when we enter all apps or 65dee0589388ba0f6373912e18bf86243282fb3b9bMichael Jurka // customization mode 66dee0589388ba0f6373912e18bf86243282fb3b9bMichael Jurka private static final float SHRINK_FACTOR = 0.16f; 670142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka private enum ShrinkPosition { SHRINK_TO_TOP, SHRINK_TO_MIDDLE, SHRINK_TO_BOTTOM }; 6831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 698f573952b8729b4319043ae0908997ecd2d68951Dianne Hackborn private final WallpaperManager mWallpaperManager; 70aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung 710142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka private int mDefaultPage; 7231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 7379212d81361d1ad8c941c48f8323eb526643ca68Michael Jurka private boolean mWaitingToShrinkToBottom = false; 7431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 7531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project /** 7631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * CellInfo for the cell that is currently being dragged 7731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project */ 7831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project private CellLayout.CellInfo mDragInfo; 79aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung 8070864289fba6daf07b8de98524cdfb765a62552dJeff Sharkey /** 8170864289fba6daf07b8de98524cdfb765a62552dJeff Sharkey * Target drop area calculated during last acceptDrop call. 8270864289fba6daf07b8de98524cdfb765a62552dJeff Sharkey */ 8370864289fba6daf07b8de98524cdfb765a62552dJeff Sharkey private int[] mTargetCell = null; 8431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 856569f2c80e179c2f8ed73dae6b01d971ec20f005Patrick Dubroy /** 866569f2c80e179c2f8ed73dae6b01d971ec20f005Patrick Dubroy * The CellLayout that is currently being dragged over 876569f2c80e179c2f8ed73dae6b01d971ec20f005Patrick Dubroy */ 886569f2c80e179c2f8ed73dae6b01d971ec20f005Patrick Dubroy private CellLayout mDragTargetLayout = null; 896569f2c80e179c2f8ed73dae6b01d971ec20f005Patrick Dubroy 9031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project private Launcher mLauncher; 910589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato private IconCache mIconCache; 9200acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato private DragController mDragController; 93aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung 94aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung 9531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project private int[] mTempCell = new int[2]; 9670864289fba6daf07b8de98524cdfb765a62552dJeff Sharkey private int[] mTempEstimate = new int[2]; 97a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka private float[] mTempDragCoordinates = new float[2]; 98a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka private float[] mTempDragBottomRightCoordinates = new float[2]; 9931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 100d22015cd37ea6ef53762eca5be57daca123ff607Adam Cohen private static final int DEFAULT_CELL_COUNT_X = 4; 101d22015cd37ea6ef53762eca5be57daca123ff607Adam Cohen private static final int DEFAULT_CELL_COUNT_Y = 4; 10231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 1038a73c51ee87b6d9b12daba188034889caf7a905bRomain Guy private Drawable mPreviousIndicator; 1048a73c51ee87b6d9b12daba188034889caf7a905bRomain Guy private Drawable mNextIndicator; 105aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung 1060142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka // State variable that indicated whether the pages are small (ie when you're 107dee0589388ba0f6373912e18bf86243282fb3b9bMichael Jurka // in all apps or customize mode) 108dee0589388ba0f6373912e18bf86243282fb3b9bMichael Jurka private boolean mIsSmall; 109dee0589388ba0f6373912e18bf86243282fb3b9bMichael Jurka private AnimatableListener mUnshrinkAnimationListener; 110dee0589388ba0f6373912e18bf86243282fb3b9bMichael Jurka 111aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung 11231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project /** 11331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * Used to inflate the Workspace from XML. 11431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * 11531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * @param context The application's context. 1160142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka * @param attrs The attributes set containing the Workspace's customization values. 11731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project */ 11831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project public Workspace(Context context, AttributeSet attrs) { 11931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project this(context, attrs, 0); 12031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 12131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 12231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project /** 12331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * Used to inflate the Workspace from XML. 12431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * 12531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * @param context The application's context. 1260142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka * @param attrs The attributes set containing the Workspace's customization values. 12731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * @param defStyle Unused. 12831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project */ 12931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project public Workspace(Context context, AttributeSet attrs, int defStyle) { 13031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project super(context, attrs, defStyle); 1310142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka mContentIsRefreshable = false; 1320142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka mFadeInAdjacentScreens = false; 13331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 1348f573952b8729b4319043ae0908997ecd2d68951Dianne Hackborn mWallpaperManager = WallpaperManager.getInstance(context); 135aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung 136aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung TypedArray a = context.obtainStyledAttributes(attrs, 137aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung R.styleable.Workspace, defStyle, 0); 138d22015cd37ea6ef53762eca5be57daca123ff607Adam Cohen int cellCountX = a.getInt(R.styleable.Workspace_cellCountX, DEFAULT_CELL_COUNT_X); 139d22015cd37ea6ef53762eca5be57daca123ff607Adam Cohen int cellCountY = a.getInt(R.styleable.Workspace_cellCountY, DEFAULT_CELL_COUNT_Y); 1400142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka mDefaultPage = a.getInt(R.styleable.Workspace_defaultScreen, 1); 14131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project a.recycle(); 14231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 143d22015cd37ea6ef53762eca5be57daca123ff607Adam Cohen LauncherModel.updateWorkspaceLayoutCells(cellCountX, cellCountY); 1440d44e9482b95d8f163b28bf20131c4349185b589Joe Onorato setHapticFeedbackEnabled(false); 1450142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka 14631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project initWorkspace(); 14731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 14831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 14931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project /** 15031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * Initializes various states for this workspace. 15131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project */ 1520142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka protected void initWorkspace() { 1530589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato Context context = getContext(); 1540142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka mCurrentPage = mDefaultPage; 1550142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka Launcher.setScreen(mCurrentPage); 1560589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato LauncherApplication app = (LauncherApplication)context.getApplicationContext(); 1570589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato mIconCache = app.getIconCache(); 15831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 159dee0589388ba0f6373912e18bf86243282fb3b9bMichael Jurka mUnshrinkAnimationListener = new AnimatableListener() { 160dee0589388ba0f6373912e18bf86243282fb3b9bMichael Jurka public void onAnimationStart(Animatable animation) {} 161dee0589388ba0f6373912e18bf86243282fb3b9bMichael Jurka public void onAnimationEnd(Animatable animation) { 162dee0589388ba0f6373912e18bf86243282fb3b9bMichael Jurka mIsSmall = false; 163dee0589388ba0f6373912e18bf86243282fb3b9bMichael Jurka } 164dee0589388ba0f6373912e18bf86243282fb3b9bMichael Jurka public void onAnimationCancel(Animatable animation) {} 165dee0589388ba0f6373912e18bf86243282fb3b9bMichael Jurka public void onAnimationRepeat(Animatable animation) {} 166dee0589388ba0f6373912e18bf86243282fb3b9bMichael Jurka }; 1670142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka 1680142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka mSnapVelocity = 600; 16931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 17031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 17131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project @Override 17231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project public void addView(View child, int index, LayoutParams params) { 17331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project if (!(child instanceof CellLayout)) { 17431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project throw new IllegalArgumentException("A Workspace can only have CellLayout children."); 17531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 17631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project super.addView(child, index, params); 17731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 17831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 17931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project @Override 18031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project public void addView(View child) { 18131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project if (!(child instanceof CellLayout)) { 18231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project throw new IllegalArgumentException("A Workspace can only have CellLayout children."); 18331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 18431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project super.addView(child); 18531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 18631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 18731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project @Override 18831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project public void addView(View child, int index) { 18931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project if (!(child instanceof CellLayout)) { 19031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project throw new IllegalArgumentException("A Workspace can only have CellLayout children."); 19131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 19231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project super.addView(child, index); 19331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 19431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 19531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project @Override 19631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project public void addView(View child, int width, int height) { 19731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project if (!(child instanceof CellLayout)) { 19831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project throw new IllegalArgumentException("A Workspace can only have CellLayout children."); 19931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 20031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project super.addView(child, width, height); 20131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 20231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 20331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project @Override 20431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project public void addView(View child, LayoutParams params) { 20531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project if (!(child instanceof CellLayout)) { 20631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project throw new IllegalArgumentException("A Workspace can only have CellLayout children."); 20731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 20831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project super.addView(child, params); 20931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 21031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 21131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project /** 21231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * @return The open folder on the current screen, or null if there is none 21331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project */ 21431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project Folder getOpenFolder() { 2150142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka CellLayout currentPage = (CellLayout) getChildAt(mCurrentPage); 2160142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka int count = currentPage.getChildCount(); 21731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project for (int i = 0; i < count; i++) { 2180142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka View child = currentPage.getChildAt(i); 219aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung if (child instanceof Folder) { 220aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung Folder folder = (Folder) child; 221aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung if (folder.getInfo().opened) 222aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung return folder; 22331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 22431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 22531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project return null; 22631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 22731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 22831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project ArrayList<Folder> getOpenFolders() { 229dee0589388ba0f6373912e18bf86243282fb3b9bMichael Jurka final int screenCount = getChildCount(); 230dee0589388ba0f6373912e18bf86243282fb3b9bMichael Jurka ArrayList<Folder> folders = new ArrayList<Folder>(screenCount); 23131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 232dee0589388ba0f6373912e18bf86243282fb3b9bMichael Jurka for (int screen = 0; screen < screenCount; screen++) { 2330142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka CellLayout currentPage = (CellLayout) getChildAt(screen); 2340142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka int count = currentPage.getChildCount(); 23531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project for (int i = 0; i < count; i++) { 2360142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka View child = currentPage.getChildAt(i); 237aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung if (child instanceof Folder) { 238aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung Folder folder = (Folder) child; 239aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung if (folder.getInfo().opened) 240aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung folders.add(folder); 24131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project break; 24231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 24331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 24431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 24531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 24631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project return folders; 24731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 24831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 2490142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka boolean isDefaultPageShowing() { 2500142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka return mCurrentPage == mDefaultPage; 25131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 25231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 25331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project /** 25431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * Sets the current screen. 25531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * 2560142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka * @param currentPage 25731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project */ 2580142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka @Override 2590142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka void setCurrentPage(int currentPage) { 2600142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka super.setCurrentPage(currentPage); 2610142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka updateWallpaperOffset(mScrollX); 26231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 26331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 26431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project /** 26531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * Adds the specified child in the current screen. The position and dimension of 26631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * the child are defined by x, y, spanX and spanY. 26731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * 26831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * @param child The child to add in one of the workspace's screens. 26931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * @param x The X position of the child in the screen's grid. 27031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * @param y The Y position of the child in the screen's grid. 27131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * @param spanX The number of cells spanned horizontally by the child. 27231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * @param spanY The number of cells spanned vertically by the child. 27331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project */ 27431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project void addInCurrentScreen(View child, int x, int y, int spanX, int spanY) { 2750142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka addInScreen(child, mCurrentPage, x, y, spanX, spanY, false); 27631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 27731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 27831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project /** 27931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * Adds the specified child in the current screen. The position and dimension of 28031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * the child are defined by x, y, spanX and spanY. 28131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * 28231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * @param child The child to add in one of the workspace's screens. 28331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * @param x The X position of the child in the screen's grid. 28431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * @param y The Y position of the child in the screen's grid. 28531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * @param spanX The number of cells spanned horizontally by the child. 28631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * @param spanY The number of cells spanned vertically by the child. 28731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * @param insert When true, the child is inserted at the beginning of the children list. 28831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project */ 28931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project void addInCurrentScreen(View child, int x, int y, int spanX, int spanY, boolean insert) { 2900142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka addInScreen(child, mCurrentPage, x, y, spanX, spanY, insert); 29131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 29231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 29331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project /** 29431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * Adds the specified child in the specified screen. The position and dimension of 29531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * the child are defined by x, y, spanX and spanY. 29631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * 29731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * @param child The child to add in one of the workspace's screens. 29831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * @param screen The screen in which to add the child. 29931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * @param x The X position of the child in the screen's grid. 30031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * @param y The Y position of the child in the screen's grid. 30131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * @param spanX The number of cells spanned horizontally by the child. 30231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * @param spanY The number of cells spanned vertically by the child. 30331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project */ 30431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project void addInScreen(View child, int screen, int x, int y, int spanX, int spanY) { 30531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project addInScreen(child, screen, x, y, spanX, spanY, false); 30631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 30731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 308aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung void addInFullScreen(View child, int screen) { 309aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung addInScreen(child, screen, 0, 0, -1, -1); 310aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung } 311aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung 31231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project /** 31331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * Adds the specified child in the specified screen. The position and dimension of 31431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * the child are defined by x, y, spanX and spanY. 31531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * 31631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * @param child The child to add in one of the workspace's screens. 31731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * @param screen The screen in which to add the child. 31831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * @param x The X position of the child in the screen's grid. 31931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * @param y The Y position of the child in the screen's grid. 32031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * @param spanX The number of cells spanned horizontally by the child. 32131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * @param spanY The number of cells spanned vertically by the child. 32231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * @param insert When true, the child is inserted at the beginning of the children list. 32331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project */ 32431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project void addInScreen(View child, int screen, int x, int y, int spanX, int spanY, boolean insert) { 32531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project if (screen < 0 || screen >= getChildCount()) { 326291ad12232c98e383d44d76ffe09e97e204c61bcDaniel Sandler Log.e(TAG, "The screen must be >= 0 and < " + getChildCount() 327291ad12232c98e383d44d76ffe09e97e204c61bcDaniel Sandler + " (was " + screen + "); skipping child"); 328291ad12232c98e383d44d76ffe09e97e204c61bcDaniel Sandler return; 32931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 33031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 33131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project final CellLayout group = (CellLayout) getChildAt(screen); 33231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project CellLayout.LayoutParams lp = (CellLayout.LayoutParams) child.getLayoutParams(); 33331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project if (lp == null) { 33431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project lp = new CellLayout.LayoutParams(x, y, spanX, spanY); 33531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } else { 33631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project lp.cellX = x; 33731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project lp.cellY = y; 33831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project lp.cellHSpan = spanX; 33931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project lp.cellVSpan = spanY; 34031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 341aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung 3426569f2c80e179c2f8ed73dae6b01d971ec20f005Patrick Dubroy // Get the canonical child id to uniquely represent this view in this screen 343d22015cd37ea6ef53762eca5be57daca123ff607Adam Cohen int childId = LauncherModel.getCellLayoutChildId(child.getId(), screen, x, y, spanX, spanY); 344aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung if (!group.addViewToCellLayout(child, insert ? 0 : -1, childId, lp)) { 345aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung // TODO: This branch occurs when the workspace is adding views 346aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung // outside of the defined grid 3476569f2c80e179c2f8ed73dae6b01d971ec20f005Patrick Dubroy // maybe we should be deleting these items from the LauncherModel? 348aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung Log.w(TAG, "Failed to add to item at (" + lp.cellX + "," + lp.cellY + ") to CellLayout"); 349aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung } 350aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung 35131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project if (!(child instanceof Folder)) { 3520d44e9482b95d8f163b28bf20131c4349185b589Joe Onorato child.setHapticFeedbackEnabled(false); 35331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project child.setOnLongClickListener(mLongClickListener); 35431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 35500acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato if (child instanceof DropTarget) { 356aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung mDragController.addDropTarget((DropTarget) child); 35700acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato } 35831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 35931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 360a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka CellLayout.CellInfo updateOccupiedCellsForCurrentScreen(boolean[] occupied) { 3610142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka CellLayout group = (CellLayout) getChildAt(mCurrentPage); 36231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project if (group != null) { 363c28de51eedb26848abf9245ddd19e021d30be318Michael Jurka return group.updateOccupiedCells(occupied, null); 36431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 36531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project return null; 36631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 36731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 368dee0589388ba0f6373912e18bf86243282fb3b9bMichael Jurka public boolean onTouch(View v, MotionEvent event) { 369dee0589388ba0f6373912e18bf86243282fb3b9bMichael Jurka // this is an intercepted event being forwarded from a cell layout 370dee0589388ba0f6373912e18bf86243282fb3b9bMichael Jurka if (mIsSmall) { 371dee0589388ba0f6373912e18bf86243282fb3b9bMichael Jurka unshrink((CellLayout)v); 372213d96354e7407dba5c9715eb10d04bebd82c395Michael Jurka mLauncher.onWorkspaceUnshrink(); 37396226223d9849842bb2a67af051acbae9e0677d5Michael Jurka return true; 374dee0589388ba0f6373912e18bf86243282fb3b9bMichael Jurka } 375dee0589388ba0f6373912e18bf86243282fb3b9bMichael Jurka return false; 3760e26059548e429e5d1c973bebe4c561bead2926fMichael Jurka } 3770e26059548e429e5d1c973bebe4c561bead2926fMichael Jurka 3780142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka protected void pageBeginMoving() { 3790142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka if (mNextPage != INVALID_PAGE) { 3800142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka // we're snapping to a particular screen 3810142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka enableChildrenCache(mCurrentPage, mNextPage); 3820142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka } else { 3830142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka // this is when user is actively dragging a particular screen, they might 3840142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka // swipe it either left or right (but we won't advance by more than one screen) 3850142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka enableChildrenCache(mCurrentPage - 1, mCurrentPage + 1); 38631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 38731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 38831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 3890142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka protected void pageEndMoving() { 3900142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka clearChildrenCache(); 3910142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka } 3920142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka 3930142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka @Override 3940142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka protected void notifyPageSwitchListener() { 3950142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka super.notifyPageSwitchListener(); 3960142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka 3970142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka if (mPreviousIndicator != null) { 3980142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka // if we know the next page, we show the indication for it right away; it looks 3990142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka // weird if the indicators are lagging 4000142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka int page = mNextPage; 4010142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka if (page == INVALID_PAGE) { 4020142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka page = mCurrentPage; 4030142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka } 4040142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka mPreviousIndicator.setLevel(page); 4050142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka mNextIndicator.setLevel(page); 4060142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka } 4070142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka Launcher.setScreen(mCurrentPage); 4080142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka }; 4090142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka 4108f573952b8729b4319043ae0908997ecd2d68951Dianne Hackborn private void updateWallpaperOffset() { 411798300c4c05b12228f2e4f31c49c3cb728a37889Romain Guy updateWallpaperOffset(getChildAt(getChildCount() - 1).getRight() - (mRight - mLeft)); 412798300c4c05b12228f2e4f31c49c3cb728a37889Romain Guy } 413798300c4c05b12228f2e4f31c49c3cb728a37889Romain Guy 414798300c4c05b12228f2e4f31c49c3cb728a37889Romain Guy private void updateWallpaperOffset(int scrollRange) { 41586f7753bbd6d87ce85195b0715e5548edbfdb7d1Winson Chung final boolean isStaticWallpaper = (mWallpaperManager != null) && 41686f7753bbd6d87ce85195b0715e5548edbfdb7d1Winson Chung (mWallpaperManager.getWallpaperInfo() == null); 41786f7753bbd6d87ce85195b0715e5548edbfdb7d1Winson Chung if (LauncherApplication.isScreenXLarge() && !isStaticWallpaper) { 41886f7753bbd6d87ce85195b0715e5548edbfdb7d1Winson Chung IBinder token = getWindowToken(); 41986f7753bbd6d87ce85195b0715e5548edbfdb7d1Winson Chung if (token != null) { 42086f7753bbd6d87ce85195b0715e5548edbfdb7d1Winson Chung mWallpaperManager.setWallpaperOffsetSteps(1.0f / (getChildCount() - 1), 0 ); 42186f7753bbd6d87ce85195b0715e5548edbfdb7d1Winson Chung mWallpaperManager.setWallpaperOffsets(getWindowToken(), 42286f7753bbd6d87ce85195b0715e5548edbfdb7d1Winson Chung Math.max(0.f, Math.min(mScrollX/(float)scrollRange, 1.f)), 0); 42386f7753bbd6d87ce85195b0715e5548edbfdb7d1Winson Chung } 424956091ba7863bd72086275e61084864994dd6fa7Joe Onorato } 4258f573952b8729b4319043ae0908997ecd2d68951Dianne Hackborn } 426aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung 42700acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato protected void onAttachedToWindow() { 42800acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato super.onAttachedToWindow(); 429956091ba7863bd72086275e61084864994dd6fa7Joe Onorato computeScroll(); 43000acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato mDragController.setWindowToken(getWindowToken()); 43100acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato } 43200acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato 43331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project @Override 43431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project protected void onLayout(boolean changed, int left, int top, int right, int bottom) { 4350142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka super.onLayout(changed, left, top, right, bottom); 436aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung 43779212d81361d1ad8c941c48f8323eb526643ca68Michael Jurka // if shrinkToBottom() is called on initialization, it has to be deferred 43879212d81361d1ad8c941c48f8323eb526643ca68Michael Jurka // until after the first call to onLayout so that it has the correct width 43979212d81361d1ad8c941c48f8323eb526643ca68Michael Jurka if (mWaitingToShrinkToBottom) { 44079212d81361d1ad8c941c48f8323eb526643ca68Michael Jurka shrinkToBottom(false); 44179212d81361d1ad8c941c48f8323eb526643ca68Michael Jurka mWaitingToShrinkToBottom = false; 44279212d81361d1ad8c941c48f8323eb526643ca68Michael Jurka } 44379212d81361d1ad8c941c48f8323eb526643ca68Michael Jurka 444aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung if (LauncherApplication.isInPlaceRotationEnabled()) { 445aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung // When the device is rotated, the scroll position of the current screen 446aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung // needs to be refreshed 4470142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka setCurrentPage(getCurrentPage()); 448aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung } 44931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 45031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 45131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project @Override 4520142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka protected void dispatchDraw(Canvas canvas) { 4530142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka if (mIsSmall) { 4540142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka // Draw all the workspaces if we're small 4550142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka final int pageCount = getChildCount(); 4560142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka final long drawingTime = getDrawingTime(); 4570142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka for (int i = 0; i < pageCount; i++) { 4580142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka final View page = (View) getChildAt(i); 4590142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka 4600142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka if (page.getAlpha() != 1.0f) { 4610142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka page.setAlpha(1.0f); 4620142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka } 4630142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka drawChild(canvas, page, drawingTime); 4640142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka } 4650142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka } else { 4660142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka super.dispatchDraw(canvas); 46731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 46831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 46931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 47031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project @Override 47131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project protected boolean onRequestFocusInDescendants(int direction, Rect previouslyFocusedRect) { 472678862186af4ea70d9b4012c9bc127e7fea5e607Joe Onorato if (!mLauncher.isAllAppsVisible()) { 47331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project final Folder openFolder = getOpenFolder(); 47431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project if (openFolder != null) { 47531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project return openFolder.requestFocus(direction, previouslyFocusedRect); 47631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } else { 4770142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka return super.onRequestFocusInDescendants(direction, previouslyFocusedRect); 47831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 47931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 48031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project return false; 48131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 48231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 48331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project @Override 484c2e24c0a37ddeab930f731c062705d435e477f75Romain Guy public void addFocusables(ArrayList<View> views, int direction, int focusableMode) { 485678862186af4ea70d9b4012c9bc127e7fea5e607Joe Onorato if (!mLauncher.isAllAppsVisible()) { 48631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project final Folder openFolder = getOpenFolder(); 4870142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka if (openFolder != null) { 48831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project openFolder.addFocusables(views, direction); 4890142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka } else { 4900142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka super.addFocusables(views, direction, focusableMode); 49131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 49231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 49331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 49431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 49531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project @Override 4967bb1749c69384faf00b238f0684d3b2e23406451Joe Onorato public boolean dispatchTouchEvent(MotionEvent ev) { 4977bb1749c69384faf00b238f0684d3b2e23406451Joe Onorato if (ev.getAction() == MotionEvent.ACTION_DOWN) { 49854dd75463d0eb47c2f468e19063bdc4141dfdf74Michael Jurka // (In XLarge mode, the workspace is shrunken below all apps, and responds to taps 49954dd75463d0eb47c2f468e19063bdc4141dfdf74Michael Jurka // ie when you click on a mini-screen, it zooms back to that screen) 5006b4adbc0558fcebbd44998bd00dcd334ddbee32dJoe Onorato if (!LauncherApplication.isScreenXLarge() && mLauncher.isAllAppsVisible()) { 5017bb1749c69384faf00b238f0684d3b2e23406451Joe Onorato return false; 5027bb1749c69384faf00b238f0684d3b2e23406451Joe Onorato } 5037bb1749c69384faf00b238f0684d3b2e23406451Joe Onorato } 5047bb1749c69384faf00b238f0684d3b2e23406451Joe Onorato return super.dispatchTouchEvent(ev); 5057bb1749c69384faf00b238f0684d3b2e23406451Joe Onorato } 5067bb1749c69384faf00b238f0684d3b2e23406451Joe Onorato 5070142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka void enableChildrenCache(int fromPage, int toPage) { 5080142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka if (fromPage > toPage) { 5090142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka final int temp = fromPage; 5100142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka fromPage = toPage; 5110142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka toPage = temp; 5123a2b3f2be58843d26549fb0ec6c6533627c7cd19Mike Cleron } 513aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung 514dee0589388ba0f6373912e18bf86243282fb3b9bMichael Jurka final int screenCount = getChildCount(); 515fea5d0250767ab938f623a404e6292a32dd2fdf5Adam Powell 5160142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka fromPage = Math.max(fromPage, 0); 5170142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka toPage = Math.min(toPage, screenCount - 1); 518fea5d0250767ab938f623a404e6292a32dd2fdf5Adam Powell 5190142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka for (int i = fromPage; i <= toPage; i++) { 52031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project final CellLayout layout = (CellLayout) getChildAt(i); 52131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project layout.setChildrenDrawnWithCacheEnabled(true); 52231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project layout.setChildrenDrawingCacheEnabled(true); 52331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 52431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 52531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 52631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project void clearChildrenCache() { 527dee0589388ba0f6373912e18bf86243282fb3b9bMichael Jurka final int screenCount = getChildCount(); 528dee0589388ba0f6373912e18bf86243282fb3b9bMichael Jurka for (int i = 0; i < screenCount; i++) { 52931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project final CellLayout layout = (CellLayout) getChildAt(i); 53031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project layout.setChildrenDrawnWithCacheEnabled(false); 53131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 53231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 53331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 53431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project @Override 53531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project public boolean onTouchEvent(MotionEvent ev) { 5362bc6b7c2b8b651dde0a65c64c127f5b85c1290d2Joe Onorato if (mLauncher.isAllAppsVisible()) { 5372bc6b7c2b8b651dde0a65c64c127f5b85c1290d2Joe Onorato // Cancel any scrolling that is in progress. 5382bc6b7c2b8b651dde0a65c64c127f5b85c1290d2Joe Onorato if (!mScroller.isFinished()) { 5392bc6b7c2b8b651dde0a65c64c127f5b85c1290d2Joe Onorato mScroller.abortAnimation(); 5402bc6b7c2b8b651dde0a65c64c127f5b85c1290d2Joe Onorato } 5410142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka snapToPage(mCurrentPage); 5427c312c15e33b6cffbda707429e88ade498fc9f5eJoe Onorato return false; // We don't want the events. Let them fall through to the all apps view. 54331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 54431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 5450142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka return super.onTouchEvent(ev); 54631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 547aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung 54801f0ed4126be412c8c4352026dad3b2a49832267Michael Jurka public boolean isSmall() { 54901f0ed4126be412c8c4352026dad3b2a49832267Michael Jurka return mIsSmall; 55001f0ed4126be412c8c4352026dad3b2a49832267Michael Jurka } 55101f0ed4126be412c8c4352026dad3b2a49832267Michael Jurka 5526b509c1fd62a39916bb957eac07917161f549206Patrick Dubroy void shrinkToTop(boolean animated) { 5530142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka shrink(ShrinkPosition.SHRINK_TO_TOP, animated); 55401f0ed4126be412c8c4352026dad3b2a49832267Michael Jurka } 55501f0ed4126be412c8c4352026dad3b2a49832267Michael Jurka 55601f0ed4126be412c8c4352026dad3b2a49832267Michael Jurka void shrinkToMiddle() { 5570142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka shrink(ShrinkPosition.SHRINK_TO_MIDDLE, true); 558213d96354e7407dba5c9715eb10d04bebd82c395Michael Jurka } 559213d96354e7407dba5c9715eb10d04bebd82c395Michael Jurka 560213d96354e7407dba5c9715eb10d04bebd82c395Michael Jurka void shrinkToBottom() { 56179212d81361d1ad8c941c48f8323eb526643ca68Michael Jurka shrinkToBottom(true); 56279212d81361d1ad8c941c48f8323eb526643ca68Michael Jurka } 56379212d81361d1ad8c941c48f8323eb526643ca68Michael Jurka 56479212d81361d1ad8c941c48f8323eb526643ca68Michael Jurka void shrinkToBottom(boolean animated) { 56579212d81361d1ad8c941c48f8323eb526643ca68Michael Jurka if (mFirstLayout) { 56679212d81361d1ad8c941c48f8323eb526643ca68Michael Jurka // (mFirstLayout == "first layout has not happened yet") 56779212d81361d1ad8c941c48f8323eb526643ca68Michael Jurka // if we get a call to shrink() as part of our initialization (for example, if 56879212d81361d1ad8c941c48f8323eb526643ca68Michael Jurka // Launcher is started in All Apps mode) then we need to wait for a layout call 56979212d81361d1ad8c941c48f8323eb526643ca68Michael Jurka // to get our width so we can layout the mini-screen views correctly 57079212d81361d1ad8c941c48f8323eb526643ca68Michael Jurka mWaitingToShrinkToBottom = true; 57179212d81361d1ad8c941c48f8323eb526643ca68Michael Jurka } else { 5720142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka shrink(ShrinkPosition.SHRINK_TO_BOTTOM, animated); 57379212d81361d1ad8c941c48f8323eb526643ca68Michael Jurka } 574213d96354e7407dba5c9715eb10d04bebd82c395Michael Jurka } 575213d96354e7407dba5c9715eb10d04bebd82c395Michael Jurka 576dee0589388ba0f6373912e18bf86243282fb3b9bMichael Jurka // we use this to shrink the workspace for the all apps view and the customize view 5770142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka private void shrink(ShrinkPosition shrinkPosition, boolean animated) { 578dee0589388ba0f6373912e18bf86243282fb3b9bMichael Jurka mIsSmall = true; 5797247f6315baf16eacb3286f21bd80321385c1defPatrick Dubroy final Resources res = getResources(); 580dee0589388ba0f6373912e18bf86243282fb3b9bMichael Jurka final int screenWidth = getWidth(); 581213d96354e7407dba5c9715eb10d04bebd82c395Michael Jurka final int screenHeight = getHeight(); 5820142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka 5830142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka // Making the assumption that all pages have the same width as the 0th 5840142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka final int pageWidth = getChildAt(0).getMeasuredWidth(); 5850142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka final int pageHeight = getChildAt(0).getMeasuredHeight(); 5860142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka 5870142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka final int scaledPageWidth = (int) (SHRINK_FACTOR * pageWidth); 5880142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka final int scaledPageHeight = (int) (SHRINK_FACTOR * pageHeight); 5897247f6315baf16eacb3286f21bd80321385c1defPatrick Dubroy final float scaledSpacing = res.getDimension(R.dimen.smallScreenSpacing); 590dee0589388ba0f6373912e18bf86243282fb3b9bMichael Jurka 591dee0589388ba0f6373912e18bf86243282fb3b9bMichael Jurka final int screenCount = getChildCount(); 5920142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka float totalWidth = screenCount * scaledPageWidth + (screenCount - 1) * scaledSpacing; 593213d96354e7407dba5c9715eb10d04bebd82c395Michael Jurka 594213d96354e7407dba5c9715eb10d04bebd82c395Michael Jurka float newY = getResources().getDimension(R.dimen.smallScreenVerticalMargin); 5950142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka if (shrinkPosition == ShrinkPosition.SHRINK_TO_BOTTOM) { 5960142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka newY = screenHeight - newY - scaledPageHeight; 5970142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka } else if (shrinkPosition == ShrinkPosition.SHRINK_TO_MIDDLE) { 5980142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka newY = screenHeight / 2 - scaledPageHeight / 2; 599213d96354e7407dba5c9715eb10d04bebd82c395Michael Jurka } 600dee0589388ba0f6373912e18bf86243282fb3b9bMichael Jurka 601dee0589388ba0f6373912e18bf86243282fb3b9bMichael Jurka // We animate all the screens to the centered position in workspace 602dee0589388ba0f6373912e18bf86243282fb3b9bMichael Jurka // At the same time, the screens become greyed/dimmed 603dee0589388ba0f6373912e18bf86243282fb3b9bMichael Jurka 604dee0589388ba0f6373912e18bf86243282fb3b9bMichael Jurka // newX is initialized to the left-most position of the centered screens 6050142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka float newX = mScroller.getFinalX() + screenWidth / 2 - totalWidth / 2; 606dee0589388ba0f6373912e18bf86243282fb3b9bMichael Jurka for (int i = 0; i < screenCount; i++) { 607dee0589388ba0f6373912e18bf86243282fb3b9bMichael Jurka CellLayout cl = (CellLayout) getChildAt(i); 608a67e867db9d639ed2afcc97e9d04a67fc46f2669Patrick Dubroy cl.setPivotX(0.0f); 609a67e867db9d639ed2afcc97e9d04a67fc46f2669Patrick Dubroy cl.setPivotY(0.0f); 61079212d81361d1ad8c941c48f8323eb526643ca68Michael Jurka if (animated) { 6117247f6315baf16eacb3286f21bd80321385c1defPatrick Dubroy final int duration = res.getInteger(R.integer.config_workspaceShrinkTime); 612df7c3a7853abd4dec460247370fe0b17b50866acPatrick Dubroy new PropertyAnimator(duration, cl, 613df7c3a7853abd4dec460247370fe0b17b50866acPatrick Dubroy new PropertyValuesHolder("x", newX), 614df7c3a7853abd4dec460247370fe0b17b50866acPatrick Dubroy new PropertyValuesHolder("y", newY), 615df7c3a7853abd4dec460247370fe0b17b50866acPatrick Dubroy new PropertyValuesHolder("scaleX", SHRINK_FACTOR), 616df7c3a7853abd4dec460247370fe0b17b50866acPatrick Dubroy new PropertyValuesHolder("scaleY", SHRINK_FACTOR), 617df7c3a7853abd4dec460247370fe0b17b50866acPatrick Dubroy new PropertyValuesHolder("dimmedBitmapAlpha", 1.0f)).start(); 61879212d81361d1ad8c941c48f8323eb526643ca68Michael Jurka } else { 61979212d81361d1ad8c941c48f8323eb526643ca68Michael Jurka cl.setX((int)newX); 62079212d81361d1ad8c941c48f8323eb526643ca68Michael Jurka cl.setY((int)newY); 62179212d81361d1ad8c941c48f8323eb526643ca68Michael Jurka cl.setScaleX(SHRINK_FACTOR); 62279212d81361d1ad8c941c48f8323eb526643ca68Michael Jurka cl.setScaleY(SHRINK_FACTOR); 62379212d81361d1ad8c941c48f8323eb526643ca68Michael Jurka cl.setDimmedBitmapAlpha(1.0f); 62479212d81361d1ad8c941c48f8323eb526643ca68Michael Jurka } 625dee0589388ba0f6373912e18bf86243282fb3b9bMichael Jurka // increment newX for the next screen 6260142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka newX += scaledPageWidth + scaledSpacing; 627dee0589388ba0f6373912e18bf86243282fb3b9bMichael Jurka cl.setOnInterceptTouchListener(this); 628dee0589388ba0f6373912e18bf86243282fb3b9bMichael Jurka } 629dee0589388ba0f6373912e18bf86243282fb3b9bMichael Jurka setChildrenDrawnWithCacheEnabled(true); 630dee0589388ba0f6373912e18bf86243282fb3b9bMichael Jurka } 631dee0589388ba0f6373912e18bf86243282fb3b9bMichael Jurka 632dee0589388ba0f6373912e18bf86243282fb3b9bMichael Jurka // We call this when we trigger an unshrink by clicking on the CellLayout cl 633dee0589388ba0f6373912e18bf86243282fb3b9bMichael Jurka private void unshrink(CellLayout clThatWasClicked) { 6340142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka int newCurrentPage = mCurrentPage; 6354cb3724a2c1e5f278e1531d643accc40fcd8e219Michael Jurka final int screenCount = getChildCount(); 6364cb3724a2c1e5f278e1531d643accc40fcd8e219Michael Jurka for (int i = 0; i < screenCount; i++) { 6374cb3724a2c1e5f278e1531d643accc40fcd8e219Michael Jurka if (getChildAt(i) == clThatWasClicked) { 6380142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka newCurrentPage = i; 6394cb3724a2c1e5f278e1531d643accc40fcd8e219Michael Jurka } 6404cb3724a2c1e5f278e1531d643accc40fcd8e219Michael Jurka } 6410142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka unshrink(newCurrentPage); 6424cb3724a2c1e5f278e1531d643accc40fcd8e219Michael Jurka } 6434cb3724a2c1e5f278e1531d643accc40fcd8e219Michael Jurka 6440142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka private void unshrink(int newCurrentPage) { 645b0f28bd9a52fa4e343c8299d1c3e225d8e01c1e9Michael Jurka if (mIsSmall) { 6460142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka int delta = (newCurrentPage - mCurrentPage)*getWidth(); 6474cb3724a2c1e5f278e1531d643accc40fcd8e219Michael Jurka 648b0f28bd9a52fa4e343c8299d1c3e225d8e01c1e9Michael Jurka final int screenCount = getChildCount(); 649b0f28bd9a52fa4e343c8299d1c3e225d8e01c1e9Michael Jurka for (int i = 0; i < screenCount; i++) { 650b0f28bd9a52fa4e343c8299d1c3e225d8e01c1e9Michael Jurka CellLayout cl = (CellLayout) getChildAt(i); 651b0f28bd9a52fa4e343c8299d1c3e225d8e01c1e9Michael Jurka cl.setX(cl.getX() + delta); 652b0f28bd9a52fa4e343c8299d1c3e225d8e01c1e9Michael Jurka } 6530142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka snapToPage(newCurrentPage); 654b0f28bd9a52fa4e343c8299d1c3e225d8e01c1e9Michael Jurka unshrink(); 6550142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka 6560142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka setCurrentPage(newCurrentPage); 657b0f28bd9a52fa4e343c8299d1c3e225d8e01c1e9Michael Jurka } 658dee0589388ba0f6373912e18bf86243282fb3b9bMichael Jurka } 659dee0589388ba0f6373912e18bf86243282fb3b9bMichael Jurka 6604cb3724a2c1e5f278e1531d643accc40fcd8e219Michael Jurka void unshrink() { 6614cb3724a2c1e5f278e1531d643accc40fcd8e219Michael Jurka unshrink(true); 6624cb3724a2c1e5f278e1531d643accc40fcd8e219Michael Jurka } 6634cb3724a2c1e5f278e1531d643accc40fcd8e219Michael Jurka 6644cb3724a2c1e5f278e1531d643accc40fcd8e219Michael Jurka void unshrink(boolean animated) { 665b0f28bd9a52fa4e343c8299d1c3e225d8e01c1e9Michael Jurka if (mIsSmall) { 666b0f28bd9a52fa4e343c8299d1c3e225d8e01c1e9Michael Jurka Sequencer s = new Sequencer(); 667b0f28bd9a52fa4e343c8299d1c3e225d8e01c1e9Michael Jurka final int screenCount = getChildCount(); 6684cb3724a2c1e5f278e1531d643accc40fcd8e219Michael Jurka 6694cb3724a2c1e5f278e1531d643accc40fcd8e219Michael Jurka final int duration = getResources().getInteger(R.integer.config_workspaceUnshrinkTime); 670b0f28bd9a52fa4e343c8299d1c3e225d8e01c1e9Michael Jurka for (int i = 0; i < screenCount; i++) { 6717247f6315baf16eacb3286f21bd80321385c1defPatrick Dubroy final CellLayout cl = (CellLayout)getChildAt(i); 672a67e867db9d639ed2afcc97e9d04a67fc46f2669Patrick Dubroy cl.setPivotX(0.0f); 673a67e867db9d639ed2afcc97e9d04a67fc46f2669Patrick Dubroy cl.setPivotY(0.0f); 6744cb3724a2c1e5f278e1531d643accc40fcd8e219Michael Jurka if (animated) { 6754cb3724a2c1e5f278e1531d643accc40fcd8e219Michael Jurka s.playTogether( 6760142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka new PropertyAnimator<Float>(duration, cl, "translationX", 0.0f), 6770142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka new PropertyAnimator<Float>(duration, cl, "translationY", 0.0f), 6780142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka new PropertyAnimator<Float>(duration, cl, "scaleX", 1.0f), 6790142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka new PropertyAnimator<Float>(duration, cl, "scaleY", 1.0f), 6800142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka new PropertyAnimator<Float>(duration, cl, "dimmedBitmapAlpha", 0.0f)); 6814cb3724a2c1e5f278e1531d643accc40fcd8e219Michael Jurka } else { 6824cb3724a2c1e5f278e1531d643accc40fcd8e219Michael Jurka cl.setTranslationX(0.0f); 6834cb3724a2c1e5f278e1531d643accc40fcd8e219Michael Jurka cl.setTranslationY(0.0f); 6844cb3724a2c1e5f278e1531d643accc40fcd8e219Michael Jurka cl.setScaleX(1.0f); 6854cb3724a2c1e5f278e1531d643accc40fcd8e219Michael Jurka cl.setScaleY(1.0f); 6864cb3724a2c1e5f278e1531d643accc40fcd8e219Michael Jurka cl.setDimmedBitmapAlpha(0.0f); 6874cb3724a2c1e5f278e1531d643accc40fcd8e219Michael Jurka } 688b0f28bd9a52fa4e343c8299d1c3e225d8e01c1e9Michael Jurka } 689b0f28bd9a52fa4e343c8299d1c3e225d8e01c1e9Michael Jurka s.addListener(mUnshrinkAnimationListener); 690b0f28bd9a52fa4e343c8299d1c3e225d8e01c1e9Michael Jurka s.start(); 691dee0589388ba0f6373912e18bf86243282fb3b9bMichael Jurka } 692dee0589388ba0f6373912e18bf86243282fb3b9bMichael Jurka } 693dee0589388ba0f6373912e18bf86243282fb3b9bMichael Jurka 69431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project void startDrag(CellLayout.CellInfo cellInfo) { 69531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project View child = cellInfo.cell; 696aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung 69731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project // Make sure the drag was started by a long press as opposed to a long click. 6987984c9496bcaeca23ee7fdecc4d4f1bb2467e0f2Bjorn Bringert if (!child.isInTouchMode()) { 69931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project return; 70031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 701aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung 70231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project mDragInfo = cellInfo; 7030142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka mDragInfo.screen = mCurrentPage; 704aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung 7050142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka CellLayout current = ((CellLayout) getChildAt(mCurrentPage)); 70631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 70731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project current.onDragChild(child); 70800acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato mDragController.startDrag(child, this, child.getTag(), DragController.DRAG_ACTION_MOVE); 70931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project invalidate(); 71031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 71131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 7120589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato void addApplicationShortcut(ShortcutInfo info, CellLayout.CellInfo cellInfo) { 71331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project addApplicationShortcut(info, cellInfo, false); 71431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 71531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 7160589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato void addApplicationShortcut(ShortcutInfo info, CellLayout.CellInfo cellInfo, 71731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project boolean insertAtFirst) { 71831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project final CellLayout layout = (CellLayout) getChildAt(cellInfo.screen); 71931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project final int[] result = new int[2]; 72031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 72131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project layout.cellToPoint(cellInfo.cellX, cellInfo.cellY, result); 72231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project onDropExternal(result[0], result[1], info, layout, insertAtFirst); 72331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 72431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 72500acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato public void onDrop(DragSource source, int x, int y, int xOffset, int yOffset, 72600acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato DragView dragView, Object dragInfo) { 727a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka CellLayout cellLayout = getCurrentDropLayout(); 728a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka int originX = x - xOffset; 729a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka int originY = y - yOffset; 730a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka if (mIsSmall) { 731a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka // find out which target layout is over 732a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka final float[] localXY = mTempDragCoordinates; 733a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka localXY[0] = originX; 734a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka localXY[1] = originY; 735a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka final float[] localBottomRightXY = mTempDragBottomRightCoordinates; 736a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka // we need to subtract left/top here because DragController already adds 737a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka // dragRegionLeft/Top to xOffset and yOffset 738a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka localBottomRightXY[0] = originX + dragView.getDragRegionWidth(); 739a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka localBottomRightXY[1] = originY + dragView.getDragRegionHeight(); 7400142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka cellLayout = findMatchingPageForDragOver(localXY, localBottomRightXY); 741a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka if (cellLayout == null) { 742a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka // cancel the drag if we're not over a mini-screen at time of drop 743a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka // TODO: maybe add a nice fade here? 744a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka return; 745a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka } 746a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka // localXY will be transformed into the local screen's coordinate space; save that info 747a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka originX = (int)localXY[0]; 748a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka originY = (int)localXY[1]; 749a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka } 75031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project if (source != this) { 751a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka onDropExternal(originX, originY, dragInfo, cellLayout); 75231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } else { 75331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project // Move internally 75431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project if (mDragInfo != null) { 75531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project final View cell = mDragInfo.cell; 7560142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka int index = mScroller.isFinished() ? mCurrentPage : mNextPage; 75752d9cb32608e7c3d065b4fb8e97269e238f1683eRomain Guy if (index != mDragInfo.screen) { 75831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project final CellLayout originalCellLayout = (CellLayout) getChildAt(mDragInfo.screen); 75931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project originalCellLayout.removeView(cell); 760aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung addInScreen(cell, index, mDragInfo.cellX, mDragInfo.cellY, 761aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung mDragInfo.spanX, mDragInfo.spanY); 76231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 763a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka 764a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka mTargetCell = estimateDropCell(originX, originY, 765aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung mDragInfo.spanX, mDragInfo.spanY, cell, cellLayout, 766aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung mTargetCell); 767aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung cellLayout.onDropChild(cell); 76831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 769aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung // update the item's position after drop 77084f296c106cb1c7b6d3ae6c6d5508a17f1324e29Romain Guy final ItemInfo info = (ItemInfo) cell.getTag(); 771aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung CellLayout.LayoutParams lp = (CellLayout.LayoutParams) cell 772aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung .getLayoutParams(); 773aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung lp.cellX = mTargetCell[0]; 774aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung lp.cellY = mTargetCell[1]; 775aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung 77631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project LauncherModel.moveItemInDatabase(mLauncher, info, 777aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung LauncherSettings.Favorites.CONTAINER_DESKTOP, index, 778aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung lp.cellX, lp.cellY); 77931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 78031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 78131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 78231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 783aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung public void onDragEnter(DragSource source, int x, int y, int xOffset, 784aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung int yOffset, DragView dragView, Object dragInfo) { 78531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 78631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 787440c360bc395c43683fa9ca226e59f9e35f9e926Patrick Dubroy public DropTarget getDropTargetDelegate(DragSource source, int x, int y, int xOffset, int yOffset, 7886569f2c80e179c2f8ed73dae6b01d971ec20f005Patrick Dubroy DragView dragView, Object dragInfo) { 7896569f2c80e179c2f8ed73dae6b01d971ec20f005Patrick Dubroy 790440c360bc395c43683fa9ca226e59f9e35f9e926Patrick Dubroy // We may need to delegate the drag to a child view. If a 1x1 item 791440c360bc395c43683fa9ca226e59f9e35f9e926Patrick Dubroy // would land in a cell occupied by a DragTarget (e.g. a Folder), 792440c360bc395c43683fa9ca226e59f9e35f9e926Patrick Dubroy // then drag events should be handled by that child. 793440c360bc395c43683fa9ca226e59f9e35f9e926Patrick Dubroy 7946569f2c80e179c2f8ed73dae6b01d971ec20f005Patrick Dubroy ItemInfo item = (ItemInfo)dragInfo; 795440c360bc395c43683fa9ca226e59f9e35f9e926Patrick Dubroy CellLayout currentLayout = getCurrentDropLayout(); 796440c360bc395c43683fa9ca226e59f9e35f9e926Patrick Dubroy 797440c360bc395c43683fa9ca226e59f9e35f9e926Patrick Dubroy int dragPointX, dragPointY; 798440c360bc395c43683fa9ca226e59f9e35f9e926Patrick Dubroy if (item.spanX == 1 && item.spanY == 1) { 799440c360bc395c43683fa9ca226e59f9e35f9e926Patrick Dubroy // For a 1x1, calculate the drop cell exactly as in onDragOver 800440c360bc395c43683fa9ca226e59f9e35f9e926Patrick Dubroy dragPointX = x - xOffset; 801440c360bc395c43683fa9ca226e59f9e35f9e926Patrick Dubroy dragPointY = y - yOffset; 802440c360bc395c43683fa9ca226e59f9e35f9e926Patrick Dubroy } else { 803440c360bc395c43683fa9ca226e59f9e35f9e926Patrick Dubroy // Otherwise, use the exact drag coordinates 804440c360bc395c43683fa9ca226e59f9e35f9e926Patrick Dubroy dragPointX = x; 805440c360bc395c43683fa9ca226e59f9e35f9e926Patrick Dubroy dragPointY = y; 806440c360bc395c43683fa9ca226e59f9e35f9e926Patrick Dubroy } 807440c360bc395c43683fa9ca226e59f9e35f9e926Patrick Dubroy 808440c360bc395c43683fa9ca226e59f9e35f9e926Patrick Dubroy // If we are dragging over a cell that contains a DropTarget that will 809440c360bc395c43683fa9ca226e59f9e35f9e926Patrick Dubroy // accept the drop, delegate to that DropTarget. 810440c360bc395c43683fa9ca226e59f9e35f9e926Patrick Dubroy final int[] cellXY = mTempCell; 811440c360bc395c43683fa9ca226e59f9e35f9e926Patrick Dubroy currentLayout.estimateDropCell(dragPointX, dragPointY, item.spanX, item.spanY, cellXY); 812440c360bc395c43683fa9ca226e59f9e35f9e926Patrick Dubroy View child = currentLayout.getChildAt(cellXY[0], cellXY[1]); 813440c360bc395c43683fa9ca226e59f9e35f9e926Patrick Dubroy if (child instanceof DropTarget) { 814440c360bc395c43683fa9ca226e59f9e35f9e926Patrick Dubroy DropTarget target = (DropTarget)child; 815440c360bc395c43683fa9ca226e59f9e35f9e926Patrick Dubroy if (target.acceptDrop(source, x, y, xOffset, yOffset, dragView, dragInfo)) { 816440c360bc395c43683fa9ca226e59f9e35f9e926Patrick Dubroy return target; 817440c360bc395c43683fa9ca226e59f9e35f9e926Patrick Dubroy } 818440c360bc395c43683fa9ca226e59f9e35f9e926Patrick Dubroy } 819440c360bc395c43683fa9ca226e59f9e35f9e926Patrick Dubroy return null; 820440c360bc395c43683fa9ca226e59f9e35f9e926Patrick Dubroy } 8216569f2c80e179c2f8ed73dae6b01d971ec20f005Patrick Dubroy 822a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka // xy = upper left corner of item being dragged 823a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka // bottomRightXy = lower right corner of item being dragged 824a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka // This method will see which mini-screen is most overlapped by the item being dragged, and 825a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka // return it. It will also transform the parameters xy and bottomRightXy into the local 826a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka // coordinate space of the returned screen 8270142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka private CellLayout findMatchingPageForDragOver(float[] xy, float[] bottomRightXy) { 828a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka float x = xy[0]; 829a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka float y = xy[1]; 830a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka float right = bottomRightXy[0]; 831a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka float bottom = bottomRightXy[1]; 832a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka 833a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka float bestX = 0; 834a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka float bestY = 0; 835a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka float bestRight = 0; 836a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka float bestBottom = 0; 837a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka 838a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka Matrix inverseMatrix = new Matrix(); 839a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka 840a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka // We loop through all the screens (ie CellLayouts) and see which one overlaps the most 841a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka // with the item being dragged. 842a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka final int screenCount = getChildCount(); 843a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka CellLayout bestMatchingScreen = null; 844a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka float bestOverlapSoFar = 0; 845a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka for (int i = 0; i < screenCount; i++) { 846a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka CellLayout cl = (CellLayout)getChildAt(i); 847a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka // Transform the coordinates of the item being dragged to the CellLayout's coordinates 848a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka float left = cl.getLeft(); 849a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka float top = cl.getTop(); 850a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka xy[0] = x + mScrollX - left; 851a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka xy[1] = y + mScrollY - top; 852a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka cl.getMatrix().invert(inverseMatrix); 853a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka 854a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka bottomRightXy[0] = right + mScrollX - left; 855a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka bottomRightXy[1] = bottom + mScrollY - top; 856a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka 857a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka inverseMatrix.mapPoints(xy); 858a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka inverseMatrix.mapPoints(bottomRightXy); 859a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka 860a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka float dragRegionX = xy[0]; 861a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka float dragRegionY = xy[1]; 862a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka float dragRegionRight = bottomRightXy[0]; 863a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka float dragRegionBottom = bottomRightXy[1]; 864a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka 865a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka // Find the overlapping region 866a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka float overlapLeft = Math.max(0f, dragRegionX); 867a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka float overlapTop = Math.max(0f, dragRegionY); 868a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka float overlapBottom = Math.min(cl.getHeight(), dragRegionBottom); 869a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka float overlapRight = Math.min(cl.getWidth(), dragRegionRight); 870a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka 871a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka if (overlapRight >= 0 && overlapLeft <= cl.getWidth() && 872a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka overlapTop >= 0 && overlapBottom <= cl.getHeight()) { 873a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka // Calculate the size of the overlapping region 874a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka float overlap = (overlapRight - overlapLeft) * (overlapBottom - overlapTop); 875a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka if (overlap > bestOverlapSoFar) { 876a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka bestOverlapSoFar = overlap; 877a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka bestMatchingScreen = cl; 878a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka bestX = xy[0]; 879a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka bestY = xy[1]; 880a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka bestRight = bottomRightXy[0]; 881a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka bestBottom = bottomRightXy[1]; 882a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka } 883a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka } 884a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka } 885a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka if (bestMatchingScreen != null && bestMatchingScreen != mDragTargetLayout) { 886a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka if (mDragTargetLayout != null) { 887a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka mDragTargetLayout.onDragComplete(); 888a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka } 889a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka mDragTargetLayout = bestMatchingScreen; 890a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka } 891a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka xy[0] = bestX; 892a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka xy[1] = bestY; 893a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka bottomRightXy[0] = bestRight; 894a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka bottomRightXy[1] = bestBottom; 895a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka return bestMatchingScreen; 896a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka } 897a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka 898440c360bc395c43683fa9ca226e59f9e35f9e926Patrick Dubroy public void onDragOver(DragSource source, int x, int y, int xOffset, int yOffset, 899440c360bc395c43683fa9ca226e59f9e35f9e926Patrick Dubroy DragView dragView, Object dragInfo) { 900440c360bc395c43683fa9ca226e59f9e35f9e926Patrick Dubroy 901976ebec9e31643d3513f9f0de2b433d9aa186ce9Patrick Dubroy final ItemInfo item = (ItemInfo)dragInfo; 902a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka CellLayout currentLayout = getCurrentDropLayout(); 9036569f2c80e179c2f8ed73dae6b01d971ec20f005Patrick Dubroy 9046569f2c80e179c2f8ed73dae6b01d971ec20f005Patrick Dubroy if (dragInfo instanceof LauncherAppWidgetInfo) { 9056569f2c80e179c2f8ed73dae6b01d971ec20f005Patrick Dubroy LauncherAppWidgetInfo widgetInfo = (LauncherAppWidgetInfo)dragInfo; 9066569f2c80e179c2f8ed73dae6b01d971ec20f005Patrick Dubroy 9076569f2c80e179c2f8ed73dae6b01d971ec20f005Patrick Dubroy if (widgetInfo.spanX == -1) { 9086569f2c80e179c2f8ed73dae6b01d971ec20f005Patrick Dubroy // Calculate the grid spans needed to fit this widget 9098f86ddcb90063a56c25c9c782316574bc4e5dd93Patrick Dubroy int[] spans = currentLayout.rectToCell(widgetInfo.minWidth, widgetInfo.minHeight, null); 9106569f2c80e179c2f8ed73dae6b01d971ec20f005Patrick Dubroy item.spanX = spans[0]; 9116569f2c80e179c2f8ed73dae6b01d971ec20f005Patrick Dubroy item.spanY = spans[1]; 9126569f2c80e179c2f8ed73dae6b01d971ec20f005Patrick Dubroy } 9136569f2c80e179c2f8ed73dae6b01d971ec20f005Patrick Dubroy } 914a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka int originX = x - xOffset; 915a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka int originY = y - yOffset; 916a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka if (mIsSmall) { 917a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka // find out which mini screen the dragged item is over 918a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka final float[] localXY = mTempDragCoordinates; 919a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka localXY[0] = originX; 920a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka localXY[1] = originY; 921a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka final float[] localBottomRightXY = mTempDragBottomRightCoordinates; 922a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka 923a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka localBottomRightXY[0] = originX + dragView.getDragRegionWidth(); 924a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka localBottomRightXY[1] = originY + dragView.getDragRegionHeight(); 9250142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka currentLayout = findMatchingPageForDragOver(localXY, localBottomRightXY); 926a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka if (currentLayout != null) { 927a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka currentLayout.setHover(true); 928a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka } 929a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka 930a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka originX = (int)localXY[0]; 931a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka originY = (int)localXY[1]; 932a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka } 933a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka 934a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka if (source != this) { 935a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka // This is a hack to fix the point used to determine which cell an icon from the all 936a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka // apps screen is over 937a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka if (item != null && item.spanX == 1 && currentLayout != null) { 938a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka int dragRegionLeft = (dragView.getWidth() - currentLayout.getCellWidth()) / 2; 939a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka 940a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka originX += dragRegionLeft - dragView.getDragRegionLeft(); 941a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka if (dragView.getDragRegionWidth() != currentLayout.getCellWidth()) { 942a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka dragView.setDragRegion(dragView.getDragRegionLeft(), dragView.getDragRegionTop(), 943a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka currentLayout.getCellWidth(), dragView.getDragRegionHeight()); 944a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka } 945a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka } 946a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka } 9476569f2c80e179c2f8ed73dae6b01d971ec20f005Patrick Dubroy if (currentLayout != mDragTargetLayout) { 9486569f2c80e179c2f8ed73dae6b01d971ec20f005Patrick Dubroy if (mDragTargetLayout != null) { 9496569f2c80e179c2f8ed73dae6b01d971ec20f005Patrick Dubroy mDragTargetLayout.onDragComplete(); 9506569f2c80e179c2f8ed73dae6b01d971ec20f005Patrick Dubroy } 9516569f2c80e179c2f8ed73dae6b01d971ec20f005Patrick Dubroy mDragTargetLayout = currentLayout; 9526569f2c80e179c2f8ed73dae6b01d971ec20f005Patrick Dubroy } 9536569f2c80e179c2f8ed73dae6b01d971ec20f005Patrick Dubroy 954a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka // only visualize the drop locations for moving icons within the home screen on tablet 955a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka // on phone, we also visualize icons dragged in from All Apps 956a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka if ((!LauncherApplication.isScreenXLarge() || source == this) 957a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka && mDragTargetLayout != null) { 958a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka final View child = (mDragInfo == null) ? null : mDragInfo.cell; 959a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka mDragTargetLayout.visualizeDropLocation( 960a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka child, originX, originY, item.spanX, item.spanY); 961976ebec9e31643d3513f9f0de2b433d9aa186ce9Patrick Dubroy } 96231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 96331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 964aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung public void onDragExit(DragSource source, int x, int y, int xOffset, 965aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung int yOffset, DragView dragView, Object dragInfo) { 9666569f2c80e179c2f8ed73dae6b01d971ec20f005Patrick Dubroy if (mDragTargetLayout != null) { 9676569f2c80e179c2f8ed73dae6b01d971ec20f005Patrick Dubroy mDragTargetLayout.onDragComplete(); 9686569f2c80e179c2f8ed73dae6b01d971ec20f005Patrick Dubroy mDragTargetLayout = null; 9696569f2c80e179c2f8ed73dae6b01d971ec20f005Patrick Dubroy } 97031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 97131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 972aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung private void onDropExternal(int x, int y, Object dragInfo, 973aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung CellLayout cellLayout) { 97431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project onDropExternal(x, y, dragInfo, cellLayout, false); 97531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 976aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung 977aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung private void onDropExternal(int x, int y, Object dragInfo, 978aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung CellLayout cellLayout, boolean insertAtFirst) { 97931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project // Drag from somewhere else 98031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project ItemInfo info = (ItemInfo) dragInfo; 98131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 982af44209bfa60da3c7ab49b7f508f9effd316ee41Michael Jurka View view = null; 98331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 98431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project switch (info.itemType) { 98531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project case LauncherSettings.Favorites.ITEM_TYPE_APPLICATION: 98631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project case LauncherSettings.Favorites.ITEM_TYPE_SHORTCUT: 987e48e7c1a62e6a367803dca62c8fce9de57121b0fJoe Onorato if (info.container == NO_ID && info instanceof ApplicationInfo) { 98831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project // Came from all apps -- make a copy 989aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung info = new ShortcutInfo((ApplicationInfo) info); 99031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 991aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung view = mLauncher.createShortcut(R.layout.application, cellLayout, 992aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung (ShortcutInfo) info); 99331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project break; 99431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project case LauncherSettings.Favorites.ITEM_TYPE_USER_FOLDER: 99531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project view = FolderIcon.fromXml(R.layout.folder_icon, mLauncher, 9960142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka (ViewGroup) getChildAt(mCurrentPage), 997aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung ((UserFolderInfo) info)); 99831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project break; 999af44209bfa60da3c7ab49b7f508f9effd316ee41Michael Jurka case LauncherSettings.Favorites.ITEM_TYPE_APPWIDGET: 1000af44209bfa60da3c7ab49b7f508f9effd316ee41Michael Jurka cellLayout.setTagToCellInfoForPoint(x, y); 1001a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka int[] position = new int[2]; 1002a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka position[0] = x; 1003a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka position[1] = y; 1004a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka mLauncher.addAppWidgetFromDrop(((LauncherAppWidgetInfo)dragInfo).providerName, 1005a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka cellLayout.getTag(), position); 1006af44209bfa60da3c7ab49b7f508f9effd316ee41Michael Jurka break; 100731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project default: 1008aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung throw new IllegalStateException("Unknown item type: " 1009aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung + info.itemType); 101031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 101131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 10126569f2c80e179c2f8ed73dae6b01d971ec20f005Patrick Dubroy // If the view is null, it has already been added. 10136569f2c80e179c2f8ed73dae6b01d971ec20f005Patrick Dubroy if (view == null) { 10146569f2c80e179c2f8ed73dae6b01d971ec20f005Patrick Dubroy cellLayout.onDragComplete(); 10156569f2c80e179c2f8ed73dae6b01d971ec20f005Patrick Dubroy } else { 10166569f2c80e179c2f8ed73dae6b01d971ec20f005Patrick Dubroy mTargetCell = estimateDropCell(x, y, 1, 1, view, cellLayout, mTargetCell); 1017aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung addInScreen(view, indexOfChild(cellLayout), mTargetCell[0], 1018aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung mTargetCell[1], info.spanX, info.spanY, insertAtFirst); 1019aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung cellLayout.onDropChild(view); 10206569f2c80e179c2f8ed73dae6b01d971ec20f005Patrick Dubroy CellLayout.LayoutParams lp = (CellLayout.LayoutParams) view.getLayoutParams(); 102131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 1022af44209bfa60da3c7ab49b7f508f9effd316ee41Michael Jurka LauncherModel.addOrMoveItemInDatabase(mLauncher, info, 10230142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka LauncherSettings.Favorites.CONTAINER_DESKTOP, mCurrentPage, 1024aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung lp.cellX, lp.cellY); 1025af44209bfa60da3c7ab49b7f508f9effd316ee41Michael Jurka } 102631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 1027aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung 102870864289fba6daf07b8de98524cdfb765a62552dJeff Sharkey /** 102970864289fba6daf07b8de98524cdfb765a62552dJeff Sharkey * Return the current {@link CellLayout}, correctly picking the destination 103070864289fba6daf07b8de98524cdfb765a62552dJeff Sharkey * screen while a scroll is in progress. 103170864289fba6daf07b8de98524cdfb765a62552dJeff Sharkey */ 103270864289fba6daf07b8de98524cdfb765a62552dJeff Sharkey private CellLayout getCurrentDropLayout() { 10330142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka int index = mScroller.isFinished() ? mCurrentPage : mNextPage; 103470864289fba6daf07b8de98524cdfb765a62552dJeff Sharkey return (CellLayout) getChildAt(index); 103570864289fba6daf07b8de98524cdfb765a62552dJeff Sharkey } 103631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 103770864289fba6daf07b8de98524cdfb765a62552dJeff Sharkey /** 103870864289fba6daf07b8de98524cdfb765a62552dJeff Sharkey * {@inheritDoc} 103970864289fba6daf07b8de98524cdfb765a62552dJeff Sharkey */ 104070864289fba6daf07b8de98524cdfb765a62552dJeff Sharkey public boolean acceptDrop(DragSource source, int x, int y, 104100acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato int xOffset, int yOffset, DragView dragView, Object dragInfo) { 10424c58c485d8c02f8ca7e8b4d93140440f6a3a5131Romain Guy final CellLayout layout = getCurrentDropLayout(); 1043c28de51eedb26848abf9245ddd19e021d30be318Michael Jurka final CellLayout.CellInfo dragCellInfo = mDragInfo; 1044c28de51eedb26848abf9245ddd19e021d30be318Michael Jurka final int spanX = dragCellInfo == null ? 1 : dragCellInfo.spanX; 1045c28de51eedb26848abf9245ddd19e021d30be318Michael Jurka final int spanY = dragCellInfo == null ? 1 : dragCellInfo.spanY; 10464c58c485d8c02f8ca7e8b4d93140440f6a3a5131Romain Guy 1047c28de51eedb26848abf9245ddd19e021d30be318Michael Jurka final View ignoreView = dragCellInfo == null ? null : dragCellInfo.cell; 1048c28de51eedb26848abf9245ddd19e021d30be318Michael Jurka final CellLayout.CellInfo cellInfo = layout.updateOccupiedCells(null, ignoreView); 10494c58c485d8c02f8ca7e8b4d93140440f6a3a5131Romain Guy 1050c28de51eedb26848abf9245ddd19e021d30be318Michael Jurka if (cellInfo.findCellForSpan(mTempEstimate, spanX, spanY)) { 10510e26059548e429e5d1c973bebe4c561bead2926fMichael Jurka return true; 10520e26059548e429e5d1c973bebe4c561bead2926fMichael Jurka } else { 10530e26059548e429e5d1c973bebe4c561bead2926fMichael Jurka Toast.makeText(getContext(), getContext().getString(R.string.out_of_space), Toast.LENGTH_SHORT).show(); 10540e26059548e429e5d1c973bebe4c561bead2926fMichael Jurka return false; 10550e26059548e429e5d1c973bebe4c561bead2926fMichael Jurka } 105670864289fba6daf07b8de98524cdfb765a62552dJeff Sharkey } 1057aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung 105870864289fba6daf07b8de98524cdfb765a62552dJeff Sharkey /** 105970864289fba6daf07b8de98524cdfb765a62552dJeff Sharkey * {@inheritDoc} 106070864289fba6daf07b8de98524cdfb765a62552dJeff Sharkey */ 106170864289fba6daf07b8de98524cdfb765a62552dJeff Sharkey public Rect estimateDropLocation(DragSource source, int x, int y, 106200acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato int xOffset, int yOffset, DragView dragView, Object dragInfo, Rect recycle) { 106370864289fba6daf07b8de98524cdfb765a62552dJeff Sharkey final CellLayout layout = getCurrentDropLayout(); 1064aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung 106531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project final CellLayout.CellInfo cellInfo = mDragInfo; 106670864289fba6daf07b8de98524cdfb765a62552dJeff Sharkey final int spanX = cellInfo == null ? 1 : cellInfo.spanX; 106770864289fba6daf07b8de98524cdfb765a62552dJeff Sharkey final int spanY = cellInfo == null ? 1 : cellInfo.spanY; 106870864289fba6daf07b8de98524cdfb765a62552dJeff Sharkey final View ignoreView = cellInfo == null ? null : cellInfo.cell; 1069aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung 107070864289fba6daf07b8de98524cdfb765a62552dJeff Sharkey final Rect location = recycle != null ? recycle : new Rect(); 1071aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung 107270864289fba6daf07b8de98524cdfb765a62552dJeff Sharkey // Find drop cell and convert into rectangle 1073aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung int[] dropCell = estimateDropCell(x - xOffset, y - yOffset, spanX, 1074aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung spanY, ignoreView, layout, mTempCell); 1075aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung 107670864289fba6daf07b8de98524cdfb765a62552dJeff Sharkey if (dropCell == null) { 107770864289fba6daf07b8de98524cdfb765a62552dJeff Sharkey return null; 107870864289fba6daf07b8de98524cdfb765a62552dJeff Sharkey } 1079aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung 108070864289fba6daf07b8de98524cdfb765a62552dJeff Sharkey layout.cellToPoint(dropCell[0], dropCell[1], mTempEstimate); 108170864289fba6daf07b8de98524cdfb765a62552dJeff Sharkey location.left = mTempEstimate[0]; 108270864289fba6daf07b8de98524cdfb765a62552dJeff Sharkey location.top = mTempEstimate[1]; 1083aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung 108470864289fba6daf07b8de98524cdfb765a62552dJeff Sharkey layout.cellToPoint(dropCell[0] + spanX, dropCell[1] + spanY, mTempEstimate); 108570864289fba6daf07b8de98524cdfb765a62552dJeff Sharkey location.right = mTempEstimate[0]; 108670864289fba6daf07b8de98524cdfb765a62552dJeff Sharkey location.bottom = mTempEstimate[1]; 1087aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung 108870864289fba6daf07b8de98524cdfb765a62552dJeff Sharkey return location; 108931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 109031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 109170864289fba6daf07b8de98524cdfb765a62552dJeff Sharkey /** 109270864289fba6daf07b8de98524cdfb765a62552dJeff Sharkey * Calculate the nearest cell where the given object would be dropped. 109370864289fba6daf07b8de98524cdfb765a62552dJeff Sharkey */ 1094263e019baafb3b6cbcfdef9c81d74a4bea769180Romain Guy private int[] estimateDropCell(int pixelX, int pixelY, 109570864289fba6daf07b8de98524cdfb765a62552dJeff Sharkey int spanX, int spanY, View ignoreView, CellLayout layout, int[] recycle) { 10966569f2c80e179c2f8ed73dae6b01d971ec20f005Patrick Dubroy 10976569f2c80e179c2f8ed73dae6b01d971ec20f005Patrick Dubroy final int[] cellXY = mTempCell; 10986569f2c80e179c2f8ed73dae6b01d971ec20f005Patrick Dubroy layout.estimateDropCell(pixelX, pixelY, spanX, spanY, cellXY); 10996569f2c80e179c2f8ed73dae6b01d971ec20f005Patrick Dubroy layout.cellToPoint(cellXY[0], cellXY[1], mTempEstimate); 11006569f2c80e179c2f8ed73dae6b01d971ec20f005Patrick Dubroy 1101c28de51eedb26848abf9245ddd19e021d30be318Michael Jurka final CellLayout.CellInfo cellInfo = layout.updateOccupiedCells(null, ignoreView); 110270864289fba6daf07b8de98524cdfb765a62552dJeff Sharkey // Find the best target drop location 1103c28de51eedb26848abf9245ddd19e021d30be318Michael Jurka return layout.findNearestVacantArea(mTempEstimate[0], mTempEstimate[1], spanX, spanY, cellInfo, recycle); 110470864289fba6daf07b8de98524cdfb765a62552dJeff Sharkey } 1105aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung 11068f86ddcb90063a56c25c9c782316574bc4e5dd93Patrick Dubroy /** 11078f86ddcb90063a56c25c9c782316574bc4e5dd93Patrick Dubroy * Estimate the size that a child with the given dimensions will take in the current screen. 11088f86ddcb90063a56c25c9c782316574bc4e5dd93Patrick Dubroy */ 11098f86ddcb90063a56c25c9c782316574bc4e5dd93Patrick Dubroy void estimateChildSize(int minWidth, int minHeight, int[] result) { 11100142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka ((CellLayout)getChildAt(mCurrentPage)).estimateChildSize(minWidth, minHeight, result); 11118f86ddcb90063a56c25c9c782316574bc4e5dd93Patrick Dubroy } 11128f86ddcb90063a56c25c9c782316574bc4e5dd93Patrick Dubroy 111331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project void setLauncher(Launcher launcher) { 111431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project mLauncher = launcher; 111531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 111631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 111700acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato public void setDragController(DragController dragController) { 111800acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato mDragController = dragController; 111931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 112031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 112131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project public void onDropCompleted(View target, boolean success) { 1122aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung if (success) { 112331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project if (target != this && mDragInfo != null) { 112431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project final CellLayout cellLayout = (CellLayout) getChildAt(mDragInfo.screen); 112531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project cellLayout.removeView(mDragInfo.cell); 112600acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato if (mDragInfo.cell instanceof DropTarget) { 112700acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato mDragController.removeDropTarget((DropTarget)mDragInfo.cell); 112800acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato } 1129aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung // final Object tag = mDragInfo.cell.getTag(); 113031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 113131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } else { 113231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project if (mDragInfo != null) { 113331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project final CellLayout cellLayout = (CellLayout) getChildAt(mDragInfo.screen); 113431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project cellLayout.onDropAborted(mDragInfo.cell); 113531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 113631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 113731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 113831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project mDragInfo = null; 113931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 114031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 11410142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka @Override 11420142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka protected void onRestoreInstanceState(Parcelable state) { 11430142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka super.onRestoreInstanceState(state); 11440142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka Launcher.setScreen(mCurrentPage); 11450142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka } 11460142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka 11470142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka @Override 114831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project public void scrollLeft() { 11497f0f4f3c35fe0b6a94504ec39ac127fa935282efMichael Jurka if (!mIsSmall) { 11500142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka super.scrollLeft(); 115131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 115231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 115331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 11540142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka @Override 115531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project public void scrollRight() { 11567f0f4f3c35fe0b6a94504ec39ac127fa935282efMichael Jurka if (!mIsSmall) { 11570142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka super.scrollRight(); 115831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 115931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 1160138a04170d964da9cdec228e95b976875ae52481Karl Rosaen 116131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project public Folder getFolderForTag(Object tag) { 1162dee0589388ba0f6373912e18bf86243282fb3b9bMichael Jurka final int screenCount = getChildCount(); 116331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project for (int screen = 0; screen < screenCount; screen++) { 116431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project CellLayout currentScreen = ((CellLayout) getChildAt(screen)); 116531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project int count = currentScreen.getChildCount(); 116631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project for (int i = 0; i < count; i++) { 116731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project View child = currentScreen.getChildAt(i); 116831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project CellLayout.LayoutParams lp = (CellLayout.LayoutParams) child.getLayoutParams(); 116931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project if (lp.cellHSpan == 4 && lp.cellVSpan == 4 && child instanceof Folder) { 117031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project Folder f = (Folder) child; 1171aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung if (f.getInfo() == tag && f.getInfo().opened) { 117231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project return f; 117331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 117431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 117531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 117631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 117731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project return null; 117831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 117931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 118031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project public View getViewForTag(Object tag) { 118131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project int screenCount = getChildCount(); 118231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project for (int screen = 0; screen < screenCount; screen++) { 118331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project CellLayout currentScreen = ((CellLayout) getChildAt(screen)); 118431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project int count = currentScreen.getChildCount(); 118531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project for (int i = 0; i < count; i++) { 118631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project View child = currentScreen.getChildAt(i); 118731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project if (child.getTag() == tag) { 118831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project return child; 118931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 119031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 119131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 119231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project return null; 119331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 119431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 119531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 119664e6be78dc72e1a89fe8fb95c502586f9260df28Joe Onorato void removeItems(final ArrayList<ApplicationInfo> apps) { 1197dee0589388ba0f6373912e18bf86243282fb3b9bMichael Jurka final int screenCount = getChildCount(); 11985c16f3ecd6b47bff3abbe40deb3d39c66a3b0012Romain Guy final PackageManager manager = getContext().getPackageManager(); 1199629de3ef739883c0962423cc0c3a26299f162d3dRomain Guy final AppWidgetManager widgets = AppWidgetManager.getInstance(getContext()); 1200574d20ec84551370987dde530c27ec493bdef564Romain Guy 120164e6be78dc72e1a89fe8fb95c502586f9260df28Joe Onorato final HashSet<String> packageNames = new HashSet<String>(); 120264e6be78dc72e1a89fe8fb95c502586f9260df28Joe Onorato final int appCount = apps.size(); 120364e6be78dc72e1a89fe8fb95c502586f9260df28Joe Onorato for (int i = 0; i < appCount; i++) { 120464e6be78dc72e1a89fe8fb95c502586f9260df28Joe Onorato packageNames.add(apps.get(i).componentName.getPackageName()); 120564e6be78dc72e1a89fe8fb95c502586f9260df28Joe Onorato } 120664e6be78dc72e1a89fe8fb95c502586f9260df28Joe Onorato 1207dee0589388ba0f6373912e18bf86243282fb3b9bMichael Jurka for (int i = 0; i < screenCount; i++) { 120831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project final CellLayout layout = (CellLayout) getChildAt(i); 1209629de3ef739883c0962423cc0c3a26299f162d3dRomain Guy 1210629de3ef739883c0962423cc0c3a26299f162d3dRomain Guy // Avoid ANRs by treating each screen separately 1211629de3ef739883c0962423cc0c3a26299f162d3dRomain Guy post(new Runnable() { 1212629de3ef739883c0962423cc0c3a26299f162d3dRomain Guy public void run() { 1213629de3ef739883c0962423cc0c3a26299f162d3dRomain Guy final ArrayList<View> childrenToRemove = new ArrayList<View>(); 1214629de3ef739883c0962423cc0c3a26299f162d3dRomain Guy childrenToRemove.clear(); 1215aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung 1216629de3ef739883c0962423cc0c3a26299f162d3dRomain Guy int childCount = layout.getChildCount(); 1217629de3ef739883c0962423cc0c3a26299f162d3dRomain Guy for (int j = 0; j < childCount; j++) { 1218629de3ef739883c0962423cc0c3a26299f162d3dRomain Guy final View view = layout.getChildAt(j); 1219629de3ef739883c0962423cc0c3a26299f162d3dRomain Guy Object tag = view.getTag(); 1220aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung 12210589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato if (tag instanceof ShortcutInfo) { 12220589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato final ShortcutInfo info = (ShortcutInfo) tag; 1223629de3ef739883c0962423cc0c3a26299f162d3dRomain Guy final Intent intent = info.intent; 1224629de3ef739883c0962423cc0c3a26299f162d3dRomain Guy final ComponentName name = intent.getComponent(); 1225aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung 122664e6be78dc72e1a89fe8fb95c502586f9260df28Joe Onorato if (Intent.ACTION_MAIN.equals(intent.getAction()) && name != null) { 122764e6be78dc72e1a89fe8fb95c502586f9260df28Joe Onorato for (String packageName: packageNames) { 122864e6be78dc72e1a89fe8fb95c502586f9260df28Joe Onorato if (packageName.equals(name.getPackageName())) { 122964e6be78dc72e1a89fe8fb95c502586f9260df28Joe Onorato // TODO: This should probably be done on a worker thread 123064e6be78dc72e1a89fe8fb95c502586f9260df28Joe Onorato LauncherModel.deleteItemFromDatabase(mLauncher, info); 123164e6be78dc72e1a89fe8fb95c502586f9260df28Joe Onorato childrenToRemove.add(view); 123264e6be78dc72e1a89fe8fb95c502586f9260df28Joe Onorato } 123364e6be78dc72e1a89fe8fb95c502586f9260df28Joe Onorato } 1234629de3ef739883c0962423cc0c3a26299f162d3dRomain Guy } 1235629de3ef739883c0962423cc0c3a26299f162d3dRomain Guy } else if (tag instanceof UserFolderInfo) { 1236629de3ef739883c0962423cc0c3a26299f162d3dRomain Guy final UserFolderInfo info = (UserFolderInfo) tag; 12370589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato final ArrayList<ShortcutInfo> contents = info.contents; 12380589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato final ArrayList<ShortcutInfo> toRemove = new ArrayList<ShortcutInfo>(1); 1239629de3ef739883c0962423cc0c3a26299f162d3dRomain Guy final int contentsCount = contents.size(); 1240629de3ef739883c0962423cc0c3a26299f162d3dRomain Guy boolean removedFromFolder = false; 1241aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung 1242629de3ef739883c0962423cc0c3a26299f162d3dRomain Guy for (int k = 0; k < contentsCount; k++) { 12430589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato final ShortcutInfo appInfo = contents.get(k); 1244629de3ef739883c0962423cc0c3a26299f162d3dRomain Guy final Intent intent = appInfo.intent; 1245629de3ef739883c0962423cc0c3a26299f162d3dRomain Guy final ComponentName name = intent.getComponent(); 1246aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung 124764e6be78dc72e1a89fe8fb95c502586f9260df28Joe Onorato if (Intent.ACTION_MAIN.equals(intent.getAction()) && name != null) { 124864e6be78dc72e1a89fe8fb95c502586f9260df28Joe Onorato for (String packageName: packageNames) { 124964e6be78dc72e1a89fe8fb95c502586f9260df28Joe Onorato if (packageName.equals(name.getPackageName())) { 125064e6be78dc72e1a89fe8fb95c502586f9260df28Joe Onorato toRemove.add(appInfo); 125164e6be78dc72e1a89fe8fb95c502586f9260df28Joe Onorato // TODO: This should probably be done on a worker thread 125264e6be78dc72e1a89fe8fb95c502586f9260df28Joe Onorato LauncherModel.deleteItemFromDatabase( 125364e6be78dc72e1a89fe8fb95c502586f9260df28Joe Onorato mLauncher, appInfo); 125464e6be78dc72e1a89fe8fb95c502586f9260df28Joe Onorato removedFromFolder = true; 125564e6be78dc72e1a89fe8fb95c502586f9260df28Joe Onorato } 125664e6be78dc72e1a89fe8fb95c502586f9260df28Joe Onorato } 1257629de3ef739883c0962423cc0c3a26299f162d3dRomain Guy } 1258629de3ef739883c0962423cc0c3a26299f162d3dRomain Guy } 1259aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung 1260629de3ef739883c0962423cc0c3a26299f162d3dRomain Guy contents.removeAll(toRemove); 1261629de3ef739883c0962423cc0c3a26299f162d3dRomain Guy if (removedFromFolder) { 1262629de3ef739883c0962423cc0c3a26299f162d3dRomain Guy final Folder folder = getOpenFolder(); 1263aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung if (folder != null) 1264aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung folder.notifyDataSetChanged(); 1265629de3ef739883c0962423cc0c3a26299f162d3dRomain Guy } 1266629de3ef739883c0962423cc0c3a26299f162d3dRomain Guy } else if (tag instanceof LiveFolderInfo) { 1267629de3ef739883c0962423cc0c3a26299f162d3dRomain Guy final LiveFolderInfo info = (LiveFolderInfo) tag; 1268629de3ef739883c0962423cc0c3a26299f162d3dRomain Guy final Uri uri = info.uri; 1269629de3ef739883c0962423cc0c3a26299f162d3dRomain Guy final ProviderInfo providerInfo = manager.resolveContentProvider( 1270629de3ef739883c0962423cc0c3a26299f162d3dRomain Guy uri.getAuthority(), 0); 1271629de3ef739883c0962423cc0c3a26299f162d3dRomain Guy 1272f11079b11e98912ed56546eaa300efd06c6eb917Joe Onorato if (providerInfo != null) { 127364e6be78dc72e1a89fe8fb95c502586f9260df28Joe Onorato for (String packageName: packageNames) { 127464e6be78dc72e1a89fe8fb95c502586f9260df28Joe Onorato if (packageName.equals(providerInfo.packageName)) { 127564e6be78dc72e1a89fe8fb95c502586f9260df28Joe Onorato // TODO: This should probably be done on a worker thread 127664e6be78dc72e1a89fe8fb95c502586f9260df28Joe Onorato LauncherModel.deleteItemFromDatabase(mLauncher, info); 1277aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung childrenToRemove.add(view); 127864e6be78dc72e1a89fe8fb95c502586f9260df28Joe Onorato } 127964e6be78dc72e1a89fe8fb95c502586f9260df28Joe Onorato } 1280629de3ef739883c0962423cc0c3a26299f162d3dRomain Guy } 1281629de3ef739883c0962423cc0c3a26299f162d3dRomain Guy } else if (tag instanceof LauncherAppWidgetInfo) { 1282629de3ef739883c0962423cc0c3a26299f162d3dRomain Guy final LauncherAppWidgetInfo info = (LauncherAppWidgetInfo) tag; 1283629de3ef739883c0962423cc0c3a26299f162d3dRomain Guy final AppWidgetProviderInfo provider = 1284629de3ef739883c0962423cc0c3a26299f162d3dRomain Guy widgets.getAppWidgetInfo(info.appWidgetId); 1285e1cc6c3745c9ba721b6ab888d74c9d9e1d13ea6aDaniel Sandler if (provider != null) { 128664e6be78dc72e1a89fe8fb95c502586f9260df28Joe Onorato for (String packageName: packageNames) { 128764e6be78dc72e1a89fe8fb95c502586f9260df28Joe Onorato if (packageName.equals(provider.provider.getPackageName())) { 128864e6be78dc72e1a89fe8fb95c502586f9260df28Joe Onorato // TODO: This should probably be done on a worker thread 128964e6be78dc72e1a89fe8fb95c502586f9260df28Joe Onorato LauncherModel.deleteItemFromDatabase(mLauncher, info); 1290aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung childrenToRemove.add(view); 129164e6be78dc72e1a89fe8fb95c502586f9260df28Joe Onorato } 129264e6be78dc72e1a89fe8fb95c502586f9260df28Joe Onorato } 1293629de3ef739883c0962423cc0c3a26299f162d3dRomain Guy } 1294574d20ec84551370987dde530c27ec493bdef564Romain Guy } 1295574d20ec84551370987dde530c27ec493bdef564Romain Guy } 1296aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung 1297629de3ef739883c0962423cc0c3a26299f162d3dRomain Guy childCount = childrenToRemove.size(); 1298629de3ef739883c0962423cc0c3a26299f162d3dRomain Guy for (int j = 0; j < childCount; j++) { 1299629de3ef739883c0962423cc0c3a26299f162d3dRomain Guy View child = childrenToRemove.get(j); 1300629de3ef739883c0962423cc0c3a26299f162d3dRomain Guy layout.removeViewInLayout(child); 1301629de3ef739883c0962423cc0c3a26299f162d3dRomain Guy if (child instanceof DropTarget) { 1302629de3ef739883c0962423cc0c3a26299f162d3dRomain Guy mDragController.removeDropTarget((DropTarget)child); 1303629de3ef739883c0962423cc0c3a26299f162d3dRomain Guy } 1304574d20ec84551370987dde530c27ec493bdef564Romain Guy } 1305aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung 1306629de3ef739883c0962423cc0c3a26299f162d3dRomain Guy if (childCount > 0) { 1307629de3ef739883c0962423cc0c3a26299f162d3dRomain Guy layout.requestLayout(); 1308629de3ef739883c0962423cc0c3a26299f162d3dRomain Guy layout.invalidate(); 13095c16f3ecd6b47bff3abbe40deb3d39c66a3b0012Romain Guy } 131031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 1311629de3ef739883c0962423cc0c3a26299f162d3dRomain Guy }); 131231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 131331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 1314f96811cdf564469a7a654a0c876288c9fd14f35eThe Android Open Source Project 131564e6be78dc72e1a89fe8fb95c502586f9260df28Joe Onorato void updateShortcuts(ArrayList<ApplicationInfo> apps) { 13169c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato final PackageManager pm = mLauncher.getPackageManager(); 13179c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato 1318dee0589388ba0f6373912e18bf86243282fb3b9bMichael Jurka final int screenCount = getChildCount(); 1319dee0589388ba0f6373912e18bf86243282fb3b9bMichael Jurka for (int i = 0; i < screenCount; i++) { 1320f96811cdf564469a7a654a0c876288c9fd14f35eThe Android Open Source Project final CellLayout layout = (CellLayout) getChildAt(i); 1321f96811cdf564469a7a654a0c876288c9fd14f35eThe Android Open Source Project int childCount = layout.getChildCount(); 1322f96811cdf564469a7a654a0c876288c9fd14f35eThe Android Open Source Project for (int j = 0; j < childCount; j++) { 1323f96811cdf564469a7a654a0c876288c9fd14f35eThe Android Open Source Project final View view = layout.getChildAt(j); 1324f96811cdf564469a7a654a0c876288c9fd14f35eThe Android Open Source Project Object tag = view.getTag(); 13250589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato if (tag instanceof ShortcutInfo) { 13260589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato ShortcutInfo info = (ShortcutInfo)tag; 1327f96811cdf564469a7a654a0c876288c9fd14f35eThe Android Open Source Project // We need to check for ACTION_MAIN otherwise getComponent() might 1328f96811cdf564469a7a654a0c876288c9fd14f35eThe Android Open Source Project // return null for some shortcuts (for instance, for shortcuts to 1329f96811cdf564469a7a654a0c876288c9fd14f35eThe Android Open Source Project // web pages.) 1330f96811cdf564469a7a654a0c876288c9fd14f35eThe Android Open Source Project final Intent intent = info.intent; 1331f96811cdf564469a7a654a0c876288c9fd14f35eThe Android Open Source Project final ComponentName name = intent.getComponent(); 1332f96811cdf564469a7a654a0c876288c9fd14f35eThe Android Open Source Project if (info.itemType == LauncherSettings.Favorites.ITEM_TYPE_APPLICATION && 133364e6be78dc72e1a89fe8fb95c502586f9260df28Joe Onorato Intent.ACTION_MAIN.equals(intent.getAction()) && name != null) { 133464e6be78dc72e1a89fe8fb95c502586f9260df28Joe Onorato final int appCount = apps.size(); 1335aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung for (int k = 0; k < appCount; k++) { 133664e6be78dc72e1a89fe8fb95c502586f9260df28Joe Onorato ApplicationInfo app = apps.get(k); 133764e6be78dc72e1a89fe8fb95c502586f9260df28Joe Onorato if (app.componentName.equals(name)) { 133864e6be78dc72e1a89fe8fb95c502586f9260df28Joe Onorato info.setIcon(mIconCache.getIcon(info.intent)); 133964e6be78dc72e1a89fe8fb95c502586f9260df28Joe Onorato ((TextView)view).setCompoundDrawablesWithIntrinsicBounds(null, 134064e6be78dc72e1a89fe8fb95c502586f9260df28Joe Onorato new FastBitmapDrawable(info.getIcon(mIconCache)), 134164e6be78dc72e1a89fe8fb95c502586f9260df28Joe Onorato null, null); 134264e6be78dc72e1a89fe8fb95c502586f9260df28Joe Onorato } 134364e6be78dc72e1a89fe8fb95c502586f9260df28Joe Onorato } 1344f96811cdf564469a7a654a0c876288c9fd14f35eThe Android Open Source Project } 1345f96811cdf564469a7a654a0c876288c9fd14f35eThe Android Open Source Project } 1346f96811cdf564469a7a654a0c876288c9fd14f35eThe Android Open Source Project } 1347f96811cdf564469a7a654a0c876288c9fd14f35eThe Android Open Source Project } 1348f96811cdf564469a7a654a0c876288c9fd14f35eThe Android Open Source Project } 1349f96811cdf564469a7a654a0c876288c9fd14f35eThe Android Open Source Project 135014f122bf847e50a3e7730ccbe57abc25d086a01bJoe Onorato void moveToDefaultScreen(boolean animate) { 1351c45b16862918a0c6c253bba12032165b030565afJoe Onorato if (animate) { 13524cb3724a2c1e5f278e1531d643accc40fcd8e219Michael Jurka if (mIsSmall) { 13530142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka unshrink(mDefaultPage); 13544cb3724a2c1e5f278e1531d643accc40fcd8e219Michael Jurka } else { 13550142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka snapToPage(mDefaultPage); 13564cb3724a2c1e5f278e1531d643accc40fcd8e219Michael Jurka } 1357c45b16862918a0c6c253bba12032165b030565afJoe Onorato } else { 13580142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka setCurrentPage(mDefaultPage); 1359c45b16862918a0c6c253bba12032165b030565afJoe Onorato } 13600142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka getChildAt(mDefaultPage).requestFocus(); 136131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 136231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 13638a73c51ee87b6d9b12daba188034889caf7a905bRomain Guy void setIndicators(Drawable previous, Drawable next) { 13648a73c51ee87b6d9b12daba188034889caf7a905bRomain Guy mPreviousIndicator = previous; 13658a73c51ee87b6d9b12daba188034889caf7a905bRomain Guy mNextIndicator = next; 13660142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka previous.setLevel(mCurrentPage); 13670142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka next.setLevel(mCurrentPage); 13688a73c51ee87b6d9b12daba188034889caf7a905bRomain Guy } 13698a73c51ee87b6d9b12daba188034889caf7a905bRomain Guy 13700142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka @Override 13710142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka public void syncPages() { 13720142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka } 137331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 13740142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka @Override 13750142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka public void syncPageItems(int page) { 137631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 13770142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka 137831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project} 1379