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