SizeF.java revision 5b836f29a3f56f9d13b6004417330c41ec0c18ae
1b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin/*
2b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * Copyright (C) 2014 The Android Open Source Project
3b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin *
4b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * Licensed under the Apache License, Version 2.0 (the "License");
5b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * you may not use this file except in compliance with the License.
6b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * You may obtain a copy of the License at
7b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin *
8b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin *      http://www.apache.org/licenses/LICENSE-2.0
9b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin *
10b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * Unless required by applicable law or agreed to in writing, software
11b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * distributed under the License is distributed on an "AS IS" BASIS,
12b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * See the License for the specific language governing permissions and
14b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * limitations under the License.
15b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin */
16b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin
17b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkinpackage android.util;
18b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin
195b836f29a3f56f9d13b6004417330c41ec0c18aeJeff Sharkeyimport static com.android.internal.util.Preconditions.checkArgumentFinite;
205b836f29a3f56f9d13b6004417330c41ec0c18aeJeff Sharkey
215b836f29a3f56f9d13b6004417330c41ec0c18aeJeff Sharkeyimport android.os.Parcel;
225b836f29a3f56f9d13b6004417330c41ec0c18aeJeff Sharkeyimport android.os.Parcelable;
23b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin
24b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin/**
25b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * Immutable class for describing width and height dimensions in some arbitrary
26b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * unit.
27b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * <p>
28b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * Width and height are finite values stored as a floating point representation.
29b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin * </p>
30b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin */
315b836f29a3f56f9d13b6004417330c41ec0c18aeJeff Sharkeypublic final class SizeF implements Parcelable {
32b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin    /**
33b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     * Create a new immutable SizeF instance.
34b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     *
35b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     * <p>Both the {@code width} and the {@code height} must be a finite number.
36b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     * In particular, {@code NaN} and positive/negative infinity are illegal values.</p>
37b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     *
38b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     * @param width The width of the size
39b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     * @param height The height of the size
40b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     *
41b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     * @throws IllegalArgumentException
42b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     *             if either {@code width} or {@code height} was not finite.
43b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     */
44b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin    public SizeF(final float width, final float height) {
45b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin        mWidth = checkArgumentFinite(width, "width");
46b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin        mHeight = checkArgumentFinite(height, "height");
47b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin    }
48b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin
495b836f29a3f56f9d13b6004417330c41ec0c18aeJeff Sharkey    private SizeF(Parcel in) {
505b836f29a3f56f9d13b6004417330c41ec0c18aeJeff Sharkey        mWidth = in.readFloat();
515b836f29a3f56f9d13b6004417330c41ec0c18aeJeff Sharkey        mHeight = in.readFloat();
525b836f29a3f56f9d13b6004417330c41ec0c18aeJeff Sharkey    }
535b836f29a3f56f9d13b6004417330c41ec0c18aeJeff Sharkey
54b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin    /**
55b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     * Get the width of the size (as an arbitrary unit).
56b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     * @return width
57b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     */
58b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin    public float getWidth() {
59b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin        return mWidth;
60b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin    }
61b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin
62b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin    /**
63b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     * Get the height of the size (as an arbitrary unit).
64b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     * @return height
65b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     */
66b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin    public float getHeight() {
67b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin        return mHeight;
68b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin    }
69b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin
70b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin    /**
71b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     * Check if this size is equal to another size.
72b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     *
73b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     * <p>Two sizes are equal if and only if both their widths and heights are the same.</p>
74b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     *
75b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     * <p>For this purpose, the width/height float values are considered to be the same if and only
76b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     * if the method {@link Float#floatToIntBits(float)} returns the identical {@code int} value
77b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     * when applied to each.</p>
78b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     *
79b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     * @return {@code true} if the objects were equal, {@code false} otherwise
80b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     */
81b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin    @Override
82b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin    public boolean equals(final Object obj) {
83b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin        if (obj == null) {
84b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin            return false;
85b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin        }
86b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin        if (this == obj) {
87b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin            return true;
88b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin        }
89b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin        if (obj instanceof SizeF) {
90b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin            final SizeF other = (SizeF) obj;
91b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin            return mWidth == other.mWidth && mHeight == other.mHeight;
92b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin        }
93b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin        return false;
94b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin    }
95b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin
96b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin    /**
97b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     * Return the size represented as a string with the format {@code "WxH"}
98b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     *
99b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     * @return string representation of the size
100b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     */
101b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin    @Override
102b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin    public String toString() {
103b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin        return mWidth + "x" + mHeight;
104b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin    }
105b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin
106b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin    /**
107b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     * {@inheritDoc}
108b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     */
109b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin    @Override
110b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin    public int hashCode() {
111b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin        return Float.floatToIntBits(mWidth) ^ Float.floatToIntBits(mHeight);
112b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin    }
113b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin
1145b836f29a3f56f9d13b6004417330c41ec0c18aeJeff Sharkey    @Override
1155b836f29a3f56f9d13b6004417330c41ec0c18aeJeff Sharkey    public int describeContents() {
1165b836f29a3f56f9d13b6004417330c41ec0c18aeJeff Sharkey        return 0;
1175b836f29a3f56f9d13b6004417330c41ec0c18aeJeff Sharkey    }
1185b836f29a3f56f9d13b6004417330c41ec0c18aeJeff Sharkey
1195b836f29a3f56f9d13b6004417330c41ec0c18aeJeff Sharkey    @Override
1205b836f29a3f56f9d13b6004417330c41ec0c18aeJeff Sharkey    public void writeToParcel(Parcel out, int flags) {
1215b836f29a3f56f9d13b6004417330c41ec0c18aeJeff Sharkey        out.writeFloat(mWidth);
1225b836f29a3f56f9d13b6004417330c41ec0c18aeJeff Sharkey        out.writeFloat(mHeight);
1235b836f29a3f56f9d13b6004417330c41ec0c18aeJeff Sharkey    }
1245b836f29a3f56f9d13b6004417330c41ec0c18aeJeff Sharkey
1255b836f29a3f56f9d13b6004417330c41ec0c18aeJeff Sharkey    public static final Parcelable.Creator<SizeF> CREATOR = new Parcelable.Creator<SizeF>() {
1265b836f29a3f56f9d13b6004417330c41ec0c18aeJeff Sharkey        @Override
1275b836f29a3f56f9d13b6004417330c41ec0c18aeJeff Sharkey        public SizeF createFromParcel(Parcel in) {
1285b836f29a3f56f9d13b6004417330c41ec0c18aeJeff Sharkey            return new SizeF(in);
1295b836f29a3f56f9d13b6004417330c41ec0c18aeJeff Sharkey        }
1305b836f29a3f56f9d13b6004417330c41ec0c18aeJeff Sharkey
1315b836f29a3f56f9d13b6004417330c41ec0c18aeJeff Sharkey        @Override
1325b836f29a3f56f9d13b6004417330c41ec0c18aeJeff Sharkey        public SizeF[] newArray(int size) {
1335b836f29a3f56f9d13b6004417330c41ec0c18aeJeff Sharkey            return new SizeF[size];
1345b836f29a3f56f9d13b6004417330c41ec0c18aeJeff Sharkey        }
1355b836f29a3f56f9d13b6004417330c41ec0c18aeJeff Sharkey    };
1365b836f29a3f56f9d13b6004417330c41ec0c18aeJeff Sharkey
137b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin    private final float mWidth;
138b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin    private final float mHeight;
1395b836f29a3f56f9d13b6004417330c41ec0c18aeJeff Sharkey}
140