1e918fd296df7079a91b1d253ba4073f2e46aa9dbAnnie Chin/*
2e918fd296df7079a91b1d253ba4073f2e46aa9dbAnnie Chin * Copyright (C) 2016 The Android Open Source Project
3e918fd296df7079a91b1d253ba4073f2e46aa9dbAnnie Chin *
4e918fd296df7079a91b1d253ba4073f2e46aa9dbAnnie Chin * Licensed under the Apache License, Version 2.0 (the "License");
5e918fd296df7079a91b1d253ba4073f2e46aa9dbAnnie Chin * you may not use this file except in compliance with the License.
6e918fd296df7079a91b1d253ba4073f2e46aa9dbAnnie Chin * You may obtain a copy of the License at
7e918fd296df7079a91b1d253ba4073f2e46aa9dbAnnie Chin *
8e918fd296df7079a91b1d253ba4073f2e46aa9dbAnnie Chin *   http://www.apache.org/licenses/LICENSE-2.0
9e918fd296df7079a91b1d253ba4073f2e46aa9dbAnnie Chin *
10e918fd296df7079a91b1d253ba4073f2e46aa9dbAnnie Chin * Unless required by applicable law or agreed to in writing, software
11e918fd296df7079a91b1d253ba4073f2e46aa9dbAnnie Chin * distributed under the License is distributed on an "AS IS" BASIS,
12e918fd296df7079a91b1d253ba4073f2e46aa9dbAnnie Chin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e918fd296df7079a91b1d253ba4073f2e46aa9dbAnnie Chin * See the License for the specific language governing permissions and
14e918fd296df7079a91b1d253ba4073f2e46aa9dbAnnie Chin * limitations under the License.
15e918fd296df7079a91b1d253ba4073f2e46aa9dbAnnie Chin */
16e918fd296df7079a91b1d253ba4073f2e46aa9dbAnnie Chin
17e918fd296df7079a91b1d253ba4073f2e46aa9dbAnnie Chinpackage com.android.calculator2;
18e918fd296df7079a91b1d253ba4073f2e46aa9dbAnnie Chin
19e918fd296df7079a91b1d253ba4073f2e46aa9dbAnnie Chinimport android.content.Context;
20e918fd296df7079a91b1d253ba4073f2e46aa9dbAnnie Chinimport android.util.AttributeSet;
21e918fd296df7079a91b1d253ba4073f2e46aa9dbAnnie Chinimport android.view.View;
22e918fd296df7079a91b1d253ba4073f2e46aa9dbAnnie Chinimport android.view.ViewGroup;
23e918fd296df7079a91b1d253ba4073f2e46aa9dbAnnie Chinimport android.widget.HorizontalScrollView;
24e918fd296df7079a91b1d253ba4073f2e46aa9dbAnnie Chin
256969b02277fd9dfd19e187a51edc27070213b74aJustin Klaassenimport static android.view.View.MeasureSpec.UNSPECIFIED;
266969b02277fd9dfd19e187a51edc27070213b74aJustin Klaassenimport static android.view.ViewGroup.LayoutParams.MATCH_PARENT;
276969b02277fd9dfd19e187a51edc27070213b74aJustin Klaassenimport static android.view.ViewGroup.LayoutParams.WRAP_CONTENT;
286969b02277fd9dfd19e187a51edc27070213b74aJustin Klaassen
29e918fd296df7079a91b1d253ba4073f2e46aa9dbAnnie Chinpublic class CalculatorScrollView extends HorizontalScrollView {
30e918fd296df7079a91b1d253ba4073f2e46aa9dbAnnie Chin
31e918fd296df7079a91b1d253ba4073f2e46aa9dbAnnie Chin    public CalculatorScrollView(Context context) {
32e918fd296df7079a91b1d253ba4073f2e46aa9dbAnnie Chin        this(context, null /* attrs */);
33e918fd296df7079a91b1d253ba4073f2e46aa9dbAnnie Chin    }
34e918fd296df7079a91b1d253ba4073f2e46aa9dbAnnie Chin
35e918fd296df7079a91b1d253ba4073f2e46aa9dbAnnie Chin    public CalculatorScrollView(Context context, AttributeSet attrs) {
36e918fd296df7079a91b1d253ba4073f2e46aa9dbAnnie Chin        this(context, attrs, 0 /* defStyleAttr */);
37e918fd296df7079a91b1d253ba4073f2e46aa9dbAnnie Chin    }
38e918fd296df7079a91b1d253ba4073f2e46aa9dbAnnie Chin
39e918fd296df7079a91b1d253ba4073f2e46aa9dbAnnie Chin    public CalculatorScrollView(Context context, AttributeSet attrs, int defStyleAttr) {
40e918fd296df7079a91b1d253ba4073f2e46aa9dbAnnie Chin        super(context, attrs, defStyleAttr);
41e918fd296df7079a91b1d253ba4073f2e46aa9dbAnnie Chin    }
42e918fd296df7079a91b1d253ba4073f2e46aa9dbAnnie Chin
436969b02277fd9dfd19e187a51edc27070213b74aJustin Klaassen    private static int getChildMeasureSpecCompat(int spec, int padding, int childDimension) {
446969b02277fd9dfd19e187a51edc27070213b74aJustin Klaassen        if (MeasureSpec.getMode(spec) == UNSPECIFIED
456969b02277fd9dfd19e187a51edc27070213b74aJustin Klaassen                && (childDimension == MATCH_PARENT || childDimension == WRAP_CONTENT)) {
466969b02277fd9dfd19e187a51edc27070213b74aJustin Klaassen            final int size = Math.max(0, MeasureSpec.getSize(spec) - padding);
476969b02277fd9dfd19e187a51edc27070213b74aJustin Klaassen            return MeasureSpec.makeMeasureSpec(size, UNSPECIFIED);
486969b02277fd9dfd19e187a51edc27070213b74aJustin Klaassen        }
496969b02277fd9dfd19e187a51edc27070213b74aJustin Klaassen        return ViewGroup.getChildMeasureSpec(spec, padding, childDimension);
506969b02277fd9dfd19e187a51edc27070213b74aJustin Klaassen    }
516969b02277fd9dfd19e187a51edc27070213b74aJustin Klaassen
52e918fd296df7079a91b1d253ba4073f2e46aa9dbAnnie Chin    @Override
53e918fd296df7079a91b1d253ba4073f2e46aa9dbAnnie Chin    protected void measureChild(View child, int parentWidthMeasureSpec,
54e918fd296df7079a91b1d253ba4073f2e46aa9dbAnnie Chin            int parentHeightMeasureSpec) {
55e918fd296df7079a91b1d253ba4073f2e46aa9dbAnnie Chin        // Allow child to be as wide as they want.
56e918fd296df7079a91b1d253ba4073f2e46aa9dbAnnie Chin        parentWidthMeasureSpec = MeasureSpec.makeMeasureSpec(
576969b02277fd9dfd19e187a51edc27070213b74aJustin Klaassen                MeasureSpec.getSize(parentWidthMeasureSpec), UNSPECIFIED);
58e918fd296df7079a91b1d253ba4073f2e46aa9dbAnnie Chin
59e918fd296df7079a91b1d253ba4073f2e46aa9dbAnnie Chin        final ViewGroup.LayoutParams lp = child.getLayoutParams();
606969b02277fd9dfd19e187a51edc27070213b74aJustin Klaassen        final int childWidthMeasureSpec = getChildMeasureSpecCompat(parentWidthMeasureSpec,
61e918fd296df7079a91b1d253ba4073f2e46aa9dbAnnie Chin                0 /* padding */, lp.width);
626969b02277fd9dfd19e187a51edc27070213b74aJustin Klaassen        final int childHeightMeasureSpec = getChildMeasureSpecCompat(parentHeightMeasureSpec,
63e918fd296df7079a91b1d253ba4073f2e46aa9dbAnnie Chin                getPaddingTop() + getPaddingBottom(), lp.height);
64e918fd296df7079a91b1d253ba4073f2e46aa9dbAnnie Chin
65e918fd296df7079a91b1d253ba4073f2e46aa9dbAnnie Chin        child.measure(childWidthMeasureSpec, childHeightMeasureSpec);
66e918fd296df7079a91b1d253ba4073f2e46aa9dbAnnie Chin    }
67e918fd296df7079a91b1d253ba4073f2e46aa9dbAnnie Chin
68e918fd296df7079a91b1d253ba4073f2e46aa9dbAnnie Chin    @Override
69e918fd296df7079a91b1d253ba4073f2e46aa9dbAnnie Chin    protected void measureChildWithMargins(View child, int parentWidthMeasureSpec, int widthUsed,
70e918fd296df7079a91b1d253ba4073f2e46aa9dbAnnie Chin            int parentHeightMeasureSpec, int heightUsed) {
71e918fd296df7079a91b1d253ba4073f2e46aa9dbAnnie Chin        // Allow child to be as wide as they want.
72e918fd296df7079a91b1d253ba4073f2e46aa9dbAnnie Chin        parentWidthMeasureSpec = MeasureSpec.makeMeasureSpec(
736969b02277fd9dfd19e187a51edc27070213b74aJustin Klaassen                MeasureSpec.getSize(parentWidthMeasureSpec), UNSPECIFIED);
74e918fd296df7079a91b1d253ba4073f2e46aa9dbAnnie Chin
75e918fd296df7079a91b1d253ba4073f2e46aa9dbAnnie Chin        final MarginLayoutParams lp = (MarginLayoutParams) child.getLayoutParams();
766969b02277fd9dfd19e187a51edc27070213b74aJustin Klaassen        final int childWidthMeasureSpec = getChildMeasureSpecCompat(parentWidthMeasureSpec,
77e918fd296df7079a91b1d253ba4073f2e46aa9dbAnnie Chin                lp.leftMargin + lp.rightMargin, lp.width);
786969b02277fd9dfd19e187a51edc27070213b74aJustin Klaassen        final int childHeightMeasureSpec = getChildMeasureSpecCompat(parentHeightMeasureSpec,
79e918fd296df7079a91b1d253ba4073f2e46aa9dbAnnie Chin                getPaddingTop() + getPaddingBottom() + lp.topMargin + lp.bottomMargin, lp.height);
80e918fd296df7079a91b1d253ba4073f2e46aa9dbAnnie Chin
81e918fd296df7079a91b1d253ba4073f2e46aa9dbAnnie Chin        child.measure(childWidthMeasureSpec, childHeightMeasureSpec);
82e918fd296df7079a91b1d253ba4073f2e46aa9dbAnnie Chin    }
83e918fd296df7079a91b1d253ba4073f2e46aa9dbAnnie Chin}
84