1/*
2 * Copyright (C) 2015 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.android.camera.device;
18
19import javax.annotation.Nonnull;
20import javax.annotation.Nullable;
21
22/**
23 * Identifier for Camera1 and Camera2 camera devices.
24 */
25public final class CameraId {
26    private final Integer mLegacyCameraId;
27    private final String mCameraId;
28
29    public static CameraId fromLegacyId(int camera1Id) {
30        return new CameraId(computeCameraIdFromLegacyId(camera1Id), camera1Id);
31    }
32
33    public static CameraId from(@Nonnull String camera2Id) {
34        return new CameraId(camera2Id, computeLegacyIdFromCamera2Id(camera2Id));
35    }
36
37    /**
38     * This should compute a Legacy Api1 camera Id for the given camera2 device.
39     * This class will return null if the camera2 identifier cannot be transformed
40     * into an api1 id.
41     */
42    private static Integer computeLegacyIdFromCamera2Id(@Nonnull String camera2Id) {
43        try {
44            return Integer.parseInt(camera2Id);
45        } catch (NumberFormatException ignored) {
46
47        }
48
49        return null;
50    }
51
52    /**
53     * This should compute a Camera2 Id for the given legacy camera device.
54     * This should never return a null value.
55     */
56    private static String computeCameraIdFromLegacyId(int camera1Id) {
57        return String.valueOf(camera1Id);
58    }
59
60    private CameraId(@Nonnull String cameraId, @Nullable Integer legacyCameraId) {
61        mCameraId = cameraId;
62        mLegacyCameraId = legacyCameraId;
63    }
64
65    /**
66     * Return the Camera Api2 String representation that this instance represents.
67     */
68    public String getValue() {
69        return mCameraId;
70    }
71
72    /**
73     * Return the Legacy Api1 Camera index. It will throw an exception if the value
74     * does not exist, which should only happen if the device that is being opened
75     * is not supported on Api1.
76     */
77    public int getLegacyValue() throws UnsupportedOperationException {
78        if (mLegacyCameraId == null) {
79            throw new UnsupportedOperationException("Attempted to access a camera id that is not"
80                  + " supported on legacy camera API's: " + mCameraId);
81        }
82
83        return mLegacyCameraId;
84    }
85
86    /**
87     * Return true if this instance has a valid Legacy Api camera index.
88     */
89    public boolean hasLeagcyValue() {
90        return mLegacyCameraId != null;
91    }
92
93    @Override
94    public boolean equals(Object other) {
95        if (this == other) {
96            return true;
97        }
98        if (! (other instanceof CameraId)) {
99            return false;
100        }
101
102        CameraId otherCameraId = (CameraId) other;
103
104        // Note: mLegacyCameraId is omitted and only mCameraId is used as the
105        // canonical "equals" for these instances since a Camera2 id can be
106        // created from any Camera1 id.
107        return mCameraId.equals(otherCameraId.mCameraId);
108    }
109
110    @Override
111    public int hashCode() {
112        return mCameraId.hashCode();
113    }
114
115    @Override
116    public String toString() {
117        return "CameraId{" +
118              "Api2='" + mCameraId + "\',Api1:"+mLegacyCameraId+"}";
119    }
120}
121