11d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohde/*
21d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohde * Copyright (C) 2015 The Android Open Source Project
31d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohde *
41d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohde * Licensed under the Apache License, Version 2.0 (the "License");
51d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohde * you may not use this file except in compliance with the License.
61d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohde * You may obtain a copy of the License at
71d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohde *
81d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohde *      http://www.apache.org/licenses/LICENSE-2.0
91d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohde *
101d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohde * Unless required by applicable law or agreed to in writing, software
111d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohde * distributed under the License is distributed on an "AS IS" BASIS,
121d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohde * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
131d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohde * See the License for the specific language governing permissions and
141d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohde * limitations under the License.
151d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohde */
161d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohde
171d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohdepackage com.android.camera.device;
181d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohde
191d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohdeimport javax.annotation.Nonnull;
201d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohdeimport javax.annotation.Nullable;
211d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohde
221d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohde/**
231d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohde * Identifier for Camera1 and Camera2 camera devices.
241d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohde */
251d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohdepublic final class CameraId {
261d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohde    private final Integer mLegacyCameraId;
271d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohde    private final String mCameraId;
281d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohde
291d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohde    public static CameraId fromLegacyId(int camera1Id) {
301d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohde        return new CameraId(computeCameraIdFromLegacyId(camera1Id), camera1Id);
311d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohde    }
321d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohde
331d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohde    public static CameraId from(@Nonnull String camera2Id) {
341d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohde        return new CameraId(camera2Id, computeLegacyIdFromCamera2Id(camera2Id));
351d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohde    }
361d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohde
371d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohde    /**
381d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohde     * This should compute a Legacy Api1 camera Id for the given camera2 device.
391d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohde     * This class will return null if the camera2 identifier cannot be transformed
401d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohde     * into an api1 id.
411d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohde     */
421d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohde    private static Integer computeLegacyIdFromCamera2Id(@Nonnull String camera2Id) {
431d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohde        try {
441d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohde            return Integer.parseInt(camera2Id);
451d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohde        } catch (NumberFormatException ignored) {
461d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohde
471d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohde        }
481d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohde
491d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohde        return null;
501d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohde    }
511d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohde
521d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohde    /**
531d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohde     * This should compute a Camera2 Id for the given legacy camera device.
541d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohde     * This should never return a null value.
551d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohde     */
561d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohde    private static String computeCameraIdFromLegacyId(int camera1Id) {
571d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohde        return String.valueOf(camera1Id);
581d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohde    }
591d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohde
601d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohde    private CameraId(@Nonnull String cameraId, @Nullable Integer legacyCameraId) {
611d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohde        mCameraId = cameraId;
621d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohde        mLegacyCameraId = legacyCameraId;
631d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohde    }
641d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohde
651d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohde    /**
661d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohde     * Return the Camera Api2 String representation that this instance represents.
671d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohde     */
681d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohde    public String getValue() {
691d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohde        return mCameraId;
701d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohde    }
711d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohde
721d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohde    /**
731d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohde     * Return the Legacy Api1 Camera index. It will throw an exception if the value
741d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohde     * does not exist, which should only happen if the device that is being opened
751d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohde     * is not supported on Api1.
761d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohde     */
771d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohde    public int getLegacyValue() throws UnsupportedOperationException {
781d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohde        if (mLegacyCameraId == null) {
791d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohde            throw new UnsupportedOperationException("Attempted to access a camera id that is not"
801d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohde                  + " supported on legacy camera API's: " + mCameraId);
811d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohde        }
821d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohde
831d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohde        return mLegacyCameraId;
841d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohde    }
851d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohde
861d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohde    /**
871d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohde     * Return true if this instance has a valid Legacy Api camera index.
881d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohde     */
891d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohde    public boolean hasLeagcyValue() {
901d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohde        return mLegacyCameraId != null;
911d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohde    }
921d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohde
931d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohde    @Override
941d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohde    public boolean equals(Object other) {
951d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohde        if (this == other) {
961d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohde            return true;
971d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohde        }
981d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohde        if (! (other instanceof CameraId)) {
991d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohde            return false;
1001d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohde        }
1011d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohde
1021d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohde        CameraId otherCameraId = (CameraId) other;
1031d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohde
1041d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohde        // Note: mLegacyCameraId is omitted and only mCameraId is used as the
1051d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohde        // canonical "equals" for these instances since a Camera2 id can be
1061d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohde        // created from any Camera1 id.
1071d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohde        return mCameraId.equals(otherCameraId.mCameraId);
1081d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohde    }
1091d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohde
1101d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohde    @Override
1111d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohde    public int hashCode() {
1121d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohde        return mCameraId.hashCode();
1131d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohde    }
1141d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohde
1151d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohde    @Override
1161d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohde    public String toString() {
1171d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohde        return "CameraId{" +
1181d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohde              "Api2='" + mCameraId + "\',Api1:"+mLegacyCameraId+"}";
1191d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohde    }
1201d84d7107686aa428ee2eeb1a8caf0ea3e43b1dfPaul Rohde}
121