1b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala/*
2b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala * Copyright (C) 2013 The Android Open Source Project
3b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala *
4b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala * Licensed under the Apache License, Version 2.0 (the "License");
5b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala * you may not use this file except in compliance with the License.
6b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala * You may obtain a copy of the License at
7b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala *
8b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala *      http://www.apache.org/licenses/LICENSE-2.0
9b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala *
10b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala * Unless required by applicable law or agreed to in writing, software
11b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala * distributed under the License is distributed on an "AS IS" BASIS,
12b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala * See the License for the specific language governing permissions and
14b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala * limitations under the License.
15b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala */
16b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala
172f1a2e423e0fbb64467d6fcfa4e82c6384f31210Eino-Ville Talvalapackage android.hardware.camera2;
18b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala
198b905578b54041f7d0b8dc04dd158d16d28262a1Eino-Ville Talvalaimport android.annotation.NonNull;
208b905578b54041f7d0b8dc04dd158d16d28262a1Eino-Ville Talvalaimport android.annotation.IntDef;
21e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkinimport android.util.AndroidException;
22e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin
238b905578b54041f7d0b8dc04dd158d16d28262a1Eino-Ville Talvalaimport java.lang.annotation.Retention;
248b905578b54041f7d0b8dc04dd158d16d28262a1Eino-Ville Talvalaimport java.lang.annotation.RetentionPolicy;
258b905578b54041f7d0b8dc04dd158d16d28262a1Eino-Ville Talvala
26b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala/**
27b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala * <p><code>CameraAccessException</code> is thrown if a camera device could not
28b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala * be queried or opened by the {@link CameraManager}, or if the connection to an
29b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala * opened {@link CameraDevice} is no longer valid.</p>
30b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala *
31b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala * @see CameraManager
32b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala * @see CameraDevice
33b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala */
34e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkinpublic class CameraAccessException extends AndroidException {
35b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala    /**
36c8c109b4030c1a80f0572d32311e24d1c4b0e03dChien-Yu Chen     * The camera device is in use already.
37b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala     */
385c9eaf6796a4c972710dd5cd23cdfa334fa8ad2eIgor Murashkin    public static final int CAMERA_IN_USE = 4;
39b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala
40b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala    /**
41c8c109b4030c1a80f0572d32311e24d1c4b0e03dChien-Yu Chen     * The system-wide limit for number of open cameras or camera resources has
42c8c109b4030c1a80f0572d32311e24d1c4b0e03dChien-Yu Chen     * been reached, and more camera devices cannot be opened or torch mode
43c8c109b4030c1a80f0572d32311e24d1c4b0e03dChien-Yu Chen     * cannot be turned on until previous instances are closed.
44b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala     */
455c9eaf6796a4c972710dd5cd23cdfa334fa8ad2eIgor Murashkin    public static final int MAX_CAMERAS_IN_USE = 5;
46b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala
47b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala    /**
48b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala     * The camera is disabled due to a device policy, and cannot be opened.
49b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala     *
50b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala     * @see android.app.admin.DevicePolicyManager#setCameraDisabled(android.content.ComponentName, boolean)
51b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala     */
525c9eaf6796a4c972710dd5cd23cdfa334fa8ad2eIgor Murashkin    public static final int CAMERA_DISABLED = 1;
53b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala
54b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala    /**
55b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala     * The camera device is removable and has been disconnected from the Android
5666ef64514464a1bb9c7931993cc8db3d7539f39aRuben Brunk     * device, or the camera id used with {@link android.hardware.camera2.CameraManager#openCamera}
5766ef64514464a1bb9c7931993cc8db3d7539f39aRuben Brunk     * is no longer valid, or the camera service has shut down the connection due to a
58b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala     * higher-priority access request for the camera device.
59b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala     */
605c9eaf6796a4c972710dd5cd23cdfa334fa8ad2eIgor Murashkin    public static final int CAMERA_DISCONNECTED = 2;
615c9eaf6796a4c972710dd5cd23cdfa334fa8ad2eIgor Murashkin
625c9eaf6796a4c972710dd5cd23cdfa334fa8ad2eIgor Murashkin    /**
635c9eaf6796a4c972710dd5cd23cdfa334fa8ad2eIgor Murashkin     * The camera device is currently in the error state.
645c9eaf6796a4c972710dd5cd23cdfa334fa8ad2eIgor Murashkin     *
655c9eaf6796a4c972710dd5cd23cdfa334fa8ad2eIgor Murashkin     * <p>The camera has failed to open or has failed at a later time
665c9eaf6796a4c972710dd5cd23cdfa334fa8ad2eIgor Murashkin     * as a result of some non-user interaction. Refer to
67fd887436bd111e4d2c7307578a51b5070025b7f2Eino-Ville Talvala     * {@link CameraDevice.StateCallback#onError} for the exact
685c9eaf6796a4c972710dd5cd23cdfa334fa8ad2eIgor Murashkin     * nature of the error.</p>
695c9eaf6796a4c972710dd5cd23cdfa334fa8ad2eIgor Murashkin     *
705c9eaf6796a4c972710dd5cd23cdfa334fa8ad2eIgor Murashkin     * <p>No further calls to the camera will succeed. Clean up
715c9eaf6796a4c972710dd5cd23cdfa334fa8ad2eIgor Murashkin     * the camera with {@link CameraDevice#close} and try
725c9eaf6796a4c972710dd5cd23cdfa334fa8ad2eIgor Murashkin     * handling the error in order to successfully re-open the camera.
735c9eaf6796a4c972710dd5cd23cdfa334fa8ad2eIgor Murashkin     * </p>
745c9eaf6796a4c972710dd5cd23cdfa334fa8ad2eIgor Murashkin     *
755c9eaf6796a4c972710dd5cd23cdfa334fa8ad2eIgor Murashkin     */
765c9eaf6796a4c972710dd5cd23cdfa334fa8ad2eIgor Murashkin    public static final int CAMERA_ERROR = 3;
77b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala
7866ef64514464a1bb9c7931993cc8db3d7539f39aRuben Brunk    /**
7966ef64514464a1bb9c7931993cc8db3d7539f39aRuben Brunk     * A deprecated HAL version is in use.
8066ef64514464a1bb9c7931993cc8db3d7539f39aRuben Brunk     * @hide
8166ef64514464a1bb9c7931993cc8db3d7539f39aRuben Brunk     */
8266ef64514464a1bb9c7931993cc8db3d7539f39aRuben Brunk    public static final int CAMERA_DEPRECATED_HAL = 1000;
8366ef64514464a1bb9c7931993cc8db3d7539f39aRuben Brunk
848b905578b54041f7d0b8dc04dd158d16d28262a1Eino-Ville Talvala     /** @hide */
858b905578b54041f7d0b8dc04dd158d16d28262a1Eino-Ville Talvala     @Retention(RetentionPolicy.SOURCE)
868b905578b54041f7d0b8dc04dd158d16d28262a1Eino-Ville Talvala     @IntDef(
878b905578b54041f7d0b8dc04dd158d16d28262a1Eino-Ville Talvala         {CAMERA_IN_USE,
888b905578b54041f7d0b8dc04dd158d16d28262a1Eino-Ville Talvala          MAX_CAMERAS_IN_USE,
898b905578b54041f7d0b8dc04dd158d16d28262a1Eino-Ville Talvala          CAMERA_DISABLED,
908b905578b54041f7d0b8dc04dd158d16d28262a1Eino-Ville Talvala          CAMERA_DISCONNECTED,
918b905578b54041f7d0b8dc04dd158d16d28262a1Eino-Ville Talvala          CAMERA_ERROR})
928b905578b54041f7d0b8dc04dd158d16d28262a1Eino-Ville Talvala     public @interface AccessError {};
938b905578b54041f7d0b8dc04dd158d16d28262a1Eino-Ville Talvala
94e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin    // Make the eclipse warning about serializable exceptions go away
95e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin    private static final long serialVersionUID = 5630338637471475675L; // randomly generated
96e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin
97e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin    private final int mReason;
98b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala
99b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala    /**
100b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala     * The reason for the failure to access the camera.
101b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala     *
102b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala     * @see #CAMERA_DISABLED
103b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala     * @see #CAMERA_DISCONNECTED
1045c9eaf6796a4c972710dd5cd23cdfa334fa8ad2eIgor Murashkin     * @see #CAMERA_ERROR
105b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala     */
1068b905578b54041f7d0b8dc04dd158d16d28262a1Eino-Ville Talvala    @AccessError
107b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala    public final int getReason() {
108b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala        return mReason;
109b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala    }
110b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala
1118b905578b54041f7d0b8dc04dd158d16d28262a1Eino-Ville Talvala    public CameraAccessException(@AccessError int problem) {
112e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin        super(getDefaultMessage(problem));
113b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala        mReason = problem;
114b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala    }
115b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala
1168b905578b54041f7d0b8dc04dd158d16d28262a1Eino-Ville Talvala    public CameraAccessException(@AccessError int problem, String message) {
1175d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala        super(getCombinedMessage(problem, message));
118b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala        mReason = problem;
119b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala    }
120b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala
1218b905578b54041f7d0b8dc04dd158d16d28262a1Eino-Ville Talvala    public CameraAccessException(@AccessError int problem, String message, Throwable cause) {
1225d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala        super(getCombinedMessage(problem, message), cause);
123b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala        mReason = problem;
124b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala    }
125b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala
1268b905578b54041f7d0b8dc04dd158d16d28262a1Eino-Ville Talvala    public CameraAccessException(@AccessError int problem, Throwable cause) {
127e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin        super(getDefaultMessage(problem), cause);
128b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala        mReason = problem;
129b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala    }
130e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin
131b6a781066e6b0f2578cafefdc61c9ba18c0efc2eRuben Brunk    /**
132b6a781066e6b0f2578cafefdc61c9ba18c0efc2eRuben Brunk     * @hide
133b6a781066e6b0f2578cafefdc61c9ba18c0efc2eRuben Brunk     */
1348b905578b54041f7d0b8dc04dd158d16d28262a1Eino-Ville Talvala    public static String getDefaultMessage(@AccessError int problem) {
135e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin        switch (problem) {
136e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin            case CAMERA_IN_USE:
137e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin                return "The camera device is in use already";
138e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin            case MAX_CAMERAS_IN_USE:
139e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin                return "The system-wide limit for number of open cameras has been reached, " +
140e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin                       "and more camera devices cannot be opened until previous instances " +
141e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin                       "are closed.";
1425c9eaf6796a4c972710dd5cd23cdfa334fa8ad2eIgor Murashkin            case CAMERA_DISCONNECTED:
1435c9eaf6796a4c972710dd5cd23cdfa334fa8ad2eIgor Murashkin                return "The camera device is removable and has been disconnected from the " +
1445c9eaf6796a4c972710dd5cd23cdfa334fa8ad2eIgor Murashkin                        "Android device, or the camera service has shut down the connection due " +
1455c9eaf6796a4c972710dd5cd23cdfa334fa8ad2eIgor Murashkin                        "to a higher-priority access request for the camera device.";
146e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin            case CAMERA_DISABLED:
147e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin                return "The camera is disabled due to a device policy, and cannot be opened.";
1485c9eaf6796a4c972710dd5cd23cdfa334fa8ad2eIgor Murashkin            case CAMERA_ERROR:
1495c9eaf6796a4c972710dd5cd23cdfa334fa8ad2eIgor Murashkin                return "The camera device is currently in the error state; " +
1505c9eaf6796a4c972710dd5cd23cdfa334fa8ad2eIgor Murashkin                       "no further calls to it will succeed.";
151e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin        }
152e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin        return null;
153e363fbb2647aeb5ef4c87160d84c6b9ae8d45598Igor Murashkin    }
1545d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala
1555d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala    private static String getCombinedMessage(@AccessError int problem, String message) {
1565d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala        String problemString = getProblemString(problem);
1575d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala        return String.format("%s (%d): %s", problemString, problem, message);
1585d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala    }
1595d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala
1605d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala    private static String getProblemString(int problem) {
1615d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala        String problemString;
1625d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala        switch (problem) {
1635d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala            case CAMERA_IN_USE:
1645d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala                problemString = "CAMERA_IN_USE";
1655d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala                break;
1665d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala            case MAX_CAMERAS_IN_USE:
1675d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala                problemString = "MAX_CAMERAS_IN_USE";
1685d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala                break;
1695d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala            case CAMERA_DISCONNECTED:
1705d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala                problemString = "CAMERA_DISCONNECTED";
1715d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala                break;
1725d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala            case CAMERA_DISABLED:
1735d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala                problemString = "CAMERA_DISABLED";
1745d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala                break;
1755d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala            case CAMERA_ERROR:
1765d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala                problemString = "CAMERA_ERROR";
1775d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala                break;
1785d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala            case CAMERA_DEPRECATED_HAL:
1795d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala                problemString = "CAMERA_DEPRECATED_HAL";
1805d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala                break;
1815d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala            default:
1825d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala                problemString = "<UNKNOWN ERROR>";
1835d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala        }
1845d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala        return problemString;
1855d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala    }
1865d2d7788f1759b0f3d2c057af0b3ea61b0354feeEino-Ville Talvala
187b2675542c2f414154125b534767ae0903fba581eEino-Ville Talvala}
188