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