From 9df38dff2df1c58c890deaf9484b81e356fe1a8b Mon Sep 17 00:00:00 2001 From: Michael Jurka Date: Mon, 12 Nov 2012 18:07:02 -0800 Subject: Updating wallpaper picker icon to higher res Bug: 7400295 Change-Id: I2c7625ee1ce09ded57d884c229f155ebcf39be07 --- AndroidManifest.xml | 4 ++-- res/drawable-hdpi/ic_launcher_home.png | Bin 4048 -> 0 bytes res/drawable-hdpi/ic_launcher_wallpaper.png | Bin 4034 -> 0 bytes res/drawable-mdpi/ic_launcher_home.png | Bin 3116 -> 0 bytes res/drawable-mdpi/ic_launcher_wallpaper.png | Bin 2850 -> 0 bytes res/drawable-xhdpi/ic_launcher_home.png | Bin 7810 -> 0 bytes res/drawable-xhdpi/ic_launcher_wallpaper.png | Bin 7201 -> 0 bytes res/mipmap-hdpi/ic_launcher_home.png | Bin 0 -> 4048 bytes res/mipmap-hdpi/ic_launcher_wallpaper.png | Bin 0 -> 4418 bytes res/mipmap-mdpi/ic_launcher_home.png | Bin 0 -> 3116 bytes res/mipmap-mdpi/ic_launcher_wallpaper.png | Bin 0 -> 2871 bytes res/mipmap-xhdpi/ic_launcher_home.png | Bin 0 -> 7810 bytes res/mipmap-xhdpi/ic_launcher_wallpaper.png | Bin 0 -> 6061 bytes res/mipmap-xxhdpi/ic_launcher_wallpaper.png | Bin 0 -> 7596 bytes src/com/android/launcher2/AddAdapter.java | 2 +- 15 files changed, 3 insertions(+), 3 deletions(-) delete mode 100644 res/drawable-hdpi/ic_launcher_home.png delete mode 100644 res/drawable-hdpi/ic_launcher_wallpaper.png delete mode 100644 res/drawable-mdpi/ic_launcher_home.png delete mode 100644 res/drawable-mdpi/ic_launcher_wallpaper.png delete mode 100644 res/drawable-xhdpi/ic_launcher_home.png delete mode 100644 res/drawable-xhdpi/ic_launcher_wallpaper.png create mode 100644 res/mipmap-hdpi/ic_launcher_home.png create mode 100644 res/mipmap-hdpi/ic_launcher_wallpaper.png create mode 100644 res/mipmap-mdpi/ic_launcher_home.png create mode 100644 res/mipmap-mdpi/ic_launcher_wallpaper.png create mode 100644 res/mipmap-xhdpi/ic_launcher_home.png create mode 100644 res/mipmap-xhdpi/ic_launcher_wallpaper.png create mode 100644 res/mipmap-xxhdpi/ic_launcher_wallpaper.png diff --git a/AndroidManifest.xml b/AndroidManifest.xml index adb6ef352..c14b63ed8 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -64,7 +64,7 @@ @@ -88,7 +88,7 @@ android:name="com.android.launcher2.WallpaperChooser" android:theme="@style/Theme.WallpaperPicker" android:label="@string/pick_wallpaper" - android:icon="@drawable/ic_launcher_wallpaper" + android:icon="@mipmap/ic_launcher_wallpaper" android:finishOnCloseSystemDialogs="true" android:process=":wallpaper_chooser"> diff --git a/res/drawable-hdpi/ic_launcher_home.png b/res/drawable-hdpi/ic_launcher_home.png deleted file mode 100644 index 8945ada34..000000000 Binary files a/res/drawable-hdpi/ic_launcher_home.png and /dev/null differ diff --git a/res/drawable-hdpi/ic_launcher_wallpaper.png b/res/drawable-hdpi/ic_launcher_wallpaper.png deleted file mode 100644 index 5c8ee24bb..000000000 Binary files a/res/drawable-hdpi/ic_launcher_wallpaper.png and /dev/null differ diff --git a/res/drawable-mdpi/ic_launcher_home.png b/res/drawable-mdpi/ic_launcher_home.png deleted file mode 100644 index 72bd80a2f..000000000 Binary files a/res/drawable-mdpi/ic_launcher_home.png and /dev/null differ diff --git a/res/drawable-mdpi/ic_launcher_wallpaper.png b/res/drawable-mdpi/ic_launcher_wallpaper.png deleted file mode 100644 index d2803b1ca..000000000 Binary files a/res/drawable-mdpi/ic_launcher_wallpaper.png and /dev/null differ diff --git a/res/drawable-xhdpi/ic_launcher_home.png b/res/drawable-xhdpi/ic_launcher_home.png deleted file mode 100644 index 7bef13ca7..000000000 Binary files a/res/drawable-xhdpi/ic_launcher_home.png and /dev/null differ diff --git a/res/drawable-xhdpi/ic_launcher_wallpaper.png b/res/drawable-xhdpi/ic_launcher_wallpaper.png deleted file mode 100644 index 9b0b7b2bc..000000000 Binary files a/res/drawable-xhdpi/ic_launcher_wallpaper.png and /dev/null differ diff --git a/res/mipmap-hdpi/ic_launcher_home.png b/res/mipmap-hdpi/ic_launcher_home.png new file mode 100644 index 000000000..8945ada34 Binary files /dev/null and b/res/mipmap-hdpi/ic_launcher_home.png differ diff --git a/res/mipmap-hdpi/ic_launcher_wallpaper.png b/res/mipmap-hdpi/ic_launcher_wallpaper.png new file mode 100644 index 000000000..affee851d Binary files /dev/null and b/res/mipmap-hdpi/ic_launcher_wallpaper.png differ diff --git a/res/mipmap-mdpi/ic_launcher_home.png b/res/mipmap-mdpi/ic_launcher_home.png new file mode 100644 index 000000000..72bd80a2f Binary files /dev/null and b/res/mipmap-mdpi/ic_launcher_home.png differ diff --git a/res/mipmap-mdpi/ic_launcher_wallpaper.png b/res/mipmap-mdpi/ic_launcher_wallpaper.png new file mode 100644 index 000000000..cb4443bdb Binary files /dev/null and b/res/mipmap-mdpi/ic_launcher_wallpaper.png differ diff --git a/res/mipmap-xhdpi/ic_launcher_home.png b/res/mipmap-xhdpi/ic_launcher_home.png new file mode 100644 index 000000000..7bef13ca7 Binary files /dev/null and b/res/mipmap-xhdpi/ic_launcher_home.png differ diff --git a/res/mipmap-xhdpi/ic_launcher_wallpaper.png b/res/mipmap-xhdpi/ic_launcher_wallpaper.png new file mode 100644 index 000000000..60f8dceec Binary files /dev/null and b/res/mipmap-xhdpi/ic_launcher_wallpaper.png differ diff --git a/res/mipmap-xxhdpi/ic_launcher_wallpaper.png b/res/mipmap-xxhdpi/ic_launcher_wallpaper.png new file mode 100644 index 000000000..023fb5886 Binary files /dev/null and b/res/mipmap-xxhdpi/ic_launcher_wallpaper.png differ diff --git a/src/com/android/launcher2/AddAdapter.java b/src/com/android/launcher2/AddAdapter.java index c2a424b00..c0bb17b72 100644 --- a/src/com/android/launcher2/AddAdapter.java +++ b/src/com/android/launcher2/AddAdapter.java @@ -71,7 +71,7 @@ public class AddAdapter extends BaseAdapter { Resources res = launcher.getResources(); mItems.add(new ListItem(res, R.string.group_wallpapers, - R.drawable.ic_launcher_wallpaper, ITEM_WALLPAPER)); + R.mipmap.ic_launcher_wallpaper, ITEM_WALLPAPER)); } public View getView(int position, View convertView, ViewGroup parent) { -- cgit v1.2.3 From 3c1681d5f7d56af5b25126d1c2b2ba7aa799deca Mon Sep 17 00:00:00 2001 From: Michael Jurka Date: Thu, 15 Nov 2012 14:11:41 -0800 Subject: Cleaning up unused code --- src/com/android/launcher2/AppsCustomizePagedView.java | 1 - src/com/android/launcher2/LauncherAppWidgetInfo.java | 1 - src/com/android/launcher2/LauncherModel.java | 2 -- src/com/android/launcher2/Workspace.java | 1 - 4 files changed, 5 deletions(-) diff --git a/src/com/android/launcher2/AppsCustomizePagedView.java b/src/com/android/launcher2/AppsCustomizePagedView.java index 5580381ca..6a959daff 100644 --- a/src/com/android/launcher2/AppsCustomizePagedView.java +++ b/src/com/android/launcher2/AppsCustomizePagedView.java @@ -51,7 +51,6 @@ import android.util.Log; import android.view.Gravity; import android.view.KeyEvent; import android.view.LayoutInflater; -import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import android.view.animation.AccelerateInterpolator; diff --git a/src/com/android/launcher2/LauncherAppWidgetInfo.java b/src/com/android/launcher2/LauncherAppWidgetInfo.java index 602695a46..f001b2b64 100644 --- a/src/com/android/launcher2/LauncherAppWidgetInfo.java +++ b/src/com/android/launcher2/LauncherAppWidgetInfo.java @@ -19,7 +19,6 @@ package com.android.launcher2; import android.appwidget.AppWidgetHostView; import android.content.ComponentName; import android.content.ContentValues; -import android.os.Build; /** * Represents a widget (either instantiated or about to be) in the Launcher. diff --git a/src/com/android/launcher2/LauncherModel.java b/src/com/android/launcher2/LauncherModel.java index 730231003..ccf83282c 100644 --- a/src/com/android/launcher2/LauncherModel.java +++ b/src/com/android/launcher2/LauncherModel.java @@ -578,8 +578,6 @@ public class LauncherModel extends BroadcastReceiver { values.put(LauncherSettings.Favorites._ID, item.id); item.updateValuesWithCoordinates(values, item.cellX, item.cellY); - final StackTraceElement[] stackTrace = new Throwable().getStackTrace(); - Runnable r = new Runnable() { public void run() { String transaction = "DbDebug Add item (" + item.title + ") to db, id: " diff --git a/src/com/android/launcher2/Workspace.java b/src/com/android/launcher2/Workspace.java index 4940ae0b1..2c44aca07 100644 --- a/src/com/android/launcher2/Workspace.java +++ b/src/com/android/launcher2/Workspace.java @@ -39,7 +39,6 @@ import android.graphics.PointF; import android.graphics.Rect; import android.graphics.Region.Op; import android.graphics.drawable.Drawable; -import android.os.Build; import android.os.IBinder; import android.os.Parcelable; import android.util.AttributeSet; -- cgit v1.2.3 From 360310b74de10d7bd2cc0a2ab874b1d246a6a7ba Mon Sep 17 00:00:00 2001 From: Craig Mautner Date: Fri, 26 Oct 2012 15:13:08 -0700 Subject: Extend background to full screen. Gradient and black backgrounds were stopping at the Status Bar. When returning from a full screen app to the launcher the wallpaper was completely visible when it should have been obscured by these backgrounds. Making the app full screen while keeping the views within the system insets fixes this. Bug 7410717 fixed. Change-Id: If3f7e4808961ee6c80fe2d0a328e6ca39fa5eb7a --- res/layout-land/launcher.xml | 175 +++++++++++---------- res/layout-port/launcher.xml | 169 +++++++++++--------- res/layout-sw720dp/launcher.xml | 171 ++++++++++---------- .../android/launcher2/AppWidgetResizeFrame.java | 6 +- src/com/android/launcher2/Launcher.java | 32 +++- 5 files changed, 306 insertions(+), 247 deletions(-) diff --git a/res/layout-land/launcher.xml b/res/layout-land/launcher.xml index 7f705f5e7..0892352a9 100644 --- a/res/layout-land/launcher.xml +++ b/res/layout-land/launcher.xml @@ -14,94 +14,105 @@ limitations under the License. --> - + + android:layout_height="match_parent" + android:background="@drawable/workspace_bg"> - - - - - - - - - - - - - - - - - - - - + android:fitsSystemWindows="true"> - + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/res/layout-port/launcher.xml b/res/layout-port/launcher.xml index a4275010b..ad7eff4ba 100644 --- a/res/layout-port/launcher.xml +++ b/res/layout-port/launcher.xml @@ -14,90 +14,103 @@ limitations under the License. --> - + + android:layout_height="match_parent" + android:background="@drawable/workspace_bg"> - - - - - - - - - - - - - - - - - - - - - + + android:fitsSystemWindows="true"> - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/res/layout-sw720dp/launcher.xml b/res/layout-sw720dp/launcher.xml index 418469b9b..b5540423e 100644 --- a/res/layout-sw720dp/launcher.xml +++ b/res/layout-sw720dp/launcher.xml @@ -14,91 +14,104 @@ limitations under the License. --> - + + android:layout_height="match_parent" + android:background="@drawable/workspace_bg"> - - - - - - - - - - - - - - - - - - - - - + + android:fitsSystemWindows="true"> - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/com/android/launcher2/AppWidgetResizeFrame.java b/src/com/android/launcher2/AppWidgetResizeFrame.java index 7762ece5f..13ee6f913 100644 --- a/src/com/android/launcher2/AppWidgetResizeFrame.java +++ b/src/com/android/launcher2/AppWidgetResizeFrame.java @@ -399,8 +399,10 @@ public class AppWidgetResizeFrame extends FrameLayout { public void snapToWidget(boolean animate) { final DragLayer.LayoutParams lp = (DragLayer.LayoutParams) getLayoutParams(); - int xOffset = mCellLayout.getLeft() + mCellLayout.getPaddingLeft() - mWorkspace.getScrollX(); - int yOffset = mCellLayout.getTop() + mCellLayout.getPaddingTop() - mWorkspace.getScrollY(); + int xOffset = mCellLayout.getLeft() + mCellLayout.getPaddingLeft() + + mDragLayer.getPaddingLeft() - mWorkspace.getScrollX(); + int yOffset = mCellLayout.getTop() + mCellLayout.getPaddingTop() + + mDragLayer.getPaddingTop() - mWorkspace.getScrollY(); int newWidth = mWidgetView.getWidth() + 2 * mBackgroundPadding - mWidgetPaddingLeft - mWidgetPaddingRight; diff --git a/src/com/android/launcher2/Launcher.java b/src/com/android/launcher2/Launcher.java index c221815a4..ffd63d28c 100644 --- a/src/com/android/launcher2/Launcher.java +++ b/src/com/android/launcher2/Launcher.java @@ -50,8 +50,10 @@ import android.content.res.Resources; import android.database.ContentObserver; import android.graphics.Bitmap; import android.graphics.Canvas; +import android.graphics.Color; import android.graphics.PorterDuff; import android.graphics.Rect; +import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.Drawable; import android.net.Uri; import android.os.AsyncTask; @@ -209,6 +211,7 @@ public final class Launcher extends Activity private Workspace mWorkspace; private View mQsbDivider; private View mDockDivider; + private View mLauncherView; private DragLayer mDragLayer; private DragController mDragController; @@ -280,6 +283,9 @@ public final class Launcher extends Activity private static Drawable.ConstantState[] sVoiceSearchIcon = new Drawable.ConstantState[2]; private static Drawable.ConstantState[] sAppMarketIcon = new Drawable.ConstantState[2]; + private Drawable mWorkspaceBackgroundDrawable; + private Drawable mBlackBackgroundDrawable; + private final ArrayList mSynchronouslyBoundPages = new ArrayList(); static final ArrayList sDumpLogs = new ArrayList(); @@ -727,6 +733,9 @@ public final class Launcher extends Activity } mOnResumeState = State.NONE; + // Background was set to gradient in onPause(), restore to black if in all apps. + setWorkspaceBackground(mState == State.WORKSPACE); + // Process any items that were added while Launcher was away InstallShortcutReceiver.flushInstallQueue(this); @@ -928,10 +937,15 @@ public final class Launcher extends Activity private void setupViews() { final DragController dragController = mDragController; + mLauncherView = findViewById(R.id.launcher); mDragLayer = (DragLayer) findViewById(R.id.drag_layer); mWorkspace = (Workspace) mDragLayer.findViewById(R.id.workspace); - mQsbDivider = (ImageView) findViewById(R.id.qsb_divider); - mDockDivider = (ImageView) findViewById(R.id.dock_divider); + mQsbDivider = findViewById(R.id.qsb_divider); + mDockDivider = findViewById(R.id.dock_divider); + + mLauncherView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN); + mWorkspaceBackgroundDrawable = getResources().getDrawable(R.drawable.workspace_bg); + mBlackBackgroundDrawable = new ColorDrawable(Color.BLACK); // Setup the drag layer mDragLayer.setup(this, dragController); @@ -952,12 +966,11 @@ public final class Launcher extends Activity mSearchDropTargetBar = (SearchDropTargetBar) mDragLayer.findViewById(R.id.qsb_bar); // Setup AppsCustomize - mAppsCustomizeTabHost = (AppsCustomizeTabHost) - findViewById(R.id.apps_customize_pane); + mAppsCustomizeTabHost = (AppsCustomizeTabHost) findViewById(R.id.apps_customize_pane); mAppsCustomizeContent = (AppsCustomizePagedView) mAppsCustomizeTabHost.findViewById(R.id.apps_customize_pane_content); mAppsCustomizeContent.setup(this, dragController); - + // Setup the drag controller (drop targets have to be added in reverse order in priority) dragController.setDragScoller(mWorkspace); dragController.setScrollView(mDragLayer); @@ -2351,10 +2364,12 @@ public final class Launcher extends Activity } // Now a part of LauncherModel.Callbacks. Used to reorder loading steps. + @Override public boolean isAllAppsVisible() { return (mState == State.APPS_CUSTOMIZE) || (mOnResumeState == State.APPS_CUSTOMIZE); } + @Override public boolean isAllAppsButtonRank(int rank) { return mHotseat.isAllAppsButtonRank(rank); } @@ -2362,7 +2377,6 @@ public final class Launcher extends Activity /** * Helper method for the cameraZoomIn/cameraZoomOut animations * @param view The view being animated - * @param state The state that we are moving in or out of (eg. APPS_CUSTOMIZE) * @param scaleFactor The scale factor used for the zoom */ private void setPivotsForZoom(View view, float scaleFactor) { @@ -2380,6 +2394,11 @@ public final class Launcher extends Activity } } + private void setWorkspaceBackground(boolean workspace) { + mLauncherView.setBackground(workspace ? + mWorkspaceBackgroundDrawable : mBlackBackgroundDrawable); + } + void updateWallpaperVisibility(boolean visible) { int wpflags = visible ? WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER : 0; int curflags = getWindow().getAttributes().flags @@ -2387,6 +2406,7 @@ public final class Launcher extends Activity if (wpflags != curflags) { getWindow().setFlags(wpflags, WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER); } + setWorkspaceBackground(visible); } private void dispatchOnLauncherTransitionPrepare(View v, boolean animated, boolean toWorkspace) { -- cgit v1.2.3 From ffc2682a9784e03d7cc9943f4f408255f8468b96 Mon Sep 17 00:00:00 2001 From: Michael Jurka Date: Fri, 16 Nov 2012 18:21:22 -0800 Subject: Fix NPE Bug: 7441452 --- src/com/android/launcher2/Launcher.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/com/android/launcher2/Launcher.java b/src/com/android/launcher2/Launcher.java index ffd63d28c..f0077a6af 100644 --- a/src/com/android/launcher2/Launcher.java +++ b/src/com/android/launcher2/Launcher.java @@ -1403,6 +1403,10 @@ public final class Launcher extends Activity Runnable processIntent = new Runnable() { public void run() { + if (mWorkspace == null) { + // Can be cases where mWorkspace is null, this prevents a NPE + return; + } Folder openFolder = mWorkspace.getOpenFolder(); // In all these cases, only animate if we're already on home mWorkspace.exitWidgetResizeMode(); -- cgit v1.2.3 From 0a457bfbd9ca6562e8fcd604bcdfeb22f1fb4ded Mon Sep 17 00:00:00 2001 From: Michael Jurka Date: Mon, 19 Nov 2012 14:05:05 -0800 Subject: Fix StrictMode violation Switching how we set a property to tell launcher to force rotation to be enabled, or to dump state. Bug: 7538629 Change-Id: I8cb55f1a28ba59fe5d410562c66bc86eb9efabfe --- src/com/android/launcher2/Launcher.java | 28 ++++++++++------------------ 1 file changed, 10 insertions(+), 18 deletions(-) diff --git a/src/com/android/launcher2/Launcher.java b/src/com/android/launcher2/Launcher.java index f0077a6af..002b52045 100644 --- a/src/com/android/launcher2/Launcher.java +++ b/src/com/android/launcher2/Launcher.java @@ -101,7 +101,6 @@ import com.android.launcher2.DropTarget.DragObject; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.FileDescriptor; -import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.PrintWriter; @@ -148,8 +147,10 @@ public final class Launcher extends Activity static final int DEFAULT_SCREEN = 2; private static final String PREFERENCES = "launcher.preferences"; - static final String FORCE_ENABLE_ROTATION_PROPERTY = "debug.force_enable_rotation"; - static final String DUMP_STATE_PROPERTY = "debug.dumpstate"; + // To turn on these properties, type + // adb shell setprop log.tag.PROPERTY_NAME [VERBOSE | SUPPRESS] + static final String FORCE_ENABLE_ROTATION_PROPERTY = "launcher_force_rotate"; + static final String DUMP_STATE_PROPERTY = "launcher_dump_state"; // The Intent extra that defines whether to ignore the launch animation static final String INTENT_EXTRA_IGNORE_LAUNCH_ANIMATION = @@ -319,6 +320,8 @@ public final class Launcher extends Activity private static ArrayList sPendingAddList = new ArrayList(); + private static boolean sForceEnableRotation = isPropertyEnabled(FORCE_ENABLE_ROTATION_PROPERTY); + private static class PendingAddArguments { int requestCode; Intent intent; @@ -328,18 +331,8 @@ public final class Launcher extends Activity int cellY; } - - private boolean doesFileExist(String filename) { - FileInputStream fis = null; - try { - fis = openFileInput(filename); - fis.close(); - return true; - } catch (java.io.FileNotFoundException e) { - return false; - } catch (java.io.IOException e) { - return true; - } + private static boolean isPropertyEnabled(String propertyName) { + return Log.isLoggable(propertyName, Log.VERBOSE); } @Override @@ -1883,7 +1876,7 @@ public final class Launcher extends Activity case KeyEvent.KEYCODE_HOME: return true; case KeyEvent.KEYCODE_VOLUME_DOWN: - if (doesFileExist(DUMP_STATE_PROPERTY)) { + if (isPropertyEnabled(DUMP_STATE_PROPERTY)) { dumpState(); return true; } @@ -3682,8 +3675,7 @@ public final class Launcher extends Activity } public boolean isRotationEnabled() { - boolean forceEnableRotation = doesFileExist(FORCE_ENABLE_ROTATION_PROPERTY); - boolean enableRotation = forceEnableRotation || + boolean enableRotation = sForceEnableRotation || getResources().getBoolean(R.bool.allow_rotation); return enableRotation; } -- cgit v1.2.3 From f3900c287cd92f61863cbecab87d5513e48b7b09 Mon Sep 17 00:00:00 2001 From: Adam Cohen Date: Fri, 16 Nov 2012 18:28:11 -0800 Subject: Refactoring push reordering (issue 7139335) -> This new approach is actually correct in emulating cascaded pushing of items left, right, up and down. -> Takes care of a couple crashes and some instances where reordering was not doing the right thing. Change-Id: I016120e62f5d6fa1a2a6289c3badcb6ec230b2a3 --- src/com/android/launcher2/CellLayout.java | 521 +++++++++++++++++++++--------- 1 file changed, 366 insertions(+), 155 deletions(-) diff --git a/src/com/android/launcher2/CellLayout.java b/src/com/android/launcher2/CellLayout.java index f742255cc..7818da435 100644 --- a/src/com/android/launcher2/CellLayout.java +++ b/src/com/android/launcher2/CellLayout.java @@ -53,6 +53,8 @@ import com.android.launcher2.FolderIcon.FolderRingAnimator; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; +import java.util.Comparator; import java.util.HashMap; import java.util.Stack; @@ -1554,48 +1556,6 @@ public class CellLayout extends ViewGroup { return bestXY; } - private int[] findNearestAreaInDirection(int cellX, int cellY, int spanX, int spanY, - int[] direction,boolean[][] occupied, - boolean blockOccupied[][], int[] result) { - // Keep track of best-scoring drop area - final int[] bestXY = result != null ? result : new int[2]; - bestXY[0] = -1; - bestXY[1] = -1; - float bestDistance = Float.MAX_VALUE; - - // We use this to march in a single direction - if ((direction[0] != 0 && direction[1] != 0) || - (direction[0] == 0 && direction[1] == 0)) { - return bestXY; - } - - // This will only incrememnet one of x or y based on the assertion above - int x = cellX + direction[0]; - int y = cellY + direction[1]; - while (x >= 0 && x + spanX <= mCountX && y >= 0 && y + spanY <= mCountY) { - boolean fail = false; - for (int i = 0; i < spanX; i++) { - for (int j = 0; j < spanY; j++) { - if (occupied[x + i][y + j] && (blockOccupied == null || blockOccupied[i][j])) { - fail = true; - } - } - } - if (!fail) { - float distance = (float) - Math.sqrt((x - cellX) * (x - cellX) + (y - cellY) * (y - cellY)); - if (Float.compare(distance, bestDistance) < 0) { - bestDistance = distance; - bestXY[0] = x; - bestXY[1] = y; - } - } - x += direction[0]; - y += direction[1]; - } - return bestXY; - } - private boolean addViewToTempLocation(View v, Rect rectOccupiedByPotentialDrop, int[] direction, ItemConfiguration currentState) { CellAndSpan c = currentState.map.get(v); @@ -1609,118 +1569,343 @@ public class CellLayout extends ViewGroup { c.x = mTempLocation[0]; c.y = mTempLocation[1]; success = true; - } markCellsForView(c.x, c.y, c.spanX, c.spanY, mTmpOccupied, true); return success; } - // This method looks in the specified direction to see if there are additional views adjacent - // to the current set of views. If there are, then these views are added to the current - // set of views. This is performed iteratively, giving a cascading push behaviour. - private boolean addViewInDirection(ArrayList views, Rect boundingRect, int[] direction, - boolean[][] occupied, View dragView, ItemConfiguration currentState) { - boolean found = false; + /** + * This helper class defines a cluster of views. It helps with defining complex edges + * of the cluster and determining how those edges interact with other views. The edges + * essentially define a fine-grained boundary around the cluster of views -- like a more + * precise version of a bounding box. + */ + private class ViewCluster { + final static int LEFT = 0; + final static int TOP = 1; + final static int RIGHT = 2; + final static int BOTTOM = 3; + + ArrayList views; + ItemConfiguration config; + Rect boundingRect = new Rect(); + + int[] leftEdge = new int[mCountY]; + int[] rightEdge = new int[mCountY]; + int[] topEdge = new int[mCountX]; + int[] bottomEdge = new int[mCountX]; + boolean leftEdgeDirty, rightEdgeDirty, topEdgeDirty, bottomEdgeDirty, boundingRectDirty; - int childCount = mShortcutsAndWidgets.getChildCount(); - Rect r0 = new Rect(boundingRect); - Rect r1 = new Rect(); + @SuppressWarnings("unchecked") + public ViewCluster(ArrayList views, ItemConfiguration config) { + this.views = (ArrayList) views.clone(); + this.config = config; + resetEdges(); + } - // First, we consider the rect of the views that we are trying to translate - int deltaX = 0; - int deltaY = 0; - if (direction[1] < 0) { - r0.set(r0.left, r0.top - 1, r0.right, r0.bottom - 1); - deltaY = -1; - } else if (direction[1] > 0) { - r0.set(r0.left, r0.top + 1, r0.right, r0.bottom + 1); - deltaY = 1; - } else if (direction[0] < 0) { - r0.set(r0.left - 1, r0.top, r0.right - 1, r0.bottom); - deltaX = -1; - } else if (direction[0] > 0) { - r0.set(r0.left + 1, r0.top, r0.right + 1, r0.bottom); - deltaX = 1; + void resetEdges() { + for (int i = 0; i < mCountX; i++) { + topEdge[i] = -1; + bottomEdge[i] = -1; + } + for (int i = 0; i < mCountY; i++) { + leftEdge[i] = -1; + rightEdge[i] = -1; + } + leftEdgeDirty = true; + rightEdgeDirty = true; + bottomEdgeDirty = true; + topEdgeDirty = true; + boundingRectDirty = true; + } + + void computeEdge(int which, int[] edge) { + int count = views.size(); + for (int i = 0; i < count; i++) { + CellAndSpan cs = config.map.get(views.get(i)); + switch (which) { + case LEFT: + int left = cs.x; + for (int j = cs.y; j < cs.y + cs.spanY; j++) { + if (left < edge[j] || edge[j] < 0) { + edge[j] = left; + } + } + break; + case RIGHT: + int right = cs.x + cs.spanX; + for (int j = cs.y; j < cs.y + cs.spanY; j++) { + if (right > edge[j]) { + edge[j] = right; + } + } + break; + case TOP: + int top = cs.y; + for (int j = cs.x; j < cs.x + cs.spanX; j++) { + if (top < edge[j] || edge[j] < 0) { + edge[j] = top; + } + } + break; + case BOTTOM: + int bottom = cs.y + cs.spanY; + for (int j = cs.x; j < cs.x + cs.spanX; j++) { + if (bottom > edge[j]) { + edge[j] = bottom; + } + } + break; + } + } } - // Now we see which views, if any, are being overlapped by shifting the current group - // of views in the desired direction. - for (int i = 0; i < childCount; i++) { - // We don't need to worry about views already in our group, or the current drag view. - View child = mShortcutsAndWidgets.getChildAt(i); - if (views.contains(child) || child == dragView) continue; - CellAndSpan c = currentState.map.get(child); + boolean isViewTouchingEdge(View v, int whichEdge) { + CellAndSpan cs = config.map.get(v); - LayoutParams lp = (LayoutParams) child.getLayoutParams(); - r1.set(c.x, c.y, c.x + c.spanX, c.y + c.spanY); - if (Rect.intersects(r0, r1)) { - if (!lp.canReorder) { - return false; - } - // First we verify that the view in question is at the border of the extents - // of the block of items we are pushing - if ((direction[0] < 0 && c.x == r0.left) || - (direction[0] > 0 && c.x == r0.right - 1) || - (direction[1] < 0 && c.y == r0.top) || - (direction[1] > 0 && c.y == r0.bottom - 1)) { - boolean pushed = false; - // Since the bounding rect is a coarse description of the region (there can - // be holes at the edge of the block), we need to check to verify that a solid - // piece is intersecting. This ensures that interlocking is possible. - for (int x = c.x; x < c.x + c.spanX; x++) { - for (int y = c.y; y < c.y + c.spanY; y++) { - if (occupied[x - deltaX][y - deltaY]) { - pushed = true; - break; - } - if (pushed) break; + int[] edge = getEdge(whichEdge); + + switch (whichEdge) { + case LEFT: + for (int i = cs.y; i < cs.y + cs.spanY; i++) { + if (edge[i] == cs.x + cs.spanX) { + return true; } } - if (pushed) { - views.add(child); + break; + case RIGHT: + for (int i = cs.y; i < cs.y + cs.spanY; i++) { + if (edge[i] == cs.x) { + return true; + } + } + break; + case TOP: + for (int i = cs.x; i < cs.x + cs.spanX; i++) { + if (edge[i] == cs.y + cs.spanY) { + return true; + } + } + break; + case BOTTOM: + for (int i = cs.x; i < cs.x + cs.spanX; i++) { + if (edge[i] == cs.y) { + return true; + } + } + break; + } + return false; + } + + void shift(int whichEdge, int delta) { + for (View v: views) { + CellAndSpan c = config.map.get(v); + switch (whichEdge) { + case LEFT: + c.x -= delta; + break; + case RIGHT: + c.x += delta; + break; + case TOP: + c.y -= delta; + break; + case BOTTOM: + default: + c.y += delta; + break; + } + } + resetEdges(); + } + + public void addView(View v) { + views.add(v); + resetEdges(); + } + + public Rect getBoundingRect() { + if (boundingRectDirty) { + boolean first = true; + for (View v: views) { + CellAndSpan c = config.map.get(v); + if (first) { + boundingRect.set(c.x, c.y, c.x + c.spanX, c.y + c.spanY); + first = false; + } else { boundingRect.union(c.x, c.y, c.x + c.spanX, c.y + c.spanY); - found = true; } } } + return boundingRect; + } + + public int[] getEdge(int which) { + switch (which) { + case LEFT: + return getLeftEdge(); + case RIGHT: + return getRightEdge(); + case TOP: + return getTopEdge(); + case BOTTOM: + default: + return getBottomEdge(); + } + } + + public int[] getLeftEdge() { + if (leftEdgeDirty) { + computeEdge(LEFT, leftEdge); + } + return leftEdge; + } + + public int[] getRightEdge() { + if (rightEdgeDirty) { + computeEdge(RIGHT, rightEdge); + } + return rightEdge; + } + + public int[] getTopEdge() { + if (topEdgeDirty) { + computeEdge(TOP, topEdge); + } + return topEdge; + } + + public int[] getBottomEdge() { + if (bottomEdgeDirty) { + computeEdge(BOTTOM, bottomEdge); + } + return bottomEdge; + } + + PositionComparator comparator = new PositionComparator(); + class PositionComparator implements Comparator { + int whichEdge = 0; + public int compare(View left, View right) { + CellAndSpan l = config.map.get(left); + CellAndSpan r = config.map.get(right); + switch (whichEdge) { + case LEFT: + return (r.x + r.spanX) - (l.x + l.spanX); + case RIGHT: + return l.x - r.x; + case TOP: + return (r.y + r.spanY) - (l.y + l.spanY); + case BOTTOM: + default: + return l.y - r.y; + } + } + } + + public void sortConfigurationForEdgePush(int edge) { + comparator.whichEdge = edge; + Collections.sort(config.sortedViews, comparator); } - return found; } - private void completeSetOfViewsToMove(ArrayList views, Rect boundingRect, int[] direction, - boolean[][] occupied, View dragView, ItemConfiguration currentState) { - Rect r0 = new Rect(boundingRect); - int minRuns = 0; + private boolean pushViewsToTempLocation(ArrayList views, Rect rectOccupiedByPotentialDrop, + int[] direction, View dragView, ItemConfiguration currentState) { + + ViewCluster cluster = new ViewCluster(views, currentState); + Rect clusterRect = cluster.getBoundingRect(); + int whichEdge; + int pushDistance; + boolean fail = false; - // The first thing we do is to reduce the bounding rect to first or last row or column, - // depending on the direction. Then, we add any necessary views that are already contained - // by the bounding rect, but aren't in the list of intersecting views, and will be pushed - // by something already in the intersecting views. - if (direction[1] < 0) { - r0.set(r0.left, r0.bottom - 1, r0.right, r0.bottom); - } else if (direction[1] > 0) { - r0.set(r0.left, r0.top, r0.right, r0.top + 1); - } else if (direction[0] < 0) { - r0.set(r0.right - 1, r0.top, r0.right, r0.bottom); + // Determine the edge of the cluster that will be leading the push and how far + // the cluster must be shifted. + if (direction[0] < 0) { + whichEdge = ViewCluster.LEFT; + pushDistance = clusterRect.right - rectOccupiedByPotentialDrop.left; } else if (direction[0] > 0) { - r0.set(r0.left, r0.top, r0.left + 1, r0.bottom); + whichEdge = ViewCluster.RIGHT; + pushDistance = rectOccupiedByPotentialDrop.right - clusterRect.left; + } else if (direction[1] < 0) { + whichEdge = ViewCluster.TOP; + pushDistance = clusterRect.bottom - rectOccupiedByPotentialDrop.top; + } else { + whichEdge = ViewCluster.BOTTOM; + pushDistance = rectOccupiedByPotentialDrop.bottom - clusterRect.top; + } + + // Break early for invalid push distance. + if (pushDistance <= 0) { + return false; } - minRuns = Math.max(Math.abs(boundingRect.width() - r0.width()), - Math.abs(boundingRect.height() - r0.height())) + 1; + // Mark the occupied state as false for the group of views we want to move. + for (View v: views) { + CellAndSpan c = currentState.map.get(v); + markCellsForView(c.x, c.y, c.spanX, c.spanY, mTmpOccupied, false); + } + + // We save the current configuration -- if we fail to find a solution we will revert + // to the initial state. The process of finding a solution modifies the configuration + // in place, hence the need for revert in the failure case. + currentState.save(); + + // The pushing algorithm is simplified by considering the views in the order in which + // they would be pushed by the cluster. For example, if the cluster is leading with its + // left edge, we consider sort the views by their right edge, from right to left. + cluster.sortConfigurationForEdgePush(whichEdge); + + while (pushDistance > 0 && !fail) { + for (View v: currentState.sortedViews) { + // For each view that isn't in the cluster, we see if the leading edge of the + // cluster is contacting the edge of that view. If so, we add that view to the + // cluster. + if (!cluster.views.contains(v) && v != dragView) { + if (cluster.isViewTouchingEdge(v, whichEdge)) { + LayoutParams lp = (LayoutParams) v.getLayoutParams(); + if (!lp.canReorder) { + // The push solution includes the all apps button, this is not viable. + fail = true; + break; + } + cluster.addView(v); + CellAndSpan c = currentState.map.get(v); + + // Adding view to cluster, mark it as not occupied. + markCellsForView(c.x, c.y, c.spanX, c.spanY, mTmpOccupied, false); + } + } + } + pushDistance--; - // Here the first number of runs (minRuns) accounts for the the comment above, and - // further runs execute based on whether the intersecting views / bounding rect need - // to be expanded to include other views that will be pushed. - while (addViewInDirection(views, r0, direction, mTmpOccupied, - dragView, currentState) || minRuns > 0) { - minRuns--; + // The cluster has been completed, now we move the whole thing over in the appropriate + // direction. + cluster.shift(whichEdge, 1); } - boundingRect.union(r0); + + boolean foundSolution = false; + clusterRect = cluster.getBoundingRect(); + + // Due to the nature of the algorithm, the only check required to verify a valid solution + // is to ensure that completed shifted cluster lies completely within the cell layout. + if (!fail && clusterRect.left >= 0 && clusterRect.right <= mCountX && clusterRect.top >= 0 && + clusterRect.bottom <= mCountY) { + foundSolution = true; + } else { + currentState.restore(); + } + + // In either case, we set the occupied array as marked for the location of the views + for (View v: cluster.views) { + CellAndSpan c = currentState.map.get(v); + markCellsForView(c.x, c.y, c.spanX, c.spanY, mTmpOccupied, true); + } + + return foundSolution; } private boolean addViewsToTempLocation(ArrayList views, Rect rectOccupiedByPotentialDrop, - int[] direction, boolean push, View dragView, ItemConfiguration currentState) { + int[] direction, View dragView, ItemConfiguration currentState) { if (views.size() == 0) return true; boolean success = false; @@ -1735,15 +1920,8 @@ public class CellLayout extends ViewGroup { } } - @SuppressWarnings("unchecked") - ArrayList dup = (ArrayList) views.clone(); - if (push) { - completeSetOfViewsToMove(dup, boundingRect, direction, mTmpOccupied, dragView, - currentState); - } - // Mark the occupied state as false for the group of views we want to move. - for (View v: dup) { + for (View v: views) { CellAndSpan c = currentState.map.get(v); markCellsForView(c.x, c.y, c.spanX, c.spanY, mTmpOccupied, false); } @@ -1753,26 +1931,21 @@ public class CellLayout extends ViewGroup { int left = boundingRect.left; // We mark more precisely which parts of the bounding rect are truly occupied, allowing // for interlocking. - for (View v: dup) { + for (View v: views) { CellAndSpan c = currentState.map.get(v); markCellsForView(c.x - left, c.y - top, c.spanX, c.spanY, blockOccupied, true); } markCellsForRect(rectOccupiedByPotentialDrop, mTmpOccupied, true); - if (push) { - findNearestAreaInDirection(boundingRect.left, boundingRect.top, boundingRect.width(), - boundingRect.height(), direction, mTmpOccupied, blockOccupied, mTempLocation); - } else { - findNearestArea(boundingRect.left, boundingRect.top, boundingRect.width(), - boundingRect.height(), direction, mTmpOccupied, blockOccupied, mTempLocation); - } + findNearestArea(boundingRect.left, boundingRect.top, boundingRect.width(), + boundingRect.height(), direction, mTmpOccupied, blockOccupied, mTempLocation); // If we successfuly found a location by pushing the block of views, we commit it if (mTempLocation[0] >= 0 && mTempLocation[1] >= 0) { int deltaX = mTempLocation[0] - boundingRect.left; int deltaY = mTempLocation[1] - boundingRect.top; - for (View v: dup) { + for (View v: views) { CellAndSpan c = currentState.map.get(v); c.x += deltaX; c.y += deltaY; @@ -1781,7 +1954,7 @@ public class CellLayout extends ViewGroup { } // In either case, we set the occupied array as marked for the location of the views - for (View v: dup) { + for (View v: views) { CellAndSpan c = currentState.map.get(v); markCellsForView(c.x, c.y, c.spanX, c.spanY, mTmpOccupied, true); } @@ -1802,14 +1975,16 @@ public class CellLayout extends ViewGroup { // separately in each of the components. int temp = direction[1]; direction[1] = 0; - if (addViewsToTempLocation(intersectingViews, occupied, direction, true, + + if (pushViewsToTempLocation(intersectingViews, occupied, direction, ignoreView, solution)) { return true; } direction[1] = temp; temp = direction[0]; direction[0] = 0; - if (addViewsToTempLocation(intersectingViews, occupied, direction, true, + + if (pushViewsToTempLocation(intersectingViews, occupied, direction, ignoreView, solution)) { return true; } @@ -1821,7 +1996,7 @@ public class CellLayout extends ViewGroup { direction[1] *= -1; temp = direction[1]; direction[1] = 0; - if (addViewsToTempLocation(intersectingViews, occupied, direction, true, + if (pushViewsToTempLocation(intersectingViews, occupied, direction, ignoreView, solution)) { return true; } @@ -1829,7 +2004,7 @@ public class CellLayout extends ViewGroup { direction[1] = temp; temp = direction[0]; direction[0] = 0; - if (addViewsToTempLocation(intersectingViews, occupied, direction, true, + if (pushViewsToTempLocation(intersectingViews, occupied, direction, ignoreView, solution)) { return true; } @@ -1841,15 +2016,14 @@ public class CellLayout extends ViewGroup { } else { // If the direction vector has a single non-zero component, we push first in the // direction of the vector - if (addViewsToTempLocation(intersectingViews, occupied, direction, true, + if (pushViewsToTempLocation(intersectingViews, occupied, direction, ignoreView, solution)) { return true; } - // Then we try the opposite direction direction[0] *= -1; direction[1] *= -1; - if (addViewsToTempLocation(intersectingViews, occupied, direction, true, + if (pushViewsToTempLocation(intersectingViews, occupied, direction, ignoreView, solution)) { return true; } @@ -1864,7 +2038,7 @@ public class CellLayout extends ViewGroup { int temp = direction[1]; direction[1] = direction[0]; direction[0] = temp; - if (addViewsToTempLocation(intersectingViews, occupied, direction, true, + if (pushViewsToTempLocation(intersectingViews, occupied, direction, ignoreView, solution)) { return true; } @@ -1872,7 +2046,7 @@ public class CellLayout extends ViewGroup { // Then we try the opposite direction direction[0] *= -1; direction[1] *= -1; - if (addViewsToTempLocation(intersectingViews, occupied, direction, true, + if (pushViewsToTempLocation(intersectingViews, occupied, direction, ignoreView, solution)) { return true; } @@ -1928,7 +2102,7 @@ public class CellLayout extends ViewGroup { } // Next we try moving the views as a block, but without requiring the push mechanic. - if (addViewsToTempLocation(mIntersectingViews, mOccupiedRect, direction, false, ignoreView, + if (addViewsToTempLocation(mIntersectingViews, mOccupiedRect, direction, ignoreView, solution)) { return true; } @@ -2018,7 +2192,7 @@ public class CellLayout extends ViewGroup { } else { c = new CellAndSpan(lp.cellX, lp.cellY, lp.cellHSpan, lp.cellVSpan); } - solution.map.put(child, c); + solution.add(child, c); } } @@ -2490,9 +2664,31 @@ public class CellLayout extends ViewGroup { private class ItemConfiguration { HashMap map = new HashMap(); + private HashMap savedMap = new HashMap(); + ArrayList sortedViews = new ArrayList(); boolean isSolution = false; int dragViewX, dragViewY, dragViewSpanX, dragViewSpanY; + void save() { + // Copy current state into savedMap + for (View v: map.keySet()) { + map.get(v).copy(savedMap.get(v)); + } + } + + void restore() { + // Restore current state from savedMap + for (View v: savedMap.keySet()) { + savedMap.get(v).copy(map.get(v)); + } + } + + void add(View v, CellAndSpan cs) { + map.put(v, cs); + savedMap.put(v, new CellAndSpan()); + sortedViews.add(v); + } + int area() { return dragViewSpanX * dragViewSpanY; } @@ -2502,12 +2698,27 @@ public class CellLayout extends ViewGroup { int x, y; int spanX, spanY; + public CellAndSpan() { + } + + public void copy(CellAndSpan copy) { + copy.x = x; + copy.y = y; + copy.spanX = spanX; + copy.spanY = spanY; + } + public CellAndSpan(int x, int y, int spanX, int spanY) { this.x = x; this.y = y; this.spanX = spanX; this.spanY = spanY; } + + public String toString() { + return "(" + x + ", " + y + ": " + spanX + ", " + spanY + ")"; + } + } /** -- cgit v1.2.3 From 7f9ddd84353451e72f48f34a8d280d5e873b2f45 Mon Sep 17 00:00:00 2001 From: Michael Jurka Date: Mon, 19 Nov 2012 16:15:24 -0800 Subject: Fix janky transition on All Apps tab switch Bug: 7139562 --- src/com/android/launcher2/AppsCustomizeTabHost.java | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/com/android/launcher2/AppsCustomizeTabHost.java b/src/com/android/launcher2/AppsCustomizeTabHost.java index 96ec33ea8..19bc6827f 100644 --- a/src/com/android/launcher2/AppsCustomizeTabHost.java +++ b/src/com/android/launcher2/AppsCustomizeTabHost.java @@ -282,10 +282,15 @@ public class AppsCustomizeTabHost extends TabHost implements LauncherTransitiona reloadCurrentPage(); } }); - AnimatorSet animSet = LauncherAnimUtils.createAnimatorSet(); + + final AnimatorSet animSet = LauncherAnimUtils.createAnimatorSet(); animSet.playTogether(outAnim, inAnim); animSet.setDuration(duration); - animSet.start(); + post(new Runnable() { + public void run() { + animSet.start(); + } + }); } }); } -- cgit v1.2.3 From 1ef2123ccdf35f2e20ab180111bfa76c46c997e3 Mon Sep 17 00:00:00 2001 From: Winson Chung Date: Mon, 26 Nov 2012 14:08:38 -0800 Subject: Fixing NPE in updateCurrentPageScroll (Bug 7465970) Change-Id: I71d2b01518f3f736f6787ff6a503271b9ea7b04b --- src/com/android/launcher2/PagedView.java | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/com/android/launcher2/PagedView.java b/src/com/android/launcher2/PagedView.java index 2cb943d7d..6d5d151f8 100644 --- a/src/com/android/launcher2/PagedView.java +++ b/src/com/android/launcher2/PagedView.java @@ -297,9 +297,13 @@ public abstract class PagedView extends ViewGroup implements ViewGroup.OnHierarc * the previous tab page. */ protected void updateCurrentPageScroll() { - int offset = getChildOffset(mCurrentPage); - int relOffset = getRelativeChildOffset(mCurrentPage); - int newX = offset - relOffset; + // If the current page is invalid, just reset the scroll position to zero + int newX = 0; + if (0 <= mCurrentPage && mCurrentPage < getPageCount()) { + int offset = getChildOffset(mCurrentPage); + int relOffset = getRelativeChildOffset(mCurrentPage); + newX = offset - relOffset; + } scrollTo(newX, 0); mScroller.setFinalX(newX); mScroller.forceFinished(true); -- cgit v1.2.3 From 7819abd2d191a170cbc9d4bd190001c465187a9d Mon Sep 17 00:00:00 2001 From: Winson Chung Date: Thu, 29 Nov 2012 14:29:38 -0800 Subject: Fixing issue where the cling is offset. (Bug 7633074) - Also fixing issue where the workspace cling was showing on top of AllApps when you entered it for the first time. Change-Id: I7d59ad153de192bc1d69537af1b4af632465138b --- res/layout-land/launcher.xml | 27 ++++++++++++---------- res/layout-port/launcher.xml | 27 ++++++++++++---------- res/layout-sw720dp/launcher.xml | 27 ++++++++++++---------- .../android/launcher2/AppsCustomizePagedView.java | 3 ++- .../android/launcher2/AppsCustomizeTabHost.java | 11 +++++---- src/com/android/launcher2/Launcher.java | 4 +++- 6 files changed, 57 insertions(+), 42 deletions(-) diff --git a/res/layout-land/launcher.xml b/res/layout-land/launcher.xml index 0892352a9..051d8b25c 100644 --- a/res/layout-land/launcher.xml +++ b/res/layout-land/launcher.xml @@ -86,6 +86,21 @@ android:id="@+id/qsb_bar" layout="@layout/qsb_bar" /> + + + + + - - - - \ No newline at end of file diff --git a/res/layout-port/launcher.xml b/res/layout-port/launcher.xml index ad7eff4ba..445c85ea4 100644 --- a/res/layout-port/launcher.xml +++ b/res/layout-port/launcher.xml @@ -85,6 +85,21 @@ android:id="@+id/qsb_bar" layout="@layout/qsb_bar" /> + + + + + - - - - \ No newline at end of file diff --git a/res/layout-sw720dp/launcher.xml b/res/layout-sw720dp/launcher.xml index b5540423e..81a8f37da 100644 --- a/res/layout-sw720dp/launcher.xml +++ b/res/layout-sw720dp/launcher.xml @@ -85,6 +85,21 @@ android:id="@+id/qsb_bar" layout="@layout/qsb_bar" /> + + + + + - - - - \ No newline at end of file diff --git a/src/com/android/launcher2/AppsCustomizePagedView.java b/src/com/android/launcher2/AppsCustomizePagedView.java index 6a959daff..4bfeb60b8 100644 --- a/src/com/android/launcher2/AppsCustomizePagedView.java +++ b/src/com/android/launcher2/AppsCustomizePagedView.java @@ -499,9 +499,10 @@ public class AppsCustomizePagedView extends PagedViewWithDraggableItems implemen int[] pos = mWidgetSpacingLayout.estimateCellPosition(mClingFocusedX, mClingFocusedY); mLauncher.getDragLayer().getLocationInDragLayer(this, offset); // PagedViews are centered horizontally but top aligned + // Note we have to shift the items up now that Launcher sits under the status bar pos[0] += (getMeasuredWidth() - mWidgetSpacingLayout.getMeasuredWidth()) / 2 + offset[0]; - pos[1] += offset[1]; + pos[1] += offset[1] - mLauncher.getDragLayer().getPaddingTop(); mLauncher.showFirstRunAllAppsCling(pos); } } diff --git a/src/com/android/launcher2/AppsCustomizeTabHost.java b/src/com/android/launcher2/AppsCustomizeTabHost.java index 19bc6827f..5eb848306 100644 --- a/src/com/android/launcher2/AppsCustomizeTabHost.java +++ b/src/com/android/launcher2/AppsCustomizeTabHost.java @@ -418,11 +418,9 @@ public class AppsCustomizeTabHost extends TabHost implements LauncherTransitiona } if (!toWorkspace) { - // Going from Workspace -> All Apps - setVisibilityOfSiblingsWithLowerZOrder(INVISIBLE); - - // Dismiss the workspace cling and show the all apps cling (if not already shown) + // Dismiss the workspace cling l.dismissWorkspaceCling(null); + // Show the all apps cling (if not already shown) mAppsCustomizePane.showAllAppsCling(); // Make sure adjacent pages are loaded (we wait until after the transition to // prevent slowing down the animation) @@ -431,6 +429,11 @@ public class AppsCustomizeTabHost extends TabHost implements LauncherTransitiona if (!LauncherApplication.isScreenLarge()) { mAppsCustomizePane.hideScrollingIndicator(false); } + + // Going from Workspace -> All Apps + // NOTE: We should do this at the end since we check visibility state in some of the + // cling initialization/dismiss code above. + setVisibilityOfSiblingsWithLowerZOrder(INVISIBLE); } } diff --git a/src/com/android/launcher2/Launcher.java b/src/com/android/launcher2/Launcher.java index 002b52045..a4ed91f73 100644 --- a/src/com/android/launcher2/Launcher.java +++ b/src/com/android/launcher2/Launcher.java @@ -3739,7 +3739,9 @@ public final class Launcher extends Activity } private void dismissCling(final Cling cling, final String flag, int duration) { - if (cling != null && cling.getVisibility() == View.VISIBLE) { + // To catch cases where siblings of top-level views are made invisible, just check whether + // the cling is directly set to GONE before dismissing it. + if (cling != null && cling.getVisibility() != View.GONE) { ObjectAnimator anim = LauncherAnimUtils.ofFloat(cling, "alpha", 0f); anim.setDuration(duration); anim.addListener(new AnimatorListenerAdapter() { -- cgit v1.2.3