Loading src/com/android/launcher3/AppWidgetResizeFrame.java +1 −2 Original line number Diff line number Diff line Loading @@ -354,8 +354,7 @@ public class AppWidgetResizeFrame extends FrameLayout } public void snapToWidget(boolean animate) { DeviceProfile profile = mLauncher.getDeviceProfile(); float scale = Math.min(profile.appWidgetScale.x, profile.appWidgetScale.y); float scale = mWidgetView.getScaleToFit(); mDragLayer.getViewRectRelativeToSelf(mWidgetView, sTmpRect); Loading src/com/android/launcher3/CellLayout.java +41 −21 Original line number Diff line number Diff line Loading @@ -1972,6 +1972,8 @@ public class CellLayout extends ViewGroup implements BubbleTextShadowHandler { private static final int PREVIEW_DURATION = 300; private static final int HINT_DURATION = Workspace.REORDER_TIMEOUT; private static final float CHILD_DIVIDEND = 4.0f; public static final int MODE_HINT = 0; public static final int MODE_PREVIEW = 1; Loading @@ -1987,42 +1989,62 @@ public class CellLayout extends ViewGroup implements BubbleTextShadowHandler { final int y1 = mTmpPoint[1]; final int dX = x1 - x0; final int dY = y1 - y0; finalDeltaX = 0; finalDeltaY = 0; this.child = child; this.mode = mode; setInitialAnimationValues(false); finalScale = (mChildScale - (CHILD_DIVIDEND / child.getWidth())) * initScale; finalDeltaX = initDeltaX; finalDeltaY = initDeltaY; int dir = mode == MODE_HINT ? -1 : 1; if (dX == dY && dX == 0) { } else { if (dY == 0) { finalDeltaX = - dir * Math.signum(dX) * mReorderPreviewAnimationMagnitude; finalDeltaX += - dir * Math.signum(dX) * mReorderPreviewAnimationMagnitude; } else if (dX == 0) { finalDeltaY = - dir * Math.signum(dY) * mReorderPreviewAnimationMagnitude; finalDeltaY += - dir * Math.signum(dY) * mReorderPreviewAnimationMagnitude; } else { double angle = Math.atan( (float) (dY) / dX); finalDeltaX = (int) (- dir * Math.signum(dX) * finalDeltaX += (int) (- dir * Math.signum(dX) * Math.abs(Math.cos(angle) * mReorderPreviewAnimationMagnitude)); finalDeltaY = (int) (- dir * Math.signum(dY) * finalDeltaY += (int) (- dir * Math.signum(dY) * Math.abs(Math.sin(angle) * mReorderPreviewAnimationMagnitude)); } } this.mode = mode; } void setInitialAnimationValues(boolean restoreOriginalValues) { if (restoreOriginalValues) { if (child instanceof LauncherAppWidgetHostView) { LauncherAppWidgetHostView lahv = (LauncherAppWidgetHostView) child; initScale = lahv.getScaleToFit(); initDeltaX = lahv.getTranslationForCentering().x; initDeltaY = lahv.getTranslationForCentering().y; } else { initScale = mChildScale; initDeltaX = 0; initDeltaY = 0; } } else { initScale = child.getScaleX(); initDeltaX = child.getTranslationX(); initDeltaY = child.getTranslationY(); finalScale = mChildScale - 4.0f / child.getWidth(); initScale = child.getScaleX(); this.child = child; } } void animate() { boolean noMovement = (finalDeltaX == initDeltaX) && (finalDeltaY == initDeltaY); if (mShakeAnimators.containsKey(child)) { ReorderPreviewAnimation oldAnimation = mShakeAnimators.get(child); oldAnimation.cancel(); mShakeAnimators.remove(child); if (finalDeltaX == 0 && finalDeltaY == 0) { if (noMovement) { completeAnimationImmediately(); return; } } if (finalDeltaX == 0 && finalDeltaY == 0) { if (noMovement) { return; } ValueAnimator va = LauncherAnimUtils.ofFloat(child, 0f, 1f); Loading Loading @@ -2055,9 +2077,7 @@ public class CellLayout extends ViewGroup implements BubbleTextShadowHandler { va.addListener(new AnimatorListenerAdapter() { public void onAnimationRepeat(Animator animation) { // We make sure to end only after a full period initDeltaX = 0; initDeltaY = 0; initScale = mChildScale; setInitialAnimationValues(true); repeating = true; } }); Loading @@ -2077,10 +2097,10 @@ public class CellLayout extends ViewGroup implements BubbleTextShadowHandler { } a = new LauncherViewPropertyAnimator(child) .scaleX(mChildScale) .scaleY(mChildScale) .translationX(0) .translationY(0) .scaleX(initScale) .scaleY(initScale) .translationX(initDeltaX) .translationY(initDeltaY) .setDuration(REORDER_ANIMATION_DURATION); a.setInterpolator(new android.view.animation.DecelerateInterpolator(1.5f)); a.start(); Loading src/com/android/launcher3/LauncherAppWidgetHostView.java +31 −0 Original line number Diff line number Diff line Loading @@ -19,6 +19,7 @@ package com.android.launcher3; import android.appwidget.AppWidgetHostView; import android.appwidget.AppWidgetProviderInfo; import android.content.Context; import android.graphics.PointF; import android.graphics.Rect; import android.os.Handler; import android.os.SystemClock; Loading Loading @@ -72,6 +73,16 @@ public class LauncherAppWidgetHostView extends AppWidgetHostView implements Touc private boolean mIsAutoAdvanceRegistered; private Runnable mAutoAdvanceRunnable; /** * The scaleX and scaleY value such that the widget fits within its cellspans, scaleX = scaleY. */ private float mScaleToFit = 1f; /** * The translation values to center the widget within its cellspans. */ private final PointF mTranslationForCentering = new PointF(0, 0); public LauncherAppWidgetHostView(Context context) { super(context); mContext = context; Loading Loading @@ -415,4 +426,24 @@ public class LauncherAppWidgetHostView extends AppWidgetHostView implements Touc } scheduleNextAdvance(); } public void setScaleToFit(float scale) { mScaleToFit = scale; setScaleX(scale); setScaleY(scale); } public float getScaleToFit() { return mScaleToFit; } public void setTranslationForCentering(float x, float y) { mTranslationForCentering.set(x, y); setTranslationX(x); setTranslationY(y); } public PointF getTranslationForCentering() { return mTranslationForCentering; } } src/com/android/launcher3/ShortcutAndWidgetContainer.java +5 −7 Original line number Diff line number Diff line Loading @@ -18,7 +18,6 @@ package com.android.launcher3; import android.app.WallpaperManager; import android.content.Context; import android.graphics.PointF; import android.graphics.Rect; import android.view.View; import android.view.ViewGroup; Loading Loading @@ -148,17 +147,16 @@ public class ShortcutAndWidgetContainer extends ViewGroup { CellLayout.LayoutParams lp = (CellLayout.LayoutParams) child.getLayoutParams(); if (child instanceof LauncherAppWidgetHostView) { LauncherAppWidgetHostView lahv = (LauncherAppWidgetHostView) child; // Scale and center the widget to fit within its cells. DeviceProfile profile = mLauncher.getDeviceProfile(); float scaleX = profile.appWidgetScale.x; float scaleY = profile.appWidgetScale.y; float scale = Math.min(scaleX, scaleY); child.setScaleX(scale); child.setScaleY(scale); child.setTranslationX(-(lp.width - (lp.width * scaleX)) / 2.0f); child.setTranslationY(-(lp.height - (lp.height * scaleY)) / 2.0f); lahv.setScaleToFit(Math.min(scaleX, scaleY)); lahv.setTranslationForCentering(-(lp.width - (lp.width * scaleX)) / 2.0f, -(lp.height - (lp.height * scaleY)) / 2.0f); } int childLeft = lp.x; Loading src/com/android/launcher3/graphics/DragPreviewProvider.java +3 −7 Original line number Diff line number Diff line Loading @@ -25,7 +25,6 @@ import android.graphics.drawable.Drawable; import android.view.View; import android.widget.TextView; import com.android.launcher3.DeviceProfile; import com.android.launcher3.Launcher; import com.android.launcher3.LauncherAppWidgetHostView; import com.android.launcher3.PreloadIconDrawable; Loading Loading @@ -120,8 +119,7 @@ public class DragPreviewProvider { width = bounds.width(); height = bounds.height(); } else if (mView instanceof LauncherAppWidgetHostView) { DeviceProfile profile = Launcher.getLauncher(mView.getContext()).getDeviceProfile(); scale = Math.min(profile.appWidgetScale.x, profile.appWidgetScale.y); scale = ((LauncherAppWidgetHostView) mView).getScaleToFit(); width = (int) (mView.getWidth() * scale); height = (int) (mView.getHeight() * scale); } Loading Loading @@ -158,8 +156,7 @@ public class DragPreviewProvider { int height = mView.getHeight(); if (mView instanceof LauncherAppWidgetHostView) { DeviceProfile profile = Launcher.getLauncher(mView.getContext()).getDeviceProfile(); scale = Math.min(profile.appWidgetScale.x, profile.appWidgetScale.y); scale = ((LauncherAppWidgetHostView) mView).getScaleToFit(); width = (int) Math.floor(mView.getWidth() * scale); height = (int) Math.floor(mView.getHeight() * scale); } Loading Loading @@ -198,11 +195,10 @@ public class DragPreviewProvider { public float getScaleAndPosition(Bitmap preview, int[] outPos) { float scale = Launcher.getLauncher(mView.getContext()) .getDragLayer().getLocationInDragLayer(mView, outPos); DeviceProfile profile = Launcher.getLauncher(mView.getContext()).getDeviceProfile(); if (mView instanceof LauncherAppWidgetHostView) { // App widgets are technically scaled, but are drawn at their expected size -- so the // app widget scale should not affect the scale of the preview. scale /= Math.min(profile.appWidgetScale.x, profile.appWidgetScale.y); scale /= ((LauncherAppWidgetHostView) mView).getScaleToFit(); } outPos[0] = Math.round(outPos[0] - Loading Loading
src/com/android/launcher3/AppWidgetResizeFrame.java +1 −2 Original line number Diff line number Diff line Loading @@ -354,8 +354,7 @@ public class AppWidgetResizeFrame extends FrameLayout } public void snapToWidget(boolean animate) { DeviceProfile profile = mLauncher.getDeviceProfile(); float scale = Math.min(profile.appWidgetScale.x, profile.appWidgetScale.y); float scale = mWidgetView.getScaleToFit(); mDragLayer.getViewRectRelativeToSelf(mWidgetView, sTmpRect); Loading
src/com/android/launcher3/CellLayout.java +41 −21 Original line number Diff line number Diff line Loading @@ -1972,6 +1972,8 @@ public class CellLayout extends ViewGroup implements BubbleTextShadowHandler { private static final int PREVIEW_DURATION = 300; private static final int HINT_DURATION = Workspace.REORDER_TIMEOUT; private static final float CHILD_DIVIDEND = 4.0f; public static final int MODE_HINT = 0; public static final int MODE_PREVIEW = 1; Loading @@ -1987,42 +1989,62 @@ public class CellLayout extends ViewGroup implements BubbleTextShadowHandler { final int y1 = mTmpPoint[1]; final int dX = x1 - x0; final int dY = y1 - y0; finalDeltaX = 0; finalDeltaY = 0; this.child = child; this.mode = mode; setInitialAnimationValues(false); finalScale = (mChildScale - (CHILD_DIVIDEND / child.getWidth())) * initScale; finalDeltaX = initDeltaX; finalDeltaY = initDeltaY; int dir = mode == MODE_HINT ? -1 : 1; if (dX == dY && dX == 0) { } else { if (dY == 0) { finalDeltaX = - dir * Math.signum(dX) * mReorderPreviewAnimationMagnitude; finalDeltaX += - dir * Math.signum(dX) * mReorderPreviewAnimationMagnitude; } else if (dX == 0) { finalDeltaY = - dir * Math.signum(dY) * mReorderPreviewAnimationMagnitude; finalDeltaY += - dir * Math.signum(dY) * mReorderPreviewAnimationMagnitude; } else { double angle = Math.atan( (float) (dY) / dX); finalDeltaX = (int) (- dir * Math.signum(dX) * finalDeltaX += (int) (- dir * Math.signum(dX) * Math.abs(Math.cos(angle) * mReorderPreviewAnimationMagnitude)); finalDeltaY = (int) (- dir * Math.signum(dY) * finalDeltaY += (int) (- dir * Math.signum(dY) * Math.abs(Math.sin(angle) * mReorderPreviewAnimationMagnitude)); } } this.mode = mode; } void setInitialAnimationValues(boolean restoreOriginalValues) { if (restoreOriginalValues) { if (child instanceof LauncherAppWidgetHostView) { LauncherAppWidgetHostView lahv = (LauncherAppWidgetHostView) child; initScale = lahv.getScaleToFit(); initDeltaX = lahv.getTranslationForCentering().x; initDeltaY = lahv.getTranslationForCentering().y; } else { initScale = mChildScale; initDeltaX = 0; initDeltaY = 0; } } else { initScale = child.getScaleX(); initDeltaX = child.getTranslationX(); initDeltaY = child.getTranslationY(); finalScale = mChildScale - 4.0f / child.getWidth(); initScale = child.getScaleX(); this.child = child; } } void animate() { boolean noMovement = (finalDeltaX == initDeltaX) && (finalDeltaY == initDeltaY); if (mShakeAnimators.containsKey(child)) { ReorderPreviewAnimation oldAnimation = mShakeAnimators.get(child); oldAnimation.cancel(); mShakeAnimators.remove(child); if (finalDeltaX == 0 && finalDeltaY == 0) { if (noMovement) { completeAnimationImmediately(); return; } } if (finalDeltaX == 0 && finalDeltaY == 0) { if (noMovement) { return; } ValueAnimator va = LauncherAnimUtils.ofFloat(child, 0f, 1f); Loading Loading @@ -2055,9 +2077,7 @@ public class CellLayout extends ViewGroup implements BubbleTextShadowHandler { va.addListener(new AnimatorListenerAdapter() { public void onAnimationRepeat(Animator animation) { // We make sure to end only after a full period initDeltaX = 0; initDeltaY = 0; initScale = mChildScale; setInitialAnimationValues(true); repeating = true; } }); Loading @@ -2077,10 +2097,10 @@ public class CellLayout extends ViewGroup implements BubbleTextShadowHandler { } a = new LauncherViewPropertyAnimator(child) .scaleX(mChildScale) .scaleY(mChildScale) .translationX(0) .translationY(0) .scaleX(initScale) .scaleY(initScale) .translationX(initDeltaX) .translationY(initDeltaY) .setDuration(REORDER_ANIMATION_DURATION); a.setInterpolator(new android.view.animation.DecelerateInterpolator(1.5f)); a.start(); Loading
src/com/android/launcher3/LauncherAppWidgetHostView.java +31 −0 Original line number Diff line number Diff line Loading @@ -19,6 +19,7 @@ package com.android.launcher3; import android.appwidget.AppWidgetHostView; import android.appwidget.AppWidgetProviderInfo; import android.content.Context; import android.graphics.PointF; import android.graphics.Rect; import android.os.Handler; import android.os.SystemClock; Loading Loading @@ -72,6 +73,16 @@ public class LauncherAppWidgetHostView extends AppWidgetHostView implements Touc private boolean mIsAutoAdvanceRegistered; private Runnable mAutoAdvanceRunnable; /** * The scaleX and scaleY value such that the widget fits within its cellspans, scaleX = scaleY. */ private float mScaleToFit = 1f; /** * The translation values to center the widget within its cellspans. */ private final PointF mTranslationForCentering = new PointF(0, 0); public LauncherAppWidgetHostView(Context context) { super(context); mContext = context; Loading Loading @@ -415,4 +426,24 @@ public class LauncherAppWidgetHostView extends AppWidgetHostView implements Touc } scheduleNextAdvance(); } public void setScaleToFit(float scale) { mScaleToFit = scale; setScaleX(scale); setScaleY(scale); } public float getScaleToFit() { return mScaleToFit; } public void setTranslationForCentering(float x, float y) { mTranslationForCentering.set(x, y); setTranslationX(x); setTranslationY(y); } public PointF getTranslationForCentering() { return mTranslationForCentering; } }
src/com/android/launcher3/ShortcutAndWidgetContainer.java +5 −7 Original line number Diff line number Diff line Loading @@ -18,7 +18,6 @@ package com.android.launcher3; import android.app.WallpaperManager; import android.content.Context; import android.graphics.PointF; import android.graphics.Rect; import android.view.View; import android.view.ViewGroup; Loading Loading @@ -148,17 +147,16 @@ public class ShortcutAndWidgetContainer extends ViewGroup { CellLayout.LayoutParams lp = (CellLayout.LayoutParams) child.getLayoutParams(); if (child instanceof LauncherAppWidgetHostView) { LauncherAppWidgetHostView lahv = (LauncherAppWidgetHostView) child; // Scale and center the widget to fit within its cells. DeviceProfile profile = mLauncher.getDeviceProfile(); float scaleX = profile.appWidgetScale.x; float scaleY = profile.appWidgetScale.y; float scale = Math.min(scaleX, scaleY); child.setScaleX(scale); child.setScaleY(scale); child.setTranslationX(-(lp.width - (lp.width * scaleX)) / 2.0f); child.setTranslationY(-(lp.height - (lp.height * scaleY)) / 2.0f); lahv.setScaleToFit(Math.min(scaleX, scaleY)); lahv.setTranslationForCentering(-(lp.width - (lp.width * scaleX)) / 2.0f, -(lp.height - (lp.height * scaleY)) / 2.0f); } int childLeft = lp.x; Loading
src/com/android/launcher3/graphics/DragPreviewProvider.java +3 −7 Original line number Diff line number Diff line Loading @@ -25,7 +25,6 @@ import android.graphics.drawable.Drawable; import android.view.View; import android.widget.TextView; import com.android.launcher3.DeviceProfile; import com.android.launcher3.Launcher; import com.android.launcher3.LauncherAppWidgetHostView; import com.android.launcher3.PreloadIconDrawable; Loading Loading @@ -120,8 +119,7 @@ public class DragPreviewProvider { width = bounds.width(); height = bounds.height(); } else if (mView instanceof LauncherAppWidgetHostView) { DeviceProfile profile = Launcher.getLauncher(mView.getContext()).getDeviceProfile(); scale = Math.min(profile.appWidgetScale.x, profile.appWidgetScale.y); scale = ((LauncherAppWidgetHostView) mView).getScaleToFit(); width = (int) (mView.getWidth() * scale); height = (int) (mView.getHeight() * scale); } Loading Loading @@ -158,8 +156,7 @@ public class DragPreviewProvider { int height = mView.getHeight(); if (mView instanceof LauncherAppWidgetHostView) { DeviceProfile profile = Launcher.getLauncher(mView.getContext()).getDeviceProfile(); scale = Math.min(profile.appWidgetScale.x, profile.appWidgetScale.y); scale = ((LauncherAppWidgetHostView) mView).getScaleToFit(); width = (int) Math.floor(mView.getWidth() * scale); height = (int) Math.floor(mView.getHeight() * scale); } Loading Loading @@ -198,11 +195,10 @@ public class DragPreviewProvider { public float getScaleAndPosition(Bitmap preview, int[] outPos) { float scale = Launcher.getLauncher(mView.getContext()) .getDragLayer().getLocationInDragLayer(mView, outPos); DeviceProfile profile = Launcher.getLauncher(mView.getContext()).getDeviceProfile(); if (mView instanceof LauncherAppWidgetHostView) { // App widgets are technically scaled, but are drawn at their expected size -- so the // app widget scale should not affect the scale of the preview. scale /= Math.min(profile.appWidgetScale.x, profile.appWidgetScale.y); scale /= ((LauncherAppWidgetHostView) mView).getScaleToFit(); } outPos[0] = Math.round(outPos[0] - Loading