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