1/*
2 * Copyright 2018 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package androidx.preference.internal;
18
19import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
20
21import android.content.Context;
22import android.content.res.TypedArray;
23import android.util.AttributeSet;
24import android.widget.ImageView;
25
26import androidx.annotation.RestrictTo;
27import androidx.preference.R;
28
29/**
30 * Extension of ImageView that correctly applies maxWidth and maxHeight.
31 * @hide
32 */
33@RestrictTo(LIBRARY_GROUP)
34public class PreferenceImageView extends ImageView {
35
36    private int mMaxWidth = Integer.MAX_VALUE;
37    private int mMaxHeight = Integer.MAX_VALUE;
38
39    public PreferenceImageView(Context context) {
40        this(context, null);
41    }
42
43    public PreferenceImageView(Context context, AttributeSet attrs) {
44        this(context, attrs, 0);
45    }
46
47    public PreferenceImageView(Context context, AttributeSet attrs, int defStyleAttr) {
48        super(context, attrs, defStyleAttr);
49
50        final TypedArray a = context.obtainStyledAttributes(
51                attrs, R.styleable.PreferenceImageView, defStyleAttr, 0);
52
53        setMaxWidth(a.getDimensionPixelSize(
54                R.styleable.PreferenceImageView_maxWidth, Integer.MAX_VALUE));
55
56        setMaxHeight(a.getDimensionPixelSize(
57                R.styleable.PreferenceImageView_maxHeight, Integer.MAX_VALUE));
58
59        a.recycle();
60    }
61
62//    public PreferenceImageView(Context context, AttributeSet attrs, int defStyleAttr,
63//            int defStyleRes) {
64//        super(context, attrs, defStyleAttr, defStyleRes);
65//    }
66
67    @Override
68    public void setMaxWidth(int maxWidth) {
69        mMaxWidth = maxWidth;
70        super.setMaxWidth(maxWidth);
71    }
72
73    @Override
74    public int getMaxWidth() {
75        return mMaxWidth;
76    }
77
78    @Override
79    public void setMaxHeight(int maxHeight) {
80        mMaxHeight = maxHeight;
81        super.setMaxHeight(maxHeight);
82    }
83
84    @Override
85    public int getMaxHeight() {
86        return mMaxHeight;
87    }
88
89    @Override
90    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
91        final int widthMode = MeasureSpec.getMode(widthMeasureSpec);
92        if (widthMode == MeasureSpec.AT_MOST || widthMode == MeasureSpec.UNSPECIFIED) {
93            final int widthSize = MeasureSpec.getSize(widthMeasureSpec);
94            final int maxWidth = getMaxWidth();
95            if (maxWidth != Integer.MAX_VALUE
96                    && (maxWidth < widthSize || widthMode == MeasureSpec.UNSPECIFIED)) {
97                widthMeasureSpec = MeasureSpec.makeMeasureSpec(maxWidth, MeasureSpec.AT_MOST);
98            }
99        }
100
101        final int heightMode = MeasureSpec.getMode(heightMeasureSpec);
102        if (heightMode == MeasureSpec.AT_MOST || heightMode == MeasureSpec.UNSPECIFIED) {
103            final int heightSize = MeasureSpec.getSize(heightMeasureSpec);
104            final int maxHeight = getMaxHeight();
105            if (maxHeight != Integer.MAX_VALUE
106                    && (maxHeight < heightSize || heightMode == MeasureSpec.UNSPECIFIED)) {
107                heightMeasureSpec = MeasureSpec.makeMeasureSpec(maxHeight, MeasureSpec.AT_MOST);
108            }
109        }
110
111        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
112    }
113}
114