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 
17 package com.android.camera;
18 
19 import android.hardware.camera2.CameraDevice;
20 
21 import com.android.camera2.R;
22 
23 /**
24  * Handles fatal application errors.
25  * <p>
26  * Usage:
27  *
28  * <pre>
29  * if (unrecoverableErrorDetected) {
30  *     fatalErrorHandler.handleFatalError(Reason.CANNOT_CONNECT_TO_CAMERA);
31  * }
32  * </pre>
33  */
34 public interface FatalErrorHandler {
35     public static enum Reason {
36         CANNOT_CONNECT_TO_CAMERA(
37                 R.string.error_cannot_connect_camera,
38                 R.string.feedback_description_camera_access,
39                 true),
40         CAMERA_HAL_FAILED(
41                 R.string.error_cannot_connect_camera,
42                 R.string.feedback_description_camera_access,
43                 true),
44         CAMERA_DISABLED_BY_SECURITY_POLICY(
45                 R.string.error_camera_disabled,
46                 R.string.feedback_description_camera_access,
47                 true),
48         MEDIA_STORAGE_FAILURE(
49                 R.string.error_media_storage_failure,
50                 R.string.feedback_description_save_photo,
51                 false);
52 
53         private final int mDialogMsgId;
54         private final int mFeedbackMsgId;
55         private final boolean mFinishActivity;
56 
57         /**
58          * @param dialogMsgId The resource ID of string to display in the fatal
59          *            error dialog.
60          * @param feedbackMsgId The resource ID of default string to display in
61          *            the feedback dialog, if the user chooses to submit
62          *            feedback from the dialog.
63          * @param finishActivity Whether the activity should be finished as a
64          *            result of this error.
65          */
Reason(int dialogMsgId, int feedbackMsgId, boolean finishActivity)66         Reason(int dialogMsgId, int feedbackMsgId, boolean finishActivity) {
67             mDialogMsgId = dialogMsgId;
68             mFeedbackMsgId = feedbackMsgId;
69             mFinishActivity = finishActivity;
70         }
71 
72         /**
73          * @return The resource ID of the string to display in the fatal error
74          *         dialog.
75          */
getFeedbackMsgId()76         public int getFeedbackMsgId() {
77             return mFeedbackMsgId;
78         }
79 
80         /**
81          * @return The resource ID of the default string to display in the
82          *         feedback dialog, if the user chooses to submit feedback from
83          *         the dialog.
84          */
getDialogMsgId()85         public int getDialogMsgId() {
86             return mDialogMsgId;
87         }
88 
89         /**
90          * @return Whether the activity should be finished as a result of this
91          *         error.
92          */
doesFinishActivity()93         public boolean doesFinishActivity() {
94             return mFinishActivity;
95         }
96 
97         /**
98          * Creates a new Reason based on an error code for
99          * {@link CameraDevice.StateCallback#onError}.
100          *
101          * @param error The error code. One of
102          *            CameraDevice.StateCallback.ERROR_*
103          * @return The appropriate Reason.
104          */
fromCamera2CameraDeviceStateCallbackError(int error)105         public static Reason fromCamera2CameraDeviceStateCallbackError(int error) {
106             // TODO Use a more descriptive reason to distinguish between
107             // different types of errors.
108             switch (error) {
109                 case CameraDevice.StateCallback.ERROR_CAMERA_DEVICE:
110                 case CameraDevice.StateCallback.ERROR_CAMERA_DISABLED:
111                 case CameraDevice.StateCallback.ERROR_CAMERA_IN_USE:
112                 case CameraDevice.StateCallback.ERROR_CAMERA_SERVICE:
113                 case CameraDevice.StateCallback.ERROR_MAX_CAMERAS_IN_USE:
114                 default:
115                     return CANNOT_CONNECT_TO_CAMERA;
116             }
117         }
118     }
119 
120     /**
121      * Handles Media Storage Failures - ie. images aren't being saved to disk.
122      */
onMediaStorageFailure()123     public void onMediaStorageFailure();
124 
125     /**
126      * Handles error where the camera cannot be opened.
127      */
onCameraOpenFailure()128     public void onCameraOpenFailure();
129 
130     /**
131      * Handles error where the camera cannot be reconnected.
132      */
onCameraReconnectFailure()133     public void onCameraReconnectFailure();
134 
135     /**
136      * Handles generic error where the camera is unavailable. Only use this if
137      * you are unsure what caused the error, such as a reconnection or open.
138      * failure
139      */
onGenericCameraAccessFailure()140     public void onGenericCameraAccessFailure();
141 
142     /**
143      * Handles error where the camera is disabled due to security.
144      */
onCameraDisabledFailure()145     public void onCameraDisabledFailure();
146 
147 
148     /**
149      * Handles a fatal error, e.g. by displaying the appropriate dialog and
150      * exiting the activity.
151      * @deprecated use specific implementations above instead
152      */
153     @Deprecated
handleFatalError(Reason reason)154     public void handleFatalError(Reason reason);
155 }
156