14199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa/*
24199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * Copyright (C) 2015 The Android Open Source Project
34199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa *
44199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * Licensed under the Apache License, Version 2.0 (the "License");
54199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * you may not use this file except in compliance with the License.
64199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * You may obtain a copy of the License at
74199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa *
84199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa *      http://www.apache.org/licenses/LICENSE-2.0
94199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa *
104199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * Unless required by applicable law or agreed to in writing, software
114199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * distributed under the License is distributed on an "AS IS" BASIS,
124199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
134199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * See the License for the specific language governing permissions and
144199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * limitations under the License.
154199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa */
164199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
174199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawapackage android.support.design.widget;
184199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
194199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawaimport android.graphics.Matrix;
204199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawaimport android.graphics.Rect;
214199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawaimport android.graphics.RectF;
224199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawaimport android.view.View;
234199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawaimport android.view.ViewGroup;
244199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawaimport android.view.ViewParent;
254199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
264199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawaclass ViewGroupUtilsHoneycomb {
274199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    private static final ThreadLocal<Matrix> sMatrix = new ThreadLocal<>();
28422643669a44d08ca8b22a73286fae988a288b0eDaisuke Miyakawa    private static final ThreadLocal<RectF> sRectF = new ThreadLocal<>();
294199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    private static final Matrix IDENTITY = new Matrix();
304199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
314199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public static void offsetDescendantRect(ViewGroup group, View child, Rect rect) {
3295e66b00988bc16ecc17df31e47c873b2554b8ccinshik        Matrix m = sMatrix.get();
334199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        if (m == null) {
344199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            m = new Matrix();
354199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            sMatrix.set(m);
364199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        } else {
378d1f50f582dc384a164a42657c35187b0226bcc3Chiao Cheng            m.set(IDENTITY);
388d1f50f582dc384a164a42657c35187b0226bcc3Chiao Cheng        }
394199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
404199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        offsetDescendantMatrix(group, child, m);
414199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
424199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        RectF rectF = sRectF.get();
434199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        if (rectF == null) {
444199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            rectF = new RectF();
454199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        }
464199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        rectF.set(rect);
474199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        m.mapRect(rectF);
484199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        rect.set((int) (rectF.left + 0.5f), (int) (rectF.top + 0.5f),
494199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                (int) (rectF.right + 0.5f), (int) (rectF.bottom + 0.5f));
504199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
514199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
524199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    static void offsetDescendantMatrix(ViewParent target, View view, Matrix m) {
534199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        final ViewParent parent = view.getParent();
544199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        if (parent instanceof View && parent != target) {
554199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            final View vp = (View) parent;
564199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            offsetDescendantMatrix(target, vp, m);
574199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            m.preTranslate(-vp.getScrollX(), -vp.getScrollY());
584199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        }
594199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
604199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        m.preTranslate(view.getLeft(), view.getTop());
614199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
624199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        if (!view.getMatrix().isIdentity()) {
634199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            m.preConcat(view.getMatrix());
644199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        }
654199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
664199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa}
674199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa