From c763c4e4d28c256d1368be3fc1c4526c8b9bd232 Mon Sep 17 00:00:00 2001 From: Winson Chung Date: Fri, 19 Jul 2013 13:49:06 -0700 Subject: Verifying that new applications are added and fixing issue with new items getting wrong ids. - Fixing issue where the LauncherModel would be out of sync on first migration, and subsequent crashes Change-Id: I6f58b09b615b28958c7f941e58ff9ae0ee3ba939 --- src/com/android/launcher3/Utilities.java | 95 ++++++++++++++++++++++++++++++++ 1 file changed, 95 insertions(+) (limited to 'src/com/android/launcher3/Utilities.java') diff --git a/src/com/android/launcher3/Utilities.java b/src/com/android/launcher3/Utilities.java index 0cc29faa3..cc22bb5db 100644 --- a/src/com/android/launcher3/Utilities.java +++ b/src/com/android/launcher3/Utilities.java @@ -25,6 +25,7 @@ import android.graphics.BlurMaskFilter; import android.graphics.Canvas; import android.graphics.ColorMatrix; import android.graphics.ColorMatrixColorFilter; +import android.graphics.Matrix; import android.graphics.Paint; import android.graphics.PaintFlagsDrawFilter; import android.graphics.PorterDuff; @@ -33,6 +34,10 @@ import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.graphics.drawable.PaintDrawable; import android.util.DisplayMetrics; +import android.view.View; +import android.view.ViewGroup; + +import java.util.ArrayList; import com.android.launcher3.R; @@ -232,6 +237,96 @@ final class Utilities { } } + /** + * Given a coordinate relative to the descendant, find the coordinate in a parent view's + * coordinates. + * + * @param descendant The descendant to which the passed coordinate is relative. + * @param root The root view to make the coordinates relative to. + * @param coord The coordinate that we want mapped. + * @param includeRootScroll Whether or not to account for the scroll of the descendant: + * sometimes this is relevant as in a child's coordinates within the descendant. + * @return The factor by which this descendant is scaled relative to this DragLayer. Caution + * this scale factor is assumed to be equal in X and Y, and so if at any point this + * assumption fails, we will need to return a pair of scale factors. + */ + public static float getDescendantCoordRelativeToParent(View descendant, View root, + int[] coord, boolean includeRootScroll) { + ArrayList ancestorChain = new ArrayList(); + + float[] pt = {coord[0], coord[1]}; + + View v = descendant; + while(v != root && v != null) { + ancestorChain.add(v); + v = (View) v.getParent(); + } + ancestorChain.add(root); + + float scale = 1.0f; + int count = ancestorChain.size(); + for (int i = 0; i < count; i++) { + View v0 = ancestorChain.get(i); + View v1 = i < count -1 ? ancestorChain.get(i + 1) : null; + + // For TextViews, scroll has a meaning which relates to the text position + // which is very strange... ignore the scroll. + if (v0 != descendant || includeRootScroll) { + pt[0] -= v0.getScrollX(); + pt[1] -= v0.getScrollY(); + } + + v0.getMatrix().mapPoints(pt); + pt[0] += v0.getLeft(); + pt[1] += v0.getTop(); + scale *= v0.getScaleX(); + } + + coord[0] = (int) Math.round(pt[0]); + coord[1] = (int) Math.round(pt[1]); + return scale; + } + + /** + * Inverse of {@link #getDescendantCoordRelativeToSelf(View, int[])}. + */ + public static float mapCoordInSelfToDescendent(View descendant, View root, + int[] coord) { + ArrayList ancestorChain = new ArrayList(); + + float[] pt = {coord[0], coord[1]}; + + View v = descendant; + while(v != root) { + ancestorChain.add(v); + v = (View) v.getParent(); + } + ancestorChain.add(root); + + float scale = 1.0f; + Matrix inverse = new Matrix(); + int count = ancestorChain.size(); + for (int i = count - 1; i >= 0; i--) { + View ancestor = ancestorChain.get(i); + View next = i > 0 ? ancestorChain.get(i-1) : null; + + pt[0] += ancestor.getScrollX(); + pt[1] += ancestor.getScrollY(); + + if (next != null) { + pt[0] -= next.getLeft(); + pt[1] -= next.getTop(); + next.getMatrix().invert(inverse); + inverse.mapPoints(pt); + scale *= next.getScaleX(); + } + } + + coord[0] = (int) Math.round(pt[0]); + coord[1] = (int) Math.round(pt[1]); + return scale; + } + private static void initStatics(Context context) { final Resources resources = context.getResources(); final DisplayMetrics metrics = resources.getDisplayMetrics(); -- cgit v1.2.3