Size.java revision 8097973089420749dcd1ab4974a629c2466b31cc
18097973089420749dcd1ab4974a629c2466b31ccAngus Kong/*
28097973089420749dcd1ab4974a629c2466b31ccAngus Kong * Copyright (C) 2014 The Android Open Source Project
38097973089420749dcd1ab4974a629c2466b31ccAngus Kong *
48097973089420749dcd1ab4974a629c2466b31ccAngus Kong * Licensed under the Apache License, Version 2.0 (the "License");
58097973089420749dcd1ab4974a629c2466b31ccAngus Kong * you may not use this file except in compliance with the License.
68097973089420749dcd1ab4974a629c2466b31ccAngus Kong * You may obtain a copy of the License at
78097973089420749dcd1ab4974a629c2466b31ccAngus Kong *
88097973089420749dcd1ab4974a629c2466b31ccAngus Kong *      http://www.apache.org/licenses/LICENSE-2.0
98097973089420749dcd1ab4974a629c2466b31ccAngus Kong *
108097973089420749dcd1ab4974a629c2466b31ccAngus Kong * Unless required by applicable law or agreed to in writing, software
118097973089420749dcd1ab4974a629c2466b31ccAngus Kong * distributed under the License is distributed on an "AS IS" BASIS,
128097973089420749dcd1ab4974a629c2466b31ccAngus Kong * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
138097973089420749dcd1ab4974a629c2466b31ccAngus Kong * See the License for the specific language governing permissions and
148097973089420749dcd1ab4974a629c2466b31ccAngus Kong * limitations under the License.
158097973089420749dcd1ab4974a629c2466b31ccAngus Kong */
168097973089420749dcd1ab4974a629c2466b31ccAngus Kong
178097973089420749dcd1ab4974a629c2466b31ccAngus Kongpackage com.android.ex.camera2.portability;
188097973089420749dcd1ab4974a629c2466b31ccAngus Kong
198097973089420749dcd1ab4974a629c2466b31ccAngus Kongimport android.graphics.Point;
208097973089420749dcd1ab4974a629c2466b31ccAngus Kongimport android.hardware.Camera;
218097973089420749dcd1ab4974a629c2466b31ccAngus Kongimport android.text.TextUtils;
228097973089420749dcd1ab4974a629c2466b31ccAngus Kong
238097973089420749dcd1ab4974a629c2466b31ccAngus Kongimport java.util.ArrayList;
248097973089420749dcd1ab4974a629c2466b31ccAngus Kongimport java.util.List;
258097973089420749dcd1ab4974a629c2466b31ccAngus Kong
268097973089420749dcd1ab4974a629c2466b31ccAngus Kong/**
278097973089420749dcd1ab4974a629c2466b31ccAngus Kong * An immutable simple size container.
288097973089420749dcd1ab4974a629c2466b31ccAngus Kong */
298097973089420749dcd1ab4974a629c2466b31ccAngus Kongpublic class Size {
308097973089420749dcd1ab4974a629c2466b31ccAngus Kong    public static final String DELIMITER = ",";
318097973089420749dcd1ab4974a629c2466b31ccAngus Kong
328097973089420749dcd1ab4974a629c2466b31ccAngus Kong    /**
338097973089420749dcd1ab4974a629c2466b31ccAngus Kong     * An helper method to build a list of this class from a list of
348097973089420749dcd1ab4974a629c2466b31ccAngus Kong     * {@link android.hardware.Camera.Size}.
358097973089420749dcd1ab4974a629c2466b31ccAngus Kong     *
368097973089420749dcd1ab4974a629c2466b31ccAngus Kong     * @param cameraSizes Source.
378097973089420749dcd1ab4974a629c2466b31ccAngus Kong     * @return The built list.
388097973089420749dcd1ab4974a629c2466b31ccAngus Kong     */
398097973089420749dcd1ab4974a629c2466b31ccAngus Kong    public static List<Size> buildListFromCameraSizes(List<Camera.Size> cameraSizes) {
408097973089420749dcd1ab4974a629c2466b31ccAngus Kong        ArrayList<Size> list = new ArrayList<Size>(cameraSizes.size());
418097973089420749dcd1ab4974a629c2466b31ccAngus Kong        for (Camera.Size cameraSize : cameraSizes) {
428097973089420749dcd1ab4974a629c2466b31ccAngus Kong            list.add(new Size(cameraSize));
438097973089420749dcd1ab4974a629c2466b31ccAngus Kong        }
448097973089420749dcd1ab4974a629c2466b31ccAngus Kong        return list;
458097973089420749dcd1ab4974a629c2466b31ccAngus Kong    }
468097973089420749dcd1ab4974a629c2466b31ccAngus Kong
478097973089420749dcd1ab4974a629c2466b31ccAngus Kong    /**
488097973089420749dcd1ab4974a629c2466b31ccAngus Kong     * Encode List of this class as comma-separated list of integers.
498097973089420749dcd1ab4974a629c2466b31ccAngus Kong     *
508097973089420749dcd1ab4974a629c2466b31ccAngus Kong     * @param sizes List of this class to encode.
518097973089420749dcd1ab4974a629c2466b31ccAngus Kong     * @return encoded string.
528097973089420749dcd1ab4974a629c2466b31ccAngus Kong     */
538097973089420749dcd1ab4974a629c2466b31ccAngus Kong    public static String listToString(List<Size> sizes) {
548097973089420749dcd1ab4974a629c2466b31ccAngus Kong        ArrayList<Integer> flatSizes = new ArrayList<>();
558097973089420749dcd1ab4974a629c2466b31ccAngus Kong        for (Size s : sizes) {
568097973089420749dcd1ab4974a629c2466b31ccAngus Kong            flatSizes.add(s.width());
578097973089420749dcd1ab4974a629c2466b31ccAngus Kong            flatSizes.add(s.height());
588097973089420749dcd1ab4974a629c2466b31ccAngus Kong        }
598097973089420749dcd1ab4974a629c2466b31ccAngus Kong        return TextUtils.join(DELIMITER, flatSizes);
608097973089420749dcd1ab4974a629c2466b31ccAngus Kong    }
618097973089420749dcd1ab4974a629c2466b31ccAngus Kong
628097973089420749dcd1ab4974a629c2466b31ccAngus Kong    /**
638097973089420749dcd1ab4974a629c2466b31ccAngus Kong     * Decode comma-separated even-length list of integers into a List of this class.
648097973089420749dcd1ab4974a629c2466b31ccAngus Kong     *
658097973089420749dcd1ab4974a629c2466b31ccAngus Kong     * @param encodedSizes encoded string.
668097973089420749dcd1ab4974a629c2466b31ccAngus Kong     * @return List of this class.
678097973089420749dcd1ab4974a629c2466b31ccAngus Kong     */
688097973089420749dcd1ab4974a629c2466b31ccAngus Kong    public static List<Size> stringToList(String encodedSizes) {
698097973089420749dcd1ab4974a629c2466b31ccAngus Kong        String[] flatSizes = TextUtils.split(encodedSizes, DELIMITER);
708097973089420749dcd1ab4974a629c2466b31ccAngus Kong        ArrayList<Size> list = new ArrayList<>();
718097973089420749dcd1ab4974a629c2466b31ccAngus Kong        for (int i = 0; i < flatSizes.length; i += 2) {
728097973089420749dcd1ab4974a629c2466b31ccAngus Kong            int width = Integer.parseInt(flatSizes[i]);
738097973089420749dcd1ab4974a629c2466b31ccAngus Kong            int height = Integer.parseInt(flatSizes[i + 1]);
748097973089420749dcd1ab4974a629c2466b31ccAngus Kong            list.add(new Size(width,height));
758097973089420749dcd1ab4974a629c2466b31ccAngus Kong        }
768097973089420749dcd1ab4974a629c2466b31ccAngus Kong        return list;
778097973089420749dcd1ab4974a629c2466b31ccAngus Kong    }
788097973089420749dcd1ab4974a629c2466b31ccAngus Kong
798097973089420749dcd1ab4974a629c2466b31ccAngus Kong    private final Point val;
808097973089420749dcd1ab4974a629c2466b31ccAngus Kong
818097973089420749dcd1ab4974a629c2466b31ccAngus Kong    /**
828097973089420749dcd1ab4974a629c2466b31ccAngus Kong     * Constructor.
838097973089420749dcd1ab4974a629c2466b31ccAngus Kong     */
848097973089420749dcd1ab4974a629c2466b31ccAngus Kong    public Size(int width, int height) {
858097973089420749dcd1ab4974a629c2466b31ccAngus Kong        val = new Point(width, height);
868097973089420749dcd1ab4974a629c2466b31ccAngus Kong    }
878097973089420749dcd1ab4974a629c2466b31ccAngus Kong
888097973089420749dcd1ab4974a629c2466b31ccAngus Kong    /**
898097973089420749dcd1ab4974a629c2466b31ccAngus Kong     * Copy constructor.
908097973089420749dcd1ab4974a629c2466b31ccAngus Kong     */
918097973089420749dcd1ab4974a629c2466b31ccAngus Kong    public Size(Size other) {
928097973089420749dcd1ab4974a629c2466b31ccAngus Kong        if (other == null) {
938097973089420749dcd1ab4974a629c2466b31ccAngus Kong            val = new Point(0, 0);
948097973089420749dcd1ab4974a629c2466b31ccAngus Kong        } else {
958097973089420749dcd1ab4974a629c2466b31ccAngus Kong            val = new Point(other.width(), other.height());
968097973089420749dcd1ab4974a629c2466b31ccAngus Kong        }
978097973089420749dcd1ab4974a629c2466b31ccAngus Kong    }
988097973089420749dcd1ab4974a629c2466b31ccAngus Kong
998097973089420749dcd1ab4974a629c2466b31ccAngus Kong    /**
1008097973089420749dcd1ab4974a629c2466b31ccAngus Kong     * Constructor from a source {@link android.hardware.Camera.Size}.
1018097973089420749dcd1ab4974a629c2466b31ccAngus Kong     *
1028097973089420749dcd1ab4974a629c2466b31ccAngus Kong     * @param other The source size.
1038097973089420749dcd1ab4974a629c2466b31ccAngus Kong     */
1048097973089420749dcd1ab4974a629c2466b31ccAngus Kong    public Size(Camera.Size other) {
1058097973089420749dcd1ab4974a629c2466b31ccAngus Kong        if (other == null) {
1068097973089420749dcd1ab4974a629c2466b31ccAngus Kong            val = new Point(0, 0);
1078097973089420749dcd1ab4974a629c2466b31ccAngus Kong        } else {
1088097973089420749dcd1ab4974a629c2466b31ccAngus Kong            val = new Point(other.width, other.height);
1098097973089420749dcd1ab4974a629c2466b31ccAngus Kong        }
1108097973089420749dcd1ab4974a629c2466b31ccAngus Kong    }
1118097973089420749dcd1ab4974a629c2466b31ccAngus Kong
1128097973089420749dcd1ab4974a629c2466b31ccAngus Kong    /**
1138097973089420749dcd1ab4974a629c2466b31ccAngus Kong     * Constructor from a source {@link android.graphics.Point}.
1148097973089420749dcd1ab4974a629c2466b31ccAngus Kong     *
1158097973089420749dcd1ab4974a629c2466b31ccAngus Kong     * @param p The source size.
1168097973089420749dcd1ab4974a629c2466b31ccAngus Kong     */
1178097973089420749dcd1ab4974a629c2466b31ccAngus Kong    public Size(Point p) {
1188097973089420749dcd1ab4974a629c2466b31ccAngus Kong        if (p == null) {
1198097973089420749dcd1ab4974a629c2466b31ccAngus Kong            val = new Point(0, 0);
1208097973089420749dcd1ab4974a629c2466b31ccAngus Kong        } else {
1218097973089420749dcd1ab4974a629c2466b31ccAngus Kong            val = new Point(p);
1228097973089420749dcd1ab4974a629c2466b31ccAngus Kong        }
1238097973089420749dcd1ab4974a629c2466b31ccAngus Kong    }
1248097973089420749dcd1ab4974a629c2466b31ccAngus Kong
1258097973089420749dcd1ab4974a629c2466b31ccAngus Kong    public int width() {
1268097973089420749dcd1ab4974a629c2466b31ccAngus Kong        return val.x;
1278097973089420749dcd1ab4974a629c2466b31ccAngus Kong    }
1288097973089420749dcd1ab4974a629c2466b31ccAngus Kong
1298097973089420749dcd1ab4974a629c2466b31ccAngus Kong    public int height() {
1308097973089420749dcd1ab4974a629c2466b31ccAngus Kong        return val.y;
1318097973089420749dcd1ab4974a629c2466b31ccAngus Kong    }
1328097973089420749dcd1ab4974a629c2466b31ccAngus Kong
1338097973089420749dcd1ab4974a629c2466b31ccAngus Kong    @Override
1348097973089420749dcd1ab4974a629c2466b31ccAngus Kong    public boolean equals(Object o) {
1358097973089420749dcd1ab4974a629c2466b31ccAngus Kong        if (o instanceof Size) {
1368097973089420749dcd1ab4974a629c2466b31ccAngus Kong            Size other = (Size) o;
1378097973089420749dcd1ab4974a629c2466b31ccAngus Kong            return val.equals(other.val);
1388097973089420749dcd1ab4974a629c2466b31ccAngus Kong        }
1398097973089420749dcd1ab4974a629c2466b31ccAngus Kong        return false;
1408097973089420749dcd1ab4974a629c2466b31ccAngus Kong    }
1418097973089420749dcd1ab4974a629c2466b31ccAngus Kong
1428097973089420749dcd1ab4974a629c2466b31ccAngus Kong    @Override
1438097973089420749dcd1ab4974a629c2466b31ccAngus Kong    public int hashCode() {
1448097973089420749dcd1ab4974a629c2466b31ccAngus Kong        return val.hashCode();
1458097973089420749dcd1ab4974a629c2466b31ccAngus Kong    }
1468097973089420749dcd1ab4974a629c2466b31ccAngus Kong
1478097973089420749dcd1ab4974a629c2466b31ccAngus Kong    @Override
1488097973089420749dcd1ab4974a629c2466b31ccAngus Kong    public String toString() {
1498097973089420749dcd1ab4974a629c2466b31ccAngus Kong        return "Size: (" + this.width() + " x " + this.height() + ")";
1508097973089420749dcd1ab4974a629c2466b31ccAngus Kong    }
1518097973089420749dcd1ab4974a629c2466b31ccAngus Kong}
152