diff options
21 files changed, 124 insertions, 48 deletions
diff --git a/res/drawable-hdpi/ic_home_all_apps_holo_dark.png b/res/drawable-hdpi/ic_home_all_apps_holo_dark.png Binary files differindex a0bfc0f90..18a524b1c 100644 --- a/res/drawable-hdpi/ic_home_all_apps_holo_dark.png +++ b/res/drawable-hdpi/ic_home_all_apps_holo_dark.png diff --git a/res/drawable-hdpi/ic_launcher_clear_active_holo.png b/res/drawable-hdpi/ic_launcher_clear_active_holo.png Binary files differnew file mode 100644 index 000000000..cdd0052b3 --- /dev/null +++ b/res/drawable-hdpi/ic_launcher_clear_active_holo.png diff --git a/res/drawable-hdpi/ic_launcher_clear_normal_holo.png b/res/drawable-hdpi/ic_launcher_clear_normal_holo.png Binary files differnew file mode 100644 index 000000000..84549ff94 --- /dev/null +++ b/res/drawable-hdpi/ic_launcher_clear_normal_holo.png diff --git a/res/drawable-mdpi/ic_home_all_apps_holo_dark.png b/res/drawable-mdpi/ic_home_all_apps_holo_dark.png Binary files differindex ffc302047..23616d457 100644 --- a/res/drawable-mdpi/ic_home_all_apps_holo_dark.png +++ b/res/drawable-mdpi/ic_home_all_apps_holo_dark.png diff --git a/res/drawable-mdpi/ic_launcher_clear_active_holo.png b/res/drawable-mdpi/ic_launcher_clear_active_holo.png Binary files differnew file mode 100644 index 000000000..2683beaa3 --- /dev/null +++ b/res/drawable-mdpi/ic_launcher_clear_active_holo.png diff --git a/res/drawable-mdpi/ic_launcher_clear_normal_holo.png b/res/drawable-mdpi/ic_launcher_clear_normal_holo.png Binary files differnew file mode 100644 index 000000000..219f3e5cf --- /dev/null +++ b/res/drawable-mdpi/ic_launcher_clear_normal_holo.png diff --git a/res/drawable-xhdpi/ic_home_all_apps_holo_dark.png b/res/drawable-xhdpi/ic_home_all_apps_holo_dark.png Binary files differindex 21a51ab6a..dff3e1645 100644 --- a/res/drawable-xhdpi/ic_home_all_apps_holo_dark.png +++ b/res/drawable-xhdpi/ic_home_all_apps_holo_dark.png diff --git a/res/drawable-xhdpi/ic_launcher_clear_active_holo.png b/res/drawable-xhdpi/ic_launcher_clear_active_holo.png Binary files differnew file mode 100644 index 000000000..1a7e53ddb --- /dev/null +++ b/res/drawable-xhdpi/ic_launcher_clear_active_holo.png diff --git a/res/drawable-xhdpi/ic_launcher_clear_normal_holo.png b/res/drawable-xhdpi/ic_launcher_clear_normal_holo.png Binary files differnew file mode 100644 index 000000000..d4965d9f8 --- /dev/null +++ b/res/drawable-xhdpi/ic_launcher_clear_normal_holo.png diff --git a/res/drawable/remove_target_selector.xml b/res/drawable/remove_target_selector.xml new file mode 100644 index 000000000..5e071fbfa --- /dev/null +++ b/res/drawable/remove_target_selector.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2007, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ +--> + +<transition xmlns:android="http://schemas.android.com/apk/res/android"> + <item android:drawable="@drawable/ic_launcher_clear_normal_holo" /> + <item android:drawable="@drawable/ic_launcher_clear_active_holo" /> +</transition> diff --git a/res/drawable/delete_target_selector.xml b/res/drawable/uninstall_target_selector.xml index 229942e3a..229942e3a 100644 --- a/res/drawable/delete_target_selector.xml +++ b/res/drawable/uninstall_target_selector.xml diff --git a/res/layout-land/launcher.xml b/res/layout-land/launcher.xml index 084b1636a..a74eb14c8 100644 --- a/res/layout-land/launcher.xml +++ b/res/layout-land/launcher.xml @@ -66,6 +66,11 @@ <include android:id="@+id/cell5" layout="@layout/workspace_screen" /> </com.android.launcher2.Workspace> + <include layout="@layout/hotseat" + android:id="@+id/hotseat" + android:layout_width="@dimen/button_bar_height_plus_padding" + android:layout_height="match_parent" + android:layout_gravity="right" /> <include android:id="@+id/qsb_bar" layout="@layout/qsb_bar" /> @@ -76,12 +81,6 @@ android:layout_height="match_parent" android:visibility="invisible" /> - <include layout="@layout/hotseat" - android:id="@+id/hotseat" - android:layout_width="@dimen/button_bar_height_plus_padding" - android:layout_height="match_parent" - android:layout_gravity="right" /> - <include layout="@layout/workspace_cling" android:id="@+id/workspace_cling" android:layout_width="match_parent" diff --git a/res/layout-port/launcher.xml b/res/layout-port/launcher.xml index b8df2ee57..062656fa2 100644 --- a/res/layout-port/launcher.xml +++ b/res/layout-port/launcher.xml @@ -60,16 +60,16 @@ <include android:id="@+id/cell5" layout="@layout/workspace_screen" /> </com.android.launcher2.Workspace> - <include - android:id="@+id/qsb_bar" - layout="@layout/qsb_bar" /> - <include layout="@layout/hotseat" android:id="@+id/hotseat" android:layout_width="match_parent" android:layout_height="@dimen/button_bar_height_plus_padding" android:layout_gravity="bottom" /> + <include + android:id="@+id/qsb_bar" + layout="@layout/qsb_bar" /> + <include layout="@layout/apps_customize_pane" android:id="@+id/apps_customize_pane" android:layout_width="match_parent" diff --git a/res/layout/qsb_bar.xml b/res/layout/qsb_bar.xml index c2179ce38..9daf7bff7 100644 --- a/res/layout/qsb_bar.xml +++ b/res/layout/qsb_bar.xml @@ -37,7 +37,7 @@ style="@style/DropTargetButton" android:id="@+id/delete_target_text" android:text="@string/delete_zone_label_workspace" - android:drawableLeft="@drawable/delete_target_selector" /> + android:drawableLeft="@drawable/remove_target_selector" /> </FrameLayout> <FrameLayout diff --git a/src/com/android/launcher2/AppsCustomizePagedView.java b/src/com/android/launcher2/AppsCustomizePagedView.java index 8ef758d55..5382ef3be 100644 --- a/src/com/android/launcher2/AppsCustomizePagedView.java +++ b/src/com/android/launcher2/AppsCustomizePagedView.java @@ -1265,7 +1265,7 @@ public class AppsCustomizePagedView extends PagedViewWithDraggableItems implemen scale = 1.0f; alpha = 1.0f; // On the first page, we don't want the page to have any lateral motion - translationX = getScrollX(); + translationX = 0; } else if (i == getChildCount() - 1 && scrollProgress > 0) { // Overscroll to the right v.setPivotX((1 - TRANSITION_PIVOT) * pageWidth); @@ -1273,7 +1273,7 @@ public class AppsCustomizePagedView extends PagedViewWithDraggableItems implemen scale = 1.0f; alpha = 1.0f; // On the last page, we don't want the page to have any lateral motion. - translationX = getScrollX() - mMaxScrollX; + translationX = 0; } else { v.setPivotY(pageHeight / 2.0f); v.setPivotX(pageWidth / 2.0f); diff --git a/src/com/android/launcher2/CellLayout.java b/src/com/android/launcher2/CellLayout.java index 2d7549386..6e6028077 100644 --- a/src/com/android/launcher2/CellLayout.java +++ b/src/com/android/launcher2/CellLayout.java @@ -36,7 +36,6 @@ import android.graphics.PorterDuff; import android.graphics.PorterDuffXfermode; import android.graphics.Rect; import android.graphics.RectF; -import android.graphics.Region; import android.graphics.drawable.Drawable; import android.graphics.drawable.NinePatchDrawable; import android.util.AttributeSet; @@ -72,6 +71,7 @@ public class CellLayout extends ViewGroup { private int mWidthGap; private int mHeightGap; private int mMaxGap; + private boolean mScrollingTransformsDirty = false; private final Rect mRect = new Rect(); private final CellInfo mCellInfo = new CellInfo(); @@ -345,6 +345,23 @@ public class CellLayout extends ViewGroup { return mIsDragOverlapping; } + protected void setOverscrollTransformsDirty(boolean dirty) { + mScrollingTransformsDirty = dirty; + } + + protected void resetOverscrollTransforms() { + if (mScrollingTransformsDirty) { + setOverscrollTransformsDirty(false); + setTranslationX(0); + setRotationY(0); + // It doesn't matter if we pass true or false here, the important thing is that we + // pass 0, which results in the overscroll drawable not being drawn any more. + setOverScrollAmount(0, false); + setPivotX(getMeasuredWidth() / 2); + setPivotY(getMeasuredHeight() / 2); + } + } + @Override protected void onDraw(Canvas canvas) { // When we're large, we are either drawn in a "hover" state (ie when dragging an item to diff --git a/src/com/android/launcher2/DeleteDropTarget.java b/src/com/android/launcher2/DeleteDropTarget.java index 1553d3cc6..4e93b22b1 100644 --- a/src/com/android/launcher2/DeleteDropTarget.java +++ b/src/com/android/launcher2/DeleteDropTarget.java @@ -23,6 +23,7 @@ import android.content.res.Resources; import android.graphics.PorterDuff; import android.graphics.PorterDuffColorFilter; import android.graphics.Rect; +import android.graphics.drawable.Drawable; import android.graphics.drawable.TransitionDrawable; import android.util.AttributeSet; import android.view.View; @@ -35,8 +36,10 @@ public class DeleteDropTarget extends ButtonDropTarget { private static int DELETE_ANIMATION_DURATION = 250; private ColorStateList mOriginalTextColor; - private TransitionDrawable mDrawable; private int mHoverColor = 0xFFFF0000; + private TransitionDrawable mUninstallDrawable; + private TransitionDrawable mRemoveDrawable; + private TransitionDrawable mCurrentDrawable; public DeleteDropTarget(Context context, AttributeSet attrs) { this(context, attrs, 0); @@ -58,8 +61,16 @@ public class DeleteDropTarget extends ButtonDropTarget { mHoverColor = r.getColor(R.color.delete_target_hover_tint); mHoverPaint.setColorFilter(new PorterDuffColorFilter( mHoverColor, PorterDuff.Mode.SRC_ATOP)); - mDrawable = (TransitionDrawable) getCompoundDrawables()[0]; - mDrawable.setCrossFadeEnabled(true); + mUninstallDrawable = (TransitionDrawable) + r.getDrawable(R.drawable.uninstall_target_selector); + mRemoveDrawable = (TransitionDrawable) r.getDrawable(R.drawable.remove_target_selector); + + mRemoveDrawable.setCrossFadeEnabled(true); + mUninstallDrawable.setCrossFadeEnabled(true); + + // The current drawable is set to either the remove drawable or the uninstall drawable + // and is initially set to the remove drawable, as set in the layout xml. + mCurrentDrawable = (TransitionDrawable) getCompoundDrawables()[0]; // Remove the text in the Phone UI in landscape int orientation = getResources().getConfiguration().orientation; @@ -116,8 +127,15 @@ public class DeleteDropTarget extends ButtonDropTarget { } } + if (isUninstall) { + setCompoundDrawablesWithIntrinsicBounds(mUninstallDrawable, null, null, null); + } else { + setCompoundDrawablesWithIntrinsicBounds(mRemoveDrawable, null, null, null); + } + mCurrentDrawable = (TransitionDrawable) getCompoundDrawables()[0]; + mActive = isVisible; - mDrawable.resetTransition(); + mCurrentDrawable.resetTransition(); setTextColor(mOriginalTextColor); ((ViewGroup) getParent()).setVisibility(isVisible ? View.VISIBLE : View.GONE); if (getText().length() > 0) { @@ -135,7 +153,7 @@ public class DeleteDropTarget extends ButtonDropTarget { public void onDragEnter(DragObject d) { super.onDragEnter(d); - mDrawable.startTransition(mTransitionDuration); + mCurrentDrawable.startTransition(mTransitionDuration); setTextColor(mHoverColor); } @@ -143,7 +161,7 @@ public class DeleteDropTarget extends ButtonDropTarget { super.onDragExit(d); if (!d.dragComplete) { - mDrawable.resetTransition(); + mCurrentDrawable.resetTransition(); setTextColor(mOriginalTextColor); } } @@ -155,8 +173,8 @@ public class DeleteDropTarget extends ButtonDropTarget { dragLayer.getViewRectRelativeToSelf(d.dragView, from); dragLayer.getViewRectRelativeToSelf(this, to); - int width = mDrawable.getIntrinsicWidth(); - int height = mDrawable.getIntrinsicHeight(); + int width = mCurrentDrawable.getIntrinsicWidth(); + int height = mCurrentDrawable.getIntrinsicHeight(); to.set(to.left + getPaddingLeft(), to.top + getPaddingTop(), to.left + getPaddingLeft() + width, to.bottom); diff --git a/src/com/android/launcher2/DragLayer.java b/src/com/android/launcher2/DragLayer.java index 433db5054..3c626d46d 100644 --- a/src/com/android/launcher2/DragLayer.java +++ b/src/com/android/launcher2/DragLayer.java @@ -70,7 +70,7 @@ public class DragLayer extends FrameLayout { private boolean mHoverPointClosesFolder = false; private Rect mHitRect = new Rect(); private int mWorkspaceIndex = -1; - private int mHotseatIndex = -1; + private int mQsbIndex = -1; /** * Used to create a new DragLayer from XML. @@ -627,13 +627,13 @@ public class DragLayer extends FrameLayout { private void updateChildIndices() { if (mLauncher != null) { mWorkspaceIndex = indexOfChild(mLauncher.getWorkspace()); - mHotseatIndex = indexOfChild(mLauncher.getHotseat()); + mQsbIndex = indexOfChild(mLauncher.getSearchBar()); } } @Override protected int getChildDrawingOrder(int childCount, int i) { - if (mWorkspaceIndex == -1 || mHotseatIndex == -1 || + if (mWorkspaceIndex == -1 || mQsbIndex == -1 || mLauncher.getWorkspace().isDrawingBackgroundGradient()) { return i; } @@ -641,10 +641,10 @@ public class DragLayer extends FrameLayout { // This ensures that the workspace is drawn above the hotseat and qsb, // except when the workspace is drawing a background gradient, in which // case we want the workspace to stay behind these elements. - if (i == mHotseatIndex) { + if (i == mQsbIndex) { return mWorkspaceIndex; } else if (i == mWorkspaceIndex) { - return mHotseatIndex; + return mQsbIndex; } else { return i; } diff --git a/src/com/android/launcher2/Launcher.java b/src/com/android/launcher2/Launcher.java index 664b597ba..f91a47198 100644 --- a/src/com/android/launcher2/Launcher.java +++ b/src/com/android/launcher2/Launcher.java @@ -1956,6 +1956,9 @@ public final class Launcher extends Activity Hotseat getHotseat() { return mHotseat; } + SearchDropTargetBar getSearchBar() { + return mSearchDropTargetBar; + } /** * Returns the CellLayout of the specified container at the specified screen. diff --git a/src/com/android/launcher2/PagedView.java b/src/com/android/launcher2/PagedView.java index ad88a89d7..14ef53fbb 100644 --- a/src/com/android/launcher2/PagedView.java +++ b/src/com/android/launcher2/PagedView.java @@ -129,6 +129,11 @@ public abstract class PagedView extends ViewGroup { protected int mUnboundedScrollX; protected int[] mTempVisiblePagesRange = new int[2]; + // mOverScrollX is equal to mScrollX when we're within the normal scroll range. Otherwise + // it is equal to the scaled overscroll position. We use a separate value so as to prevent + // the screens from continuing to translate beyond the normal bounds. + protected int mOverScrollX; + // parameter that adjusts the layout to be optimized for pages with that scale factor protected float mLayoutScale = 1.0f; @@ -377,6 +382,7 @@ public abstract class PagedView extends ViewGroup { overScroll(x - mMaxScrollX); } } else { + mOverScrollX = x; super.scrollTo(x, y); } @@ -730,7 +736,9 @@ public abstract class PagedView extends ViewGroup { @Override protected void dispatchDraw(Canvas canvas) { int halfScreenSize = getMeasuredWidth() / 2; - int screenCenter = mScrollX + halfScreenSize; + // mOverScrollX is equal to mScrollX when we're within the normal scroll range. Otherwise + // it is equal to the scaled overscroll position. + int screenCenter = mOverScrollX + halfScreenSize; if (screenCenter != mLastScreenCenter || mForceScreenScrolled) { screenScrolled(screenCenter); @@ -1077,9 +1085,11 @@ public abstract class PagedView extends ViewGroup { int overScrollAmount = (int) Math.round(f * screenSize); if (amount < 0) { - mScrollX = overScrollAmount; + mOverScrollX = overScrollAmount; + mScrollX = 0; } else { - mScrollX = mMaxScrollX + overScrollAmount; + mOverScrollX = mMaxScrollX + overScrollAmount; + mScrollX = mMaxScrollX; } invalidate(); } @@ -1099,9 +1109,11 @@ public abstract class PagedView extends ViewGroup { int overScrollAmount = (int) Math.round(OVERSCROLL_DAMP_FACTOR * f * screenSize); if (amount < 0) { - mScrollX = overScrollAmount; + mOverScrollX = overScrollAmount; + mScrollX = 0; } else { - mScrollX = mMaxScrollX + overScrollAmount; + mOverScrollX = mMaxScrollX + overScrollAmount; + mScrollX = mMaxScrollX; } invalidate(); } diff --git a/src/com/android/launcher2/Workspace.java b/src/com/android/launcher2/Workspace.java index b6b90f472..4ad441d5b 100644 --- a/src/com/android/launcher2/Workspace.java +++ b/src/com/android/launcher2/Workspace.java @@ -1101,6 +1101,7 @@ public class Workspace extends SmoothPagedView } private void screenScrolledLargeUI(int screenCenter) { + boolean isInOverscroll = false; for (int i = 0; i < getChildCount(); i++) { CellLayout cl = (CellLayout) getChildAt(i); if (cl != null) { @@ -1111,11 +1112,17 @@ public class Workspace extends SmoothPagedView // If the current page (i) is being over scrolled, we use a different // set of rules for setting the background alpha multiplier. if (!isSmall()) { - if ((mScrollX < 0 && i == 0) || (mScrollX > mMaxScrollX && - i == getChildCount() -1 )) { + if ((mOverScrollX < 0 && i == 0) || (mOverScrollX > mMaxScrollX && + i == getChildCount() -1)) { + isInOverscroll = true; + rotation *= -1; cl.setBackgroundAlphaMultiplier( overScrollBackgroundAlphaInterpolator(Math.abs(scrollProgress))); mOverScrollPageIndex = i; + cl.setOverScrollAmount(Math.abs(scrollProgress), i == 0); + cl.setPivotX(cl.getMeasuredWidth() * (i == 0 ? 0.75f : 0.25f)); + cl.setPivotY(cl.getMeasuredHeight() * 0.5f); + cl.setOverscrollTransformsDirty(true); } else if (mOverScrollPageIndex != i) { cl.setBackgroundAlphaMultiplier( backgroundAlphaInterpolator(Math.abs(scrollProgress))); @@ -1130,29 +1137,25 @@ public class Workspace extends SmoothPagedView cl.fastInvalidate(); } } + if (!isSwitchingState() && !isInOverscroll) { + ((CellLayout) getChildAt(0)).resetOverscrollTransforms(); + ((CellLayout) getChildAt(getChildCount() - 1)).resetOverscrollTransforms(); + } invalidate(); } - private void resetCellLayoutTransforms(CellLayout cl, boolean left) { - cl.setTranslationX(0); - cl.setRotationY(0); - cl.setOverScrollAmount(0, left); - cl.setPivotX(cl.getMeasuredWidth() / 2); - cl.setPivotY(cl.getMeasuredHeight() / 2); - } - private void screenScrolledStandardUI(int screenCenter) { - if (mScrollX < 0 || mScrollX > mMaxScrollX) { - int index = mScrollX < 0 ? 0 : getChildCount() - 1; + if (mOverScrollX < 0 || mOverScrollX > mMaxScrollX) { + int index = mOverScrollX < 0 ? 0 : getChildCount() - 1; CellLayout cl = (CellLayout) getChildAt(index); float scrollProgress = getScrollProgress(screenCenter, cl, index); cl.setOverScrollAmount(Math.abs(scrollProgress), index == 0); - float translationX = index == 0 ? mScrollX : - (mMaxScrollX - mScrollX); float rotation = - WORKSPACE_OVERSCROLL_ROTATION * scrollProgress; cl.setCameraDistance(mDensity * CAMERA_DISTANCE); cl.setPivotX(cl.getMeasuredWidth() * (index == 0 ? 0.75f : 0.25f)); - cl.setTranslationX(translationX); + cl.setPivotY(cl.getMeasuredHeight() * 0.5f); cl.setRotationY(rotation); + cl.setOverscrollTransformsDirty(true); setFadeForOverScroll(Math.abs(scrollProgress)); } else { if (mOverscrollFade != 0) { @@ -1160,8 +1163,8 @@ public class Workspace extends SmoothPagedView } // We don't want to mess with the translations during transitions if (!isSwitchingState()) { - resetCellLayoutTransforms((CellLayout) getChildAt(0), true); - resetCellLayoutTransforms((CellLayout) getChildAt(getChildCount() - 1), false); + ((CellLayout) getChildAt(0)).resetOverscrollTransforms(); + ((CellLayout) getChildAt(getChildCount() - 1)).resetOverscrollTransforms(); } } } |